diff --git a/docs/swagger/definitions.yml b/docs/swagger/definitions.yml index ef441fec12..60b755553f 100644 --- a/docs/swagger/definitions.yml +++ b/docs/swagger/definitions.yml @@ -378,9 +378,12 @@ definitions: gasLimit: type: 'number' example: 150688 - gasCost: + gasCost: # also gasUsed for Cosmos prices type: 'string' example: '0.014466048000000000' + gasWanted: + type: 'number' + example: 150688 TradeRequest: type: 'object' @@ -432,12 +435,8 @@ definitions: - 'base' - 'quote' - 'amount' - - 'price' - 'gasPrice' - - 'gasPriceToken' - 'gasLimit' - - 'gasCost' - - 'nonce' properties: network: type: 'string' @@ -457,6 +456,9 @@ definitions: amount: type: 'string' example: '10' + rawAmount: # Cosmos specific + type: 'string' + example: '10' expectedIn: type: 'string' expectedOut: @@ -472,8 +474,22 @@ definitions: type: 'string' gasCost: type: 'string' + gasUsed: # Cosmos specific + type: 'string' + gasWanted: # Cosmos specific + type: 'string' nonce: type: 'string' + expectedAmountReceived: # Cosmos specific + type: 'string' + finalAmountReceived: # Cosmos specific + type: 'string' + finalAmountReceived_basetoken: # Cosmos specific + type: 'string' + expectedPrice: # Cosmos specific + type: 'string' + finalPrice: # Cosmos specific + type: 'string' txHash: type: 'string' @@ -681,9 +697,8 @@ definitions: - 'token1' - 'amount0' - 'amount1' - - 'fee' - - 'lowerPrice' - - 'upperPrice' + - 'chain' + - 'network' properties: address: type: 'string' @@ -704,12 +719,16 @@ definitions: type: 'number' example: 1 upperPrice: - type: number + type: 'number' example: 5 maxFeePerGas: - type: number + type: 'number' maxPriorityFeePerGas: - type: number + type: 'number' + tokenId: # Cosmos poolId + type: 'number' + allowedSlippage: # Cosmos specific + type: 'string' chain: type: 'string' example: 'ethereum' @@ -718,7 +737,6 @@ definitions: example: 'goerli' connector: type: 'string' - example: 'uniswapLP' LiquidityAddResponse: type: 'object' @@ -728,10 +746,8 @@ definitions: - 'token0' - 'token1' - 'gasPrice' - - 'gasPriceToken' - 'gasLimit' - - 'gasCost' - - 'nonce' + - 'txHash' properties: network: type: 'string' @@ -759,23 +775,42 @@ definitions: txHash: type: 'string' example: '0x0000000000000000000000000000000000000000' + tokenId: # Cosmos poolId + type: 'number' + poolAddress: # Cosmos specific + type: 'string' + poolShares: # Cosmos specific + type: 'string' + token0FinalAmount: # Cosmos specific + type: 'string' + token1FinalAmount: # Cosmos specific + type: 'string' + latency: # Cosmos specific + type: 'number' + gasUsed: # Cosmos specific + type: 'string' + gasWanted: # Cosmos specific + type: 'string' LiquidityRemoveRequest: type: 'object' required: - 'address' - 'tokenId' + - 'chain' + - 'network' + - 'connector' properties: address: type: 'string' example: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D' - tokenId: + tokenId: # Cosmos poolId type: 'number' example: 12 maxFeePerGas: - type: number + type: 'number' maxPriorityFeePerGas: - type: number + type: 'number' chain: type: 'string' example: 'ethereum' @@ -785,18 +820,19 @@ definitions: connector: type: 'string' example: 'uniswapLP' + decreasePercent: # Cosmos specific + type: 'number' + allowedSlippage: # Cosmos specific + type: 'string' LiquidityRemoveResponse: type: 'object' required: - 'network' - 'timestamp' - - 'tokenId' - 'gasPrice' - - 'gasPriceToken' - 'gasLimit' - - 'gasCost' - - 'nonce' + - 'txHash' properties: network: type: 'string' @@ -821,6 +857,26 @@ definitions: txHash: type: 'string' example: '0x0000000000000000000000000000000000000000' + latency: # Cosmos specific + type: 'number' + gasUsed: # Cosmos specific + type: 'string' + gasWanted: # Cosmos specific + type: 'string' + balances: # Cosmos specific + type: 'array' + items: 'object' + required: + - 'amount' + - 'denom' + - 'symbol' + properties: + amount: + type: 'string' + denom: + type: 'string' + symbol: + type: 'string' LiquidityCollectRequest: type: 'object' @@ -887,11 +943,15 @@ definitions: LiquidityPositionRequest: type: 'object' required: - - 'tokenId' + - 'chain' + - 'network' + - 'connector' properties: tokenId: type: 'number' example: 12 + address: # Cosmos specific + type: 'string' chain: type: 'string' example: 'ethereum' @@ -907,16 +967,6 @@ definitions: required: - 'network' - 'timestamp' - - 'tokenId' - - 'token0' - - 'token1' - - 'fee' - - 'lowerPrice' - - 'upperPrice' - - 'amount0' - - 'amount1' - - 'unclaimedToken0' - - 'unclaimedToken1' properties: network: type: 'string' @@ -924,6 +974,9 @@ definitions: timestamp: type: 'integer' example: 1636368085740 + latency: # Cosmos specific + type: 'number' + example: 123 tokenId: type: 'number' example: 12 @@ -954,15 +1007,82 @@ definitions: unclaimedToken1: type: 'string' example: '2' + pools: # Cosmos specific + type: 'array' + items: 'object' + required: + - 'address' + - 'id' + properties: + $typeUrl: + type: 'string' + address: + type: 'string' + example: 'osmo23459697' + id: + type: 'string' + example: 'poolid' + futurePoolGovernor: + type: 'string' + example: 'noidea' + totalShares: + type: 'object' + required: + - 'amount' + - 'denom' + properties: + amount: + type: 'string' + example: 'none' + denom: + type: 'string' + example: 'none' + poolAssets: + type: 'array' + items: 'object' + required: + - 'amount' + - 'denom' + properties: + amount: + type: 'string' + example: 'none' + denom: + type: 'string' + example: 'none' + totalWeight: + type: 'string' + example: 'none' + fees_volume24H: + type: 'number' + example: 1 + fees_spent_7d: + type: 'number' + example: 1 + fees_volume7d: + type: 'number' + example: 1 + myLiquidityShares: + type: 'number' + example: 1 + myLiquidityDollarValue: + type: 'string' + example: '20' + my_bonded_shares: + type: 'string' + example: '20' + denom: + type: 'string' + example: 'none' LiquidityPriceRequest: type: 'object' required: - 'token0' - 'token1' - - 'fee' - - 'period' - - 'interval' + - 'chain' + - 'network' + - 'connector' properties: token0: type: 'string' @@ -979,6 +1099,9 @@ definitions: interval: type: 'number' example: 5 + address: # Cosmos specific + type: 'string' + example: 'osmo123456' chain: type: 'string' example: 'ethereum' @@ -996,9 +1119,6 @@ definitions: - 'timestamp' - 'token0' - 'token1' - - 'fee' - - 'period' - - 'interval' properties: network: type: 'string' @@ -1006,6 +1126,9 @@ definitions: timestamp: type: 'integer' example: 1636368085740 + latency: # Cosmos specific + type: 'number' + example: 123 token0: type: 'string' example: 'DAI' @@ -1024,7 +1147,74 @@ definitions: prices: type: 'object' example: [ '1', '2', '3' ] - + pools: # Cosmos specific + type: 'array' + items: 'object' + required: + - 'address' + - 'id' + properties: + $typeUrl: + type: 'string' + example: '' + address: + type: 'string' + example: 'osmo23459697' + id: + type: 'string' + example: 'poolid' + futurePoolGovernor: + type: 'string' + example: 'noidea' + totalShares: + type: 'object' + required: + - 'amount' + - 'denom' + properties: + amount: + type: 'string' + example: 'none' + denom: + type: 'string' + example: 'none' + poolAssets: + type: 'array' + items: 'object' + required: + - 'amount' + - 'denom' + properties: + amount: + type: 'string' + example: 'none' + denom: + type: 'string' + example: 'none' + totalWeight: + type: 'string' + example: 'none' + fees_volume24H: + type: 'number' + example: 1 + fees_spent_7d: + type: 'number' + example: 1 + fees_volume7d: + type: 'number' + example: 1 + myLiquidityShares: + type: 'number' + example: 1 + myLiquidityDollarValue: + type: 'string' + example: '20' + my_bonded_shares: + type: 'string' + example: '20' + denom: + type: 'string' + example: 'none' PerpPairsRequest: type: 'object' diff --git a/package.json b/package.json index ca8fe8c721..da9ebfce7b 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,11 @@ "test:scripts": "jest -i --verbose ./test-scripts/*.test.ts" }, "dependencies": { + "@cosmjs/amino": "^0.32.2", "@bancor/carbon-sdk": "^0.0.93-DEV", "@cosmjs/proto-signing": "^0.31.1", "@cosmjs/stargate": "^0.31.1", + "@cosmjs/tendermint-rpc": "^0.32.2", "@crocswap/sdk": "^2.4.5", "@ethersproject/abstract-provider": "5.7.0", "@ethersproject/address": "5.7.0", @@ -37,6 +39,7 @@ "@harmony-js/utils": "^0.1.56", "@improbable-eng/grpc-web": "^0.13.0", "@injectivelabs/sdk-ts": "^1.10.58", + "@osmonauts/math": "^1.11.3", "@pancakeswap/sdk": "^4.0.0", "@pancakeswap/smart-router": "^4.2.1", "@pancakeswap/swap-sdk-core": "^1.0.0", @@ -92,6 +95,8 @@ "minimist": "^1.2.6", "morgan": "^1.10.0", "near-api-js": "1.0.0", + "osmo-query": "16.5.2", + "osmojs": "16.5.1", "promise-retry": "^2.0.1", "quickswap-sdk": "^3.0.8", "quipuswap-v3-sdk": "^0.0.7", diff --git a/src/amm/amm.controllers.ts b/src/amm/amm.controllers.ts index c8ba28bf10..54ba964bb7 100644 --- a/src/amm/amm.controllers.ts +++ b/src/amm/amm.controllers.ts @@ -86,12 +86,17 @@ import { Algorand } from '../chains/algorand/algorand'; import { Tinyman } from '../connectors/tinyman/tinyman'; import { Plenty } from '../connectors/plenty/plenty'; import { QuipuSwap } from '../connectors/quipuswap/quipuswap'; +import { Osmosis } from '../chains/osmosis/osmosis'; import { Carbonamm } from '../connectors/carbon/carbonAMM'; export async function price(req: PriceRequest): Promise { const chain = await getInitializedChain< - Algorand | Ethereumish | Nearish | Tezosish + Algorand | Ethereumish | Nearish | Tezosish | Osmosis >(req.chain, req.network); + if (chain instanceof Osmosis){ + return chain.controller.price(chain as unknown as Osmosis, req); + } + const connector: Uniswapish | RefAMMish | Tinyman | Plenty | QuipuSwap = await getConnector( req.chain, @@ -117,8 +122,12 @@ export async function price(req: PriceRequest): Promise { export async function trade(req: TradeRequest): Promise { const chain = await getInitializedChain< - Algorand | Ethereumish | Nearish | Tezosish + Algorand | Ethereumish | Nearish | Tezosish | Osmosis >(req.chain, req.network); + if (chain instanceof Osmosis){ + return chain.controller.trade(chain as unknown as Osmosis, req); + } + const connector: Uniswapish | RefAMMish | Tinyman | Plenty | QuipuSwap = await getConnector( req.chain, @@ -145,7 +154,10 @@ export async function trade(req: TradeRequest): Promise { export async function addLiquidity( req: AddLiquidityRequest ): Promise { - const chain = await getInitializedChain(req.chain, req.network); + const chain = await getInitializedChain(req.chain, req.network); + if (chain instanceof Osmosis){ + return chain.controller.addLiquidity(chain as unknown as Osmosis, req); + } const connector: UniswapLPish = await getConnector( req.chain, req.network, @@ -158,7 +170,10 @@ export async function addLiquidity( export async function reduceLiquidity( req: RemoveLiquidityRequest ): Promise { - const chain = await getInitializedChain(req.chain, req.network); + const chain = await getInitializedChain(req.chain, req.network); + if (chain instanceof Osmosis){ + return chain.controller.removeLiquidity(chain as unknown as Osmosis, req); + } const connector: UniswapLPish = await getConnector( req.chain, req.network, @@ -171,7 +186,10 @@ export async function reduceLiquidity( export async function collectFees( req: CollectEarnedFeesRequest ): Promise { - const chain = await getInitializedChain(req.chain, req.network); + const chain = await getInitializedChain(req.chain, req.network); + if (chain instanceof Osmosis){ + return chain.controller.collectFees(chain as unknown as Osmosis, req); + } const connector: UniswapLPish = await getConnector( req.chain, req.network, @@ -183,7 +201,10 @@ export async function collectFees( export async function positionInfo( req: PositionRequest ): Promise { - const chain = await getInitializedChain(req.chain, req.network); + const chain = await getInitializedChain(req.chain, req.network); + if (chain instanceof Osmosis){ + return chain.controller.poolPositions(chain as unknown as Osmosis, req); + } const connector: UniswapLPish = await getConnector( req.chain, req.network, @@ -195,7 +216,10 @@ export async function positionInfo( export async function poolPrice( req: PoolPriceRequest ): Promise { - const chain = await getInitializedChain(req.chain, req.network); + const chain = await getInitializedChain(req.chain, req.network); + if (chain instanceof Osmosis){ + return chain.controller.poolPrice(chain as unknown as Osmosis, req); + } const connector: UniswapLPish = await getConnector( req.chain, req.network, @@ -208,8 +232,12 @@ export async function estimateGas( req: NetworkSelectionRequest ): Promise { const chain = await getInitializedChain< - Algorand | Ethereumish | Nearish | Tezosish + Algorand | Ethereumish | Nearish | Tezosish | Osmosis >(req.chain, req.network); + if (chain instanceof Osmosis){ + return chain.controller.estimateGas(chain as unknown as Osmosis); + } + const connector: Uniswapish | RefAMMish | Tinyman | Plenty | QuipuSwap = await getConnector( req.chain, diff --git a/src/amm/amm.requests.ts b/src/amm/amm.requests.ts index 5a41ac03fc..055561e7eb 100644 --- a/src/amm/amm.requests.ts +++ b/src/amm/amm.requests.ts @@ -1,3 +1,4 @@ +import { CoinAndSymbol, SerializableExtendedPool as CosmosSerializableExtendedPool } from '../chains/osmosis/osmosis.types'; import { PerpPosition } from '../connectors/perp/perp'; import { NetworkSelectionRequest, @@ -29,24 +30,27 @@ export interface PriceResponse { gasPrice: number; gasPriceToken: string; gasLimit: number; - gasCost: string; + gasCost: string; // also gasUsed for Cosmos prices + gasWanted?: string; } export interface PoolPriceRequest extends NetworkSelectionRequest { token0: string; token1: string; - fee: string; - period: number; - interval: number; + address?: string + fee?: string; + period?: number; + interval?: number; } export interface PoolPriceResponse { token0: string; token1: string; - fee: string; - period: number; - interval: number; - prices: string[]; + fee?: string; + period?: number; + interval?: number; + prices?: string[]; + pools?: CosmosSerializableExtendedPool[]; network: string; timestamp: number; latency: number; @@ -71,32 +75,37 @@ export interface TradeResponse { latency: number; base: string; quote: string; - amount: string; + amount: string; // traderequest.amount + finalAmountReceived?: string; // Cosmos rawAmount: string; + finalAmountReceived_basetoken?: string; // Cosmos expectedIn?: string; - expectedOut?: string; - price: string; + expectedOut?: string; // Cosmos: expectedAmountReceived + expectedPrice?: string; // Cosmos + price: string; // Cosmos: finalPrice gasPrice: number; gasPriceToken: string; gasLimit: number; - gasCost: string; + gasWanted?: string; // Cosmos + gasCost: string; // Cosmos: gasUsed nonce?: number; txHash: string | any | undefined; } -export interface AddLiquidityRequest extends NetworkSelectionRequest { +export interface AddLiquidityRequest extends NetworkSelectionRequest { // now also cosmos add swap position OR cosmos add LP position address: string; token0: string; token1: string; amount0: string; amount1: string; - fee: string; - lowerPrice: string; // integer as string - upperPrice: string; // integer as string - tokenId?: number; + fee?: string; + lowerPrice?: string; // integer as string // COSMOS - using this != undefined then call addpositionLP(), else: addposition() + upperPrice?: string; // integer as string + tokenId?: number; // COSMOS: poolId - will select one for you if not provided nonce?: number; maxFeePerGas?: string; maxPriorityFeePerGas?: string; + allowedSlippage?: string; // COSMOS: used to calc TokenMinAmount } export interface AddLiquidityResponse { @@ -106,18 +115,23 @@ export interface AddLiquidityResponse { token0: string; token1: string; fee: string; - tokenId: number; - gasPrice: number; + tokenId: number; // COSMOS - this is poolId + gasPrice: number | string; // COSMOS: string gasPriceToken: string; gasLimit: number; - gasCost: string; + gasCost: string; // gasUsed for Cosmos + gasWanted?: string; nonce: number; txHash: string | undefined; + poolAddress?: string; // Cosmos only + poolShares?: string; // Cosmos only + token0FinalAmount?: string; // Cosmos only + token1FinalAmount?: string; // Cosmos only } export interface CollectEarnedFeesRequest extends NetworkSelectionRequest { address: string; - tokenId: number; + tokenId: number; // COSMOS - this is poolId nonce?: number; maxFeePerGas?: string; maxPriorityFeePerGas?: string; @@ -125,23 +139,28 @@ export interface CollectEarnedFeesRequest extends NetworkSelectionRequest { export interface RemoveLiquidityRequest extends CollectEarnedFeesRequest { decreasePercent?: number; + allowedSlippage?: string; } export interface RemoveLiquidityResponse { network: string; timestamp: number; latency: number; - tokenId: number; - gasPrice: number; + tokenId: number; // COSMOS - this is poolId + gasPrice: number | string; // COSMOS: string gasPriceToken: string; - gasLimit: number; - gasCost: string; - nonce: number; + gasLimit: number | string; + gasCost: string; // gasUsed for Cosmos + nonce?: number; txHash: string | undefined; + gasWanted?: string; + balances?: CoinAndSymbol[]; + isCollectFees?: boolean; } export interface PositionRequest extends NetworkSelectionRequest { - tokenId: number; + tokenId?: number; // COSMOS - this is poolId. requried for both + address?: string; // COSMOS only/required (no idea how this works without address for others) } export interface PositionResponse extends LPPositionInfo { diff --git a/src/amm/amm.validators.ts b/src/amm/amm.validators.ts index 329b5609c2..111bf0d943 100644 --- a/src/amm/amm.validators.ts +++ b/src/amm/amm.validators.ts @@ -11,11 +11,16 @@ import { validateChain, validateNetwork, validateNonce, - validateAddress, validateMaxFeePerGas, validateMaxPriorityFeePerGas, + isAddress as isEthereumAddress, + invalidAddressError, } from '../chains/ethereum/ethereum.validators'; +import { + isValidCosmosAddress +} from '../chains/cosmos/cosmos.validators'; + import { FeeAmount } from '@uniswap/v3-sdk'; export const invalidConnectorError: string = @@ -63,6 +68,13 @@ export const validateConnector: Validator = mkValidator( (val) => typeof val === 'string' ); +// given a request, look for a key called address that is an Ethereum or Cosmos wallet +export const validateAddress: Validator = mkValidator( + 'address', + invalidAddressError, + (val) => typeof val === 'string' && (isEthereumAddress(val) || isValidCosmosAddress(val)) +); + export const validateQuote: Validator = mkValidator( 'quote', invalidQuoteError, @@ -121,8 +133,7 @@ export const validateFee: Validator = mkValidator( 'fee', invalidFeeTier, (val) => - typeof val === 'string' && - Object.keys(FeeAmount).includes(val.toUpperCase()) + typeof val === 'string' && Object.keys(FeeAmount).includes(val.toUpperCase()) ); export const validateLowerPrice: Validator = mkValidator( @@ -149,9 +160,7 @@ export const validateLimitPrice: Validator = mkValidator( export const validateTokenId: Validator = mkValidator( 'tokenId', invalidTokenIdError, - (val) => - typeof val === 'undefined' || - (typeof val === 'number' && val >= 0 && Number.isInteger(val)), + (val) => typeof val === 'number' && val >= 0 && Number.isInteger(val), true ); @@ -181,7 +190,7 @@ export const validateDecreasePercent: Validator = mkValidator( export const validateAllowedSlippage: Validator = mkValidator( 'allowedSlippage', invalidAllowedSlippageError, - (val) => typeof val === 'string' && isFractionString(val), + (val) => typeof val === 'string' && (isFractionString(val) || val.includes('%')), true ); diff --git a/src/chains/cosmos/cosmos-base.ts b/src/chains/cosmos/cosmos-base.ts index 11a2f393dc..0b16e31c37 100644 --- a/src/chains/cosmos/cosmos-base.ts +++ b/src/chains/cosmos/cosmos-base.ts @@ -1,12 +1,12 @@ import axios from 'axios'; import { promises as fs } from 'fs'; -import { TokenListType, TokenValue, walletPath } from '../../services/base'; +import { TokenListType, stringInsert, walletPath } from '../../services/base'; import NodeCache from 'node-cache'; import fse from 'fs-extra'; import { ConfigManagerCertPassphrase } from '../../services/config-manager-cert-passphrase'; -import { BigNumber } from 'ethers'; +import { BigNumber } from 'bignumber.js'; import { AccountData, DirectSignResponse } from '@cosmjs/proto-signing'; - +import { Asset, AssetDenomUnit, AssetTrace } from '@chain-registry/types/types/assets' import { IndexedTx, setupIbcExtension } from '@cosmjs/stargate'; import { logger } from '../../services/logger'; @@ -15,16 +15,84 @@ const { DirectSecp256k1Wallet } = require('@cosmjs/proto-signing'); const { StargateClient } = require('@cosmjs/stargate'); const { toBase64, fromBase64, fromHex } = require('@cosmjs/encoding'); const crypto = require('crypto').webcrypto; -export interface Token { - base: string; - address: string; + +import { osmosis } from 'osmojs'; +import { getEIP1559DynamicBaseFee } from '../osmosis/osmosis.prices'; +import { isFractionString } from '../../services/validators'; +import { RefConfig } from '../../connectors/ref/ref.config'; +import { percentRegexp } from '../../services/config-manager-v2'; +const { createRPCQueryClient } = osmosis.ClientFactory; + +export class CosmosAsset implements Asset { + decimals: number = 0; + constructor(asset: Asset){ + this.decimals = getExponentForAsset(asset); + this.description = asset.description; + if (asset.address != null){ + this.address = asset.address; + } + this.base = asset.base; + this.name = asset.name; + this.display = asset.display; + this.symbol = asset.symbol; + this.logo_URIs = asset.logo_URIs; + if (asset.denom_units){ + this.denom_units = asset.denom_units; + } + if (asset.coingecko_id){ + this.coingecko_id = asset.coingecko_id; + } + if (asset.keywords){ + this.keywords = asset.keywords; + } + if (asset.traces){ + this.traces = asset.traces; + } + if (asset.ibc){ + this.ibc = asset.ibc; + } + } + description?: string; + type_asset?: string; + address: string = ''; + denom_units: AssetDenomUnit[] = []; + base: string; // this is denom!!! name: string; + display: string; symbol: string; + logo_URIs?: { + png?: string; + svg?: string; + jpeg?: string; + }; + coingecko_id?: string; + keywords?: string[]; + traces?: AssetTrace[]; + ibc?: { + source_channel?: string; + source_denom?: string; + dst_channel?: string; + }; +} + +// a nice way to represent the token value without carrying around as a string +export interface CosmosTokenValue { + value: BigNumber; decimals: number; } +const getExponentForAsset = (asset: Asset): number => { + if (asset && asset.denom_units){ + const unit = asset.denom_units.find(({ denom }) => denom === asset.display); + if (unit){ + return unit.exponent; + } + } + return 0 +}; + export interface CosmosWallet { - privKey: Uint8Array; + privkey: Uint8Array; pubkey: Uint8Array; prefix: 'string'; getAccounts(): [AccountData]; @@ -53,13 +121,38 @@ export type NewBlockHandler = (bn: number) => void; export type NewDebugMsgHandler = (msg: any) => void; + +// convert a BigNumber and the number of decimals into a numeric string. +// this makes it JavaScript compatible while preserving all the data. +export const bigNumberWithDecimalToStr = (n: BigNumber, d: number): string => { + const n_ = n.toString(); + + let zeros = ''; + + if (n_.length <= d) { + zeros = '0'.repeat(d - n_.length + 1); + } + + return stringInsert(n_.split('').reverse().join('') + zeros, '.', d) + .split('') + .reverse() + .join(''); +}; + +// we should turn Token into a string when we return as a value in an API call +export const tokenValueToString = (t: CosmosTokenValue | string): string => { + return typeof t === 'string' + ? t + : bigNumberWithDecimalToStr(t.value, t.decimals); +}; + export class CosmosBase { - private _provider; - protected tokenList: Token[] = []; - private _tokenMap: Record = {}; + public _provider: any = undefined; + protected tokenList: CosmosAsset[] = []; + protected _tokenMap: Record = {}; - private _ready: boolean = false; - private _initialized: Promise = Promise.resolve(false); + public _ready: boolean = false; + public _initialized: Promise = Promise.resolve(false); public chainName; public rpcUrl; @@ -68,20 +161,29 @@ export class CosmosBase { public tokenListType: TokenListType; public cache: NodeCache; + public manualGasPrice: number; + public rpcAddressDynamicBaseFee: string; + public useEIP1559DynamicBaseFeeInsteadOfManualGasPrice: boolean; + constructor( chainName: string, rpcUrl: string, tokenListSource: string, tokenListType: TokenListType, - gasPriceConstant: number + gasPriceConstant: number, // adjustment + useEIP1559DynamicBaseFeeInsteadOfManualGasPrice?: boolean, + rpcAddressDynamicBaseFee?: string, + manualGasPrice?: number ) { - this._provider = StargateClient.connect(rpcUrl); + this.manualGasPrice = manualGasPrice!; this.chainName = chainName; this.rpcUrl = rpcUrl; this.gasPriceConstant = gasPriceConstant; this.tokenListSource = tokenListSource; this.tokenListType = tokenListType; this.cache = new NodeCache({ stdTTL: 3600 }); // set default cache ttl to 1hr + this.useEIP1559DynamicBaseFeeInsteadOfManualGasPrice = useEIP1559DynamicBaseFeeInsteadOfManualGasPrice! + this.rpcAddressDynamicBaseFee = rpcAddressDynamicBaseFee! } ready(): boolean { @@ -95,6 +197,12 @@ export class CosmosBase { async init(): Promise { await this._initialized; // Wait for any previous init() calls to complete if (!this.ready()) { + if (this.chainName == 'osmosis'){ + this._provider = await createRPCQueryClient({rpcEndpoint: this.rpcUrl}); + await this.getLatestBasePrice(); + }else{ + this._provider = StargateClient.connect(this.rpcUrl); + } // If we're not ready, this._initialized will be a Promise that resolves after init() completes this._initialized = (async () => { try { @@ -110,6 +218,18 @@ export class CosmosBase { return; } + async getLatestBasePrice(): Promise { + var eipPrice = this.manualGasPrice; + if (this.useEIP1559DynamicBaseFeeInsteadOfManualGasPrice){ + const eipPrice = await getEIP1559DynamicBaseFee(this.rpcAddressDynamicBaseFee); + if (eipPrice != ''){ + this.manualGasPrice = Number(eipPrice); + } + } + this.manualGasPrice = eipPrice; + return this.manualGasPrice + } + async loadTokens( tokenListSource: string, tokenListType: TokenListType @@ -118,7 +238,7 @@ export class CosmosBase { if (this.tokenList) { this.tokenList.forEach( - (token: Token) => (this._tokenMap[token.symbol] = token) + (token: CosmosAsset) => (this._tokenMap[token.symbol] = token) ); } } @@ -127,25 +247,31 @@ export class CosmosBase { async getTokenList( tokenListSource: string, tokenListType: TokenListType - ): Promise { - let tokens; + ): Promise { + let tokens: CosmosAsset[] = []; + let tokensJson = []; + if (tokenListType === 'URL') { - ({ data: tokens } = await axios.get(tokenListSource)); + ({ data: tokensJson } = await axios.get(tokenListSource)); } else { - ({ tokens } = JSON.parse(await fs.readFile(tokenListSource, 'utf8'))); + (tokensJson = JSON.parse(await fs.readFile(tokenListSource, 'utf8'))); + } + for (var tokenAssetIdx=0; tokenAssetIdx> { - const balances: Record = {}; + async getBalances(wallet: CosmosWallet): Promise> { + const balances: Record = {}; const provider = await this._provider; @@ -332,7 +458,7 @@ export class CosmosBase { // Not all tokens are added in the registry so we use the denom if the token doesn't exist balances[token ? token.symbol : t.denom] = { - value: BigNumber.from(parseInt(t.amount, 10)), + value: new BigNumber(parseInt(t.amount, 10)), decimals: this.getTokenDecimals(token), }; }) @@ -344,7 +470,12 @@ export class CosmosBase { // returns a cosmos tx for a txHash async getTransaction(id: string): Promise { const provider = await this._provider; - const transaction = await provider.getTx(id); + var transaction; + if (this.chainName == 'osmosis'){ + transaction = await provider.cosmos.tx.v1beta1.getTx({hash: id}); + }else{ + transaction = await provider.getTx(id); + } if (!transaction) { throw new Error('Transaction not found'); @@ -353,14 +484,14 @@ export class CosmosBase { return transaction; } - public getTokenBySymbol(tokenSymbol: string): Token | undefined { + public getTokenBySymbol(tokenSymbol: string): CosmosAsset | undefined { return this.tokenList.find( - (token: Token) => token.symbol.toUpperCase() === tokenSymbol.toUpperCase() + (token: CosmosAsset) => token.symbol.toUpperCase() === tokenSymbol.toUpperCase() ); } - public getTokenByBase(base: string): Token | undefined { - return this.tokenList.find((token: Token) => token.base === base); + public getTokenByBase(base: string): CosmosAsset | undefined { + return this.tokenList.find((token: CosmosAsset) => token.base === base); } async getCurrentBlockNumber(): Promise { @@ -368,4 +499,24 @@ export class CosmosBase { return await provider.getHeight(); } -} + + /** + * Gets the allowed slippage percent from the optional parameter or the value + * in the configuration. + * + * @param allowedSlippageStr (Optional) should be of the form '1/10'. + */ + public getAllowedSlippage(allowedSlippageStr?: string): number { + if (allowedSlippageStr != null && isFractionString(allowedSlippageStr)) { + const fractionSplit = allowedSlippageStr.split('/'); + return 100 * (Number(fractionSplit[0]) / Number(fractionSplit[1])); + } + + const allowedSlippage = RefConfig.config.allowedSlippage; + const nd = allowedSlippage.match(percentRegexp); + if (nd) return 100 * (Number(nd[1]) / Number(nd[2])); + throw new Error( + 'Encountered a malformed percent string in the config for ALLOWED_SLIPPAGE.' + ); + } +} \ No newline at end of file diff --git a/src/chains/cosmos/cosmos.controllers.ts b/src/chains/cosmos/cosmos.controllers.ts index ce4b8c9629..1a660046e4 100644 --- a/src/chains/cosmos/cosmos.controllers.ts +++ b/src/chains/cosmos/cosmos.controllers.ts @@ -1,6 +1,5 @@ import { Cosmos } from './cosmos'; import { CosmosBalanceRequest, CosmosPollRequest } from './cosmos.requests'; -import { TokenValue, tokenValueToString } from '../../services/base'; import { HttpException, TOKEN_NOT_SUPPORTED_ERROR_CODE, @@ -10,11 +9,12 @@ import { validateCosmosBalanceRequest, validateCosmosPollRequest, } from './cosmos.validators'; +import { CosmosTokenValue, tokenValueToString } from './cosmos-base'; const { decodeTxRaw } = require('@cosmjs/proto-signing'); export const toCosmosBalances = ( - balances: Record, + balances: Record, tokenSymbols: Array ): Record => { const walletBalances: Record = {}; @@ -22,7 +22,7 @@ export const toCosmosBalances = ( tokenSymbols.forEach((symbol) => { let balance = '0.0'; - if (balances[symbol]) { + if (balances[symbol]) {// && !balances[symbol].value.eq(0)) { // is check necessary here or filtered in client? balance = tokenValueToString(balances[symbol]); } @@ -63,7 +63,7 @@ export class CosmosController { static async poll(cosmos: Cosmos, req: CosmosPollRequest) { validateCosmosPollRequest(req); - const transaction = await cosmos.getTransaction(req.txHash); + const transaction = await cosmos.getTransaction(req.txHash!); const currentBlock = await cosmos.getCurrentBlockNumber(); return { diff --git a/src/chains/cosmos/cosmos.requests.ts b/src/chains/cosmos/cosmos.requests.ts index 3329dab41d..09103da389 100644 --- a/src/chains/cosmos/cosmos.requests.ts +++ b/src/chains/cosmos/cosmos.requests.ts @@ -17,7 +17,7 @@ export interface CosmosTokenRequest { } export interface CosmosPollRequest { - txHash: string; + txHash?: string; } export enum TransactionResponseStatusCode { diff --git a/src/chains/cosmos/cosmos.validators.ts b/src/chains/cosmos/cosmos.validators.ts index c913931ffd..d0a73d9855 100644 --- a/src/chains/cosmos/cosmos.validators.ts +++ b/src/chains/cosmos/cosmos.validators.ts @@ -7,9 +7,12 @@ import { validateTxHash, } from '../../services/validators'; import { normalizeBech32 } from '@cosmjs/encoding'; +// const { fromHex } = require('@cosmjs/encoding'); export const invalidCosmosAddressError: string = 'The spender param is not a valid Cosmos address. (Bech32 format)'; +// export const invalidCosmosPrivateKeyError: string = + // 'The privateKey param is not a valid Cosmos private key.'; export const isValidCosmosAddress = (str: string): boolean => { try { @@ -20,6 +23,15 @@ export const isValidCosmosAddress = (str: string): boolean => { return false; } }; +// export const isValidCosmosPrivateKey = (str: string): boolean => { +// try { +// fromHex(str); + +// return true; +// } catch (e) { +// return false; +// } +// }; // given a request, look for a key called address that is a Cosmos address export const validatePublicKey: Validator = mkValidator( @@ -34,3 +46,9 @@ export const validateCosmosBalanceRequest: RequestValidator = export const validateCosmosPollRequest: RequestValidator = mkRequestValidator([ validateTxHash, ]); + +// export const validatePrivateKey: Validator = mkValidator( +// 'privateKey', +// invalidCosmosPrivateKeyError, +// (val) => typeof val === 'string' && isValidCosmosPrivateKey(val) +// ); \ No newline at end of file diff --git a/src/chains/kujira/kujira.ts b/src/chains/kujira/kujira.ts index 81a44558c7..7282a107e2 100644 --- a/src/chains/kujira/kujira.ts +++ b/src/chains/kujira/kujira.ts @@ -134,7 +134,7 @@ export class Kujira { const currentBlock = await this.kujira.getCurrentBlock({}); const transaction = await this.kujira.getTransaction({ - hash: req.txHash, + hash: req.txHash!, }); // noinspection UnnecessaryLocalVariableJS diff --git a/src/chains/osmosis/osmosis.apr.ts b/src/chains/osmosis/osmosis.apr.ts new file mode 100755 index 0000000000..a8af00649e --- /dev/null +++ b/src/chains/osmosis/osmosis.apr.ts @@ -0,0 +1,31 @@ +import { calcPoolAprs as _calcPoolAprs } from '@osmonauts/math'; + +import { CalcPoolAprsParams } from './osmosis.types'; + +// need to pass this tokenList from osmosis.ts... +export const calcPoolAprs = ({ + activeGauges, + pool, + prices, + superfluidPools, + aprSuperfluid, + lockupDurations, + volume7d, + swapFee, + lockup = '14', + includeNonPerpetual = true, +}: CalcPoolAprsParams) => { + return _calcPoolAprs({ + activeGauges, + pool, + assets: [], + prices, + superfluidPools, + aprSuperfluid, + lockupDurations, + volume7d, + swapFee, + lockup, + includeNonPerpetual, + }); +}; diff --git a/src/chains/osmosis/osmosis.config.ts b/src/chains/osmosis/osmosis.config.ts new file mode 100755 index 0000000000..d698e7e000 --- /dev/null +++ b/src/chains/osmosis/osmosis.config.ts @@ -0,0 +1,59 @@ +import { AvailableNetworks } from '../../services/config-manager-types'; +import { ConfigManagerV2 } from '../../services/config-manager-v2'; +import { TokenListType } from '../../services/base'; + +export namespace OsmosisConfig { + export interface NetworkConfig { + chainType: string; + chainId: (network: string) => string; + rpcURL: (network: string) => string; + tokenListType: (network: string) => TokenListType; + tokenListSource: (network: string) => string; + availableNetworks: Array; + tradingTypes: (type: string) => Array; + nativeCurrencySymbol: string; + + feeTier: string; + gasAdjustment: number; + gasLimitTransaction: string; + manualGasPrice: number; + manualGasPriceToken: string; + allowedSlippage: string; + rpcAddressDynamicBaseFee: string; + useEIP1559DynamicBaseFeeInsteadOfManualGasPrice: boolean; + } + + export const config: NetworkConfig = { + chainType: 'osmosis', + chainId: (network: string) => + ConfigManagerV2.getInstance().get(`osmosis.networks.${network}.chainId`), + rpcURL: (network: string) => + ConfigManagerV2.getInstance().get(`osmosis.networks.${network}.nodeURL`), + tokenListType: (network: string) => + ConfigManagerV2.getInstance().get( + `osmosis.networks.${network}.tokenListType` + ), + tokenListSource: (network: string) => + ConfigManagerV2.getInstance().get( + `osmosis.networks.${network}.tokenListSource` + ), + availableNetworks: [ + { + chain: 'osmosis', + networks: ['mainnet', 'testnet'], + }, + ], + tradingTypes: (type: string) => { + return type === 'swap' ? ['AMM_LP'] : ['AMM_LP']; + }, + manualGasPrice: ConfigManagerV2.getInstance().get(`osmosis.manualGasPrice`), + manualGasPriceToken: ConfigManagerV2.getInstance().get(`osmosis.manualGasPriceToken`), + nativeCurrencySymbol: ConfigManagerV2.getInstance().get(`osmosis.nativeCurrencySymbol`), + gasLimitTransaction: ConfigManagerV2.getInstance().get(`osmosis.gasLimitTransaction`), + gasAdjustment: ConfigManagerV2.getInstance().get(`osmosis.gasAdjustment`), + allowedSlippage: ConfigManagerV2.getInstance().get(`osmosis.allowedSlippage`), + feeTier: ConfigManagerV2.getInstance().get(`osmosis.feeTier`), + useEIP1559DynamicBaseFeeInsteadOfManualGasPrice: ConfigManagerV2.getInstance().get(`osmosis.useEIP1559DynamicBaseFeeInsteadOfManualGasPrice`), + rpcAddressDynamicBaseFee: ConfigManagerV2.getInstance().get(`osmosis.rpcAddressDynamicBaseFee`), + }; +} \ No newline at end of file diff --git a/src/chains/osmosis/osmosis.controllers.ts b/src/chains/osmosis/osmosis.controllers.ts new file mode 100755 index 0000000000..ab90642ae1 --- /dev/null +++ b/src/chains/osmosis/osmosis.controllers.ts @@ -0,0 +1,851 @@ + +import { + HttpException, + LOAD_WALLET_ERROR_CODE, + LOAD_WALLET_ERROR_MESSAGE, + PRICE_FAILED_ERROR_CODE, + PRICE_FAILED_ERROR_MESSAGE, + TRADE_FAILED_ERROR_CODE, + TRADE_FAILED_ERROR_MESSAGE, + SWAP_PRICE_EXCEEDS_LIMIT_PRICE_ERROR_CODE, + SWAP_PRICE_EXCEEDS_LIMIT_PRICE_ERROR_MESSAGE, + SWAP_PRICE_LOWER_THAN_LIMIT_PRICE_ERROR_CODE, + SWAP_PRICE_LOWER_THAN_LIMIT_PRICE_ERROR_MESSAGE, + UNKNOWN_ERROR_ERROR_CODE, + UNKNOWN_ERROR_MESSAGE +} from '../../services/error-handler'; +import { CosmosAsset, CosmosWallet } from '../../chains/cosmos/cosmos-base'; +import { AnyTransactionResponse, OsmosisExpectedTrade, TransactionEvent, TransactionEventAttribute, } from './osmosis.types' +import { latency } from '../../services/base'; +import { + CustomTransaction, + Tokenish, +} from '../../services/common-interfaces'; +import { logger } from '../../services/logger'; +import { + EstimateGasResponse, + PriceRequest, + TradeRequest, + AddLiquidityRequest, + AddLiquidityResponse, + PoolPriceRequest, + PoolPriceResponse, + RemoveLiquidityRequest, + RemoveLiquidityResponse, + PositionRequest, + PositionResponse, + TradeResponse, + PriceResponse, +} from '../../amm/amm.requests'; +import { Osmosis } from './osmosis'; + +import BigNumber from 'bignumber.js'; +import { Decimal } from 'decimal.js-light'; +import { CosmosAsset as TokenishCosmosAsset} from '../../chains/cosmos/cosmos-base'; +import { TokensRequest, TokensResponse } from '../../network/network.requests'; +import { TransferRequest, TransferResponse } from '../../services/common-interfaces'; +//@ts-ignore +import { validateCosmosBalanceRequest, validateCosmosPollRequest } from '../cosmos/cosmos.validators'; +import { CosmosBalanceRequest, CosmosPollRequest } from '../cosmos/cosmos.requests'; +import { toCosmosBalances } from '../cosmos/cosmos.controllers'; +import { AllowancesRequest, ApproveRequest, CancelRequest, NonceRequest, NonceResponse } from '../chain.requests'; +import { TOKEN_NOT_SUPPORTED_ERROR_MESSAGE, TOKEN_NOT_SUPPORTED_ERROR_CODE, OUT_OF_GAS_ERROR_MESSAGE, OUT_OF_GAS_ERROR_CODE, INSUFFICIENT_FUNDS_ERROR_MESSAGE, INSUFFICIENT_FUNDS_ERROR_CODE, AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE, AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE } from '../../services/error-handler'; +const { decodeTxRaw } = require('@cosmjs/proto-signing'); + +// Osmosis transaction.code values +const successfulTransaction = 0; +const unconfirmedTransaction = 0; +const lessThanMinAmountSlippage = 7; +const insufficientFunds = 5; +const outOfGas = 11; + +export interface TradeInfo { + baseToken: TokenishCosmosAsset; + quoteToken: TokenishCosmosAsset; + requestAmount: BigNumber; + expectedTrade: OsmosisExpectedTrade; +} + +export async function getOsmoWallet( + osmosis: Osmosis, + address: string, +): Promise<{ + wallet: CosmosWallet; +}> { + let wallet: CosmosWallet; + try { + wallet = await osmosis.getWallet(address, 'osmosis'); + } catch (err) { + logger.error(`Wallet ${address} not available.`); + throw new HttpException( + 500, + LOAD_WALLET_ERROR_MESSAGE + err, + LOAD_WALLET_ERROR_CODE + ); + } + return { wallet }; +} + +export class OsmosisController { + + static async getTradeInfo( + osmosis: Osmosis, + baseAsset: string, + quoteAsset: string, + baseAmount: Decimal, + tradeSide: string, + allowedSlippage?: string, + ): Promise { + const gasAdjustment = osmosis.gasPriceConstant; // + const feeTier = osmosis.feeTier; // + + const baseToken: Tokenish = osmosis.getTokenBySymbol(baseAsset)!; + const quoteToken: Tokenish = osmosis.getTokenBySymbol(quoteAsset)!; + + if (baseToken == undefined){ + throw new HttpException( + 500, + TOKEN_NOT_SUPPORTED_ERROR_MESSAGE + ' ' + baseAsset, + TOKEN_NOT_SUPPORTED_ERROR_CODE + ); + } + if (quoteToken == undefined){ + throw new HttpException( + 500, + TOKEN_NOT_SUPPORTED_ERROR_MESSAGE + ' ' + quoteAsset, + TOKEN_NOT_SUPPORTED_ERROR_CODE + ); + } + + const requestAmount: BigNumber = BigNumber( + baseAmount.toFixed(baseToken.decimals) + ); + + let expectedTrade: OsmosisExpectedTrade; + expectedTrade = await osmosis.estimateTrade( + quoteToken, + baseToken, + requestAmount, + tradeSide, + allowedSlippage, + feeTier, + gasAdjustment, + ); + + return { + baseToken, + quoteToken, + requestAmount, + expectedTrade, + }; + } + + static async price( + osmosis: Osmosis, + req: PriceRequest + ): Promise { + const startTimestamp: number = Date.now(); + + const gasPrice = osmosis.manualGasPrice; // GAS PRICE PER UNIT OF WORK + const gasLimitTransaction = osmosis.gasLimitEstimate; // MAX uOSMO COST PER TRANSACTION + + let tradeInfo: TradeInfo; + try { + tradeInfo = await this.getTradeInfo( + osmosis, + req.base, + req.quote, + new Decimal(req.amount), + req.side, + ); + } catch (e) { + if (e instanceof Error) { + throw new HttpException( + 500, + PRICE_FAILED_ERROR_MESSAGE + e.message, + PRICE_FAILED_ERROR_CODE + ); + } else { + throw new HttpException( + 500, + UNKNOWN_ERROR_MESSAGE + ' Failed to retrive trade info.', + UNKNOWN_ERROR_ERROR_CODE + ); + } + } + + const trade = tradeInfo.expectedTrade; + const expectedAmount = tradeInfo.expectedTrade.expectedAmount; + const tradePrice = trade.executionPrice; + + + return { + network: osmosis.chainName, + timestamp: startTimestamp, + latency: latency(startTimestamp, Date.now()), + base: tradeInfo.baseToken.symbol, + quote: tradeInfo.quoteToken.symbol, + amount: new Decimal(req.amount).toFixed(tradeInfo.baseToken.decimals), + rawAmount: tradeInfo.requestAmount.toString(), + expectedAmount: expectedAmount.toString(), + price: tradePrice.toString(), + gasPrice: Number(gasPrice), + gasLimit: Number(gasLimitTransaction), + gasCost: tradeInfo.expectedTrade.gasUsed, + gasWanted: tradeInfo.expectedTrade.gasWanted, + gasPriceToken: 'uosmo' + }; + } + + static async trade( + osmosis: Osmosis, + req: TradeRequest + ): Promise { + const startTimestamp: number = Date.now(); + + const limitPrice = req.limitPrice; + const { wallet } = + await getOsmoWallet( + osmosis, + req.address, + ); + + let tradeInfo: TradeInfo; + try { + tradeInfo = await this.getTradeInfo( + osmosis, + req.base, + req.quote, + new Decimal(req.amount), + req.side, + req.allowedSlippage + ); + } catch (e) { + if (e instanceof Error) { + logger.error(`Could not get trade info. ${e.message}`); + throw new HttpException( + 500, + TRADE_FAILED_ERROR_MESSAGE + ' ' + e.message, + TRADE_FAILED_ERROR_CODE + ); + } else { + logger.error('Unknown error trying to get trade info.'); + throw new HttpException( + 500, + UNKNOWN_ERROR_MESSAGE + ' Failed to retrive trade info.', + UNKNOWN_ERROR_ERROR_CODE + ); + } + } + + const price = tradeInfo.expectedTrade.executionPrice; + + const gasLimitTransaction = osmosis.gasLimitEstimate; // MAX uOSMO COST PER TRANSACTION + const gasAdjustment = osmosis.gasPriceConstant; // + const feeTier = osmosis.feeTier; // + + if (req.side === 'BUY') { + + if ( + limitPrice && + new Decimal(price.toFixed(8)).gt(new Decimal(limitPrice)) + ) { + logger.error('Swap price exceeded limit price.'); + throw new HttpException( + 500, + SWAP_PRICE_EXCEEDS_LIMIT_PRICE_ERROR_MESSAGE( + price.toFixed(8), + limitPrice + ), + SWAP_PRICE_EXCEEDS_LIMIT_PRICE_ERROR_CODE + ); + } + + } + else { + logger.info( + `Expected execution price is ${price.toFixed(6)}, ` + + `limit price is ${limitPrice}.` + ); + if ( + limitPrice && + new Decimal(price.toFixed(8)).lt(new Decimal(limitPrice)) + ) { + logger.error('Swap price lower than limit price.'); + throw new HttpException( + 500, + SWAP_PRICE_LOWER_THAN_LIMIT_PRICE_ERROR_MESSAGE( + price.toFixed(8), + limitPrice + ), + SWAP_PRICE_LOWER_THAN_LIMIT_PRICE_ERROR_CODE + ); + } + } + + const tx = await osmosis.executeTrade( + wallet, + tradeInfo, + req.address, + req.allowedSlippage, + feeTier, + gasAdjustment, + ); + + const txMessage = 'Trade has been executed. ' + this.validateTxErrors(tx, txMessage); + + var finalAmountReceived_string = ''; + for (var txEvent_idx=0; txEvent_idx { + const startTimestamp: number = Date.now(); + + const { wallet } = + await getOsmoWallet( + osmosis, + req.address, + ); + + const token0: TokenishCosmosAsset = osmosis.getTokenBySymbol(req.token0)!; + const token1: TokenishCosmosAsset = osmosis.getTokenBySymbol(req.token1)!; + + const gasLimitTransaction = osmosis.gasLimitEstimate; // MAX uOSMO COST PER TRANSACTION + const gasAdjustment = osmosis.gasPriceConstant; // + const feeTier = osmosis.feeTier; // + + var tx = undefined; + var out_tokenId = 0; + if (req.lowerPrice){ + tx = await osmosis.addPositionLP( + wallet, + token0, + token1, + req, + feeTier, + gasAdjustment, + ); + out_tokenId = tx.positionId! + } else{ + tx = await osmosis.addPosition( + wallet, + req.address, + token0, + token1, + req.amount0, + req.amount1, + req.tokenId, + req.allowedSlippage, + feeTier, + gasAdjustment, + ); + out_tokenId = tx.poolId + } + + this.validateTxErrors(tx, "Liquidity added. "); + + // Instead of poolId for tokenId, we can return Position_id then filter our current positions to find it later, to get the poolId again.. then we'd support multiple positions for each pool + return { + network: osmosis.chainName, + timestamp: startTimestamp, + latency: latency(startTimestamp, Date.now()), + token0: req.token0, + token1: req.token1, + fee: feeTier, + tokenId: out_tokenId, + gasPrice: tx.gasPrice, + gasPriceToken: osmosis.manualGasPriceToken, + gasLimit: Number(gasLimitTransaction), + gasCost: tx.gasUsed.toString(), + gasWanted: tx.gasWanted.toString(), + txHash: tx.transactionHash, + poolAddress: tx.poolAddress, + poolShares: tx.poolshares, + token0FinalAmount: tx.token0_finalamount, + token1FinalAmount: tx.token1_finalamount, + nonce: 0, + }; + + } + + static async removeLiquidity( + osmosis: Osmosis, + req: RemoveLiquidityRequest + ): Promise { + const startTimestamp: number = Date.now(); + + const { wallet } = + await getOsmoWallet( + osmosis, + req.address, + ); + + const gasPrice = osmosis.manualGasPrice; // GAS PRICE PER UNIT OF WORK + const gasLimitTransaction = osmosis.gasLimitEstimate; // MAX uOSMO COST PER TRANSACTION + const gasAdjustment = osmosis.gasPriceConstant; // + const feeTier = osmosis.feeTier; // + + const tx = await osmosis.reducePosition( + wallet, + req.decreasePercent, + req.address, + req.tokenId, // this is PositionID (CL) or PoolID (GAMM) + req.allowedSlippage, + feeTier, + gasAdjustment, + ); + + logger.info( + `Liquidity removed, txHash is ${tx.transactionHash}, gasUsed is ${tx.gasUsed}.` + ); + + return { + network: osmosis.chainName, + timestamp: startTimestamp, + latency: latency(startTimestamp, Date.now()), + tokenId: req.tokenId, + balances: tx.balances, + gasPrice: gasPrice.toString(), + gasLimit: Number(gasLimitTransaction), + gasCost: tx.gasUsed.toString(), + gasWanted: tx.gasWanted.toString(), + txHash: tx.transactionHash, + gasPriceToken: osmosis.manualGasPriceToken, + isCollectFees: false, // instead of collect + }; + } + + + static async collectFees( + osmosis: Osmosis, + req: RemoveLiquidityRequest + ): Promise { + const startTimestamp: number = Date.now(); + + const { wallet } = + await getOsmoWallet( + osmosis, + req.address, + ); + + const gasPrice = osmosis.manualGasPrice; // GAS PRICE PER UNIT OF WORK + const gasLimitTransaction = osmosis.gasLimitEstimate; // MAX uOSMO COST PER TRANSACTION + const gasAdjustment = osmosis.gasPriceConstant; // + const feeTier = osmosis.feeTier; // + + const tx = await osmosis.collectRewardsIncentives( + wallet, + req.address, + req.tokenId, // this is PositionID (CL) or PoolID (GAMM) + feeTier, + gasAdjustment, + ); + + logger.info( + `Collected Fees, txHash is ${tx.transactionHash}, gasUsed is ${tx.gasUsed}.` + ); + + return { + network: osmosis.chainName, + timestamp: startTimestamp, + latency: latency(startTimestamp, Date.now()), + tokenId: req.tokenId, + balances: tx.balances, + gasPrice: gasPrice.toString(), + gasLimit: Number(gasLimitTransaction), + gasCost: tx.gasUsed.toString(), + gasWanted: tx.gasWanted.toString(), + txHash: tx.transactionHash, + gasPriceToken: osmosis.manualGasPriceToken, + isCollectFees: true, // instead of collect + }; + } + + // find pools containing both token0, token1 + static async poolPrice( + osmosis: Osmosis, + req: PoolPriceRequest + ): Promise { + const startTimestamp: number = Date.now(); + + const token0: TokenishCosmosAsset = osmosis.getTokenBySymbol(req.token0)!; + const token1: TokenishCosmosAsset = osmosis.getTokenBySymbol(req.token1)!; + + if (token0 == undefined){ + throw new HttpException( + 500, + TOKEN_NOT_SUPPORTED_ERROR_MESSAGE + ' ' + req.token0, + TOKEN_NOT_SUPPORTED_ERROR_CODE + ); + } + if (token1 == undefined){ + throw new HttpException( + 500, + TOKEN_NOT_SUPPORTED_ERROR_MESSAGE + ' ' + req.token1, + TOKEN_NOT_SUPPORTED_ERROR_CODE + ); + } + + const priceAndPools = await osmosis.findPoolsPrices( + token0, + token1, + req.address! + ); + + logger.info( + `Found pools and prices for ${req.token0}, ${req.token1}.` + ); + + return { + network: osmosis.chainName, + timestamp: startTimestamp, + latency: latency(startTimestamp, Date.now()), + token0: req.token0, + token1: req.token1, + prices: priceAndPools.prices, + pools: priceAndPools.pools, //CosmosExtendedPool[]; + }; + } + + // find all pool positions for address or singular poolId if supplied + static async poolPositions( + osmosis: Osmosis, + req: PositionRequest + ): Promise { + const startTimestamp: number = Date.now(); + + const response = await osmosis.findPoolsPositions( + req.address!, + req.tokenId + ); + + if (req.tokenId){ + logger.info( + `Found pool positions for ${req.address}, ${req.tokenId!.toString()}` + ); + }else{ + logger.info( + `Found pools positions for ${req.address}.` + ); + } + + + return { + network: osmosis.chainName, + timestamp: startTimestamp, + latency: latency(startTimestamp, Date.now()), + //CosmosExtendedPool[]; + ...response + }; + } + + + static async estimateGas( + osmosis: Osmosis, + ): Promise { + + const gasPrice = Number(osmosis.getLatestBasePrice()); // GAS PRICE PER UNIT OF WORK + const gasLimitTransaction = osmosis.gasLimitEstimate; // MAX uOSMO COST PER TRANSACTION + + return { + network: osmosis.chainName, + timestamp: Date.now(), + gasPrice: gasPrice, + gasPriceToken: osmosis.manualGasPriceToken, + gasLimit: Number(gasLimitTransaction), + gasCost: gasPrice.toString(), + }; + + } + + static async getTokens( + osmosis: Osmosis, + req: TokensRequest + ): Promise { + return await osmosis.getTokens(req); + } + + static async transfer( + osmosis: Osmosis, + req: TransferRequest + ): Promise { + + const { wallet } = + await getOsmoWallet( + osmosis, + req.from, + ); + + const token: TokenishCosmosAsset = osmosis.getTokenBySymbol(req.token)!; + + const tx = await osmosis.transfer(wallet, token, req); + + + const txMessage = 'Transfer success. To: ' + req.to + ' From: ' + req.from + ' ' + this.validateTxErrors(tx, txMessage); + if (tx.code == successfulTransaction){ + return 'Transfer success. To: ' + req.to + ' From: ' + req.from + ' Hash: ' + tx.transactionHash + ' gasUsed: ' + tx.gasUsed + ' gasWanted: ' + tx.gasWanted + } + else{ + throw new HttpException( + 500, + UNKNOWN_ERROR_MESSAGE + ' ' + tx.rawLog, + UNKNOWN_ERROR_ERROR_CODE + ); + } + } + + static async balances(osmosis: Osmosis, req: CosmosBalanceRequest) { + const startTimestamp: number = Date.now(); + validateCosmosBalanceRequest(req); + + const wallet = await osmosis.getWallet(req.address, 'osmo'); + + var tokenSymbols: string[] = []; + // FILTER IF req.tokenSymbols != [] + if (req && req.tokenSymbols && req.tokenSymbols.length > 0){ + tokenSymbols = req.tokenSymbols; + } else{ + const tokenAssets = osmosis.storedTokenList; + tokenAssets.forEach((token: CosmosAsset) => { + tokenSymbols.push(token.symbol); + }); + } + + const balances = await osmosis.getBalances(wallet); + const filteredBalances = toCosmosBalances(balances, tokenSymbols); + + return { + network: osmosis.chainName, + timestamp: startTimestamp, + latency: latency(startTimestamp, Date.now()), + balances: filteredBalances, + }; + } + + static async poll(osmosis: Osmosis, req: CosmosPollRequest) { + if (req.txHash){ + const transaction = await osmosis.getTransaction(req.txHash); + const currentBlock = await osmosis.getCurrentBlockNumber(); + + //@ts-ignore cosmojs models again + var pool_id = undefined; + var position_id = undefined; + //@ts-ignore cosmojs models again + if (transaction.txResponse.logs){ + //@ts-ignore cosmojs models again + transaction.txResponse.logs.forEach((log) => { + //@ts-ignore cosmojs models again + const create_position_event = log.events.find(({ type }) => type === 'create_position'); + if (create_position_event){ + //@ts-ignore cosmojs models again + const pool_id_attribute = create_position_event.attributes.find(({ key }) => key === 'pool_id'); + if (pool_id_attribute){ + pool_id = pool_id_attribute.value + } + //@ts-ignore cosmojs models again + const position_id_attribute = create_position_event.attributes.find(({ key }) => key === 'position_id'); + if (position_id_attribute){ + position_id = position_id_attribute.value + } + } + }) + } + var tokenId = position_id; + if (position_id == undefined){ + tokenId = pool_id; + } + + var txStatus = unconfirmedTransaction; + //@ts-ignore cosmojs models again + if (transaction.txResponse.code == successfulTransaction){ + txStatus = 1; // clientside this is a successful tx + } + //@ts-ignore cosmojs models again + else if (transaction.txResponse.code != unconfirmedTransaction){ + //@ts-ignore cosmojs models again + txStatus = transaction.txResponse.code; // any other failure + } + return { + txStatus: txStatus, + txReceipt: null, + tokenId: Number(tokenId), + txHash: req.txHash, + currentBlock, + //@ts-ignore cosmojs models again + txBlock: Number(transaction.txResponse.height.toString()), + //@ts-ignore cosmojs models again + gasUsed: Number(transaction.txResponse.gasUsed.toString()), + //@ts-ignore cosmojs models again + gasWanted: Number(transaction.txResponse.gasWanted.toString()), + txData: decodeTxRaw(transaction.tx), + }; + + } + return { + txHash: '', + txStatus: 0, + txBlock: 0, + gasUsed: 0, + gasWanted: 0, + txData: '', + }; + } + + // these below shouldn't actually be called + static async allowances( + osmosis: Osmosis, + req: AllowancesRequest + ){ + if (osmosis || req){} + // Not applicable. + var allowances: Record = {} + req.tokenSymbols.forEach((sym)=>{ + allowances[sym] = "1000000000000000000000000000000000000000000000" + }) + return { + spender: undefined as unknown as string, + approvals: allowances, + }; + } + + static async approve( + osmosis: Osmosis, + req: ApproveRequest + ){ + if (osmosis || req){} + // Not applicable. + return { + tokenAddress: undefined as unknown as string, + spender: undefined as unknown as string, + amount: undefined as unknown as string, + nonce: undefined as unknown as number, + approval: undefined as unknown as CustomTransaction, + }; + } + + static async cancel( + osmosis: Osmosis, + req: CancelRequest + ){ + if (osmosis || req){} + // Not applicable. + return { + txHash: undefined as unknown as string, + }; + } + + static async nonce( + osmosis: Osmosis, + req: NonceRequest + ): Promise { + if (osmosis || req){} + // Not applicable. + const nonce = 0; + return { nonce }; + } + + static async nextNonce( + osmosis: Osmosis, + req: NonceRequest + ): Promise { + if (osmosis || req){} + // Not applicable. + const nonce = 0; + return { nonce }; + } + + static validateTxErrors(tx: AnyTransactionResponse, msg: string){ + if (tx.code != successfulTransaction){ + if (tx.code == outOfGas){ + logger.error( + `Failed to execute trade: Out of gas. txHash is ${tx.transactionHash}, gasUsed is ${tx.gasUsed} greater than gasWanted ${tx.gasWanted} . Log: ${tx.rawLog}` + ) + throw new HttpException( + 500, + OUT_OF_GAS_ERROR_MESSAGE + " : " + tx.rawLog, + OUT_OF_GAS_ERROR_CODE + ); + } else if (tx.code == lessThanMinAmountSlippage){ + logger.error( + `Failed to execute trade. Token created less than minimum amount; increase slippage. txHash is ${tx.transactionHash}, gasUsed is ${tx.gasUsed}. Log: ${tx.rawLog}` + ) + throw new HttpException( + 500, + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE + " : " + tx.rawLog, + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE + ); + } + else if (tx.code == insufficientFunds){ + logger.error( + `Failed to execute trade. Insufficient funds. txHash is ${tx.transactionHash}, gasUsed is ${tx.gasUsed}. Log: ${tx.rawLog}` + ) + throw new HttpException( + 500, + INSUFFICIENT_FUNDS_ERROR_MESSAGE + " : " + tx.rawLog, + INSUFFICIENT_FUNDS_ERROR_CODE + ); + + } else { + logger.error( + `Failed to execute trade. txHash is ${tx.transactionHash}, gasUsed is ${tx.gasUsed}. Log: ${tx.rawLog}` + ) + + throw new HttpException( + 500, + TRADE_FAILED_ERROR_MESSAGE + " : " + tx.rawLog, + TRADE_FAILED_ERROR_CODE + ); + } + } + logger.info( + msg + `txHash is ${tx.transactionHash}, gasUsed is ${tx.gasUsed}.` + ); + } +} \ No newline at end of file diff --git a/src/chains/osmosis/osmosis.lp.utils.ts b/src/chains/osmosis/osmosis.lp.utils.ts new file mode 100755 index 0000000000..844c4cd421 --- /dev/null +++ b/src/chains/osmosis/osmosis.lp.utils.ts @@ -0,0 +1,148 @@ +// adapted from utils/pools.ts from createcosmoapp liquidity example + +import BigNumber from 'bignumber.js'; +import { Asset } from '@chain-registry/types'; +import { Pool } from 'osmojs/dist/codegen/osmosis/gamm/pool-models/balancer/balancerPool'; +import { Coin } from 'osmo-query/dist/codegen/cosmos/base/v1beta1/coin'; +import { + calcPoolLiquidity, + getPoolByGammName as _getPoolByGammName, + convertGammTokenToDollarValue, +} from '@osmonauts/math'; + +import { + // AnyPoolType, + PriceHash, + ExtendedPool +} from './osmosis.types'; +import { Fee } from './osmosis.utils'; + +export const getPoolByGammName = (pools: Pool[], gammId: string): Pool => { + return _getPoolByGammName(pools, gammId); +}; + +// '/osmosis.gamm.poolmodels.stableswap.v1beta1.Pool' +// SS pools are handled by neither filter case (out of spec) + +export const filterPoolsSwapAndLP = (assets: Asset[], pools: ExtendedPool[], prices: PriceHash): ExtendedPool[] => { + var poolsOut = pools.filter(({ $typeUrl }) => !$typeUrl?.includes('stableswap')) + + poolsOut = poolsOut.filter((pool) => { + if (pool.poolAssets){ + return pool.poolAssets.every( + (pAsset: { token: { denom: string; }; }) => + prices[pAsset.token.denom] && + !pAsset.token.denom.startsWith('gamm/pool') && + assets.find(({ base }) => base === pAsset.token.denom) + ) + } + else if (pool.token0){ + return prices[pool.token0] && prices[pool.token1] && assets.find(({ base }) => base === pool.token0) && assets.find(({ base }) => base === pool.token1); + } + return false; + }); + + return poolsOut; +} + +export const filterPoolsSwap = (assets: Asset[], pools: ExtendedPool[], prices: PriceHash): ExtendedPool[] => { + return pools + .filter(({ $typeUrl }) => $typeUrl?.includes('gamm.v1beta1')) + .filter(({ poolAssets }) => + poolAssets != undefined && + poolAssets.every( + ({ token }) => + prices[token.denom] && + !token.denom.startsWith('gamm/pool') && + assets.find(({ base }) => base === token.denom) + ) + ); +}; + +export const filterPoolsLP = (assets: Asset[], pools: any[], prices: PriceHash) => { + var poolsOut = pools.filter(({ $typeUrl }) => $typeUrl?.includes('concentratedliquidity')) + poolsOut = poolsOut.filter((pool) => prices[pool.token0] && prices[pool.token1] && assets.find(({ base }) => base === pool.token0) && assets.find(({ base }) => base === pool.token1)); + return poolsOut; +}; + +interface ExtendPoolProps { + pool: ExtendedPool; + fees: Fee[]; + balances: Coin[]; + lockedCoins: Coin[]; + prices: PriceHash; +} + +export const extendPool = (assets: Asset[], { + pool, + fees, + balances, + lockedCoins, + prices, +}: ExtendPoolProps): ExtendedPool => { + var liquidity = 0; + if (pool.poolAssets){ + // if this is NOT a CL pool + liquidity = new BigNumber(calcPoolLiquidity(assets, pool, prices)) + .decimalPlaces(0) + .toNumber(); + } + + var volume24H = 0 + var volume7d = 0 + var fees7D = 0 + if (fees){ + const feeData = fees.find((fee) => fee.pool_id === pool.id.toString()); + volume24H = Math.round(Number(feeData?.volume_24h || 0)); + volume7d = Math.round(Number(feeData?.volume_7d || 0)); + fees7D = Math.round(Number(feeData?.fees_spent_7d || 0)); + } + + var poolDenom = ''; + if (pool.totalShares){ + // also don't exist for CL pools + poolDenom = pool.totalShares?.denom; + } + + const balanceCoin = balances.find(({ denom }) => denom === poolDenom); + const myLiquidity = balanceCoin + ? convertGammTokenToDollarValue(assets, balanceCoin, pool, prices) + : '0'; + + const lockedCoin = lockedCoins.find(({ denom }) => denom === poolDenom); + const bonded = lockedCoin + ? convertGammTokenToDollarValue(assets, lockedCoin, pool, prices) + : '0'; + + return { + ...pool, + liquidity, + volume24H, + fees7D, + volume7d, + myLiquidity, + bonded, + denom: poolDenom, + }; +}; + +export const descByLiquidity = (pool1: ExtendedPool, pool2: ExtendedPool) => { + return new BigNumber(pool1.liquidity).lt(pool2.liquidity) ? 1 : -1; +}; + +export const descByMyLiquidity = (pool1: ExtendedPool, pool2: ExtendedPool) => { + return new BigNumber(pool1.myLiquidity).lt(pool2.myLiquidity) ? 1 : -1; +}; + +type Item = { + denom: string; + [key: string]: any; +}; + +export const getPoolsByDenom = (allPools: ExtendedPool[], items: Item[]) => { + return items + .filter(({ denom }) => allPools.find(({ denom: d }) => d === denom)) + .map(({ denom }) => { + return allPools.find(({ denom: d }) => d === denom) as ExtendedPool; + }); +}; diff --git a/src/chains/osmosis/osmosis.prices.ts b/src/chains/osmosis/osmosis.prices.ts new file mode 100755 index 0000000000..29e4deab1e --- /dev/null +++ b/src/chains/osmosis/osmosis.prices.ts @@ -0,0 +1,119 @@ +import { Asset } from '@chain-registry/types'; + +import { + PriceHash, +} from '@osmonauts/math/dist/types'; +import { CosmosAsset } from '../cosmos/cosmos-base'; + +type CoinGeckoId = string; +type CoinGeckoUSD = { usd: number }; +type CoinGeckoUSDResponse = Record; + +const getAssetsWithGeckoIds = (assets: Asset[]) => { + return assets.filter((asset) => !!asset?.coingecko_id); +}; + +const getGeckoIds = (assets: Asset[]) => { + return assets.map((asset) => asset.coingecko_id) as string[]; +}; + +const formatPrices = ( + prices: CoinGeckoUSDResponse, + assets: Asset[] +): Record => { + return Object.entries(prices).reduce((priceHash, cur) => { + const key = assets.find((asset) => asset.coingecko_id === cur[0])!.base; + // const key = assets.find((asset) => asset.coingecko_id === cur[0])!.symbol; // hash by symbol + return { ...priceHash, [key]: cur[1].usd }; + }, {}); +}; + +export const getCoinGeckoPrices = async (assets: Asset[]): Promise> => { + const assetsWithGeckoIds = getAssetsWithGeckoIds(assets); + const geckoIds = getGeckoIds(assetsWithGeckoIds); + + const priceData: CoinGeckoUSDResponse | undefined = await getData(geckoIds); + if (priceData){ + return formatPrices(priceData, assetsWithGeckoIds) + } + throw new Error('Osmosis failed to get prices from coingecko.com') +}; + + +const getData = async ( + geckoIds: string[] +): Promise => { + let prices: CoinGeckoUSDResponse; + + const url = `https://api.coingecko.com/api/v3/simple/price?ids=${geckoIds.join()}&vs_currencies=usd`; + try { + const response = await fetch(url); + if (!response.ok) throw Error('Get price error'); + prices = (await response.json()) as CoinGeckoUSDResponse; + return prices; + } catch (err) { + console.error(err); + } + return undefined; +}; + +export const getImperatorPriceHash = async (tokenList?: CosmosAsset[], url: string = 'https://api-osmosis.imperator.co/tokens/v2/all') => { + let prices = []; + + try { + const response = await fetch(url); + if (!response.ok) throw Error('Get price error'); + prices = (await response.json()) as any[]; + } catch (err) { + console.error(err); + } + + var priceHash: PriceHash = {}; + // need to sort from symbol->denom input to make testnet denoms work (prices always come with mainnet denoms) + if (tokenList && tokenList.length>0){ + prices.forEach((element) => { + if (element.symbol){ + var testnet_element = tokenList.find(({symbol}) => symbol==element.symbol); + if (testnet_element){ + priceHash[testnet_element.base] = element.price; + }else{ + priceHash[element.denom] = element.price; + } + }else{ + priceHash[element.denom] = element.price; + } + }); + }else{ + priceHash = prices.reduce( + (prev: any, cur: { denom: any; price: any }) => ({ + ...prev, + [cur.denom]: cur.price, + }), + {} + ); + } + + return priceHash; +}; + +interface baseFee{ + base_fee?: string +} + +export const getEIP1559DynamicBaseFee = async (url: string) => { + var fee: baseFee | undefined = undefined; + + try { + const response = await fetch(url); + if (!response.ok) throw Error('Get base fee error'); + fee = (await response.json()) as baseFee; + } catch (err) { + console.error(err); + } + + if (fee && fee.base_fee){ + var finalFee = Number(fee!.base_fee!).toString(); + return finalFee; + } + return ''; +} \ No newline at end of file diff --git a/src/chains/osmosis/osmosis.swap.ts b/src/chains/osmosis/osmosis.swap.ts new file mode 100644 index 0000000000..133f2be465 --- /dev/null +++ b/src/chains/osmosis/osmosis.swap.ts @@ -0,0 +1,231 @@ +// adapted from osmonauts-math swap.ts to use BigNumber to enable .pow(x<1) + +import { Asset } from "@chain-registry/types"; +import { Decimal } from "decimal.js"; +import { BigNumber } from "bignumber.js"; +import { CoinDenom, Trade, PrettyPair } from "@osmonauts/math/dist/types"; +import { symbolToOsmoDenom } from "@osmonauts/math/dist/utils"; +import { SwapAmountInRoute } from "osmojs/dist/codegen/osmosis/poolmanager/v1beta1/swap_route"; +import { Pool } from 'osmojs/dist/codegen/osmosis/gamm/pool-models/balancer/balancerPool'; +import { Coin } from "osmojs/dist/codegen/cosmos/base/v1beta1/coin"; + +export const routesThroughPools = ({ + denom, + trade, + pairs, +}: { + denom: CoinDenom; + trade: Trade; + pairs: PrettyPair[]; +}): SwapAmountInRoute[] => { + const sellPool = pairs.find( + (pair) => + (pair.baseAddress == trade.sell.denom && pair.quoteAddress == denom) || + (pair.quoteAddress == trade.sell.denom && pair.baseAddress == denom) + ); + + const buyPool = pairs.find( + (pair) => + (pair.baseAddress == denom && pair.quoteAddress == trade.buy.denom) || + (pair.quoteAddress == denom && pair.baseAddress == trade.buy.denom) + ); + + if (sellPool && buyPool) { + const routes = [ + { + poolId: BigInt(sellPool.poolId), + tokenOutDenom: denom, + }, + { + poolId: BigInt(buyPool.poolId), + tokenOutDenom: trade.buy.denom, + }, + ]; + + return routes; + } + + return []; +}; + +export const getRoutesForTrade = ( + assets: Asset[], + { + trade, + pairs, + }: { + trade: Trade; + pairs: PrettyPair[]; + } +): SwapAmountInRoute[] => { + const directPool = pairs.find( + (pair) => + (pair.baseAddress == trade.sell.denom && + pair.quoteAddress == trade.buy.denom) || + (pair.quoteAddress == trade.sell.denom && + pair.baseAddress == trade.buy.denom) + ); + + if (directPool) { + return [ + { + poolId: BigInt(directPool.poolId), + tokenOutDenom: trade.buy.denom, + }, + ]; + } + + const osmoRoutes = routesThroughPools({ + denom: "uosmo", + trade, + pairs, + }); + + if (osmoRoutes.length === 2) return osmoRoutes; + + const atomRoutes = routesThroughPools({ + denom: symbolToOsmoDenom(assets, "ATOM"), + trade, + pairs, + }); + + if (atomRoutes.length === 2) return atomRoutes; + + return []; +}; + +export const calcAmountWithSlippage = ( + amount: string, + slippage: number | string +) => { + const remainingPercentage = new BigNumber(100).minus(slippage).div(100); + return new BigNumber(amount).multipliedBy(remainingPercentage).toString(); +}; + +const one = new BigNumber(1); + +const getPoolAsset = (pool: Pool, denom: string) => { + const poolAsset = pool.poolAssets.find( + (asset) => asset?.token && asset.token.denom === denom + ); + if (!poolAsset) { + throw new Error( + `Pool ${pool.id} doesn't have the pool asset for ${denom}` + ); + } + return { denom, weight: poolAsset.weight, amount: poolAsset.token!.amount }; +}; + +export const calcSpotPrice = ( + tokenBalanceIn: BigNumber, + tokenWeightIn: BigNumber, + tokenBalanceOut: BigNumber, + tokenWeightOut: BigNumber, + swapFee: BigNumber +): BigNumber => { + const number = tokenBalanceIn.div(tokenWeightIn); + const denom = tokenBalanceOut.div(tokenWeightOut); + const scale = one.div(one.minus(swapFee)); + + return number.div(denom).multipliedBy(scale); +}; + +export const calcOutGivenIn = ( + tokenBalanceIn: BigNumber, + tokenWeightIn: BigNumber, + tokenBalanceOut: BigNumber, + tokenWeightOut: BigNumber, + tokenAmountIn: BigNumber, + swapFee: BigNumber +): BigNumber => { + const weightRatio = tokenWeightIn.div(tokenWeightOut); + let adjustedIn = one.minus(swapFee); + adjustedIn = tokenAmountIn.multipliedBy(adjustedIn); + const y = tokenBalanceIn.div(tokenBalanceIn.plus(adjustedIn)); + const foo = new BigNumber(new Decimal(y.toString()).pow(new Decimal(weightRatio.toString())).toString()); + const bar = one.minus(foo); + return tokenBalanceOut.multipliedBy(bar); +}; + +export const calcInGivenOut = ( + tokenBalanceIn: BigNumber, + tokenWeightIn: BigNumber, + tokenBalanceOut: BigNumber, + tokenWeightOut: BigNumber, + tokenAmountOut: BigNumber, + swapFee: BigNumber +): BigNumber => { + const weightRatio = tokenWeightOut.div(tokenWeightIn); + const diff = tokenBalanceOut.minus(tokenAmountOut); + const y = tokenBalanceOut.div(diff); + let foo = new BigNumber(new Decimal(y.toString()).pow(new Decimal(weightRatio.toString())).toString()); + foo = foo.minus(one); + const tokenAmountIn = one.minus(swapFee); + return tokenBalanceIn.multipliedBy(foo).div(tokenAmountIn); +}; + +export const calcPriceImpactGivenIn = ( + tokenIn: Coin, + tokenOutDenom: string, + pool: Pool +) => { + const inPoolAsset = getPoolAsset(pool, tokenIn.denom); + const outPoolAsset = getPoolAsset(pool, tokenOutDenom); + + const swapFee = new BigNumber(pool.poolParams?.swapFee || 0).shiftedBy(-18); + + const beforeSpotPriceInOverOut = calcSpotPrice( + new BigNumber(inPoolAsset.amount), + new BigNumber(inPoolAsset.weight), + new BigNumber(outPoolAsset.amount), + new BigNumber(outPoolAsset.weight), + swapFee + ); + + const tokenOutAmount = calcOutGivenIn( + new BigNumber(inPoolAsset.amount), + new BigNumber(inPoolAsset.weight), + new BigNumber(outPoolAsset.amount), + new BigNumber(outPoolAsset.weight), + new BigNumber(tokenIn.amount), + swapFee + ).decimalPlaces(0); + + const effectivePrice = new BigNumber(tokenIn.amount).div(tokenOutAmount); + const priceImpact = effectivePrice.div(beforeSpotPriceInOverOut).minus(one); + + return priceImpact.toString(); +}; + +export const calcPriceImpactGivenOut = ( + tokenOut: Coin, + tokenInDenom: string, + pool: Pool +) => { + const inPoolAsset = getPoolAsset(pool, tokenInDenom); + const outPoolAsset = getPoolAsset(pool, tokenOut.denom); + + const swapFee = new BigNumber(pool.poolParams?.swapFee || 0).shiftedBy(-18); + + const beforeSpotPriceInOverOut = calcSpotPrice( + new BigNumber(inPoolAsset.amount), + new BigNumber(inPoolAsset.weight), + new BigNumber(outPoolAsset.amount), + new BigNumber(outPoolAsset.weight), + swapFee + ); + + const tokenInAmount = calcInGivenOut( + new BigNumber(inPoolAsset.amount), + new BigNumber(inPoolAsset.weight), + new BigNumber(outPoolAsset.amount), + new BigNumber(outPoolAsset.weight), + new BigNumber(tokenOut.amount), + swapFee + ).decimalPlaces(0); + + const effectivePrice = new BigNumber(tokenInAmount).div(tokenOut.amount); + const priceImpact = effectivePrice.div(beforeSpotPriceInOverOut).minus(one); + + return priceImpact.toString(); +}; diff --git a/src/chains/osmosis/osmosis.ts b/src/chains/osmosis/osmosis.ts new file mode 100755 index 0000000000..c1a23d0f90 --- /dev/null +++ b/src/chains/osmosis/osmosis.ts @@ -0,0 +1,2489 @@ +// OSMO message composer classes don't quite match up with what the RPC/Go backend actually accepts. + +import { CosmosWallet, CosmosAsset, CosmosTokenValue, CosmosBase } from '../../chains/cosmos/cosmos-base'; +import { OsmosisController } from './osmosis.controllers'; +import BigNumber from 'bignumber.js'; +import { logger } from '../../services/logger'; +import { coin, Coin } from '@cosmjs/amino'; +import { FEES, } from 'osmojs/dist/utils/gas/values' +import { TokenInfo, } from '../../services/base'; + +import { osmosis, cosmos} from 'osmojs'; // getSigningOsmosisClient unused - constructing manually with tendermintclient 37 +import { + CoinGeckoToken, + CoinDenom, + Exponent, + CoinSymbol, + PriceHash, + TransactionEvent, + TransactionEventAttribute, + OsmosisExpectedTrade, + ToLog_OsmosisExpectedTrade, + TransactionResponse, + OsmosisExpectedTradeRoute, + AddPositionTransactionResponse, + ReduceLiquidityTransactionResponse, + SerializableExtendedPool, + PriceAndSerializableExtendedPools, + ExtendedPool, + CoinAndSymbol, + AnyPoolType +} from './osmosis.types'; + +import { OsmosisConfig } from './osmosis.config'; +import { + getRoutesForTrade, + calcAmountWithSlippage, + calcPriceImpactGivenIn, + calcPriceImpactGivenOut +} from './osmosis.swap'; +import { + convertDollarValueToCoins, + convertDollarValueToShares, + calcShareOutAmount, + makePoolPairs, +} from '@osmonauts/math'; +import type { + PrettyPair, +} from "@osmonauts/math/dist/types"; +import { PoolAsset } from 'osmojs/dist/codegen/osmosis/gamm/pool-models/balancer/balancerPool'; +import { Pool as CLPool } from 'osmo-query/dist/codegen/osmosis/concentrated-liquidity/pool'; +import { TradeInfo } from './osmosis.controllers'; +import { HttpException, TRADE_FAILED_ERROR_CODE, TRADE_FAILED_ERROR_MESSAGE, GAS_LIMIT_EXCEEDED_ERROR_MESSAGE, GAS_LIMIT_EXCEEDED_ERROR_CODE, AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE, AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE } from '../../services/error-handler'; +import { extendPool, filterPoolsSwap, filterPoolsLP, filterPoolsSwapAndLP } from './osmosis.lp.utils'; +import { fetchFees, findTickForPrice, tickToPrice } from './osmosis.utils'; +import { getImperatorPriceHash } from './osmosis.prices'; +import { GasPrice, calculateFee, setupIbcExtension, SigningStargateClient, AminoTypes } from '@cosmjs/stargate'; +import { CosmWasmClient } from "@cosmjs/cosmwasm-stargate"; +import { TokensRequest, TokensResponse } from '../../network/network.requests'; +import { Cosmosish, PositionInfo, TransferRequest } from '../../services/common-interfaces'; +import { AddLiquidityRequest } from '../../amm/amm.requests'; +import { HttpBatchClient, Tendermint37Client } from '@cosmjs/tendermint-rpc'; +import { GeneratedType, Registry } from "osmojs/node_modules/@cosmjs/proto-signing/build/registry"; + +import { + cosmosAminoConverters, + cosmosProtoRegistry, + cosmwasmAminoConverters, + cosmwasmProtoRegistry, + ibcProtoRegistry, + ibcAminoConverters, + osmosisAminoConverters, + osmosisProtoRegistry +} from 'osmojs'; +const { DirectSecp256k1Wallet } = require('@cosmjs/proto-signing'); +const { + joinPool, + exitPool, + joinSwapExternAmountIn, + swapExactAmountIn, +} = osmosis.gamm.v1beta1.MessageComposer.withTypeUrl; +const { + createPosition, + withdrawPosition, + collectSpreadRewards, + collectIncentives +} = osmosis.concentratedliquidity.v1beta1.MessageComposer.withTypeUrl; +const { +send +} = cosmos.bank.v1beta1.MessageComposer.fromPartial; + +const protoRegistry: ReadonlyArray<[string, GeneratedType]> = [ + ...cosmosProtoRegistry, + ...cosmwasmProtoRegistry, + ...ibcProtoRegistry, + ...osmosisProtoRegistry +]; + +const aminoConverters = { + ...cosmosAminoConverters, + ...cosmwasmAminoConverters, + ...ibcAminoConverters, + ...osmosisAminoConverters +}; + +const registry = new Registry(protoRegistry); +const aminoTypes = new AminoTypes(aminoConverters); + +const successfulTransaction = 0; + +export class Osmosis extends CosmosBase implements Cosmosish{ + public controller; + private static _instances: { [name: string]: Osmosis }; + private _gasPrice: number; + private _nativeTokenSymbol: string; + private _chain: string; + private _network: string; + private _requestCount: number; + private _metricsLogInterval: number; + private _metricTimer; + private signingClient?: any; + public chainId: string; + public gasLimitEstimate: string; + public readonly feeTier: string; // FEE_VALUES.osmosis[_feeTier] low medium high osmojs/src/utils/gas/values.ts + public allowedSlippage: string; + public manualGasPriceToken: string; + private tendermint37Client?: Tendermint37Client; + private httpBatchClient?: HttpBatchClient; + + private constructor(network: string) { + const config = OsmosisConfig.config; + super( + config.availableNetworks[0].chain, + config.rpcURL(network).toString(), + config.tokenListSource(network), + config.tokenListType(network), + config.gasAdjustment, + config.useEIP1559DynamicBaseFeeInsteadOfManualGasPrice, + config.rpcAddressDynamicBaseFee, + config.manualGasPrice + ) + this._network = network; + this._chain = 'osmosis'; + this._nativeTokenSymbol = config.nativeCurrencySymbol; + this.manualGasPriceToken = config.manualGasPriceToken; + + this._gasPrice = Number(this.manualGasPrice) + this.feeTier = config.feeTier; + this.gasLimitEstimate = config.gasLimitTransaction + this.allowedSlippage = config.allowedSlippage + + this.chainId = config.chainId(network); + this.signingClient = undefined; + this.controller = OsmosisController; + + this._requestCount = 0; + this._metricsLogInterval = 300000; // 5 minutes + + this._metricTimer = setInterval( + this.metricLogger.bind(this), + this.metricsLogInterval + ); + } + + public static getInstance(network: string): Osmosis { + if (Osmosis._instances === undefined) { + Osmosis._instances = {}; + } + if (!(network in Osmosis._instances)) { + Osmosis._instances[network] = new Osmosis(network); + } + + return Osmosis._instances[network]; + } + + public static getConnectedInstances(): { [name: string]: Osmosis } { + return Osmosis._instances; + } + + public requestCounter(msg: any): void { + if (msg.action === 'request') this._requestCount += 1; + } + + public metricLogger(): void { + logger.info( + this.requestCount + + ' request(s) sent in last ' + + this.metricsLogInterval / 1000 + + ' seconds.' + ); + this._requestCount = 0; // reset + } + + public get provider() { + return this._provider; + } + + public get gasPrice(): number { + return this._gasPrice; + } + + public get chain(): string { + return this._chain; + } + public get network(): string { + return this._network; + } + + public get nativeTokenSymbol(): string { + return this._nativeTokenSymbol; + } + + public get requestCount(): number { + return this._requestCount; + } + + public get metricsLogInterval(): number { + return this._metricsLogInterval; + } + + async getDenomMetadata(provider: any, denom: string): Promise { + return await provider.cosmos.bank.denomMetadata(denom); + } + + async close() { + clearInterval(this._metricTimer); + if (this._chain in Osmosis._instances) { + delete Osmosis._instances[this._chain]; + } + } + + public ready(): boolean { + return this._ready + } + + private async osmosisGetSigningStargateClient( + rpcEndpoint: string, + signer: any, + ){ + this.osmosisGetHttpBatchClient(rpcEndpoint); + await this.osmosisGetTendermint37Client(); + + + // @ts-ignore: + const signingStargateClient = await SigningStargateClient.createWithSigner(this.tendermint37Client!, signer, { + registry: registry, + aminoTypes: aminoTypes + }); + + return signingStargateClient; + } + + private async osmosisGetTendermint37Client() { + this.tendermint37Client = await Tendermint37Client.create( + this.httpBatchClient! + ); + } + + private osmosisGetHttpBatchClient(rpcEndpoint: string) { + this.httpBatchClient = new HttpBatchClient(rpcEndpoint, { + dispatchInterval: 2000, + }); + } + + public getTokenByAddress(address: string): CosmosAsset { + const token = this.tokenList.find((token: CosmosAsset) => token.address === address); + if (!token){ + throw new Error('Osmosis token not found for address: ' + address); + } + return token; + } + public getDenomForCoinGeckoId = ( + coinGeckoId: CoinGeckoToken + ): CoinDenom => { + var asset_found = this.tokenList.find((asset) => asset.coingecko_id === coinGeckoId); + if (asset_found) { + return asset_found.base + } else { + return ''; + } + }; + public osmoDenomToSymbol = (denom: CoinDenom): CoinSymbol => { + const asset = this.getTokenByBase(denom); + const symbol = asset?.symbol; + if (!symbol) { + return denom; + } + return symbol; + }; + public symbolToOsmoDenom = (token: CoinSymbol): CoinDenom => { + const asset = this.tokenList.find(({ symbol }) => symbol === token); + const base = asset?.base; + if (!base) { + console.log(`cannot find base for token ${token}`); + return ''; + } + return base; + }; + + // technically by base + public getExponentByBase = (denom: CoinDenom): Exponent => { + const asset = this.getTokenByBase(denom); + if (asset && asset.denom_units){ + const unit = asset.denom_units.find(({ denom }) => denom === asset.display); + if (unit){ + return unit.exponent; + } + } + return 0 + }; + public noDecimals = (num: number | string) => { + return new BigNumber(num).decimalPlaces(0, BigNumber.ROUND_DOWN).toString(); + }; + public baseUnitsToDollarValue = ( + prices: PriceHash, + symbol: string, + amount: string | number + ) => { + const denom = this.symbolToOsmoDenom(symbol); + return new BigNumber(amount) + .shiftedBy(-this.getExponentByBase(denom)) + .multipliedBy(prices[denom]) + .toString(); + }; + public dollarValueToDenomUnits = ( + prices: PriceHash, + symbol: string, + value: string | number + ) => { + const denom = this.symbolToOsmoDenom(symbol); + return new BigNumber(value) + .dividedBy(prices[denom]) + .shiftedBy(this.getExponentByBase(denom)) + .toString(); + }; + public baseUnitsToDisplayUnits = ( + symbol: string, + amount: string | number + ) => { + const denom = this.symbolToOsmoDenom(symbol); + return new BigNumber(amount).shiftedBy(-this.getExponentByBase(denom)).toString(); + }; + + public isEmptyArray = (arr: any[]) => arr.length === 0; + + async getBalances(wallet: CosmosWallet): Promise> { + const balances: Record = {}; + + const accounts = await wallet.getAccounts(); + + var { address } = accounts[0]; + + var balancesContainer; + balancesContainer = await this._provider.cosmos.bank.v1beta1.allBalances({ + address: address, + pagination: { + key: new Uint8Array(), + offset: BigInt(0), + limit: BigInt(10000), + countTotal: false, + reverse: false, + }, + }) + + const allTokens = balancesContainer.balances + + await Promise.all( + allTokens.map(async (t: { denom: string; amount: string }) => { + let token = this.getTokenByBase(t.denom); + + try{ + if (!token && t.denom.startsWith('ibc/')) { + const ibcHash: string = t.denom.replace('ibc/', ''); + + // Get base denom by IBC hash + if (ibcHash) { + const { denomTrace } = await setupIbcExtension(this._provider).ibc.transfer.denomTrace(ibcHash); + if (denomTrace) { + const { baseDenom } = denomTrace; + token = this.getTokenByBase(baseDenom); + } + } + } + } catch (err) { + //can skip this - will be added by raw denom + } + + // Not all tokens are added in the registry so we use the denom if the token doesn't exist + balances[token ? token.symbol : t.denom] = { + value: new BigNumber(t.amount), + decimals: this.getTokenDecimals(token), + }; + }) + ); + + return balances; + } + /** + * Given the amount of `baseToken` to put into a transaction, calculate the + * amount of `quoteToken` that can be expected from the transaction. + * + * This is typically used for calculating token buy/sell prices. + * + * @param baseToken Token input for the transaction + * @param quoteToken Output from the transaction + * @param amount Amount of `baseToken` to put into the transaction + * @param tradeType "BUY" or "SELL" + * @param allowedSlippage? Allowed slippage eg "1%" + * @param feeTier_input? low/medium/high, overwrites feeTier specified in .yml + * @param gasAdjustment_input? Gas offered multiplier, overwrites gasAdjustment specified in .yml + */ + async estimateTrade( + baseToken: CosmosAsset, + quoteToken: CosmosAsset, + amount: BigNumber, + tradeType: string, + allowedSlippage?: string, + feeTier_input?: string, + gasAdjustment_input?: number, + ): Promise{ + + var slippage = 0; + if (allowedSlippage){ + slippage = this.getAllowedSlippage(allowedSlippage) + }else{ + slippage = this.getAllowedSlippage(this.allowedSlippage) + } + var feeTier = this.feeTier; + if (feeTier_input){ + feeTier = feeTier_input; + } + var gasAdjustment = this.gasPriceConstant; + if (gasAdjustment_input){ + gasAdjustment = gasAdjustment_input; + } + + if (tradeType == "BUY"){ + //swap base and quotetokens + const realBaseToken = quoteToken; + quoteToken = baseToken; + baseToken = realBaseToken; + } + + logger.info( + `Fetching pair data for ${quoteToken.symbol}-${baseToken.symbol}.` + ); + + var callImperatorWithTokens = undefined + if (this.chain == 'testnet'){ + callImperatorWithTokens = this.tokenList; + } + const [prices, { pools: poolsData }] = await Promise.all([ + getImperatorPriceHash(callImperatorWithTokens), + this._provider.osmosis.gamm.v1beta1.pools({ + pagination: { + key: new Uint8Array(), + offset: BigInt(0), + limit: BigInt(2000), + countTotal: false, + reverse: false, + }, + }) as Promise<{ pools: ExtendedPool[] }>, // ExtendedBalancerPool + ]); + + const pools = filterPoolsSwap(this.tokenList, poolsData, prices); // removes stableswap, !token.denom.startsWith('gamm/pool'), has price, has osmosisAsset + + var pairs: PrettyPair[] = []; + if (!this.isEmptyArray(pools) && !this.isEmptyArray(Object.keys(prices))){ + pairs = makePoolPairs(this.tokenList, pools, prices); + } + + // eg. token=OSMO, token.base=uOSMO, so swap calcs are done in uosmo is + const tokenInAmount = new BigNumber(amount) + .shiftedBy(baseToken.decimals) + .toString(); + + const tokenInDollarValue = new BigNumber(amount || '0').multipliedBy( + prices[baseToken.base] + ); + + const toTokenDollarPrice = prices[quoteToken.base] + var toTokenAmount; + if (toTokenDollarPrice){ + toTokenAmount = tokenInDollarValue.div(toTokenDollarPrice); + }else{ + // no price found for quote token - maybe should throw here but let's see if there's a pool route[] for it + toTokenAmount = 0; + } + + const tokenOutAmount = new BigNumber(toTokenAmount) + .shiftedBy(quoteToken.decimals) + // tokenOut defined by .base (eg. uION) + .toString(); + + var tokenOutAmountAfterSlippage; + if (slippage == 100){ + tokenOutAmountAfterSlippage = '1'; + }else{ + tokenOutAmountAfterSlippage = calcAmountWithSlippage( + tokenOutAmount, + slippage + ); + } + + + const tokenIn = { + denom: baseToken.base, + amount: tokenInAmount, + }; + const tokenOut = { + denom: quoteToken.base, + amount: tokenOutAmountAfterSlippage, + }; + + const routes = getRoutesForTrade(this.tokenList, { // SwapAmountInRoute[] = (poolId, tokenOutDenom)[] + trade: { + sell: { + denom: tokenIn.denom, + amount: tokenIn.amount, + }, + buy: { + denom: tokenOut.denom, + amount: tokenOut.amount, + }, + }, + pairs, + }); + + if (!routes || routes.length === 0 || routes.length > 2) { + logger.info( + `No trade routes found for ${quoteToken.symbol}-${ + baseToken.symbol} ${quoteToken.symbol}-${ + baseToken.symbol}` + ); + throw new Error(`No trade routes found for ${quoteToken.symbol}-${ + baseToken.symbol} ${quoteToken.symbol}-${ + baseToken.symbol}`); + } + + // so far we have pools, routes, and token info... + let route_length_1_pool_swapFee = ''; + // @ts-ignore: leaving some unreads in here in case they want to be delivered later + let priceImpact = ''; + + if (new BigNumber(tokenIn.amount).isEqualTo(0)) { + priceImpact = '0'; + } + else if (routes.length === 1) + { + const route_length_1_pool = pools.find((pool) => pool.id === routes[0].poolId)!; + // @ts-ignore: + priceImpact = calcPriceImpactGivenIn(tokenIn, tokenOut.denom, route_length_1_pool); + route_length_1_pool_swapFee = new BigNumber(route_length_1_pool.poolParams?.swapFee || 0).toString(); // .shiftedBy(-16) shift used in CCA + } + else { + // THIS ASSUMES length == 2 - per CCA/osmosis guys.. + const tokenInRoute = routes.find( + (route) => route.tokenOutDenom !== tokenOut.denom + )!; + const tokenOutRoute = routes.find( + (route) => route.tokenOutDenom === tokenOut.denom + )!; + + const tokenInPool = pools.find( + (pool) => pool.id === tokenInRoute.poolId + )!; + const tokenOutPool = pools.find( + (pool) => pool.id === tokenOutRoute.poolId + )!; + + const priceImpactIn = calcPriceImpactGivenIn( + tokenIn, + tokenInRoute.tokenOutDenom, + // @ts-ignore: + tokenInPool + ); + const priceImpactOut = calcPriceImpactGivenOut( + tokenOut, + tokenOutRoute.tokenOutDenom, + // @ts-ignore: + tokenOutPool + ); + priceImpact = new BigNumber(priceImpactIn) + .plus(priceImpactOut) + .toString(); + } + +// routes.length=1 mean there's just 1 hop - we're always just given one potentially route[] for a trade route request + let swapRoutes: OsmosisExpectedTradeRoute[] = [] + + if (routes.length === 1) { + swapRoutes = routes.map((route) => { + return { + poolId: route.poolId.toString(), + swapFee: route_length_1_pool_swapFee, + baseLogo: baseToken.logo_URIs, + baseSymbol: baseToken.symbol, + quoteLogo: quoteToken.logo_URIs, + quoteSymbol: quoteToken.symbol, + tokenOutDenom: tokenOut.denom, + }; + }); + } else { + let swapFees: BigNumber[] = []; + swapRoutes = routes + .map((route) => { + const pool = pools.find((pool) => pool.id === route.poolId); + let baseAsset: CosmosAsset; + let quoteAsset: CosmosAsset; + if (route.tokenOutDenom !== tokenOut.denom) { + baseAsset = baseToken; + quoteAsset = this.getTokenByBase(route.tokenOutDenom)!; + } else { + const tokenInDenom = pool?.poolAssets.find( + ({ token }) => token!.denom !== tokenOut.denom + )?.token?.denom!; + baseAsset = this.getTokenByBase(tokenInDenom)!; + quoteAsset = quoteToken; + } + const fee = new BigNumber(pool?.poolParams?.swapFee || 0); // .shiftedBy(-16) shift used in CCA + swapFees.push(fee); + return { + poolId: route.poolId.toString(), + swapFee: fee, + baseLogo: baseAsset.logo_URIs, + baseSymbol: baseAsset.symbol, + quoteLogo: quoteAsset.logo_URIs, + quoteSymbol: quoteAsset.symbol, + tokenOutDenom: route.tokenOutDenom, + }; + }) + .map((route) => { + const totalFee = swapFees.reduce( + (total, cur) => total.plus(cur), + new BigNumber(0) + ); + const highestFee = swapFees.sort((a, b) => (a.lt(b) ? 1 : -1))[0]; + const feeRatio = highestFee.div(totalFee); + return { + ...route, + swapFee: route.swapFee.multipliedBy(feeRatio).toString() + '%', + }; + }); + } + + let expectedOutput = tokenOutAmountAfterSlippage; + + // can't simulate here without address/signingclient + let feeObject = FEES.osmosis.swapExactAmountIn(feeTier) + const gasLimitEstimate = new BigNumber(feeObject.gas).multipliedBy(gasAdjustment) + + if (gasLimitEstimate.gt(new BigNumber(this.gasLimitEstimate))){ + throw new HttpException( + 500, + GAS_LIMIT_EXCEEDED_ERROR_MESSAGE + ' Calculated gas: ' + gasLimitEstimate.toString() + ' gasLimitEstimate: ' + this.gasLimitEstimate, + GAS_LIMIT_EXCEEDED_ERROR_CODE + ); + } + + const expectedAmountNum = new BigNumber(expectedOutput) + const tokenInAmountNum = new BigNumber(amount).shiftedBy(baseToken.decimals) + const executionPrice = expectedAmountNum.div(tokenInAmountNum) + + logger.info( + `Best trade for ${quoteToken.address}-${ + baseToken.address + }: ${ToLog_OsmosisExpectedTrade({ gasUsed: '', gasWanted: '', routes: swapRoutes, expectedAmount: expectedOutput, executionPrice: executionPrice, gasLimitEstimate: new BigNumber(gasLimitEstimate), tokenInDenom:tokenIn.denom, tokenInAmount: tokenInAmount, tokenOutDenom:tokenOut.denom, })}` + ); + return { gasUsed: '', gasWanted: '', routes: swapRoutes, expectedAmount: expectedOutput, executionPrice: executionPrice, gasLimitEstimate: new BigNumber(gasLimitEstimate), tokenInDenom:tokenIn.denom, tokenInAmount: tokenInAmount, tokenOutDenom:tokenOut.denom }; // == OsmosisExpectedTrade + } + + + + /** + * Given a wallet and a Cosmosish trade, try to execute it on blockchain. + * + * @param wallet CosmosWallet + * @param trade Expected trade + * @param allowedSlippage? Allowed slippage eg "1%" + * @param feeTier_input? low/medium/high, overwrites feeTier specified in .yml + * @param gasAdjustment_input? Gas offered multiplier, overwrites gasAdjustment specified in .yml + */ + async executeTrade( + wallet: CosmosWallet, + trade: TradeInfo, + address: string, + allowedSlippage?: string, + feeTier_input?: string, + gasAdjustment_input?: number, + ): Promise { + var slippage = 0; + if (allowedSlippage){ + slippage = this.getAllowedSlippage(allowedSlippage) + }else{ + slippage = this.getAllowedSlippage(this.allowedSlippage) + } + var feeTier = this.feeTier; + if (feeTier_input){ + feeTier = feeTier_input; + } + var gasAdjustment = this.gasPriceConstant; + if (gasAdjustment_input){ + gasAdjustment = gasAdjustment_input; + } + + const keyWallet = await DirectSecp256k1Wallet.fromKey(wallet.privkey, 'osmo') + this.signingClient = await this.osmosisGetSigningStargateClient(this.rpcUrl, keyWallet); + + const routes = trade.expectedTrade.routes; + + var tokenOutMinAmount; + if (slippage == 100){ + tokenOutMinAmount = 1; + }else{ + tokenOutMinAmount = this.noDecimals((Number(trade.expectedTrade.expectedAmount) * (100-slippage))/100) + } + const msg = swapExactAmountIn({ + 'sender': address, + // @ts-ignore: bad osmojs models + 'routes': routes, + 'tokenIn': coin(trade.expectedTrade.tokenInAmount, trade.expectedTrade.tokenInDenom), + 'tokenOutMinAmount': tokenOutMinAmount.toString(), + }); + + var enumFee = FEES.osmosis.swapExactAmountIn(feeTier); + var gasToUse = enumFee.gas; + try{ + const gasEstimation = await this.signingClient.simulate( + address, + [msg], + ); + gasToUse = gasEstimation; + } catch (error1) { + var error = error1 as Error + if (error.message.includes('token is lesser than min amount')){ + throw new HttpException( + 500, + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE + 'tokenOutMinAmount: ' + tokenOutMinAmount.toString(), + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE + ); + } + } + + const gasPrice = await this.getLatestBasePrice(); + const calcedFee = calculateFee( + Math.round(Number(gasToUse) * (gasAdjustment || 1.5)), + GasPrice.fromString(gasPrice.toString() + this.manualGasPriceToken) + ); + + if (new BigNumber(calcedFee.gas).gt(new BigNumber(this.gasLimitEstimate))){ + throw new HttpException( + 500, + GAS_LIMIT_EXCEEDED_ERROR_MESSAGE + ' Calculated gas: ' + new BigNumber(calcedFee.gas).toString() + ' gasLimitEstimate: ' + new BigNumber(this.gasLimitEstimate).toString(), + GAS_LIMIT_EXCEEDED_ERROR_CODE + ); + } + + try { + var res = await this.signingClient.signAndBroadcast(address, [msg], calcedFee); + res.gasPrice = gasPrice + return res; + } catch (error) { + console.debug(error); + } finally { + this.signingClient.disconnect(); + } + + throw new HttpException( + 500, + TRADE_FAILED_ERROR_MESSAGE, + TRADE_FAILED_ERROR_CODE + ); + } + + /** + * Given a 2 token symbols and 1-2 amounts, exchange amounts for pool liquidity shares + * + * @param wallet CosmosWallet + * @param address Wallet address + * @param token0 + * @param token1 + * @param amount0 + * @param amount1 + * @param poolId? Optional string specify poolId instead of search by tokens + * @param allowedSlippage? Allowed slippage eg "1%" + * @param feeTier_input? low/medium/high, overwrites feeTier specified in .yml + * @param gasAdjustment_input? Gas offered multiplier, overwrites gasAdjustment specified in .yml + */ + async addPosition( + wallet: CosmosWallet, + address: string, + token0: CosmosAsset, + token1: CosmosAsset, + amount0: string, + amount1: string, + poolId?: number, + allowedSlippage?: string, + feeTier_input?: string, + gasAdjustment_input?: number, + ): Promise { + + var slippage = 0; + if (allowedSlippage){ + slippage = this.getAllowedSlippage(allowedSlippage) + }else{ + slippage = this.getAllowedSlippage(this.allowedSlippage) + } + var feeTier = this.feeTier; + if (feeTier_input){ + feeTier = feeTier_input; + } + var gasAdjustment = this.gasPriceConstant; + if (gasAdjustment_input){ + gasAdjustment = gasAdjustment_input; + } + + try { + const keyWallet = await DirectSecp256k1Wallet.fromKey(wallet.privkey, 'osmo') + this.signingClient = await this.osmosisGetSigningStargateClient(this.rpcUrl, keyWallet); + + if (!this.signingClient || !address) { + console.error('stargateClient undefined or address undefined.'); + throw new HttpException( + 500, + "addPosition failed: Can't instantiate signing client.", + TRADE_FAILED_ERROR_CODE + ); + } + + const poolsContainer = await this._provider.osmosis.poolmanager.v1beta1.allPools({}); + const allPoolds: ExtendedPool[] = poolsContainer.pools; + + var callImperatorWithTokens = undefined + if (this.chain == 'testnet'){ + callImperatorWithTokens = this.tokenList; + } + const prices = await getImperatorPriceHash(callImperatorWithTokens); + + const pools = filterPoolsSwap(this.tokenList, allPoolds, prices); // removes stableswap, !token.denom.startsWith('gamm/pool'), has price, has osmosisAsset + + if (!amount0 && !amount1){ + throw new HttpException( + 500, + "addPosition failed: Both token amounts equal to 0.", + TRADE_FAILED_ERROR_CODE + ); + } + + var amount0_bignumber = new BigNumber(0); + var amount1_bignumber = new BigNumber(0); + if (amount0){ + amount0_bignumber = new BigNumber(amount0); + } + if (amount1){ + amount1_bignumber = new BigNumber(amount1); + } + if (amount0_bignumber.isEqualTo(0) && amount1_bignumber.isEqualTo(0)){ + throw new HttpException( + 500, + "addPosition failed: Both token amounts equal to 0.", + TRADE_FAILED_ERROR_CODE + ); + } + + var singleToken_UseWhich: string | null = null; + if (!amount0_bignumber.isEqualTo(0) && amount1_bignumber.isEqualTo(0)){ // only token0 + singleToken_UseWhich = '0'; + } + if (amount0_bignumber.isEqualTo(0) && !amount1_bignumber.isEqualTo(0)){ // only token1 + singleToken_UseWhich = '1'; + } + // NOT CHECKING (local wallet) BALANCES HERE it will bounce back either way + + // now find the poolid for this pair + var foundPools: any[] = []; + pools.forEach(function (cPool) { + var foundToken0 = false; + var foundToken1 = false; + if (cPool.poolAssets){ + for (var poolAsset_idx=0; poolAsset_idx id.toString() == poolId.toString()); + }else if (foundPools && foundPools.length > 0){ + pool = foundPools[0]; // this is not selective without poolid input (can be multiple pools per token pair).. though order should cause pool with greatest liquidity to be used + } + + var calcedFee; + if (pool){ + const gasPrice = await this.getLatestBasePrice(); + let msgs = []; + if (singleToken_UseWhich) { // in case 1 of the amounts == 0 + var singleToken_amount = new BigNumber(0); + var singleToken: CosmosAsset | undefined = undefined; + if (singleToken_UseWhich == '0'){ + singleToken_amount = amount0_bignumber; + singleToken = token0; + }else{ + singleToken_amount = amount1_bignumber; + singleToken = token1; + } + const inputCoin = {'denom':singleToken.base, 'amount':singleToken_amount.shiftedBy(this.getExponentByBase(singleToken.base)).toString()}; + + const coinSymbol = singleToken.symbol; + const inputValue = this.baseUnitsToDollarValue( + prices, + coinSymbol, + singleToken_amount.toNumber() + ); + + const coinsNeeded = convertDollarValueToCoins(this.tokenList, inputValue, pool, prices); + const shareOutAmount = calcShareOutAmount(pool, coinsNeeded); + + var finalShareOutAmount; + if (slippage == 100){ + finalShareOutAmount = (new BigNumber(1).integerValue(BigNumber.ROUND_CEIL)); + }else{ + finalShareOutAmount = (new BigNumber(calcAmountWithSlippage(shareOutAmount, slippage)).integerValue(BigNumber.ROUND_CEIL)) + } + + const joinSwapExternAmountInMsg = joinSwapExternAmountIn({ + // @ts-ignore: bad osmojs models + poolId: pool.id.toString(), + sender: address, + tokenIn: inputCoin, + shareOutMinAmount: this.noDecimals(finalShareOutAmount.toString()), + }); + msgs.push(joinSwapExternAmountInMsg); + + var enumFee = FEES.osmosis.joinSwapExternAmountIn(feeTier); + var gasToUse = enumFee.gas; + try{ + const gasEstimation = await this.signingClient.simulate( + address, + msgs, + ); + gasToUse = gasEstimation; + } catch (error1) { + var error = error1 as Error + if (error.message.includes('token is lesser than min amount')){ + throw new HttpException( + 500, + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE + 'tokenOutMinAmount: ' + finalShareOutAmount.toString(), + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE + ); + } + } + calcedFee = calculateFee( + Math.round(Number(gasToUse) * (gasAdjustment || 1.5)), + GasPrice.fromString(gasPrice.toString() + this.manualGasPriceToken) + ); + + } + else { + var allCoins = []; + allCoins.push({'denom':token0.base, 'amount':new BigNumber(amount0) + .shiftedBy(this.getExponentByBase(token0.base)) + .toString()}); + allCoins.push({'denom':token1.base, 'amount':new BigNumber(amount1) + .shiftedBy(this.getExponentByBase(token1.base)) + .toString()}); + + // alphabetize the coins going in or else invalid coins error + if (!(token0.base.toLowerCase() < token1.base.toLowerCase())){ + allCoins.reverse() + } + + const shareOutAmount = calcShareOutAmount(pool, allCoins); + const tokenInMaxs = allCoins.map((c: Coin) => { + return coin(c.amount, c.denom); + }); + + var finalShareOutAmount; + if (slippage == 100){ + finalShareOutAmount = (new BigNumber(1).integerValue(BigNumber.ROUND_CEIL)); + }else{ + finalShareOutAmount = (new BigNumber(calcAmountWithSlippage(shareOutAmount, slippage)).integerValue(BigNumber.ROUND_CEIL)) + } + + const joinPoolMsg = joinPool({ + // @ts-ignore: bad osmojs models + poolId: pool.id.toString(), + sender: address, + shareOutAmount: this.noDecimals(finalShareOutAmount.toString()), + tokenInMaxs, + }); + msgs.push(joinPoolMsg); + + var enumFee = FEES.osmosis.joinPool(feeTier); + var gasToUse = enumFee.gas; + try{ + const gasEstimation = await this.signingClient.simulate( + address, + msgs, + ); + gasToUse = gasEstimation; + } catch (error1) { + var error = error1 as Error + if (error.message.includes('token is lesser than min amount')){ + throw new HttpException( + 500, + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE + 'shareOutAmount: ' + finalShareOutAmount.toString(), + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE + ); + } + } + + calcedFee = calculateFee( + Math.round(Number(gasToUse) * (gasAdjustment || 1.5)), + GasPrice.fromString(gasPrice.toString() + this.manualGasPriceToken) + ); + } + + if (new BigNumber(calcedFee.gas).gt(new BigNumber(this.gasLimitEstimate))){ + throw new HttpException( + 500, + GAS_LIMIT_EXCEEDED_ERROR_MESSAGE + ' Calculated gas: ' + new BigNumber(calcedFee.gas).toString() + ' gasLimitEstimate: ' + new BigNumber(this.gasLimitEstimate).toString(), + GAS_LIMIT_EXCEEDED_ERROR_CODE + ); + } + + var res: AddPositionTransactionResponse = await this.signingClient.signAndBroadcast(address, msgs, calcedFee); + this.signingClient.disconnect(); + + var outbound_coins_string = '' // 990uion,98159uosmo + var outbound_shares_string = '' // 57568515255656500gamm/pool/62 + var token0_finalamount = '0' + var token1_finalamount = '0' + var poolshares = '0' + + if (res?.code !== successfulTransaction){ + res.token0_finalamount = token0_finalamount + res.token1_finalamount = token1_finalamount + res.poolshares = poolshares + res.poolId = Number(pool.id.toString()) + res.poolAddress = pool.address + res.gasPrice = gasPrice + return res; + } + + // RETURNED VALUE DISSECTION + // osmo doesnt send back a clear value, we need to discern it from the event logs >.> + + try { + for (var event_idx=0; event_idx attribute_idx){ + outbound_coins_string = event.attributes[attribute_idx+1].value + } + } + else if (attribute.key == 'amount'){ + if (pool.totalShares && pool.totalShares.denom && attribute.value.includes(pool.totalShares.denom)){ + outbound_shares_string = attribute.value; + } + } + } + } + } + if (outbound_coins_string != ''){ + if (outbound_coins_string.includes(',')){ + var coins_string_list = outbound_coins_string.split(','); + for (var coin_string_idx=0; coin_string_idx { + + // in case we need to swap these later + var amount0 = req.amount0; + var amount1 = req.amount1; + + // set slippage for this to 100 because the pools are too unbalanced + var slippage = 100; + // if (req.allowedSlippage){ + // slippage = this.getAllowedSlippage(req.allowedSlippage) + // }else{ + // slippage = this.getAllowedSlippage(this.allowedSlippage) + // } + var feeTier = this.feeTier; + if (feeTier_input){ + feeTier = feeTier_input; + } + var gasAdjustment = this.gasPriceConstant; + if (gasAdjustment_input){ + gasAdjustment = gasAdjustment_input; + } + + try { + const keyWallet = await DirectSecp256k1Wallet.fromKey(wallet.privkey, 'osmo') + this.signingClient = await this.osmosisGetSigningStargateClient(this.rpcUrl, keyWallet); + + if (!this.signingClient || !req.address) { + console.error('stargateClient undefined or address undefined.'); + throw new HttpException( + 500, + "addPosition failed: Can't instantiate signing client.", + TRADE_FAILED_ERROR_CODE + ); + } + + const poolsContainer = await this._provider.osmosis.poolmanager.v1beta1.allPools({}); + const pools: AnyPoolType[] = poolsContainer.pools; + + var callImperatorWithTokens = undefined + if (this.chain == 'testnet'){ + callImperatorWithTokens = this.tokenList; + } + const prices = await getImperatorPriceHash(callImperatorWithTokens); + + const filteredPools: CLPool[] = filterPoolsLP(this.tokenList, pools, prices); // removes stableswap, !token.denom.startsWith('gamm/pool'), has price, has osmosisAsset + + if (!amount0 && !amount1){ + throw new HttpException( + 500, + "addPosition failed: Both token amounts equal to 0.", + TRADE_FAILED_ERROR_CODE + ); + } + + var amount0_bignumber = new BigNumber(0); + var amount1_bignumber = new BigNumber(0); + if (amount0){ + amount0_bignumber = new BigNumber(amount0); + } + if (amount1){ + amount1_bignumber = new BigNumber(amount1); + } + if (amount0_bignumber.isEqualTo(0) && amount1_bignumber.isEqualTo(0)){ + throw new HttpException( + 500, + "addPosition failed: Both token amounts equal to 0.", + TRADE_FAILED_ERROR_CODE + ); + } + + var singleToken_UseWhich: string | null = null; + if (!amount0_bignumber.isEqualTo(0) && amount1_bignumber.isEqualTo(0)){ // only token0 + singleToken_UseWhich = '0'; + } + if (amount0_bignumber.isEqualTo(0) && !amount1_bignumber.isEqualTo(0)){ // only token1 + singleToken_UseWhich = '1'; + } + // NOT CHECKING (local wallet) BALANCES HERE it will bounce back either way + + // now find the poolid for this pair + var foundPools: any[] = []; + filteredPools.forEach(function (cPool) { + var foundToken0 = false; + var foundToken1 = false; + if (cPool.token0 == token0.base || cPool.token1 == token0.base){ + foundToken0 = true; + } + if (cPool.token0 == token1.base || cPool.token1 == token1.base){ + foundToken1 = true; + } + if (foundToken0 && foundToken1){ + foundPools.push(cPool); + } + }); + + var pool; + if (req.tokenId){ + pool = filteredPools.find(({id}) => id.toString() == req.tokenId!.toString()); + }else if (foundPools && foundPools.length > 0){ + pool = foundPools[0]; // this is not selective without poolid input (can be multiple pools per token pair).. though order should cause pool with greatest liquidity to be used + } + + var calcedFee; + if (pool){ + + // swap token orders to match pool asset orders + if (pool.token0 == token1.base && pool.token1 == token0.base){ + [token0, token1] = [token1, token0]; + [amount0, amount1] = [amount1, amount0]; + [amount0_bignumber, amount1_bignumber] = [amount1_bignumber, amount0_bignumber]; + if (singleToken_UseWhich){ + if (singleToken_UseWhich == '0'){ + singleToken_UseWhich = '1' + }else{ + singleToken_UseWhich = '0' + } + } + } + + const gasPrice = await this.getLatestBasePrice(); + let msgs = []; + if (singleToken_UseWhich) { // in case 1 of the amounts == 0 + var singleToken_amount = new BigNumber(0); + var singleToken: CosmosAsset | undefined = undefined; + if (singleToken_UseWhich == '0'){ + singleToken_amount = amount0_bignumber; + singleToken = token0; + }else{ + singleToken_amount = amount1_bignumber; + singleToken = token1; + } + const inputCoin = {'denom':singleToken.base, 'amount':singleToken_amount.shiftedBy(this.getExponentByBase(singleToken.base)).toString()}; + + var singleTokenMinAmount; + if (slippage == 100){ + singleTokenMinAmount = '0'; + }else{ + singleTokenMinAmount = singleToken_amount.shiftedBy(this.getExponentByBase(singleToken.base)).multipliedBy(100-slippage).dividedBy(100).integerValue(BigNumber.ROUND_CEIL) + } + + const lowerTick = findTickForPrice(req.lowerPrice!, pool.exponentAtPriceOne, pool.tickSpacing, true) + const upperTick = findTickForPrice(req.upperPrice!, pool.exponentAtPriceOne, pool.tickSpacing, false) + + var MsgCreatePosition; + if (singleToken.base == pool.token0){ + // @ts-ignore: bad osmojs models + MsgCreatePosition = createPosition({ + poolId: pool.id.toString(), + sender: req.address, + // @ts-ignore: bad osmojs models + lowerTick: lowerTick, + // @ts-ignore: bad osmojs models + upperTick: upperTick, + tokensProvided: [inputCoin], + tokenMinAmount0: singleTokenMinAmount.toString(), + }) + }else{ + // @ts-ignore: bad osmojs models + MsgCreatePosition = createPosition({ + poolId: pool.id.toString(), + sender: req.address, + // @ts-ignore: bad osmojs models + lowerTick: lowerTick, + // @ts-ignore: bad osmojs models + upperTick: upperTick, + tokensProvided: [inputCoin], + tokenMinAmount1: singleTokenMinAmount.toString(), + }) + } + + msgs.push(MsgCreatePosition); + + var enumFee = FEES.osmosis.joinPool(feeTier); + var gasToUse = enumFee.gas; + try{ + const gasEstimation = await this.signingClient.simulate( + req.address, + msgs, + ); + gasToUse = gasEstimation; + } catch (error1) { + var error = error1 as Error + if (error.message.includes('token is lesser than min amount')){ + throw new HttpException( + 500, + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE + 'tokenMinAmount0: ' + singleTokenMinAmount.toString(), + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE + ); + } + } + calcedFee = calculateFee( + Math.round(Number(gasToUse) * (gasAdjustment || 1.5)), + GasPrice.fromString(gasPrice.toString() + this.manualGasPriceToken) + ); + + } + + else { + var allCoins = []; + allCoins.push({'denom':token0.base, 'amount':new BigNumber(amount0) + .shiftedBy(this.getExponentByBase(token0.base)) + .toString()}); + allCoins.push({'denom':token1.base, 'amount':new BigNumber(amount1) + .shiftedBy(this.getExponentByBase(token1.base)) + .toString()}); + + var token0_bignumber = new BigNumber(amount0) + var token1_bignumber = new BigNumber(amount1) + + var tokenMinAmount0; + var tokenMinAmount1; + if (slippage == 100){ + tokenMinAmount0 = '0'; + tokenMinAmount1 = '0'; + }else{ + tokenMinAmount0 = token0_bignumber.shiftedBy(this.getExponentByBase(token0.base)).multipliedBy(100-slippage).dividedBy(100).integerValue(BigNumber.ROUND_CEIL) + tokenMinAmount1 = token1_bignumber.shiftedBy(this.getExponentByBase(token1.base)).multipliedBy(100-slippage).dividedBy(100).integerValue(BigNumber.ROUND_CEIL) + } + + const lowerTick = findTickForPrice(req.lowerPrice!, pool.exponentAtPriceOne, pool.tickSpacing, true) // pool.currentTick, + const upperTick = findTickForPrice(req.upperPrice!, pool.exponentAtPriceOne, pool.tickSpacing, false) + + var tokenMinAmount0_final = tokenMinAmount0.toString() + var tokenMinAmount1_final = tokenMinAmount1.toString() + + // alphabetize the coins going in or else invalid coins error + if (!(token0.base.toLowerCase() < token1.base.toLowerCase())){ + allCoins.reverse() + tokenMinAmount0_final = tokenMinAmount1.toString() + tokenMinAmount1_final = tokenMinAmount0.toString() + } + + const MsgCreatePosition = createPosition({ + poolId: pool.id.toString(), + sender: req.address, + // @ts-ignore: bad osmojs models + lowerTick: lowerTick, + // @ts-ignore: bad osmojs models + upperTick: upperTick, + tokensProvided: allCoins, + tokenMinAmount0: tokenMinAmount0_final, + tokenMinAmount1: tokenMinAmount1_final, + }) + + msgs.push(MsgCreatePosition); + + var enumFee = FEES.osmosis.joinPool(feeTier); + var gasToUse = enumFee.gas; + try{ + const gasEstimation = await this.signingClient.simulate( + req.address, + msgs, + ); + gasToUse = gasEstimation; + } catch (error1) { + var error = error1 as Error + if (error.message.includes('token is lesser than min amount')){ + throw new HttpException( + 500, + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE + 'Symbol: shareOutAmount ' + token0.symbol + ': ' + tokenMinAmount0.toString() + ' ' + + token1.symbol + ': ' + tokenMinAmount1.toString(), + AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE + ); + } + } + + calcedFee = calculateFee( + Math.round(Number(gasToUse) * (gasAdjustment || 1.5)), + GasPrice.fromString(gasPrice.toString() + this.manualGasPriceToken) + ); + } + + if (new BigNumber(calcedFee.gas).gt(new BigNumber(this.gasLimitEstimate))){ + throw new HttpException( + 500, + GAS_LIMIT_EXCEEDED_ERROR_MESSAGE + ' Calculated gas: ' + new BigNumber(calcedFee.gas).toString() + ' gasLimitEstimate: ' + new BigNumber(this.gasLimitEstimate).toString(), + GAS_LIMIT_EXCEEDED_ERROR_CODE + ); + } + + var res: AddPositionTransactionResponse = await this.signingClient.signAndBroadcast(req.address, msgs, calcedFee); + this.signingClient.disconnect(); + + var outbound_coins_string = '' // 990uion,98159uosmo + var outbound_shares_string = '' // 57568515255656500gamm/pool/62 + var token0_finalamount = '0' + var token1_finalamount = '0' + var poolshares = '0' + var positionId = '0' + + if (res?.code !== successfulTransaction){ + res.token0_finalamount = token0_finalamount + res.token1_finalamount = token1_finalamount + res.poolshares = poolshares + res.poolId = Number(pool.id.toString()) + res.poolAddress = pool.address + res.gasPrice = gasPrice + return res; + } + + // RETURNED VALUE DISSECTION + // osmo doesnt send back a clear value, we need to discern it from the event logs >.> + + try { + for (var event_idx=0; event_idx attribute_idx){ + outbound_coins_string = event.attributes[attribute_idx+1].value + } + } + else if (attribute.key == 'amount'){ + // this parses shares from a GAMM pool only + if (pool.totalShares && pool.totalShares.denom && attribute.value.includes(pool.totalShares.denom)){ + outbound_shares_string = attribute.value; + } + } + } + } + // this is a CL position + else if (event.type == 'create_position'){ + + for (var attribute_idx=0; attribute_idx { + + var slippage = 0; + if (allowedSlippage){ + slippage = this.getAllowedSlippage(allowedSlippage) + }else{ + slippage = this.getAllowedSlippage(this.allowedSlippage) + } + var feeTier = this.feeTier; + if (feeTier_input){ + feeTier = feeTier_input; + } + var gasAdjustment = this.gasPriceConstant; + if (gasAdjustment_input){ + gasAdjustment = gasAdjustment_input; + } + + try { + const keyWallet = await DirectSecp256k1Wallet.fromKey(wallet.privkey, 'osmo') + this.signingClient = await this.osmosisGetSigningStargateClient(this.rpcUrl, keyWallet); + + const balancesContainer = await this._provider.cosmos.bank.v1beta1.allBalances({ + address: address, + pagination: { + key: new Uint8Array(), + offset: BigInt(0), + limit: BigInt(10000), + countTotal: false, + reverse: false, + }, + }) + const balances = balancesContainer.balances + const lockedCoinsContainer = await this._provider.osmosis.lockup.accountLockedCoins({ + owner: address, + }); + const lockedCoins: Coin[] = lockedCoinsContainer.lockedCoins ? lockedCoinsContainer.lockedCoins : [] + + // RETURN TYPES: + // concentrated-liquidity/pool || cosmwasmpool/v1beta1/model/pool || gamm/pool-models/balancer/balancerPool || gamm/pool-models/stableswap/stableswap_pool + const poolsContainer = await this._provider.osmosis.poolmanager.v1beta1.allPools({}); + const pools: ExtendedPool[] = poolsContainer.pools; + + const fees = await fetchFees(); + var callImperatorWithTokens = undefined + if (this.chain == 'testnet'){ + callImperatorWithTokens = this.tokenList; + } + const prices = await getImperatorPriceHash(callImperatorWithTokens); // need to compare these two.. i think formatting is the same? + + // filter for CL + const filteredPools = filterPoolsSwapAndLP(this.tokenList, pools, prices); // removes stableswap, !token.denom.startsWith('gamm/pool'), has price, has osmosisAsset + + const extendedPools = filteredPools.map((pool) => + extendPool(this.tokenList, { pool, fees, balances, lockedCoins, prices:prices }) + ); + + + // find out if this is CL or GAMM (positionId or poolId) + var final_poolId = tokenId! + if (tokenId){ + //@ts-ignore + var allCLPositions; + try{ + const allCLPositionsContainer = await this._provider.osmosis.concentratedliquidity.v1beta1.positionById({ + address: address, // doesn't actually check the address + positionId: tokenId + }) + if (allCLPositionsContainer.position.position.address == address){ // is this our position? + final_poolId = allCLPositionsContainer.position.position.poolId + } + } catch (error) { + console.debug(error); + } + } + + const currentPool = extendedPools.filter((pl) => pl.id.toString() == final_poolId.toString())[0]; + const percent = decreasePercent; // total percent of pool shares + + var tokenOutMins: Coin[] = [] + var msgs = [] + var myLiquidity; + if (currentPool.$typeUrl!.includes('concentratedliquidity')){ + var clPositions; + if (tokenId){ + try{ + const clPositionsContainer = await this._provider.osmosis.concentratedliquidity.v1beta1.userPositions({ + address: address, + pagination: { + key: new Uint8Array(), + offset: BigInt(0), + limit: BigInt(10000), + countTotal: false, + reverse: false, + }, + poolId: final_poolId.toString() + }) + clPositions = clPositionsContainer.positions + } catch (error) { + console.debug(error); + } + } + // if no clPositions then throws error here + myLiquidity = new BigNumber(clPositions[0].position.liquidity || 0).multipliedBy(percent) + .div(100) + .toString(); + + var msgWithdrawPosition; + + msgWithdrawPosition = withdrawPosition({ + sender: address, + positionId: clPositions[0].position.positionId.toString(), + liquidityAmount: myLiquidity, + }) + + msgs.push(msgWithdrawPosition) + + }else{ + if (currentPool.myLiquidity){ + myLiquidity = new BigNumber(currentPool.myLiquidity || 0) + .multipliedBy(percent) + .div(100) + .toString(); + } + + const unbondedShares = convertDollarValueToShares( + this.tokenList, + myLiquidity || 0, + currentPool, + prices + ); + + const myCoins = convertDollarValueToCoins( + this.tokenList, + myLiquidity || 0, + currentPool, + prices + ); + + var coinsNeeded: Coin[] = []; + myCoins.forEach(({ denom, amount }) => { + var amountWithSlippage; + amountWithSlippage = new BigNumber(amount) + .multipliedBy(new BigNumber(100).minus(slippage)) + .div(100) + if (amountWithSlippage.isGreaterThanOrEqualTo(1)){ + coinsNeeded.push({ + denom, + amount: this.noDecimals(amountWithSlippage.toString()), + }); + } + }); + + const shareInAmount = new BigNumber(unbondedShares) + .shiftedBy(18) + .decimalPlaces(0) + .toString(); + + // alphabetize the coins going in or else invalid coins error + if (coinsNeeded.length>1){ + if (!(coinsNeeded[0].denom.toLowerCase() < coinsNeeded[1].denom.toLowerCase())){ + coinsNeeded.reverse() + } + } + + tokenOutMins = coinsNeeded.map((c: Coin) => { + return coin(c.amount, c.denom); + }); + + if (slippage == 100){ + tokenOutMins = [] + } + + const msg = exitPool({ + // @ts-ignore: bad osmojs models + poolId: currentPool.id.toString(), + sender: address, + shareInAmount, + tokenOutMins: tokenOutMins, + }); + msgs.push(msg) + + } + + + var enumFee = FEES.osmosis.exitPool(feeTier); + var gasToUse = enumFee.gas; + try{ + const gasEstimation = await this.signingClient.simulate( + address, + msgs, + ); + gasToUse = gasEstimation; + } catch (error1) { + var error = error1 as Error + if (error.message.includes('token is lesser than min amount')){ + var composeTokenOutMins = ''; + for (var idx=0;idx2 assets... + var finalAmountsReceived_string = ''; + var finalBalancesReceived: CoinAndSymbol[] = []; + + if (res?.code !== successfulTransaction){ + res.balances = []; + return res; + } + + try { + for (var txEvent_idx=0; txEvent_idx { + if (coin_string.includes(asset.token.denom)){ + var token = this.getTokenByBase(asset.token.denom); + var amount = (new BigNumber(coin_string.replace(asset.token.denom,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = asset.token.denom + } + finalBalancesReceived.push({base: asset.token.denom, amount:amount, symbol:symbol}) + } + }) + } else{ + if (coin_string.includes(currentPool.token0)){ + var token = this.getTokenByBase(currentPool.token0); + var amount = (new BigNumber(coin_string.replace(currentPool.token0,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = currentPool.token0 + } + finalBalancesReceived.push({base: currentPool.token0, amount:amount, symbol:symbol}) + } + if (coin_string.includes(currentPool.token1)){ + var token = this.getTokenByBase(currentPool.token1); + var amount = (new BigNumber(coin_string.replace(currentPool.token1,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = currentPool.token1 + } + finalBalancesReceived.push({base: currentPool.token1, amount:amount, symbol:symbol}) + } + } + } + }else{ + var coin_string = finalAmountsReceived_string; + if (currentPool.poolAssets){ + currentPool.poolAssets.forEach((asset) => { + if (coin_string.includes(asset.token.denom)){ + var token = this.getTokenByBase(asset.token.denom); + var amount = (new BigNumber(coin_string.replace(asset.token.denom,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = asset.token.denom + } + finalBalancesReceived.push({base: asset.token.denom, amount:amount, symbol:symbol}) + } + }) + } else{ + if (coin_string.includes(currentPool.token0)){ + var token = this.getTokenByBase(currentPool.token0); + var amount = (new BigNumber(coin_string.replace(currentPool.token0,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = currentPool.token0 + } + finalBalancesReceived.push({base: currentPool.token0, amount:amount, symbol:symbol}) + } + if (coin_string.includes(currentPool.token1)){ + var token = this.getTokenByBase(currentPool.token1); + var amount = (new BigNumber(coin_string.replace(currentPool.token1,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = currentPool.token1 + } + finalBalancesReceived.push({base: currentPool.token1, amount:amount, symbol:symbol}) + } + } + + } + } + + } catch (error) { + console.debug(error); + } + + res.balances = finalBalancesReceived; + res.gasPrice = gasPrice + return res; + + } catch (error) { + console.debug(error); + } finally { + this.signingClient.disconnect(); + } + throw new HttpException( + 500, + TRADE_FAILED_ERROR_MESSAGE, + TRADE_FAILED_ERROR_CODE + ); + } + + + + /** + * Returns all pool positions data including number of user's shares, or for single specified poolId + * + * @param token0 + * @param token1 + * @param address Wallet address + */ + async collectRewardsIncentives( + wallet: CosmosWallet, + address: string, + tokenId?: number, // we can collect only for CL here so we need to verify this is a positionID + feeTier_input?: string, + gasAdjustment_input?: number, + ): Promise { + + var feeTier = this.feeTier; + if (feeTier_input){ + feeTier = feeTier_input; + } + var gasAdjustment = this.gasPriceConstant; + if (gasAdjustment_input){ + gasAdjustment = gasAdjustment_input; + } + + try{ + const keyWallet = await DirectSecp256k1Wallet.fromKey(wallet.privkey, 'osmo') + this.signingClient = await this.osmosisGetSigningStargateClient(this.rpcUrl, keyWallet); + + // find out if this is CL or GAMM (positionId or poolId) + var final_positionId = undefined + var final_poolId = undefined + if (tokenId){ + //@ts-ignore + var allCLPositions; + try{ + const allCLPositionsContainer = await this._provider.osmosis.concentratedliquidity.v1beta1.positionById({ + address: address, // doesn't actually check the address + positionId: tokenId + }) + if (allCLPositionsContainer.position.position.address == address){ // is this our position? + final_positionId = tokenId + final_poolId = allCLPositionsContainer.position.position.poolId + } + } catch (error) { + console.debug(error); + } + } + + + if (final_positionId != undefined){ + const poolsContainer = await this._provider.osmosis.poolmanager.v1beta1.allPools({}); + const pools: ExtendedPool[] = poolsContainer.pools; + var callImperatorWithTokens = undefined + if (this.chain == 'testnet'){ + callImperatorWithTokens = this.tokenList; + } + const prices = await getImperatorPriceHash(callImperatorWithTokens); + + // filter for CL + const filteredPools = filterPoolsSwapAndLP(this.tokenList, pools, prices); // removes stableswap, !token.denom.startsWith('gamm/pool'), has price, has osmosisAsset + const currentPool = filteredPools.filter((pl) => pl.id.toString() == final_poolId!.toString())[0]; + + var msgs = [] + var positionIds: string[] = [final_positionId.toString()] + const msg1 = collectSpreadRewards({ + // @ts-ignore: bad osmojs models + positionIds: positionIds, + sender: address, + }); + const msg2 = collectIncentives({ + // @ts-ignore: bad osmojs models + positionIds: positionIds, + sender: address, + }); + msgs.push(msg1) + msgs.push(msg2) + + var enumFee = FEES.osmosis.exitPool(feeTier); + var gasToUse = enumFee.gas; + const gasPrice = await this.getLatestBasePrice(); + try{ + const gasEstimation = await this.signingClient.simulate( + address, + msgs, + ); + gasToUse = gasEstimation; + } catch (error) { + console.debug(error); + } + const calcedFee = calculateFee( + Math.round(Number(gasToUse) * (gasAdjustment || 1.5)), + GasPrice.fromString(gasPrice.toString() + this.manualGasPriceToken) + ); + + var res: ReduceLiquidityTransactionResponse | any = await this.signingClient.signAndBroadcast(address, msgs, calcedFee); + this.signingClient.disconnect(); + + var finalBalancesReceived: CoinAndSymbol[] = []; + var collect_strings: string[] = []; + //@ts-ignore + res.events.filter((evt)=>evt.type='total_collect_spread_rewards').forEach((evt)=>{evt.attributes.forEach((atr)=>{ + if (atr.key=='tokens_out'){ + collect_strings.push(atr.value) + }})}) + //@ts-ignore + res.events.filter((evt)=>evt.type='total_collect_incentives').forEach((evt)=>{evt.attributes.forEach((atr)=>{ + if (atr.key=='tokens_out'){ + collect_strings.push(atr.value) + }})}) + + + if (res?.code !== successfulTransaction){ + res.balances = []; + return res; + } + + try { + collect_strings.forEach((cstr)=>{ + if (cstr.includes(',')){ + var coins_string_list = cstr.split(','); + for (var coin_string_idx=0; coin_string_idx { + if (coin_string.includes(asset.token.denom)){ + var token = this.getTokenByBase(asset.token.denom); + var amount = (new BigNumber(coin_string.replace(asset.token.denom,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = asset.token.denom + } + finalBalancesReceived.push({base: asset.token.denom, amount:amount, symbol:symbol}) + } + }) + } else{ + if (coin_string.includes(currentPool.token0)){ + var token = this.getTokenByBase(currentPool.token0); + var amount = (new BigNumber(coin_string.replace(currentPool.token0,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = currentPool.token0 + } + finalBalancesReceived.push({base: currentPool.token0, amount:amount, symbol:symbol}) + } + if (coin_string.includes(currentPool.token1)){ + var token = this.getTokenByBase(currentPool.token1); + var amount = (new BigNumber(coin_string.replace(currentPool.token1,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = currentPool.token1 + } + finalBalancesReceived.push({base: currentPool.token1, amount:amount, symbol:symbol}) + } + } + } + }else{ + var coin_string = cstr; + if (currentPool.poolAssets){ + currentPool.poolAssets.forEach((asset) => { + if (coin_string.includes(asset.token.denom)){ + var token = this.getTokenByBase(asset.token.denom); + var amount = (new BigNumber(coin_string.replace(asset.token.denom,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = asset.token.denom + } + finalBalancesReceived.push({base: asset.token.denom, amount:amount, symbol:symbol}) + } + }) + } else{ + if (coin_string.includes(currentPool.token0)){ + var token = this.getTokenByBase(currentPool.token0); + var amount = (new BigNumber(coin_string.replace(currentPool.token0,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = currentPool.token0 + } + finalBalancesReceived.push({base: currentPool.token0, amount:amount, symbol:symbol}) + } + if (coin_string.includes(currentPool.token1)){ + var token = this.getTokenByBase(currentPool.token1); + var amount = (new BigNumber(coin_string.replace(currentPool.token1,''))).shiftedBy(token!.decimals * -1).decimalPlaces(token!.decimals).toString(); + var symbol = token!.symbol; + if (!symbol){ + symbol = currentPool.token1 + } + finalBalancesReceived.push({base: currentPool.token1, amount:amount, symbol:symbol}) + } + } + } + + }) + + + } catch (error) { + console.debug(error); + } + + res.balances = finalBalancesReceived; + res.gasPrice = gasPrice + return res; + + }} + catch (error) { + console.debug(error); + } + throw new HttpException( + 500, + TRADE_FAILED_ERROR_MESSAGE, + TRADE_FAILED_ERROR_CODE + ); + + } + + + + + + /** + * Returns all pools and their prices for 2 tokens. Address used for balance query. + * + * @param token0 + * @param token1 + * @param address Wallet address + */ + async findPoolsPrices( + token0: CosmosAsset, + token1: CosmosAsset, + address: string, + ): Promise { + + try { + var balances: Coin[] = [] + var lockedCoins: Coin[] = [] + if (address){ + const balancesContainer = await this._provider.cosmos.bank.v1beta1.allBalances({ + address: address, + pagination: { + key: new Uint8Array(), + offset: BigInt(0), + limit: BigInt(10000), + countTotal: false, + reverse: false, + }, + }) + balances = balancesContainer.balances + + const lockedCoinsContainer = await this._provider.osmosis.lockup.accountLockedCoins({ + owner: address, + }); + lockedCoinsContainer.lockedCoins ? lockedCoinsContainer.lockedCoins : [] + } + + // RETURN TYPES: + // concentrated-liquidity/pool || cosmwasmpool/v1beta1/model/pool || gamm/pool-models/balancer/balancerPool || gamm/pool-models/stableswap/stableswap_pool + const poolsContainer = await this._provider.osmosis.poolmanager.v1beta1.allPools({}); + const pools: ExtendedPool[] = poolsContainer.pools; + const fees = await fetchFees(); + var callImperatorWithTokens = undefined + if (this.chain == 'testnet'){ + callImperatorWithTokens = this.tokenList; + } + const prices = await getImperatorPriceHash(callImperatorWithTokens); + + // filter for CL + const filteredPools = filterPoolsLP(this.tokenList, pools, prices); + + const extendedPools = filteredPools.map((pool) => + extendPool(this.tokenList, { pool, fees, balances, lockedCoins, prices:prices }) + ); + const exponentToken0 = this.getExponentByBase(token0.base) + const exponentToken1 = this.getExponentByBase(token1.base) + + var pricesOut: string[] = []; + var returnPools: SerializableExtendedPool[] = []; + extendedPools.forEach(function (cPool) { + var foundToken0 = false; + var foundToken1 = false; + if (cPool.token0){ + if (cPool.token0 == token0.base || cPool.token1 == token0.base){ + foundToken0 = true; + } + if (cPool.token0 == token1.base || cPool.token1 == token1.base){ + foundToken1 = true; + } + } + else if (cPool.poolAssets){ + for (var poolAsset_idx=0; poolAsset_idx { + + // find out if this is CL or GAMM (positionId or poolId) + var final_poolId = tokenId + if (tokenId){ + try{ + const allCLPositionsContainer = await this._provider.osmosis.concentratedliquidity.v1beta1.positionById({ + address: address, // doesn't actually check the address + positionId: tokenId + }) + if (allCLPositionsContainer.position.position.address == address){ // is this our position? + final_poolId = allCLPositionsContainer.position.position.poolId + } + } catch (error) { + console.debug(error); + } + } + + try { + var clPositions; + if (final_poolId){ + try{ + const clPositionsContainer = await this._provider.osmosis.concentratedliquidity.v1beta1.userPositions({ + address: address, + pagination: { + key: new Uint8Array(), + offset: BigInt(0), + limit: BigInt(10000), + countTotal: false, + reverse: false, + }, + poolId: final_poolId.toString() + }) + clPositions = clPositionsContainer.positions + } catch (error) { + console.debug(error); + } + } + + // only shows GAMM positions by # of poolShares + const balancesContainer = await this._provider.cosmos.bank.v1beta1.allBalances({ + address: address, + pagination: { + key: new Uint8Array(), + offset: BigInt(0), + limit: BigInt(10000), + countTotal: false, + reverse: false, + }, + }) + const balances = balancesContainer.balances + const lockedCoinsContainer = await this._provider.osmosis.lockup.accountLockedCoins({ + owner: address, + }); + const lockedCoins: Coin[] = lockedCoinsContainer.lockedCoins ? lockedCoinsContainer.lockedCoins : [] + + // RETURN TYPES: + // concentrated-liquidity/pool || cosmwasmpool/v1beta1/model/pool || gamm/pool-models/balancer/balancerPool || gamm/pool-models/stableswap/stableswap_pool + const poolsContainer = await this._provider.osmosis.poolmanager.v1beta1.allPools({}); + const pools: ExtendedPool[] = poolsContainer.pools; + + const fees = await fetchFees(); + var callImperatorWithTokens = undefined + if (this.chain == 'testnet'){ + callImperatorWithTokens = this.tokenList; + } + const prices = await getImperatorPriceHash(callImperatorWithTokens); + + // filter for CL + const filteredPools = filterPoolsLP(this.tokenList, pools, prices); // removes stableswap, !token.denom.startsWith('gamm/pool'), has price, has osmosisAsset + + const extendedPools = filteredPools.map((pool) => + extendPool(this.tokenList, { pool, fees, balances, lockedCoins, prices:prices }) + ); + + // balances contain pool address (as coin denom) and amount (# of shares) + // however it's not returning that for CL pool positions (only GAMM).. so we can't match the pool address to anything here + var returnPools: SerializableExtendedPool[] = []; + extendedPools.forEach(function (cPool) { + if ((cPool.myLiquidity && cPool.myLiquidity != '0') || (cPool.bonded && cPool.bonded != '0')) + { + returnPools.push(new SerializableExtendedPool(cPool)); + } + else if (final_poolId){ + if ((cPool.id && cPool.id.toString() == final_poolId.toString()) || (cPool.poolId && cPool.poolId.toString() == final_poolId.toString())){ + returnPools.push(new SerializableExtendedPool(cPool)); + } + } + }); + + var returnObj: PositionInfo = {'pools':returnPools} + + // if we're passed a poolId (tokenId), we used it to search for CLPositions + // so (if we can) let's pretend we match the existing model and just return the first position for that poolId + if (clPositions && clPositions.length > 0){ + const clPosition = clPositions[0]; + var unclaimedToken0 = new BigNumber(0) + var unclaimedToken1 = new BigNumber(0) + clPosition.claimableIncentives.forEach((element: { amount: number; denom: string;}) => { + if (new BigNumber(element.amount).isGreaterThan(0)){ + if (element.denom == clPosition.asset0.denom){ + unclaimedToken0 = unclaimedToken0.plus(new BigNumber(element.amount)) + }else{ + unclaimedToken1 = unclaimedToken1.plus(new BigNumber(element.amount)) + } + } + }); + clPosition.claimableSpreadRewards.forEach((element: { amount: number; denom: string;}) => { + if (new BigNumber(element.amount).isGreaterThan(0)){ + if (element.denom == clPosition.asset0.denom){ + unclaimedToken0 = unclaimedToken0.plus(new BigNumber(element.amount)) + }else{ + unclaimedToken1 = unclaimedToken1.plus(new BigNumber(element.amount)) + } + } + }); + + returnObj.token0 = clPosition.asset0.denom; + returnObj.token1 = clPosition.asset1.denom; + returnObj.amount0 = clPosition.asset0.amount; + returnObj.amount1 = clPosition.asset1.amount; + returnObj.lowerPrice = clPosition.position.lowerTick.toString(); + returnObj.upperPrice = clPosition.position.upperTick.toString(); + returnObj.poolShares = clPosition.position.liquidity + returnObj.unclaimedToken0 = unclaimedToken0.toString() + returnObj.unclaimedToken1 = unclaimedToken1.toString() + const clPositionPool = extendedPools.find((pl) => pl.id.toString() === clPosition.position.poolId.toString()); + returnObj.fee = clPositionPool?.fees7D.toString() + } + // not returning GAMM positons here; problematic for strat and apparently this is amm-liquidity route only + // else if (tokenId && returnPools.length > 0){ // we got a poolId but it was for a GAMM pool - so yes poolShares + // var firstPool: SerializableExtendedPool = returnPools[0]!; + // returnObj.token0 = firstPool.poolAssets![0].token.denom; + // returnObj.token1 = firstPool.poolAssets![1].token.denom; + // returnObj.amount0 = firstPool.poolAssets![0].token.amount; + // returnObj.amount1 = firstPool.poolAssets![1].token.amount; + // returnObj.fee = firstPool.fees_spent_7d.toString() + // returnObj.poolShares = firstPool.myLiquidityShares.toString() + // } + + return returnObj; + + } catch (error) { + console.debug(error); + } finally { + + } + throw new HttpException( + 500, + TRADE_FAILED_ERROR_MESSAGE, + TRADE_FAILED_ERROR_CODE + ); + } + + + async getCurrentBlockNumber(): Promise{ + const client = await CosmWasmClient + .connect(this.rpcUrl); + const getHeight = await client.getHeight() + return getHeight; + } + + /** + * Transfer tokens + * + * @param wallet + * @param token + * @param req TransferRequest + */ + async transfer( + wallet: CosmosWallet, + token: CosmosAsset, + req: TransferRequest + ): Promise { + + const keyWallet = await DirectSecp256k1Wallet.fromKey(wallet.privkey, 'osmo') + this.signingClient = await this.osmosisGetSigningStargateClient(this.rpcUrl, keyWallet); + + const tokenInAmount = new BigNumber(req.amount) + .shiftedBy(token.decimals) + .toString(); + + const coinIn = { + denom: token.base, + amount: tokenInAmount, + }; + + var coinsList = [] + coinsList.push(coinIn) + const msg = send({ + fromAddress: req.from, + toAddress: req.to, + amount: coinsList + }); + + var gasAdjustment = this.gasPriceConstant; + var feeTier = this.feeTier; + + var enumFee = FEES.osmosis.swapExactAmountIn(feeTier); + var gasToUse = enumFee.gas; + try{ + const gasEstimation = await this.signingClient.simulate( + req.from, + [msg], + ); + gasToUse = gasEstimation; + } catch (error) { + console.debug(error); + } + + const gasPrice = await this.getLatestBasePrice(); + const calcedFee = calculateFee( + Math.round(Number(gasToUse) * (gasAdjustment || 1.5)), + GasPrice.fromString(gasPrice.toString() + this.manualGasPriceToken) + ); + + if (new BigNumber(calcedFee.gas).gt(new BigNumber(this.gasLimitEstimate))){ + throw new HttpException( + 500, + GAS_LIMIT_EXCEEDED_ERROR_MESSAGE + ' Calculated gas: ' + new BigNumber(calcedFee.gas).toString() + ' gasLimitEstimate: ' + new BigNumber(this.gasLimitEstimate).toString(), + GAS_LIMIT_EXCEEDED_ERROR_CODE + ); + } + + var res = await this.signingClient.signAndBroadcast(req.from, [msg], calcedFee); + res.gasPrice = gasPrice + this.signingClient.disconnect(); + return res; + } + + async getTokens(req?: TokensRequest): Promise { + var responseTokens: TokenInfo[] = []; + this.tokenList.forEach(element => { + // FILTER IF req.tokenSymbols != [] + var addToken = true; + if (req && req.tokenSymbols && req.tokenSymbols.length > 0){ + addToken = false; + for (var idx=0; idx any + + +export interface Scenario { + token: CoinBalance; + ratio: string; + symbol: string; + amount: string; + enoughCoinsExist: boolean; + totalDollarValue?: string; +} + +export interface Scenarios { + [key: string]: Scenario[]; +} + +export { + CoinDenom, + Exponent, + CoinSymbol, + PriceHash, + CoinGeckoToken, + CoinGeckoUSD, + CoinGeckoUSDResponse, + CoinValue, + CoinBalance, + PoolAssetPretty, + PoolTokenImage, + PoolPretty, + CalcPoolAprsParams, + Trade, + PrettyPair, +}; + +export type Peroid = '1' | '7' | '14'; + +export type PoolApr = { + [K in Peroid]: ReturnType; // typeof calcPoolAprs +}; + + +export type ExtraPoolProperties = { + fees7D: number; + volume24H: number; + volume7d: number; + liquidity: string | number; + myLiquidity?: string | number; + bonded?: string | number; + apr: PoolApr; +}; + +export interface FetchedData { + pools: Pool[]; + prices: PriceHash; + balances: Coin[]; +} + +export interface SwapOptionType { + /** + * Required. Unique identifier for option. + */ + value: string; + /** + * Display symbol name. + */ + symbol: string; + /** + * Icon display for option. + */ + icon?: { + png?: string; + jpeg?: string; + svg?: string; + }; + /** + * Unit of the chain. + */ + denom: string; + amount: string; + displayAmount: string; + dollarValue: string; + chainName: string; +} + +export interface OsmosisExpectedTrade { + routes: OsmosisExpectedTradeRoute[]; + expectedAmount: string; + executionPrice: BigNumber; + gasLimitEstimate: BigNumber; + tokenInAmount: string; + tokenInDenom: string; + tokenOutDenom: string; + gasUsed: string, + gasWanted: string, +} +export interface OsmosisExpectedTradeRoute { + poolId: string; + swapFee: string; + baseLogo?: { + png?: string; + svg?: string; + jpeg?: string; + }; + baseSymbol: string; + quoteLogo?: { + png?: string; + svg?: string; + jpeg?: string; + }; + quoteSymbol: string; + tokenOutDenom: string; +} + +export interface SwapAmountInRoute { + poolId: bigint ; + tokenOutDenom: string; +} + +export interface OsmosisExpectedTradeSwapOut { + routes: { + poolId: string; + swapFee: string; + baseLogo?: { + png?: string; + svg?: string; + jpeg?: string; + }; + baseSymbol: string; + quoteLogo?: { + png?: string; + svg?: string; + jpeg?: string; + }; + quoteSymbol: string; + tokenInDenom: string; + }[]; + expectedAmount: string; + executionPrice: BigNumber; + gasLimitEstimate: BigNumber; + tokenInDenom: string; + tokenOutDenom: string; +} + +export function ToLog_OsmosisExpectedTrade(trade: OsmosisExpectedTrade){ + var output = '' + trade.routes.forEach((element)=>{ + output += 'poolId: ' + output += element.poolId; + output += ', ' + output += 'swapFee: ' + output += element.swapFee; + output += ', ' + output += 'baseSymbol: ' + output += element.baseSymbol; + output += ', ' + output += 'quoteSymbol: ' + output += element.quoteSymbol; + output += ', ' + }) + output += 'expectedAmount: ' + output += trade.expectedAmount; + output += ', ' + output += 'executionPrice: ' + output += trade.executionPrice.toString(); + output += ', ' + output += 'gasLimitEstimate: ' + output += trade.gasLimitEstimate.toString(); + output += ', ' + return output +} + +export type AnyTransactionResponse = TransactionResponse | ReduceLiquidityTransactionResponse | AddPositionTransactionResponse + +export interface CoinAndSymbol { + base: string; + amount: string; + symbol: string; +} + +export interface ReduceLiquidityTransactionResponse extends TransactionResponse { + balances: CoinAndSymbol[]; + gasPrice: number; +} + +// returned from transfer() +export interface TransactionResponse { + transactionHash: string; + code: number; + events: TransactionEvent[]; + gasUsed: string; + gasWanted: string; + gasPrice: number; + height: number; + rawLog: string; +} + + + +// poll() +export interface PollTxResponse { + code: number; + codespace: string; + data: string; + events: TransactionEvent[]; + gasUsed: string | bigint; + gasWanted: string | bigint; + height: string | bigint; + info: string; + rawLog: string; + timestamp: string; + txhash: string; +} + + +// export interface PollResponse { +// network: string; +// timestamp: number; +// currentBlock: number; +// txHash: string; +// txStatus: number; +// txBlock: number; +// txData: CustomTransactionResponse | null; +// txReceipt: CustomTransactionReceipt | null; +// } + +// export interface CustomTransactionResponse +// extends Omit< +// ethers.providers.TransactionResponse, +// 'gasPrice' | 'gasLimit' | 'value' +// > { +// gasPrice: string | null; +// gasLimit: string; +// value: string; +// } + +// export interface CustomTransactionReceipt +// extends Omit< +// ethers.providers.TransactionReceipt, +// 'gasUsed' | 'cumulativeGasUsed' | 'effectiveGasPrice' +// > { +// gasUsed: string; +// cumulativeGasUsed: string; +// effectiveGasPrice: string | null; +// status: string; +// } + + +export interface AddPositionTransactionResponse extends TransactionResponse { + rawLog: string; + poolId: number; // this is GAMM only (sort of, we find it ourselves based on positonId for reducePosition()) + poolAddress: string; + token0_finalamount: string; + token1_finalamount: string; + poolshares: string; + gasPrice: number; + positionId?: number; // this is CL only +} + +export interface TransactionEvent { + attributes: TransactionEventAttribute[]; + type: string; +} +export interface TransactionEventAttribute { + key: string; + value: string; +} + +export interface PriceAndSerializableExtendedPools{ + pools: SerializableExtendedPool[]; + prices: string[]; +} + +export class SerializableExtendedPool { + constructor(input: ExtendedPool) { + this.$typeUrl = input.$typeUrl; + this.address = input.address; + if (input.id){ + this.id = input.id.toString(); + }else{ + this.id = input.poolId!.toString(); + } + this.futurePoolGovernor = input.futurePoolGovernor; + this.totalShares = input.totalShares; + this.token0 = input.token0; + this.token1 = input.token1; + this.poolAssets = input.poolAssets; + this.totalWeight = input.totalWeight; + this.fees_volume24H = input.volume24H; + this.fees_spent_7d = input.fees7D; + this.fees_volume7d = input.volume7d; + this.myLiquidityShares = input.liquidity; + this.myLiquidityDollarValue = input.myLiquidity; + this.my_bonded_shares = input.bonded; + this.denom = input.denom; + } + $typeUrl?: string; + address: string; + id: string; + // poolParams: PoolParams; + futurePoolGovernor?: string; + totalShares?: Coin; + poolAssets?: PoolAsset[]; + totalWeight?: string; + token0?: string; + token1?: string; + + fees_volume24H: number; + fees_spent_7d: number; + fees_volume7d: number; + myLiquidityShares: number; + myLiquidityDollarValue: string; + my_bonded_shares: string; + denom: string; +} + +export class ExtendedPool { + liquidity: number = 0; + volume24H: number = 0; + fees7D: number = 0; + volume7d: number = 0; + myLiquidity: string = ""; + bonded: string = ""; + denom: string = ""; + $typeUrl?: string | undefined; + address: string = ""; + totalWeight: string = ""; + token0: string = ""; + token1: string = ""; + poolAssets: PoolAsset[] = []; + id: bigint = BigInt(0); + poolId: bigint = BigInt(0); + poolParams: PoolParams = new PoolParams(); + futurePoolGovernor: string = ""; + totalShares: Coin = {'amount':'', 'denom':''}; +} + +class PoolParams{ + swapFee: string = ""; + exitFee: string = ""; + smoothWeightChangeParams: undefined; +} \ No newline at end of file diff --git a/src/chains/osmosis/osmosis.utils.ts b/src/chains/osmosis/osmosis.utils.ts new file mode 100755 index 0000000000..b54d387d0a --- /dev/null +++ b/src/chains/osmosis/osmosis.utils.ts @@ -0,0 +1,95 @@ +import BigNumber from 'bignumber.js'; + +export interface Fee { + pool_id: string; + volume_24h: number; + volume_7d: number; + fees_spent_24h: number; + fees_spent_7d: number; + fees_percentage: string; +} + +export const fetchFees = async (): Promise => { + const url = 'https://api-osmosis.imperator.co/fees/v1/pools'; + return fetch(url) + // .then(handleError) + .then((res) => res.json()) + .then((res) => res.data); +}; + +type PoolReward = { + day_usd: number; + month_usd: number; + year_usd: number; +}; + +type Rewards = { + pools: { + [key: number]: PoolReward; + }; + total_day_usd: number; + total_month_usd: number; + total_year_usd: number; +}; + +export const fetchRewards = async (address: string): Promise => { + const url = `https://api-osmosis-chain.imperator.co/lp/v1/rewards/estimation/${address}`; + return fetch(url) + // .then(handleError) + .then((res) => res.json()); +}; + +export function tickToPrice(exponentToken0: number, exponentToken1: number, currentTickIn: string, exponentAtPriceOne: string): string { + const currentTick = new BigNumber(currentTickIn) + var exponent = new BigNumber(exponentAtPriceOne); // -6 + + var geoExponentIncrementTicks = new BigNumber(9).multipliedBy(new BigNumber(10).exponentiatedBy(exponent.multipliedBy(-1))) // 9e6 + var geoExponentDelta; + geoExponentDelta = currentTick.dividedBy(geoExponentIncrementTicks).integerValue(BigNumber.ROUND_FLOOR) + + var exponentAtCurrentTick = new BigNumber(exponentAtPriceOne).plus(geoExponentDelta) + var currentAddIncrementTicks = new BigNumber(10).exponentiatedBy(exponentAtCurrentTick) // 10e-6 + + var numAdditiveTicks = currentTick.minus((geoExponentDelta.multipliedBy(geoExponentIncrementTicks))) + + var price = new BigNumber(10).exponentiatedBy(geoExponentDelta).plus((numAdditiveTicks.multipliedBy(currentAddIncrementTicks))) + + price = price.dividedBy((new BigNumber(10).exponentiatedBy(exponentToken1)).dividedBy((new BigNumber(10).exponentiatedBy(exponentToken0)))) + + return price.toString() +} + +export function findTickForPrice(desiredPriceString: string, exponentAtPriceOne: number, tickSpacing: number, is_lowerBound: boolean): string{ + var desiredPrice = new BigNumber(desiredPriceString) + var exponent = new BigNumber(exponentAtPriceOne); // -6 + var geoExponentIncrementTicks = new BigNumber(9).multipliedBy(new BigNumber(10).exponentiatedBy(exponent.multipliedBy(-1))) // 9e6 + + var currentPrice = new BigNumber(1) + var ticksPassed = new BigNumber(0) + var currentAddIncrementTicks = new BigNumber(10).exponentiatedBy(exponent) // 10e-6 + var currentAddIncrementTicksPrice = currentAddIncrementTicks.multipliedBy(geoExponentIncrementTicks) // 9 + + ticksPassed = ticksPassed.plus(geoExponentIncrementTicks) // 9e6 + var totalPrice = currentPrice.plus(currentAddIncrementTicksPrice) // 10 + + while (totalPrice.isLessThan(desiredPrice)){ + exponent = exponent.plus(1) + currentAddIncrementTicks = new BigNumber(10).exponentiatedBy(exponent) + currentAddIncrementTicksPrice = currentAddIncrementTicks.multipliedBy(geoExponentIncrementTicks) + ticksPassed = ticksPassed.plus(geoExponentIncrementTicks) + totalPrice = totalPrice.plus(currentAddIncrementTicksPrice) + } + + var ticksToBeFulfilledByExponentAtCurrentTick = (desiredPrice.minus(totalPrice)).dividedBy(currentAddIncrementTicks) + var tickIndex = ticksPassed.plus(ticksToBeFulfilledByExponentAtCurrentTick) + + var returnTick + if (is_lowerBound){ + returnTick = tickIndex.dividedBy(tickSpacing).integerValue(BigNumber.ROUND_DOWN).multipliedBy(tickSpacing) + } + else{ + returnTick = tickIndex.dividedBy(tickSpacing).integerValue(BigNumber.ROUND_CEIL).multipliedBy(tickSpacing) + } + return returnTick.toString() +} + diff --git a/src/connectors/connectors.routes.ts b/src/connectors/connectors.routes.ts index 41c01a5560..d9ac0b63f9 100644 --- a/src/connectors/connectors.routes.ts +++ b/src/connectors/connectors.routes.ts @@ -22,6 +22,7 @@ import { PlentyConfig } from './plenty/plenty.config'; import { XRPLCLOBConfig } from './xrpl/xrpl.clob.config'; import { KujiraConfig } from './kujira/kujira.config'; import { QuipuswapConfig } from './quipuswap/quipuswap.config'; +import { OsmosisConfig } from '../chains/osmosis/osmosis.config'; import { CarbonConfig } from './carbon/carbon.config'; export namespace ConnectorsRoutes { @@ -170,6 +171,12 @@ export namespace ConnectorsRoutes { chain_type: QuipuswapConfig.config.chainType, available_networks: QuipuswapConfig.config.availableNetworks, }, + { + name: 'osmosis', + trading_type: OsmosisConfig.config.tradingTypes('swap'), + chain_type: OsmosisConfig.config.chainType, + available_networks: OsmosisConfig.config.availableNetworks, + }, { name: 'carbonamm', trading_type: CarbonConfig.config.tradingTypes, diff --git a/src/connectors/uniswap/uniswap.controllers.ts b/src/connectors/uniswap/uniswap.controllers.ts index 6dfc303591..5aca4a8c80 100644 --- a/src/connectors/uniswap/uniswap.controllers.ts +++ b/src/connectors/uniswap/uniswap.controllers.ts @@ -399,7 +399,7 @@ export async function addLiquidity( token1, req.amount0, req.amount1, - req.fee.toUpperCase(), + req.fee!.toUpperCase(), Number(req.lowerPrice), Number(req.upperPrice), req.tokenId ? req.tokenId : 0, @@ -420,7 +420,7 @@ export async function addLiquidity( latency: latency(startTimestamp, Date.now()), token0: token0.address, token1: token1.address, - fee: req.fee, + fee: req.fee!, tokenId: req.tokenId ? req.tokenId : 0, gasPrice: gasPrice, gasPriceToken: ethereumish.nativeTokenSymbol, @@ -452,7 +452,7 @@ export async function removeLiquidity( const tx = await uniswapish.reducePosition( wallet, - req.tokenId, + req.tokenId!, req.decreasePercent ? req.decreasePercent : 100, gasLimitTransaction, gasPrice, @@ -501,7 +501,7 @@ export async function collectEarnedFees( const tx: Transaction = ( await uniswapish.collectFees( wallet, - req.tokenId, + req.tokenId!, gasLimitTransaction, gasPrice, req.nonce, @@ -535,7 +535,7 @@ export async function positionInfo( ): Promise { const startTimestamp: number = Date.now(); - const posInfo = await uniswapish.getPosition(req.tokenId); + const posInfo = await uniswapish.getPosition(req.tokenId!); logger.info(`Position info for position ${req.tokenId} retrieved.`); @@ -569,9 +569,9 @@ export async function poolPrice( const prices = await uniswapish.poolPrice( token0, token1, - req.fee.toUpperCase(), - req.period, - req.interval + req.fee!.toUpperCase(), + req.period!, + req.interval! ); return { diff --git a/src/network/network.controllers.ts b/src/network/network.controllers.ts index 75b6702f75..bb4b165158 100644 --- a/src/network/network.controllers.ts +++ b/src/network/network.controllers.ts @@ -19,6 +19,7 @@ import { getInitializedChain, UnsupportedChainException, } from '../services/connection-manager'; +import { Osmosis } from '../chains/osmosis/osmosis'; import { XRPL } from '../chains/xrpl/xrpl'; export async function getStatus( @@ -108,6 +109,11 @@ export async function getStatus( connections = connections.concat( kujiraConnections ? Object.values(kujiraConnections) : [] ); + + const osmosisConnections = Osmosis.getConnectedInstances(); + connections = connections.concat( + osmosisConnections ? Object.values(osmosisConnections) : [] + ); } for (const connection of connections) { diff --git a/src/network/network.requests.ts b/src/network/network.requests.ts index 20b386b90f..3289218fef 100644 --- a/src/network/network.requests.ts +++ b/src/network/network.requests.ts @@ -20,7 +20,7 @@ export interface BalanceResponse { } export interface PollRequest extends NetworkSelectionRequest { - txHash: string; + txHash?: string; // not required for cosmos when coming after approve() } export interface PollResponse { @@ -32,6 +32,7 @@ export interface PollResponse { txBlock: number; txData: CustomTransactionResponse | null; txReceipt: CustomTransactionReceipt | null; + tokenId?: number; // filling for cosmos because we don't have a standard txReceipt, so pulling this from controller } export interface StatusRequest { diff --git a/src/services/base.ts b/src/services/base.ts index b2049651c3..0019049a8a 100644 --- a/src/services/base.ts +++ b/src/services/base.ts @@ -19,7 +19,7 @@ export interface TokenInfo { } // insert a string into another string at an index -const stringInsert = (str: string, val: string, index: number) => { +export const stringInsert = (str: string, val: string, index: number) => { if (index > 0) { return str.substring(0, index) + val + str.substr(index); } diff --git a/src/services/common-interfaces.ts b/src/services/common-interfaces.ts index 8497b3945c..0e26a115d2 100644 --- a/src/services/common-interfaces.ts +++ b/src/services/common-interfaces.ts @@ -14,7 +14,7 @@ import { providers as XdcProviders, } from 'ethers-xdc'; import { EthereumBase } from '../chains/ethereum/ethereum-base'; -import { CosmosBase } from '../chains/cosmos/cosmos-base'; +import { CosmosAsset, CosmosBase } from '../chains/cosmos/cosmos-base'; import { Provider } from '@ethersproject/abstract-provider'; import { CurrencyAmount, Token, Trade as TradeUniswap } from '@uniswap/sdk'; import { Trade } from '@uniswap/router-sdk'; @@ -113,6 +113,7 @@ import { import { BalanceRequest } from '../network/network.requests'; import { TradeV2 } from '@traderjoe-xyz/sdk-v2'; import { CurveTrade } from '../connectors/curve/curve'; +import { SerializableExtendedPool as CosmosSerializableExtendedPool } from '../chains/osmosis/osmosis.types'; import { CarbonTrade } from '../connectors/carbon/carbonAMM'; // TODO Check the possibility to have clob/solana/serum equivalents here @@ -128,7 +129,8 @@ export type Tokenish = | PancakeSwapToken | MMFToken | VVSToken - | TokenXsswap; + | TokenXsswap + | CosmosAsset; export type TokenAmountish = MMFTokenAmount | VVSTokenAmount; @@ -202,15 +204,17 @@ export interface ExpectedTrade { } export interface PositionInfo { - token0: string | undefined; - token1: string | undefined; - fee: string | undefined; - lowerPrice: string; - upperPrice: string; - amount0: string; - amount1: string; - unclaimedToken0: string; - unclaimedToken1: string; + token0?: string | undefined; + token1?: string | undefined; + poolShares?: string; // COSMOS - GAMM pools only issue poolShares (no amount/unclaimedToken) + fee?: string | undefined; + lowerPrice?: string; + upperPrice?: string; + amount0?: string; // COSMOS - CL pools only + amount1?: string; // COSMOS - CL pools only + unclaimedToken0?: string; // COSMOS - CL pools only + unclaimedToken1?: string; // COSMOS - CL pools only + pools?: CosmosSerializableExtendedPool[]; } export interface Uniswapish { @@ -798,4 +802,16 @@ export interface TransferRequest extends NetworkSelectionRequest { token: string; } -export type TransferResponse = string; +export type TransferResponse = string | FullTransferResponse; + +export interface FullTransferResponse { + network: string; + timestamp: number; + latency: number; + amount: string; + gasPrice: string; + gasLimit: string; + gasUsed: string; + gasWanted: string; + txHash: string; +} \ No newline at end of file diff --git a/src/services/connection-manager.ts b/src/services/connection-manager.ts index 1863e29305..706efb5511 100644 --- a/src/services/connection-manager.ts +++ b/src/services/connection-manager.ts @@ -6,6 +6,7 @@ import { Harmony } from '../chains/harmony/harmony'; import { Polygon } from '../chains/polygon/polygon'; import { Xdc } from '../chains/xdc/xdc'; import { Tezos } from '../chains/tezos/tezos'; +import { Osmosis } from '../chains/osmosis/osmosis'; import { XRPL, XRPLish } from '../chains/xrpl/xrpl'; import { MadMeerkat } from '../connectors/mad_meerkat/mad_meerkat'; import { Openocean } from '../connectors/openocean/openocean'; @@ -53,7 +54,8 @@ export type ChainUnion = | Xdcish | Tezosish | XRPLish - | Kujira; + | Kujira + | Osmosis;; export type Chain = T extends Algorand ? Algorand @@ -71,6 +73,8 @@ export type Chain = T extends Algorand ? XRPLish : T extends KujiraCLOB ? KujiraCLOB + : T extends Osmosis + ? Osmosis : never; export class UnsupportedChainException extends Error { @@ -122,6 +126,8 @@ export async function getChainInstance( connection = Cronos.getInstance(network); } else if (chain === 'cosmos') { connection = Cosmos.getInstance(network); + } else if (chain === 'osmosis') { + connection = Osmosis.getInstance(network); } else if (chain === 'near') { connection = Near.getInstance(network); } else if (chain === 'binance-smart-chain') { diff --git a/src/services/error-handler.ts b/src/services/error-handler.ts index 24e986db7a..f07e2eb06a 100644 --- a/src/services/error-handler.ts +++ b/src/services/error-handler.ts @@ -104,6 +104,10 @@ export const ACCOUNT_NOT_SPECIFIED_CODE = 1016; export const TRADE_NOT_FOUND_ERROR_CODE = 1017; export const UNKNOWN_ERROR_ERROR_CODE = 1099; export const AMOUNT_NOT_SUPPORTED_ERROR_CODE = 1016; +export const ENDPOINT_NOT_SUPPORTED_ERROR_CODE = 1018; +export const INSUFFICIENT_FUNDS_ERROR_CODE = 1019; +export const GAS_LIMIT_EXCEEDED_ERROR_CODE = 1020; +export const AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_CODE = 1021; export const NETWORK_ERROR_MESSAGE = 'Network error. Please check your node URL, API key, and Internet connection.'; @@ -117,6 +121,10 @@ export const INCOMPLETE_REQUEST_PARAM = 'Incomplete request parameters.'; export const INVALID_NONCE_ERROR_MESSAGE = 'Invalid Nonce provided: '; export const AMOUNT_NOT_SUPPORTED_ERROR_MESSAGE = 'Amount provided in an unexpected format'; +export const ENDPOINT_NOT_SUPPORTED_ERROR_MESSAGE = 'Endpoint not supported by this chain/controller.'; +export const INSUFFICIENT_FUNDS_ERROR_MESSAGE = 'Insufficient funds for transaction.' +export const GAS_LIMIT_EXCEEDED_ERROR_MESSAGE = 'Gas limit exceeded (gasWanted greater than gasLimitEstimate).'; +export const AMOUNT_LESS_THAN_MIN_AMOUNT_ERROR_MESSAGE = 'Calculated amount less than min amount provided with slippage. Maybe try increasing slippage. '; export const SWAP_PRICE_EXCEEDS_LIMIT_PRICE_ERROR_MESSAGE = ( price: any, diff --git a/src/services/schema/osmosis-schema.json b/src/services/schema/osmosis-schema.json new file mode 100755 index 0000000000..ebe18b6e56 --- /dev/null +++ b/src/services/schema/osmosis-schema.json @@ -0,0 +1,36 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "networks": { + "type": "object", + "patternProperties": { + "^\\w+$": { + "type": "object", + "properties": { + "nodeURL": { "type": "string" }, + "tokenListType": { "type": "string" }, + "tokenListSource": { "type": "string" }, + "chainId": { "type": "string" } + }, + "required": ["nodeURL", "tokenListType", "tokenListSource", "chainId"], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "network": { "type": "string" }, + "nativeCurrencySymbol": { "type": "string" }, + "feeTier": { + "enum": ["low", "medium", "high"] + }, + "gasAdjustment": { "type": "number" }, + "gasLimitTransaction": { "type": "integer" }, + "manualGasPrice": { "type": "number" }, + "manualGasPriceToken": { "type": "string" }, + "allowedSlippage": { "type": "string" }, + "useEIP1559DynamicBaseFeeInsteadOfManualGasPrice": { "type": "boolean" }, + "rpcAddressDynamicBaseFee": { "type": "string" } + }, + "additionalProperties": false +} diff --git a/src/services/wallet/wallet.controllers.ts b/src/services/wallet/wallet.controllers.ts index b666eb6e58..e6c23dbfe0 100644 --- a/src/services/wallet/wallet.controllers.ts +++ b/src/services/wallet/wallet.controllers.ts @@ -34,6 +34,7 @@ import { } from '../connection-manager'; import { Ethereumish, Tezosish } from '../common-interfaces'; import { Algorand } from '../../chains/algorand/algorand'; +import { Osmosis } from '../../chains/osmosis/osmosis'; export function convertXdcAddressToEthAddress(publicKey: string): string { return publicKey.length === 43 && publicKey.slice(0, 3) === 'xdc' @@ -112,6 +113,16 @@ export async function addWallet( req.privateKey, passphrase ); + } else if (connection instanceof Osmosis) { + const wallet = await (connection as Osmosis).getAccountsfromPrivateKey( + req.privateKey, + 'osmo' + ); + address = wallet.address; + encryptedPrivateKey = await (connection as Osmosis).encrypt( + req.privateKey, + passphrase + ); } else if (connection instanceof Near) { address = ( await connection.getWalletFromPrivateKey( diff --git a/src/services/wallet/wallet.validators.ts b/src/services/wallet/wallet.validators.ts index aed3ee0420..d58a0db605 100644 --- a/src/services/wallet/wallet.validators.ts +++ b/src/services/wallet/wallet.validators.ts @@ -108,6 +108,11 @@ export const validatePrivateKey: Validator = mkSelectingValidator( invalidCosmosPrivateKeyError, (val) => typeof val === 'string' && isCosmosPrivateKey(val) ), + osmosis: mkValidator( + 'privateKey', + invalidCosmosPrivateKeyError, + (val) => typeof val === 'string' && isCosmosPrivateKey(val) + ), polygon: mkValidator( 'privateKey', invalidEthPrivateKeyError, @@ -142,7 +147,7 @@ export const validatePrivateKey: Validator = mkSelectingValidator( ); export const invalidChainError: string = - 'chain must be "ethereum", "avalanche", "near", "harmony", "cosmos", "binance-smart-chain", "kujira"'; + 'chain must be "ethereum", "avalanche", "near", "harmony", "cosmos", "osmosis", "binance-smart-chain", or "kujira"'; export const invalidNetworkError: string = 'expected a string for the network key'; @@ -168,6 +173,7 @@ export const validateChain: Validator = mkValidator( val === 'harmony' || val === 'cronos' || val === 'cosmos' || + val === 'osmosis' || val === 'binance-smart-chain' || val === 'tezos' || val === 'xrpl' || diff --git a/src/templates/lists/osmo-test-5-assetlist.json b/src/templates/lists/osmo-test-5-assetlist.json new file mode 100644 index 0000000000..bc5a1936f8 --- /dev/null +++ b/src/templates/lists/osmo-test-5-assetlist.json @@ -0,0 +1,508 @@ +{ + "chain_name": "osmosistestnet5", + "assets": [ + { + "description": "The native token of Osmosis", + "denom_units": [ + { + "denom": "uosmo", + "exponent": 0, + "aliases": [] + }, + { + "denom": "osmo", + "exponent": 6, + "aliases": [] + } + ], + "base": "uosmo", + "name": "Osmosis", + "display": "osmo", + "symbol": "OSMO", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/osmo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/osmo.svg" + }, + "coingecko_id": "osmosis", + "keywords": [ + "dex", + "staking", + "osmosis-info", + "osmosis-price:ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE:5" + ] + }, + { + "denom_units": [ + { + "denom": "uion", + "exponent": 0 + }, + { + "denom": "ion", + "exponent": 6 + } + ], + "base": "uion", + "name": "Ion", + "display": "ion", + "symbol": "ION", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/ion.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/ion.svg" + }, + "coingecko_id": "ion", + "keywords": [ + "memecoin", + "osmosis-info", + "osmosis-price:uosmo:1" + ] + }, + { + "description": "The native staking and governance token of the Theta testnet version of the Cosmos Hub.", + "denom_units": [ + { + "denom": "ibc/A8C2D23A1E6F95DA4E48BA349667E322BD7A6C996D8A4AAE8BA72E190F3D1477", + "exponent": 0, + "aliases": [ + "uatom" + ] + }, + { + "denom": "atom", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/A8C2D23A1E6F95DA4E48BA349667E322BD7A6C996D8A4AAE8BA72E190F3D1477", + "name": "Cosmos", + "display": "atom", + "symbol": "ATOM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "cosmoshubtestnet", + "base_denom": "uatom", + "channel_id": "channel-2500" + }, + "chain": { + "channel_id": "channel-12", + "path": "transfer/channel-12/uatom" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cosmoshub/images/atom.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cosmoshub/images/atom.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:12" + ] + }, + { + "description": "Circle's stablecoin on Axelar", + "denom_units": [ + { + "denom": "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE", + "exponent": 0, + "aliases": [ + "uausdc" + ] + }, + { + "denom": "ausdc", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE", + "name": "USD Coin", + "display": "ausdc", + "symbol": "aUSDC", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Circle" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereumtestnet", + "base_denom": "0x254d06f33bDc5b8ee05b2ea472107E300226659A" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelartestnet", + "base_denom": "uausdc", + "channel_id": "channel-227" + }, + "chain": { + "channel_id": "channel-3", + "path": "transfer/channel-3/uausdc" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/axelar/images/usdc.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/axelar/images/usdc.svg" + }, + "coingecko_id": "usd-coin", + "keywords": [ + "osmosis-info" + ] + }, + { + "description": "The native token of JUNO Chain", + "denom_units": [ + { + "denom": "ibc/8E2FEFCBD754FA3C97411F0126B9EC76191BAA1B3959CB73CECF396A4037BBF0", + "exponent": 0, + "aliases": [ + "ujunox" + ] + }, + { + "denom": "junox", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/8E2FEFCBD754FA3C97411F0126B9EC76191BAA1B3959CB73CECF396A4037BBF0", + "name": "Juno Testnet", + "display": "junox", + "symbol": "JUNOX", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "junotestnet", + "base_denom": "ujunox", + "channel_id": "channel-190" + }, + "chain": { + "channel_id": "channel-1", + "path": "transfer/channel-1/ujunox" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/junotestnet/images/juno.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/junotestnet/images/juno.svg" + }, + "coingecko_id": "juno-network", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:3" + ] + }, + { + "description": "The native token of Mars Protocol", + "denom_units": [ + { + "denom": "ibc/2E7368A14AC9AB7870F32CFEA687551C5064FA861868EDF7437BC877358A81F9", + "exponent": 0, + "aliases": [ + "umars" + ] + }, + { + "denom": "mars", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/2E7368A14AC9AB7870F32CFEA687551C5064FA861868EDF7437BC877358A81F9", + "name": "Mars", + "display": "mars", + "symbol": "MARS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "marstestnet", + "base_denom": "umars", + "channel_id": "channel-14" + }, + "chain": { + "channel_id": "channel-24", + "path": "transfer/channel-24/umars" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/mars/images/mars-token.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/mars/images/mars-token.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:10" + ] + }, + { + "description": "USD Coin", + "denom_units": [ + { + "denom": "ibc/40F1B2458AEDA66431F9D44F48413240B8D28C072463E2BF53655728683583E3", + "exponent": 0, + "aliases": [ + "microusdc", + "uusdc" + ] + }, + { + "denom": "usdc", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/40F1B2458AEDA66431F9D44F48413240B8D28C072463E2BF53655728683583E3", + "name": "USD Coin", + "display": "usdc", + "symbol": "USDC", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Circle" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "nobletestnet", + "base_denom": "uusdc", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-123", + "path": "transfer/channel-123/uusdc" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/usdc.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE:46" + ] + }, + { + "description": "Akash Token (AKT) is the Akash Network's native utility token, used as the primary means to govern, secure the blockchain, incentivize participants, and provide a default mechanism to store and exchange value.", + "denom_units": [ + { + "denom": "ibc/33C17B7D6A37726CA8DD4A4036198916F79A3A4D661B054AA2E8C92809907C58", + "exponent": 0, + "aliases": [ + "uakt" + ] + }, + { + "denom": "akt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/33C17B7D6A37726CA8DD4A4036198916F79A3A4D661B054AA2E8C92809907C58", + "name": "Akash Network", + "display": "akt", + "symbol": "AKT", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "akashtestnet", + "base_denom": "uakt", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-899", + "path": "transfer/channel-899/uakt" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/akash/images/akt.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/akash/images/akt.svg" + } + }, + { + "description": "The native utility token of the Kaon testnet version of KYVE.", + "denom_units": [ + { + "denom": "ibc/AB8AF05799E299FB5C5C80781DA35887F53E029745D20E5641233DB4E6B28515", + "exponent": 0, + "aliases": [ + "tkyve" + ] + }, + { + "denom": "kyve", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/AB8AF05799E299FB5C5C80781DA35887F53E029745D20E5641233DB4E6B28515", + "name": "KYVE", + "display": "kyve", + "symbol": "KYVE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kyvetestnet", + "base_denom": "tkyve", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-10", + "path": "transfer/channel-10/tkyve" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/kyvetestnet/images/kyve.svg" + }, + "keywords": [ + "osmosis-price:uosmo:4" + ] + }, + { + "description": "QCK - native token of Quicksilver", + "denom_units": [ + { + "denom": "ibc/F37CF69589DE12342758382F8770C0852CD8D2E4519F55166EBDAF472AD667C9", + "exponent": 0, + "aliases": [ + "uqck" + ] + }, + { + "denom": "qck", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "base": "ibc/F37CF69589DE12342758382F8770C0852CD8D2E4519F55166EBDAF472AD667C9", + "name": "Quicksilver", + "display": "qck", + "symbol": "QCK", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "quicksilvertestnet", + "base_denom": "uqck", + "channel_id": "channel-20" + }, + "chain": { + "channel_id": "channel-13", + "path": "transfer/channel-13/uqck" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qck.png" + }, + "coingecko_id": "quicksilver", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:34" + ] + }, + { + "description": "The native token of Chain4Energy", + "denom_units": [ + { + "denom": "ibc/E3D323CB6F427C49E56F913C853A416F6B71BAA9B0164625AD0203266F92B3ED", + "exponent": 0, + "aliases": [ + "uc4e" + ] + }, + { + "denom": "c4e", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/E3D323CB6F427C49E56F913C853A416F6B71BAA9B0164625AD0203266F92B3ED", + "name": "Chain4Energy", + "display": "c4e", + "symbol": "C4E", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "chain4energytestnet", + "base_denom": "uc4e", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-111", + "path": "transfer/channel-111/uc4e" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/chain4energytestnet/images/c4e.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/6F34E1BD664C36CE49ACC28E60D62559A5F96C4F9A6CCE4FC5A67B2852E24CFE:40" + ] + }, + { + "description": "The native staking and governance token of the Composable testnet.", + "denom_units": [ + { + "denom": "ibc/27689601842A99059DFD79EB0A34A089FC2F7337491B5555C176400A8FA7F2A4", + "exponent": 0, + "aliases": [ + "ppica" + ] + }, + { + "denom": "pica", + "exponent": 12 + } + ], + "type_asset": "ics20", + "base": "ibc/27689601842A99059DFD79EB0A34A089FC2F7337491B5555C176400A8FA7F2A4", + "name": "Pica", + "display": "pica", + "symbol": "PICA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "composabletestnet", + "base_denom": "ppica", + "channel_id": "channel-11" + }, + "chain": { + "channel_id": "channel-329", + "path": "transfer/channel-329/ppica" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/composable/images/composable.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/composable/images/composable.svg" + } + } + ] + } \ No newline at end of file diff --git a/src/templates/lists/osmosis-1.assetlist.json b/src/templates/lists/osmosis-1.assetlist.json new file mode 100644 index 0000000000..3cb63efa54 --- /dev/null +++ b/src/templates/lists/osmosis-1.assetlist.json @@ -0,0 +1,13338 @@ +{ + "chain_name": "osmosis", + "assets": [ + { + "description": "The native token of Osmosis", + "denom_units": [ + { + "denom": "uosmo", + "exponent": 0 + }, + { + "denom": "osmo", + "exponent": 6 + } + ], + "base": "uosmo", + "name": "Osmosis", + "display": "osmo", + "symbol": "OSMO", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/osmo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/osmo.svg" + }, + "coingecko_id": "osmosis", + "keywords": [ + "dex", + "staking", + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1221" + ] + }, + { + "denom_units": [ + { + "denom": "uion", + "exponent": 0 + }, + { + "denom": "ion", + "exponent": 6 + } + ], + "base": "uion", + "name": "Ion DAO", + "display": "ion", + "symbol": "ION", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/ion.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/ion.svg" + }, + "coingecko_id": "ion", + "keywords": [ + "memecoin", + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:2" + ] + }, + { + "description": "Circle's stablecoin on Axelar", + "denom_units": [ + { + "denom": "ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858", + "exponent": 0, + "aliases": [ + "uusdc" + ] + }, + { + "denom": "usdc", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858", + "name": "USD Coin", + "display": "usdc", + "symbol": "USDC.axl", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Circle" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "uusdc", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/uusdc" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/usdc.axl.svg", + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/usdc.axl.png" + }, + "coingecko_id": "axlusdc", + "keywords": [ + "osmosis-main", + "osmosis-info", + "peg:collateralized" + ] + }, + { + "description": "Ethereum (ETH) is a decentralized, open-source blockchain system featuring smart contract functionality. It's the native cryptocurrency of the Ethereum platform, often regarded as the second most popular digital currency after Bitcoin. Ethereum was proposed in late 2013 and development was crowdfunded in 2014, leading to its network going live on 30 July 2015.\n\nETH, as a digital currency, is used for a variety of purposes within the Ethereum ecosystem, including the execution of decentralized smart contracts and as a mode of payment. Unlike Bitcoin, Ethereum was designed to be a platform for applications that can operate without the need for intermediaries, using blockchain technology. This has made Ethereum a leading platform for various applications, including decentralized finance (DeFi), non-fungible tokens (NFTs), and more. Ethereum is constantly evolving, with a significant upgrade termed Ethereum 2.0, which aims to improve its scalability, security, and sustainability.", + "denom_units": [ + { + "denom": "ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5", + "exponent": 0, + "aliases": [ + "weth-wei" + ] + }, + { + "denom": "weth", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5", + "name": "Ether", + "display": "weth", + "symbol": "ETH", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Ethereum" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "weth-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/weth-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/eth-white.png" + }, + "coingecko_id": "ethereum", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1134" + ] + }, + { + "description": "Wrapped Bitcoin on Axelar", + "denom_units": [ + { + "denom": "ibc/D1542AA8762DB13087D8364F3EA6509FD6F009A34F00426AF9E4F9FA85CBBF1F", + "exponent": 0, + "aliases": [ + "wbtc-satoshi" + ] + }, + { + "denom": "wbtc", + "exponent": 8 + } + ], + "type_asset": "ics20", + "base": "ibc/D1542AA8762DB13087D8364F3EA6509FD6F009A34F00426AF9E4F9FA85CBBF1F", + "name": "Wrapped Bitcoin", + "display": "wbtc", + "symbol": "WBTC.axl", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "bitcoin", + "base_denom": "sat" + }, + "provider": "BitGo, Kyber, and Ren" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "wbtc-satoshi", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/wbtc-satoshi" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/wbtc.axl.svg", + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/wbtc.axl.png" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1090" + ] + }, + { + "description": "Tether's USD stablecoin on Axelar", + "denom_units": [ + { + "denom": "ibc/8242AD24008032E457D2E12D46588FD39FB54FB29680C6C7663D296B383C37C4", + "exponent": 0, + "aliases": [ + "uusdt" + ] + }, + { + "denom": "usdt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/8242AD24008032E457D2E12D46588FD39FB54FB29680C6C7663D296B383C37C4", + "name": "Tether USD", + "display": "usdt", + "symbol": "USDT.axl", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Tether" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "uusdt", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/uusdt" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/usdt.axl.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB:1150", + "peg:collateralized" + ] + }, + { + "description": "Multi-Collateral Dai, brings a lot of new and exciting features, such as support for new CDP collateral types and Dai Savings Rate.", + "denom_units": [ + { + "denom": "ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7", + "exponent": 0, + "aliases": [ + "dai-wei" + ] + }, + { + "denom": "dai", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7", + "name": "Dai Stablecoin", + "display": "dai", + "symbol": "DAI", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "MakerDAO" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x6b175474e89094c44da98b954eedeac495271d0f" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "dai-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/dai-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/dai.svg" + }, + "coingecko_id": "dai", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1260", + "peg:collateralized" + ] + }, + { + "description": "Binance USD (BUSD) is a dollar-backed stablecoin issued and custodied by Paxos Trust Company, and regulated by the New York State Department of Financial Services. BUSD is available directly for sale 1:1 with USD on Paxos.com and will be listed for trading on Binance.", + "denom_units": [ + { + "denom": "ibc/6329DD8CF31A334DD5BE3F68C846C9FE313281362B37686A62343BAC1EB1546D", + "exponent": 0, + "aliases": [ + "busd-wei" + ] + }, + { + "denom": "busd", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/6329DD8CF31A334DD5BE3F68C846C9FE313281362B37686A62343BAC1EB1546D", + "name": "Binance USD", + "display": "busd", + "symbol": "BUSD", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Binance" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x4fabb145d64652a948d72533023f6e7a623c7c53" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "busd-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/busd-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/busd.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/busd.svg" + }, + "coingecko_id": "binance-usd", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:877" + ] + }, + { + "description": "The native staking and governance token of the Cosmos Hub.", + "denom_units": [ + { + "denom": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + "exponent": 0, + "aliases": [ + "uatom" + ] + }, + { + "denom": "atom", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + "name": "Cosmos Hub", + "display": "atom", + "symbol": "ATOM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "cosmoshub", + "base_denom": "uatom", + "channel_id": "channel-141" + }, + "chain": { + "channel_id": "channel-0", + "path": "transfer/channel-0/uatom" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cosmoshub/images/atom.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cosmoshub/images/atom.svg" + }, + "coingecko_id": "cosmos", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1265" + ] + }, + { + "description": "CRO is the native token of the Crypto.org Chain, referred to as Native CRO.", + "denom_units": [ + { + "denom": "ibc/E6931F78057F7CC5DA0FD6CEF82FF39373A6E0452BF1FD76910B93292CF356C1", + "exponent": 0, + "aliases": [ + "basecro" + ] + }, + { + "denom": "cro", + "exponent": 8 + } + ], + "type_asset": "ics20", + "base": "ibc/E6931F78057F7CC5DA0FD6CEF82FF39373A6E0452BF1FD76910B93292CF356C1", + "name": "Cronos POS Chain", + "display": "cro", + "symbol": "CRO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "cryptoorgchain", + "base_denom": "basecro", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-5", + "path": "transfer/channel-5/basecro" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cronos/images/cro.svg" + }, + "coingecko_id": "crypto-com-chain", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:9" + ] + }, + { + "description": "BNB powers the BNB Chain ecosystem and is the native coin of the BNB Beacon Chain and BNB Smart Chain.", + "denom_units": [ + { + "denom": "ibc/F4A070A6D78496D53127EA85C094A9EC87DFC1F36071B8CCDDBD020F933D213D", + "exponent": 0, + "aliases": [ + "wbnb-wei" + ] + }, + { + "denom": "wbnb", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/F4A070A6D78496D53127EA85C094A9EC87DFC1F36071B8CCDDBD020F933D213D", + "name": "Binance Coin", + "display": "wbnb", + "symbol": "BNB", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "binancesmartchain", + "base_denom": "wei" + }, + "chain": { + "contract": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c" + }, + "provider": "Binance" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "binancesmartchain", + "base_denom": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "wbnb-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/wbnb-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/binancesmartchain/images/bnb.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/binancesmartchain/images/bnb.svg" + }, + "coingecko_id": "binancecoin", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:840" + ] + }, + { + "description": "Polygon (formerly Matic) Network brings massive scale to Ethereum using an adapted version of Plasma with PoS based side chains. Polygon is a well-structured, easy-to-use platform for Ethereum scaling and infrastructure development.", + "denom_units": [ + { + "denom": "ibc/AB589511ED0DD5FA56171A39978AFBF1371DB986EC1C3526CE138A16377E39BB", + "exponent": 0, + "aliases": [ + "wmatic-wei" + ] + }, + { + "denom": "wmatic", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/AB589511ED0DD5FA56171A39978AFBF1371DB986EC1C3526CE138A16377E39BB", + "name": "Polygon", + "display": "wmatic", + "symbol": "MATIC", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "polygon", + "base_denom": "wei" + }, + "provider": "Polygon" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "polygon", + "base_denom": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "wmatic-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/wmatic-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/polygon/images/matic-purple.png" + }, + "coingecko_id": "matic-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:789" + ] + }, + { + "description": "AVAX is the native token of Avalanche. It is a hard-capped, scarce asset that is used to pay for fees, secure the platform through staking, and provide a basic unit of account between the multiple subnets created on Avalanche.", + "denom_units": [ + { + "denom": "ibc/6F62F01D913E3FFE472A38C78235B8F021B511BC6596ADFF02615C8F83D3B373", + "exponent": 0, + "aliases": [ + "wavax-wei" + ] + }, + { + "denom": "avax", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/6F62F01D913E3FFE472A38C78235B8F021B511BC6596ADFF02615C8F83D3B373", + "name": "Avalanche", + "display": "avax", + "symbol": "AVAX", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "avalanche", + "base_denom": "wei" + }, + "provider": "Avalanche" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "avalanche", + "base_denom": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "wavax-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/wavax-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/avalanche/images/avax.png" + }, + "coingecko_id": "avalanche-2", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:899" + ] + }, + { + "description": "The native staking token of Terra Classic.", + "denom_units": [ + { + "denom": "ibc/0EF15DF2F02480ADE0BB6E85D9EBB5DAEA2836D3860E9F97F9AADE4F57A31AA0", + "exponent": 0, + "aliases": [ + "microluna", + "uluna" + ] + }, + { + "denom": "mluna", + "exponent": 3, + "aliases": [ + "milliluna" + ] + }, + { + "denom": "luna", + "exponent": 6, + "aliases": [ + "lunc" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/0EF15DF2F02480ADE0BB6E85D9EBB5DAEA2836D3860E9F97F9AADE4F57A31AA0", + "name": "Luna Classic", + "display": "luna", + "symbol": "LUNC", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "terra", + "base_denom": "uluna", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-72", + "path": "transfer/channel-72/uluna" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra/images/luna.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra/images/luna.svg" + }, + "coingecko_id": "terra-luna", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:800" + ] + }, + { + "description": "The native token of JUNO Chain", + "denom_units": [ + { + "denom": "ibc/46B44899322F3CD854D2D46DEEF881958467CDD4B3B10086DA49296BBED94BED", + "exponent": 0, + "aliases": [ + "ujuno" + ] + }, + { + "denom": "juno", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/46B44899322F3CD854D2D46DEEF881958467CDD4B3B10086DA49296BBED94BED", + "name": "Juno", + "display": "juno", + "symbol": "JUNO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "juno", + "base_denom": "ujuno", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-42", + "path": "transfer/channel-42/ujuno" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/juno.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/juno.svg" + }, + "coingecko_id": "juno-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:497" + ] + }, + { + "description": "Wrapped Polkadot on Axelar", + "denom_units": [ + { + "denom": "ibc/3FF92D26B407FD61AE95D975712A7C319CDE28DE4D80BDC9978D935932B991D7", + "exponent": 0, + "aliases": [ + "dot-planck" + ] + }, + { + "denom": "dot", + "exponent": 10 + } + ], + "type_asset": "ics20", + "base": "ibc/3FF92D26B407FD61AE95D975712A7C319CDE28DE4D80BDC9978D935932B991D7", + "name": "Wrapped Polkadot", + "display": "dot", + "symbol": "DOT.axl", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "polkadot", + "base_denom": "Planck" + }, + "provider": "Polkadot Parachain" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "moonbeam", + "base_denom": "0xffffffff1fcacbd218edc0eba20fc2308c778080" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "dot-planck", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/dot-planck" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/dot.axl.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1091" + ] + }, + { + "description": "The native EVM, governance and staking token of the Evmos Hub", + "denom_units": [ + { + "denom": "ibc/6AE98883D4D5D5FF9E50D7130F1305DA2FFA0C652D1DD9C123657C6B4EB2DF8A", + "exponent": 0, + "aliases": [ + "aevmos" + ] + }, + { + "denom": "evmos", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/6AE98883D4D5D5FF9E50D7130F1305DA2FFA0C652D1DD9C123657C6B4EB2DF8A", + "name": "Evmos", + "display": "evmos", + "symbol": "EVMOS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "evmos", + "base_denom": "aevmos", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-204", + "path": "transfer/channel-204/aevmos" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/evmos/images/evmos.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/evmos/images/evmos.svg" + }, + "coingecko_id": "evmos", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:722" + ] + }, + { + "description": "The native staking and governance token of Kava", + "denom_units": [ + { + "denom": "ibc/57AA1A70A4BC9769C525EBF6386F7A21536E04A79D62E1981EFCEF9428EBB205", + "exponent": 0, + "aliases": [ + "ukava" + ] + }, + { + "denom": "kava", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/57AA1A70A4BC9769C525EBF6386F7A21536E04A79D62E1981EFCEF9428EBB205", + "name": "Kava", + "display": "kava", + "symbol": "KAVA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kava", + "base_denom": "ukava", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-143", + "path": "transfer/channel-143/ukava" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kava/images/kava.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kava/images/kava.svg" + }, + "coingecko_id": "kava", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1105" + ] + }, + { + "description": "The native token of Secret Network", + "denom_units": [ + { + "denom": "ibc/0954E1C28EB7AF5B72D24F3BC2B47BBB2FDF91BDDFD57B74B99E133AED40972A", + "exponent": 0, + "aliases": [ + "uscrt" + ] + }, + { + "denom": "scrt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/0954E1C28EB7AF5B72D24F3BC2B47BBB2FDF91BDDFD57B74B99E133AED40972A", + "name": "Secret Network", + "display": "scrt", + "symbol": "SCRT", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "uscrt", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-88", + "path": "transfer/channel-88/uscrt" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/scrt.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/scrt.svg" + }, + "coingecko_id": "secret", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:584" + ] + }, + { + "description": "The USD stablecoin of Terra Classic.", + "denom_units": [ + { + "denom": "ibc/BE1BB42D4BE3C30D50B68D7C41DB4DFCE9678E8EF8C539F6E6A9345048894FCC", + "exponent": 0, + "aliases": [ + "microusd", + "uusd" + ] + }, + { + "denom": "musd", + "exponent": 3, + "aliases": [ + "milliusd" + ] + }, + { + "denom": "ust", + "exponent": 6, + "aliases": [ + "ustc" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/BE1BB42D4BE3C30D50B68D7C41DB4DFCE9678E8EF8C539F6E6A9345048894FCC", + "name": "TerraClassicUSD", + "display": "ust", + "symbol": "USTC", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "terra", + "base_denom": "uusd", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-72", + "path": "transfer/channel-72/uusd" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra/images/ust.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra/images/ust.svg" + }, + "coingecko_id": "terrausd", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:560", + "peg:algorithmic" + ] + }, + { + "description": "The native token of Stargaze", + "denom_units": [ + { + "denom": "ibc/987C17B11ABC2B20019178ACE62929FE9840202CE79498E29FE8E5CB02B7C0A4", + "exponent": 0, + "aliases": [ + "ustars" + ] + }, + { + "denom": "stars", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/987C17B11ABC2B20019178ACE62929FE9840202CE79498E29FE8E5CB02B7C0A4", + "name": "Stargaze", + "display": "stars", + "symbol": "STARS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "stargaze", + "base_denom": "ustars", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-75", + "path": "transfer/channel-75/ustars" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stargaze/images/stars.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stargaze/images/stars.svg" + }, + "coingecko_id": "stargaze", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1096" + ] + }, + { + "description": "The native token of Chihuahua Chain", + "denom_units": [ + { + "denom": "ibc/B9E0A1A524E98BB407D3CED8720EFEFD186002F90C1B1B7964811DD0CCC12228", + "exponent": 0, + "aliases": [ + "uhuahua" + ] + }, + { + "denom": "huahua", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/B9E0A1A524E98BB407D3CED8720EFEFD186002F90C1B1B7964811DD0CCC12228", + "name": "Chihuahua", + "display": "huahua", + "symbol": "HUAHUA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "chihuahua", + "base_denom": "uhuahua", + "channel_id": "channel-7" + }, + "chain": { + "channel_id": "channel-113", + "path": "transfer/channel-113/uhuahua" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/chihuahua/images/huahua.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/chihuahua/images/huahua.svg" + }, + "coingecko_id": "chihuahua-token", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1111" + ] + }, + { + "description": "The XPRT token is primarily a governance token for the Persistence chain.", + "denom_units": [ + { + "denom": "ibc/A0CC0CF735BFB30E730C70019D4218A1244FF383503FF7579C9201AB93CA9293", + "exponent": 0, + "aliases": [ + "uxprt" + ] + }, + { + "denom": "xprt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/A0CC0CF735BFB30E730C70019D4218A1244FF383503FF7579C9201AB93CA9293", + "name": "Persistence", + "display": "xprt", + "symbol": "XPRT", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "persistence", + "base_denom": "uxprt", + "channel_id": "channel-6" + }, + "chain": { + "channel_id": "channel-4", + "path": "transfer/channel-4/uxprt" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/persistence/images/xprt.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/persistence/images/xprt.svg" + }, + "coingecko_id": "persistence", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1101" + ] + }, + { + "description": "pSTAKE is a liquid staking protocol unlocking the liquidity of staked assets. Stakers of PoS tokens can stake their assets while maintaining the liquidity of these assets. Users earn staking rewards + receive 1:1 pegged staked representative tokens which can be used to generate additional yield.", + "denom_units": [ + { + "denom": "ibc/8061A06D3BD4D52C4A28FFECF7150D370393AF0BA661C3776C54FF32836C3961", + "exponent": 0, + "aliases": [ + "gravity0xfB5c6815cA3AC72Ce9F5006869AE67f18bF77006", + "0xfB5c6815cA3AC72Ce9F5006869AE67f18bF77006", + "ibc/A6E3AF63B3C906416A9AF7A556C59EA4BD50E617EFFE6299B99700CCB780E444" + ] + }, + { + "denom": "pstake", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/8061A06D3BD4D52C4A28FFECF7150D370393AF0BA661C3776C54FF32836C3961", + "name": "pSTAKE Finance", + "display": "pstake", + "symbol": "PSTAKE", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "persistence", + "base_denom": "uxprt" + }, + "provider": "Persistence" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xfB5c6815cA3AC72Ce9F5006869AE67f18bF77006" + }, + "provider": "Gravity Bridge" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gravitybridge", + "base_denom": "gravity0xfB5c6815cA3AC72Ce9F5006869AE67f18bF77006", + "channel_id": "channel-24" + }, + "chain": { + "channel_id": "channel-38", + "path": "transfer/channel-38/gravity0xfB5c6815cA3AC72Ce9F5006869AE67f18bF77006" + } + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "persistence", + "base_denom": "ibc/A6E3AF63B3C906416A9AF7A556C59EA4BD50E617EFFE6299B99700CCB780E444", + "channel_id": "channel-6" + }, + "chain": { + "channel_id": "channel-4", + "path": "transfer/channel-4/transfer/channel-38/gravity0xfB5c6815cA3AC72Ce9F5006869AE67f18bF77006" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/persistence/images/pstake.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/persistence/images/pstake.svg" + }, + "coingecko_id": "pstake-finance", + "keywords": [ + "canon", + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:648" + ] + }, + { + "description": "Akash Token (AKT) is the Akash Network's native utility token, used as the primary means to govern, secure the blockchain, incentivize participants, and provide a default mechanism to store and exchange value.", + "denom_units": [ + { + "denom": "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", + "exponent": 0, + "aliases": [ + "uakt" + ] + }, + { + "denom": "akt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", + "name": "Akash", + "display": "akt", + "symbol": "AKT", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "akash", + "base_denom": "uakt", + "channel_id": "channel-9" + }, + "chain": { + "channel_id": "channel-1", + "path": "transfer/channel-1/uakt" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/akash/images/akt.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/akash/images/akt.svg" + }, + "coingecko_id": "akash-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1093" + ] + }, + { + "description": "REGEN coin is the token for the Regen Network Platform", + "denom_units": [ + { + "denom": "ibc/1DCC8A6CB5689018431323953344A9F6CC4D0BFB261E88C9F7777372C10CD076", + "exponent": 0, + "aliases": [ + "uregen" + ] + }, + { + "denom": "regen", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/1DCC8A6CB5689018431323953344A9F6CC4D0BFB261E88C9F7777372C10CD076", + "name": "Regen", + "display": "regen", + "symbol": "REGEN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "regen", + "base_denom": "uregen", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-8", + "path": "transfer/channel-8/uregen" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/regen/images/regen.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/regen/images/regen.svg" + }, + "coingecko_id": "regen", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:42" + ] + }, + { + "description": "DVPN is the native token of the Sentinel Hub.", + "denom_units": [ + { + "denom": "ibc/9712DBB13B9631EDFA9BF61B55F1B2D290B2ADB67E3A4EB3A875F3B6081B3B84", + "exponent": 0, + "aliases": [ + "udvpn" + ] + }, + { + "denom": "dvpn", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/9712DBB13B9631EDFA9BF61B55F1B2D290B2ADB67E3A4EB3A875F3B6081B3B84", + "name": "Sentinel", + "display": "dvpn", + "symbol": "DVPN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "sentinel", + "base_denom": "udvpn", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-2", + "path": "transfer/channel-2/udvpn" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sentinel/images/dvpn.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sentinel/images/dvpn.svg" + }, + "coingecko_id": "sentinel", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:6" + ] + }, + { + "description": "The IRIS token is the native governance token for the IrisNet chain.", + "denom_units": [ + { + "denom": "ibc/7C4D60AA95E5A7558B0A364860979CA34B7FF8AAF255B87AF9E879374470CEC0", + "exponent": 0, + "aliases": [ + "uiris" + ] + }, + { + "denom": "iris", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/7C4D60AA95E5A7558B0A364860979CA34B7FF8AAF255B87AF9E879374470CEC0", + "name": "IRISnet", + "display": "iris", + "symbol": "IRIS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "irisnet", + "base_denom": "uiris", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-6", + "path": "transfer/channel-6/uiris" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/irisnet/images/iris.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/irisnet/images/iris.svg" + }, + "coingecko_id": "iris-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1106" + ] + }, + { + "description": "IOV coin is the token for the Starname (IOV) Asset Name Service", + "denom_units": [ + { + "denom": "ibc/52B1AA623B34EB78FD767CEA69E8D7FA6C9CFE1FBF49C5406268FD325E2CC2AC", + "exponent": 0, + "aliases": [ + "uiov" + ] + }, + { + "denom": "iov", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/52B1AA623B34EB78FD767CEA69E8D7FA6C9CFE1FBF49C5406268FD325E2CC2AC", + "name": "Starname", + "display": "iov", + "symbol": "IOV", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "starname", + "base_denom": "uiov", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-15", + "path": "transfer/channel-15/uiov" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/starname/images/iov.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/starname/images/iov.svg" + }, + "coingecko_id": "starname", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:197" + ] + }, + { + "description": "e-Money NGM staking token. In addition to earning staking rewards the token is bought back and burned based on e-Money stablecoin inflation.", + "denom_units": [ + { + "denom": "ibc/1DC495FCEFDA068A3820F903EDBD78B942FBD204D7E93D3BA2B432E9669D1A59", + "exponent": 0, + "aliases": [ + "ungm" + ] + }, + { + "denom": "ngm", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/1DC495FCEFDA068A3820F903EDBD78B942FBD204D7E93D3BA2B432E9669D1A59", + "name": "e-Money", + "display": "ngm", + "symbol": "NGM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "emoney", + "base_denom": "ungm", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-37", + "path": "transfer/channel-37/ungm" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/emoney/images/ngm.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/emoney/images/ngm.svg" + }, + "coingecko_id": "e-money", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:463" + ] + }, + { + "description": "e-Money EUR stablecoin. Audited and backed by fiat EUR deposits and government bonds.", + "denom_units": [ + { + "denom": "ibc/5973C068568365FFF40DEDCF1A1CB7582B6116B731CD31A12231AE25E20B871F", + "exponent": 0, + "aliases": [ + "eeur" + ] + }, + { + "denom": "eur", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/5973C068568365FFF40DEDCF1A1CB7582B6116B731CD31A12231AE25E20B871F", + "name": "e-Money EUR", + "display": "eur", + "symbol": "EEUR", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "emoney", + "base_denom": "eeur", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-37", + "path": "transfer/channel-37/eeur" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/emoney/images/eeur.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/emoney/images/eeur.svg" + }, + "coingecko_id": "e-money-eur", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:481" + ] + }, + { + "description": "LIKE is the native staking and governance token of LikeCoin chain, a Decentralized Publishing Infrastructure to empower content ownership, authenticity, and provenance.", + "denom_units": [ + { + "denom": "ibc/9989AD6CCA39D1131523DB0617B50F6442081162294B4795E26746292467B525", + "exponent": 0, + "aliases": [ + "nanolike" + ] + }, + { + "denom": "like", + "exponent": 9 + } + ], + "type_asset": "ics20", + "base": "ibc/9989AD6CCA39D1131523DB0617B50F6442081162294B4795E26746292467B525", + "name": "LikeCoin", + "display": "like", + "symbol": "LIKE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "likecoin", + "base_denom": "nanolike", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-53", + "path": "transfer/channel-53/nanolike" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/likecoin/images/like.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/likecoin/images/like.svg" + }, + "coingecko_id": "likecoin", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:553" + ] + }, + { + "description": "The native token of IXO Chain", + "denom_units": [ + { + "denom": "ibc/F3FF7A84A73B62921538642F9797C423D2B4C4ACB3C7FCFFCE7F12AA69909C4B", + "exponent": 0, + "aliases": [ + "uixo" + ] + }, + { + "denom": "ixo", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/F3FF7A84A73B62921538642F9797C423D2B4C4ACB3C7FCFFCE7F12AA69909C4B", + "name": "ixo", + "display": "ixo", + "symbol": "IXO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "impacthub", + "base_denom": "uixo", + "channel_id": "channel-4" + }, + "chain": { + "channel_id": "channel-38", + "path": "transfer/channel-38/uixo" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/impacthub/images/ixo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/impacthub/images/ixo.svg" + }, + "coingecko_id": "ixo", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:558" + ] + }, + { + "description": "The BCNA coin is the transactional token within the BitCanna network, serving the legal cannabis industry through its payment network, supply chain and trust network.", + "denom_units": [ + { + "denom": "ibc/D805F1DA50D31B96E4282C1D4181EDDFB1A44A598BFF5666F4B43E4B8BEA95A5", + "exponent": 0, + "aliases": [ + "ubcna" + ] + }, + { + "denom": "bcna", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/D805F1DA50D31B96E4282C1D4181EDDFB1A44A598BFF5666F4B43E4B8BEA95A5", + "name": "BitCanna", + "display": "bcna", + "symbol": "BCNA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bitcanna", + "base_denom": "ubcna", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-51", + "path": "transfer/channel-51/ubcna" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bitcanna/images/bcna.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bitcanna/images/bcna.svg" + }, + "coingecko_id": "bitcanna", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:571" + ] + }, + { + "description": "BitSong Native Token", + "denom_units": [ + { + "denom": "ibc/4E5444C35610CC76FC94E7F7886B93121175C28262DDFDDE6F84E82BF2425452", + "exponent": 0, + "aliases": [ + "ubtsg" + ] + }, + { + "denom": "btsg", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/4E5444C35610CC76FC94E7F7886B93121175C28262DDFDDE6F84E82BF2425452", + "name": "BitSong", + "display": "btsg", + "symbol": "BTSG", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bitsong", + "base_denom": "ubtsg", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-73", + "path": "transfer/channel-73/ubtsg" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bitsong/images/btsg.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bitsong/images/btsg.svg" + }, + "coingecko_id": "bitsong", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1109" + ] + }, + { + "description": "The native token of Ki Chain", + "denom_units": [ + { + "denom": "ibc/B547DC9B897E7C3AA5B824696110B8E3D2C31E3ED3F02FF363DCBAD82457E07E", + "exponent": 0, + "aliases": [ + "uxki" + ] + }, + { + "denom": "xki", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/B547DC9B897E7C3AA5B824696110B8E3D2C31E3ED3F02FF363DCBAD82457E07E", + "name": "Ki", + "display": "xki", + "symbol": "XKI", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kichain", + "base_denom": "uxki", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-77", + "path": "transfer/channel-77/uxki" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kichain/images/xki.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kichain/images/xki.svg" + }, + "coingecko_id": "ki", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:577" + ] + }, + { + "description": "Panacea is a public blockchain launched by MediBloc, which is the key infrastructure for reinventing the patient-centered healthcare data ecosystem", + "denom_units": [ + { + "denom": "ibc/3BCCC93AD5DF58D11A6F8A05FA8BC801CBA0BA61A981F57E91B8B598BF8061CB", + "exponent": 0, + "aliases": [ + "umed" + ] + }, + { + "denom": "med", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/3BCCC93AD5DF58D11A6F8A05FA8BC801CBA0BA61A981F57E91B8B598BF8061CB", + "name": "Medibloc", + "display": "med", + "symbol": "MED", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "panacea", + "base_denom": "umed", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-82", + "path": "transfer/channel-82/umed" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/panacea/images/med.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/panacea/images/med.svg" + }, + "coingecko_id": "medibloc", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:586" + ] + }, + { + "description": "The staking token of Bostrom", + "denom_units": [ + { + "denom": "ibc/FE2CD1E6828EC0FAB8AF39BAC45BC25B965BA67CCBC50C13A14BD610B0D1E2C4", + "exponent": 0, + "aliases": [ + "boot", + "boot" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/FE2CD1E6828EC0FAB8AF39BAC45BC25B965BA67CCBC50C13A14BD610B0D1E2C4", + "name": "bostrom", + "display": "boot", + "symbol": "BOOT", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bostrom", + "base_denom": "boot", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-95", + "path": "transfer/channel-95/boot" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/boot.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/boot.svg" + }, + "coingecko_id": "bostrom", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/75345531D87BD90BF108BE7240BD721CB2CB0A1F16D4EBA71B09EC3C43E15C8F:1306" + ] + }, + { + "description": "Native Token of Comdex Protocol", + "denom_units": [ + { + "denom": "ibc/EA3E1640F9B1532AB129A571203A0B9F789A7F14BB66E350DCBFA18E1A1931F0", + "exponent": 0, + "aliases": [ + "ucmdx" + ] + }, + { + "denom": "cmdx", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/EA3E1640F9B1532AB129A571203A0B9F789A7F14BB66E350DCBFA18E1A1931F0", + "name": "Comdex", + "display": "cmdx", + "symbol": "CMDX", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "comdex", + "base_denom": "ucmdx", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-87", + "path": "transfer/channel-87/ucmdx" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/comdex/images/cmdx.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/comdex/images/cmdx.svg" + }, + "coingecko_id": "comdex", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:601" + ] + }, + { + "description": "Native token for the cheqd network", + "denom_units": [ + { + "denom": "ibc/7A08C6F11EF0F59EB841B9F788A87EC9F2361C7D9703157EC13D940DC53031FA", + "exponent": 0, + "aliases": [ + "ncheq" + ] + }, + { + "denom": "cheq", + "exponent": 9 + } + ], + "type_asset": "ics20", + "base": "ibc/7A08C6F11EF0F59EB841B9F788A87EC9F2361C7D9703157EC13D940DC53031FA", + "name": "Cheqd", + "display": "cheq", + "symbol": "CHEQ", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "cheqd", + "base_denom": "ncheq", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-108", + "path": "transfer/channel-108/ncheq" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cheqd/images/cheq.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cheqd/images/cheq.svg" + }, + "coingecko_id": "cheqd-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1273" + ] + }, + { + "description": "Native token of the Lum Network", + "denom_units": [ + { + "denom": "ibc/8A34AF0C1943FD0DFCDE9ADBF0B2C9959C45E87E6088EA2FC6ADACD59261B8A2", + "exponent": 0, + "aliases": [ + "ulum" + ] + }, + { + "denom": "lum", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/8A34AF0C1943FD0DFCDE9ADBF0B2C9959C45E87E6088EA2FC6ADACD59261B8A2", + "name": "Lum Network", + "display": "lum", + "symbol": "LUM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "lumnetwork", + "base_denom": "ulum", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-115", + "path": "transfer/channel-115/ulum" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/lumnetwork/images/lum.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/lumnetwork/images/lum.svg" + }, + "coingecko_id": "lum-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:608" + ] + }, + { + "description": "The native token of Vidulum", + "denom_units": [ + { + "denom": "ibc/E7B35499CFBEB0FF5778127ABA4FB2C4B79A6B8D3D831D4379C4048C238796BD", + "exponent": 0, + "aliases": [ + "uvdl" + ] + }, + { + "denom": "vdl", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/E7B35499CFBEB0FF5778127ABA4FB2C4B79A6B8D3D831D4379C4048C238796BD", + "name": "Vidulum", + "display": "vdl", + "symbol": "VDL", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "vidulum", + "base_denom": "uvdl", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-124", + "path": "transfer/channel-124/uvdl" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/vidulum/images/vdl.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/vidulum/images/vdl.svg" + }, + "coingecko_id": "vidulum", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:613" + ] + }, + { + "description": "The native token of Desmos", + "denom_units": [ + { + "denom": "ibc/EA4C0A9F72E2CEDF10D0E7A9A6A22954DB3444910DB5BE980DF59B05A46DAD1C", + "exponent": 0, + "aliases": [ + "udsm" + ] + }, + { + "denom": "dsm", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/EA4C0A9F72E2CEDF10D0E7A9A6A22954DB3444910DB5BE980DF59B05A46DAD1C", + "name": "Desmos", + "display": "dsm", + "symbol": "DSM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "desmos", + "base_denom": "udsm", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-135", + "path": "transfer/channel-135/udsm" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/desmos/images/dsm.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/desmos/images/dsm.svg" + }, + "coingecko_id": "desmos", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:619" + ] + }, + { + "description": "Native token of Dig Chain", + "denom_units": [ + { + "denom": "ibc/307E5C96C8F60D1CBEE269A9A86C0834E1DB06F2B3788AE4F716EDB97A48B97D", + "exponent": 0, + "aliases": [ + "udig" + ] + }, + { + "denom": "dig", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/307E5C96C8F60D1CBEE269A9A86C0834E1DB06F2B3788AE4F716EDB97A48B97D", + "name": "Dig Chain", + "display": "dig", + "symbol": "DIG", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "dig", + "base_denom": "udig", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-128", + "path": "transfer/channel-128/udig" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/dig/images/dig.png" + }, + "coingecko_id": "dig-chain", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:621", + "osmosis-unstable" + ] + }, + { + "description": "Somm Token (SOMM) is the native staking token of the Sommelier Chain", + "denom_units": [ + { + "denom": "ibc/9BBA9A1C257E971E38C1422780CE6F0B0686F0A3085E2D61118D904BFE0F5F5E", + "exponent": 0, + "aliases": [ + "microsomm", + "usomm" + ] + }, + { + "denom": "msomm", + "exponent": 3, + "aliases": [ + "millisomm" + ] + }, + { + "denom": "somm", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/9BBA9A1C257E971E38C1422780CE6F0B0686F0A3085E2D61118D904BFE0F5F5E", + "name": "Sommelier", + "display": "somm", + "symbol": "SOMM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "sommelier", + "base_denom": "usomm", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-165", + "path": "transfer/channel-165/usomm" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sommelier/images/somm.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sommelier/images/somm.svg" + }, + "coingecko_id": "sommelier", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1372" + ] + }, + { + "description": "The native token of BandChain", + "denom_units": [ + { + "denom": "ibc/F867AE2112EFE646EC71A25CD2DFABB8927126AC1E19F1BBF0FF693A4ECA05DE", + "exponent": 0, + "aliases": [ + "uband" + ] + }, + { + "denom": "band", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/F867AE2112EFE646EC71A25CD2DFABB8927126AC1E19F1BBF0FF693A4ECA05DE", + "name": "Band Protocol", + "display": "band", + "symbol": "BAND", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bandchain", + "base_denom": "uband", + "channel_id": "channel-83" + }, + "chain": { + "channel_id": "channel-148", + "path": "transfer/channel-148/uband" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bandchain/images/band.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bandchain/images/band.svg" + }, + "coingecko_id": "band-protocol", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:626" + ] + }, + { + "description": "The native token of Konstellation Network", + "denom_units": [ + { + "denom": "ibc/346786EA82F41FE55FAD14BF69AD8BA9B36985406E43F3CB23E6C45A285A9593", + "exponent": 0, + "aliases": [ + "udarc" + ] + }, + { + "denom": "darc", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/346786EA82F41FE55FAD14BF69AD8BA9B36985406E43F3CB23E6C45A285A9593", + "name": "Konstellation", + "display": "darc", + "symbol": "DARC", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "konstellation", + "base_denom": "udarc", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-171", + "path": "transfer/channel-171/udarc" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/konstellation/images/darc.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/konstellation/images/darc.svg" + }, + "coingecko_id": "darcmatter-coin", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:637" + ] + }, + { + "description": "The native token of Umee", + "denom_units": [ + { + "denom": "ibc/67795E528DF67C5606FC20F824EA39A6EF55BA133F4DC79C90A8C47A0901E17C", + "exponent": 0, + "aliases": [ + "uumee" + ] + }, + { + "denom": "umee", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/67795E528DF67C5606FC20F824EA39A6EF55BA133F4DC79C90A8C47A0901E17C", + "name": "Umee", + "display": "umee", + "symbol": "UMEE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "umee", + "base_denom": "uumee", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-184", + "path": "transfer/channel-184/uumee" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/umee/images/umee.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/umee/images/umee.svg" + }, + "coingecko_id": "umee", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1110" + ] + }, + { + "description": "The native token of Gravity Bridge", + "denom_units": [ + { + "denom": "ibc/E97634A40119F1898989C2A23224ED83FDD0A57EA46B3A094E287288D1672B44", + "exponent": 0, + "aliases": [ + "ugraviton" + ] + }, + { + "denom": "graviton", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/E97634A40119F1898989C2A23224ED83FDD0A57EA46B3A094E287288D1672B44", + "name": "Gravity Bridge", + "display": "graviton", + "symbol": "GRAV", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "gravitybridge", + "base_denom": "ugraviton", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-144", + "path": "transfer/channel-144/ugraviton" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/gravitybridge/images/grav.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/gravitybridge/images/grav.svg" + }, + "coingecko_id": "graviton", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1113" + ] + }, + { + "description": "The native token of Decentr", + "denom_units": [ + { + "denom": "ibc/9BCB27203424535B6230D594553F1659C77EC173E36D9CF4759E7186EE747E84", + "exponent": 0, + "aliases": [ + "udec" + ] + }, + { + "denom": "dec", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/9BCB27203424535B6230D594553F1659C77EC173E36D9CF4759E7186EE747E84", + "name": "Decentr", + "display": "dec", + "symbol": "DEC", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "decentr", + "base_denom": "udec", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-181", + "path": "transfer/channel-181/udec" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/decentr/images/dec.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/decentr/images/dec.svg" + }, + "coingecko_id": "decentr", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:644" + ] + }, + { + "description": "The native token cw20 for Marble DAO on Juno Chain", + "denom_units": [ + { + "denom": "ibc/F6B691D5F7126579DDC87357B09D653B47FDCE0A3383FF33C8D8B544FE29A8A6", + "exponent": 0, + "aliases": [ + "cw20:juno1g2g7ucurum66d42g8k5twk34yegdq8c82858gz0tq2fc75zy7khssgnhjl" + ] + }, + { + "denom": "marble", + "exponent": 3 + } + ], + "type_asset": "ics20", + "address": "juno1g2g7ucurum66d42g8k5twk34yegdq8c82858gz0tq2fc75zy7khssgnhjl", + "base": "ibc/F6B691D5F7126579DDC87357B09D653B47FDCE0A3383FF33C8D8B544FE29A8A6", + "name": "Marble", + "display": "marble", + "symbol": "MARBLE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1g2g7ucurum66d42g8k5twk34yegdq8c82858gz0tq2fc75zy7khssgnhjl", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1g2g7ucurum66d42g8k5twk34yegdq8c82858gz0tq2fc75zy7khssgnhjl" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/marble.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/marble.svg" + }, + "coingecko_id": "marble", + "keywords": [ + "osmosis-price:uosmo:649" + ] + }, + { + "description": "The native governance token of Carbon", + "denom_units": [ + { + "denom": "ibc/8FEFAE6AECF6E2A255585617F781F35A8D5709A545A804482A261C0C9548A9D3", + "exponent": 0, + "aliases": [ + "swth" + ] + }, + { + "denom": "dswth", + "exponent": 8, + "aliases": [ + "SWTH" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/8FEFAE6AECF6E2A255585617F781F35A8D5709A545A804482A261C0C9548A9D3", + "name": "Carbon", + "display": "dswth", + "symbol": "SWTH", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "carbon", + "base_denom": "swth", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-188", + "path": "transfer/channel-188/swth" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/carbon/images/swth.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/carbon/images/swth.svg" + }, + "coingecko_id": "switcheo", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:651" + ] + }, + { + "description": "The native token of Cerberus Chain", + "denom_units": [ + { + "denom": "ibc/41999DF04D9441DAC0DF5D8291DF4333FBCBA810FFD63FDCE34FDF41EF37B6F7", + "exponent": 0, + "aliases": [ + "ucrbrus" + ] + }, + { + "denom": "crbrus", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/41999DF04D9441DAC0DF5D8291DF4333FBCBA810FFD63FDCE34FDF41EF37B6F7", + "name": "Cerberus", + "display": "crbrus", + "symbol": "CRBRUS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "cerberus", + "base_denom": "ucrbrus", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-212", + "path": "transfer/channel-212/ucrbrus" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cerberus/images/crbrus.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cerberus/images/crbrus.svg" + }, + "coingecko_id": "cerberus-2", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:662", + "osmosis-unstable" + ] + }, + { + "description": "The native staking and governance token of the Fetch Hub.", + "denom_units": [ + { + "denom": "ibc/5D1F516200EE8C6B2354102143B78A2DEDA25EDE771AC0F8DC3C1837C8FD4447", + "exponent": 0, + "aliases": [ + "afet" + ] + }, + { + "denom": "fet", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/5D1F516200EE8C6B2354102143B78A2DEDA25EDE771AC0F8DC3C1837C8FD4447", + "name": "Fetch.ai", + "display": "fet", + "symbol": "FET", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "fetchhub", + "base_denom": "afet", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-229", + "path": "transfer/channel-229/afet" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/fetchhub/images/fet.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/fetchhub/images/fet.svg" + }, + "coingecko_id": "fetch-ai", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:681" + ] + }, + { + "description": "The native token of Asset Mantle", + "denom_units": [ + { + "denom": "ibc/CBA34207E969623D95D057D9B11B0C8B32B89A71F170577D982FDDE623813FFC", + "exponent": 0, + "aliases": [ + "umntl" + ] + }, + { + "denom": "mntl", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/CBA34207E969623D95D057D9B11B0C8B32B89A71F170577D982FDDE623813FFC", + "name": "AssetMantle", + "display": "mntl", + "symbol": "MNTL", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "assetmantle", + "base_denom": "umntl", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-232", + "path": "transfer/channel-232/umntl" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/assetmantle/images/mntl.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/assetmantle/images/mntl.svg" + }, + "coingecko_id": "assetmantle", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:686" + ] + }, + { + "description": "The native token cw20 for Neta on Juno Chain", + "denom_units": [ + { + "denom": "ibc/297C64CC42B5A8D8F82FE2EBE208A6FE8F94B86037FA28C4529A23701C228F7A", + "exponent": 0, + "aliases": [ + "cw20:juno168ctmpyppk90d34p3jjy658zf5a5l3w8wk35wht6ccqj4mr0yv8s4j5awr" + ] + }, + { + "denom": "neta", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno168ctmpyppk90d34p3jjy658zf5a5l3w8wk35wht6ccqj4mr0yv8s4j5awr", + "base": "ibc/297C64CC42B5A8D8F82FE2EBE208A6FE8F94B86037FA28C4529A23701C228F7A", + "name": "Neta", + "display": "neta", + "symbol": "NETA", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno168ctmpyppk90d34p3jjy658zf5a5l3w8wk35wht6ccqj4mr0yv8s4j5awr", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno168ctmpyppk90d34p3jjy658zf5a5l3w8wk35wht6ccqj4mr0yv8s4j5awr" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/neta.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/neta.svg" + }, + "coingecko_id": "neta", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:631" + ] + }, + { + "description": "The INJ token is the native governance token for the Injective chain.", + "denom_units": [ + { + "denom": "ibc/64BA6E31FE887D66C6F8F31C7B1A80C7CA179239677B4088BB55F5EA07DBE273", + "exponent": 0, + "aliases": [ + "inj" + ] + }, + { + "denom": "INJ", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/64BA6E31FE887D66C6F8F31C7B1A80C7CA179239677B4088BB55F5EA07DBE273", + "name": "Injective", + "display": "INJ", + "symbol": "INJ", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "injective", + "base_denom": "inj", + "channel_id": "channel-8" + }, + "chain": { + "channel_id": "channel-122", + "path": "transfer/channel-122/inj" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/injective/images/inj.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/injective/images/inj.svg" + }, + "coingecko_id": "injective-protocol", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1319" + ] + }, + { + "description": "The KRW stablecoin of Terra Classic.", + "denom_units": [ + { + "denom": "ibc/204A582244FC241613DBB50B04D1D454116C58C4AF7866C186AA0D6EEAD42780", + "exponent": 0, + "aliases": [ + "microkrw", + "ukrw" + ] + }, + { + "denom": "mkrw", + "exponent": 3, + "aliases": [ + "millikrw" + ] + }, + { + "denom": "krt", + "exponent": 6, + "aliases": [ + "krtc" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/204A582244FC241613DBB50B04D1D454116C58C4AF7866C186AA0D6EEAD42780", + "name": "TerraClassicKRW", + "display": "krt", + "symbol": "KRTC", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "terra", + "base_denom": "ukrw", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-72", + "path": "transfer/channel-72/ukrw" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra/images/krt.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra/images/krt.svg" + }, + "coingecko_id": "terrakrw", + "keywords": [ + "osmosis-price:ibc/BE1BB42D4BE3C30D50B68D7C41DB4DFCE9678E8EF8C539F6E6A9345048894FCC:581", + "peg:algorithmic" + ] + }, + { + "description": "TICK coin is the token for the Microtick Price Discovery & Oracle App", + "denom_units": [ + { + "denom": "ibc/655BCEF3CDEBE32863FF281DBBE3B06160339E9897DC9C9C9821932A5F8BA6F8", + "exponent": 0, + "aliases": [ + "utick" + ] + }, + { + "denom": "tick", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/655BCEF3CDEBE32863FF281DBBE3B06160339E9897DC9C9C9821932A5F8BA6F8", + "name": "Microtick", + "display": "tick", + "symbol": "TICK", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "microtick", + "base_denom": "utick", + "channel_id": "channel-16" + }, + "chain": { + "channel_id": "channel-39", + "path": "transfer/channel-39/utick" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/microtick/images/tick.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/microtick/images/tick.svg" + }, + "coingecko_id": "microtick", + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:547", + "osmosis-unstable" + ] + }, + { + "description": "Rowan Token (ROWAN) is the Sifchain Network's native utility token, used as the primary means to govern, provide liquidity, secure the blockchain, incentivize participants, and provide a default mechanism to store and exchange value.", + "denom_units": [ + { + "denom": "ibc/8318FD63C42203D16DDCAF49FE10E8590669B3219A3E87676AC9DA50722687FB", + "exponent": 0, + "aliases": [ + "rowan" + ] + }, + { + "denom": "ROWAN", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/8318FD63C42203D16DDCAF49FE10E8590669B3219A3E87676AC9DA50722687FB", + "name": "Sifchain", + "display": "ROWAN", + "symbol": "ROWAN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "sifchain", + "base_denom": "rowan", + "channel_id": "channel-17" + }, + "chain": { + "channel_id": "channel-47", + "path": "transfer/channel-47/rowan" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sifchain/images/rowan.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sifchain/images/rowan.svg" + }, + "coingecko_id": "sifchain", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:629", + "osmosis-unstable" + ] + }, + { + "description": "The native token of Shentu", + "denom_units": [ + { + "denom": "ibc/7ED954CFFFC06EE8419387F3FC688837FF64EF264DE14219935F724EEEDBF8D3", + "exponent": 0, + "aliases": [ + "uctk" + ] + }, + { + "denom": "ctk", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/7ED954CFFFC06EE8419387F3FC688837FF64EF264DE14219935F724EEEDBF8D3", + "name": "Shentu", + "display": "ctk", + "symbol": "CTK", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "shentu", + "base_denom": "uctk", + "channel_id": "channel-8" + }, + "chain": { + "channel_id": "channel-146", + "path": "transfer/channel-146/uctk" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/shentu/images/ctk.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/shentu/images/ctk.svg" + }, + "coingecko_id": "certik", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1020" + ] + }, + { + "description": "Hope Galaxy is an NFT collection based on its own native Token $HOPE, a cw20 token on Juno chain.", + "denom_units": [ + { + "denom": "ibc/C2A2E9CA95DDD4828B75124B5E27B8401C7D8493BC48353D418CBFC04565899B", + "exponent": 0, + "aliases": [ + "cw20:juno1re3x67ppxap48ygndmrc7har2cnc7tcxtm9nplcas4v0gc3wnmvs3s807z" + ] + }, + { + "denom": "hope", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1re3x67ppxap48ygndmrc7har2cnc7tcxtm9nplcas4v0gc3wnmvs3s807z", + "base": "ibc/C2A2E9CA95DDD4828B75124B5E27B8401C7D8493BC48353D418CBFC04565899B", + "name": "Hope Galaxy", + "display": "hope", + "symbol": "HOPE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1re3x67ppxap48ygndmrc7har2cnc7tcxtm9nplcas4v0gc3wnmvs3s807z", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1re3x67ppxap48ygndmrc7har2cnc7tcxtm9nplcas4v0gc3wnmvs3s807z" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/hope.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/hope.svg" + }, + "coingecko_id": "hope-galaxy", + "keywords": [ + "osmosis-price:uosmo:653" + ] + }, + { + "description": "Racoon aims to simplify accessibility to AI, NFTs and Gambling on the Cosmos Ecosystem", + "denom_units": [ + { + "denom": "ibc/6BDB4C8CCD45033F9604E4B93ED395008A753E01EECD6992E7D1EA23D9D3B788", + "exponent": 0, + "aliases": [ + "cw20:juno1r4pzw8f9z0sypct5l9j906d47z998ulwvhvqe5xdwgy8wf84583sxwh0pa" + ] + }, + { + "denom": "rac", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1r4pzw8f9z0sypct5l9j906d47z998ulwvhvqe5xdwgy8wf84583sxwh0pa", + "base": "ibc/6BDB4C8CCD45033F9604E4B93ED395008A753E01EECD6992E7D1EA23D9D3B788", + "name": "Racoon", + "display": "rac", + "symbol": "juno.RAC", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1r4pzw8f9z0sypct5l9j906d47z998ulwvhvqe5xdwgy8wf84583sxwh0pa", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1r4pzw8f9z0sypct5l9j906d47z998ulwvhvqe5xdwgy8wf84583sxwh0pa" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/rac.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/rac.svg" + }, + "coingecko_id": "racoon", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:669" + ] + }, + { + "description": "Frax is a fractional-algorithmic stablecoin protocol. It aims to provide a highly scalable, decentralized, algorithmic money in place of fixed-supply assets like BTC. Additionally, FXS is the value accrual and governance token of the entire Frax ecosystem.", + "denom_units": [ + { + "denom": "ibc/0E43EDE2E2A3AFA36D0CD38BDDC0B49FECA64FA426A82E102F304E430ECF46EE", + "exponent": 0, + "aliases": [ + "frax-wei" + ] + }, + { + "denom": "frax", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/0E43EDE2E2A3AFA36D0CD38BDDC0B49FECA64FA426A82E102F304E430ECF46EE", + "name": "Frax", + "display": "frax", + "symbol": "FRAX", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Frax Protocol" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x853d955acef822db058eb8505911ed77f175b99e" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "frax-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/frax-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/frax.svg" + }, + "coingecko_id": "frax", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:679", + "peg:hybrid" + ] + }, + { + "description": "Gravity Bridge WBTC", + "denom_units": [ + { + "denom": "ibc/C9B0D48FD2C5B91135F118FF2484551888966590D7BDC20F6A87308DBA670796", + "exponent": 0, + "aliases": [ + "gravity0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599" + ] + }, + { + "denom": "gwbtc", + "exponent": 8 + } + ], + "type_asset": "ics20", + "base": "ibc/C9B0D48FD2C5B91135F118FF2484551888966590D7BDC20F6A87308DBA670796", + "name": "Wrapped Bitcoin (Gravity Bridge)", + "display": "gwbtc", + "symbol": "WBTC.grv", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "bitcoin", + "base_denom": "sat" + }, + "provider": "BitGo, Kyber, and Ren" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599" + }, + "provider": "Gravity Bridge" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gravitybridge", + "base_denom": "gravity0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-144", + "path": "transfer/channel-144/gravity0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/wbtc.grv.svg" + }, + "keywords": [ + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:694" + ] + }, + { + "description": "Gravity Bridge WETH", + "denom_units": [ + { + "denom": "ibc/65381C5F3FD21442283D56925E62EA524DED8B6927F0FF94E21E0020954C40B5", + "exponent": 0, + "aliases": [ + "gravity0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" + ] + }, + { + "denom": "gweth", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/65381C5F3FD21442283D56925E62EA524DED8B6927F0FF94E21E0020954C40B5", + "name": "Ether (Gravity Bridge)", + "display": "gweth", + "symbol": "WETH.grv", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Ethereum" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2" + }, + "provider": "Gravity Bridge" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gravitybridge", + "base_denom": "gravity0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-144", + "path": "transfer/channel-144/gravity0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/weth.grv.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5:1297" + ] + }, + { + "description": "Gravity Bridge USDC", + "denom_units": [ + { + "denom": "ibc/9F9B07EF9AD291167CF5700628145DE1DEB777C2CFC7907553B24446515F6D0E", + "exponent": 0, + "aliases": [ + "gravity0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" + ] + }, + { + "denom": "gusdc", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/9F9B07EF9AD291167CF5700628145DE1DEB777C2CFC7907553B24446515F6D0E", + "name": "USD Coin (Gravity Bridge)", + "display": "gusdc", + "symbol": "USDC.grv", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Circle" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "provider": "Gravity Bridge" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gravitybridge", + "base_denom": "gravity0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-144", + "path": "transfer/channel-144/gravity0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/usdc.grv.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:872", + "peg:collateralized" + ] + }, + { + "description": "Gravity Bridge DAI", + "denom_units": [ + { + "denom": "ibc/F292A17CF920E3462C816CBE6B042E779F676CAB59096904C4C1C966413E3DF5", + "exponent": 0, + "aliases": [ + "gravity0x6B175474E89094C44Da98b954EedeAC495271d0F" + ] + }, + { + "denom": "gdai", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/F292A17CF920E3462C816CBE6B042E779F676CAB59096904C4C1C966413E3DF5", + "name": "DAI Stablecoin (Gravity Bridge)", + "display": "gdai", + "symbol": "DAI.grv", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "MakerDAO" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x6b175474e89094c44da98b954eedeac495271d0f" + }, + "provider": "Gravity Bridge" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gravitybridge", + "base_denom": "gravity0x6B175474E89094C44Da98b954EedeAC495271d0F", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-144", + "path": "transfer/channel-144/gravity0x6B175474E89094C44Da98b954EedeAC495271d0F" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/dai.grv.svg" + }, + "keywords": [ + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:702", + "peg:collateralized" + ] + }, + { + "description": "Gravity Bridge USDT", + "denom_units": [ + { + "denom": "ibc/71B441E27F1BBB44DD0891BCD370C2794D404D60A4FFE5AECCD9B1E28BC89805", + "exponent": 0, + "aliases": [ + "gravity0xdAC17F958D2ee523a2206206994597C13D831ec7" + ] + }, + { + "denom": "gusdt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/71B441E27F1BBB44DD0891BCD370C2794D404D60A4FFE5AECCD9B1E28BC89805", + "name": "Tether USD (Gravity Bridge)", + "display": "gusdt", + "symbol": "USDT.grv", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Tether" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "provider": "Gravity Bridge" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gravitybridge", + "base_denom": "gravity0xdAC17F958D2ee523a2206206994597C13D831ec7", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-144", + "path": "transfer/channel-144/gravity0xdAC17F958D2ee523a2206206994597C13D831ec7" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/usdt.grv.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:818", + "peg:collateralized" + ] + }, + { + "description": "The native token of Marble DEX on Juno Chain", + "denom_units": [ + { + "denom": "ibc/DB9755CB6FE55192948AE074D18FA815E1429D3D374D5BDA8D89623C6CF235C3", + "exponent": 0, + "aliases": [ + "cw20:juno1y9rf7ql6ffwkv02hsgd4yruz23pn4w97p75e2slsnkm0mnamhzysvqnxaq" + ] + }, + { + "denom": "block", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1y9rf7ql6ffwkv02hsgd4yruz23pn4w97p75e2slsnkm0mnamhzysvqnxaq", + "base": "ibc/DB9755CB6FE55192948AE074D18FA815E1429D3D374D5BDA8D89623C6CF235C3", + "name": "Block", + "display": "block", + "symbol": "BLOCK", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1y9rf7ql6ffwkv02hsgd4yruz23pn4w97p75e2slsnkm0mnamhzysvqnxaq", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1y9rf7ql6ffwkv02hsgd4yruz23pn4w97p75e2slsnkm0mnamhzysvqnxaq" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/block.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/block.svg" + }, + "keywords": [ + "osmosis-price:uosmo:691" + ] + }, + { + "description": "Hash is the staking token of the Provenance Blockchain", + "denom_units": [ + { + "denom": "ibc/CE5BFF1D9BADA03BB5CCA5F56939392A761B53A10FBD03B37506669C3218D3B2", + "exponent": 0, + "aliases": [ + "nhash" + ] + }, + { + "denom": "hash", + "exponent": 9 + } + ], + "type_asset": "ics20", + "base": "ibc/CE5BFF1D9BADA03BB5CCA5F56939392A761B53A10FBD03B37506669C3218D3B2", + "name": "Provenance", + "display": "hash", + "symbol": "HASH", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "provenance", + "base_denom": "nhash", + "channel_id": "channel-7" + }, + "chain": { + "channel_id": "channel-222", + "path": "transfer/channel-222/nhash" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/provenance/images/prov.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/provenance/images/prov.svg" + }, + "coingecko_id": "provenance-blockchain", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:693" + ] + }, + { + "description": "GLX is the staking token of the Galaxy Chain", + "denom_units": [ + { + "denom": "ibc/F49DE040EBA5AB2FAD5F660C2A1DDF98A68470FAE82229818BE775EBF3EE79F2", + "exponent": 0, + "aliases": [ + "uglx" + ] + }, + { + "denom": "glx", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/F49DE040EBA5AB2FAD5F660C2A1DDF98A68470FAE82229818BE775EBF3EE79F2", + "name": "Galaxy", + "display": "glx", + "symbol": "GLX", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "galaxy", + "base_denom": "uglx", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-236", + "path": "transfer/channel-236/uglx" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/galaxy/images/glx.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/galaxy/images/glx.svg" + }, + "keywords": [ + "osmosis-price:uosmo:697" + ] + }, + { + "description": "The DAO token to build consensus among Hong Kong People", + "denom_units": [ + { + "denom": "ibc/52E12CF5CA2BB903D84F5298B4BFD725D66CAB95E09AA4FC75B2904CA5485FEB", + "exponent": 0, + "aliases": [ + "dhk", + "cw20:juno1tdjwrqmnztn2j3sj2ln9xnyps5hs48q3ddwjrz7jpv6mskappjys5czd49" + ] + } + ], + "type_asset": "ics20", + "address": "juno1tdjwrqmnztn2j3sj2ln9xnyps5hs48q3ddwjrz7jpv6mskappjys5czd49", + "base": "ibc/52E12CF5CA2BB903D84F5298B4BFD725D66CAB95E09AA4FC75B2904CA5485FEB", + "name": "DHK", + "display": "dhk", + "symbol": "DHK", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1tdjwrqmnztn2j3sj2ln9xnyps5hs48q3ddwjrz7jpv6mskappjys5czd49", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1tdjwrqmnztn2j3sj2ln9xnyps5hs48q3ddwjrz7jpv6mskappjys5czd49" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/dhk.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/dhk.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:695" + ] + }, + { + "description": "Token governance for Junoswap", + "denom_units": [ + { + "denom": "ibc/00B6E60AD3D65CBEF5579AC8AF609527C0B57535B6E32D96C80A735344FD9DCC", + "exponent": 0, + "aliases": [ + "cw20:juno15u3dt79t6sxxa3x3kpkhzsy56edaa5a66wvt3kxmukqjz2sx0hes5sn38g" + ] + }, + { + "denom": "raw", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno15u3dt79t6sxxa3x3kpkhzsy56edaa5a66wvt3kxmukqjz2sx0hes5sn38g", + "base": "ibc/00B6E60AD3D65CBEF5579AC8AF609527C0B57535B6E32D96C80A735344FD9DCC", + "name": "JunoSwap", + "display": "raw", + "symbol": "RAW", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno15u3dt79t6sxxa3x3kpkhzsy56edaa5a66wvt3kxmukqjz2sx0hes5sn38g", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno15u3dt79t6sxxa3x3kpkhzsy56edaa5a66wvt3kxmukqjz2sx0hes5sn38g" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/raw.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/raw.svg" + }, + "coingecko_id": "junoswap-raw-dao", + "keywords": [ + "osmosis-main", + "osmosis-price:uosmo:700" + ] + }, + { + "description": "MEME Token (MEME) is the native staking token of the MEME Chain", + "denom_units": [ + { + "denom": "ibc/67C89B8B0A70C08F093C909A4DD996DD10E0494C87E28FD9A551697BF173D4CA", + "exponent": 0, + "aliases": [ + "umeme" + ] + }, + { + "denom": "meme", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/67C89B8B0A70C08F093C909A4DD996DD10E0494C87E28FD9A551697BF173D4CA", + "name": "MEME", + "display": "meme", + "symbol": "MEME", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "meme", + "base_denom": "umeme", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-238", + "path": "transfer/channel-238/umeme" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/meme/images/meme.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/meme/images/meme.svg" + }, + "coingecko_id": "meme-network", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:701" + ] + }, + { + "description": "Profit sharing token for Another.Software validator. Hold and receive dividends from Another.Software validator commissions!", + "denom_units": [ + { + "denom": "ibc/AA1C80225BCA7B32ED1FC6ABF8B8E899BEB48ECDB4B417FD69873C6D715F97E7", + "exponent": 0, + "aliases": [ + "cw20:juno17wzaxtfdw5em7lc94yed4ylgjme63eh73lm3lutp2rhcxttyvpwsypjm4w" + ] + }, + { + "denom": "asvt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno17wzaxtfdw5em7lc94yed4ylgjme63eh73lm3lutp2rhcxttyvpwsypjm4w", + "base": "ibc/AA1C80225BCA7B32ED1FC6ABF8B8E899BEB48ECDB4B417FD69873C6D715F97E7", + "name": "Another.Software Validator Token", + "display": "asvt", + "symbol": "ASVT", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno17wzaxtfdw5em7lc94yed4ylgjme63eh73lm3lutp2rhcxttyvpwsypjm4w", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno17wzaxtfdw5em7lc94yed4ylgjme63eh73lm3lutp2rhcxttyvpwsypjm4w" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/asvt.png" + }, + "keywords": [ + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:771" + ] + }, + { + "description": "DAO dedicated to building tools on the Juno Network", + "denom_units": [ + { + "denom": "ibc/0CB9DB3441D0D50F35699DEE22B9C965487E83FB2D9F483D1CC5CA34E856C484", + "exponent": 0, + "aliases": [ + "cw20:juno1n7n7d5088qlzlj37e9mgmkhx6dfgtvt02hqxq66lcap4dxnzdhwqfmgng3" + ] + }, + { + "denom": "joe", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1n7n7d5088qlzlj37e9mgmkhx6dfgtvt02hqxq66lcap4dxnzdhwqfmgng3", + "base": "ibc/0CB9DB3441D0D50F35699DEE22B9C965487E83FB2D9F483D1CC5CA34E856C484", + "name": "JoeDAO", + "display": "joe", + "symbol": "JOE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1n7n7d5088qlzlj37e9mgmkhx6dfgtvt02hqxq66lcap4dxnzdhwqfmgng3", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1n7n7d5088qlzlj37e9mgmkhx6dfgtvt02hqxq66lcap4dxnzdhwqfmgng3" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/joe.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:718" + ] + }, + { + "description": "The native staking token of Terra.", + "denom_units": [ + { + "denom": "ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9", + "exponent": 0, + "aliases": [ + "uluna" + ] + }, + { + "denom": "luna", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9", + "name": "Luna", + "display": "luna", + "symbol": "LUNA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "terra2", + "base_denom": "uluna", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-251", + "path": "transfer/channel-251/uluna" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra2/images/luna.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra2/images/luna.svg" + }, + "coingecko_id": "terra-luna-2", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB:1163" + ] + }, + { + "description": "Native token of Rizon Chain", + "denom_units": [ + { + "denom": "ibc/2716E3F2E146664BEFA9217F1A03BFCEDBCD5178B3C71CACB1A0D7584451D219", + "exponent": 0, + "aliases": [ + "uatolo" + ] + }, + { + "denom": "atolo", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/2716E3F2E146664BEFA9217F1A03BFCEDBCD5178B3C71CACB1A0D7584451D219", + "name": "Rizon", + "display": "atolo", + "symbol": "ATOLO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "rizon", + "base_denom": "uatolo", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-221", + "path": "transfer/channel-221/uatolo" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/rizon/images/atolo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/rizon/images/atolo.svg" + }, + "coingecko_id": "rizon", + "keywords": [ + "osmosis-price:uosmo:729" + ] + }, + { + "description": "Governance token of Kava Lend Protocol", + "denom_units": [ + { + "denom": "ibc/D6C28E07F7343360AC41E15DDD44D79701DDCA2E0C2C41279739C8D4AE5264BC", + "exponent": 0, + "aliases": [ + "hard" + ] + }, + { + "denom": "HARD", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/D6C28E07F7343360AC41E15DDD44D79701DDCA2E0C2C41279739C8D4AE5264BC", + "name": "Kava Hard", + "display": "HARD", + "symbol": "HARD", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kava", + "base_denom": "hard", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-143", + "path": "transfer/channel-143/hard" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kava/images/hard.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kava/images/hard.svg" + }, + "coingecko_id": "kava-lend" + }, + { + "description": "Governance token of Kava Swap Protocol", + "denom_units": [ + { + "denom": "ibc/70CF1A54E23EA4E480DEDA9E12082D3FD5684C3483CBDCE190C5C807227688C5", + "exponent": 0, + "aliases": [ + "swp" + ] + }, + { + "denom": "SWP", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/70CF1A54E23EA4E480DEDA9E12082D3FD5684C3483CBDCE190C5C807227688C5", + "name": "Kava Swap", + "display": "SWP", + "symbol": "SWP", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kava", + "base_denom": "swp", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-143", + "path": "transfer/channel-143/swp" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kava/images/swp.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kava/images/swp.svg" + }, + "coingecko_id": "kava-swap" + }, + { + "description": "A blockchain-based middleware, acting as a bridge between cryptocurrency smart contracts, data feeds, APIs and traditional bank account payments.", + "denom_units": [ + { + "denom": "ibc/D3327A763C23F01EC43D1F0DB3CEFEC390C362569B6FD191F40A5192F8960049", + "exponent": 0, + "aliases": [ + "link-wei" + ] + }, + { + "denom": "link", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/D3327A763C23F01EC43D1F0DB3CEFEC390C362569B6FD191F40A5192F8960049", + "name": "Chainlink", + "display": "link", + "symbol": "LINK", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x514910771af9ca656af840dff83e8264ecf986ca" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "link-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/link-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/link.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/link.svg" + }, + "coingecko_id": "chainlink", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:731" + ] + }, + { + "description": "L1 coin is the GenesisL1 blockchain utility, governance and EVM token", + "denom_units": [ + { + "denom": "ibc/F16FDC11A7662B86BC0B9CE61871CBACF7C20606F95E86260FD38915184B75B4", + "exponent": 0, + "aliases": [ + "el1" + ] + }, + { + "denom": "l1", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/F16FDC11A7662B86BC0B9CE61871CBACF7C20606F95E86260FD38915184B75B4", + "name": "GenesisL1", + "display": "l1", + "symbol": "L1", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "genesisl1", + "base_denom": "el1", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-253", + "path": "transfer/channel-253/el1" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/genesisl1/images/l1.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/genesisl1/images/l1.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:732" + ] + }, + { + "description": "Aave is an Open Source and Non-Custodial protocol to earn interest on deposits & borrow assets. It also features access to highly innovative flash loans, which let developers borrow instantly and easily; no collateral needed. With 16 different assets, 5 of which are stablecoins.", + "denom_units": [ + { + "denom": "ibc/384E5DD50BDE042E1AAF51F312B55F08F95BC985C503880189258B4D9374CBBE", + "exponent": 0, + "aliases": [ + "aave-wei" + ] + }, + { + "denom": "aave", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/384E5DD50BDE042E1AAF51F312B55F08F95BC985C503880189258B4D9374CBBE", + "name": "Aave", + "display": "aave", + "symbol": "AAVE", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "aave-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/aave-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/aave.svg" + }, + "coingecko_id": "aave", + "keywords": [ + "osmosis-unlisted" + ] + }, + { + "description": "ApeCoin found new expression in web3 through art, gaming, entertainment, and events. APE is a token made to support what’s next, controlled, and built on by the community. It will serve as a decentralized protocol layer for community-led initiatives that drive culture forward into the metaverse.", + "denom_units": [ + { + "denom": "ibc/F83CC6471DA4D4B508F437244F10B9E4C68975344E551A2DEB6B8617AB08F0D4", + "exponent": 0, + "aliases": [ + "ape-wei" + ] + }, + { + "denom": "ape", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/F83CC6471DA4D4B508F437244F10B9E4C68975344E551A2DEB6B8617AB08F0D4", + "name": "ApeCoin", + "display": "ape", + "symbol": "APE", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x4d224452801aced8b2f0aebe155379bb5d594381" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "ape-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/ape-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/ape.svg" + }, + "coingecko_id": "apecoin", + "keywords": [ + "osmosis-unlisted" + ] + }, + { + "description": "Maker is a Decentralized Autonomous Organization that creates and insures the dai stablecoin on the Ethereum blockchain", + "denom_units": [ + { + "denom": "ibc/D27DDDF34BB47E5D5A570742CC667DE53277867116CCCA341F27785E899A70F3", + "exponent": 0, + "aliases": [ + "mkr-wei" + ] + }, + { + "denom": "mkr", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/D27DDDF34BB47E5D5A570742CC667DE53277867116CCCA341F27785E899A70F3", + "name": "Maker", + "display": "mkr", + "symbol": "MKR", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "mkr-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/mkr-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/mkr.svg" + }, + "coingecko_id": "maker", + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7:734" + ] + }, + { + "description": "RAI is a non-pegged, ETH-backed stable asset. It is useful as more 'stable' collateral for other DeFi protocols (compared to ETH or BTC) or as a stable asset with an embedded interest rate.", + "denom_units": [ + { + "denom": "ibc/BD796662F8825327D41C96355DF62045A5BA225BAE31C0A86289B9D88ED3F44E", + "exponent": 0, + "aliases": [ + "rai-wei" + ] + }, + { + "denom": "rai", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/BD796662F8825327D41C96355DF62045A5BA225BAE31C0A86289B9D88ED3F44E", + "name": "Rai Reflex Index", + "display": "rai", + "symbol": "RAI", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "RAI Finance" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x03ab458634910aad20ef5f1c8ee96f1d6ac54919" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "rai-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/rai-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/rai.svg" + }, + "coingecko_id": "rai", + "keywords": [ + "osmosis-unlisted" + ] + }, + { + "description": "SHIBA INU is a 100% decentralized community experiment with it claims that 1/2 the tokens have been sent to Vitalik and the other half were locked to a Uniswap pool and the keys burned.", + "denom_units": [ + { + "denom": "ibc/19305E20681911F14D1FB275E538CDE524C3BF88CF9AE5D5F78F4D4DA05E85B2", + "exponent": 0, + "aliases": [ + "shib-wei" + ] + }, + { + "denom": "shib", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/19305E20681911F14D1FB275E538CDE524C3BF88CF9AE5D5F78F4D4DA05E85B2", + "name": "Shiba Inu", + "display": "shib", + "symbol": "SHIB", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "shib-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/shib-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/shib.svg" + }, + "coingecko_id": "shiba-inu", + "keywords": [ + "osmosis-price:uosmo:880", + "osmosis-unlisted" + ] + }, + { + "description": "The native staking and governance token of the Kujira chain.", + "denom_units": [ + { + "denom": "ibc/BB6BCDB515050BAE97516111873CCD7BCF1FD0CCB723CC12F3C4F704D6C646CE", + "exponent": 0, + "aliases": [ + "ukuji" + ] + }, + { + "denom": "kuji", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/BB6BCDB515050BAE97516111873CCD7BCF1FD0CCB723CC12F3C4F704D6C646CE", + "name": "Kujira", + "display": "kuji", + "symbol": "KUJI", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kujira", + "base_denom": "ukuji", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-259", + "path": "transfer/channel-259/ukuji" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kujira/images/kuji.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kujira/images/kuji.svg" + }, + "coingecko_id": "kujira", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB:1161" + ] + }, + { + "description": "The native token of Tgrade", + "denom_units": [ + { + "denom": "ibc/1E09CB0F506ACF12FDE4683FB6B34DA62FB4BE122641E0D93AAF98A87675676C", + "exponent": 0, + "aliases": [ + "utgd" + ] + }, + { + "denom": "tgd", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/1E09CB0F506ACF12FDE4683FB6B34DA62FB4BE122641E0D93AAF98A87675676C", + "name": "Tgrade", + "display": "tgd", + "symbol": "TGD", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "tgrade", + "base_denom": "utgd", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-263", + "path": "transfer/channel-263/utgd" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/tgrade/images/tgrade-symbol-gradient.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/tgrade/images/tgrade-symbol-gradient.svg" + }, + "coingecko_id": "tgrade", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:769" + ] + }, + { + "description": "Echelon - a scalable EVM on Cosmos, built on Proof-of-Stake with fast-finality that prioritizes interoperability and novel economics", + "denom_units": [ + { + "denom": "ibc/47EE224A9B33CF0ABEAC82106E52F0F6E8D8CEC5BA80B9D9A6F55172CBB0177D", + "exponent": 0, + "aliases": [ + "aechelon" + ] + }, + { + "denom": "echelon", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/47EE224A9B33CF0ABEAC82106E52F0F6E8D8CEC5BA80B9D9A6F55172CBB0177D", + "name": "Echelon", + "display": "echelon", + "symbol": "ECH", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "echelon", + "base_denom": "aechelon", + "channel_id": "channel-11" + }, + "chain": { + "channel_id": "channel-403", + "path": "transfer/channel-403/aechelon" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/echelon/images/ech.svg" + }, + "coingecko_id": "echelon", + "keywords": [ + "osmosis-price:uosmo:848" + ] + }, + { + "description": "Staking and governance token for ODIN Protocol", + "denom_units": [ + { + "denom": "ibc/C360EF34A86D334F625E4CBB7DA3223AEA97174B61F35BB3758081A8160F7D9B", + "exponent": 0, + "aliases": [ + "loki" + ] + }, + { + "denom": "odin", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/C360EF34A86D334F625E4CBB7DA3223AEA97174B61F35BB3758081A8160F7D9B", + "name": "Odin Protocol", + "display": "odin", + "symbol": "ODIN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "odin", + "base_denom": "loki", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-258", + "path": "transfer/channel-258/loki" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/odin/images/odin.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/odin/images/odin.svg" + }, + "coingecko_id": "odin-protocol", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:777" + ] + }, + { + "description": "GEO token for ODIN Protocol", + "denom_units": [ + { + "denom": "ibc/9B6FBABA36BB4A3BF127AE5E96B572A5197FD9F3111D895D8919B07BC290764A", + "exponent": 0, + "aliases": [ + "mGeo" + ] + }, + { + "denom": "geo", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/9B6FBABA36BB4A3BF127AE5E96B572A5197FD9F3111D895D8919B07BC290764A", + "name": "GEO", + "display": "geo", + "symbol": "GEO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "odin", + "base_denom": "mGeo", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-258", + "path": "transfer/channel-258/mGeo" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/odin/images/geo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/odin/images/geo.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:787" + ] + }, + { + "description": "O9W token for ODIN Protocol", + "denom_units": [ + { + "denom": "ibc/0CD46223FEABD2AEAAAF1F057D01E63BCA79B7D4BD6B68F1EB973A987344695D", + "exponent": 0, + "aliases": [ + "mO9W" + ] + }, + { + "denom": "O9W", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/0CD46223FEABD2AEAAAF1F057D01E63BCA79B7D4BD6B68F1EB973A987344695D", + "name": "O9W", + "display": "O9W", + "symbol": "O9W", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "odin", + "base_denom": "mO9W", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-258", + "path": "transfer/channel-258/mO9W" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/odin/images/o9w.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/odin/images/o9w.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:805" + ] + }, + { + "description": "ELEVENPARIS loyalty token on KiChain", + "denom_units": [ + { + "denom": "ibc/AD185F62399F770CCCE8A36A180A77879FF6C26A0398BD3D2A74E087B0BFA121", + "exponent": 0, + "aliases": [ + "cw20:ki1dt3lk455ed360pna38fkhqn0p8y44qndsr77qu73ghyaz2zv4whq83mwdy" + ] + }, + { + "denom": "lvn", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "ki1dt3lk455ed360pna38fkhqn0p8y44qndsr77qu73ghyaz2zv4whq83mwdy", + "base": "ibc/AD185F62399F770CCCE8A36A180A77879FF6C26A0398BD3D2A74E087B0BFA121", + "name": "LVN", + "display": "lvn", + "symbol": "kichain.LVN", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "kichain", + "base_denom": "cw20:ki1dt3lk455ed360pna38fkhqn0p8y44qndsr77qu73ghyaz2zv4whq83mwdy", + "port": "wasm.ki1hzz0s0ucrhdp6tue2lxk3c03nj6f60qy463we7lgx0wudd72ctmsd9kgha", + "channel_id": "channel-18" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-261", + "path": "transfer/channel-261/cw20:ki1dt3lk455ed360pna38fkhqn0p8y44qndsr77qu73ghyaz2zv4whq83mwdy" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kichain/images/lvn.png" + }, + "coingecko_id": "lvn", + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/B547DC9B897E7C3AA5B824696110B8E3D2C31E3ED3F02FF363DCBAD82457E07E:772" + ] + }, + { + "description": "Glimmer (GLMR) is the utility token of the Moonbeam Network, Moonbeam’s primary deployment on the Polkadot network that serves as a developer-friendly parachain.", + "denom_units": [ + { + "denom": "ibc/1E26DB0E5122AED464D98462BD384FCCB595732A66B3970AE6CE0B58BAE0FC49", + "exponent": 0, + "aliases": [ + "wglmr-wei" + ] + }, + { + "denom": "wglmr", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/1E26DB0E5122AED464D98462BD384FCCB595732A66B3970AE6CE0B58BAE0FC49", + "name": "Moonbeam", + "display": "wglmr", + "symbol": "GLMR", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "moonbeam", + "base_denom": "Wei" + }, + "provider": "Moonbeam" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "moonbeam", + "base_denom": "0xacc15dc74880c9944775448304b263d191c6077f" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "wglmr-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/wglmr-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/moonbeam/images/glmr.svg" + }, + "coingecko_id": "moonbeam", + "keywords": [ + "osmosis-price:uosmo:825" + ] + }, + { + "description": "DeFi gaming platform built on Juno", + "denom_units": [ + { + "denom": "ibc/52C57FCA7D6854AA178E7A183DDBE4EF322B904B1D719FC485F6FFBC1F72A19E", + "exponent": 0, + "aliases": [ + "cw20:juno1j0a9ymgngasfn3l5me8qpd53l5zlm9wurfdk7r65s5mg6tkxal3qpgf5se" + ] + }, + { + "denom": "glto", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1j0a9ymgngasfn3l5me8qpd53l5zlm9wurfdk7r65s5mg6tkxal3qpgf5se", + "base": "ibc/52C57FCA7D6854AA178E7A183DDBE4EF322B904B1D719FC485F6FFBC1F72A19E", + "name": "Gelotto", + "display": "glto", + "symbol": "GLTO", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1j0a9ymgngasfn3l5me8qpd53l5zlm9wurfdk7r65s5mg6tkxal3qpgf5se", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1j0a9ymgngasfn3l5me8qpd53l5zlm9wurfdk7r65s5mg6tkxal3qpgf5se" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/glto.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/glto.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:778" + ] + }, + { + "description": "Gelotto Year 1 Grand Prize Token", + "denom_units": [ + { + "denom": "ibc/7C781B4C2082CD62129A972D47486D78EC17155C299270E3C89348EA026BEAF8", + "exponent": 0, + "aliases": [ + "cw20:juno1gz8cf86zr4vw9cjcyyv432vgdaecvr9n254d3uwwkx9rermekddsxzageh" + ] + }, + { + "denom": "gkey", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1gz8cf86zr4vw9cjcyyv432vgdaecvr9n254d3uwwkx9rermekddsxzageh", + "base": "ibc/7C781B4C2082CD62129A972D47486D78EC17155C299270E3C89348EA026BEAF8", + "name": "GKey", + "display": "gkey", + "symbol": "GKEY", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1gz8cf86zr4vw9cjcyyv432vgdaecvr9n254d3uwwkx9rermekddsxzageh", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1gz8cf86zr4vw9cjcyyv432vgdaecvr9n254d3uwwkx9rermekddsxzageh" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/gkey.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/gkey.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:790" + ] + }, + { + "description": "The native token of Crescent", + "denom_units": [ + { + "denom": "ibc/5A7C219BA5F7582B99629BA3B2A01A61BFDA0F6FD1FE95B5366F7334C4BC0580", + "exponent": 0, + "aliases": [ + "ucre" + ] + }, + { + "denom": "cre", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/5A7C219BA5F7582B99629BA3B2A01A61BFDA0F6FD1FE95B5366F7334C4BC0580", + "name": "Crescent", + "display": "cre", + "symbol": "CRE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "crescent", + "base_denom": "ucre", + "channel_id": "channel-9" + }, + "chain": { + "channel_id": "channel-297", + "path": "transfer/channel-297/ucre" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/crescent/images/cre.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/crescent/images/cre.svg" + }, + "coingecko_id": "crescent-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:786" + ] + }, + { + "description": "The native token of LumenX Network", + "denom_units": [ + { + "denom": "ibc/FFA652599C77E853F017193E36B5AB2D4D9AFC4B54721A74904F80C9236BF3B7", + "exponent": 0, + "aliases": [ + "ulumen" + ] + }, + { + "denom": "lumen", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/FFA652599C77E853F017193E36B5AB2D4D9AFC4B54721A74904F80C9236BF3B7", + "name": "LumenX", + "display": "lumen", + "symbol": "LUMEN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "lumenx", + "base_denom": "ulumen", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-286", + "path": "transfer/channel-286/ulumen" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/lumenx/images/lumen.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/lumenx/images/lumen.svg" + }, + "keywords": [ + "osmosis-price:uosmo:788", + "osmosis-unstable" + ] + }, + { + "description": "The native token of Oraichain", + "denom_units": [ + { + "denom": "ibc/161D7D62BAB3B9C39003334F1671208F43C06B643CC9EDBBE82B64793C857F1D", + "exponent": 0, + "aliases": [ + "orai" + ] + }, + { + "denom": "ORAI", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/161D7D62BAB3B9C39003334F1671208F43C06B643CC9EDBBE82B64793C857F1D", + "name": "Oraichain", + "display": "ORAI", + "symbol": "ORAI", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "oraichain", + "base_denom": "orai", + "channel_id": "channel-13" + }, + "chain": { + "channel_id": "channel-216", + "path": "transfer/channel-216/orai" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/oraichain/images/orai-white.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/oraichain/images/orai-white.svg" + }, + "coingecko_id": "oraichain-token", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:799" + ] + }, + { + "description": "The native token of the Cudos blockchain", + "denom_units": [ + { + "denom": "ibc/E09ED39F390EC51FA9F3F69BEA08B5BBE6A48B3057B2B1C3467FAAE9E58B021B", + "exponent": 0, + "aliases": [ + "attocudos", + "acudos" + ] + }, + { + "denom": "cudos", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/E09ED39F390EC51FA9F3F69BEA08B5BBE6A48B3057B2B1C3467FAAE9E58B021B", + "name": "Cudos", + "display": "cudos", + "symbol": "CUDOS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "cudos", + "base_denom": "acudos", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-298", + "path": "transfer/channel-298/acudos" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cudos/images/cudos.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/cudos/images/cudos.svg" + }, + "coingecko_id": "cudos", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:796" + ] + }, + { + "description": "The native stablecoin of Kava", + "denom_units": [ + { + "denom": "ibc/C78F65E1648A3DFE0BAEB6C4CDA69CC2A75437F1793C0E6386DFDA26393790AE", + "exponent": 0, + "aliases": [ + "usdx" + ] + }, + { + "denom": "USDX", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/C78F65E1648A3DFE0BAEB6C4CDA69CC2A75437F1793C0E6386DFDA26393790AE", + "name": "Kava USDX", + "display": "USDX", + "symbol": "USDX", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kava", + "base_denom": "usdx", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-143", + "path": "transfer/channel-143/usdx" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kava/images/usdx.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kava/images/usdx.svg" + }, + "coingecko_id": "usdx", + "keywords": [ + "osmosis-price:uosmo:1390" + ] + }, + { + "description": "BLD is the token used to secure the Agoric chain through staking and to backstop Inter Protocol.", + "denom_units": [ + { + "denom": "ibc/2DA9C149E9AD2BD27FEFA635458FB37093C256C1A940392634A16BEA45262604", + "exponent": 0, + "aliases": [ + "ubld" + ] + }, + { + "denom": "bld", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/2DA9C149E9AD2BD27FEFA635458FB37093C256C1A940392634A16BEA45262604", + "name": "Agoric", + "display": "bld", + "symbol": "BLD", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "agoric", + "base_denom": "ubld", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-320", + "path": "transfer/channel-320/ubld" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/agoric/images/bld.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/agoric/images/bld.svg" + }, + "coingecko_id": "agoric", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1104" + ] + }, + { + "description": "IST is the stable token used by the Agoric chain for execution fees and commerce.", + "denom_units": [ + { + "denom": "ibc/92BE0717F4678905E53F4E45B2DED18BC0CB97BF1F8B6A25AFEDF3D5A879B4D5", + "exponent": 0, + "aliases": [ + "uist" + ] + }, + { + "denom": "ist", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/92BE0717F4678905E53F4E45B2DED18BC0CB97BF1F8B6A25AFEDF3D5A879B4D5", + "name": "Inter Stable Token", + "display": "ist", + "symbol": "IST", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "agoric", + "base_denom": "uist", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-320", + "path": "transfer/channel-320/uist" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/agoric/images/ist.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/agoric/images/ist.svg" + }, + "coingecko_id": "inter-stable-token", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1224" + ] + }, + { + "description": "Staking derivative seJUNO for staked JUNO", + "denom_units": [ + { + "denom": "ibc/C6B6BFCB6EE49A7CAB1A7E7B021DE35B99D525AC660844952F0F6C78DCB2A57B", + "exponent": 0, + "aliases": [ + "cw20:juno1dd0k0um5rqncfueza62w9sentdfh3ec4nw4aq4lk5hkjl63vljqscth9gv" + ] + }, + { + "denom": "sejuno", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1dd0k0um5rqncfueza62w9sentdfh3ec4nw4aq4lk5hkjl63vljqscth9gv", + "base": "ibc/C6B6BFCB6EE49A7CAB1A7E7B021DE35B99D525AC660844952F0F6C78DCB2A57B", + "name": "StakeEasy seJUNO", + "display": "sejuno", + "symbol": "SEJUNO", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1dd0k0um5rqncfueza62w9sentdfh3ec4nw4aq4lk5hkjl63vljqscth9gv", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1dd0k0um5rqncfueza62w9sentdfh3ec4nw4aq4lk5hkjl63vljqscth9gv" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/sejuno.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/sejuno.svg" + }, + "coingecko_id": "stakeeasy-juno-derivative", + "keywords": [ + "osmosis-price:ibc/46B44899322F3CD854D2D46DEEF881958467CDD4B3B10086DA49296BBED94BED:807" + ] + }, + { + "description": "Staking derivative bJUNO for staked JUNO", + "denom_units": [ + { + "denom": "ibc/C2DF5C3949CA835B221C575625991F09BAB4E48FB9C11A4EE357194F736111E3", + "exponent": 0, + "aliases": [ + "cw20:juno1wwnhkagvcd3tjz6f8vsdsw5plqnw8qy2aj3rrhqr2axvktzv9q2qz8jxn3" + ] + }, + { + "denom": "bjuno", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1wwnhkagvcd3tjz6f8vsdsw5plqnw8qy2aj3rrhqr2axvktzv9q2qz8jxn3", + "base": "ibc/C2DF5C3949CA835B221C575625991F09BAB4E48FB9C11A4EE357194F736111E3", + "name": "StakeEasy bJUNO", + "display": "bjuno", + "symbol": "BJUNO", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1wwnhkagvcd3tjz6f8vsdsw5plqnw8qy2aj3rrhqr2axvktzv9q2qz8jxn3", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1wwnhkagvcd3tjz6f8vsdsw5plqnw8qy2aj3rrhqr2axvktzv9q2qz8jxn3" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/bjuno.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/bjuno.svg" + }, + "coingecko_id": "stakeeasy-bjuno" + }, + { + "description": "The native token of Stride", + "denom_units": [ + { + "denom": "ibc/A8CA5EE328FA10C9519DF6057DA1F69682D28F7D0F5CCC7ECB72E3DCA2D157A4", + "exponent": 0, + "aliases": [ + "ustrd" + ] + }, + { + "denom": "strd", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/A8CA5EE328FA10C9519DF6057DA1F69682D28F7D0F5CCC7ECB72E3DCA2D157A4", + "name": "Stride", + "display": "strd", + "symbol": "STRD", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "ustrd", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/ustrd" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/strd.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/strd.svg" + }, + "coingecko_id": "stride", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1098" + ] + }, + { + "description": "The native staking and governance token of the Cosmos Hub.", + "denom_units": [ + { + "denom": "ibc/C140AFD542AE77BD7DCC83F13FDD8C5E5BB8C4929785E6EC2F4C636F98F17901", + "exponent": 0, + "aliases": [ + "stuatom" + ] + }, + { + "denom": "statom", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/C140AFD542AE77BD7DCC83F13FDD8C5E5BB8C4929785E6EC2F4C636F98F17901", + "name": "Stride Staked ATOM", + "display": "statom", + "symbol": "stATOM", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "cosmoshub", + "base_denom": "uatom" + }, + "provider": "Stride" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "stuatom", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/stuatom" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/statom.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/statom.svg" + }, + "coingecko_id": "stride-staked-atom", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:1136" + ] + }, + { + "description": "The native token of Stargaze", + "denom_units": [ + { + "denom": "ibc/5DD1F95ED336014D00CE2520977EC71566D282F9749170ADC83A392E0EA7426A", + "exponent": 0, + "aliases": [ + "stustars" + ] + }, + { + "denom": "ststars", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/5DD1F95ED336014D00CE2520977EC71566D282F9749170ADC83A392E0EA7426A", + "name": "Stride Staked STARS", + "display": "ststars", + "symbol": "stSTARS", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "stargaze", + "base_denom": "ustars" + }, + "provider": "Stride" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "stustars", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/stustars" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/ststars.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/ststars.svg" + }, + "coingecko_id": "stride-staked-stars", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/987C17B11ABC2B20019178ACE62929FE9840202CE79498E29FE8E5CB02B7C0A4:1397" + ] + }, + { + "description": "Solarbank DAO Governance Token for speeding up the shift to renewable and green energy", + "denom_units": [ + { + "denom": "ibc/C3FC4DED273E7D1DD2E7BAA3317EC9A53CD3252B577AA33DC00D9DF2BDF3ED5C", + "exponent": 0, + "aliases": [ + "cw20:juno159q8t5g02744lxq8lfmcn6f78qqulq9wn3y9w7lxjgkz4e0a6kvsfvapse" + ] + }, + { + "denom": "solar", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno159q8t5g02744lxq8lfmcn6f78qqulq9wn3y9w7lxjgkz4e0a6kvsfvapse", + "base": "ibc/C3FC4DED273E7D1DD2E7BAA3317EC9A53CD3252B577AA33DC00D9DF2BDF3ED5C", + "name": "Solarbank DAO", + "display": "solar", + "symbol": "SOLAR", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno159q8t5g02744lxq8lfmcn6f78qqulq9wn3y9w7lxjgkz4e0a6kvsfvapse", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno159q8t5g02744lxq8lfmcn6f78qqulq9wn3y9w7lxjgkz4e0a6kvsfvapse" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/solar.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/solar.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:941" + ] + }, + { + "description": "StakeEasy governance token", + "denom_units": [ + { + "denom": "ibc/18A676A074F73B9B42DA4F9DFC8E5AEF334C9A6636DDEC8D34682F52F1DECDF6", + "exponent": 0, + "aliases": [ + "cw20:juno19rqljkh95gh40s7qdx40ksx3zq5tm4qsmsrdz9smw668x9zdr3lqtg33mf" + ] + }, + { + "denom": "seasy", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno19rqljkh95gh40s7qdx40ksx3zq5tm4qsmsrdz9smw668x9zdr3lqtg33mf", + "base": "ibc/18A676A074F73B9B42DA4F9DFC8E5AEF334C9A6636DDEC8D34682F52F1DECDF6", + "name": "StakeEasy SEASY", + "display": "seasy", + "symbol": "SEASY", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno19rqljkh95gh40s7qdx40ksx3zq5tm4qsmsrdz9smw668x9zdr3lqtg33mf", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno19rqljkh95gh40s7qdx40ksx3zq5tm4qsmsrdz9smw668x9zdr3lqtg33mf" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/seasy.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/seasy.svg" + }, + "keywords": [ + "osmosis-price:uosmo:808" + ] + }, + { + "description": "The native token of Axelar", + "denom_units": [ + { + "denom": "ibc/903A61A498756EA560B85A85132D3AEE21B5DEDD41213725D22ABF276EA6945E", + "exponent": 0, + "aliases": [ + "uaxl" + ] + }, + { + "denom": "axl", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/903A61A498756EA560B85A85132D3AEE21B5DEDD41213725D22ABF276EA6945E", + "name": "Axelar", + "display": "axl", + "symbol": "AXL", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "uaxl", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/uaxl" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/axelar/images/axl.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/axelar/images/axl.svg" + }, + "coingecko_id": "axelar", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:812" + ] + }, + { + "description": "REBUS, the native coin of the Rebus chain.", + "denom_units": [ + { + "denom": "ibc/A1AC7F9EE2F643A68E3A35BCEB22040120BEA4059773BB56985C76BDFEBC71D9", + "exponent": 0, + "aliases": [ + "arebus" + ] + }, + { + "denom": "rebus", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/A1AC7F9EE2F643A68E3A35BCEB22040120BEA4059773BB56985C76BDFEBC71D9", + "name": "Rebus", + "display": "rebus", + "symbol": "REBUS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "rebus", + "base_denom": "arebus", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-355", + "path": "transfer/channel-355/arebus" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/rebus/images/rebus.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/rebus/images/rebus.svg" + }, + "coingecko_id": "rebus", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:813" + ] + }, + { + "description": "The native token of Teritori", + "denom_units": [ + { + "denom": "ibc/EB7FB9C8B425F289B63703413327C2051030E848CE4EAAEA2E51199D6D39D3EC", + "exponent": 0, + "aliases": [ + "utori" + ] + }, + { + "denom": "tori", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/EB7FB9C8B425F289B63703413327C2051030E848CE4EAAEA2E51199D6D39D3EC", + "name": "Teritori", + "display": "tori", + "symbol": "TORI", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "teritori", + "base_denom": "utori", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-362", + "path": "transfer/channel-362/utori" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/teritori/images/utori.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/teritori/images/utori.svg" + }, + "coingecko_id": "teritori", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:816" + ] + }, + { + "description": "The native token of JUNO Chain", + "denom_units": [ + { + "denom": "ibc/84502A75BCA4A5F68D464C00B3F610CE2585847D59B52E5FFB7C3C9D2DDCD3FE", + "exponent": 0, + "aliases": [ + "stujuno" + ] + }, + { + "denom": "stjuno", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/84502A75BCA4A5F68D464C00B3F610CE2585847D59B52E5FFB7C3C9D2DDCD3FE", + "name": "Stride Staked JUNO", + "display": "stjuno", + "symbol": "stJUNO", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "juno", + "base_denom": "ujuno" + }, + "provider": "Stride" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "stujuno", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/stujuno" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stjuno.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stjuno.svg" + }, + "coingecko_id": "stride-staked-juno", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/46B44899322F3CD854D2D46DEEF881958467CDD4B3B10086DA49296BBED94BED:817" + ] + }, + { + "description": "The native token of Osmosis", + "denom_units": [ + { + "denom": "ibc/D176154B0C63D1F9C6DCFB4F70349EBF2E2B5A87A05902F57A6AE92B863E9AEC", + "exponent": 0, + "aliases": [ + "stuosmo" + ] + }, + { + "denom": "stosmo", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/D176154B0C63D1F9C6DCFB4F70349EBF2E2B5A87A05902F57A6AE92B863E9AEC", + "name": "Stride Staked OSMO", + "display": "stosmo", + "symbol": "stOSMO", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "osmosis", + "base_denom": "uosmo" + }, + "provider": "Stride" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "stuosmo", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/stuosmo" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stosmo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stosmo.svg" + }, + "coingecko_id": "stride-staked-osmo", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1252" + ] + }, + { + "description": "The native token cw20 for MuseDAO on Juno Chain", + "denom_units": [ + { + "denom": "ibc/6B982170CE024689E8DD0E7555B129B488005130D4EDA426733D552D10B36D8F", + "exponent": 0, + "aliases": [ + "cw20:juno1p8x807f6h222ur0vssqy3qk6mcpa40gw2pchquz5atl935t7kvyq894ne3" + ] + }, + { + "denom": "muse", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1p8x807f6h222ur0vssqy3qk6mcpa40gw2pchquz5atl935t7kvyq894ne3", + "base": "ibc/6B982170CE024689E8DD0E7555B129B488005130D4EDA426733D552D10B36D8F", + "name": "MuseDAO", + "display": "muse", + "symbol": "MUSE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1p8x807f6h222ur0vssqy3qk6mcpa40gw2pchquz5atl935t7kvyq894ne3", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1p8x807f6h222ur0vssqy3qk6mcpa40gw2pchquz5atl935t7kvyq894ne3" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/muse.png" + } + }, + { + "description": "The native token of Lambda", + "denom_units": [ + { + "denom": "ibc/80825E8F04B12D914ABEADB1F4D39C04755B12C8402F6876EE3168450C0A90BB", + "exponent": 0, + "aliases": [ + "ulamb" + ] + }, + { + "denom": "lamb", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/80825E8F04B12D914ABEADB1F4D39C04755B12C8402F6876EE3168450C0A90BB", + "name": "Lambda", + "display": "lamb", + "symbol": "LAMB", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "lambda", + "base_denom": "ulamb", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-378", + "path": "transfer/channel-378/ulamb" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/lambda/images/lambda.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/lambda/images/lambda.svg" + }, + "coingecko_id": "lambda", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:826" + ] + }, + { + "description": "The native over-collateralized stablecoin from the Kujira chain.", + "denom_units": [ + { + "denom": "ibc/44492EAB24B72E3FB59B9FA619A22337FB74F95D8808FE6BC78CC0E6C18DC2EC", + "exponent": 0, + "aliases": [ + "factory/kujira1qk00h5atutpsv900x202pxx42npjr9thg58dnqpa72f2p7m2luase444a7/uusk" + ] + }, + { + "denom": "usk", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/44492EAB24B72E3FB59B9FA619A22337FB74F95D8808FE6BC78CC0E6C18DC2EC", + "name": "USK", + "display": "usk", + "symbol": "USK", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kujira", + "base_denom": "factory/kujira1qk00h5atutpsv900x202pxx42npjr9thg58dnqpa72f2p7m2luase444a7/uusk", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-259", + "path": "transfer/channel-259/factory:kujira1qk00h5atutpsv900x202pxx42npjr9thg58dnqpa72f2p7m2luase444a7:uusk" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kujira/images/usk.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kujira/images/usk.svg" + }, + "coingecko_id": "usk", + "keywords": [ + "osmosis-main", + "osmosis-price:uosmo:827" + ] + }, + { + "description": "Staking and governance coin for the Unification Blockchain", + "denom_units": [ + { + "denom": "ibc/608EF5C0CE64FEA097500DB39657BDD36CA708CC5DCC2E250A024B6981DD36BC", + "exponent": 0, + "aliases": [ + "nund" + ] + }, + { + "denom": "FUND", + "exponent": 9 + } + ], + "type_asset": "ics20", + "base": "ibc/608EF5C0CE64FEA097500DB39657BDD36CA708CC5DCC2E250A024B6981DD36BC", + "name": "Unification", + "display": "FUND", + "symbol": "FUND", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "unification", + "base_denom": "nund", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-382", + "path": "transfer/channel-382/nund" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/unification/images/fund.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/unification/images/fund.svg" + }, + "coingecko_id": "unification", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1240" + ] + }, + { + "description": "The native staking and governance token of Jackal.", + "denom_units": [ + { + "denom": "ibc/8E697BDABE97ACE8773C6DF7402B2D1D5104DD1EEABE12608E3469B7F64C15BA", + "exponent": 0, + "aliases": [ + "ujkl" + ] + }, + { + "denom": "jkl", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/8E697BDABE97ACE8773C6DF7402B2D1D5104DD1EEABE12608E3469B7F64C15BA", + "name": "Jackal", + "display": "jkl", + "symbol": "JKL", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "jackal", + "base_denom": "ujkl", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-412", + "path": "transfer/channel-412/ujkl" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/jackal/images/jkl.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/jackal/images/jkl.svg" + }, + "coingecko_id": "jackal-protocol", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:832" + ] + }, + { + "description": "The native token cw20 for Alter on Secret Network", + "denom_units": [ + { + "denom": "ibc/A6383B6CF5EA23E067666C06BC34E2A96869927BD9744DC0C1643E589C710AA3", + "exponent": 0, + "aliases": [ + "cw20:secret12rcvz0umvk875kd6a803txhtlu7y0pnd73kcej" + ] + }, + { + "denom": "alter", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/A6383B6CF5EA23E067666C06BC34E2A96869927BD9744DC0C1643E589C710AA3", + "name": "Alter", + "display": "alter", + "symbol": "ALTER", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "cw20:secret12rcvz0umvk875kd6a803txhtlu7y0pnd73kcej", + "port": "wasm.secret1tqmms5awftpuhalcv5h5mg76fa0tkdz4jv9ex4", + "channel_id": "channel-44" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-476", + "path": "transfer/channel-476/cw20:secret12rcvz0umvk875kd6a803txhtlu7y0pnd73kcej" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/alter.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/alter.svg" + }, + "coingecko_id": "alter", + "keywords": [ + "osmosis-price:uosmo:845" + ] + }, + { + "description": "The native token cw20 for Button on Secret Network", + "denom_units": [ + { + "denom": "ibc/1FBA9E763B8679BEF7BAAAF2D16BCA78C3B297D226C3F31312C769D7B8F992D8", + "exponent": 0, + "aliases": [ + "cw20:secret1yxcexylwyxlq58umhgsjgstgcg2a0ytfy4d9lt" + ] + }, + { + "denom": "butt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "secret1yxcexylwyxlq58umhgsjgstgcg2a0ytfy4d9lt", + "base": "ibc/1FBA9E763B8679BEF7BAAAF2D16BCA78C3B297D226C3F31312C769D7B8F992D8", + "name": "Button", + "display": "butt", + "symbol": "BUTT", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "cw20:secret1yxcexylwyxlq58umhgsjgstgcg2a0ytfy4d9lt", + "port": "wasm.secret1tqmms5awftpuhalcv5h5mg76fa0tkdz4jv9ex4", + "channel_id": "channel-44" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-476", + "path": "transfer/channel-476/cw20:secret1yxcexylwyxlq58umhgsjgstgcg2a0ytfy4d9lt" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/butt.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/butt.svg" + }, + "coingecko_id": "buttcoin-2", + "keywords": [ + "osmosis-price:uosmo:985" + ] + }, + { + "description": "The native token cw20 for Shade on Secret Network", + "denom_units": [ + { + "denom": "ibc/71055835C7639739EAE03AACD1324FE162DBA41D09F197CB72D966D014225B1C", + "exponent": 0, + "aliases": [ + "cw20:secret1qfql357amn448duf5gvp9gr48sxx9tsnhupu3d" + ] + }, + { + "denom": "shd", + "exponent": 8 + } + ], + "type_asset": "ics20", + "address": "secret1qfql357amn448duf5gvp9gr48sxx9tsnhupu3d", + "base": "ibc/71055835C7639739EAE03AACD1324FE162DBA41D09F197CB72D966D014225B1C", + "name": "Shade (old)", + "display": "shd", + "symbol": "SHD(old)", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "cw20:secret1qfql357amn448duf5gvp9gr48sxx9tsnhupu3d", + "port": "wasm.secret1tqmms5awftpuhalcv5h5mg76fa0tkdz4jv9ex4", + "channel_id": "channel-44" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-476", + "path": "transfer/channel-476/cw20:secret1qfql357amn448duf5gvp9gr48sxx9tsnhupu3d" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/shdold.svg" + }, + "keywords": [ + "osmosis-price:uosmo:846" + ] + }, + { + "description": "The native token cw20 for SIENNA on Secret Network", + "denom_units": [ + { + "denom": "ibc/9A8A93D04917A149C8AC7C16D3DA8F470D59E8D867499C4DA97450E1D7363213", + "exponent": 0, + "aliases": [ + "cw20:secret1rgm2m5t530tdzyd99775n6vzumxa5luxcllml4" + ] + }, + { + "denom": "sienna", + "exponent": 18 + } + ], + "type_asset": "ics20", + "address": "secret1rgm2m5t530tdzyd99775n6vzumxa5luxcllml4", + "base": "ibc/9A8A93D04917A149C8AC7C16D3DA8F470D59E8D867499C4DA97450E1D7363213", + "name": "SIENNA", + "display": "sienna", + "symbol": "SIENNA", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "cw20:secret1rgm2m5t530tdzyd99775n6vzumxa5luxcllml4", + "port": "wasm.secret1tqmms5awftpuhalcv5h5mg76fa0tkdz4jv9ex4", + "channel_id": "channel-44" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-476", + "path": "transfer/channel-476/cw20:secret1rgm2m5t530tdzyd99775n6vzumxa5luxcllml4" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/sienna.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/sienna.svg" + }, + "coingecko_id": "sienna", + "keywords": [ + "osmosis-price:uosmo:853" + ] + }, + { + "description": "The native token cw20 for SCRT Staking Derivatives on Secret Network", + "denom_units": [ + { + "denom": "ibc/D0E5BF2940FB58D9B283A339032DE88111407AAD7D94A7F1F3EB78874F8616D4", + "exponent": 0, + "aliases": [ + "cw20:secret1k6u0cy4feepm6pehnz804zmwakuwdapm69tuc4" + ] + }, + { + "denom": "stkd-scrt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "secret1k6u0cy4feepm6pehnz804zmwakuwdapm69tuc4", + "base": "ibc/D0E5BF2940FB58D9B283A339032DE88111407AAD7D94A7F1F3EB78874F8616D4", + "name": "SCRT Staking Derivatives", + "display": "stkd-scrt", + "symbol": "stkd-SCRT", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "cw20:secret1k6u0cy4feepm6pehnz804zmwakuwdapm69tuc4", + "port": "wasm.secret1tqmms5awftpuhalcv5h5mg76fa0tkdz4jv9ex4", + "channel_id": "channel-44" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-476", + "path": "transfer/channel-476/cw20:secret1k6u0cy4feepm6pehnz804zmwakuwdapm69tuc4" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/stkd-scrt.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/stkd-scrt.svg" + }, + "coingecko_id": "stkd-scrt", + "keywords": [ + "osmosis-price:ibc/0954E1C28EB7AF5B72D24F3BC2B47BBB2FDF91BDDFD57B74B99E133AED40972A:854" + ] + }, + { + "description": "BeeZee native blockchain", + "denom_units": [ + { + "denom": "ibc/C822645522FC3EECF817609AA38C24B64D04F5C267A23BCCF8F2E3BC5755FA88", + "exponent": 0, + "aliases": [ + "ubze" + ] + }, + { + "denom": "bze", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/C822645522FC3EECF817609AA38C24B64D04F5C267A23BCCF8F2E3BC5755FA88", + "name": "BeeZee", + "display": "bze", + "symbol": "BZE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "beezee", + "base_denom": "ubze", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-340", + "path": "transfer/channel-340/ubze" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/beezee/images/bze.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/beezee/images/bze.svg" + }, + "coingecko_id": "bzedge", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:856" + ] + }, + { + "description": "The native token cw20 for Fanfury on Juno Chain", + "denom_units": [ + { + "denom": "ibc/7CE5F388D661D82A0774E47B5129DA51CC7129BD1A70B5FA6BCEBB5B0A2FAEAF", + "exponent": 0, + "aliases": [ + "cw20:juno1cltgm8v842gu54srmejewghnd6uqa26lzkpa635wzra9m9xuudkqa2gtcz" + ] + }, + { + "denom": "fury", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1cltgm8v842gu54srmejewghnd6uqa26lzkpa635wzra9m9xuudkqa2gtcz", + "base": "ibc/7CE5F388D661D82A0774E47B5129DA51CC7129BD1A70B5FA6BCEBB5B0A2FAEAF", + "name": "Fanfury", + "display": "fury", + "symbol": "FURY", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1cltgm8v842gu54srmejewghnd6uqa26lzkpa635wzra9m9xuudkqa2gtcz", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1cltgm8v842gu54srmejewghnd6uqa26lzkpa635wzra9m9xuudkqa2gtcz" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/fanfury.png" + }, + "coingecko_id": "fanfury" + }, + { + "description": "The native EVM, governance and staking token of the Acrechain", + "denom_units": [ + { + "denom": "ibc/BB936517F7E5D77A63E0ADB05217A6608B0C4CF8FBA7EA2F4BAE4107A7238F06", + "exponent": 0, + "aliases": [ + "aacre" + ] + }, + { + "denom": "acre", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/BB936517F7E5D77A63E0ADB05217A6608B0C4CF8FBA7EA2F4BAE4107A7238F06", + "name": "Acrechain", + "display": "acre", + "symbol": "ACRE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "acrechain", + "base_denom": "aacre", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-490", + "path": "transfer/channel-490/aacre" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/acrechain/images/acre.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/acrechain/images/acre.svg" + }, + "coingecko_id": "arable-protocol", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:858" + ] + }, + { + "description": "Stable Token of Harbor protocol on Comdex network", + "denom_units": [ + { + "denom": "ibc/23CA6C8D1AB2145DD13EB1E089A2E3F960DC298B468CCE034E19E5A78B61136E", + "exponent": 0, + "aliases": [ + "ucmst" + ] + }, + { + "denom": "cmst", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/23CA6C8D1AB2145DD13EB1E089A2E3F960DC298B468CCE034E19E5A78B61136E", + "name": "CMST", + "display": "cmst", + "symbol": "CMST", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "comdex", + "base_denom": "ucmst", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-87", + "path": "transfer/channel-87/ucmst" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/comdex/images/cmst.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/comdex/images/cmst.svg" + }, + "coingecko_id": "composite", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:857", + "peg:collateralized" + ] + }, + { + "description": "The native EVM, governance and staking token of the Imversed", + "denom_units": [ + { + "denom": "ibc/92B223EBFA74DB99BEA92B23DEAA6050734FEEAABB84689CB8E1AE8F9C9F9AF4", + "exponent": 0, + "aliases": [ + "aimv" + ] + }, + { + "denom": "imv", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/92B223EBFA74DB99BEA92B23DEAA6050734FEEAABB84689CB8E1AE8F9C9F9AF4", + "name": "Imversed", + "display": "imv", + "symbol": "IMV", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "imversed", + "base_denom": "aimv", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-517", + "path": "transfer/channel-517/aimv" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/imversed/images/imversed.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/imversed/images/imversed.svg" + }, + "coingecko_id": "imv", + "keywords": [ + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:866" + ] + }, + { + "description": "The native token of Medas Digital Network", + "denom_units": [ + { + "denom": "ibc/01E94A5FF29B8DDEFC86F412CC3927F7330E9B523CC63A6194B1108F5276025C", + "exponent": 0, + "aliases": [ + "umedas" + ] + }, + { + "denom": "medas", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/01E94A5FF29B8DDEFC86F412CC3927F7330E9B523CC63A6194B1108F5276025C", + "name": "Medas Digital Network", + "display": "medas", + "symbol": "MEDAS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "medasdigital", + "base_denom": "umedas", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-519", + "path": "transfer/channel-519/umedas" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/medasdigital/images/medas.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/medasdigital/images/medas.svg" + }, + "keywords": [ + "medas", + "osmosis-info", + "osmosis-price:ibc/41999DF04D9441DAC0DF5D8291DF4333FBCBA810FFD63FDCE34FDF41EF37B6F7:1329" + ] + }, + { + "description": "The native token cw20 for PHMN on Juno Chain", + "denom_units": [ + { + "denom": "ibc/D3B574938631B0A1BA704879020C696E514CFADAA7643CDE4BD5EB010BDE327B", + "exponent": 0, + "aliases": [ + "cw20:juno1rws84uz7969aaa7pej303udhlkt3j9ca0l3egpcae98jwak9quzq8szn2l" + ] + }, + { + "denom": "phmn", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1rws84uz7969aaa7pej303udhlkt3j9ca0l3egpcae98jwak9quzq8szn2l", + "base": "ibc/D3B574938631B0A1BA704879020C696E514CFADAA7643CDE4BD5EB010BDE327B", + "name": "POSTHUMAN", + "display": "phmn", + "symbol": "PHMN", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1rws84uz7969aaa7pej303udhlkt3j9ca0l3egpcae98jwak9quzq8szn2l", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1rws84uz7969aaa7pej303udhlkt3j9ca0l3egpcae98jwak9quzq8szn2l" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/phmn.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/phmn.svg" + }, + "coingecko_id": "posthuman", + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:1255" + ] + }, + { + "description": "The native token cw20 for Amber on Secret Network", + "denom_units": [ + { + "denom": "ibc/18A1B70E3205A48DE8590C0D11030E7146CDBF1048789261D53FFFD7527F8B55", + "exponent": 0, + "aliases": [ + "cw20:secret1s09x2xvfd2lp2skgzm29w2xtena7s8fq98v852" + ] + }, + { + "denom": "amber", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "secret1s09x2xvfd2lp2skgzm29w2xtena7s8fq98v852", + "base": "ibc/18A1B70E3205A48DE8590C0D11030E7146CDBF1048789261D53FFFD7527F8B55", + "name": "Amber", + "display": "amber", + "symbol": "AMBER", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "cw20:secret1s09x2xvfd2lp2skgzm29w2xtena7s8fq98v852", + "port": "wasm.secret1tqmms5awftpuhalcv5h5mg76fa0tkdz4jv9ex4", + "channel_id": "channel-44" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-476", + "path": "transfer/channel-476/cw20:secret1s09x2xvfd2lp2skgzm29w2xtena7s8fq98v852" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/amber.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/amber.svg" + }, + "keywords": [ + "osmosis-price:uosmo:984" + ] + }, + { + "description": "The native token of Onomy Protocol", + "denom_units": [ + { + "denom": "ibc/B9606D347599F0F2FDF82BA3EE339000673B7D274EA50F59494DC51EFCD42163", + "exponent": 0, + "aliases": [ + "anom" + ] + }, + { + "denom": "nom", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/B9606D347599F0F2FDF82BA3EE339000673B7D274EA50F59494DC51EFCD42163", + "name": "Onomy", + "display": "nom", + "symbol": "NOM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "onomy", + "base_denom": "anom", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-525", + "path": "transfer/channel-525/anom" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/onomy/images/nom.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/onomy/images/nom.svg" + }, + "coingecko_id": "onomy-protocol", + "keywords": [ + "dex", + "stablecoin", + "bridge", + "staking", + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:882" + ] + }, + { + "description": "PSTAKE Liquid-Staked ATOM", + "denom_units": [ + { + "denom": "ibc/CAA179E40F0266B0B29FB5EAA288FB9212E628822265D4141EBD1C47C3CBFCBC", + "exponent": 0, + "aliases": [ + "stk/uatom" + ] + }, + { + "denom": "stkatom", + "exponent": 6, + "aliases": [ + "stk/atom" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/CAA179E40F0266B0B29FB5EAA288FB9212E628822265D4141EBD1C47C3CBFCBC", + "name": "PSTAKE staked ATOM", + "display": "stkatom", + "symbol": "stkATOM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "persistence", + "base_denom": "stk/uatom", + "channel_id": "channel-6" + }, + "chain": { + "channel_id": "channel-4", + "path": "transfer/channel-4/stk/uatom" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/persistence/images/stkatom.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/persistence/images/stkatom.svg" + }, + "coingecko_id": "stkatom", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:886" + ] + }, + { + "description": "The native staking and governance token of the Dyson Protocol", + "denom_units": [ + { + "denom": "ibc/E27CD305D33F150369AB526AEB6646A76EC3FFB1A6CA58A663B5DE657A89D55D", + "exponent": 0, + "aliases": [ + "dys" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/E27CD305D33F150369AB526AEB6646A76EC3FFB1A6CA58A663B5DE657A89D55D", + "name": "Dyson Protocol", + "display": "dys", + "symbol": "DYS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "dyson", + "base_denom": "dys", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-526", + "path": "transfer/channel-526/dys" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/dyson/images/dys.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/dyson/images/dys.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/D1542AA8762DB13087D8364F3EA6509FD6F009A34F00426AF9E4F9FA85CBBF1F:950" + ] + }, + { + "description": "The native token cw20 for Hopers on Juno Chain", + "denom_units": [ + { + "denom": "ibc/D3ADAF73F84CDF205BCB72C142FDAEEA2C612AB853CEE6D6C06F184FA38B1099", + "exponent": 0, + "aliases": [ + "cw20:juno1u45shlp0q4gcckvsj06ss4xuvsu0z24a0d0vr9ce6r24pht4e5xq7q995n" + ] + }, + { + "denom": "hopers", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1u45shlp0q4gcckvsj06ss4xuvsu0z24a0d0vr9ce6r24pht4e5xq7q995n", + "base": "ibc/D3ADAF73F84CDF205BCB72C142FDAEEA2C612AB853CEE6D6C06F184FA38B1099", + "name": "Hopers", + "display": "hopers", + "symbol": "HOPERS", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1u45shlp0q4gcckvsj06ss4xuvsu0z24a0d0vr9ce6r24pht4e5xq7q995n", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1u45shlp0q4gcckvsj06ss4xuvsu0z24a0d0vr9ce6r24pht4e5xq7q995n" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/hopers.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/hopers.svg" + }, + "coingecko_id": "hopers-io ", + "keywords": [ + "osmosis-price:uosmo:894" + ] + }, + { + "description": "Overcollateralized stable coin for Arable derivatives v1", + "denom_units": [ + { + "denom": "ibc/5D270A584B1078FBE07D14570ED5E88EC1FEDA8518B76C322606291E6FD8286F", + "exponent": 0, + "aliases": [ + "erc20/0x2Cbea61fdfDFA520Ee99700F104D5b75ADf50B0c" + ] + }, + { + "denom": "arusd", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/5D270A584B1078FBE07D14570ED5E88EC1FEDA8518B76C322606291E6FD8286F", + "name": "Arable USD", + "display": "arusd", + "symbol": "arUSD", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "acrechain", + "base_denom": "erc20/0x2Cbea61fdfDFA520Ee99700F104D5b75ADf50B0c", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-490", + "path": "transfer/channel-490/erc20/0x2Cbea61fdfDFA520Ee99700F104D5b75ADf50B0c" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/acrechain/images/arusd.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/acrechain/images/arusd.svg" + }, + "coingecko_id": "arable-usd", + "keywords": [ + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:895" + ] + }, + { + "description": "The native EVM, governance and staking token of the Planq Network", + "denom_units": [ + { + "denom": "ibc/B1E0166EA0D759FDF4B207D1F5F12210D8BFE36F2345CEFC76948CE2B36DFBAF", + "exponent": 0, + "aliases": [ + "aplanq" + ] + }, + { + "denom": "planq", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/B1E0166EA0D759FDF4B207D1F5F12210D8BFE36F2345CEFC76948CE2B36DFBAF", + "name": "Planq", + "display": "planq", + "symbol": "PLQ", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "planq", + "base_denom": "aplanq", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-492", + "path": "transfer/channel-492/aplanq" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/planq/images/planq.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/planq/images/planq.svg" + }, + "coingecko_id": "planq", + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1218" + ] + }, + { + "description": "Fantom's native utility token — FTM — powers the entire Fantom blockchain ecosystem. FTM tokens are used for staking, governance, payments, and fees on the network.", + "denom_units": [ + { + "denom": "ibc/5E2DFDF1734137302129EA1C1BA21A580F96F778D4F021815EA4F6DB378DA1A4", + "exponent": 0, + "aliases": [ + "wftm-wei" + ] + }, + { + "denom": "ftm", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/5E2DFDF1734137302129EA1C1BA21A580F96F778D4F021815EA4F6DB378DA1A4", + "name": "Fantom", + "display": "ftm", + "symbol": "FTM", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "fantom", + "base_denom": "wei" + }, + "chain": { + "contract": "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83" + }, + "provider": "Fantom" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "fantom", + "base_denom": "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "wftm-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/wftm-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/fantom/images/ftm.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/fantom/images/ftm.svg" + }, + "coingecko_id": "fantom", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:900" + ] + }, + { + "description": "Canto is a Layer-1 blockchain built to deliver on the promise of DeFi", + "denom_units": [ + { + "denom": "ibc/47CAF2DB8C016FAC960F33BC492FD8E454593B65CC59D70FA9D9F30424F9C32F", + "exponent": 0, + "aliases": [ + "acanto" + ] + }, + { + "denom": "canto", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/47CAF2DB8C016FAC960F33BC492FD8E454593B65CC59D70FA9D9F30424F9C32F", + "name": "Canto", + "display": "canto", + "symbol": "CANTO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "canto", + "base_denom": "acanto", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-550", + "path": "transfer/channel-550/acanto" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/canto/images/canto.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/canto/images/canto.svg" + }, + "coingecko_id": "canto", + "keywords": [ + "osmosis-main", + "osmosis-price:uosmo:901" + ] + }, + { + "description": "Quicksilver Liquid Staked STARS", + "denom_units": [ + { + "denom": "ibc/46C83BB054E12E189882B5284542DB605D94C99827E367C9192CF0579CD5BC83", + "exponent": 0, + "aliases": [ + "uqstars" + ] + }, + { + "denom": "qstars", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "base": "ibc/46C83BB054E12E189882B5284542DB605D94C99827E367C9192CF0579CD5BC83", + "name": "Quicksilver Liquid Staked STARS", + "display": "qstars", + "symbol": "qSTARS", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "stargaze", + "base_denom": "ustars" + }, + "provider": "Quicksilver" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "quicksilver", + "base_denom": "uqstars", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-522", + "path": "transfer/channel-522/uqstars" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qstars.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qstars.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/987C17B11ABC2B20019178ACE62929FE9840202CE79498E29FE8E5CB02B7C0A4:903" + ] + }, + { + "description": "WYND DAO Governance Token", + "denom_units": [ + { + "denom": "ibc/2FBAC4BF296D7844796844B35978E5899984BA5A6314B2DD8F83C215550010B3", + "exponent": 0, + "aliases": [ + "cw20:juno1mkw83sv6c7sjdvsaplrzc8yaes9l42p4mhy0ssuxjnyzl87c9eps7ce3m9" + ] + }, + { + "denom": "wynd", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1mkw83sv6c7sjdvsaplrzc8yaes9l42p4mhy0ssuxjnyzl87c9eps7ce3m9", + "base": "ibc/2FBAC4BF296D7844796844B35978E5899984BA5A6314B2DD8F83C215550010B3", + "name": "Wynd DAO Governance Token", + "display": "wynd", + "symbol": "WYND", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1mkw83sv6c7sjdvsaplrzc8yaes9l42p4mhy0ssuxjnyzl87c9eps7ce3m9", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1mkw83sv6c7sjdvsaplrzc8yaes9l42p4mhy0ssuxjnyzl87c9eps7ce3m9" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/wynd.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/wynd.svg" + }, + "coingecko_id": "wynd", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:902" + ] + }, + { + "description": "USDC is a fully collateralized US Dollar stablecoin developed by CENTRE, the open source project with Circle being the first of several forthcoming issuers.", + "denom_units": [ + { + "denom": "ibc/231FD77ECCB2DB916D314019DA30FE013202833386B1908A191D16989AD80B5A", + "exponent": 0, + "aliases": [ + "polygon-uusdc" + ] + }, + { + "denom": "polygon-usdc", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/231FD77ECCB2DB916D314019DA30FE013202833386B1908A191D16989AD80B5A", + "name": "USD Coin (Polygon)", + "display": "polygon-usdc", + "symbol": "polygon.USDC", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Circle" + }, + { + "type": "additional-mintage", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "provider": "Circle" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "polygon", + "base_denom": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "polygon-uusdc", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/polygon-uusdc" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/polygon.usdc.svg" + }, + "coingecko_id": "usd-coin", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:938", + "peg:collateralized" + ] + }, + { + "description": "USDC is a fully collateralized US Dollar stablecoin developed by CENTRE, the open source project with Circle being the first of several forthcoming issuers.", + "denom_units": [ + { + "denom": "ibc/F17C9CA112815613C5B6771047A093054F837C3020CBA59DFFD9D780A8B2984C", + "exponent": 0, + "aliases": [ + "avalanche-uusdc" + ] + }, + { + "denom": "avalanche-usdc", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/F17C9CA112815613C5B6771047A093054F837C3020CBA59DFFD9D780A8B2984C", + "name": "USD Coin (Avalanche)", + "display": "avalanche-usdc", + "symbol": "avalanche.USDC", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Circle" + }, + { + "type": "additional-mintage", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "provider": "Circle" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "avalanche", + "base_denom": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "avalanche-uusdc", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/avalanche-uusdc" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/avalanche.usdc.svg" + }, + "coingecko_id": "usd-coin", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:938", + "peg:collateralized" + ] + }, + { + "description": "Mars protocol token", + "denom_units": [ + { + "denom": "ibc/573FCD90FACEE750F55A8864EF7D38265F07E5A9273FA0E8DAFD39951332B580", + "exponent": 0, + "aliases": [ + "umars" + ] + }, + { + "denom": "mars", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/573FCD90FACEE750F55A8864EF7D38265F07E5A9273FA0E8DAFD39951332B580", + "name": "Mars Hub", + "display": "mars", + "symbol": "MARS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "mars", + "base_denom": "umars", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-557", + "path": "transfer/channel-557/umars" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/mars/images/mars-token.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/mars/images/mars-token.svg" + }, + "coingecko_id": "mars-protocol-a7fcbcfb-fd61-4017-92f0-7ee9f9cc6da3", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1099" + ] + }, + { + "description": "Ciento Exchange Token", + "denom_units": [ + { + "denom": "ibc/D38BB3DD46864694F009AF01DA5A815B3A875F8CC52FF5679BFFCC35DC7451D5", + "exponent": 0, + "aliases": [ + "erc20/0xAE6D3334989a22A65228732446731438672418F2" + ] + }, + { + "denom": "cnto", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/D38BB3DD46864694F009AF01DA5A815B3A875F8CC52FF5679BFFCC35DC7451D5", + "name": "Ciento Token", + "display": "cnto", + "symbol": "CNTO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "acrechain", + "base_denom": "erc20/0xAE6D3334989a22A65228732446731438672418F2", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-490", + "path": "transfer/channel-490/erc20/0xAE6D3334989a22A65228732446731438672418F2" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/acrechain/images/cnto.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/acrechain/images/cnto.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:909" + ] + }, + { + "description": "The native staking token of Terra.", + "denom_units": [ + { + "denom": "ibc/C491E7582E94AE921F6A029790083CDE1106C28F3F6C4AD7F1340544C13EC372", + "exponent": 0, + "aliases": [ + "stuluna" + ] + }, + { + "denom": "stluna", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/C491E7582E94AE921F6A029790083CDE1106C28F3F6C4AD7F1340544C13EC372", + "name": "Stride Staked LUNA", + "display": "stluna", + "symbol": "stLUNA", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "terra2", + "base_denom": "uluna" + }, + "provider": "Stride" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "stuluna", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/stuluna" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stluna.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stluna.svg" + }, + "coingecko_id": "stride-staked-luna", + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9:913" + ] + }, + { + "denom_units": [ + { + "denom": "ibc/C5579A9595790017C600DD726276D978B9BF314CF82406CE342720A9C7911A01", + "exponent": 0, + "aliases": [ + "staevmos" + ] + }, + { + "denom": "stevmos", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/C5579A9595790017C600DD726276D978B9BF314CF82406CE342720A9C7911A01", + "name": "Stride Staked EVMOS", + "display": "stevmos", + "symbol": "stEVMOS", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "evmos", + "base_denom": "uaevmos" + }, + "provider": "Stride" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "staevmos", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/staevmos" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stevmos.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stevmos.svg" + }, + "coingecko_id": "stride-staked-evmos", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/6AE98883D4D5D5FF9E50D7130F1305DA2FFA0C652D1DD9C123657C6B4EB2DF8A:922" + ] + }, + { + "description": "nRide Token", + "denom_units": [ + { + "denom": "ibc/E750D31033DC1CF4A044C3AA0A8117401316DC918FBEBC4E3D34F91B09D5F54C", + "exponent": 0, + "aliases": [ + "cw20:juno1qmlchtmjpvu0cr7u0tad2pq8838h6farrrjzp39eqa9xswg7teussrswlq" + ] + }, + { + "denom": "nride", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1qmlchtmjpvu0cr7u0tad2pq8838h6farrrjzp39eqa9xswg7teussrswlq", + "base": "ibc/E750D31033DC1CF4A044C3AA0A8117401316DC918FBEBC4E3D34F91B09D5F54C", + "name": "nRide Token", + "display": "nride", + "symbol": "NRIDE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1qmlchtmjpvu0cr7u0tad2pq8838h6farrrjzp39eqa9xswg7teussrswlq", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1qmlchtmjpvu0cr7u0tad2pq8838h6farrrjzp39eqa9xswg7teussrswlq" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/nride.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/nride.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:924" + ] + }, + { + "description": "The native staking token of 8ball.", + "denom_units": [ + { + "denom": "ibc/8BE73A810E22F80E5E850531A688600D63AE7392E7C2770AE758CAA4FD921B7F", + "exponent": 0, + "aliases": [ + "uebl" + ] + }, + { + "denom": "ebl", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/8BE73A810E22F80E5E850531A688600D63AE7392E7C2770AE758CAA4FD921B7F", + "name": "8ball", + "display": "ebl", + "symbol": "EBL", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "8ball", + "base_denom": "uebl", + "channel_id": "channel-16" + }, + "chain": { + "channel_id": "channel-641", + "path": "transfer/channel-641/uebl" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/8ball/images/8ball.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/8ball/images/8ball.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:935" + ] + }, + { + "description": "Quicksilver Liquid Staked ATOM", + "denom_units": [ + { + "denom": "ibc/FA602364BEC305A696CBDF987058E99D8B479F0318E47314C49173E8838C5BAC", + "exponent": 0, + "aliases": [ + "uqatom" + ] + }, + { + "denom": "qatom", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "base": "ibc/FA602364BEC305A696CBDF987058E99D8B479F0318E47314C49173E8838C5BAC", + "name": "Quicksilver Liquid Staked ATOM", + "display": "qatom", + "symbol": "qATOM", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "cosmoshub", + "base_denom": "uatom" + }, + "provider": "Quicksilver" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "quicksilver", + "base_denom": "uqatom", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-522", + "path": "transfer/channel-522/uqatom" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qatom.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qatom.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:944" + ] + }, + { + "description": "Governance Token of Harbor protocol on Comdex network", + "denom_units": [ + { + "denom": "ibc/AD4DEA52408EA07C0C9E19444EC8DA84A274A70AD2687A710EFDDEB28BB2986A", + "exponent": 0, + "aliases": [ + "uharbor" + ] + }, + { + "denom": "harbor", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/AD4DEA52408EA07C0C9E19444EC8DA84A274A70AD2687A710EFDDEB28BB2986A", + "name": "Harbor", + "display": "harbor", + "symbol": "HARBOR", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "comdex", + "base_denom": "uharbor", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-87", + "path": "transfer/channel-87/uharbor" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/comdex/images/harbor.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/comdex/images/harbor.svg" + }, + "coingecko_id": "harbor-2", + "keywords": [ + "osmosis-price:uosmo:967" + ] + }, + { + "description": "Quicksilver Liquid Staked REGEN", + "denom_units": [ + { + "denom": "ibc/79A676508A2ECA1021EDDC7BB9CF70CEEC9514C478DA526A5A8B3E78506C2206", + "exponent": 0, + "aliases": [ + "uqregen" + ] + }, + { + "denom": "qregen", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "base": "ibc/79A676508A2ECA1021EDDC7BB9CF70CEEC9514C478DA526A5A8B3E78506C2206", + "name": "Quicksilver Liquid Staked Regen", + "display": "qregen", + "symbol": "qREGEN", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "regen", + "base_denom": "uregen" + }, + "provider": "Quicksilver" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "quicksilver", + "base_denom": "uqregen", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-522", + "path": "transfer/channel-522/uqregen" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qregen.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qregen.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/1DCC8A6CB5689018431323953344A9F6CC4D0BFB261E88C9F7777372C10CD076:948" + ] + }, + { + "description": "Inspired by Bonk. A community project to celebrate the settlers of JunoNetwork.", + "denom_units": [ + { + "denom": "ibc/4F24D904BAB5FFBD3524F2DE3EC3C7A9E687A2408D9A985E57B356D9FA9201C6", + "exponent": 0, + "aliases": [ + "cw20:juno1u8cr3hcjvfkzxcaacv9q75uw9hwjmn8pucc93pmy6yvkzz79kh3qncca8x" + ] + }, + { + "denom": "fox", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1u8cr3hcjvfkzxcaacv9q75uw9hwjmn8pucc93pmy6yvkzz79kh3qncca8x", + "base": "ibc/4F24D904BAB5FFBD3524F2DE3EC3C7A9E687A2408D9A985E57B356D9FA9201C6", + "name": "Juno Fox", + "display": "fox", + "symbol": "FOX", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1u8cr3hcjvfkzxcaacv9q75uw9hwjmn8pucc93pmy6yvkzz79kh3qncca8x", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1u8cr3hcjvfkzxcaacv9q75uw9hwjmn8pucc93pmy6yvkzz79kh3qncca8x" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/fox.png" + }, + "keywords": [ + "osmosis-price:uosmo:949" + ] + }, + { + "description": "QCK - native token of Quicksilver", + "denom_units": [ + { + "denom": "ibc/635CB83EF1DFE598B10A3E90485306FD0D47D34217A4BE5FD9977FA010A5367D", + "exponent": 0, + "aliases": [ + "uqck" + ] + }, + { + "denom": "qck", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "base": "ibc/635CB83EF1DFE598B10A3E90485306FD0D47D34217A4BE5FD9977FA010A5367D", + "name": "Quicksilver", + "display": "qck", + "symbol": "QCK", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "quicksilver", + "base_denom": "uqck", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-522", + "path": "transfer/channel-522/uqck" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qck.png" + }, + "coingecko_id": "quicksilver", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:952" + ] + }, + { + "description": "The native token of Arkhadian", + "denom_units": [ + { + "denom": "ibc/0F91EE8B98AAE3CF393D94CD7F89A10F8D7758C5EC707E721899DFE65C164C28", + "exponent": 0, + "aliases": [ + "arkh" + ] + }, + { + "denom": "ARKH", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/0F91EE8B98AAE3CF393D94CD7F89A10F8D7758C5EC707E721899DFE65C164C28", + "name": "Arkhadian", + "display": "ARKH", + "symbol": "ARKH", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "arkh", + "base_denom": "arkh", + "channel_id": "channel-12" + }, + "chain": { + "channel_id": "channel-648", + "path": "transfer/channel-648/arkh" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/arkh/images/arkh.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/arkh/images/arkh.svg" + }, + "keywords": [ + "osmosis-price:uosmo:954", + "osmosis-unstable" + ] + }, + { + "description": "Quicksilver Liquid Staked OSMO", + "denom_units": [ + { + "denom": "ibc/42D24879D4569CE6477B7E88206ADBFE47C222C6CAD51A54083E4A72594269FC", + "exponent": 0, + "aliases": [ + "uqosmo" + ] + }, + { + "denom": "qosmo", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "base": "ibc/42D24879D4569CE6477B7E88206ADBFE47C222C6CAD51A54083E4A72594269FC", + "name": "Quicksilver Liquid Staked OSMO", + "display": "qosmo", + "symbol": "qOSMO", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "osmosis", + "base_denom": "uosmo" + }, + "provider": "Quicksilver" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "quicksilver", + "base_denom": "uqosmo", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-522", + "path": "transfer/channel-522/uqosmo" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qosmo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qosmo.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:956" + ] + }, + { + "description": "Frienzies are an IBC token redeemable exclusively for a physical asset issued by the Noble entity.", + "denom_units": [ + { + "denom": "ibc/7FA7EC64490E3BDE5A1A28CBE73CC0AD22522794957BC891C46321E3A6074DB9", + "exponent": 0, + "aliases": [ + "microfrienzies", + "ufrienzies" + ] + }, + { + "denom": "frienzies", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/7FA7EC64490E3BDE5A1A28CBE73CC0AD22522794957BC891C46321E3A6074DB9", + "name": "Frienzies", + "display": "frienzies", + "symbol": "FRNZ", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "noble", + "base_denom": "ufrienzies", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-750", + "path": "transfer/channel-750/ufrienzies" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/noble/images/frnz.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/noble/images/frnz.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:1012" + ] + }, + { + "description": "The native token of Migaloo Chain", + "denom_units": [ + { + "denom": "ibc/EDD6F0D66BCD49C1084FB2C35353B4ACD7B9191117CE63671B61320548F7C89D", + "exponent": 0, + "aliases": [ + "uwhale" + ] + }, + { + "denom": "whale", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/EDD6F0D66BCD49C1084FB2C35353B4ACD7B9191117CE63671B61320548F7C89D", + "name": "Migaloo", + "display": "whale", + "symbol": "WHALE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "migaloo", + "base_denom": "uwhale", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-642", + "path": "transfer/channel-642/uwhale" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/migaloo/images/white-whale.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/migaloo/images/white-whale.svg" + }, + "coingecko_id": "white-whale", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1318" + ] + }, + { + "description": "Evmos Guardians governance token.", + "denom_units": [ + { + "denom": "ibc/BAC9C6998F1F5C316D3353622EAEDAF8BD00FAABEB374FECDF8C9BC475172CFA", + "exponent": 0, + "aliases": [ + "cw20:juno1xekkh27punj0uxruv3gvuydyt856fax0nu750xns99t2qcxp7xmsqwhfma" + ] + }, + { + "denom": "grdn", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1xekkh27punj0uxruv3gvuydyt856fax0nu750xns99t2qcxp7xmsqwhfma", + "base": "ibc/BAC9C6998F1F5C316D3353622EAEDAF8BD00FAABEB374FECDF8C9BC475172CFA", + "name": "Guardian", + "display": "grdn", + "symbol": "GRDN", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1xekkh27punj0uxruv3gvuydyt856fax0nu750xns99t2qcxp7xmsqwhfma", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1xekkh27punj0uxruv3gvuydyt856fax0nu750xns99t2qcxp7xmsqwhfma" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/guardian.png" + }, + "keywords": [ + "osmosis-price:uosmo:959" + ] + }, + { + "description": "Mini Punks Token", + "denom_units": [ + { + "denom": "ibc/DC0D3303BBE739E073224D0314385B88B247F56D71D726A91414CCA244FFFE7E", + "exponent": 0, + "aliases": [ + "cw20:juno166heaxlyntd33a5euh4rrz26svhean4klzw594esmd02l4atan6sazy2my" + ] + }, + { + "denom": "mnpu", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno166heaxlyntd33a5euh4rrz26svhean4klzw594esmd02l4atan6sazy2my", + "base": "ibc/DC0D3303BBE739E073224D0314385B88B247F56D71D726A91414CCA244FFFE7E", + "name": "Mini Punks", + "display": "mnpu", + "symbol": "MNPU", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno166heaxlyntd33a5euh4rrz26svhean4klzw594esmd02l4atan6sazy2my", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno166heaxlyntd33a5euh4rrz26svhean4klzw594esmd02l4atan6sazy2my" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/mnpu.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/mnpu.svg" + }, + "keywords": [ + "osmosis-price:uosmo:961" + ] + }, + { + "description": "Shiba Cosmos", + "denom_units": [ + { + "denom": "ibc/447A0DCE83691056289503DDAB8EB08E52E167A73629F2ACC59F056B92F51CE8", + "exponent": 0, + "aliases": [ + "cw20:juno1x5qt47rw84c4k6xvvywtrd40p8gxjt8wnmlahlqg07qevah3f8lqwxfs7z" + ] + }, + { + "denom": "shibac", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1x5qt47rw84c4k6xvvywtrd40p8gxjt8wnmlahlqg07qevah3f8lqwxfs7z", + "base": "ibc/447A0DCE83691056289503DDAB8EB08E52E167A73629F2ACC59F056B92F51CE8", + "name": "ShibaCosmos", + "display": "shibac", + "symbol": "SHIBAC", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1x5qt47rw84c4k6xvvywtrd40p8gxjt8wnmlahlqg07qevah3f8lqwxfs7z", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1x5qt47rw84c4k6xvvywtrd40p8gxjt8wnmlahlqg07qevah3f8lqwxfs7z" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/shibacosmos.png" + }, + "keywords": [ + "osmosis-price:uosmo:962" + ] + }, + { + "description": "Sikoba Governance Token", + "denom_units": [ + { + "denom": "ibc/71066B030D8FC6479E638580E1BA9C44925E8C1F6E45036669D22017CFDC8C5E", + "exponent": 0, + "aliases": [ + "cw20:juno1qqwf3lkfjhp77yja7gmg3y95pda0e5xctqrdhf3wvwdd79flagvqfgrgxp" + ] + }, + { + "denom": "sikoba", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1qqwf3lkfjhp77yja7gmg3y95pda0e5xctqrdhf3wvwdd79flagvqfgrgxp", + "base": "ibc/71066B030D8FC6479E638580E1BA9C44925E8C1F6E45036669D22017CFDC8C5E", + "name": "Sikoba Token", + "display": "sikoba", + "symbol": "SKOJ", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1qqwf3lkfjhp77yja7gmg3y95pda0e5xctqrdhf3wvwdd79flagvqfgrgxp", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1qqwf3lkfjhp77yja7gmg3y95pda0e5xctqrdhf3wvwdd79flagvqfgrgxp" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/sikoba.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/sikoba.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:964" + ] + }, + { + "description": "Nature Carbon Ton (NCT) is a carbon token standard backed 1:1 by carbon credits issued by Verra, a global leader in the voluntary carbon market. NCT credits on Regen Network have been tokenized by Toucan.earth.", + "denom_units": [ + { + "denom": "ibc/A76EB6ECF4E3E2D4A23C526FD1B48FDD42F171B206C9D2758EF778A7826ADD68", + "exponent": 0, + "aliases": [ + "eco.uC.NCT" + ] + }, + { + "denom": "nct", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/A76EB6ECF4E3E2D4A23C526FD1B48FDD42F171B206C9D2758EF778A7826ADD68", + "name": "Nature Carbon Ton", + "display": "nct", + "symbol": "NCT", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "regen", + "base_denom": "eco.uC.NCT", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-8", + "path": "transfer/channel-8/eco.uC.NCT" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/regen/images/nct.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/regen/images/nct.svg" + }, + "coingecko_id": "toucan-protocol-nature-carbon-tonne", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/1DCC8A6CB5689018431323953344A9F6CC4D0BFB261E88C9F7777372C10CD076:972" + ] + }, + { + "description": "Celestims", + "denom_units": [ + { + "denom": "ibc/0E4FA664327BD40B32803EE84A77F145834C0281B7F82B65521333B3669FA0BA", + "exponent": 0, + "aliases": [ + "cw20:juno1ngww7zxak55fql42wmyqrr4rhzpne24hhs4p3w4cwhcdgqgr3hxsmzl9zg" + ] + }, + { + "denom": "clst", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1ngww7zxak55fql42wmyqrr4rhzpne24hhs4p3w4cwhcdgqgr3hxsmzl9zg", + "base": "ibc/0E4FA664327BD40B32803EE84A77F145834C0281B7F82B65521333B3669FA0BA", + "name": "Celestims", + "display": "clst", + "symbol": "CLST", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1ngww7zxak55fql42wmyqrr4rhzpne24hhs4p3w4cwhcdgqgr3hxsmzl9zg", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1ngww7zxak55fql42wmyqrr4rhzpne24hhs4p3w4cwhcdgqgr3hxsmzl9zg" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/celestims.png" + }, + "keywords": [ + "osmosis-price:uosmo:974" + ] + }, + { + "description": "The First Doge on Osmosis", + "denom_units": [ + { + "denom": "ibc/8AEEA9B9304392070F72611076C0E328CE3F2DECA1E18557E36F9DB4F09C0156", + "exponent": 0, + "aliases": [ + "cw20:juno1ytymtllllsp3hfmndvcp802p2xmy5s8m59ufel8xv9ahyxyfs4hs4kd4je" + ] + }, + { + "denom": "osdoge", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1ytymtllllsp3hfmndvcp802p2xmy5s8m59ufel8xv9ahyxyfs4hs4kd4je", + "base": "ibc/8AEEA9B9304392070F72611076C0E328CE3F2DECA1E18557E36F9DB4F09C0156", + "name": "Osmosis Doge", + "display": "osdoge", + "symbol": "OSDOGE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1ytymtllllsp3hfmndvcp802p2xmy5s8m59ufel8xv9ahyxyfs4hs4kd4je", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1ytymtllllsp3hfmndvcp802p2xmy5s8m59ufel8xv9ahyxyfs4hs4kd4je" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/osdoge.png" + }, + "keywords": [ + "osmosis-price:uosmo:975" + ] + }, + { + "description": "Apemos", + "denom_units": [ + { + "denom": "ibc/1EB03F13F29FEA73444586FC4E88A8C14ACE9291501E9658E3BEF951EA4AC85D", + "exponent": 0, + "aliases": [ + "cw20:juno1jrr0tuuzxrrwcg6hgeqhw5wqpck2y55734e7zcrp745aardlp0qqg8jz06" + ] + }, + { + "denom": "apemos", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1jrr0tuuzxrrwcg6hgeqhw5wqpck2y55734e7zcrp745aardlp0qqg8jz06", + "base": "ibc/1EB03F13F29FEA73444586FC4E88A8C14ACE9291501E9658E3BEF951EA4AC85D", + "name": "Apemos", + "display": "apemos", + "symbol": "APEMOS", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1jrr0tuuzxrrwcg6hgeqhw5wqpck2y55734e7zcrp745aardlp0qqg8jz06", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1jrr0tuuzxrrwcg6hgeqhw5wqpck2y55734e7zcrp745aardlp0qqg8jz06" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/apemos.png" + }, + "keywords": [ + "osmosis-price:uosmo:977" + ] + }, + { + "description": "Evmos Guardians' Invaders DAO token.", + "denom_units": [ + { + "denom": "ibc/3DB1721541C94AD19D7735FECED74C227E13F925BDB814392980B40A19C1ED54", + "exponent": 0, + "aliases": [ + "cw20:juno1jwdy7v4egw36pd84aeks3ww6n8k7zhsumd4ac8q5lts83ppxueus4626e8" + ] + }, + { + "denom": "invdrs", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1jwdy7v4egw36pd84aeks3ww6n8k7zhsumd4ac8q5lts83ppxueus4626e8", + "base": "ibc/3DB1721541C94AD19D7735FECED74C227E13F925BDB814392980B40A19C1ED54", + "name": "Invaders", + "display": "invdrs", + "symbol": "INVDRS", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1jwdy7v4egw36pd84aeks3ww6n8k7zhsumd4ac8q5lts83ppxueus4626e8", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1jwdy7v4egw36pd84aeks3ww6n8k7zhsumd4ac8q5lts83ppxueus4626e8" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/invdrs.png" + }, + "keywords": [ + "osmosis-price:uosmo:969" + ] + }, + { + "description": "Doge Apr", + "denom_units": [ + { + "denom": "ibc/04BE4E9C825ED781F9684A1226114BB49607500CAD855F1E3FEEC18532297250", + "exponent": 0, + "aliases": [ + "cw20:juno1k2ruzzvvwwtwny6gq6kcwyfhkzahaunp685wmz4hafplduekj98q9hgs6d" + ] + }, + { + "denom": "doga", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1k2ruzzvvwwtwny6gq6kcwyfhkzahaunp685wmz4hafplduekj98q9hgs6d", + "base": "ibc/04BE4E9C825ED781F9684A1226114BB49607500CAD855F1E3FEEC18532297250", + "name": "Doge Apr", + "display": "doga", + "symbol": "DOGA", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1k2ruzzvvwwtwny6gq6kcwyfhkzahaunp685wmz4hafplduekj98q9hgs6d", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1k2ruzzvvwwtwny6gq6kcwyfhkzahaunp685wmz4hafplduekj98q9hgs6d" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/doga.png" + }, + "keywords": [ + "osmosis-price:uosmo:978" + ] + }, + { + "description": "Catmos", + "denom_units": [ + { + "denom": "ibc/F4A07138CAEF0BFB4889E03C44C57956A48631061F1C8AB80421C1F229C1B835", + "exponent": 0, + "aliases": [ + "cw20:juno1f5datjdse3mdgrapwuzs3prl7pvxxht48ns6calnn0t77v2s9l8s0qu488" + ] + }, + { + "denom": "catmos", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1f5datjdse3mdgrapwuzs3prl7pvxxht48ns6calnn0t77v2s9l8s0qu488", + "base": "ibc/F4A07138CAEF0BFB4889E03C44C57956A48631061F1C8AB80421C1F229C1B835", + "name": "Catmos", + "display": "catmos", + "symbol": "CATMOS", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1f5datjdse3mdgrapwuzs3prl7pvxxht48ns6calnn0t77v2s9l8s0qu488", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1f5datjdse3mdgrapwuzs3prl7pvxxht48ns6calnn0t77v2s9l8s0qu488" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/catmos.png" + }, + "keywords": [ + "osmosis-price:uosmo:981" + ] + }, + { + "description": "Social Impact DAO providing showers, meals, and vehicles to the homeless", + "denom_units": [ + { + "denom": "ibc/56B988C4D934FB7503F5EA9B440C75D489C8AD5D193715B477BEC4F84B8BBA2A", + "exponent": 0, + "aliases": [ + "cw20:juno1j4ux0f6gt7e82z7jdpm25v4g2gts880ap64rdwa49989wzhd0dfqed6vqm" + ] + }, + { + "denom": "summit", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1j4ux0f6gt7e82z7jdpm25v4g2gts880ap64rdwa49989wzhd0dfqed6vqm", + "base": "ibc/56B988C4D934FB7503F5EA9B440C75D489C8AD5D193715B477BEC4F84B8BBA2A", + "name": "Summit", + "display": "summit", + "symbol": "SUMMIT", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1j4ux0f6gt7e82z7jdpm25v4g2gts880ap64rdwa49989wzhd0dfqed6vqm", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1j4ux0f6gt7e82z7jdpm25v4g2gts880ap64rdwa49989wzhd0dfqed6vqm" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/summit.png" + }, + "keywords": [ + "osmosis-price:uosmo:982" + ] + }, + { + "description": "The native staking token of OmniFlix Hub.", + "denom_units": [ + { + "denom": "ibc/CEE970BB3D26F4B907097B6B660489F13F3B0DA765B83CC7D9A0BC0CE220FA6F", + "exponent": 0, + "aliases": [ + "uflix" + ] + }, + { + "denom": "flix", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/CEE970BB3D26F4B907097B6B660489F13F3B0DA765B83CC7D9A0BC0CE220FA6F", + "name": "OmniFlix", + "display": "flix", + "symbol": "FLIX", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "omniflixhub", + "base_denom": "uflix", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-199", + "path": "transfer/channel-199/uflix" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/omniflixhub/images/flix.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/omniflixhub/images/flix.svg" + }, + "coingecko_id": "omniflix-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:992" + ] + }, + { + "description": "Spacer", + "denom_units": [ + { + "denom": "ibc/7A496DB7C2277D4B74EC4428DDB5AC8A62816FBD0DEBE1CFE094935D746BE19C", + "exponent": 0, + "aliases": [ + "cw20:juno1dyyf7pxeassxvftf570krv7fdf5r8e4r04mp99h0mllsqzp3rs4q7y8yqg" + ] + }, + { + "denom": "spacer", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1dyyf7pxeassxvftf570krv7fdf5r8e4r04mp99h0mllsqzp3rs4q7y8yqg", + "base": "ibc/7A496DB7C2277D4B74EC4428DDB5AC8A62816FBD0DEBE1CFE094935D746BE19C", + "name": "Spacer", + "display": "spacer", + "symbol": "SPACER", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1dyyf7pxeassxvftf570krv7fdf5r8e4r04mp99h0mllsqzp3rs4q7y8yqg", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1dyyf7pxeassxvftf570krv7fdf5r8e4r04mp99h0mllsqzp3rs4q7y8yqg" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/spacer.png" + }, + "keywords": [ + "osmosis-price:uosmo:993" + ] + }, + { + "description": "Light: LumenX community DAO treasury token", + "denom_units": [ + { + "denom": "ibc/3DC08BDF2689978DBCEE28C7ADC2932AA658B2F64B372760FBC5A0058669AD29", + "exponent": 0, + "aliases": [ + "cw20:juno1dpany8c0lj526lsa02sldv7shzvnw5dt5ues72rk35hd69rrydxqeraz8l" + ] + }, + { + "denom": "light", + "exponent": 9 + } + ], + "type_asset": "ics20", + "address": "juno1dpany8c0lj526lsa02sldv7shzvnw5dt5ues72rk35hd69rrydxqeraz8l", + "base": "ibc/3DC08BDF2689978DBCEE28C7ADC2932AA658B2F64B372760FBC5A0058669AD29", + "name": "LIGHT", + "display": "light", + "symbol": "LIGHT", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1dpany8c0lj526lsa02sldv7shzvnw5dt5ues72rk35hd69rrydxqeraz8l", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1dpany8c0lj526lsa02sldv7shzvnw5dt5ues72rk35hd69rrydxqeraz8l" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/light.png" + }, + "keywords": [ + "osmosis-price:uosmo:1009" + ] + }, + { + "description": "The native token cw20 for Silk on Secret Network", + "denom_units": [ + { + "denom": "ibc/8A025A1E70101E39DE0C0F153E582A30806D3DA16795F6D868A3AA247D2DEDF7", + "exponent": 0, + "aliases": [ + "cw20:secret1fl449muk5yq8dlad7a22nje4p5d2pnsgymhjfd" + ] + }, + { + "denom": "silk", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "secret1fl449muk5yq8dlad7a22nje4p5d2pnsgymhjfd", + "base": "ibc/8A025A1E70101E39DE0C0F153E582A30806D3DA16795F6D868A3AA247D2DEDF7", + "name": "Silk", + "display": "silk", + "symbol": "SILK", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "cw20:secret1fl449muk5yq8dlad7a22nje4p5d2pnsgymhjfd", + "port": "wasm.secret1tqmms5awftpuhalcv5h5mg76fa0tkdz4jv9ex4", + "channel_id": "channel-44" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-476", + "path": "transfer/channel-476/cw20:secret1fl449muk5yq8dlad7a22nje4p5d2pnsgymhjfd" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/silk.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/silk.svg" + }, + "coingecko_id": "silk-bcec1136-561c-4706-a42c-8b67d0d7f7d2", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1358" + ] + }, + { + "description": "Mille: the 1000th token on osmosis", + "denom_units": [ + { + "denom": "ibc/912275A63A565BFD80734AEDFFB540132C51E446EAC41483B26EDE8A557C71CF", + "exponent": 0, + "aliases": [ + "cw20:juno1llg7q2d5dqlrqzh5dxv8c7kzzjszld34s5vktqmlmaaxqjssz43sxyhq0d" + ] + }, + { + "denom": "mile", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1llg7q2d5dqlrqzh5dxv8c7kzzjszld34s5vktqmlmaaxqjssz43sxyhq0d", + "base": "ibc/912275A63A565BFD80734AEDFFB540132C51E446EAC41483B26EDE8A557C71CF", + "name": "Mille", + "display": "mile", + "symbol": "MILE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1llg7q2d5dqlrqzh5dxv8c7kzzjszld34s5vktqmlmaaxqjssz43sxyhq0d", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1llg7q2d5dqlrqzh5dxv8c7kzzjszld34s5vktqmlmaaxqjssz43sxyhq0d" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/mille.png" + }, + "keywords": [ + "osmosis-price:uosmo:1000" + ] + }, + { + "description": "Social Impact DAO dedicated to combatting food insecurity and malnutrition", + "denom_units": [ + { + "denom": "ibc/980A2748F37C938AD129B92A51E2ABA8CFFC6862ADD61EC1B291125535DBE30B", + "exponent": 0, + "aliases": [ + "cw20:juno13ca2g36ng6etcfhr9qxx352uw2n5e92np54thfkm3w3nzlhsgvwsjaqlyq" + ] + }, + { + "denom": "manna", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno13ca2g36ng6etcfhr9qxx352uw2n5e92np54thfkm3w3nzlhsgvwsjaqlyq", + "base": "ibc/980A2748F37C938AD129B92A51E2ABA8CFFC6862ADD61EC1B291125535DBE30B", + "name": "Manna", + "display": "manna", + "symbol": "MANNA", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno13ca2g36ng6etcfhr9qxx352uw2n5e92np54thfkm3w3nzlhsgvwsjaqlyq", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno13ca2g36ng6etcfhr9qxx352uw2n5e92np54thfkm3w3nzlhsgvwsjaqlyq" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/manna.png" + }, + "keywords": [ + "osmosis-price:uosmo:997" + ] + }, + { + "description": "Filecoin is a decentralized storage network designed to turn cloud storage into an algorithmic market. The network facilitates open markets for storing and retrieving data, where users pay to store their files on storage miners. Filecoin is built on top of the InterPlanetary File System (IPFS), a peer-to-peer storage network. Filecoin aims to store data in a decentralized manner, unlike traditional cloud storage providers.\n\nParticipants in the Filecoin network are incentivized to act honestly and store as much data as possible because they earn the Filecoin cryptocurrency (FIL) in exchange for their storage services. This setup ensures the integrity and accessibility of data stored. Filecoin's model allows for a variety of storage options, including long-term archival storage and more rapid retrieval services, making it a versatile solution for decentralized data storage. The project, developed by Protocol Labs, also focuses on ensuring that data is stored reliably and efficiently.", + "denom_units": [ + { + "denom": "ibc/18FB5C09D9D2371F659D4846A956FA56225E377EE3C3652A2BF3542BF809159D", + "exponent": 0, + "aliases": [ + "wfil-wei" + ] + }, + { + "denom": "fil", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/18FB5C09D9D2371F659D4846A956FA56225E377EE3C3652A2BF3542BF809159D", + "name": "Filecoin", + "display": "fil", + "symbol": "FIL", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "filecoin", + "base_denom": "attoFIL" + }, + "provider": "Filecoin" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "filecoin", + "base_denom": "0x60E1773636CF5E4A227d9AC24F20fEca034ee25A" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "wfil-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/wfil-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/filecoin/images/fil.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/filecoin/images/fil.svg" + }, + "coingecko_id": "filecoin", + "keywords": [ + "osmosis-main", + "osmosis-price:uosmo:1006" + ] + }, + { + "description": "Void", + "denom_units": [ + { + "denom": "ibc/593F820ECE676A3E0890C734EC4F3A8DE16EC10A54EEDFA8BDFEB40EEA903960", + "exponent": 0, + "aliases": [ + "cw20:juno1lpvx3mv2a6ddzfjc7zzz2v2cm5gqgqf0hx67hc5p5qwn7hz4cdjsnznhu8" + ] + }, + { + "denom": "void", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1lpvx3mv2a6ddzfjc7zzz2v2cm5gqgqf0hx67hc5p5qwn7hz4cdjsnznhu8", + "base": "ibc/593F820ECE676A3E0890C734EC4F3A8DE16EC10A54EEDFA8BDFEB40EEA903960", + "name": "Void", + "display": "void", + "symbol": "VOID", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1lpvx3mv2a6ddzfjc7zzz2v2cm5gqgqf0hx67hc5p5qwn7hz4cdjsnznhu8", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1lpvx3mv2a6ddzfjc7zzz2v2cm5gqgqf0hx67hc5p5qwn7hz4cdjsnznhu8" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/void.png" + }, + "keywords": [ + "osmosis-price:uosmo:1003" + ] + }, + { + "description": "The native token cw20 for Shade on Secret Network", + "denom_units": [ + { + "denom": "ibc/0B3D528E74E3DEAADF8A68F393887AC7E06028904D02173561B0D27F6E751D0A", + "exponent": 0, + "aliases": [ + "cw20:secret153wu605vvp934xhd4k9dtd640zsep5jkesstdm" + ] + }, + { + "denom": "shd", + "exponent": 8 + } + ], + "type_asset": "ics20", + "address": "secret153wu605vvp934xhd4k9dtd640zsep5jkesstdm", + "base": "ibc/0B3D528E74E3DEAADF8A68F393887AC7E06028904D02173561B0D27F6E751D0A", + "name": "Shade", + "display": "shd", + "symbol": "SHD", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "secretnetwork", + "base_denom": "cw20:secret153wu605vvp934xhd4k9dtd640zsep5jkesstdm", + "port": "wasm.secret1tqmms5awftpuhalcv5h5mg76fa0tkdz4jv9ex4", + "channel_id": "channel-44" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-476", + "path": "transfer/channel-476/cw20:secret153wu605vvp934xhd4k9dtd640zsep5jkesstdm" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/shd.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/secretnetwork/images/shd.svg" + }, + "coingecko_id": "shade-protocol", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB:1170" + ] + }, + { + "description": "The native token of Bluzelle", + "denom_units": [ + { + "denom": "ibc/63CDD51098FD99E04E5F5610A3882CBE7614C441607BA6FCD7F3A3C1CD5325F8", + "exponent": 0, + "aliases": [ + "ubnt" + ] + }, + { + "denom": "bnt", + "exponent": 6, + "aliases": [ + "blz" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/63CDD51098FD99E04E5F5610A3882CBE7614C441607BA6FCD7F3A3C1CD5325F8", + "name": "Bluzelle", + "display": "bnt", + "symbol": "BLZ", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bluzelle", + "base_denom": "ubnt", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-763", + "path": "transfer/channel-763/ubnt" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bluzelle/images/bluzelle.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bluzelle/images/bluzelle.svg" + }, + "coingecko_id": "bluzelle", + "keywords": [ + "bluzelle", + "game", + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:1007" + ] + }, + { + "description": "Native token of Arbitrum", + "denom_units": [ + { + "denom": "ibc/10E5E5B06D78FFBB61FD9F89209DEE5FD4446ED0550CBB8E3747DA79E10D9DC6", + "exponent": 0, + "aliases": [ + "arb-wei" + ] + }, + { + "denom": "arb", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/10E5E5B06D78FFBB61FD9F89209DEE5FD4446ED0550CBB8E3747DA79E10D9DC6", + "name": "Arbitrum", + "display": "arb", + "symbol": "ARB", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "arbitrum", + "base_denom": "0x912CE59144191C1204E64559FE8253a0e49E6548" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "arb-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/arb-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/arbitrum/images/arb.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/arbitrum/images/arb.svg" + }, + "coingecko_id": "arbitrum", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1011" + ] + }, + { + "description": "Silica", + "denom_units": [ + { + "denom": "ibc/5164ECF584AD7DC27DA9E6A89E75DAB0F7C4FCB0A624B69215B8BC6A2C40CD07", + "exponent": 0, + "aliases": [ + "cw20:juno10vgf2u03ufcf25tspgn05l7j3tfg0j63ljgpffy98t697m5r5hmqaw95ux" + ] + }, + { + "denom": "silica", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno10vgf2u03ufcf25tspgn05l7j3tfg0j63ljgpffy98t697m5r5hmqaw95ux", + "base": "ibc/5164ECF584AD7DC27DA9E6A89E75DAB0F7C4FCB0A624B69215B8BC6A2C40CD07", + "name": "Silica", + "display": "silica", + "symbol": "SLCA", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno10vgf2u03ufcf25tspgn05l7j3tfg0j63ljgpffy98t697m5r5hmqaw95ux", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno10vgf2u03ufcf25tspgn05l7j3tfg0j63ljgpffy98t697m5r5hmqaw95ux" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/silica.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/D1542AA8762DB13087D8364F3EA6509FD6F009A34F00426AF9E4F9FA85CBBF1F:1023" + ] + }, + { + "description": "Pepec", + "denom_units": [ + { + "denom": "ibc/C00B17F74C94449A62935B4C886E6F0F643249A270DEF269D53CE6741ECCDB93", + "exponent": 0, + "aliases": [ + "cw20:juno1epxnvge53c4hkcmqzlxryw5fp7eae2utyk6ehjcfpwajwp48km3sgxsh9k" + ] + }, + { + "denom": "pepec", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1epxnvge53c4hkcmqzlxryw5fp7eae2utyk6ehjcfpwajwp48km3sgxsh9k", + "base": "ibc/C00B17F74C94449A62935B4C886E6F0F643249A270DEF269D53CE6741ECCDB93", + "name": "Pepec", + "display": "pepec", + "symbol": "PEPEC", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1epxnvge53c4hkcmqzlxryw5fp7eae2utyk6ehjcfpwajwp48km3sgxsh9k", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1epxnvge53c4hkcmqzlxryw5fp7eae2utyk6ehjcfpwajwp48km3sgxsh9k" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/pepec.png" + }, + "keywords": [ + "osmosis-price:uosmo:1016" + ] + }, + { + "denom_units": [ + { + "denom": "ibc/E47F4E97C534C95B942729E1B25DBDE111EA791411CFF100515050BEA0AC0C6B", + "exponent": 0, + "aliases": [ + "0x6982508145454Ce325dDbE47a25d4ec3d2311933", + "pepe-wei" + ] + }, + { + "denom": "pepe", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/E47F4E97C534C95B942729E1B25DBDE111EA791411CFF100515050BEA0AC0C6B", + "name": "Pepe", + "display": "pepe", + "symbol": "PEPE", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x6982508145454Ce325dDbE47a25d4ec3d2311933" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "pepe-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/pepe-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/pepe.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/pepe.svg" + }, + "coingecko_id": "pepe", + "keywords": [ + "osmosis-main", + "osmosis-price:uosmo:1018" + ] + }, + { + "denom_units": [ + { + "denom": "factory/osmo14klwqgkmackvx2tqa0trtg69dmy0nrg4ntq4gjgw2za4734r5seqjqm4gm/uibcx", + "exponent": 0 + }, + { + "denom": "ibcx", + "exponent": 6 + } + ], + "address": "osmo14klwqgkmackvx2tqa0trtg69dmy0nrg4ntq4gjgw2za4734r5seqjqm4gm", + "base": "factory/osmo14klwqgkmackvx2tqa0trtg69dmy0nrg4ntq4gjgw2za4734r5seqjqm4gm/uibcx", + "name": "IBC Index", + "display": "ibcx", + "symbol": "IBCX", + "traces": [], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/ibcx.svg" + }, + "coingecko_id": "ibc-index", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D3B574938631B0A1BA704879020C696E514CFADAA7643CDE4BD5EB010BDE327B:1254" + ] + }, + { + "description": "Coinbase Wrapped Staked ETH (“cbETH”) is a utility token and liquid representation of ETH staked through Coinbase. cbETH gives customers the option to sell, transfer, or otherwise use their staked ETH in dapps while it remains locked by the Ethereum protocol.", + "denom_units": [ + { + "denom": "ibc/4D7A6F2A7744B1534C984A21F9EDFFF8809FC71A9E9243FFB702073E7FCA513A", + "exponent": 0, + "aliases": [ + "0xbe9895146f7af43049ca1c1ae358b0541ea49704", + "cbeth-wei" + ] + }, + { + "denom": "cbeth", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/4D7A6F2A7744B1534C984A21F9EDFFF8809FC71A9E9243FFB702073E7FCA513A", + "name": "Coinbase Wrapped Staked ETH", + "display": "cbeth", + "symbol": "cbETH", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Coinbase" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xbe9895146f7af43049ca1c1ae358b0541ea49704" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "cbeth-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/cbeth-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/cbeth.png" + }, + "coingecko_id": "coinbase-wrapped-staked-eth", + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/B2BD584CD2A0A9CE53D4449667E26160C7D44A9C41AF50F602C201E5B3CCA46C:1030" + ] + }, + { + "description": "Rocket Pool is a decentralised Ethereum Proof of Stake pool.", + "denom_units": [ + { + "denom": "ibc/E610B83FD5544E00A8A1967A2EB3BEF25F1A8CFE8650FE247A8BD4ECA9DC9222", + "exponent": 0, + "aliases": [ + "0xae78736cd615f374d3085123a210448e74fc6393", + "reth-wei" + ] + }, + { + "denom": "reth", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/E610B83FD5544E00A8A1967A2EB3BEF25F1A8CFE8650FE247A8BD4ECA9DC9222", + "name": "Rocket Pool Ether", + "display": "reth", + "symbol": "rETH", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Rocket Pool" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xae78736cd615f374d3085123a210448e74fc6393" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "reth-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/reth-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/reth.png" + }, + "coingecko_id": "rocket-pool-eth", + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/B2BD584CD2A0A9CE53D4449667E26160C7D44A9C41AF50F602C201E5B3CCA46C:1030" + ] + }, + { + "description": "sfrxETH is the version of frxETH which accrues staking yield. All profit generated from Frax Ether validators is distributed to sfrxETH holders. By exchanging frxETH for sfrxETH, one become's eligible for staking yield, which is redeemed upon converting sfrxETH back to frxETH.", + "denom_units": [ + { + "denom": "ibc/81F578C39006EB4B27FFFA9460954527910D73390991B379C03B18934D272F46", + "exponent": 0, + "aliases": [ + "0xac3e018457b222d93114458476f3e3416abbe38f", + "sfrxeth-wei" + ] + }, + { + "denom": "sfrxeth", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/81F578C39006EB4B27FFFA9460954527910D73390991B379C03B18934D272F46", + "name": "Staked Frax Ether", + "display": "sfrxeth", + "symbol": "sfrxETH", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Frax" + }, + { + "type": "wrapped", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x5e8422345238f34275888049021821e8e08caa1f" + }, + "provider": "Frax" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xac3e018457b222d93114458476f3e3416abbe38f" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "sfrxeth-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/sfrxeth-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/sfrxeth.svg" + }, + "coingecko_id": "staked-frax-ether", + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/B2BD584CD2A0A9CE53D4449667E26160C7D44A9C41AF50F602C201E5B3CCA46C:1030" + ] + }, + { + "description": "wstETH is a wrapped version of stETH. As some DeFi protocols require a constant balance mechanism for tokens, wstETH keeps your balance of stETH fixed and uses an underlying share system to reflect your earned staking rewards.", + "denom_units": [ + { + "denom": "ibc/B2BD584CD2A0A9CE53D4449667E26160C7D44A9C41AF50F602C201E5B3CCA46C", + "exponent": 0, + "aliases": [ + "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "wsteth-wei" + ] + }, + { + "denom": "wsteth", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/B2BD584CD2A0A9CE53D4449667E26160C7D44A9C41AF50F602C201E5B3CCA46C", + "name": "Wrapped Lido Staked Ether", + "display": "wsteth", + "symbol": "wstETH.axl", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Lido" + }, + { + "type": "wrapped", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xae7ab96520de3a18e5e111b5eaab095312d7fe84" + }, + "provider": "Lido" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "wsteth-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/wsteth-wei" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/wstETH.axl.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5:1024" + ] + }, + { + "description": "The native token of Gitopia", + "denom_units": [ + { + "denom": "ibc/B1C1806A540B3E165A2D42222C59946FB85BA325596FC85662D7047649F419F3", + "exponent": 0, + "aliases": [ + "ulore" + ] + }, + { + "denom": "LORE", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/B1C1806A540B3E165A2D42222C59946FB85BA325596FC85662D7047649F419F3", + "name": "Gitopia", + "display": "LORE", + "symbol": "LORE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "gitopia", + "base_denom": "ulore", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-781", + "path": "transfer/channel-781/ulore" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/gitopia/images/lore.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/gitopia/images/lore.svg" + }, + "coingecko_id": "gitopia", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1036" + ] + }, + { + "description": "Lion DAO is a community DAO that lives on the Terra blockchain with the mission to reactivate the LUNAtic community and showcase Terra protocols & tooling", + "denom_units": [ + { + "denom": "ibc/98BCD43F190C6960D0005BC46BB765C827403A361C9C03C2FF694150A30284B0", + "exponent": 0, + "aliases": [ + "cw20:terra1lxx40s29qvkrcj8fsa3yzyehy7w50umdvvnls2r830rys6lu2zns63eelv" + ] + }, + { + "denom": "roar", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "terra1lxx40s29qvkrcj8fsa3yzyehy7w50umdvvnls2r830rys6lu2zns63eelv", + "base": "ibc/98BCD43F190C6960D0005BC46BB765C827403A361C9C03C2FF694150A30284B0", + "name": "Lion DAO", + "display": "roar", + "symbol": "ROAR", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "terra2", + "base_denom": "cw20:terra1lxx40s29qvkrcj8fsa3yzyehy7w50umdvvnls2r830rys6lu2zns63eelv", + "port": "wasm.terra1e0mrzy8077druuu42vs0hu7ugguade0cj65dgtauyaw4gsl4kv0qtdf2au", + "channel_id": "channel-26" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-341", + "path": "transfer/channel-341/cw20:terra1lxx40s29qvkrcj8fsa3yzyehy7w50umdvvnls2r830rys6lu2zns63eelv" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra2/images/roar.png" + }, + "coingecko_id": "lion-dao", + "keywords": [ + "osmosis-main", + "osmosis-price:uosmo:1043" + ] + }, + { + "description": "The native token of Umee", + "denom_units": [ + { + "denom": "ibc/02F196DA6FD0917DD5FEA249EE61880F4D941EE9059E7964C5C9B50AF103800F", + "exponent": 0, + "aliases": [ + "stuumee" + ] + }, + { + "denom": "stumee", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/02F196DA6FD0917DD5FEA249EE61880F4D941EE9059E7964C5C9B50AF103800F", + "name": "Stride Staked UMEE", + "display": "stumee", + "symbol": "stUMEE", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "umee", + "base_denom": "uumee" + }, + "provider": "Stride" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "stuumee", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/stuumee" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stumee.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stumee.svg" + }, + "coingecko_id": "stride-staked-umee", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/67795E528DF67C5606FC20F824EA39A6EF55BA133F4DC79C90A8C47A0901E17C:1035" + ] + }, + { + "denom_units": [ + { + "denom": "factory/osmo1xqw2sl9zk8a6pch0csaw78n4swg5ws8t62wc5qta4gnjxfqg6v2qcs243k/stuibcx", + "exponent": 0 + }, + { + "denom": "stibcx", + "exponent": 6 + } + ], + "address": "osmo1xqw2sl9zk8a6pch0csaw78n4swg5ws8t62wc5qta4gnjxfqg6v2qcs243k", + "base": "factory/osmo1xqw2sl9zk8a6pch0csaw78n4swg5ws8t62wc5qta4gnjxfqg6v2qcs243k/stuibcx", + "name": "Staked IBCX", + "display": "stibcx", + "symbol": "stIBCX", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/stibcx.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/stibcx.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1107" + ] + }, + { + "description": "The native token of Nolus chain", + "denom_units": [ + { + "denom": "ibc/D9AFCECDD361D38302AA66EB3BAC23B95234832C51D12489DC451FA2B7C72782", + "exponent": 0, + "aliases": [ + "unls" + ] + }, + { + "denom": "nls", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/D9AFCECDD361D38302AA66EB3BAC23B95234832C51D12489DC451FA2B7C72782", + "name": "Nolus", + "display": "nls", + "symbol": "NLS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "nolus", + "base_denom": "unls", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-783", + "path": "transfer/channel-783/unls" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/nolus/images/nolus.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/nolus/images/nolus.svg" + }, + "coingecko_id": "nolus", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:1041" + ] + }, + { + "description": "Lion Cub DAO is a useless meme community DAO on Terra", + "denom_units": [ + { + "denom": "ibc/6F18EFEBF1688AA77F7EAC17065609494DC1BA12AFC78E9AEC832AF70A11BEF3", + "exponent": 0, + "aliases": [ + "cw20:terra1lalvk0r6nhruel7fvzdppk3tup3mh5j4d4eadrqzfhle4zrf52as58hh9t" + ] + }, + { + "denom": "cub", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "terra1lalvk0r6nhruel7fvzdppk3tup3mh5j4d4eadrqzfhle4zrf52as58hh9t", + "base": "ibc/6F18EFEBF1688AA77F7EAC17065609494DC1BA12AFC78E9AEC832AF70A11BEF3", + "name": "Lion Cub DAO", + "display": "cub", + "symbol": "CUB", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "terra2", + "base_denom": "cw20:terra1lalvk0r6nhruel7fvzdppk3tup3mh5j4d4eadrqzfhle4zrf52as58hh9t", + "port": "wasm.terra1e0mrzy8077druuu42vs0hu7ugguade0cj65dgtauyaw4gsl4kv0qtdf2au", + "channel_id": "channel-26" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-341", + "path": "transfer/channel-341/cw20:terra1lalvk0r6nhruel7fvzdppk3tup3mh5j4d4eadrqzfhle4zrf52as58hh9t" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra2/images/cub.png" + }, + "keywords": [ + "osmosis-price:ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9:1072" + ] + }, + { + "description": "BLUE CUB DAO is a community DAO on Terra", + "denom_units": [ + { + "denom": "ibc/DA961FE314B009C38595FFE3AF41225D8894D663B8C3F6650DCB5B6F8435592E", + "exponent": 0, + "aliases": [ + "cw20:terra1gwrz9xzhqsygyr5asrgyq3pu0ewpn00mv2zenu86yvx2nlwpe8lqppv584" + ] + }, + { + "denom": "blue", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "terra1gwrz9xzhqsygyr5asrgyq3pu0ewpn00mv2zenu86yvx2nlwpe8lqppv584", + "base": "ibc/DA961FE314B009C38595FFE3AF41225D8894D663B8C3F6650DCB5B6F8435592E", + "name": "BLUE CUB DAO", + "display": "blue", + "symbol": "BLUE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "terra2", + "base_denom": "cw20:terra1gwrz9xzhqsygyr5asrgyq3pu0ewpn00mv2zenu86yvx2nlwpe8lqppv584", + "port": "wasm.terra1e0mrzy8077druuu42vs0hu7ugguade0cj65dgtauyaw4gsl4kv0qtdf2au", + "channel_id": "channel-26" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-341", + "path": "transfer/channel-341/cw20:terra1gwrz9xzhqsygyr5asrgyq3pu0ewpn00mv2zenu86yvx2nlwpe8lqppv584" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/terra2/images/blue.png" + }, + "keywords": [ + "osmosis-price:ibc/785AFEC6B3741100D15E7AF01374E3C4C36F24888E96479B1C33F5C71F364EF9:1073" + ] + }, + { + "description": "The native token of Neutron chain.", + "denom_units": [ + { + "denom": "ibc/126DA09104B71B164883842B769C0E9EC1486C0887D27A9999E395C2C8FB5682", + "exponent": 0, + "aliases": [ + "untrn" + ] + }, + { + "denom": "ntrn", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/126DA09104B71B164883842B769C0E9EC1486C0887D27A9999E395C2C8FB5682", + "name": "Neutron", + "display": "ntrn", + "symbol": "NTRN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "neutron", + "base_denom": "untrn", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-874", + "path": "transfer/channel-874/untrn" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/neutron/images/ntrn.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/neutron/images/ntrn.svg" + }, + "coingecko_id": "neutron-3", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1324" + ] + }, + { + "description": "An innovative DAO dedicated to housing the most vulnerable", + "denom_units": [ + { + "denom": "ibc/2F5C084037D951B24D100F15CC013A131DF786DCE1B1DBDC48F018A9B9A138DE", + "exponent": 0, + "aliases": [ + "cw20:juno1ju8k8sqwsqu5k6umrypmtyqu2wqcpnrkf4w4mntvl0javt4nma7s8lzgss" + ] + }, + { + "denom": "casa", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1ju8k8sqwsqu5k6umrypmtyqu2wqcpnrkf4w4mntvl0javt4nma7s8lzgss", + "base": "ibc/2F5C084037D951B24D100F15CC013A131DF786DCE1B1DBDC48F018A9B9A138DE", + "name": "Casa", + "display": "casa", + "symbol": "CASA", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1ju8k8sqwsqu5k6umrypmtyqu2wqcpnrkf4w4mntvl0javt4nma7s8lzgss", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1ju8k8sqwsqu5k6umrypmtyqu2wqcpnrkf4w4mntvl0javt4nma7s8lzgss" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/casa.png" + }, + "keywords": [ + "osmosis-price:uosmo:1028" + ] + }, + { + "description": "The native staking and governance token of Composable.", + "denom_units": [ + { + "denom": "ibc/56D7C03B8F6A07AD322EEE1BEF3AE996E09D1C1E34C27CF37E0D4A0AC5972516", + "exponent": 0, + "aliases": [ + "ppica" + ] + }, + { + "denom": "pica", + "exponent": 12 + } + ], + "type_asset": "ics20", + "base": "ibc/56D7C03B8F6A07AD322EEE1BEF3AE996E09D1C1E34C27CF37E0D4A0AC5972516", + "name": "Composable", + "display": "pica", + "symbol": "PICA", + "traces": [ + { + "type": "additional-mintage", + "counterparty": { + "chain_name": "picasso", + "base_denom": "ppica" + }, + "provider": "Composable Finance" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "composable", + "base_denom": "ppica", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-1279", + "path": "transfer/channel-1279/ppica" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/composable/images/pica.svg" + }, + "coingecko_id": "picasso", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1057" + ] + }, + { + "description": "The native fee, governance, staking, and bonding token of the Polkadot platform.", + "denom_units": [ + { + "denom": "ibc/6727B2F071643B3841BD535ECDD4ED9CAE52ABDD0DCD07C3630811A7A37B215C", + "exponent": 0, + "aliases": [ + "4", + "ibc/EE9046745AEC0E8302CB7ED9D5AD67F528FB3B7AE044B247FB0FB293DBDA35E9" + ] + }, + { + "denom": "ksm", + "exponent": 12 + } + ], + "type_asset": "ics20", + "base": "ibc/6727B2F071643B3841BD535ECDD4ED9CAE52ABDD0DCD07C3630811A7A37B215C", + "name": "Kusama", + "display": "ksm", + "symbol": "KSM", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "kusama", + "base_denom": "Planck" + }, + "provider": "Kusama Parachain" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "picasso", + "base_denom": "4", + "channel_id": "channel-17" + }, + "chain": { + "channel_id": "channel-2", + "path": "transfer/channel-2/4" + } + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "composable", + "base_denom": "ibc/EE9046745AEC0E8302CB7ED9D5AD67F528FB3B7AE044B247FB0FB293DBDA35E9", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-1279", + "path": "transfer/channel-1279/transfer/channel-2/4" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/kusama/images/ksm.svg" + }, + "coingecko_id": "kusama", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1151" + ] + }, + { + "description": "The native fee, governance, staking, and bonding token of the Polkadot platform.", + "denom_units": [ + { + "denom": "ibc/6B2B19D874851F631FF0AF82C38A20D4B82F438C7A22F41EDA33568345397244", + "exponent": 0, + "aliases": [ + "79228162514264337593543950342", + "ibc/3CC19CEC7E5A3E90E78A5A9ECC5A0E2F8F826A375CF1E096F4515CF09DA3E366" + ] + }, + { + "denom": "dot", + "exponent": 10 + } + ], + "type_asset": "ics20", + "base": "ibc/6B2B19D874851F631FF0AF82C38A20D4B82F438C7A22F41EDA33568345397244", + "name": "Polkadot", + "display": "dot", + "symbol": "DOT", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "polkadot", + "base_denom": "Planck" + }, + "provider": "Polkadot Relay" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "composablepolkadot", + "base_denom": "79228162514264337593543950342", + "channel_id": "channel-15" + }, + "chain": { + "channel_id": "channel-15", + "path": "transfer/channel-15/79228162514264337593543950342" + } + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "picasso", + "base_denom": "79228162514264337593543950342", + "channel_id": "channel-17" + }, + "chain": { + "channel_id": "channel-2", + "path": "transfer/channel-2/transfer/channel-15/79228162514264337593543950342" + } + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "composable", + "base_denom": "ibc/3CC19CEC7E5A3E90E78A5A9ECC5A0E2F8F826A375CF1E096F4515CF09DA3E366", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-1279", + "path": "transfer/channel-1279/transfer/channel-2/transfer/channel-15/79228162514264337593543950342" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/polkadot/images/dot.svg" + }, + "coingecko_id": "polkadot", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1145" + ] + }, + { + "description": "The native token of Quasar", + "denom_units": [ + { + "denom": "ibc/1B708808D372E959CD4839C594960309283424C775F4A038AAEBE7F83A988477", + "exponent": 0, + "aliases": [ + "uqsr" + ] + }, + { + "denom": "qsr", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "base": "ibc/1B708808D372E959CD4839C594960309283424C775F4A038AAEBE7F83A988477", + "name": "Quasar", + "display": "qsr", + "symbol": "QSR", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "quasar", + "base_denom": "uqsr", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-688", + "path": "transfer/channel-688/uqsr" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quasar/images/quasar.png" + }, + "coingecko_id": "quasar-2", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1314" + ] + }, + { + "description": "The native token of Archway network", + "denom_units": [ + { + "denom": "ibc/23AB778D694C1ECFC59B91D8C399C115CC53B0BD1C61020D8E19519F002BDD85", + "exponent": 0, + "aliases": [ + "aarch" + ] + }, + { + "denom": "uarch", + "exponent": 12 + }, + { + "denom": "arch", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/23AB778D694C1ECFC59B91D8C399C115CC53B0BD1C61020D8E19519F002BDD85", + "name": "Archway", + "display": "arch", + "symbol": "ARCH", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "archway", + "base_denom": "aarch", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-1429", + "path": "transfer/channel-1429/aarch" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/archway/images/archway.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/archway/images/archway.svg" + }, + "coingecko_id": "archway", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1375" + ] + }, + { + "description": "The native staking and governance token of Empower.", + "denom_units": [ + { + "denom": "ibc/DD3938D8131F41994C1F01F4EB5233DEE9A0A5B787545B9A07A321925655BF38", + "exponent": 0, + "aliases": [ + "umpwr" + ] + }, + { + "denom": "mpwr", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/DD3938D8131F41994C1F01F4EB5233DEE9A0A5B787545B9A07A321925655BF38", + "name": "EmpowerChain", + "display": "mpwr", + "symbol": "MPWR", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "empowerchain", + "base_denom": "umpwr", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-1411", + "path": "transfer/channel-1411/umpwr" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/empowerchain/images/mpwr.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1065" + ] + }, + { + "description": "A revolutionary DAO created to bring clean drinking water to men, women, and children worldwide. We hope you join us on our journey!", + "denom_units": [ + { + "denom": "ibc/AABCB14ACAFD53A5C455BAC01EA0CA5AE18714895846681A52BFF1E3B960B44E", + "exponent": 0, + "aliases": [ + "cw20:juno1m4h8q4p305wgy7vkux0w6e5ylhqll3s6pmadhxkhqtuwd5wlxhxs8xklsw" + ] + }, + { + "denom": "watr", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1m4h8q4p305wgy7vkux0w6e5ylhqll3s6pmadhxkhqtuwd5wlxhxs8xklsw", + "base": "ibc/AABCB14ACAFD53A5C455BAC01EA0CA5AE18714895846681A52BFF1E3B960B44E", + "name": "WATR", + "display": "watr", + "symbol": "WATR", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1m4h8q4p305wgy7vkux0w6e5ylhqll3s6pmadhxkhqtuwd5wlxhxs8xklsw", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1m4h8q4p305wgy7vkux0w6e5ylhqll3s6pmadhxkhqtuwd5wlxhxs8xklsw" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/watr.png" + }, + "keywords": [ + "osmosis-price:uosmo:1071" + ] + }, + { + "description": "The native utility token of the KYVE network.", + "denom_units": [ + { + "denom": "ibc/613BF0BF2F2146AE9941E923725745E931676B2C14E9768CD609FA0849B2AE13", + "exponent": 0, + "aliases": [ + "ukyve" + ] + }, + { + "denom": "kyve", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/613BF0BF2F2146AE9941E923725745E931676B2C14E9768CD609FA0849B2AE13", + "name": "KYVE", + "display": "kyve", + "symbol": "KYVE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kyve", + "base_denom": "ukyve", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-767", + "path": "transfer/channel-767/ukyve" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kyve/images/kyve-token.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kyve/images/kyve-token.svg" + }, + "coingecko_id": "kyve-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1075" + ] + }, + { + "description": "Tether gives you the joint benefits of open blockchain technology and traditional currency by converting your cash into a stable digital currency equivalent.", + "denom_units": [ + { + "denom": "ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB", + "exponent": 0, + "aliases": [ + "erc20/tether/usdt" + ] + }, + { + "denom": "usdt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB", + "name": "Tether USD", + "display": "usdt", + "symbol": "USDT", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Tether" + }, + { + "type": "additional-mintage", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "provider": "Tether" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "kava", + "base_denom": "erc20/tether/usdt", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-143", + "path": "transfer/channel-143/erc20/tether/usdt" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/usdt.svg" + }, + "coingecko_id": "tether", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1220", + "peg:collateralized" + ] + }, + { + "description": "ERIS liquid staked OSMO", + "denom_units": [ + { + "denom": "factory/osmo1dv8wz09tckslr2wy5z86r46dxvegylhpt97r9yd6qc3kyc6tv42qa89dr9/ampOSMO", + "exponent": 0 + }, + { + "denom": "ampOSMO", + "exponent": 6 + } + ], + "address": "osmo1dv8wz09tckslr2wy5z86r46dxvegylhpt97r9yd6qc3kyc6tv42qa89dr9", + "base": "factory/osmo1dv8wz09tckslr2wy5z86r46dxvegylhpt97r9yd6qc3kyc6tv42qa89dr9/ampOSMO", + "name": "ERIS Amplified OSMO", + "display": "ampOSMO", + "symbol": "ampOSMO", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/amposmo.png" + }, + "keywords": [ + "osmosis-main", + "osmosis-price:uosmo:1067" + ] + }, + { + "description": "The native staking token of Sei.", + "denom_units": [ + { + "denom": "ibc/71F11BC0AF8E526B80E44172EBA9D3F0A8E03950BB882325435691EBC9450B1D", + "exponent": 0, + "aliases": [ + "usei" + ] + }, + { + "denom": "sei", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/71F11BC0AF8E526B80E44172EBA9D3F0A8E03950BB882325435691EBC9450B1D", + "name": "Sei", + "display": "sei", + "symbol": "SEI", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "sei", + "base_denom": "usei", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-782", + "path": "transfer/channel-782/usei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sei/images/sei.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sei/images/sei.svg" + }, + "coingecko_id": "sei-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1114" + ] + }, + { + "description": "Quicksilver Liquid Staked SOMM", + "denom_units": [ + { + "denom": "ibc/EAF76AD1EEF7B16D167D87711FB26ABE881AC7D9F7E6D0CF313D5FA530417208", + "exponent": 0, + "aliases": [ + "uqsomm" + ] + }, + { + "denom": "qsomm", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "base": "ibc/EAF76AD1EEF7B16D167D87711FB26ABE881AC7D9F7E6D0CF313D5FA530417208", + "name": "Quicksilver Liquid Staked SOMM", + "display": "qsomm", + "symbol": "qSOMM", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "sommelier", + "base_denom": "usomm" + }, + "provider": "Quicksilver" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "quicksilver", + "base_denom": "uqsomm", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-522", + "path": "transfer/channel-522/uqsomm" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qsomm.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/quicksilver/images/qsomm.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/9BBA9A1C257E971E38C1422780CE6F0B0686F0A3085E2D61118D904BFE0F5F5E:1087" + ] + }, + { + "description": "The native staking and governance token of the Passage chain.", + "denom_units": [ + { + "denom": "ibc/208B2F137CDE510B44C41947C045CFDC27F996A9D990EA64460BDD5B3DBEB2ED", + "exponent": 0, + "aliases": [ + "upasg" + ] + }, + { + "denom": "pasg", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/208B2F137CDE510B44C41947C045CFDC27F996A9D990EA64460BDD5B3DBEB2ED", + "name": "Passage", + "display": "pasg", + "symbol": "PASG", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "passage", + "base_denom": "upasg", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-2494", + "path": "transfer/channel-2494/upasg" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/passage/images/pasg.png" + }, + "coingecko_id": "passage", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:1137" + ] + }, + { + "description": "Somm Token (SOMM) is the native staking token of the Sommelier Chain", + "denom_units": [ + { + "denom": "ibc/5A0060579D24FBE5268BEA74C3281E7FE533D361C41A99307B4998FEC611E46B", + "exponent": 0, + "aliases": [ + "stusomm" + ] + }, + { + "denom": "stsomm", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/5A0060579D24FBE5268BEA74C3281E7FE533D361C41A99307B4998FEC611E46B", + "name": "Stride Staked SOMM", + "display": "stsomm", + "symbol": "stSOMM", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "sommelier", + "base_denom": "usomm" + }, + "provider": "Stride" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stride", + "base_denom": "stusomm", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-326", + "path": "transfer/channel-326/stusomm" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stsomm.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stride/images/stsomm.svg" + }, + "coingecko_id": "stride-staked-sommelier", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/9BBA9A1C257E971E38C1422780CE6F0B0686F0A3085E2D61118D904BFE0F5F5E:1120" + ] + }, + { + "description": "Solana (SOL) is the native asset of the Solana blockchain.", + "denom_units": [ + { + "denom": "ibc/1E43D59E565D41FB4E54CA639B838FFD5BCFC20003D330A56CB1396231AA1CBA", + "exponent": 0, + "aliases": [ + "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/8sYgCzLRJC3J7qPn2bNbx6PiGcarhyx8rBhVaNnfvHCA" + ] + }, + { + "denom": "wormhole/8sYgCzLRJC3J7qPn2bNbx6PiGcarhyx8rBhVaNnfvHCA/8", + "exponent": 8, + "aliases": [] + } + ], + "type_asset": "ics20", + "address": "wormhole1wn625s4jcmvk0szpl85rj5azkfc6suyvf75q6vrddscjdphtve8sca0pvl", + "base": "ibc/1E43D59E565D41FB4E54CA639B838FFD5BCFC20003D330A56CB1396231AA1CBA", + "name": "Solana", + "display": "wormhole/8sYgCzLRJC3J7qPn2bNbx6PiGcarhyx8rBhVaNnfvHCA/8", + "symbol": "SOL", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "solana", + "base_denom": "Lamport" + }, + "provider": "Solana" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "solana", + "base_denom": "So11111111111111111111111111111111111111112" + }, + "provider": "Wormhole" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gateway", + "base_denom": "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/8sYgCzLRJC3J7qPn2bNbx6PiGcarhyx8rBhVaNnfvHCA", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-2186", + "path": "transfer/channel-2186/factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/8sYgCzLRJC3J7qPn2bNbx6PiGcarhyx8rBhVaNnfvHCA" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/solana/images/sol.svg" + }, + "coingecko_id": "solana", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1294" + ] + }, + { + "description": "The Official Bonk Inu token", + "denom_units": [ + { + "denom": "ibc/CA3733CB0071F480FAE8EF0D9C3D47A49C6589144620A642BBE0D59A293D110E", + "exponent": 0, + "aliases": [ + "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/95mnwzvJZJ3fKz77xfGN2nR5to9pZmH8YNvaxgLgw5AR" + ] + }, + { + "denom": "wormhole/95mnwzvJZJ3fKz77xfGN2nR5to9pZmH8YNvaxgLgw5AR/5", + "exponent": 5, + "aliases": [] + } + ], + "type_asset": "ics20", + "address": "wormhole10qt8wg0n7z740ssvf3urmvgtjhxpyp74hxqvqt7z226gykuus7eq9mpu8u", + "base": "ibc/CA3733CB0071F480FAE8EF0D9C3D47A49C6589144620A642BBE0D59A293D110E", + "name": "Bonk", + "display": "wormhole/95mnwzvJZJ3fKz77xfGN2nR5to9pZmH8YNvaxgLgw5AR/5", + "symbol": "BONK", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "solana", + "base_denom": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" + }, + "provider": "Wormhole" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gateway", + "base_denom": "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/95mnwzvJZJ3fKz77xfGN2nR5to9pZmH8YNvaxgLgw5AR", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-2186", + "path": "transfer/channel-2186/factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/95mnwzvJZJ3fKz77xfGN2nR5to9pZmH8YNvaxgLgw5AR" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/solana/images/bonk.png" + }, + "coingecko_id": "bonk", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB:1129" + ] + }, + { + "description": "Tether USD (Wormhole), USDT, factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/8iuAc6DSeLvi2JDUtwJxLytsZT8R19itXebZsNReLLNi", + "denom_units": [ + { + "denom": "ibc/2108F2D81CBE328F371AD0CEF56691B18A86E08C3651504E42487D9EE92DDE9C", + "exponent": 0, + "aliases": [ + "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/8iuAc6DSeLvi2JDUtwJxLytsZT8R19itXebZsNReLLNi" + ] + }, + { + "denom": "wormhole/8iuAc6DSeLvi2JDUtwJxLytsZT8R19itXebZsNReLLNi/6", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "address": "wormhole1w27ekqvvtzfanfxnkw4jx2f8gdfeqwd3drkee3e64xat6phwjg0savgmhw", + "base": "ibc/2108F2D81CBE328F371AD0CEF56691B18A86E08C3651504E42487D9EE92DDE9C", + "name": "Tether USD (Wormhole)", + "display": "wormhole/8iuAc6DSeLvi2JDUtwJxLytsZT8R19itXebZsNReLLNi/6", + "symbol": "USDT.wh", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Tether" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "provider": "Wormhole" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gateway", + "base_denom": "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/8iuAc6DSeLvi2JDUtwJxLytsZT8R19itXebZsNReLLNi", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-2186", + "path": "transfer/channel-2186/factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/8iuAc6DSeLvi2JDUtwJxLytsZT8R19itXebZsNReLLNi" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/usdt.hole.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB:1131" + ] + }, + { + "description": "Sui’s native asset is called SUI.", + "denom_units": [ + { + "denom": "ibc/B1C287C2701774522570010EEBCD864BCB7AB714711B3AA218699FDD75E832F5", + "exponent": 0, + "aliases": [ + "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/46YEtoSN1AcwgGSRoWruoS6bnVh8XpMp5aQTpKohCJYh" + ] + }, + { + "denom": "wormhole/46YEtoSN1AcwgGSRoWruoS6bnVh8XpMp5aQTpKohCJYh/8", + "exponent": 8, + "aliases": [] + } + ], + "type_asset": "ics20", + "address": "wormhole19hlynxzedrlqv99v6qscww7d3crhl86qtd0vprpltg5g9xx6jk9q6ya33y", + "base": "ibc/B1C287C2701774522570010EEBCD864BCB7AB714711B3AA218699FDD75E832F5", + "name": "Sui", + "display": "wormhole/46YEtoSN1AcwgGSRoWruoS6bnVh8XpMp5aQTpKohCJYh/8", + "symbol": "SUI", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "sui", + "base_denom": "0x2::sui::SUI" + }, + "provider": "Wormhole" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gateway", + "base_denom": "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/46YEtoSN1AcwgGSRoWruoS6bnVh8XpMp5aQTpKohCJYh", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-2186", + "path": "transfer/channel-2186/factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/46YEtoSN1AcwgGSRoWruoS6bnVh8XpMp5aQTpKohCJYh" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/sui/images/sui.svg" + }, + "coingecko_id": "sui", + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB:1127" + ] + }, + { + "description": "Aptos token (APT) is the Aptos blockchain native token used for paying network and transaction fees.", + "denom_units": [ + { + "denom": "ibc/A4D176906C1646949574B48C1928D475F2DF56DE0AC04E1C99B08F90BC21ABDE", + "exponent": 0, + "aliases": [ + "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/5wS2fGojbL9RhGEAeQBdkHPUAciYDxjDTMYvdf9aDn2r" + ] + }, + { + "denom": "wormhole/5wS2fGojbL9RhGEAeQBdkHPUAciYDxjDTMYvdf9aDn2r/8", + "exponent": 8, + "aliases": [] + } + ], + "type_asset": "ics20", + "address": "wormhole1f9sxjn0qu8xylcpzlvnhrefnatndqxnrajfrnr5h97hegnmsdqhsh6juc0", + "base": "ibc/A4D176906C1646949574B48C1928D475F2DF56DE0AC04E1C99B08F90BC21ABDE", + "name": "Aptos Coin", + "display": "wormhole/5wS2fGojbL9RhGEAeQBdkHPUAciYDxjDTMYvdf9aDn2r/8", + "symbol": "APT", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "aptos", + "base_denom": "0x1::aptos_coin::AptosCoin" + }, + "provider": "Wormhole" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gateway", + "base_denom": "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/5wS2fGojbL9RhGEAeQBdkHPUAciYDxjDTMYvdf9aDn2r", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-2186", + "path": "transfer/channel-2186/factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/5wS2fGojbL9RhGEAeQBdkHPUAciYDxjDTMYvdf9aDn2r" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/aptos/images/apt-dm.svg" + }, + "coingecko_id": "aptos", + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/4ABBEF4C8926DDDB320AE5188CFD63267ABBCEFC0583E4AE05D6E5AA2401DDAB:1125" + ] + }, + { + "description": "MantaDAO Governance Token", + "denom_units": [ + { + "denom": "ibc/51D893F870B7675E507E91DA8DB0B22EA66333207E4F5C0708757F08EE059B0B", + "exponent": 0, + "aliases": [ + "factory/kujira1643jxg8wasy5cfcn7xm8rd742yeazcksqlg4d7/umnta" + ] + }, + { + "denom": "mnta", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/51D893F870B7675E507E91DA8DB0B22EA66333207E4F5C0708757F08EE059B0B", + "name": "MantaDAO", + "display": "mnta", + "symbol": "MNTA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kujira", + "base_denom": "factory/kujira1643jxg8wasy5cfcn7xm8rd742yeazcksqlg4d7/umnta", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-259", + "path": "transfer/channel-259/factory:kujira1643jxg8wasy5cfcn7xm8rd742yeazcksqlg4d7:umnta" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kujira/images/mnta.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kujira/images/mnta.svg" + }, + "coingecko_id": "mantadao", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1215" + ] + }, + { + "denom_units": [ + { + "denom": "ibc/D69F6D787EC649F4E998161A9F0646F4C2DCC64748A2AB982F14CAFBA7CC0EC9", + "exponent": 0, + "aliases": [ + "factory/juno1u805lv20qc6jy7c3ttre7nct6uyl20pfky5r7e/DGL" + ] + }, + { + "denom": "dgl", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1u805lv20qc6jy7c3ttre7nct6uyl20pfky5r7e", + "base": "ibc/D69F6D787EC649F4E998161A9F0646F4C2DCC64748A2AB982F14CAFBA7CC0EC9", + "name": "Licorice", + "display": "dgl", + "symbol": "DGL", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "juno", + "base_denom": "factory/juno1u805lv20qc6jy7c3ttre7nct6uyl20pfky5r7e/DGL", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-42", + "path": "transfer/channel-42/factory/juno1u805lv20qc6jy7c3ttre7nct6uyl20pfky5r7e/DGL" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/dgl.png" + }, + "keywords": [ + "osmosis-price:uosmo:1143" + ] + }, + { + "description": "USD Coin (Wormhole), USDC, factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/GGh9Ufn1SeDGrhzEkMyRKt5568VbbxZK2yvWNsd6PbXt", + "denom_units": [ + { + "denom": "ibc/6B99DB46AA9FF47162148C1726866919E44A6A5E0274B90912FD17E19A337695", + "exponent": 0, + "aliases": [ + "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/GGh9Ufn1SeDGrhzEkMyRKt5568VbbxZK2yvWNsd6PbXt" + ] + }, + { + "denom": "wormhole/GGh9Ufn1SeDGrhzEkMyRKt5568VbbxZK2yvWNsd6PbXt/6", + "exponent": 6, + "aliases": [] + } + ], + "type_asset": "ics20", + "address": "wormhole1utjx3594tlvfw4375esgu72wa4sdgf0q7x4ye27husf5kvuzp5rsr72gdq", + "base": "ibc/6B99DB46AA9FF47162148C1726866919E44A6A5E0274B90912FD17E19A337695", + "name": "USD Coin (Wormhole)", + "display": "wormhole/GGh9Ufn1SeDGrhzEkMyRKt5568VbbxZK2yvWNsd6PbXt/6", + "symbol": "USDC.wh", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Circle" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "provider": "Wormhole" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gateway", + "base_denom": "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/GGh9Ufn1SeDGrhzEkMyRKt5568VbbxZK2yvWNsd6PbXt", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-2186", + "path": "transfer/channel-2186/factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/GGh9Ufn1SeDGrhzEkMyRKt5568VbbxZK2yvWNsd6PbXt" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/usdc.hole.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1216" + ] + }, + { + "description": "Wrapped Ether (Wormhole), WETH, factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/5BWqpR48Lubd55szM5i62zK7TFkddckhbT48yy6mNbDp", + "denom_units": [ + { + "denom": "ibc/62F82550D0B96522361C89B0DA1119DE262FBDFB25E5502BC5101B5C0D0DBAAC", + "exponent": 0, + "aliases": [ + "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/5BWqpR48Lubd55szM5i62zK7TFkddckhbT48yy6mNbDp" + ] + }, + { + "denom": "wormhole/5BWqpR48Lubd55szM5i62zK7TFkddckhbT48yy6mNbDp/8", + "exponent": 8, + "aliases": [] + } + ], + "type_asset": "ics20", + "address": "wormhole18csycs4vm6varkp00apuqlsm7v4twg8jsljk8wfdd7cghr7g4rtslwqndm", + "base": "ibc/62F82550D0B96522361C89B0DA1119DE262FBDFB25E5502BC5101B5C0D0DBAAC", + "name": "Wrapped Ether (Wormhole)", + "display": "wormhole/5BWqpR48Lubd55szM5i62zK7TFkddckhbT48yy6mNbDp/8", + "symbol": "wETH.wh", + "traces": [ + { + "type": "wrapped", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Ethereum" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2" + }, + "provider": "Wormhole" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gateway", + "base_denom": "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/5BWqpR48Lubd55szM5i62zK7TFkddckhbT48yy6mNbDp", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-2186", + "path": "transfer/channel-2186/factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/5BWqpR48Lubd55szM5i62zK7TFkddckhbT48yy6mNbDp" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/weth.hole.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5:1214" + ] + }, + { + "description": "USDC is a fully collateralized US Dollar stablecoin developed by CENTRE, the open source project with Circle being the first of several forthcoming issuers.", + "denom_units": [ + { + "denom": "ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4", + "exponent": 0, + "aliases": [ + "microusdc", + "uusdc" + ] + }, + { + "denom": "usdc", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4", + "name": "USD Coin", + "display": "usdc", + "symbol": "USDC", + "traces": [ + { + "type": "synthetic", + "counterparty": { + "chain_name": "forex", + "base_denom": "USD" + }, + "provider": "Circle" + }, + { + "type": "additional-mintage", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "provider": "Circle" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "noble", + "base_denom": "uusdc", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-750", + "path": "transfer/channel-750/uusdc" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/usdc.svg" + }, + "coingecko_id": "usd-coin", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:1223" + ] + }, + { + "description": "Maximize ETH yield through leveraged staking across Aave, Compound and Morpho and liquidity provision of ETH liquid staking tokens on Uniswap V3.", + "denom_units": [ + { + "denom": "ibc/FBB3FEF80ED2344D821D4F95C31DBFD33E4E31D5324CAD94EF756E67B749F668", + "exponent": 0, + "aliases": [ + "0xb5b29320d2Dde5BA5BAFA1EbcD270052070483ec", + "yieldeth-wei" + ] + }, + { + "denom": "YieldETH", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/FBB3FEF80ED2344D821D4F95C31DBFD33E4E31D5324CAD94EF756E67B749F668", + "name": "Real Yield ETH", + "display": "YieldETH", + "symbol": "YieldETH", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Seven Seas & DeFine Logic Labs" + }, + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xb5b29320d2Dde5BA5BAFA1EbcD270052070483ec" + }, + "provider": "Axelar" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "axelar", + "base_denom": "yieldeth-wei", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-208", + "path": "transfer/channel-208/yieldeth-wei" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/yieldeth.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/yieldeth.svg" + }, + "coingecko_id": "yieldeth-sommelier", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5:1213" + ] + }, + { + "description": "The native staking token of XPLA.", + "denom_units": [ + { + "denom": "ibc/95C9B5870F95E21A242E6AF9ADCB1F212EE4A8855087226C36FBE43FC41A77B8", + "exponent": 0, + "aliases": [ + "axpla" + ] + }, + { + "denom": "xpla", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/95C9B5870F95E21A242E6AF9ADCB1F212EE4A8855087226C36FBE43FC41A77B8", + "name": "XPLA", + "display": "xpla", + "symbol": "XPLA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "xpla", + "base_denom": "axpla", + "channel_id": "channel-9" + }, + "chain": { + "channel_id": "channel-1634", + "path": "transfer/channel-1634/axpla" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/xpla/images/xpla.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/xpla/images/xpla.svg" + }, + "coingecko_id": "xpla", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1173" + ] + }, + { + "description": "OIN Token ($OIN) is a groundbreaking digital asset developed on the $SEI Blockchain. It transcends being merely a cryptocurrency; $OIN stands as a robust store of value, symbolizing the future of decentralized finance and its potential to reshape the crypto landscape.", + "denom_units": [ + { + "denom": "ibc/98B3DBF1FA79C4C14CC5F08F62ACD5498560FCB515F677526FD200D54EA048B6", + "exponent": 0, + "aliases": [ + "factory/sei1thgp6wamxwqt7rthfkeehktmq0ujh5kspluw6w/OIN" + ] + }, + { + "denom": "oin", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "sei1thgp6wamxwqt7rthfkeehktmq0ujh5kspluw6w", + "base": "ibc/98B3DBF1FA79C4C14CC5F08F62ACD5498560FCB515F677526FD200D54EA048B6", + "name": "OIN STORE OF VALUE", + "display": "oin", + "symbol": "OIN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "sei", + "base_denom": "factory/sei1thgp6wamxwqt7rthfkeehktmq0ujh5kspluw6w/OIN", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-782", + "path": "transfer/channel-782/factory/sei1thgp6wamxwqt7rthfkeehktmq0ujh5kspluw6w/OIN" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sei/images/oin.png" + }, + "keywords": [ + "osmosis-price:uosmo:1210" + ] + }, + { + "description": "The token of Neokingdom DAO.", + "denom_units": [ + { + "denom": "ibc/DEE262653B9DE39BCEF0493D47E0DFC4FE62F7F046CF38B9FDEFEBE98D149A71", + "exponent": 0, + "aliases": [ + "erc20/0x655ecB57432CC1370f65e5dc2309588b71b473A9" + ] + }, + { + "denom": "neok", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/DEE262653B9DE39BCEF0493D47E0DFC4FE62F7F046CF38B9FDEFEBE98D149A71", + "name": "Neokingdom DAO", + "display": "neok", + "symbol": "NEOK", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "evmos", + "base_denom": "erc20/0x655ecB57432CC1370f65e5dc2309588b71b473A9", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-204", + "path": "transfer/channel-204/erc20/0x655ecB57432CC1370f65e5dc2309588b71b473A9" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/evmos/images/neok.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/evmos/images/neok.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1121" + ] + }, + { + "description": "The native currency of the Realio Network.", + "denom_units": [ + { + "denom": "ibc/1CDF9C7D073DD59ED06F15DB08CC0901F2A24759BE70463570E8896F9A444ADF", + "exponent": 0, + "aliases": [ + "ario" + ] + }, + { + "denom": "rio", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/1CDF9C7D073DD59ED06F15DB08CC0901F2A24759BE70463570E8896F9A444ADF", + "name": "Realio Network", + "display": "rio", + "symbol": "RIO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "realio", + "base_denom": "ario", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-1424", + "path": "transfer/channel-1424/ario" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/realio/images/rio.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/realio/images/rio.svg" + }, + "coingecko_id": "realio-network", + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:1180" + ] + }, + { + "description": "Membrane's CDP-style stablecoin called CDT", + "denom_units": [ + { + "denom": "factory/osmo1s794h9rxggytja3a4pmwul53u98k06zy2qtrdvjnfuxruh7s8yjs6cyxgd/ucdt", + "exponent": 0 + }, + { + "denom": "cdt", + "exponent": 6 + } + ], + "base": "factory/osmo1s794h9rxggytja3a4pmwul53u98k06zy2qtrdvjnfuxruh7s8yjs6cyxgd/ucdt", + "name": "CDT Stablecoin", + "display": "cdt", + "symbol": "CDT", + "traces": [], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/CDT.svg" + }, + "coingecko_id": "collateralized-debt-token", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1268" + ] + }, + { + "description": "Membrane's protocol token", + "denom_units": [ + { + "denom": "factory/osmo1s794h9rxggytja3a4pmwul53u98k06zy2qtrdvjnfuxruh7s8yjs6cyxgd/umbrn", + "exponent": 0 + }, + { + "denom": "mbrn", + "exponent": 6 + } + ], + "base": "factory/osmo1s794h9rxggytja3a4pmwul53u98k06zy2qtrdvjnfuxruh7s8yjs6cyxgd/umbrn", + "name": "Membrane", + "display": "mbrn", + "symbol": "MBRN", + "traces": [], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/MBRN.svg" + }, + "coingecko_id": "membrane", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1225" + ] + }, + { + "description": "The native token of SGE Network", + "denom_units": [ + { + "denom": "ibc/A1830DECC0B742F0B2044FF74BE727B5CF92C9A28A9235C3BACE4D24A23504FA", + "exponent": 0, + "aliases": [ + "usge" + ] + }, + { + "denom": "sge", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/A1830DECC0B742F0B2044FF74BE727B5CF92C9A28A9235C3BACE4D24A23504FA", + "name": "SGE", + "display": "sge", + "symbol": "SGE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "sge", + "base_denom": "usge", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-5485", + "path": "transfer/channel-5485/usge" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sge/images/sge.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/sge/images/sge.svg" + }, + "coingecko_id": "six-sigma", + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:1233" + ] + }, + { + "description": "The native staking and governance token of the StaFi Hub.", + "denom_units": [ + { + "denom": "ibc/01D2F0C4739C871BFBEE7E786709E6904A55559DC1483DD92ED392EF12247862", + "exponent": 0, + "aliases": [ + "ufis" + ] + }, + { + "denom": "fis", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/01D2F0C4739C871BFBEE7E786709E6904A55559DC1483DD92ED392EF12247862", + "name": "StaFi Hub", + "display": "fis", + "symbol": "FIS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "stafihub", + "base_denom": "ufis", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-5413", + "path": "transfer/channel-5413/ufis" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stafihub/images/fis.svg" + }, + "coingecko_id": "stafi", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:1230" + ] + }, + { + "description": "A liquid staking representation of staked ATOMs", + "denom_units": [ + { + "denom": "ibc/B66CE615C600ED0A8B5AF425ECFE0D57BE2377587F66C45934A76886F34DC9B7", + "exponent": 0, + "aliases": [ + "uratom" + ] + }, + { + "denom": "ratom", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/B66CE615C600ED0A8B5AF425ECFE0D57BE2377587F66C45934A76886F34DC9B7", + "name": "rATOM", + "display": "ratom", + "symbol": "rATOM", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "cosmoshub", + "base_denom": "uatom" + }, + "provider": "StaFiHub" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "stafihub", + "base_denom": "uratom", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-5413", + "path": "transfer/channel-5413/uratom" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stafihub/images/ratom.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:1227" + ] + }, + { + "description": "The native token of ohhNFT.", + "denom_units": [ + { + "denom": "ibc/CFF40564FDA3E958D9904B8B479124987901168494655D9CC6B7C0EC0416020B", + "exponent": 0, + "aliases": [ + "factory/stars16da2uus9zrsy83h23ur42v3lglg5rmyrpqnju4/dust" + ] + }, + { + "denom": "strdst", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/CFF40564FDA3E958D9904B8B479124987901168494655D9CC6B7C0EC0416020B", + "name": "Stardust STRDST", + "display": "strdst", + "symbol": "STRDST", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "stargaze", + "base_denom": "factory/stars16da2uus9zrsy83h23ur42v3lglg5rmyrpqnju4/dust", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-75", + "path": "transfer/channel-75/factory/stars16da2uus9zrsy83h23ur42v3lglg5rmyrpqnju4/dust" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stargaze/images/dust.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stargaze/images/dust.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1234" + ] + }, + { + "description": "The native staking and governance token of the Theta testnet version of the Dora Vota.", + "denom_units": [ + { + "denom": "ibc/672406ADE4EDFD8C5EA7A0D0DD0C37E431DA7BD8393A15CD2CFDE3364917EB2A", + "exponent": 0, + "aliases": [ + "peaka" + ] + }, + { + "denom": "DORA", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/672406ADE4EDFD8C5EA7A0D0DD0C37E431DA7BD8393A15CD2CFDE3364917EB2A", + "name": "Dora Vota", + "display": "DORA", + "symbol": "DORA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "doravota", + "base_denom": "peaka", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-2694", + "path": "transfer/channel-2694/peaka" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/doravota/images/dora.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1239" + ] + }, + { + "description": "The native token of Coreum", + "denom_units": [ + { + "denom": "ibc/F3166F4D31D6BA1EC6C9F5536F5DDDD4CC93DBA430F7419E7CDC41C497944A65", + "exponent": 0, + "aliases": [ + "ucore" + ] + }, + { + "denom": "core", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/F3166F4D31D6BA1EC6C9F5536F5DDDD4CC93DBA430F7419E7CDC41C497944A65", + "name": "Coreum", + "display": "core", + "symbol": "COREUM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "coreum", + "base_denom": "ucore", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-2188", + "path": "transfer/channel-2188/ucore" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/coreum/images/coreum.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/coreum/images/coreum.svg" + }, + "coingecko_id": "coreum", + "keywords": [ + "dex", + "staking", + "wasm", + "assets", + "nft", + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1244" + ] + }, + { + "denom_units": [ + { + "denom": "ibc/D79E7D83AB399BFFF93433E54FAA480C191248FC556924A2A8351AE2638B3877", + "exponent": 0, + "aliases": [ + "utia" + ] + }, + { + "denom": "tia", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/D79E7D83AB399BFFF93433E54FAA480C191248FC556924A2A8351AE2638B3877", + "name": "Celestia", + "display": "tia", + "symbol": "TIA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "celestia", + "base_denom": "utia", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-6994", + "path": "transfer/channel-6994/utia" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/celestia/images/celestia.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/celestia/images/celestia.svg" + }, + "coingecko_id": "celestia", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1248" + ] + }, + { + "description": "The native staking token of dYdX Protocol.", + "denom_units": [ + { + "denom": "ibc/831F0B1BBB1D08A2B75311892876D71565478C532967545476DF4C2D7492E48C", + "exponent": 0, + "aliases": [ + "adydx" + ] + }, + { + "denom": "dydx", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/831F0B1BBB1D08A2B75311892876D71565478C532967545476DF4C2D7492E48C", + "name": "dYdX Protocol", + "display": "dydx", + "symbol": "DYDX", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "dydx", + "base_denom": "adydx", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-6787", + "path": "transfer/channel-6787/adydx" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/dydx/images/dydx-circle.svg" + }, + "coingecko_id": "dydx", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1246" + ] + }, + { + "description": "The native staking token of the Function X", + "denom_units": [ + { + "denom": "ibc/2B30802A0B03F91E4E16D6175C9B70F2911377C1CAE9E50FF011C821465463F9", + "exponent": 0, + "aliases": [ + "FX" + ] + }, + { + "denom": "WFX", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/2B30802A0B03F91E4E16D6175C9B70F2911377C1CAE9E50FF011C821465463F9", + "name": "f(x)Core", + "display": "WFX", + "symbol": "FX", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "fxcore", + "base_denom": "FX", + "channel_id": "channel-19" + }, + "chain": { + "channel_id": "channel-2716", + "path": "transfer/channel-2716/FX" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/fxcore/images/fx.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/fxcore/images/fx.svg" + }, + "coingecko_id": "fx-coin", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1241" + ] + }, + { + "description": "Bitcoin. On Cosmos.", + "denom_units": [ + { + "denom": "ibc/75345531D87BD90BF108BE7240BD721CB2CB0A1F16D4EBA71B09EC3C43E15C8F", + "exponent": 0, + "aliases": [ + "usat" + ] + }, + { + "denom": "nbtc", + "exponent": 14 + } + ], + "type_asset": "ics20", + "base": "ibc/75345531D87BD90BF108BE7240BD721CB2CB0A1F16D4EBA71B09EC3C43E15C8F", + "name": "Nomic Bitcoin", + "display": "nbtc", + "symbol": "nBTC", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "bitcoin", + "base_denom": "sat" + }, + "provider": "Nomic" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "nomic", + "base_denom": "usat", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-6897", + "path": "transfer/channel-6897/usat" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/nomic/images/nbtc.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/nomic/images/nbtc.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1253" + ] + }, + { + "description": "The native token of Nois", + "denom_units": [ + { + "denom": "ibc/6928AFA9EA721938FED13B051F9DBF1272B16393D20C49EA5E4901BB76D94A90", + "exponent": 0, + "aliases": [ + "unois" + ] + }, + { + "denom": "nois", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/6928AFA9EA721938FED13B051F9DBF1272B16393D20C49EA5E4901BB76D94A90", + "name": "Nois", + "display": "nois", + "symbol": "NOIS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "nois", + "base_denom": "unois", + "channel_id": "channel-37" + }, + "chain": { + "channel_id": "channel-8277", + "path": "transfer/channel-8277/unois" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/nois/images/nois.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/nois/images/nois.svg" + }, + "keywords": [ + "nois", + "randomness", + "drand", + "wasm", + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1305" + ] + }, + { + "description": "Margined Power Token sqOSMO", + "denom_units": [ + { + "denom": "factory/osmo1g8qypve6l95xmhgc0fddaecerffymsl7kn9muw/squosmo", + "exponent": 0 + }, + { + "denom": "sqosmo", + "exponent": 6 + } + ], + "base": "factory/osmo1g8qypve6l95xmhgc0fddaecerffymsl7kn9muw/squosmo", + "name": "OSMO Squared", + "display": "sqosmo", + "symbol": "sqOSMO", + "traces": [], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/sqosmo.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1267" + ] + }, + { + "description": "The Revenue & Governance token of Unstake.fi", + "denom_units": [ + { + "denom": "ibc/F74225B0AFD2F675AF56E9BE3F235486BCDE5C5E09AA88A97AFD2E052ABFE04C", + "exponent": 0, + "aliases": [ + "factory/kujira1aaudpfr9y23lt9d45hrmskphpdfaq9ajxd3ukh/unstk" + ] + }, + { + "denom": "nstk", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/F74225B0AFD2F675AF56E9BE3F235486BCDE5C5E09AA88A97AFD2E052ABFE04C", + "name": "Unstake Fi", + "display": "nstk", + "symbol": "NSTK", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "kujira", + "base_denom": "factory/kujira1aaudpfr9y23lt9d45hrmskphpdfaq9ajxd3ukh/unstk", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-259", + "path": "transfer/channel-259/factory:kujira1aaudpfr9y23lt9d45hrmskphpdfaq9ajxd3ukh:unstk" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/kujira/images/nstk.svg" + }, + "coingecko_id": "unstake-fi", + "keywords": [ + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1312" + ] + }, + { + "description": "ohhNFT LP token.", + "denom_units": [ + { + "denom": "ibc/71DAA4CAFA4FE2F9803ABA0696BA5FC0EFC14305A2EA8B4E01880DB851B1EC02", + "exponent": 0, + "aliases": [ + "factory/stars16da2uus9zrsy83h23ur42v3lglg5rmyrpqnju4/uBRNCH" + ] + }, + { + "denom": "BRNCH", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/71DAA4CAFA4FE2F9803ABA0696BA5FC0EFC14305A2EA8B4E01880DB851B1EC02", + "name": "Branch", + "display": "BRNCH", + "symbol": "BRNCH", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "stargaze", + "base_denom": "factory/stars16da2uus9zrsy83h23ur42v3lglg5rmyrpqnju4/uBRNCH", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-75", + "path": "transfer/channel-75/factory/stars16da2uus9zrsy83h23ur42v3lglg5rmyrpqnju4/uBRNCH" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stargaze/images/brnch.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stargaze/images/brnch.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/CFF40564FDA3E958D9904B8B479124987901168494655D9CC6B7C0EC0416020B:1288" + ] + }, + { + "description": "wstETH is a wrapped version of stETH. As some DeFi protocols require a constant balance mechanism for tokens, wstETH keeps your balance of stETH fixed and uses an underlying share system to reflect your earned staking rewards.", + "denom_units": [ + { + "denom": "ibc/2F21E6D4271DE3F561F20A02CD541DAF7405B1E9CB3B9B07E3C2AC7D8A4338A5", + "exponent": 0, + "aliases": [ + "factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH" + ] + }, + { + "denom": "wstETH", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/2F21E6D4271DE3F561F20A02CD541DAF7405B1E9CB3B9B07E3C2AC7D8A4338A5", + "name": "Wrapped Lido Staked Ether", + "display": "wstETH", + "symbol": "wstETH", + "traces": [ + { + "type": "liquid-stake", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "wei" + }, + "provider": "Lido" + }, + { + "type": "wrapped", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0xae7ab96520de3a18e5e111b5eaab095312d7fe84" + }, + "provider": "Lido" + }, + { + "type": "additional-mintage", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0" + }, + "provider": "Lido" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "neutron", + "base_denom": "factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-874", + "path": "transfer/channel-874/factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/wsteth.svg" + }, + "coingecko_id": "wrapped-steth", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5:1292" + ] + }, + { + "description": "Margined Power Token sqATOM", + "denom_units": [ + { + "denom": "factory/osmo1g8qypve6l95xmhgc0fddaecerffymsl7kn9muw/sqatom", + "exponent": 0 + }, + { + "denom": "sqatom", + "exponent": 6 + } + ], + "base": "factory/osmo1g8qypve6l95xmhgc0fddaecerffymsl7kn9muw/sqatom", + "name": "ATOM Squared", + "display": "sqatom", + "symbol": "sqATOM", + "traces": [], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/sqatom.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:1299" + ] + }, + { + "description": "Margined Power Token sqBTC", + "denom_units": [ + { + "denom": "factory/osmo1g8qypve6l95xmhgc0fddaecerffymsl7kn9muw/sqbtc", + "exponent": 0 + }, + { + "denom": "sqbtc", + "exponent": 6 + } + ], + "base": "factory/osmo1g8qypve6l95xmhgc0fddaecerffymsl7kn9muw/sqbtc", + "name": "BTC Squared", + "display": "sqbtc", + "symbol": "sqBTC", + "traces": [], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/sqbtc.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-unlisted" + ] + }, + { + "description": "QWOYN is the native governance token for Qwoyn Network", + "denom_units": [ + { + "denom": "ibc/09FAF1E04435E14C68DE7AB0D03C521C92975C792DB12B2EA390BAA2E06B3F3D", + "exponent": 0, + "aliases": [ + "uqwoyn" + ] + }, + { + "denom": "qwoyn", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/09FAF1E04435E14C68DE7AB0D03C521C92975C792DB12B2EA390BAA2E06B3F3D", + "name": "Qwoyn", + "display": "qwoyn", + "symbol": "QWOYN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "qwoyn", + "base_denom": "uqwoyn", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-880", + "path": "transfer/channel-880/uqwoyn" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/qwoyn/images/qwoyn.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:1295" + ] + }, + { + "description": "The liquid staking token of Bostrom", + "denom_units": [ + { + "denom": "ibc/4F3B0EC2FE2D370D10C3671A1B7B06D2A964C721470C305CBB846ED60E6CAA20", + "exponent": 0, + "aliases": [ + "hydrogen", + "hydrogen" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/4F3B0EC2FE2D370D10C3671A1B7B06D2A964C721470C305CBB846ED60E6CAA20", + "name": "Bostrom Hydrogen", + "display": "hydrogen", + "symbol": "HYDROGEN", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bostrom", + "base_denom": "hydrogen", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-95", + "path": "transfer/channel-95/hydrogen" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/hydrogen.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/hydrogen.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1302" + ] + }, + { + "description": "The staking token of Cyber", + "denom_units": [ + { + "denom": "ibc/BCDB35B7390806F35E716D275E1E017999F8281A81B6F128F087EF34D1DFA761", + "exponent": 0, + "aliases": [ + "tocyb", + "tocyb" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/BCDB35B7390806F35E716D275E1E017999F8281A81B6F128F087EF34D1DFA761", + "name": "Bostrom Tocyb", + "display": "tocyb", + "symbol": "TOCYB", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bostrom", + "base_denom": "tocyb", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-95", + "path": "transfer/channel-95/tocyb" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/tocyb.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/tocyb.svg" + }, + "keywords": [ + "osmosis-price:ibc/4F3B0EC2FE2D370D10C3671A1B7B06D2A964C721470C305CBB846ED60E6CAA20:1310" + ] + }, + { + "description": "The resource token of Bostrom", + "denom_units": [ + { + "denom": "ibc/D3A1900B2B520E45608B5671ADA461E1109628E89B4289099557C6D3996F7DAA", + "exponent": 0, + "aliases": [ + "millivolt", + "millivolt" + ] + }, + { + "denom": "volt", + "exponent": 3, + "aliases": [ + "volt" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/D3A1900B2B520E45608B5671ADA461E1109628E89B4289099557C6D3996F7DAA", + "name": "Bostrom Volt", + "display": "volt", + "symbol": "V", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bostrom", + "base_denom": "millivolt", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-95", + "path": "transfer/channel-95/millivolt" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/volt.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/volt.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1304" + ] + }, + { + "description": "The resource token of Bostrom", + "denom_units": [ + { + "denom": "ibc/020F5162B7BC40656FC5432622647091F00D53E82EE8D21757B43D3282F25424", + "exponent": 0, + "aliases": [ + "milliampere", + "milliampere" + ] + }, + { + "denom": "ampere", + "exponent": 3, + "aliases": [ + "ampere" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/020F5162B7BC40656FC5432622647091F00D53E82EE8D21757B43D3282F25424", + "name": "Bostrom Ampere", + "display": "ampere", + "symbol": "A", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "bostrom", + "base_denom": "milliampere", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-95", + "path": "transfer/channel-95/milliampere" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/ampere.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/bostrom/images/ampere.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1303" + ] + }, + { + "description": "The native token of SOURCE Chain", + "denom_units": [ + { + "denom": "ibc/E7905742CE2EA4EA5D592527DC89220C59B617DE803939FE7293805A64B484D7", + "exponent": 0, + "aliases": [ + "usource" + ] + }, + { + "denom": "source", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/E7905742CE2EA4EA5D592527DC89220C59B617DE803939FE7293805A64B484D7", + "name": "Source", + "display": "source", + "symbol": "SOURCE", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "source", + "base_denom": "usource", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-8945", + "path": "transfer/channel-8945/usource" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/source/images/source.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/source/images/source.svg" + }, + "coingecko_id": "source", + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:1311" + ] + }, + { + "description": "Pyth is a protocol that allows market participants to publish pricing information on-chain for others to use. The protocol is an interaction between three parties:\n-Publishers submit pricing information to Pyth's oracle program. Pyth has multiple data publishers for every product to improve the accuracy and robustness of the system.\n-Pyth's oracle program combines publishers' data to produce a single aggregate price and confidence interval.\nConsumers read the price information produced by the oracle program.\n\nPyth's oracle program runs simultaneously on both Solana mainnet and Pythnet. Each instance of the program is responsible for its own set of price feeds. Solana Price Feeds are available for use by Solana protocols. In this case, since the oracle program itself runs on Solana, the resulting prices are immediately available to consumers without requiring any additional work. Pythnet Price Feeds are available on 12+ blockchains. The prices constructed on Pythnet are transferred cross-chain to reach consumers on these blockchains.\n\nIn both cases, the critical component of the system is the oracle program that combines the data from each individual publisher. This program maintains a number of different Solana accounts that list the products on Pyth and their current price data. Publishers publish their price and confidence by interacting with the oracle program on every slot. The program stores this information in its accounts. The first price update in a slot additionally triggers price aggregation, which combines the price data from the previous slot into a single aggregate price and confidence interval. This aggregate price is written to the Solana account where it is readable by other on-chain programs and available for transmission to other blockchains.", + "denom_units": [ + { + "denom": "ibc/E42006ED917C769EDE1B474650EEA6BFE3F97958912B9206DD7010A28D01D9D5", + "exponent": 0, + "aliases": [ + "HZ1JovNiVvGrGNiiYvEozEVgZ58xaU3RKwX8eACQBCt3", + "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/B8ohBnfisop27exk2gtNABJyYjLwQA7ogrp5uNzvZCoy" + ] + }, + { + "denom": "wormhole/B8ohBnfisop27exk2gtNABJyYjLwQA7ogrp5uNzvZCoy/6", + "exponent": 6, + "aliases": [ + "pyth" + ] + } + ], + "type_asset": "ics20", + "address": "wormhole1utjx3594tlvfw4375esgu72wa4sdgf0q7x4ye27husf5kvuzp5rsr72gdq", + "base": "ibc/E42006ED917C769EDE1B474650EEA6BFE3F97958912B9206DD7010A28D01D9D5", + "name": "Pyth Network", + "display": "wormhole/B8ohBnfisop27exk2gtNABJyYjLwQA7ogrp5uNzvZCoy/6", + "symbol": "PYTH", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "solana", + "base_denom": "HZ1JovNiVvGrGNiiYvEozEVgZ58xaU3RKwX8eACQBCt3" + }, + "provider": "Wormhole" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gateway", + "base_denom": "factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/B8ohBnfisop27exk2gtNABJyYjLwQA7ogrp5uNzvZCoy", + "channel_id": "channel-3" + }, + "chain": { + "channel_id": "channel-2186", + "path": "transfer/channel-2186/factory/wormhole14ejqjyq8um4p3xfqj74yld5waqljf88fz25yxnma0cngspxe3les00fpjx/B8ohBnfisop27exk2gtNABJyYjLwQA7ogrp5uNzvZCoy" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/solana/images/pyth.svg" + }, + "coingecko_id": "pyth-network", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1315" + ] + }, + { + "description": "PSTAKE Liquid-Staked OSMO", + "denom_units": [ + { + "denom": "ibc/ECBE78BF7677320A93E7BA1761D144BCBF0CBC247C290C049655E106FE5DC68E", + "exponent": 0, + "aliases": [ + "stk/uosmo" + ] + }, + { + "denom": "stkosmo", + "exponent": 6, + "aliases": [ + "stk/osmo" + ] + } + ], + "type_asset": "ics20", + "base": "ibc/ECBE78BF7677320A93E7BA1761D144BCBF0CBC247C290C049655E106FE5DC68E", + "name": "PSTAKE staked OSMO", + "display": "stkosmo", + "symbol": "stkOSMO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "persistence", + "base_denom": "stk/uosmo", + "channel_id": "channel-6" + }, + "chain": { + "channel_id": "channel-4", + "path": "transfer/channel-4/stk/uosmo" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/persistence/images/stkosmo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/persistence/images/stkosmo.svg" + }, + "coingecko_id": "pstake-staked-osmo", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1323" + ] + }, + { + "description": "Levana native token", + "denom_units": [ + { + "denom": "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn", + "exponent": 0 + }, + { + "denom": "lvn", + "exponent": 6 + } + ], + "base": "factory/osmo1mlng7pz4pnyxtpq0akfwall37czyk9lukaucsrn30ameplhhshtqdvfm5c/ulvn", + "name": "Levana", + "display": "lvn", + "symbol": "LVN", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/levana.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/levana.svg" + }, + "coingecko_id": "levana-protocol", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1337" + ] + }, + { + "description": "Puppy", + "denom_units": [ + { + "denom": "ibc/46AC07DBFF1352EC94AF5BD4D23740D92D9803A6B41F6E213E77F3A1143FB963", + "exponent": 0, + "aliases": [ + "cw20:chihuahua1yl8z39ugle8s02fpwkhh293509q5xcpalmdzc4amvchz8nkexrmsy95gef" + ] + }, + { + "denom": "puppy", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "chihuahua1yl8z39ugle8s02fpwkhh293509q5xcpalmdzc4amvchz8nkexrmsy95gef", + "base": "ibc/46AC07DBFF1352EC94AF5BD4D23740D92D9803A6B41F6E213E77F3A1143FB963", + "name": "Puppy", + "display": "puppy", + "symbol": "PUPPY", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "chihuahua", + "base_denom": "cw20:chihuahua1yl8z39ugle8s02fpwkhh293509q5xcpalmdzc4amvchz8nkexrmsy95gef", + "port": "wasm.chihuahua1jwkag4yvhyj9fuddtkygvavya8hmdjuzmgxwg9vp3lw9twv6lrcq9mgl52", + "channel_id": "channel-73" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-11348", + "path": "transfer/channel-11348/cw20:chihuahua1yl8z39ugle8s02fpwkhh293509q5xcpalmdzc4amvchz8nkexrmsy95gef" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/chihuahua/images/puppyhuahua_logo.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1332" + ] + }, + { + "description": "The cutest NEWT token on Neutron chain.", + "denom_units": [ + { + "denom": "ibc/BF685448E564B5A4AC8F6E0493A0B979D0E0BF5EC11F7E15D25A0A2160C944DD", + "exponent": 0, + "aliases": [ + "unewt", + "factory/neutron1p8d89wvxyjcnawmgw72klknr3lg9gwwl6ypxda/newt" + ] + }, + { + "denom": "newt", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/BF685448E564B5A4AC8F6E0493A0B979D0E0BF5EC11F7E15D25A0A2160C944DD", + "name": "Newt", + "display": "newt", + "symbol": "NEWT", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "neutron", + "base_denom": "factory/neutron1p8d89wvxyjcnawmgw72klknr3lg9gwwl6ypxda/newt", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-874", + "path": "transfer/channel-874/factory/neutron1p8d89wvxyjcnawmgw72klknr3lg9gwwl6ypxda/newt" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/neutron/images/newt.png" + }, + "coingecko_id": "newt", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1334" + ] + }, + { + "description": "MilkyWay's liquid staked TIA", + "denom_units": [ + { + "denom": "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA", + "exponent": 0 + }, + { + "denom": "milkTIA", + "exponent": 6 + } + ], + "base": "factory/osmo1f5vfcph2dvfeqcqkhetwv75fda69z7e5c2dldm3kvgj23crkv6wqcn47a0/umilkTIA", + "name": "milkTIA", + "display": "milkTIA", + "symbol": "milkTIA", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/milktia.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/milktia.svg" + }, + "coingecko_id": "milkyway-staked-tia", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D79E7D83AB399BFFF93433E54FAA480C191248FC556924A2A8351AE2638B3877:1335" + ] + }, + { + "description": "ASH", + "denom_units": [ + { + "denom": "ibc/4976049456D261659D0EC499CC9C2391D3C7D1128A0B9FB0BBF2842D1B2BC7BC", + "exponent": 0, + "aliases": [ + "factory/migaloo1erul6xyq0gk6ws98ncj7lnq9l4jn4gnnu9we73gdz78yyl2lr7qqrvcgup/ash" + ] + }, + { + "denom": "ASH", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/4976049456D261659D0EC499CC9C2391D3C7D1128A0B9FB0BBF2842D1B2BC7BC", + "name": "ASH", + "display": "ASH", + "symbol": "ASH", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "migaloo", + "base_denom": "factory/migaloo1erul6xyq0gk6ws98ncj7lnq9l4jn4gnnu9we73gdz78yyl2lr7qqrvcgup/ash", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-642", + "path": "transfer/channel-642/factory/migaloo1erul6xyq0gk6ws98ncj7lnq9l4jn4gnnu9we73gdz78yyl2lr7qqrvcgup/ash" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/migaloo/images/ash.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1360" + ] + }, + { + "description": "RAC", + "denom_units": [ + { + "denom": "ibc/DDF1CD4CDC14AE2D6A3060193624605FF12DEE71CF1F8C19EEF35E9447653493", + "exponent": 0, + "aliases": [ + "factory/migaloo1eqntnl6tzcj9h86psg4y4h6hh05g2h9nj8e09l/urac" + ] + }, + { + "denom": "RAC", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/DDF1CD4CDC14AE2D6A3060193624605FF12DEE71CF1F8C19EEF35E9447653493", + "name": "RAC", + "display": "RAC", + "symbol": "RAC", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "migaloo", + "base_denom": "factory/migaloo1eqntnl6tzcj9h86psg4y4h6hh05g2h9nj8e09l/urac", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-642", + "path": "transfer/channel-642/factory/migaloo1eqntnl6tzcj9h86psg4y4h6hh05g2h9nj8e09l/urac" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/migaloo/images/rac.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/migaloo/images/rac.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1359" + ] + }, + { + "description": "GUPPY", + "denom_units": [ + { + "denom": "ibc/42A9553A7770F3D7B62F3A82AF04E7719B4FD6EAF31BE5645092AAC4A6C2201D", + "exponent": 0, + "aliases": [ + "factory/migaloo1etlu2h30tjvv8rfa4fwdc43c92f6ul5w9acxzk/uguppy" + ] + }, + { + "denom": "GUPPY", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/42A9553A7770F3D7B62F3A82AF04E7719B4FD6EAF31BE5645092AAC4A6C2201D", + "name": "GUPPY", + "display": "GUPPY", + "symbol": "GUPPY", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "migaloo", + "base_denom": "factory/migaloo1etlu2h30tjvv8rfa4fwdc43c92f6ul5w9acxzk/uguppy", + "channel_id": "channel-5" + }, + "chain": { + "channel_id": "channel-642", + "path": "transfer/channel-642/factory/migaloo1etlu2h30tjvv8rfa4fwdc43c92f6ul5w9acxzk/uguppy" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/migaloo/images/guppy.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/46AC07DBFF1352EC94AF5BD4D23740D92D9803A6B41F6E213E77F3A1143FB963:1342" + ] + }, + { + "description": "The native EVM, governance and staking token of the Haqq Network", + "denom_units": [ + { + "denom": "ibc/69110FF673D70B39904FF056CFDFD58A90BEC3194303F45C32CB91B8B0A738EA", + "exponent": 0, + "aliases": [ + "aISLM" + ] + }, + { + "denom": "ISLM", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/69110FF673D70B39904FF056CFDFD58A90BEC3194303F45C32CB91B8B0A738EA", + "name": "Haqq Network", + "display": "ISLM", + "symbol": "ISLM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "haqq", + "base_denom": "aISLM", + "channel_id": "channel-2" + }, + "chain": { + "channel_id": "channel-1575", + "path": "transfer/channel-1575/aISLM" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/haqq/images/islm.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/haqq/images/islm.svg" + }, + "coingecko_id": "islamic-coin", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858:1343" + ] + }, + { + "description": "$AUTISM exists to celebrate autism as a superior biological tech stack for a changing world", + "denom_units": [ + { + "denom": "ibc/9DDF52A334F92BC57A9E0D59DFF9984EAC61D2A14E5162605DF601AA58FDFC6D", + "exponent": 0, + "aliases": [ + "factory/inj14lf8xm6fcvlggpa7guxzjqwjmtr24gnvf56hvz/autism" + ] + }, + { + "denom": "autism", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/9DDF52A334F92BC57A9E0D59DFF9984EAC61D2A14E5162605DF601AA58FDFC6D", + "name": "Autism", + "display": "autism", + "symbol": "AUTISM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "injective", + "base_denom": "factory/inj14lf8xm6fcvlggpa7guxzjqwjmtr24gnvf56hvz/autism", + "channel_id": "channel-8" + }, + "chain": { + "channel_id": "channel-122", + "path": "transfer/channel-122/factory/inj14lf8xm6fcvlggpa7guxzjqwjmtr24gnvf56hvz/autism" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/injective/images/autism.png" + }, + "coingecko_id": "autism", + "keywords": [ + "osmosis-unlisted" + ] + }, + { + "description": "The PAGE token is used for actions in the PageDAO NFT literary ecosystem and for DAO governance.", + "denom_units": [ + { + "denom": "ibc/23A62409E4AD8133116C249B1FA38EED30E500A115D7B153109462CD82C1CD99", + "exponent": 0, + "aliases": [ + "gravity0x60e683C6514Edd5F758A55b6f393BeBBAfaA8d5e" + ] + }, + { + "denom": "page", + "exponent": 8 + } + ], + "type_asset": "ics20", + "base": "ibc/23A62409E4AD8133116C249B1FA38EED30E500A115D7B153109462CD82C1CD99", + "name": "Page", + "display": "page", + "symbol": "PAGE", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x60e683C6514Edd5F758A55b6f393BeBBAfaA8d5e" + }, + "provider": "Gravity Bridge" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "gravitybridge", + "base_denom": "gravity0x60e683C6514Edd5F758A55b6f393BeBBAfaA8d5e", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-144", + "path": "transfer/channel-144/gravity0x60e683C6514Edd5F758A55b6f393BeBBAfaA8d5e" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/page.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/page.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1344" + ] + }, + { + "description": "PURSE Token", + "denom_units": [ + { + "denom": "ibc/6FD2938076A4C1BB3A324A676E76B0150A4443DAE0E002FB62AC0E6B604B1519", + "exponent": 0, + "aliases": [ + "bsc0x29a63F4B209C29B4DC47f06FFA896F32667DAD2C" + ] + }, + { + "denom": "PURSE", + "exponent": 18 + } + ], + "type_asset": "ics20", + "base": "ibc/6FD2938076A4C1BB3A324A676E76B0150A4443DAE0E002FB62AC0E6B604B1519", + "name": "PURSE Token", + "display": "PURSE", + "symbol": "PURSE", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "binancesmartchain", + "base_denom": "0x29a63F4B209C29B4DC47f06FFA896F32667DAD2C", + "contract": "0x84238c00c8313920826D798e3cF6793Ef4F610ad" + }, + "provider": "Function X" + }, + { + "type": "ibc", + "counterparty": { + "chain_name": "pundix", + "base_denom": "bsc0x29a63F4B209C29B4DC47f06FFA896F32667DAD2C", + "channel_id": "channel-1" + }, + "chain": { + "channel_id": "channel-12618", + "path": "transfer/channel-12618/bsc0x29a63F4B209C29B4DC47f06FFA896F32667DAD2C" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/pundix/images/purse-token-logo.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/pundix/images/purse-token-logo.svg" + }, + "keywords": [ + "osmosis-price:uosmo:1394", + "osmosis-unlisted" + ] + }, + { + "description": "The first meme coin on Injective. It’s a dog, but he has nunchucks", + "denom_units": [ + { + "denom": "ibc/183C0BB962D2F57C957E0B134CFA0AC9D6F755C02DE9DC2A59089BA23009DEC3", + "exponent": 0, + "aliases": [ + "factory/inj1xtel2knkt8hmc9dnzpjz6kdmacgcfmlv5f308w/ninja" + ] + }, + { + "denom": "NINJA", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/183C0BB962D2F57C957E0B134CFA0AC9D6F755C02DE9DC2A59089BA23009DEC3", + "name": "Dog wif nunchucks", + "display": "NINJA", + "symbol": "NINJA", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "injective", + "base_denom": "factory/inj1xtel2knkt8hmc9dnzpjz6kdmacgcfmlv5f308w/ninja", + "channel_id": "channel-8" + }, + "chain": { + "channel_id": "channel-122", + "path": "transfer/channel-122/factory/inj1xtel2knkt8hmc9dnzpjz6kdmacgcfmlv5f308w/ninja" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/injective/images/ninja.png" + }, + "coingecko_id": "dog-wif-nuchucks", + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1384" + ] + }, + { + "description": "Kleomedes Token", + "denom_units": [ + { + "denom": "ibc/5F5B7DA5ECC80F6C7A8702D525BB0B74279B1F7B8EFAE36E423D68788F7F39FF", + "exponent": 0, + "aliases": [ + "cw20:juno10gthz5ufgrpuk5cscve2f0hjp56wgp90psqxcrqlg4m9mcu9dh8q4864xy" + ] + }, + { + "denom": "kleo", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno10gthz5ufgrpuk5cscve2f0hjp56wgp90psqxcrqlg4m9mcu9dh8q4864xy", + "base": "ibc/5F5B7DA5ECC80F6C7A8702D525BB0B74279B1F7B8EFAE36E423D68788F7F39FF", + "name": "Kleomedes", + "display": "kleo", + "symbol": "KLEO", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno10gthz5ufgrpuk5cscve2f0hjp56wgp90psqxcrqlg4m9mcu9dh8q4864xy", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno10gthz5ufgrpuk5cscve2f0hjp56wgp90psqxcrqlg4m9mcu9dh8q4864xy" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/kleomedes.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1353" + ] + }, + { + "description": "NYX Token (NYX) is the Nym Network's native token.", + "denom_units": [ + { + "denom": "ibc/1A611E8A3E4248106A1A5A80A64BFA812739435E8B9888EB3F652A21F029F317", + "exponent": 0, + "aliases": [ + "unyx" + ] + }, + { + "denom": "nyx", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/1A611E8A3E4248106A1A5A80A64BFA812739435E8B9888EB3F652A21F029F317", + "name": "Nym", + "display": "nyx", + "symbol": "NYX", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "nyx", + "base_denom": "unyx", + "channel_id": "channel-8" + }, + "chain": { + "channel_id": "channel-15464", + "path": "transfer/channel-15464/unyx" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/nyx/images/nyx.png" + }, + "keywords": [ + "osmosis-main", + "osmosis-unlisted" + ] + }, + { + "description": "NYM Token (NYM) is the Nym Network's native utility token, used as the primary means to incentivize mixnet node operators.", + "denom_units": [ + { + "denom": "ibc/37CB3078432510EE57B9AFA8DBE028B33AE3280A144826FEAC5F2334CF2C5539", + "exponent": 0, + "aliases": [ + "unym" + ] + }, + { + "denom": "nym", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/37CB3078432510EE57B9AFA8DBE028B33AE3280A144826FEAC5F2334CF2C5539", + "name": "NYM", + "display": "nym", + "symbol": "NYM", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "nyx", + "base_denom": "unym", + "channel_id": "channel-8" + }, + "chain": { + "channel_id": "channel-15464", + "path": "transfer/channel-15464/unym" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/nyx/images/nym.png" + }, + "coingecko_id": "nym", + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:uosmo:1361" + ] + }, + { + "description": "has a hat", + "denom_units": [ + { + "denom": "ibc/2FFE07C4B4EFC0DDA099A16C6AF3C9CCA653CC56077E87217A585D48794B0BC7", + "exponent": 0, + "aliases": [ + "factory/chihuahua1x4q2vkrz4dfgd9hcw0p5m2f2nuv2uqmt9xr8k2/achihuahuawifhat" + ] + }, + { + "denom": "achihuahuawifhat", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/2FFE07C4B4EFC0DDA099A16C6AF3C9CCA653CC56077E87217A585D48794B0BC7", + "name": "Chihuahuawifhat", + "display": "achihuahuawifhat", + "symbol": "BADDOG", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "chihuahua", + "base_denom": "factory/chihuahua1x4q2vkrz4dfgd9hcw0p5m2f2nuv2uqmt9xr8k2/achihuahuawifhat", + "channel_id": "channel-7" + }, + "chain": { + "channel_id": "channel-113", + "path": "transfer/channel-113/factory/chihuahua1x4q2vkrz4dfgd9hcw0p5m2f2nuv2uqmt9xr8k2/achihuahuawifhat" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/chihuahua/images/baddog.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/B9E0A1A524E98BB407D3CED8720EFEFD186002F90C1B1B7964811DD0CCC12228:1356" + ] + }, + { + "description": "clownmaxxed store of value", + "denom_units": [ + { + "denom": "ibc/8C8F6349F656C943543C6B040377BE44123D01F712277815C3C13098BB98818C", + "exponent": 0, + "aliases": [ + "ucircus", + "factory/neutron170v88vrtnedesyfytuku257cggxc79rd7lwt7q/ucircus" + ] + }, + { + "denom": "circus", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/8C8F6349F656C943543C6B040377BE44123D01F712277815C3C13098BB98818C", + "name": "AtomEconomicZone69JaeKwonInu", + "display": "circus", + "symbol": "CIRCUS", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "neutron", + "base_denom": "factory/neutron170v88vrtnedesyfytuku257cggxc79rd7lwt7q/ucircus", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-874", + "path": "transfer/channel-874/factory/neutron170v88vrtnedesyfytuku257cggxc79rd7lwt7q/ucircus" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/neutron/images/circus.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1393" + ] + }, + { + "description": "Governance and utility token for the Junø Apes NFT platform on Juno", + "denom_units": [ + { + "denom": "ibc/176DD560277BB0BD676260BE02EBAB697725CA85144D8A2BF286C6B5323DB5FE", + "exponent": 0, + "aliases": [ + "cw20:juno1zkwveux7y6fmsr88atf3cyffx96p0c96qr8tgcsj7vfnhx7sal3s3zu3ps" + ] + }, + { + "denom": "jape", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno1zkwveux7y6fmsr88atf3cyffx96p0c96qr8tgcsj7vfnhx7sal3s3zu3ps", + "base": "ibc/176DD560277BB0BD676260BE02EBAB697725CA85144D8A2BF286C6B5323DB5FE", + "name": "Junø Apes", + "display": "jape", + "symbol": "JAPE", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno1zkwveux7y6fmsr88atf3cyffx96p0c96qr8tgcsj7vfnhx7sal3s3zu3ps", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno1zkwveux7y6fmsr88atf3cyffx96p0c96qr8tgcsj7vfnhx7sal3s3zu3ps" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/jape.png" + }, + "keywords": [ + "osmosis-price:uosmo:1377" + ] + }, + { + "description": "Woof", + "denom_units": [ + { + "denom": "ibc/9B8EC667B6DF55387DC0F3ACC4F187DA6921B0806ED35DE6B04DE96F5AB81F53", + "exponent": 0, + "aliases": [ + "factory/chihuahua13jawsn574rf3f0u5rhu7e8n6sayx5gkw3eddhp/uwoof" + ] + }, + { + "denom": "WOOF", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/9B8EC667B6DF55387DC0F3ACC4F187DA6921B0806ED35DE6B04DE96F5AB81F53", + "name": "WOOF", + "display": "WOOF", + "symbol": "WOOF", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "chihuahua", + "base_denom": "factory/chihuahua13jawsn574rf3f0u5rhu7e8n6sayx5gkw3eddhp/uwoof", + "channel_id": "channel-7" + }, + "chain": { + "channel_id": "channel-113", + "path": "transfer/channel-113/factory/chihuahua13jawsn574rf3f0u5rhu7e8n6sayx5gkw3eddhp/uwoof" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/chihuahua/images/woof.png" + }, + "keywords": [ + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1365" + ] + }, + { + "description": "The native coin of Sneaky Productions.", + "denom_units": [ + { + "denom": "ibc/94ED1F172BC633DFC56D7E26551D8B101ADCCC69052AC44FED89F97FF658138F", + "exponent": 0, + "aliases": [ + "factory/stars1xx5976njvxpl9n4v8huvff6cudhx7yuu8e7rt4/usneaky" + ] + }, + { + "denom": "sneaky", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/94ED1F172BC633DFC56D7E26551D8B101ADCCC69052AC44FED89F97FF658138F", + "name": "Sneaky Productions", + "display": "sneaky", + "symbol": "SNEAKY", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "stargaze", + "base_denom": "factory/stars1xx5976njvxpl9n4v8huvff6cudhx7yuu8e7rt4/usneaky", + "channel_id": "channel-0" + }, + "chain": { + "channel_id": "channel-75", + "path": "transfer/channel-75/factory/stars1xx5976njvxpl9n4v8huvff6cudhx7yuu8e7rt4/usneaky" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stargaze/images/sneaky.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/stargaze/images/sneaky.svg" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1403" + ] + }, + { + "description": "Wrapped Bitcoin (WBTC) is an ERC20 token backed 1:1 with Bitcoin. Completely transparent. 100% verifiable. Community led.", + "denom_units": [ + { + "denom": "factory/osmo1z0qrq605sjgcqpylfl4aa6s90x738j7m58wyatt0tdzflg2ha26q67k743/wbtc", + "exponent": 0, + "aliases": [ + "wbtc-satoshi" + ] + }, + { + "denom": "wbtc", + "exponent": 8 + } + ], + "address": "osmo1z0qrq605sjgcqpylfl4aa6s90x738j7m58wyatt0tdzflg2ha26q67k743", + "base": "factory/osmo1z0qrq605sjgcqpylfl4aa6s90x738j7m58wyatt0tdzflg2ha26q67k743/wbtc", + "name": "Wrapped Bitcoin", + "display": "wbtc", + "symbol": "WBTC", + "traces": [ + { + "type": "bridge", + "counterparty": { + "chain_name": "bitcoin", + "base_denom": "sat" + }, + "provider": "BitGo, Kyber, and Ren" + }, + { + "type": "additional-mintage", + "counterparty": { + "chain_name": "ethereum", + "base_denom": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599" + }, + "provider": "BitGo, Kyber, and Ren" + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/wbtc.png", + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ethereum/images/wbtc.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-unlisted" + ] + }, + { + "description": "Baddest coin on Cosmos", + "denom_units": [ + { + "denom": "ibc/442A08C33AE9875DF90792FFA73B5728E1CAECE87AB4F26AE9B422F1E682ED23", + "exponent": 0, + "aliases": [ + "ubad", + "factory/neutron143wp6g8paqasnuuey6zyapucknwy9rhnld8hkr/bad" + ] + }, + { + "denom": "bad", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/442A08C33AE9875DF90792FFA73B5728E1CAECE87AB4F26AE9B422F1E682ED23", + "name": "Badcoin", + "display": "bad", + "symbol": "BAD", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "neutron", + "base_denom": "factory/neutron143wp6g8paqasnuuey6zyapucknwy9rhnld8hkr/bad", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-874", + "path": "transfer/channel-874/factory/neutron143wp6g8paqasnuuey6zyapucknwy9rhnld8hkr/bad" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/neutron/images/bad.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1381" + ] + }, + { + "description": "Signal Art and Gaming on Juno", + "denom_units": [ + { + "denom": "ibc/4BDADBEDA31899036AB286E9901116496A9D85FB87B35A408C9D67C0DCAC660A", + "exponent": 0, + "aliases": [ + "cw20:juno14lycavan8gvpjn97aapzvwmsj8kyrvf644p05r0hu79namyj3ens87650k" + ] + }, + { + "denom": "sgnl", + "exponent": 6 + } + ], + "type_asset": "ics20", + "address": "juno14lycavan8gvpjn97aapzvwmsj8kyrvf644p05r0hu79namyj3ens87650k", + "base": "ibc/4BDADBEDA31899036AB286E9901116496A9D85FB87B35A408C9D67C0DCAC660A", + "name": "Signal", + "display": "sgnl", + "symbol": "SGNL", + "traces": [ + { + "type": "ibc-cw20", + "counterparty": { + "chain_name": "juno", + "base_denom": "cw20:juno14lycavan8gvpjn97aapzvwmsj8kyrvf644p05r0hu79namyj3ens87650k", + "port": "wasm.juno1v4887y83d6g28puzvt8cl0f3cdhd3y6y9mpysnsp3k8krdm7l6jqgm0rkn", + "channel_id": "channel-47" + }, + "chain": { + "port": "transfer", + "channel_id": "channel-169", + "path": "transfer/channel-169/cw20:juno14lycavan8gvpjn97aapzvwmsj8kyrvf644p05r0hu79namyj3ens87650k" + } + } + ], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/juno/images/sgnl.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1392" + ] + }, + { + "description": "The first native memecoin on Osmosis. Crafted by the deftest of hands in the lab of lunacy. It's scientifically anarchic, professionally foolish, and your ticket to the madhouse.", + "denom_units": [ + { + "denom": "factory/osmo1pfyxruwvtwk00y8z06dh2lqjdj82ldvy74wzm3/WOSMO", + "exponent": 0 + }, + { + "denom": "WOSMO", + "exponent": 6 + } + ], + "address": "osmo1pfyxruwvtwk00y8z06dh2lqjdj82ldvy74wzm3", + "base": "factory/osmo1pfyxruwvtwk00y8z06dh2lqjdj82ldvy74wzm3/WOSMO", + "name": "WOSMO", + "display": "WOSMO", + "symbol": "WOSMO", + "traces": [], + "logo_URIs": { + "png": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/WOSMO.png" + }, + "keywords": [ + "osmosis-info", + "osmosis-price:uosmo:1408" + ] + }, + { + "description": "Margined Power Token sqTIA", + "denom_units": [ + { + "denom": "factory/osmo1g8qypve6l95xmhgc0fddaecerffymsl7kn9muw/sqtia", + "exponent": 0 + }, + { + "denom": "sqtia", + "exponent": 6 + } + ], + "base": "factory/osmo1g8qypve6l95xmhgc0fddaecerffymsl7kn9muw/sqtia", + "name": "TIA Squared", + "display": "sqtia", + "symbol": "sqTIA", + "traces": [], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/sqtia.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-info", + "osmosis-price:ibc/D79E7D83AB399BFFF93433E54FAA480C191248FC556924A2A8351AE2638B3877:1378" + ] + }, + { + "description": "The deflationary utility token of the Apollo DAO project", + "denom_units": [ + { + "denom": "ibc/73BB20AF857D1FE6E061D01CA13870872AD0C979497CAF71BEA25B1CBF6879F1", + "exponent": 0, + "aliases": [ + "uapollo", + "factory/neutron154gg0wtm2v4h9ur8xg32ep64e8ef0g5twlsgvfeajqwghdryvyqsqhgk8e/APOLLO" + ] + }, + { + "denom": "apollo", + "exponent": 6 + } + ], + "type_asset": "ics20", + "base": "ibc/73BB20AF857D1FE6E061D01CA13870872AD0C979497CAF71BEA25B1CBF6879F1", + "name": "Apollo DAO", + "display": "apollo", + "symbol": "APOLLO", + "traces": [ + { + "type": "ibc", + "counterparty": { + "chain_name": "neutron", + "base_denom": "factory/neutron154gg0wtm2v4h9ur8xg32ep64e8ef0g5twlsgvfeajqwghdryvyqsqhgk8e/APOLLO", + "channel_id": "channel-10" + }, + "chain": { + "channel_id": "channel-874", + "path": "transfer/channel-874/factory/neutron154gg0wtm2v4h9ur8xg32ep64e8ef0g5twlsgvfeajqwghdryvyqsqhgk8e/APOLLO" + } + } + ], + "logo_URIs": { + "svg": "https://raw.githubusercontent.com/cosmos/chain-registry/master/neutron/images/apollo.svg" + }, + "keywords": [ + "osmosis-main", + "osmosis-price:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4:1410" + ] + } + ] +} diff --git a/src/templates/osmosis.yml b/src/templates/osmosis.yml new file mode 100755 index 0000000000..cfb4b6e78f --- /dev/null +++ b/src/templates/osmosis.yml @@ -0,0 +1,23 @@ +networks: + mainnet: + nodeURL: https://rpc.osmosis.zone/ + tokenListType: FILE + tokenListSource: /home/gateway/conf/lists/osmosis-1.assetlist.json + chainId: osmosis-1 + testnet: + nodeURL: https://rpc.testnet.osmosis.zone/ + tokenListType: FILE + tokenListSource: /home/gateway/conf/lists/osmo-test-5-assetlist.json + chainId: osmo-test-5 +network: mainnet +nativeCurrencySymbol: OSMO + +feeTier: medium +gasAdjustment: 1.7 +gasLimitTransaction: 2000000 +allowedSlippage: "20/100" + +manualGasPrice: 0.025 +manualGasPriceToken: uosmo +useEIP1559DynamicBaseFeeInsteadOfManualGasPrice: true +rpcAddressDynamicBaseFee: https://lcd.osmosis.zone/osmosis/txfees/v1beta1/cur_eip_base_fee diff --git a/src/templates/root.yml b/src/templates/root.yml index 3d83344085..748ec134b2 100644 --- a/src/templates/root.yml +++ b/src/templates/root.yml @@ -71,7 +71,11 @@ configurations: $namespace cosmos: configurationPath: cosmos.yml schemaPath: cosmos-schema.json - + + $namespace osmosis: + configurationPath: osmosis.yml + schemaPath: osmosis-schema.json + $namespace cronos: configurationPath: cronos.yml schemaPath: ethereum-schema.json diff --git a/test-bronze/chains/osmosis/osmosis.test.ts b/test-bronze/chains/osmosis/osmosis.test.ts new file mode 100755 index 0000000000..d9d5f1d0f0 --- /dev/null +++ b/test-bronze/chains/osmosis/osmosis.test.ts @@ -0,0 +1,233 @@ +import { patch, unpatch } from '../../../test/services/patch'; +import { Osmosis } from '../../../src/chains/osmosis/osmosis'; +import { ConfigManagerCertPassphrase } from '../../../src/services/config-manager-cert-passphrase'; +import { addWallet, getWallets } from '../../../src/services/wallet/wallet.controllers'; +import Decimal from 'decimal.js-light'; +import { CosmosAsset } from '../../../src/chains/cosmos/cosmos-base'; +import { Side } from '../../../src/amm/amm.requests'; + +const osmosisAddress = 'osmo1gxfandcf6x6y0lv3afv0p4w4akv809ycrly4cs'; +const osmosisPrivateKey = '2e8be986f72f76dba7f8448b2e2342d3297cd628cf08aad9b90098102824f9d5'; +const osmosisOutboundAddress = 'osmo1mvsg3en5ulpnpd3dset2m86zjpnzp4v4epmjh7' + +const network = 'testnet' + +jest.setTimeout(300000); // run for 5 mins + +let osmosis: Osmosis; + +beforeAll(async () => { + patch(ConfigManagerCertPassphrase, 'readPassphrase', () => 'a'); + osmosis = Osmosis.getInstance(network); + + await osmosis.init(); +}); + +beforeEach(() => { +}); + +afterEach(() => { +}); + +afterAll(async () => { + unpatch(); + await osmosis.close(); +}); + +describe('wallets', () => { + it('add an Osmosmis wallet', async () => { + await addWallet({ + privateKey: osmosisPrivateKey, + chain: 'osmosis', + network: network, + }); + + const wallets = await getWallets(); + + const addresses: string[][] = wallets + .filter((wallet) => wallet.chain === 'osmosis') + .map((wallet) => wallet.walletAddresses); + + expect(addresses[0]).toContain(osmosisAddress); + }); +}); + +describe('chain.routes', () => { + + it('getTokens', async () => { + var getTokens = await osmosis.controller.getTokens(osmosis, {tokenSymbols:['OSMO']}); + expect(getTokens.tokens[0].symbol).toEqual('OSMO'); + }); + + it('getTokens All', async () => { + var getTokens = await osmosis.controller.getTokens(osmosis, {}); + expect(getTokens.tokens.length).toBeGreaterThan(0); + }); + + it('balances OSMO', async () => { + const balances = await osmosis.controller.balances(osmosis, {address:osmosisAddress, tokenSymbols:['OSMO']}); + expect(Number(balances.balances['OSMO'])).toBeGreaterThan(0); + }); + + it('balances All', async () => { + const balances = await osmosis.controller.balances(osmosis, {address:osmosisAddress, tokenSymbols:['OSMO']}); + expect(Number(balances.balances['OSMO'])).toBeGreaterThan(0); + }); + + it('getWalletFromPrivateKey', async () => { + const walleto = await osmosis.getWalletFromPrivateKey( + osmosisPrivateKey, + 'osmo' + ); + expect(walleto.prefix).toEqual('osmo'); + + const balanceo = await osmosis.getBalances(walleto) + expect(Number(balanceo['OSMO'].value)).toBeGreaterThan(0); + }); + + it('balances All', async () => { + const block = await osmosis.getCurrentBlockNumber(); + expect(block).toBeGreaterThan(0); + }); + + it('getTokenBySymbol', async () => { + var token = osmosis.getTokenBySymbol('ATOM')!; + var token2 = osmosis.getTokenForSymbol('OSMO')!; + expect(token.decimals).toEqual(6); + expect(token2.symbol).toEqual('OSMO'); + }); + + it('transfer', async () => { + var transfer = await osmosis.controller.transfer(osmosis, {'from':osmosisAddress, 'to':osmosisOutboundAddress, 'token':'OSMO', amount:'0.000001', 'chain':'osmosis', 'network':network}); + expect(transfer).toContain('Transfer success'); + }); + +}); + + +describe('chain.routes - DISABLED', () => { + + it('allowances', async () => { + var allowances = await osmosis.controller.allowances(osmosis, {'address':osmosisAddress, 'spender':osmosisOutboundAddress, 'tokenSymbols':[], 'chain':'osmosis', 'network':network}); + expect(allowances.spender).toBeUndefined() + }); + + it('approve', async () => { + var approve = await osmosis.controller.approve(osmosis, {'address':osmosisAddress, 'spender':osmosisOutboundAddress, token:'OSMO', 'chain':'osmosis', 'network':network}); + expect(approve.spender).toBeUndefined() + }); + + it('cancel', async () => { + var cancel = await osmosis.controller.cancel(osmosis, {'address':osmosisAddress, 'nonce':0, 'chain':'osmosis', 'network':network}); + expect(cancel.txHash).toBeUndefined() + }); + + it('nextNonce', async () => { + var nextNonce = await osmosis.controller.nextNonce(osmosis, {'address':osmosisAddress, 'chain':'osmosis', 'network':network}); + expect(nextNonce.nonce).toEqual(0) + }); + + it('nonce', async () => { + var nonce = await osmosis.controller.nonce(osmosis, {'address':osmosisAddress, 'chain':'osmosis', 'network':network}); + expect(nonce.nonce).toEqual(0) + }); + +}); + + + +describe('controllers - price + trade', () => { + + it('estimateGas', async () => { + var estimateGas = await osmosis.controller.estimateGas(osmosis); + expect(estimateGas.gasPriceToken).toEqual('uosmo'); + }); + + it('getTradeInfo', async () => { + const tradeInfo = await osmosis.controller.getTradeInfo(osmosis, "OSMO", "ION", new Decimal(1.0), "BUY") + expect((tradeInfo.baseToken as CosmosAsset).base).toEqual('uosmo'); + expect(tradeInfo.requestAmount.toNumber()).toEqual(1); + expect(tradeInfo.expectedTrade.routes.length).toBeGreaterThanOrEqual(1); + }); + + it('price', async () => { + // slippage must be high on testnet due to price mismatch with pool ratios + const priceRequest1 = {'quote':'ION', 'base':'OSMO', 'amount':'1', 'side':'BUY' as Side, 'allowedSlippage':'100/100', 'chain':'osmosis', 'network':network}; + const priceResponse1 = await osmosis.controller.price(osmosis, priceRequest1) + expect(priceResponse1.base).toEqual('OSMO') + }); + + it('trade', async () => { + const tradeRequest = {'quote':'ION', 'base':'OSMO', 'amount':'0.01', 'side':'BUY' as Side, 'allowedSlippage':'100/100', 'chain':'osmosis', 'network':network, 'address':osmosisAddress, }; + const tradeResponse = await osmosis.controller.trade(osmosis, tradeRequest) + expect(tradeResponse.base).toEqual('uosmo') + }); + + it('trade back', async () => { + const tradeRequest = {'quote':'OSMO', 'base':'ION', 'amount':'0.00001', 'side':'BUY' as Side, 'allowedSlippage':'100/100', 'chain':'osmosis', 'network':network, 'address':osmosisAddress, }; + const tradeResponse = await osmosis.controller.trade(osmosis, tradeRequest) + expect(tradeResponse.base).toEqual('uion') + }); + + +}); + +// we're not testing poll() since transactions seem to 404 after a week or so + +describe('controllers - CL Pools + Liquidity', () => { + + // best to join pools using one amount == 0 (so input 1 token type at a time) + // adds tend to fail unless amounts input are similar in relative $ value + var poolIdGAMM: number; + it('addLiquidity', async () => { + const addLiquidityRequestFunction = {'fee': 'high', 'token0':'ION', 'token1':'OSMO', 'amount0':'0', 'amount1':'0.0005', 'chain':'osmosis', 'network':network, 'address':osmosisAddress, }; + var addLiquidityResponse = await osmosis.controller.addLiquidity(osmosis, addLiquidityRequestFunction) + poolIdGAMM = addLiquidityResponse.tokenId; + expect(addLiquidityResponse.tokenId).toBeDefined(); + }); + + var poolIdCL: number; + it('addLiquidity CL', async () => { + const addLiquidityRequestFunction = {'allowedSlippage':'100/100', 'lowerPrice':'100', 'upperPrice':'500', 'fee': 'high', 'token0':'ION', 'token1':'OSMO', 'amount0':'0.000401', 'amount1':'0.1', 'chain':'osmosis', 'network':network, 'address':osmosisAddress}; + var addLiquidityResponse = await osmosis.controller.addLiquidity(osmosis, addLiquidityRequestFunction) + poolIdCL = addLiquidityResponse.tokenId; + expect(addLiquidityResponse.tokenId).toBeDefined(); + }); + + it('positionsRequest CL', async () => { + const positionsRequest1 = { + chain:'osmosis', + network:network, + address: osmosisAddress, + tokenId: poolIdCL // CL + } + var positionsResponse1 = await osmosis.controller.poolPositions(osmosis, positionsRequest1) + expect(positionsResponse1.pools!.length).toBeGreaterThan(0) + }); + + it('removeLiquidity GAMM', async () => { + const removeLiquidityRequest = {'decreasePercent':100, 'tokenId':poolIdGAMM, 'chain':'osmosis', 'network':network, 'address':osmosisAddress, 'allowedSlippage':'100/100'}; + var removeLiquidityResponse = await osmosis.controller.removeLiquidity(osmosis, removeLiquidityRequest) + expect(removeLiquidityResponse.txHash).toBeDefined(); + }); + + it('removeLiquidity CL', async () => { + const removeLiquidityRequest = {'decreasePercent':100, 'tokenId':poolIdCL, 'chain':'osmosis', 'network':network, 'address':osmosisAddress, 'allowedSlippage':'100/100'}; + var removeLiquidityResponse = await osmosis.controller.removeLiquidity(osmosis, removeLiquidityRequest) + expect(removeLiquidityResponse.txHash).toBeDefined(); + }); + + it('poolPrice', async () => { + const poolPriceRequest = { + chain:'osmosis', + network:network, + address: osmosisAddress, + token0: 'OSMO', + token1: 'ATOM', + } + var poolPriceResponse = await osmosis.controller.poolPrice(osmosis, poolPriceRequest) + expect(poolPriceResponse.token0).toEqual('OSMO') + }); + +}); + diff --git a/test-helpers/curl/curl.sh b/test-helpers/curl/curl.sh index b2bbab5842..e47f63c450 100644 --- a/test-helpers/curl/curl.sh +++ b/test-helpers/curl/curl.sh @@ -7,6 +7,8 @@ # export BSC_ADDRESS='put-your-binance-smart-chain-key-here' # export POLYGON_ADDRESS='' # export KUJIRA_MNEMONIC='put-your-kujira-mnemonic-here' +# export OSMOSIS_ADDRESS='' +# export OSMOSIS_PRIVATE_KEY='' # -k is --insecure, this disables certificate verification and should only be # used for local development and testing @@ -53,6 +55,12 @@ curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: app curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/cronos_balances.json)" https://localhost:15888/chain/balances | jq +curl -s -X GET -k --key $GATEWAY_KEY --cert $GATEWAY_CERT "https://localhost:15888/chain/status?chain=osmosis&network=testnet" | jq + +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/osmosis_balances.json)" https://localhost:15888/chain/poll | jq + +curl -s -X GET -k --key $GATEWAY_KEY --cert $GATEWAY_CERT "https://localhost:15888/chain/tokens?chain=osmosis&network=testnet" | jq + # Wallet ## add private keys @@ -74,6 +82,8 @@ curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: app curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/add_kujira_key.json)" https://localhost:15888/wallet/add | jq +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/add_osmosis_key.json)" https://localhost:15888/wallet/add | jq + ## read public keys curl -s -X GET -k --key $GATEWAY_KEY --cert $GATEWAY_CERT https://localhost:15888/wallet | jq @@ -97,6 +107,8 @@ curl -s -X DELETE -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: a curl -s -X DELETE -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/remove_xdc_key.json)" https://localhost:15888/wallet/remove | jq +curl -s -X DELETE -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/remove_osmosis_key.json)" https://localhost:15888/wallet/remove | jq + # AMM ## price @@ -123,6 +135,8 @@ curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: app curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/price_tinyman.json)" https://localhost:15888/amm/price | jq +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/price_osmosis.json)" https://localhost:15888/amm/price | jq + ## trade curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/eth_uniswap_trade.json)" https://localhost:15888/amm/trade | jq @@ -147,6 +161,8 @@ curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: app curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/algorand_tinyman_trade.json)" https://localhost:15888/amm/trade | jq +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/osmosis_trade.json)" https://localhost:15888/amm/trade | jq + ## Perp - curie ### Market prices @@ -181,22 +197,32 @@ curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: app curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/eth_uniswap_add_liquidity.json)" https://localhost:15888/amm/liquidity/add | jq +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/osmosis_add_liquidity.json)" https://localhost:15888/amm/liquidity/add | jq + ### remove liquidity curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/eth_uniswap_position.json)" https://localhost:15888/amm/liquidity/remove | jq +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/osmosis_position.json)" https://localhost:15888/amm/liquidity/remove | jq + ### collect fees curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/eth_uniswap_position.json)" https://localhost:15888/amm/liquidity/collect_fees | jq +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/osmosis_position.json)" https://localhost:15888/amm/liquidity/collect_fees | jq + ### get position curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/eth_uniswap_position.json)" https://localhost:15888/amm/liquidity/position | jq +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/osmosis_position.json)" https://localhost:15888/amm/liquidity/position | jq + ### get pool price curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/eth_uniswap_pool_price.json)" https://localhost:15888/amm/liquidity/price | jq +curl -s -X POST -k --key $GATEWAY_KEY --cert $GATEWAY_CERT -H "Content-Type: application/json" -d "$(envsubst < ./requests/osmosis_pool_price.json)" https://localhost:15888/amm/liquidity/price | jq + # EVM ## nonce diff --git a/test-helpers/curl/requests/add_osmosis_key.json b/test-helpers/curl/requests/add_osmosis_key.json new file mode 100644 index 0000000000..fcf481c23f --- /dev/null +++ b/test-helpers/curl/requests/add_osmosis_key.json @@ -0,0 +1,5 @@ +{ + "privateKey": "$OSMOSIS_PRIVATE_KEY", + "chain": "osmosis", + "network": "testnet" +} \ No newline at end of file diff --git a/test-helpers/curl/requests/osmosis_add_liquidity.json b/test-helpers/curl/requests/osmosis_add_liquidity.json new file mode 100644 index 0000000000..c990c6a3f8 --- /dev/null +++ b/test-helpers/curl/requests/osmosis_add_liquidity.json @@ -0,0 +1,13 @@ +{ + "address": "$OSMOSIS_ADDRESS", + "token0": "OSMO", + "token1": "ATOM", + "amount0": "1", + "amount1": "1", + "fee": "LOW", + "lowerPrice": "1", + "upperPrice": "5", + "chain": "osmosis", + "network": "testnet", + "connector": "osmosis" +} \ No newline at end of file diff --git a/test-helpers/curl/requests/osmosis_balances.json b/test-helpers/curl/requests/osmosis_balances.json new file mode 100644 index 0000000000..7f5ef31bc8 --- /dev/null +++ b/test-helpers/curl/requests/osmosis_balances.json @@ -0,0 +1,8 @@ +{ + "chain": "osmosis", + "network": "testnet", + "address": "$OSMOSIS_ADDRESS", + "tokenSymbols": [ + "OSMO" + ] +} \ No newline at end of file diff --git a/test-helpers/curl/requests/osmosis_pool_price.json b/test-helpers/curl/requests/osmosis_pool_price.json new file mode 100644 index 0000000000..0d0938a71c --- /dev/null +++ b/test-helpers/curl/requests/osmosis_pool_price.json @@ -0,0 +1,8 @@ +{ + "token0": "OSMO", + "token1": "ATOM", + "fee": "LOW", + "chain": "osmosis", + "network": "testnet", + "connector": "osmosis" +} \ No newline at end of file diff --git a/test-helpers/curl/requests/osmosis_position.json b/test-helpers/curl/requests/osmosis_position.json new file mode 100644 index 0000000000..02c58a52cb --- /dev/null +++ b/test-helpers/curl/requests/osmosis_position.json @@ -0,0 +1,7 @@ +{ + "address": "$OSMOSIS_ADDRESS", + "tokenId": 2732, + "chain": "osmosis", + "network": "testnet", + "connector": "osmosis" +} \ No newline at end of file diff --git a/test-helpers/curl/requests/osmosis_trade.json b/test-helpers/curl/requests/osmosis_trade.json new file mode 100644 index 0000000000..158c1173ec --- /dev/null +++ b/test-helpers/curl/requests/osmosis_trade.json @@ -0,0 +1,11 @@ +{ + "address": "$OSMOSIS_ADDRESS", + "quote": "ION", + "base": "OSMO", + "amount": "0.01", + "side": "BUY", + "fee": "HIGH", + "chain": "osmosis", + "network": "testnet", + "connector": "osmosis" +} diff --git a/test-helpers/curl/requests/price_osmosis.json b/test-helpers/curl/requests/price_osmosis.json new file mode 100644 index 0000000000..eb75e88fdd --- /dev/null +++ b/test-helpers/curl/requests/price_osmosis.json @@ -0,0 +1,9 @@ +{ + "connector": "osmosis", + "chain": "osmosis", + "network": "testnet", + "quote": "ATOM", + "base": "OSMO", + "amount": "1", + "side": "BUY" +} \ No newline at end of file diff --git a/test-helpers/curl/requests/remove_osmosis_key.json b/test-helpers/curl/requests/remove_osmosis_key.json new file mode 100644 index 0000000000..df65570c51 --- /dev/null +++ b/test-helpers/curl/requests/remove_osmosis_key.json @@ -0,0 +1,4 @@ +{ + "address": "$OSMOSIS_ADDRESS", + "chain": "osmosis" +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 626455cb31..e24fddfcc8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -207,19 +207,19 @@ semver "^6.3.0" "@babel/core@^7.11.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" - integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" + integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.6" + "@babel/helpers" "^7.23.7" "@babel/parser" "^7.23.6" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" + "@babel/traverse" "^7.23.7" "@babel/types" "^7.23.6" convert-source-map "^2.0.0" debug "^4.1.0" @@ -425,13 +425,13 @@ "@babel/traverse" "^7.21.0" "@babel/types" "^7.21.0" -"@babel/helpers@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.6.tgz#d03af2ee5fb34691eec0cda90f5ecbb4d4da145a" - integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA== +"@babel/helpers@^7.23.7": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.8.tgz#fc6b2d65b16847fd50adddbd4232c76378959e34" + integrity sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" + "@babel/traverse" "^7.23.7" "@babel/types" "^7.23.6" "@babel/highlight@^7.18.6": @@ -622,10 +622,10 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" - integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== +"@babel/traverse@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" + integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -684,13 +684,23 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@chain-registry/types@^0.16.0": +"@chain-registry/types@0.16.0", "@chain-registry/types@^0.16.0": version "0.16.0" resolved "https://registry.yarnpkg.com/@chain-registry/types/-/types-0.16.0.tgz#f76409186899a976d33693d7f458c33d71a66730" integrity sha512-4j6vq2Vqn/nF+UBjvRPUVs6eM3+5rJ+dPmEWpd/OoNH3wTy1k6aoilcSTZRR//vGcI5EOVGsxhhJxUzo2qqweA== dependencies: "@babel/runtime" "^7.21.0" +"@chain-registry/utils@1.13.1": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@chain-registry/utils/-/utils-1.13.1.tgz#bee23868e0bdee0533e26fb99276c190916332fd" + integrity sha512-BV8XoZGGlfeF3d5p06y4w2uDggAxtWa5g5zEDRgcyi6V+iJUSlPwu5PL7IKB5qJvAq7J1Vgw8x+Jqj1TVxjpvA== + dependencies: + "@babel/runtime" "^7.21.0" + "@chain-registry/types" "^0.16.0" + bignumber.js "9.1.1" + sha.js "^2.4.11" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -751,6 +761,36 @@ "@cosmjs/math" "0.27.1" "@cosmjs/utils" "0.27.1" +"@cosmjs/amino@0.29.3": + version "0.29.3" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.29.3.tgz#5aa338a301ea970a93e15522706615efea507c10" + integrity sha512-BFz1++ERerIggiFc7iGHhGe1CeV3rCv8BvkoBQTBN/ZwzHOaKvqQj8smDlRGlQxX3HWlTwgiLN2A+OB5yX4ZRw== + dependencies: + "@cosmjs/crypto" "^0.29.3" + "@cosmjs/encoding" "^0.29.3" + "@cosmjs/math" "^0.29.3" + "@cosmjs/utils" "^0.29.3" + +"@cosmjs/amino@0.32.2", "@cosmjs/amino@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.32.2.tgz#ba3cf255e4e6b1ba67461f1ef7b0b8ad3f895da7" + integrity sha512-lcK5RCVm4OfdAooxKcF2+NwaDVVpghOq6o/A40c2mHXDUzUoRZ33VAHjVJ9Me6vOFxshrw/XEFn1f4KObntjYA== + dependencies: + "@cosmjs/crypto" "^0.32.2" + "@cosmjs/encoding" "^0.32.2" + "@cosmjs/math" "^0.32.2" + "@cosmjs/utils" "^0.32.2" + +"@cosmjs/amino@^0.29.3", "@cosmjs/amino@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.29.5.tgz#053b4739a90b15b9e2b781ccd484faf64bd49aec" + integrity sha512-Qo8jpC0BiziTSUqpkNatBcwtKNhCovUnFul9SlT/74JUCdLYaeG5hxr3q1cssQt++l4LvlcpF+OUXL48XjNjLw== + dependencies: + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + "@cosmjs/amino@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.30.1.tgz#7c18c14627361ba6c88e3495700ceea1f76baace" @@ -804,6 +844,19 @@ ripemd160 "^2.0.2" sha.js "^2.4.11" +"@cosmjs/crypto@^0.29.3", "@cosmjs/crypto@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.29.5.tgz#ab99fc382b93d8a8db075780cf07487a0f9519fd" + integrity sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ== + dependencies: + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers "^0.7.6" + "@cosmjs/crypto@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.30.1.tgz#21e94d5ca8f8ded16eee1389d2639cb5c43c3eb5" @@ -830,6 +883,19 @@ elliptic "^6.5.4" libsodium-wrappers-sumo "^0.7.11" +"@cosmjs/crypto@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.32.2.tgz#8ed255d3d1c1c4d916a1586f8cbc33eaab82f511" + integrity sha512-RuxrYKzhrPF9g6NmU7VEq++Hn1vZJjqqJpZ9Tmw9lOYOV8BUsv+j/0BE86kmWi7xVJ7EwxiuxYsKuM8IR18CIA== + dependencies: + "@cosmjs/encoding" "^0.32.2" + "@cosmjs/math" "^0.32.2" + "@cosmjs/utils" "^0.32.2" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers-sumo "^0.7.11" + "@cosmjs/encoding@0.27.1": version "0.27.1" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.27.1.tgz#3cd5bc0af743485eb2578cdb08cfa84c86d610e1" @@ -839,6 +905,15 @@ bech32 "^1.1.4" readonly-date "^1.0.0" +"@cosmjs/encoding@^0.29.3", "@cosmjs/encoding@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.29.5.tgz#009a4b1c596cdfd326f30ccfa79f5e56daa264f2" + integrity sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + "@cosmjs/encoding@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.30.1.tgz#b5c4e0ef7ceb1f2753688eb96400ed70f35c6058" @@ -857,6 +932,23 @@ bech32 "^1.1.4" readonly-date "^1.0.0" +"@cosmjs/encoding@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.32.2.tgz#8c5c64481a85cd570740c34dccce69d024a29805" + integrity sha512-WX7m1wLpA9V/zH0zRcz4EmgZdAv1F44g4dbXOgNj1eXZw1PIGR12p58OEkLN51Ha3S4DKRtCv5CkhK1KHEvQtg== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cosmjs/json-rpc@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.29.5.tgz#5e483a9bd98a6270f935adf0dfd8a1e7eb777fe4" + integrity sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w== + dependencies: + "@cosmjs/stream" "^0.29.5" + xstream "^11.14.0" + "@cosmjs/json-rpc@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc" @@ -873,6 +965,14 @@ "@cosmjs/stream" "^0.31.3" xstream "^11.14.0" +"@cosmjs/json-rpc@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.32.2.tgz#f87fab0d6975ed1d1c7daafcf6f1f81e5e296912" + integrity sha512-lan2lOgmz4yVE/HR8eCOSiII/1OudIulk8836koyIDCsPEpt6eKBuctnAD168vABGArKccLAo7Mr2gy9nrKrOQ== + dependencies: + "@cosmjs/stream" "^0.32.2" + xstream "^11.14.0" + "@cosmjs/launchpad@^0.27.1": version "0.27.1" resolved "https://registry.yarnpkg.com/@cosmjs/launchpad/-/launchpad-0.27.1.tgz#b6f1995748be96560f5f01e84d3ff907477dda77" @@ -893,6 +993,13 @@ dependencies: bn.js "^5.2.0" +"@cosmjs/math@^0.29.3", "@cosmjs/math@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.29.5.tgz#722c96e080d6c2b62215ce9f4c70da7625b241b6" + integrity sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q== + dependencies: + bn.js "^5.2.0" + "@cosmjs/math@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.30.1.tgz#8b816ef4de5d3afa66cb9fdfb5df2357a7845b8a" @@ -907,6 +1014,51 @@ dependencies: bn.js "^5.2.0" +"@cosmjs/math@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.32.2.tgz#4522312769197e132679e4960862bcec0eed4cb8" + integrity sha512-b8+ruAAY8aKtVKWSft2IvtCVCUH1LigIlf9ALIiY8n9jtM4kMASiaRbQ/27etnSAInV88IaezKK9rQZrtxTjcw== + dependencies: + bn.js "^5.2.0" + +"@cosmjs/proto-signing@0.29.3": + version "0.29.3" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.29.3.tgz#fa5ed609ed2a0007d8d5eacbeb1f5a89ba1b77ff" + integrity sha512-Ai3l9THjMOrLJ4Ebn1Dgptwg6W5ZIRJqtnJjijHhGwTVC1WT0WdYU3aMZ7+PwubcA/cA1rH4ZTK7jrfYbra63g== + dependencies: + "@cosmjs/amino" "^0.29.3" + "@cosmjs/crypto" "^0.29.3" + "@cosmjs/encoding" "^0.29.3" + "@cosmjs/math" "^0.29.3" + "@cosmjs/utils" "^0.29.3" + cosmjs-types "^0.5.2" + long "^4.0.0" + +"@cosmjs/proto-signing@0.32.2", "@cosmjs/proto-signing@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.32.2.tgz#26ed2675978ce24078981f4c15a06c5d6b808f44" + integrity sha512-UV4WwkE3W3G3s7wwU9rizNcUEz2g0W8jQZS5J6/3fiN0mRPwtPKQ6EinPN9ASqcAJ7/VQH4/9EPOw7d6XQGnqw== + dependencies: + "@cosmjs/amino" "^0.32.2" + "@cosmjs/crypto" "^0.32.2" + "@cosmjs/encoding" "^0.32.2" + "@cosmjs/math" "^0.32.2" + "@cosmjs/utils" "^0.32.2" + cosmjs-types "^0.9.0" + +"@cosmjs/proto-signing@^0.29.3": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.29.5.tgz#af3b62a46c2c2f1d2327d678b13b7262db1fe87c" + integrity sha512-QRrS7CiKaoETdgIqvi/7JC2qCwCR7lnWaUsTzh/XfRy3McLkEd+cXbKAW3cygykv7IN0VAEIhZd2lyIfT8KwNA== + dependencies: + "@cosmjs/amino" "^0.29.5" + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + cosmjs-types "^0.5.2" + long "^4.0.0" + "@cosmjs/proto-signing@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.30.1.tgz#f0dda372488df9cd2677150b89b3e9c72b3cb713" @@ -933,6 +1085,16 @@ cosmjs-types "^0.8.0" long "^4.0.0" +"@cosmjs/socket@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.29.5.tgz#a48df6b4c45dc6a6ef8e47232725dd4aa556ac2d" + integrity sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ== + dependencies: + "@cosmjs/stream" "^0.29.5" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + "@cosmjs/socket@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.30.1.tgz#00b22f4b5e2ab01f4d82ccdb7b2e59536bfe5ce0" @@ -953,6 +1115,50 @@ ws "^7" xstream "^11.14.0" +"@cosmjs/socket@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.32.2.tgz#a66be3863d03bf2d8df0433af476df010ff10e8c" + integrity sha512-Qc8jaw4uSBJm09UwPgkqe3g9TBFx4ZR9HkXpwT6Z9I+6kbLerXPR0Gy3NSJFSUgxIfTpO8O1yqoWAyf0Ay17Mw== + dependencies: + "@cosmjs/stream" "^0.32.2" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + +"@cosmjs/stargate@0.29.3": + version "0.29.3" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.29.3.tgz#9bd303bfd32a7399a233e662864e7cc32e2607af" + integrity sha512-455TgXStCi6E8KDjnhDAM8wt6aLSjobH4Dixvd7Up1DfCH6UB9NkC/G0fMJANNcNXMaM4wSX14niTXwD1d31BA== + dependencies: + "@confio/ics23" "^0.6.8" + "@cosmjs/amino" "^0.29.3" + "@cosmjs/encoding" "^0.29.3" + "@cosmjs/math" "^0.29.3" + "@cosmjs/proto-signing" "^0.29.3" + "@cosmjs/stream" "^0.29.3" + "@cosmjs/tendermint-rpc" "^0.29.3" + "@cosmjs/utils" "^0.29.3" + cosmjs-types "^0.5.2" + long "^4.0.0" + protobufjs "~6.11.3" + xstream "^11.14.0" + +"@cosmjs/stargate@0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.2.tgz#73718c5c6a3ae138682ee9987333d911eca22a13" + integrity sha512-AsJa29fT7Jd4xt9Ai+HMqhyj7UQu7fyYKdXj/8+/9PD74xe6lZSYhQPcitUmMLJ1ckKPgXSk5Dd2LbsQT0IhZg== + dependencies: + "@confio/ics23" "^0.6.8" + "@cosmjs/amino" "^0.32.2" + "@cosmjs/encoding" "^0.32.2" + "@cosmjs/math" "^0.32.2" + "@cosmjs/proto-signing" "^0.32.2" + "@cosmjs/stream" "^0.32.2" + "@cosmjs/tendermint-rpc" "^0.32.2" + "@cosmjs/utils" "^0.32.2" + cosmjs-types "^0.9.0" + xstream "^11.14.0" + "@cosmjs/stargate@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.30.1.tgz#e1b22e1226cffc6e93914a410755f1f61057ba04" @@ -989,6 +1195,13 @@ protobufjs "~6.11.3" xstream "^11.14.0" +"@cosmjs/stream@^0.29.3", "@cosmjs/stream@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.29.5.tgz#350981cac496d04939b92ee793b9b19f44bc1d4e" + integrity sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA== + dependencies: + xstream "^11.14.0" + "@cosmjs/stream@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.30.1.tgz#ba038a2aaf41343696b1e6e759d8e03a9516ec1a" @@ -1003,6 +1216,45 @@ dependencies: xstream "^11.14.0" +"@cosmjs/stream@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.32.2.tgz#b1e8f977d25313d659f1aa89ad21614b5391cd93" + integrity sha512-gpCufLfHAD8Zp1ZKge7AHbDf4RA0TZp66wZY6JaQR5bSiEF2Drjtp4mwXZPGejtaUMnaAgff3LrUzPJfKYdQwg== + dependencies: + xstream "^11.14.0" + +"@cosmjs/tendermint-rpc@0.32.2", "@cosmjs/tendermint-rpc@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.2.tgz#c5607b8d472e5bf9fd58d5453db7194f500ccc62" + integrity sha512-DXyJHDmcAfCix4H/7/dKR0UMdshP01KxJOXHdHxBCbLIpck94BsWD3B2ZTXwfA6sv98so9wOzhp7qGQa5malxg== + dependencies: + "@cosmjs/crypto" "^0.32.2" + "@cosmjs/encoding" "^0.32.2" + "@cosmjs/json-rpc" "^0.32.2" + "@cosmjs/math" "^0.32.2" + "@cosmjs/socket" "^0.32.2" + "@cosmjs/stream" "^0.32.2" + "@cosmjs/utils" "^0.32.2" + axios "^1.6.0" + readonly-date "^1.0.0" + xstream "^11.14.0" + +"@cosmjs/tendermint-rpc@^0.29.3": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.29.5.tgz#f205c10464212bdf843f91bb2e4a093b618cb5c2" + integrity sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w== + dependencies: + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/json-rpc" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/socket" "^0.29.5" + "@cosmjs/stream" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + axios "^0.21.2" + readonly-date "^1.0.0" + xstream "^11.14.0" + "@cosmjs/tendermint-rpc@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.30.1.tgz#c16378892ba1ac63f72803fdf7567eab9d4f0aa0" @@ -1040,6 +1292,11 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.27.1.tgz#1c8efde17256346ef142a3bd15158ee4055470e2" integrity sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg== +"@cosmjs/utils@^0.29.3", "@cosmjs/utils@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.29.5.tgz#3fed1b3528ae8c5f1eb5d29b68755bebfd3294ee" + integrity sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ== + "@cosmjs/utils@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" @@ -1050,6 +1307,26 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.3.tgz#f97bbfda35ad69e80cd5c7fe0a270cbda16db1ed" integrity sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA== +"@cosmjs/utils@^0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.32.2.tgz#324304aa85bfa6f10561cc17781d824d02130897" + integrity sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q== + +"@cosmology/lcd@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@cosmology/lcd/-/lcd-0.12.0.tgz#a6594fc00a8c84c7341e90840627e62a7e63fd1b" + integrity sha512-f2mcySYO1xdislAhuWtNFmg4q/bzY3Aem2UkDzYzI0ZELVev5i2Pi0bQrYUNTeNg1isAo0Kyrdqj/4YPqEwjGA== + dependencies: + "@babel/runtime" "^7.21.0" + axios "0.27.2" + +"@cosmology/lcd@^0.13.3": + version "0.13.3" + resolved "https://registry.yarnpkg.com/@cosmology/lcd/-/lcd-0.13.3.tgz#4072178cfe979b948ab596c9378b56c4f320d192" + integrity sha512-lihAHCoap0GN/32qcOhiMp6HcoZP8A7GeScZMlmmvBtBk6ocGAStNHjvBR4MayrvyHSCOZCvCAWPh36iFTT8Sw== + dependencies: + axios "1.6.0" + "@crocswap/sdk@^2.4.5": version "2.4.5" resolved "https://registry.yarnpkg.com/@crocswap/sdk/-/sdk-2.4.5.tgz#4a4765af4a16c1af42fcbcc5e540e9dd8793a6c1" @@ -1266,7 +1543,7 @@ "@ethersproject-xdc/strings" "file:../../../../Library/Caches/Yarn/v6/npm-@ethersproject-xdc-hdnode-5.7.0-96f6d0e9-c33b-4eba-9b78-2b51fe612daa-1708867847025/node_modules/@ethersproject-xdc/strings" "@ethersproject-xdc/transactions" "file:../../../../Library/Caches/Yarn/v6/npm-@ethersproject-xdc-hdnode-5.7.0-96f6d0e9-c33b-4eba-9b78-2b51fe612daa-1708867847025/node_modules/@ethersproject-xdc/transactions" "@ethersproject-xdc/wordlists" "file:../../../../Library/Caches/Yarn/v6/npm-@ethersproject-xdc-hdnode-5.7.0-96f6d0e9-c33b-4eba-9b78-2b51fe612daa-1708867847025/node_modules/@ethersproject-xdc/wordlists" - + "@ethersproject-xdc/json-wallets@file:vendor/@ethersproject-xdc/json-wallets": version "5.6.0" dependencies: @@ -2031,12 +2308,12 @@ bn.js "^4.11.8" "@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/config-array@^0.11.14": @@ -2053,6 +2330,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@humanwhocodes/object-schema@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" @@ -2551,9 +2833,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -2871,6 +3153,17 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz#38f4dbab672631034076ccdf2f3201fab1726635" integrity sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== +"@osmonauts/math@^1.11.3": + version "1.11.3" + resolved "https://registry.yarnpkg.com/@osmonauts/math/-/math-1.11.3.tgz#22b3f60ea4b84e1329661184b28f72eb9b97c8e7" + integrity sha512-cUN42EoTrR55uvbEWMrdstiGq4r6qfwiw0T8SHPW0emBDVe5fnbuvIiUz8qK+e4mzPXQPxbavZSjGugS+NQqsg== + dependencies: + "@chain-registry/types" "0.16.0" + "@chain-registry/utils" "1.13.1" + bignumber.js "9.1.2" + decimal.js-light "^2.5.1" + osmojs "^16.8.3" + "@pancakeswap-libs/pancake-swap-core@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@pancakeswap-libs/pancake-swap-core/-/pancake-swap-core-0.1.0.tgz#6957f1fa02170531a2ffbf95f2c0e145e9d21bc2" @@ -2885,14 +3178,19 @@ resolved "https://registry.yarnpkg.com/@pancakeswap/chains/-/chains-0.3.0.tgz#e509dfd9c8387f76b893e3a0a5b835331752b32c" integrity sha512-a4U8pzfxQsnS0nUpvi8qL2X6l2C/IUTFJcmt3UNAQv2L2CPUSryt1rLarG91O1Bb/UMfv90UCPrXJcHWpaYSMg== -"@pancakeswap/multicall@3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@pancakeswap/multicall/-/multicall-3.3.2.tgz#deaf60cfa0c25b76fbbd0c38333cee5b0110849a" - integrity sha512-H4DOyTYEXs49tgR0QrxkjJmDImxSu5rTJyaRc2kEDluU1kDsFffPiX4nrnewEmmvYFxAfin5jn9sp6D7dV7jEg== +"@pancakeswap/chains@0.4.0", "@pancakeswap/chains@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@pancakeswap/chains/-/chains-0.4.0.tgz#60d73e334052fda635fe6bf2b9ff7c1858db2c2b" + integrity sha512-xPx+KFZiXJ1b+JAbnDB1WhSVE2TLtIzDi/IOjuyylYxiiEpnt0oXzjaTpuJe6dkttfW74UqUMpHiODs529gWVw== + +"@pancakeswap/multicall@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@pancakeswap/multicall/-/multicall-3.4.0.tgz#fa5a3b34b5aa8e7eef9fb6356a8442cef914d804" + integrity sha512-zJZZyoypdDMrD3zk5Gwy41e44DZv3iNTvbmq1VKJtejbLT4RPH0cw10Sr91TVAaioo2LHaHmzjF/p5pR0kML0g== dependencies: - "@pancakeswap/chains" "0.3.0" - "@pancakeswap/sdk" "5.7.3" - viem "1.19.9" + "@pancakeswap/chains" "0.4.0" + "@pancakeswap/sdk" "5.7.5" + viem "1.19.11" "@pancakeswap/sdk@5.1.0": version "5.1.0" @@ -2921,6 +3219,20 @@ toformat "^2.0.0" viem "1.19.9" +"@pancakeswap/sdk@5.7.5": + version "5.7.5" + resolved "https://registry.yarnpkg.com/@pancakeswap/sdk/-/sdk-5.7.5.tgz#0026969ece6ed44f2751ae46dc772178f4c22640" + integrity sha512-eGejDluOMvhgQnCzC1/Dp5XUdSZZb8rO1IdeZRu8EFq2yo3zsSyhRcYxQLcvk5VXfekcXyAx26JKPbVPf0KxqQ== + dependencies: + "@pancakeswap/chains" "^0.4.0" + "@pancakeswap/swap-sdk-core" "1.0.0" + big.js "^5.2.2" + decimal.js-light "^2.5.0" + tiny-invariant "^1.3.0" + tiny-warning "^1.0.3" + toformat "^2.0.0" + viem "1.19.11" + "@pancakeswap/sdk@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@pancakeswap/sdk/-/sdk-4.0.0.tgz#6068bf3c1b031ef13f4b223ee3cbeff7ddbb5d96" @@ -2934,17 +3246,17 @@ toformat "^2.0.0" "@pancakeswap/smart-router@^4.2.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@pancakeswap/smart-router/-/smart-router-4.11.1.tgz#e5a1055c5427f0e41bc3de454efd1044e0798826" - integrity sha512-9iqyk+5GaHLB3CqXtCYbJ6OpDfROcI2yukojzXKyngTR6IGfpUGh9Tg2Ggh6TOgwDCEqD3dhDc1BooAvkceOIA== + version "4.14.0" + resolved "https://registry.yarnpkg.com/@pancakeswap/smart-router/-/smart-router-4.14.0.tgz#84d81a8283df9be424b530b20cb3d493de28bed8" + integrity sha512-UOLg1PD04SRO0/32dPDrJ4E+wLvqUGjPewGiD3faDAPNxdXVmf74T5XLD17DSdT6gWXi+Y17QVHrKRT10h3dFQ== dependencies: - "@pancakeswap/chains" "0.3.0" - "@pancakeswap/multicall" "3.3.2" - "@pancakeswap/sdk" "5.7.3" + "@pancakeswap/chains" "0.4.0" + "@pancakeswap/multicall" "3.4.0" + "@pancakeswap/sdk" "5.7.5" "@pancakeswap/swap-sdk-core" "1.0.0" "@pancakeswap/token-lists" "0.0.9" - "@pancakeswap/tokens" "0.5.6" - "@pancakeswap/v3-sdk" "3.7.2" + "@pancakeswap/tokens" "0.6.0" + "@pancakeswap/v3-sdk" "3.7.5" async-retry "^1.3.1" debug "^4.3.4" graphql "^16.8.1" @@ -2953,7 +3265,7 @@ mnemonist "^0.38.3" stats-lite "^2.2.0" tiny-invariant "^1.3.0" - viem "1.19.9" + viem "1.19.11" zod "^3.22.3" "@pancakeswap/swap-sdk-core@1.0.0", "@pancakeswap/swap-sdk-core@^1.0.0": @@ -2994,6 +3306,15 @@ "@pancakeswap/sdk" "5.7.3" "@pancakeswap/token-lists" "0.0.9" +"@pancakeswap/tokens@0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@pancakeswap/tokens/-/tokens-0.6.0.tgz#1dfbc7ab86a5888596e95c208aeb7effc4dd07f9" + integrity sha512-dWwVlWCfCFrVUw+AtPVtvYUOZPTzKnp8sCTpQd1OWWaDKCxhILl6QnxMwKS6mW9Kqzpq2hYotEkURzErlAU5Rw== + dependencies: + "@pancakeswap/chains" "0.4.0" + "@pancakeswap/sdk" "5.7.5" + "@pancakeswap/token-lists" "0.0.9" + "@pancakeswap/tokens@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@pancakeswap/tokens/-/tokens-0.1.6.tgz#c6f59c246bdc9f37322101acc2be700aee9b584b" @@ -3018,7 +3339,24 @@ "@uniswap/v2-core" "1.0.1" base64-sol "1.0.1" -"@pancakeswap/v3-sdk@3.7.2", "@pancakeswap/v3-sdk@^3.7.0": +"@pancakeswap/v3-sdk@3.7.5": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@pancakeswap/v3-sdk/-/v3-sdk-3.7.5.tgz#09ea132d47212b5a9c548954d36efc89b3e3a218" + integrity sha512-h/nX/MgsvLdvpm0fVjA4FLHzYEI50BxiacwKLvRhEaBHMzHI3OX9DF2gkNgXvJTqNXmX/NDrgFGFTaYNYB8tuQ== + dependencies: + "@pancakeswap/chains" "0.4.0" + "@pancakeswap/sdk" "5.7.5" + "@pancakeswap/swap-sdk-core" "1.0.0" + "@pancakeswap/tokens" "0.6.0" + "@uniswap/v3-staker" "1.0.0" + big.js "^5.2.2" + decimal.js-light "^2.5.0" + tiny-invariant "^1.3.0" + tiny-warning "^1.0.3" + toformat "^2.0.0" + viem "1.19.11" + +"@pancakeswap/v3-sdk@^3.7.0": version "3.7.2" resolved "https://registry.yarnpkg.com/@pancakeswap/v3-sdk/-/v3-sdk-3.7.2.tgz#ce475303802ada6c9b7d6781529b0c23033f638c" integrity sha512-8uSMUaDo69zx+PhODH1TiTdPvuaTlLzyyudpODV8Ig6LKWO2owVIRuhXwQHKXE8N3/0j7JN6ejJrM/sbY3kadA== @@ -5465,6 +5803,14 @@ axios@0.26.0: dependencies: follow-redirects "^1.14.8" +axios@0.27.2, axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + axios@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.4.tgz#6555dd955d2efa9b8f4cb4cb0b3371b7b243537a" @@ -5474,6 +5820,15 @@ axios@1.2.4: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" + integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axios@^0.21.1, axios@^0.21.2: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -5488,14 +5843,6 @@ axios@^0.26.0: dependencies: follow-redirects "^1.14.8" -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - axios@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" @@ -5663,11 +6010,16 @@ bigint-mod-arith@^3.1.0: resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== -bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.1.0: +bignumber.js@9.1.1, bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.1.0: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== +bignumber.js@9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -6190,9 +6542,9 @@ caniuse-lite@^1.0.30001449: integrity sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A== caniuse-lite@^1.0.30001565: - version "1.0.30001570" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz#b4e5c1fa786f733ab78fc70f592df6b3f23244ca" - integrity sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw== + version "1.0.30001579" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz#45c065216110f46d6274311a4b3fcf6278e0852a" + integrity sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA== capability@^0.2.5: version "0.2.5" @@ -6673,6 +7025,14 @@ cors@^2.8.1, cors@^2.8.5: object-assign "^4" vary "^1" +cosmjs-types@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.5.2.tgz#2d42b354946f330dfb5c90a87fdc2a36f97b965d" + integrity sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg== + dependencies: + long "^4.0.0" + protobufjs "~6.11.2" + cosmjs-types@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.7.2.tgz#a757371abd340949c5bd5d49c6f8379ae1ffd7e2" @@ -6689,6 +7049,11 @@ cosmjs-types@^0.8.0: long "^4.0.0" protobufjs "~6.11.2" +cosmjs-types@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.9.0.tgz#c3bc482d28c7dfa25d1445093fdb2d9da1f6cfcc" + integrity sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ== + crc-32@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" @@ -7221,9 +7586,9 @@ electron-to-chromium@^1.4.284: integrity sha512-YyE8+GKyGtPEP1/kpvqsdhD6rA/TP1DUFDN4uiU/YI52NzDxmwHkEb3qjId8hLBa5siJvG0sfC3O66501jMruQ== electron-to-chromium@^1.4.601: - version "1.4.613" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.613.tgz#529e4fc65576ecfd055d7d4619fade4fac446af2" - integrity sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w== + version "1.4.640" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.640.tgz#76290a36fa4b5f1f4cadaf1fc582478ebb3ac246" + integrity sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA== elliptic@6.3.3: version "6.3.3" @@ -12013,6 +12378,39 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +osmo-query@16.5.2: + version "16.5.2" + resolved "https://registry.yarnpkg.com/osmo-query/-/osmo-query-16.5.2.tgz#09e6d4bc5b47da5b6ea4fccb0bc3012c69e5eaa0" + integrity sha512-tO10iBjZ4voJ0G9qb1iYY8Mb/SAklqiVAWYfWdGA3PPtHiG48F326hCbUwFrF6tfQrFyBTnFuFZjXyyeZZrOzg== + dependencies: + "@cosmjs/amino" "0.29.3" + "@cosmjs/proto-signing" "0.29.3" + "@cosmjs/stargate" "0.29.3" + "@cosmjs/tendermint-rpc" "^0.29.3" + "@cosmology/lcd" "^0.12.0" + +osmojs@16.5.1: + version "16.5.1" + resolved "https://registry.yarnpkg.com/osmojs/-/osmojs-16.5.1.tgz#38f2fe3cd65dbd4e4b415e9f22f387a24b634155" + integrity sha512-V2Q2yMt7Paax6i+S5Q1l29Km0As/waXKmSVRe8gtd9he42kcbkpwwk/QUCvgS98XsL7Qz+vas2Tca016uBQHTQ== + dependencies: + "@cosmjs/amino" "0.29.3" + "@cosmjs/proto-signing" "0.29.3" + "@cosmjs/stargate" "0.29.3" + "@cosmjs/tendermint-rpc" "^0.29.3" + "@cosmology/lcd" "^0.12.0" + +osmojs@^16.8.3: + version "16.8.3" + resolved "https://registry.yarnpkg.com/osmojs/-/osmojs-16.8.3.tgz#87d14bb41c7088e51253fc30e22df5facecac620" + integrity sha512-uBEuY4WU0bKK6vA4+PB1MZNLusp0DO0tARZunPw4cV9a6on1HFR5JiIrTb89tUe5ZlrLmvNxLQExA3U7r5o5bQ== + dependencies: + "@cosmjs/amino" "0.32.2" + "@cosmjs/proto-signing" "0.32.2" + "@cosmjs/stargate" "0.32.2" + "@cosmjs/tendermint-rpc" "0.32.2" + "@cosmology/lcd" "^0.13.3" + p-cancelable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" @@ -14958,6 +15356,20 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +viem@1.19.11: + version "1.19.11" + resolved "https://registry.yarnpkg.com/viem/-/viem-1.19.11.tgz#de4ee7537ee036894bd818aa316a8faecaf017e9" + integrity sha512-dbsXEWDBZkByuzJXAs/e01j7dpUJ5ICF5WcyntFwf8Y97n5vnC/91lAleSa6DA5V4WJvYZbhDpYeTctsMAQnhA== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "0.9.8" + isows "1.0.3" + ws "8.13.0" + viem@1.19.9: version "1.19.9" resolved "https://registry.yarnpkg.com/viem/-/viem-1.19.9.tgz#a11f3ad4a3323994ebd2010dbc659d1a2b12e583" @@ -14988,9 +15400,9 @@ viem@^0.3.x: ws "8.12.0" viem@^1.2.9: - version "1.19.15" - resolved "https://registry.yarnpkg.com/viem/-/viem-1.19.15.tgz#0f2307632fa0ef10dfab2d8fdd71fbb842a0a4f5" - integrity sha512-rc87AkyrUUsoOAgMNYP+X/wN4GYwbhP87DkmsqQCYKxxQyzTX0+yliKs6Bxljbjr8ybU72GOb12Oyus6393AjQ== + version "1.21.4" + resolved "https://registry.yarnpkg.com/viem/-/viem-1.21.4.tgz#883760e9222540a5a7e0339809202b45fe6a842d" + integrity sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ== dependencies: "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.2.0"