From 2c7c09d7723a23e933fa1e7ff60a67c0f3f07bb3 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Wed, 8 Jan 2025 23:02:27 -0700 Subject: [PATCH 01/63] chore: remove hardcoded chainNames --- .../groups/components/groupControls.tsx | 9 +- components/groups/components/myGroups.tsx | 2 +- .../groups/forms/groups/ConfirmationForm.tsx | 6 +- components/groups/modals/voteModal.tsx | 8 +- config/defaults.ts | 104 ------------------ config/index.ts | 1 - pages/_app.tsx | 13 ++- 7 files changed, 22 insertions(+), 121 deletions(-) delete mode 100644 config/defaults.ts diff --git a/components/groups/components/groupControls.tsx b/components/groups/components/groupControls.tsx index a3be34ca..8bbdc070 100644 --- a/components/groups/components/groupControls.tsx +++ b/components/groups/components/groupControls.tsx @@ -4,7 +4,6 @@ import { useTallyCount, useVotesByProposal, useMultipleTallyCounts, - ExtendedQueryGroupsByMemberResponseSDKType, ExtendedGroupType, } from '@/hooks/useQueries'; import { ProposalSDKType } from '@liftedinit/manifestjs/dist/codegen/cosmos/group/v1/types'; @@ -15,16 +14,14 @@ import { useRouter } from 'next/router'; import VoteDetailsModal from '@/components/groups/modals/voteDetailsModal'; import { useGroupsByMember } from '@/hooks/useQueries'; import { useChain } from '@cosmos-kit/react'; -import { - MemberSDKType, - GroupInfoSDKType, -} from '@liftedinit/manifestjs/dist/codegen/cosmos/group/v1/types'; +import { MemberSDKType } from '@liftedinit/manifestjs/dist/codegen/cosmos/group/v1/types'; import { ArrowRightIcon } from '@/components/icons'; import ProfileAvatar from '@/utils/identicon'; import { HistoryBox, TransactionGroup } from '@/components'; import { TokenList } from '@/components'; import { CombinedBalanceInfo, ExtendedMetadataSDKType } from '@/utils'; import DenomList from '@/components/factory/components/DenomList'; +import env from '@/config/env'; type GroupControlsProps = { policyAddress: string; @@ -226,7 +223,7 @@ export default function GroupControls({ .trim(); } - const { address } = useChain('manifest'); + const { address } = useChain(env.chain); const { groupByMemberData } = useGroupsByMember(address ?? ''); useEffect(() => { diff --git a/components/groups/components/myGroups.tsx b/components/groups/components/myGroups.tsx index 1b915974..55636317 100644 --- a/components/groups/components/myGroups.tsx +++ b/components/groups/components/myGroups.tsx @@ -100,7 +100,7 @@ export function YourGroups({ const [selectedGroupName, setSelectedGroupName] = useState('Untitled Group'); const router = useRouter(); - const { address } = useChain('manifest'); + const { address } = useChain(env.chain); const filteredGroups = groups.groups.filter(group => { try { diff --git a/components/groups/forms/groups/ConfirmationForm.tsx b/components/groups/forms/groups/ConfirmationForm.tsx index c5dce76c..93de035b 100644 --- a/components/groups/forms/groups/ConfirmationForm.tsx +++ b/components/groups/forms/groups/ConfirmationForm.tsx @@ -6,7 +6,7 @@ import { cosmos } from '@liftedinit/manifestjs'; import { ThresholdDecisionPolicy } from '@liftedinit/manifestjs/dist/codegen/cosmos/group/v1/types'; import { Duration } from '@liftedinit/manifestjs/dist/codegen/google/protobuf/duration'; import { secondsToHumanReadable } from '@/utils/string'; - +import env from '@/config/env'; export default function ConfirmationForm({ nextStep, prevStep, @@ -30,8 +30,8 @@ export default function ConfirmationForm({ // Convert the object to a JSON string const jsonString = JSON.stringify(groupMetadata); - const { tx, isSigning, setIsSigning } = useTx('manifest'); - const { estimateFee } = useFeeEstimation('manifest'); + const { tx, isSigning, setIsSigning } = useTx(env.chain); + const { estimateFee } = useFeeEstimation(env.chain); const minExecutionPeriod: Duration = { seconds: BigInt(0), diff --git a/components/groups/modals/voteModal.tsx b/components/groups/modals/voteModal.tsx index d19e13ae..c9070a0b 100644 --- a/components/groups/modals/voteModal.tsx +++ b/components/groups/modals/voteModal.tsx @@ -4,6 +4,8 @@ import { cosmos } from '@liftedinit/manifestjs'; import { useChain } from '@cosmos-kit/react'; import React, { useState } from 'react'; import { CloseIcon } from '@/components/icons'; +import env from '@/config/env'; + function VotingPopup({ proposalId, refetch, @@ -13,9 +15,9 @@ function VotingPopup({ refetch: () => void; setIsSigning: (isSigning: boolean) => void; }) { - const { estimateFee } = useFeeEstimation('manifest'); - const { tx } = useTx('manifest'); - const { address } = useChain('manifest'); + const { estimateFee } = useFeeEstimation(env.chain); + const { tx } = useTx(env.chain); + const { address } = useChain(env.chain); const [error, setError] = useState(null); const { vote } = cosmos.group.v1.MessageComposer.withTypeUrl; diff --git a/config/defaults.ts b/config/defaults.ts deleted file mode 100644 index 7bf5d290..00000000 --- a/config/defaults.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { AssetList, Chain } from '@chain-registry/types'; -import env from './env'; - -export const manifestChain: Chain = { - chain_name: env.chain, - status: 'live', - network_type: env.chainTier, - website: '', - pretty_name: 'Manifest Testnet', - chain_id: env.chainId, - bech32_prefix: 'manifest', - daemon_name: 'manifest', - node_home: '$HOME/.manifest', - slip44: 118, - apis: { - rpc: [ - { - address: env.rpcUrl, - }, - ], - rest: [ - { - address: env.apiUrl, - }, - ], - }, - fees: { - fee_tokens: [ - { - denom: 'umfx', - fixed_min_gas_price: 0.02, - low_gas_price: 0.01, - average_gas_price: 0.022, - high_gas_price: 0.034, - }, - ], - }, - staking: { - staking_tokens: [ - { - denom: 'upoa', - }, - ], - }, - codebase: { - git_repo: 'github.com/liftedinit/manifest-ledger', - recommended_version: 'v0.0.1-alpha.4', - compatible_versions: ['v0.0.1-alpha.4'], - binaries: { - 'linux/amd64': - 'https://github.com/liftedinit/manifest-ledger/releases/download/v0.0.1-alpha.4/manifest-ledger_0.0.1-alpha.4_linux_amd64.tar.gz', - }, - versions: [ - { - name: 'v1', - recommended_version: 'v0.0.1-alpha.4', - compatible_versions: ['v0.0.1-alpha.4'], - }, - ], - genesis: { - genesis_url: - 'https://github.com/liftedinit/manifest-ledger/blob/main/network/manifest-1/manifest-1_genesis.json', - }, - }, -}; -export const manifestAssets: AssetList = { - chain_name: env.chain, - assets: [ - { - description: 'Manifest testnet native token', - denom_units: [ - { - denom: 'umfx', - exponent: 0, - }, - { - denom: 'mfx', - exponent: 6, - }, - ], - base: 'umfx', - name: 'Manifest Testnet Token', - display: 'mfx', - symbol: 'MFX', - }, - { - description: 'Proof of Authority token for the Manifest testnet', - denom_units: [ - { - denom: 'upoa', - exponent: 0, - }, - { - denom: 'poa', - exponent: 6, - }, - ], - base: 'upoa', - name: 'Manifest Testnet Token', - display: 'poa', - symbol: 'POA', - }, - ], -}; diff --git a/config/index.ts b/config/index.ts index 34b53e46..c1532d6d 100644 --- a/config/index.ts +++ b/config/index.ts @@ -1,2 +1 @@ -export * from './defaults'; export * from './env'; diff --git a/pages/_app.tsx b/pages/_app.tsx index de6b8b16..5f8c863c 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -9,7 +9,14 @@ import { createPortal } from 'react-dom'; import { makeWeb3AuthWallets, SignData } from '@cosmos-kit/web3auth'; import { useEffect, useMemo, useState } from 'react'; import SignModal from '@/components/react/authSignerModal'; -import { manifestAssets, manifestChain } from '@/config'; +import { + assets as manifestAssets, + chain as manifestChain, +} from 'chain-registry/testnet/manifesttestnet'; +import { + assets as osmosisAssets, + chain as osmosisChain, +} from 'chain-registry/testnet/osmosistestnet'; import { SignerOptions, wallets } from 'cosmos-kit'; import { wallets as cosmosExtensionWallets } from '@cosmos-kit/cosmos-extension-metamask'; @@ -184,8 +191,8 @@ function ManifestApp({ Component, pageProps }: ManifestAppProps) { { Date: Thu, 9 Jan 2025 00:05:10 -0700 Subject: [PATCH 02/63] feat: add osmosis balances --- components/bank/components/sendBox.tsx | 20 +++- components/bank/forms/ibcSendForm.tsx | 156 ++++++++++++++++++++++--- config/env.ts | 1 + hooks/useLcdQueryClient.ts | 16 +++ hooks/useQueries.ts | 30 ++++- pages/bank.tsx | 1 + public/osmosis.png | Bin 731617 -> 0 bytes public/osmosis.svg | 118 +++++++++++++++++++ utils/ibc.ts | 5 + utils/yupExtensions.ts | 2 +- 10 files changed, 322 insertions(+), 27 deletions(-) delete mode 100644 public/osmosis.png create mode 100644 public/osmosis.svg diff --git a/components/bank/components/sendBox.tsx b/components/bank/components/sendBox.tsx index 62950b32..cfa6ed72 100644 --- a/components/bank/components/sendBox.tsx +++ b/components/bank/components/sendBox.tsx @@ -33,12 +33,19 @@ export default function SendBox({ admin?: string; }) { const [activeTab, setActiveTab] = useState<'send' | 'cross-chain'>('send'); - const [selectedChain, setSelectedChain] = useState(''); + const [selectedFromChain, setSelectedFromChain] = useState(''); + const [selectedToChain, setSelectedToChain] = useState(''); const ibcChains: IbcChain[] = [ + { + id: 'manifest', + name: 'Manifest', + icon: '/logo.svg', + prefix: 'manifest', + }, { id: 'osmosis', name: 'Osmosis', - icon: 'https://osmosis.zone/assets/icons/osmo-logo-icon.svg', + icon: '/osmosis.svg', prefix: 'osmo', }, ]; @@ -79,16 +86,17 @@ export default function SendBox({ ) : ( void; isIbcTransfer: boolean; ibcChains: IbcChain[]; - selectedChain: string; - setSelectedChain: (selectedChain: string) => void; + selectedFromChain: string; + setSelectedFromChain: (selectedChain: string) => void; + selectedToChain: string; + setSelectedToChain: (selectedChain: string) => void; selectedDenom?: string; - isGroup?: boolean; }>) { const [isSending, setIsSending] = useState(false); const [searchTerm, setSearchTerm] = useState(''); @@ -52,6 +62,10 @@ export default function IbcSendForm({ const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; const [isContactsOpen, setIsContactsOpen] = useState(false); + const { address: osmosisAddress } = useChain('osmosistestnet'); + const { balances: osmosisBalances, isBalancesLoading: isOsmosisBalancesLoading } = + useTokenBalancesOsmosis(osmosisAddress ?? ''); + // Adjusted filter logic to handle undefined metadata const filteredBalances = useMemo( () => @@ -115,7 +129,7 @@ export default function IbcSendForm({ const { source_port, source_channel } = getIbcInfo(env.chain, destinationChain ?? ''); const token = { - denom: values.selectedToken.coreDenom, + denom: getIbcDenom(selectedToChain, values.selectedToken.coreDenom) ?? '', amount: amountInBaseUnits, }; @@ -171,10 +185,105 @@ export default function IbcSendForm({ {({ isValid, dirty, setFieldValue, values, errors }) => (
+ {/* From Chain (Manifest) */} +
+
+ + From Chain + + +
+ + +
+ {/* To Chain (Osmosis) */}
- Chain + To Chain
- -
+ {/* To Chain (Osmosis) */} +
+
+ + To Chain + + +
+ +
+ aria-label={chain.name} + > + {chain.name} + {chain.name} + + + ))} + +
-
@@ -238,6 +248,10 @@ export function TokenList(props: Readonly) { isGroup={isGroup} admin={admin} refetchProposals={refetchProposals} + osmosisBalances={osmosisBalances ?? []} + isOsmosisBalancesLoading={isOsmosisBalancesLoading ?? false} + refetchOsmosisBalances={refetchOsmosisBalances ?? (() => {})} + resolveOsmosisRefetch={resolveOsmosisRefetch ?? (() => {})} /> ); diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 5ce0ba6a..72f6c151 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -1,4 +1,4 @@ -import React, { useState, useMemo } from 'react'; +import React, { useState, useMemo, useEffect } from 'react'; import { useFeeEstimation, useOsmosisTokenBalancesResolved, @@ -6,7 +6,7 @@ import { useTokenBalancesOsmosis, useTx, } from '@/hooks'; -import { ibc } from '@liftedinit/manifestjs'; +import { cosmos, ibc } from '@liftedinit/manifestjs'; import { MsgTransfer } from '@liftedinit/manifestjs/dist/codegen/ibc/applications/transfer/v1/tx'; import { getIbcInfo, @@ -15,6 +15,7 @@ import { truncateString, getIbcDenom, OSMOSIS_TOKEN_DATA, + denomToAsset, } from '@/utils'; import { PiCaretDownBold } from 'react-icons/pi'; import { MdContacts } from 'react-icons/md'; @@ -30,6 +31,8 @@ import { SearchIcon, TransferIcon } from '@/components/icons'; import { TailwindModal } from '@/components/react/modal'; import env from '@/config/env'; import { useChain } from '@cosmos-kit/react'; +import { useSearchParams } from 'next/navigation'; +import { Any } from 'cosmjs-types/google/protobuf/any'; //TODO: switch to main-net names export default function IbcSendForm({ @@ -46,6 +49,13 @@ export default function IbcSendForm({ selectedToChain, setSelectedToChain, selectedDenom, + isGroup, + osmosisBalances, + isOsmosisBalancesLoading, + refetchOsmosisBalances, + resolveOsmosisRefetch, + refetchProposals, + admin, }: Readonly<{ address: string; destinationChain: string; @@ -55,12 +65,20 @@ export default function IbcSendForm({ refetchHistory: () => void; isIbcTransfer: boolean; ibcChains: IbcChain[]; + isGroup?: boolean; selectedFromChain: string; setSelectedFromChain: (selectedChain: string) => void; selectedToChain: string; setSelectedToChain: (selectedChain: string) => void; selectedDenom?: string; + osmosisBalances: CombinedBalanceInfo[]; + isOsmosisBalancesLoading: boolean; + refetchOsmosisBalances: () => void; + resolveOsmosisRefetch: () => void; + refetchProposals?: () => void; + admin?: string; }>) { + const { address: osmosisAddress } = useChain(env.osmosisTestnetChain); const [isSending, setIsSending] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [feeWarning, setFeeWarning] = useState(''); @@ -72,63 +90,40 @@ export default function IbcSendForm({ ); const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; const [isContactsOpen, setIsContactsOpen] = useState(false); - - const { address: osmosisAddress } = useChain(env.osmosisTestnetChain); - const { balances: osmosisBalances, isBalancesLoading: isOsmosisBalancesLoading } = - useTokenBalancesOsmosis(osmosisAddress ?? ''); - const { - balances: resolvedOsmosisBalances, - isBalancesLoading: resolvedOsmosisLoading, - refetchBalances: resolveOsmosisRefetch, - } = useOsmosisTokenBalancesResolved(osmosisAddress ?? ''); - - const { metadatas: osmosisMetadatas, isMetadatasLoading: isOsmosisMetadatasLoading } = - useOsmosisTokenFactoryDenomsMetadata(); - - // Add this combined balances memo for Osmosis tokens - const combinedOsmosisBalances = useMemo(() => { - if (!osmosisBalances || !resolvedOsmosisBalances || !osmosisMetadatas) { - return []; + const [isIconRotated, setIsIconRotated] = useState(false); + const searchParams = useSearchParams(); + const policyAddress = searchParams.get('policyAddress'); + const { submitProposal } = cosmos.group.v1.MessageComposer.withTypeUrl; + useEffect(() => { + if (policyAddress) { + setSelectedFromChain(env.chain); } + }, [policyAddress, setSelectedFromChain]); - const combined = osmosisBalances.map((coreBalance): CombinedBalanceInfo => { - const resolvedBalance = resolvedOsmosisBalances.find( - rb => rb.denom === coreBalance.denom || rb.denom === coreBalance.denom.split('/').pop() - ); - - return { - denom: resolvedBalance?.denom || coreBalance.denom, - coreDenom: coreBalance.denom, - amount: coreBalance.amount, - metadata: OSMOSIS_TOKEN_DATA, - }; - }); - - return combined; - }, [osmosisBalances, resolvedOsmosisBalances, osmosisMetadatas]); + // Add this combined balances memo for Osmosis tokens - // Update the filtered balances logic to use the appropriate balance source + // Update the filtered balances logic to use passed props instead of hooks const filteredBalances = useMemo(() => { const sourceBalances = - selectedFromChain === env.osmosisTestnetChain ? combinedOsmosisBalances : balances; + selectedFromChain === env.osmosisTestnetChain ? osmosisBalances : balances; return sourceBalances?.filter(token => { const displayName = token.metadata?.display ?? token.denom; return displayName.toLowerCase().includes(searchTerm.toLowerCase()); }); - }, [balances, combinedOsmosisBalances, searchTerm, selectedFromChain]); + }, [balances, osmosisBalances, searchTerm, selectedFromChain]); // Update initialSelectedToken to consider the chain const initialSelectedToken = useMemo(() => { const sourceBalances = - selectedFromChain === env.osmosisTestnetChain ? combinedOsmosisBalances : balances; + selectedFromChain === env.osmosisTestnetChain ? osmosisBalances : balances; return ( sourceBalances?.find(token => token.coreDenom === selectedDenom) || sourceBalances?.[0] || null ); - }, [balances, combinedOsmosisBalances, selectedDenom, selectedFromChain]); + }, [balances, osmosisBalances, selectedDenom, selectedFromChain]); // Update the loading check if ( @@ -153,14 +148,23 @@ export default function IbcSendForm({ const balance = parseFloat(selectedToken.amount) / Math.pow(10, exponent); return value <= balance; }) - .test('leave-for-fees', 'Insufficient balance for fees', function (value) { + .test('leave-for-fees', '', function (value) { const { selectedToken } = this.parent; if (!selectedToken || !value || selectedToken.denom !== 'umfx') return true; const exponent = selectedToken.metadata?.denom_units[1]?.exponent ?? 6; const balance = parseFloat(selectedToken.amount) / Math.pow(10, exponent); - return value <= balance - 0.09; + const MIN_FEE_BUFFER = 0.09; + const hasInsufficientBuffer = value > balance - MIN_FEE_BUFFER; + + if (hasInsufficientBuffer) { + setFeeWarning('Remember to leave tokens for fees!'); + } else { + setFeeWarning(''); + } + + return !hasInsufficientBuffer; }), selectedToken: Yup.object().required('Please select a token'), memo: Yup.string().max(255, 'Memo must be less than 255 characters'), @@ -180,7 +184,7 @@ export default function IbcSendForm({ try { const exponent = values.selectedToken.metadata?.denom_units[1]?.exponent ?? 6; const amountInBaseUnits = parseNumberToBigInt(values.amount, exponent).toString(); - console.log(selectedFromChain, selectedToChain); + const { source_port, source_channel } = getIbcInfo(selectedFromChain, selectedToChain); const token = { @@ -191,11 +195,14 @@ export default function IbcSendForm({ const stamp = Date.now(); const timeoutInNanos = (stamp + 1.2e6) * 1e6; - const msg = transfer({ + const transferMsg = transfer({ sourcePort: source_port, sourceChannel: source_channel, - sender: - selectedFromChain === env.osmosisTestnetChain ? (osmosisAddress ?? '') : (address ?? ''), + sender: admin + ? admin + : selectedFromChain === env.osmosisTestnetChain + ? (osmosisAddress ?? '') + : (address ?? ''), receiver: values.recipient ?? '', token, timeoutHeight: { @@ -205,6 +212,23 @@ export default function IbcSendForm({ timeoutTimestamp: BigInt(timeoutInNanos), }); + const msg = isGroup + ? submitProposal({ + groupPolicyAddress: admin!, + messages: [ + Any.fromPartial({ + typeUrl: MsgTransfer.typeUrl, + value: MsgTransfer.encode(transferMsg.value).finish(), + }), + ], + metadata: '', + proposers: [address], + title: `IBC Transfer`, + summary: `This proposal will send ${values.amount} ${values.selectedToken.metadata?.display} to ${values.recipient} via IBC transfer`, + exec: 0, + }) + : transferMsg; + const fee = await estimateFee( selectedFromChain === env.osmosisTestnetChain ? (osmosisAddress ?? '') : (address ?? ''), [msg] @@ -216,6 +240,9 @@ export default function IbcSendForm({ onSuccess: () => { refetchBalances(); refetchHistory(); + refetchOsmosisBalances(); + resolveOsmosisRefetch(); + refetchProposals?.(); }, }); } catch (error) { @@ -246,121 +273,161 @@ export default function IbcSendForm({
- {/* From Chain (Manifest) */} -
-
- - From Chain - -
{/* Switch Button */}
{ e.preventDefault(); + setIsIconRotated(!isIconRotated); setSelectedFromChain(selectedToChain); setSelectedToChain(selectedFromChain); }} - className="absolute top-[calc(50%-16px)] right-0 w-full flex justify-center items-center cursor-pointer z-10" + className={`absolute top-[calc(50%-16px)] right-0 w-full justify-center items-center cursor-pointer z-10 ${ + isGroup === true ? 'hidden' : 'flex' + }`} >
{/* To Chain (Osmosis) */} @@ -505,7 +572,9 @@ export default function IbcSendForm({ return tokenDisplayName.startsWith('factory') ? tokenDisplayName.split('/').pop()?.toUpperCase() - : truncateString(tokenDisplayName, 10).toUpperCase(); + : tokenDisplayName.startsWith('u') + ? tokenDisplayName.slice(1).toUpperCase() + : truncateString(tokenDisplayName, 10).toUpperCase(); })()} @@ -553,7 +622,9 @@ export default function IbcSendForm({ return tokenDisplayName.startsWith('factory') ? tokenDisplayName.split('/').pop()?.toUpperCase() - : truncateString(tokenDisplayName, 10).toUpperCase(); + : tokenDisplayName.startsWith('u') + ? tokenDisplayName.slice(1).toUpperCase() + : truncateString(tokenDisplayName, 10).toUpperCase(); })()} @@ -589,7 +660,9 @@ export default function IbcSendForm({ return tokenDisplayName.startsWith('factory') ? tokenDisplayName.split('/').pop()?.toUpperCase() - : truncateString(tokenDisplayName, 10).toUpperCase(); + : tokenDisplayName.startsWith('u') + ? tokenDisplayName.slice(1).toUpperCase() + : truncateString(tokenDisplayName, 10).toUpperCase(); })()}
{ const denomUnits = [ diff --git a/components/groups/components/myGroups.tsx b/components/groups/components/myGroups.tsx index 49570e63..630f482c 100644 --- a/components/groups/components/myGroups.tsx +++ b/components/groups/components/myGroups.tsx @@ -11,6 +11,7 @@ import { import ProfileAvatar from '@/utils/identicon'; import { CombinedBalanceInfo, + denomToAsset, ExtendedMetadataSDKType, MFX_TOKEN_DATA, truncateString, @@ -260,6 +261,32 @@ export function YourGroups({ ); const metadata = metadatas.metadatas.find(m => m.base === coreBalance.denom); + if (coreBalance.denom.startsWith('ibc/')) { + const assetInfo = denomToAsset(env.chain, coreBalance.denom); + + const baseDenom = assetInfo?.traces?.[1]?.counterparty?.base_denom; + + return { + denom: baseDenom ?? '', // normalized denom (e.g., 'umfx') + coreDenom: coreBalance.denom, // full IBC trace + amount: coreBalance.amount, + metadata: { + description: assetInfo?.description ?? '', + denom_units: + assetInfo?.denom_units?.map(unit => ({ + ...unit, + aliases: unit.aliases || [], + })) ?? [], + base: assetInfo?.base ?? '', + display: assetInfo?.display ?? '', + name: assetInfo?.name ?? '', + symbol: assetInfo?.symbol ?? '', + uri: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + uri_hash: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + }, + }; + } + return { denom: resolvedBalance?.denom || coreBalance.denom, coreDenom: coreBalance.denom, diff --git a/hooks/useQueries.ts b/hooks/useQueries.ts index 3114d4a8..f85693f3 100644 --- a/hooks/useQueries.ts +++ b/hooks/useQueries.ts @@ -4,7 +4,7 @@ import { QueryGroupsByMemberResponseSDKType } from '@liftedinit/manifestjs/dist/ import { useLcdQueryClient, useOsmosisLcdQueryClient } from './useLcdQueryClient'; import { usePoaLcdQueryClient } from './usePoaLcdQueryClient'; -import { getLogoUrls } from '@/utils'; +import { getLogoUrls, normalizeIBCDenom } from '@/utils'; import { useManifestLcdQueryClient } from './useManifestLcdQueryClient'; diff --git a/pages/_app.tsx b/pages/_app.tsx index 2b0ef0c7..89e8027e 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -44,12 +44,15 @@ import { import MobileNav from '@/components/react/mobileNav'; import { OPENLOGIN_NETWORK_TYPE } from '@toruslabs/openlogin-utils'; +import { AssetList } from '@chain-registry/types'; type ManifestAppProps = AppProps & { Component: AppProps['Component']; pageProps: AppProps['pageProps']; }; +// TODO: remove asset list injections when chain registry is updated + function ManifestApp({ Component, pageProps }: ManifestAppProps) { const [isDrawerVisible, setIsDrawerVisible] = useState(() => { // Initialize from localStorage if available, otherwise default to true @@ -201,6 +204,7 @@ function ManifestApp({ Component, pageProps }: ManifestAppProps) { m.base === coreBalance.denom); + if (coreBalance.denom.startsWith('ibc/')) { + const assetInfo = denomToAsset(env.chain, coreBalance.denom); + + const baseDenom = assetInfo?.traces?.[1]?.counterparty?.base_denom; + + return { + denom: baseDenom ?? '', // normalized denom (e.g., 'umfx') + coreDenom: coreBalance.denom, // full IBC trace + amount: coreBalance.amount, + metadata: { + description: assetInfo?.description ?? '', + denom_units: + assetInfo?.denom_units?.map(unit => ({ + ...unit, + aliases: unit.aliases || [], + })) ?? [], + base: assetInfo?.base ?? '', + display: assetInfo?.display ?? '', + name: assetInfo?.name ?? '', + symbol: assetInfo?.symbol ?? '', + uri: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + uri_hash: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + }, + }; + } + return { denom: resolvedBalance?.denom || coreBalance.denom, coreDenom: coreBalance.denom, @@ -127,6 +155,80 @@ export default function Bank() { return mfxCombinedBalance ? [mfxCombinedBalance, ...otherBalances] : otherBalances; }, [balances, resolvedBalances, metadatas]); + const { address: osmosisAddress } = useChain(env.osmosisTestnetChain); + const { + balances: osmosisBalances, + isBalancesLoading: isOsmosisBalancesLoading, + refetchBalances: refetchOsmosisBalances, + } = useTokenBalancesOsmosis(osmosisAddress ?? ''); + const { + balances: resolvedOsmosisBalances, + isBalancesLoading: resolvedOsmosisLoading, + refetchBalances: resolveOsmosisRefetch, + } = useOsmosisTokenBalancesResolved(osmosisAddress ?? ''); + + const { + metadatas: osmosisMetadatas, + isMetadatasLoading: isOsmosisMetadatasLoading, + refetchMetadatas: refetchOsmosisMetadatas, + } = useOsmosisTokenFactoryDenomsMetadata(); + + const combinedOsmosisBalances = useMemo(() => { + if (!osmosisBalances || !resolvedOsmosisBalances || !osmosisMetadatas) { + return []; + } + + const combined = osmosisBalances.map((coreBalance): CombinedBalanceInfo => { + // Handle OSMO token specifically + if (coreBalance.denom === 'uosmo') { + return { + denom: 'uosmo', + coreDenom: coreBalance.denom, + amount: coreBalance.amount, + metadata: OSMOSIS_TOKEN_DATA, + }; + } + + // Handle IBC tokens + if (coreBalance.denom.startsWith('ibc/')) { + const assetInfo = denomToAsset(env.osmosisTestnetChain, coreBalance.denom); + + const baseDenom = assetInfo?.traces?.[1]?.counterparty?.base_denom; + + return { + denom: baseDenom ?? '', // normalized denom (e.g., 'umfx') + coreDenom: coreBalance.denom, // full IBC trace + amount: coreBalance.amount, + metadata: { + description: assetInfo?.description ?? '', + denom_units: + assetInfo?.denom_units?.map(unit => ({ + ...unit, + aliases: unit.aliases || [], + })) ?? [], + base: assetInfo?.base ?? '', + display: assetInfo?.display ?? '', + name: assetInfo?.name ?? '', + symbol: assetInfo?.symbol ?? '', + uri: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + uri_hash: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + }, + }; + } + + // Handle all other tokens + const metadata = osmosisMetadatas.metadatas?.find(m => m.base === coreBalance.denom); + return { + denom: coreBalance.denom, + coreDenom: coreBalance.denom, + amount: coreBalance.amount, + metadata: metadata || null, + }; + }); + + return combined; + }, [osmosisBalances, resolvedOsmosisBalances, osmosisMetadatas]); + const isLoading = isBalancesLoading || resolvedLoading || isMetadatasLoading; const [searchTerm, setSearchTerm] = useState(''); @@ -152,17 +254,18 @@ export default function Bank() { > Bank - -
- setSearchTerm(e.target.value)} - /> - -
+ {combinedBalances.length > 0 && ( +
+ setSearchTerm(e.target.value)} + /> + +
+ )}
{activeTab === 'assets' && - (combinedBalances.length === 0 && !isLoading ? ( + (combinedBalances.length === 0 ? ( ) : ( ))} {activeTab === 'history' && - (totalCount === 0 && !txLoading ? ( + (sendTxs.length === 0 ? ( ) : ( group.policies[0].address) ?? []; diff --git a/utils/ibc.ts b/utils/ibc.ts index f1b4b3aa..3f7ae331 100644 --- a/utils/ibc.ts +++ b/utils/ibc.ts @@ -1,9 +1,123 @@ -import { asset_lists as assetLists } from '@chain-registry/assets'; import { Asset, AssetList, IBCInfo } from '@chain-registry/types'; -import { assets, ibc } from 'chain-registry'; + import { Coin } from '@liftedinit/manifestjs/dist/codegen/cosmos/base/v1beta1/coin'; import { shiftDigits } from './maths'; +import { assets as manifestAssets } from 'chain-registry/testnet/manifesttestnet'; +import { assets as osmosisAssets } from 'chain-registry/testnet/osmosistestnet'; + +//TODO: use chain-registry when the package is updated + +const manifestAssetList: AssetList = { + chain_name: 'manifesttestnet', + assets: [ + ...manifestAssets.assets, + { + description: 'Osmosis token on Manifest Ledger Testnet', + denom_units: [ + { + denom: 'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', + exponent: 0, + aliases: ['uosmo'], + }, + { + denom: 'osmo', + exponent: 6, + }, + ], + type_asset: 'ics20', + base: 'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', + name: 'Osmosis', + display: 'osmo', + symbol: 'OSMO', + traces: [ + { + type: 'ibc', + counterparty: { + chain_name: 'osmosistestnet', + base_denom: 'uosmo', + channel_id: 'channel-10016', + }, + chain: { + channel_id: 'channel-0', + path: 'transfer/channel-0/uosmo', + }, + }, + ], + images: [ + { + image_sync: { + chain_name: 'osmosistestnet', + base_denom: 'uosmo', + }, + svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/osmo.svg', + png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/osmo.png', + }, + ], + 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', + }, + }, + ], +}; + +const osmosisAssetList: AssetList = { + chain_name: 'osmosistestnet', + assets: [ + ...osmosisAssets.assets, + { + description: 'Manifest Testnet Token', + denom_units: [ + { + denom: 'ibc/8402769A51AEE1CDF35223998D284E937EBF03F4A2CE43EC10BB028BB5AD29C8', + exponent: 0, + aliases: ['umfx'], + }, + { + denom: 'mfx', + exponent: 6, + }, + ], + type_asset: 'ics20', + base: 'ibc/8402769A51AEE1CDF35223998D284E937EBF03F4A2CE43EC10BB028BB5AD29C8', + name: 'Manifest Testnet', + display: 'mfx', + symbol: 'MFX', + traces: [ + { + type: 'ibc', + counterparty: { + chain_name: 'manifesttestnet', + base_denom: 'umfx', + channel_id: 'channel-0', + }, + chain: { + channel_id: 'channel-10016', + path: 'transfer/channel-10016/umfx', + }, + }, + ], + logo_URIs: { + png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', + svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', + }, + images: [ + { + image_sync: { + chain_name: 'manifesttestnet', + base_denom: 'umfx', + }, + png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', + svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', + }, + ], + }, + ], +}; + +const assets = [manifestAssetList, osmosisAssetList]; +const assetLists = [manifestAssetList, osmosisAssetList]; //TODO: use chain-registry when the package is updated export const truncateDenom = (denom: string) => { @@ -14,7 +128,7 @@ const filterAssets = (chainName: string, assetList: AssetList[]): Asset[] => { return ( assetList .find(({ chain_name }) => chain_name === chainName) - ?.assets?.filter(({ type_asset }) => type_asset !== 'ics20') || [] + ?.assets?.filter(({ type_asset }) => type_asset === 'ics20' || !type_asset) || [] ); }; @@ -26,7 +140,22 @@ const getAllAssets = (chainName: string) => { }; export const denomToAsset = (chainName: string, denom: string) => { - return getAllAssets(chainName).find(asset => asset.base === denom); + const allAssets = getAllAssets(chainName); + // Only handle IBC hashes + if (denom.startsWith('ibc/')) { + // Find the asset that has this IBC hash as its base + const asset = allAssets.find(asset => asset.base === denom); + if (asset?.traces?.[0]?.counterparty?.base_denom) { + // Return the original denom from the counterparty chain + return { + ...asset, + base: asset.traces[0].counterparty.base_denom, + }; + } + } + + // Return original asset if not an IBC hash + return allAssets.find(asset => asset.base === denom); }; export const denomToExponent = (chainName: string, denom: string) => { @@ -110,3 +239,15 @@ export const getIbcDenom = (chainName: string, denom: string) => { const asset = denomToAsset(chainName, denom); return asset?.base; }; + +export const normalizeIBCDenom = (chainName: string, denom: string) => { + const asset = denomToAsset(chainName, denom); + if (asset) { + return { + denom: asset.base, + }; + } + return { denom }; +}; + +export type ResolvedIBCDenom = ReturnType; From 03619b3592fa697cc705956c3ca7c63ceb88336f Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Fri, 10 Jan 2025 17:38:41 -0700 Subject: [PATCH 08/63] fix: show ibc assets in history --- components/bank/components/historyBox.tsx | 47 ++++++++++++++++++++--- components/bank/modals/txInfo.tsx | 30 ++++++++++----- utils/ibc.ts | 1 + 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/components/bank/components/historyBox.tsx b/components/bank/components/historyBox.tsx index e5f923ac..cc93b6e1 100644 --- a/components/bank/components/historyBox.tsx +++ b/components/bank/components/historyBox.tsx @@ -1,12 +1,13 @@ import React, { useMemo, useState, useEffect } from 'react'; import { TruncatedAddressWithCopy } from '@/components/react/addressCopy'; import TxInfoModal from '../modals/txInfo'; -import { shiftDigits, truncateString } from '@/utils'; +import { denomToAsset, shiftDigits, truncateString } from '@/utils'; import { BurnIcon, DenomImage, formatDenom, MintIcon } from '@/components'; import { HistoryTxType, useTokenFactoryDenomsMetadata } from '@/hooks'; import { ReceiveIcon, SendIcon } from '@/components/icons'; import useIsMobile from '@/hooks/useIsMobile'; +import env from '@/config/env'; interface Transaction { tx_type: HistoryTxType; @@ -216,7 +217,26 @@ export function HistoryBox({
{tx.data.amount.map((amt, index) => { - const metadata = metadatas?.metadatas.find(m => m.base === amt.denom); + const assetInfo = denomToAsset(env.chain, amt.denom); + let metadata = metadatas?.metadatas.find(m => m.base === amt.denom); + + if (amt.denom.startsWith('ibc/')) { + metadata = { + description: assetInfo?.description ?? '', + denom_units: + assetInfo?.denom_units?.map(unit => ({ + ...unit, + aliases: unit.aliases || [], + })) ?? [], + base: assetInfo?.base ?? '', + display: assetInfo?.display ?? '', + name: assetInfo?.name ?? '', + symbol: assetInfo?.symbol ?? '', + uri: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + uri_hash: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + }; + } + return ; })} @@ -228,8 +248,16 @@ export function HistoryBox({

{tx.data.amount.map((amt, index) => { const metadata = metadatas?.metadatas.find(m => m.base === amt.denom); - const display = metadata?.display ?? metadata?.symbol ?? ''; - return metadata?.display.startsWith('factory') + let display = metadata?.display ?? metadata?.symbol ?? ''; + + if (amt.denom.startsWith('ibc/')) { + const assetInfo = denomToAsset(env.chain, amt.denom); + if (assetInfo?.traces?.[0]?.counterparty?.base_denom) { + display = assetInfo.traces[0].counterparty.base_denom.slice(1); + } + } + + return metadata?.display?.startsWith('factory') ? metadata?.display?.split('/').pop()?.toUpperCase() : display.length > 4 ? display.slice(0, 4).toUpperCase() + '...' @@ -269,7 +297,16 @@ export function HistoryBox({ const metadata = metadatas?.metadatas.find(m => m.base === amt.denom); const exponent = Number(metadata?.denom_units[1]?.exponent) || 6; const amount = Number(shiftDigits(amt.amount, -exponent)); - return `${formatLargeNumber(amount)} ${formatDenom(amt.denom)}`; + let baseDenom = formatDenom(amt.denom); + + if (amt.denom.startsWith('ibc/')) { + const assetInfo = denomToAsset(env.chain, amt.denom); + if (assetInfo?.traces?.[0]?.counterparty?.base_denom) { + baseDenom = assetInfo.traces[0].counterparty.base_denom.slice(1); + } + } + + return `${formatLargeNumber(amount)} ${baseDenom.toUpperCase()}`; }) .join(', ')}

diff --git a/components/bank/modals/txInfo.tsx b/components/bank/modals/txInfo.tsx index 3c7b1c64..53d8ada3 100644 --- a/components/bank/modals/txInfo.tsx +++ b/components/bank/modals/txInfo.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { TruncatedAddressWithCopy } from '@/components/react/addressCopy'; import { formatDenom, TransactionGroup } from '@/components'; import { FaExternalLinkAlt } from 'react-icons/fa'; -import { shiftDigits } from '@/utils'; +import { denomToAsset, shiftDigits } from '@/utils'; import env from '@/config/env'; interface TxInfoModalProps { @@ -75,14 +75,26 @@ export default function TxInfoModal({ tx, modalId }: TxInfoModalProps) { VALUE

- {tx?.data?.amount.map((amt, index) => ( -

- {Number(shiftDigits(amt.amount, -6)).toLocaleString(undefined, { - maximumFractionDigits: 6, - })}{' '} - {formatDenom(amt.denom)} -

- ))} + {tx?.data?.amount.map((amt, index) => { + const amount = Number(shiftDigits(amt.amount, -6)); + let displayDenom = formatDenom(amt.denom); + + if (amt.denom.startsWith('ibc/')) { + const assetInfo = denomToAsset(env.chain, amt.denom); + if (assetInfo?.traces?.[0]?.counterparty?.base_denom) { + displayDenom = assetInfo.traces[0].counterparty.base_denom.slice(1); + } + } + + return ( +

+ {Number(amount).toLocaleString(undefined, { + maximumFractionDigits: 6, + })}{' '} + {displayDenom.toUpperCase()} +

+ ); + })}
diff --git a/utils/ibc.ts b/utils/ibc.ts index 3f7ae331..dcfee6ac 100644 --- a/utils/ibc.ts +++ b/utils/ibc.ts @@ -141,6 +141,7 @@ const getAllAssets = (chainName: string) => { export const denomToAsset = (chainName: string, denom: string) => { const allAssets = getAllAssets(chainName); + // Only handle IBC hashes if (denom.startsWith('ibc/')) { // Find the asset that has this IBC hash as its base From dc163e0cc6fb151a9e4b2385d3aac465786066e6 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Fri, 10 Jan 2025 19:47:43 -0700 Subject: [PATCH 09/63] chore: add back uppercase --- components/bank/components/tokenList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/components/tokenList.tsx b/components/bank/components/tokenList.tsx index 8d0482c3..78190e9a 100644 --- a/components/bank/components/tokenList.tsx +++ b/components/bank/components/tokenList.tsx @@ -117,7 +117,7 @@ export function TokenList(props: Readonly) {

- {truncateString(balance.metadata?.display ?? '', 12)} + {truncateString(balance.metadata?.display ?? '', 12).toUpperCase()}

{balance.metadata?.denom_units[0]?.denom.startsWith('ibc') From aa9301fc2b2e0f6c9ea94125f11ddf498f3ea562 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Fri, 10 Jan 2025 20:34:19 -0700 Subject: [PATCH 10/63] chore: code rabbit suggestions --- .gitignore | 4 +- components/bank/components/sendBox.tsx | 15 +- components/bank/forms/ibcSendForm.tsx | 11 +- scripts/ibcTransferAll.ts | 232 +++++++++++++++++++++++++ 4 files changed, 255 insertions(+), 7 deletions(-) create mode 100644 scripts/ibcTransferAll.ts diff --git a/.gitignore b/.gitignore index 0add2f24..669983e8 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,6 @@ next-env.d.ts .idea/ -certificates \ No newline at end of file +certificates + +/scripts/demons.json \ No newline at end of file diff --git a/components/bank/components/sendBox.tsx b/components/bank/components/sendBox.tsx index 3240b558..974bd998 100644 --- a/components/bank/components/sendBox.tsx +++ b/components/bank/components/sendBox.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import SendForm from '../forms/sendForm'; import IbcSendForm from '../forms/ibcSendForm'; import env from '@/config/env'; @@ -61,6 +61,18 @@ export default function SendBox({ [] ); + useEffect(() => { + if (selectedFromChain && selectedToChain && selectedFromChain === selectedToChain) { + // If chains match, switch the destination chain to the other available chain + const otherChain = ibcChains.find(chain => chain.id !== selectedFromChain)?.id || ''; + setSelectedToChain(otherChain); + } + }, [selectedFromChain, selectedToChain, ibcChains]); + + const getAvailableToChains = useMemo(() => { + return ibcChains.filter(chain => chain.id !== selectedFromChain); + }, [ibcChains, selectedFromChain]); + return (

@@ -115,6 +127,7 @@ export default function SendBox({ isOsmosisBalancesLoading={isOsmosisBalancesLoading} refetchOsmosisBalances={refetchOsmosisBalances} resolveOsmosisRefetch={resolveOsmosisRefetch} + availableToChains={getAvailableToChains} /> ) : ( void; refetchProposals?: () => void; admin?: string; + availableToChains: IbcChain[]; }>) { const { address: osmosisAddress } = useChain(env.osmosisTestnetChain); const [isSending, setIsSending] = useState(false); @@ -91,14 +93,13 @@ export default function IbcSendForm({ const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; const [isContactsOpen, setIsContactsOpen] = useState(false); const [isIconRotated, setIsIconRotated] = useState(false); - const searchParams = useSearchParams(); - const policyAddress = searchParams.get('policyAddress'); + const { submitProposal } = cosmos.group.v1.MessageComposer.withTypeUrl; useEffect(() => { - if (policyAddress) { + if (isGroup) { setSelectedFromChain(env.chain); } - }, [policyAddress, setSelectedFromChain]); + }, [isGroup, setSelectedFromChain]); // Add this combined balances memo for Osmosis tokens @@ -472,7 +473,7 @@ export default function IbcSendForm({ role="listbox" className="dropdown-content z-[100] menu p-2 shadow bg-base-300 rounded-lg w-full mt-1 dark:text-[#FFFFFF] text-[#161616]" > - {ibcChains.map(chain => ( + {availableToChains.map(chain => (
  • { diff --git a/scripts/ibcTransferAll.ts b/scripts/ibcTransferAll.ts new file mode 100644 index 00000000..7324d6a1 --- /dev/null +++ b/scripts/ibcTransferAll.ts @@ -0,0 +1,232 @@ +import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; +import { SigningStargateClient } from '@cosmjs/stargate'; +import { cosmos, ibc } from '@liftedinit/manifestjs'; +import { MsgTransfer } from '@liftedinit/manifestjs/dist/codegen/ibc/applications/transfer/v1/tx'; +import axios from 'axios'; +import * as fs from 'fs'; +import * as path from 'path'; + +// Environment Configuration +const env = { + rpcUrl: 'https://nodes.liftedinit.tech/manifest/testnet/rpc', + osmosisTestnetRpcUrl: 'https://rpc.osmotest5.osmosis.zone', + chain: 'manifest-testnet', + osmosisTestnetChain: 'osmo-test-5', +}; + +// IBC Configuration +const getIbcInfo = (fromChain: string, toChain: string) => { + if (fromChain === 'manifest-testnet' && toChain === 'osmo-test-5') { + return { + source_port: 'transfer', + source_channel: 'channel-0', + }; + } + throw new Error(`Unsupported chain combination: ${fromChain} -> ${toChain}`); +}; + +// Configuration +const MANIFEST_RPC = env.rpcUrl; +const OSMOSIS_RPC = env.osmosisTestnetRpcUrl; +const SOURCE_CHAIN = env.chain; +const TARGET_CHAIN = env.osmosisTestnetChain; + +// Helper function to format token info for asset list +function formatTokenForAssetList(ibcDenom: string, denomTrace: any, originalDenom: string) { + const tokenName = originalDenom.split('/').pop()?.replace('u', '') || ''; + const displayName = tokenName.toUpperCase(); + + return { + description: `${displayName} Token`, + denom_units: [ + { + denom: ibcDenom, + exponent: 0, + aliases: [originalDenom], + }, + { + denom: displayName, + exponent: 6, + }, + ], + type_asset: 'ics20', + base: ibcDenom, + name: displayName, + display: displayName, + symbol: displayName, + traces: [ + { + type: 'ibc', + counterparty: { + chain_name: 'manifesttestnet', + base_denom: originalDenom, + channel_id: 'channel-0', + }, + chain: { + channel_id: 'channel-10016', + path: denomTrace.path, + }, + }, + ], + logo_URIs: { + png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', + svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', + }, + images: [ + { + image_sync: { + chain_name: 'manifesttestnet', + base_denom: originalDenom, + }, + png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', + svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', + }, + ], + }; +} + +// Helper function to query denom trace +async function getDenomTrace(hash: string) { + try { + const response = await axios.get( + `${OSMOSIS_RPC.replace('rpc', 'rest')}/ibc/apps/transfer/v1/denom_traces/${hash}` + ); + return response.data.denom_trace; + } catch (error) { + console.error('Error fetching denom trace:', error); + return null; + } +} + +async function main() { + // Get mnemonic from environment or argument + const mnemonic = process.env.WALLET_MNEMONIC; + if (!mnemonic) { + throw new Error('Please provide WALLET_MNEMONIC environment variable'); + } + + // Setup wallets for both chains + const manifestWallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: 'manifest', + }); + const osmosisWallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: 'osmo', + }); + + // Get addresses + const [manifestAccount] = await manifestWallet.getAccounts(); + const [osmosisAccount] = await osmosisWallet.getAccounts(); + + console.log('Manifest address:', manifestAccount.address); + console.log('Osmosis address:', osmosisAccount.address); + + // Create signing clients + const manifestClient = await SigningStargateClient.connectWithSigner( + MANIFEST_RPC, + manifestWallet + ); + const osmosisClient = await SigningStargateClient.connectWithSigner(OSMOSIS_RPC, osmosisWallet); + + // Query balances on Manifest chain + const balances = await manifestClient.getAllBalances(manifestAccount.address); + console.log('\nManifest chain balances:', balances); + + // Get IBC info + const { source_port, source_channel } = getIbcInfo(SOURCE_CHAIN, TARGET_CHAIN); + + // Filter and create IBC transfer messages for each token + const messages = balances + .filter(token => token.denom.startsWith('factory/')) + .map(token => { + const timeoutInNanos = (Date.now() + 1.2e6) * 1e6; + + return { + typeUrl: MsgTransfer.typeUrl, + value: { + sourcePort: source_port, + sourceChannel: source_channel, + sender: manifestAccount.address, + receiver: osmosisAccount.address, + token: { + denom: token.denom, + amount: '1', + }, + timeoutHeight: { + revisionNumber: BigInt(0), + revisionHeight: BigInt(0), + }, + timeoutTimestamp: BigInt(timeoutInNanos), + }, + }; + }); + + // Execute transfers + if (messages.length > 0) { + try { + const fee = { + amount: [{ denom: 'umfx', amount: '5500' }], + gas: '5000000', + }; + + console.log('\nExecuting IBC transfers...'); + console.log(`Attempting to transfer 1 token each for ${messages.length} different denoms...`); + + const result = await manifestClient.signAndBroadcast(manifestAccount.address, messages, fee); + + if (result.code !== 0) { + throw new Error(`Transaction failed with code ${result.code}. Logs: ${result.rawLog}`); + } + + console.log('Transfer result:', { + code: result.code, + hash: result.transactionHash, + }); + } catch (error) { + console.error('Error during transfer:', error); + process.exit(1); // Exit with error code + } + } else { + console.log('No tokens to transfer'); + } + + // Wait a bit for the transfers to complete + console.log('\nWaiting 1 minute for transfers to complete...'); + await new Promise(resolve => setTimeout(resolve, 60000)); + + // Query final balances on Osmosis + const osmosisBalances = await osmosisClient.getAllBalances(osmosisAccount.address); + console.log('\nOsmosis chain balances:', osmosisBalances); + + // Query IBC denom traces for each IBC token and format them + const ibcTokens = osmosisBalances.filter(token => token.denom.startsWith('ibc/')); + const formattedTokens = []; + + if (ibcTokens.length > 0) { + console.log('\nIBC Denom Traces:'); + for (const token of ibcTokens) { + try { + const hash = token.denom.split('/')[1]; + const denomTrace = await getDenomTrace(hash); + console.log(`${token.denom}:`, denomTrace); + + // Find original denom from balances + const originalDenom = balances.find( + b => denomTrace?.base_denom === b.denom || denomTrace?.path.includes(b.denom) + )?.denom; + + if (originalDenom && denomTrace) { + formattedTokens.push(formatTokenForAssetList(token.denom, denomTrace, originalDenom)); + } + } catch (error) { + console.error(`Error querying denom trace for ${token.denom}:`, error); + } + } + + // Save formatted tokens to file + const outputPath = path.join(__dirname, 'denoms.json'); + fs.writeFileSync(outputPath, JSON.stringify({ tokens: formattedTokens }, null, 2)); + console.log(`\nToken information saved to ${outputPath}`); + } +} + +main().catch(console.error); From 6f565daa02b377d1c5cb6dda74a802c031b27b59 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Sat, 11 Jan 2025 00:35:04 -0700 Subject: [PATCH 11/63] chore: code rabbit suggestions --- components/bank/forms/ibcSendForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index d01c9f8c..507da093 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -473,7 +473,7 @@ export default function IbcSendForm({ role="listbox" className="dropdown-content z-[100] menu p-2 shadow bg-base-300 rounded-lg w-full mt-1 dark:text-[#FFFFFF] text-[#161616]" > - {availableToChains.map(chain => ( + {availableToChains?.map(chain => (
  • { From 5a0f4c10e688174b4fd46db1a0c24a647c9611c6 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 14 Jan 2025 00:01:15 -0700 Subject: [PATCH 12/63] chore: add osmosis related .env variables to readme --- README.md | 8 ++++++++ config/env.ts | 1 + 2 files changed, 9 insertions(+) diff --git a/README.md b/README.md index b06d1539..be4b2700 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ NEXT_PUBLIC_RPC_URL= NEXT_PUBLIC_API_URL= NEXT_PUBLIC_EXPLORER_URL= NEXT_PUBLIC_INDEXER_URL= +NEXT_PUBLIC_OSMOSIS_TESTNET_CHAIN_ID= +NEXT_PUBLIC_OSMOSIS_TESTNET_RPC_URL= +NEXT_PUBLIC_OSMOSIS_TESTNET_API_URL= +NEXT_PUBLIC_OSMOSIS_TESTNET_EXPLORER_URL= ``` where @@ -45,6 +49,10 @@ where - `NEXT_PUBLIC_API_URL` is the chain API URL - `NEXT_PUBLIC_EXPLORER_URL` is the block explorer URL - `NEXT_PUBLIC_INDEXER_URL` is the YACI indexer URL +- `NEXT_PUBLIC_OSMOSIS_TESTNET_CHAIN_ID` is the osmosis testnet chain ID +- `NEXT_PUBLIC_OSMOSIS_TESTNET_RPC_URL` is the osmosis testnet RPC URL +- `NEXT_PUBLIC_OSMOSIS_TESTNET_API_URL` is the osmosis testnet API URL +- `NEXT_PUBLIC_OSMOSIS_TESTNET_EXPLORER_URL` is the osmosis testnet block explorer URL ### Development diff --git a/config/env.ts b/config/env.ts index c626f921..5bef3ad9 100644 --- a/config/env.ts +++ b/config/env.ts @@ -3,6 +3,7 @@ const env = { rpcUrl: process.env.NEXT_PUBLIC_RPC_URL ?? '', explorerUrl: process.env.NEXT_PUBLIC_EXPLORER_URL ?? '', osmosisTestnetExplorerUrl: process.env.NEXT_PUBLIC_OSMOSIS_TESTNET_EXPLORER_URL ?? '', + osmosisTestnetChainId: process.env.NEXT_PUBLIC_OSMOSIS_TESTNET_CHAIN_ID ?? '', web3AuthClientId: process.env.NEXT_PUBLIC_WEB3AUTH_CLIENT_ID ?? '', walletConnectKey: process.env.NEXT_PUBLIC_WALLETCONNECT_KEY ?? '', web3AuthNetwork: process.env.NEXT_PUBLIC_WEB3AUTH_NETWORK ?? '', From f7ce6726bf5ba786f0c84df586fbb29e20a8f6a0 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 14 Jan 2025 00:03:59 -0700 Subject: [PATCH 13/63] fix: re-add proper rendering logic to bank page --- pages/bank.tsx | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/pages/bank.tsx b/pages/bank.tsx index e6a87677..b7e7661e 100644 --- a/pages/bank.tsx +++ b/pages/bank.tsx @@ -254,18 +254,17 @@ export default function Bank() { > Bank - {combinedBalances.length > 0 && ( -
    - setSearchTerm(e.target.value)} - /> - -
    - )} + +
    + setSearchTerm(e.target.value)} + /> + +
  • {activeTab === 'assets' && - (combinedBalances.length === 0 ? ( + (combinedBalances.length === 0 && !isLoading ? ( ) : ( ))} {activeTab === 'history' && - (sendTxs.length === 0 ? ( + (totalPages === 0 ? ( ) : ( Date: Tue, 14 Jan 2025 12:35:35 -0700 Subject: [PATCH 14/63] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index be4b2700..aeaff15f 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,10 @@ NEXT_PUBLIC_RPC_URL= NEXT_PUBLIC_API_URL= NEXT_PUBLIC_EXPLORER_URL= NEXT_PUBLIC_INDEXER_URL= -NEXT_PUBLIC_OSMOSIS_TESTNET_CHAIN_ID= -NEXT_PUBLIC_OSMOSIS_TESTNET_RPC_URL= -NEXT_PUBLIC_OSMOSIS_TESTNET_API_URL= -NEXT_PUBLIC_OSMOSIS_TESTNET_EXPLORER_URL= +NEXT_PUBLIC_OSMOSIS_CHAIN_ID= +NEXT_PUBLIC_OSMOSIS_RPC_URL= +NEXT_PUBLIC_OSMOSIS_API_URL= +NEXT_PUBLIC_OSMOSIS_EXPLORER_URL= ``` where From fb9cfff4c6d0b4decfb77146796d5d251386644c Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:35:47 -0700 Subject: [PATCH 15/63] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aeaff15f..d25f2be7 100644 --- a/README.md +++ b/README.md @@ -49,10 +49,10 @@ where - `NEXT_PUBLIC_API_URL` is the chain API URL - `NEXT_PUBLIC_EXPLORER_URL` is the block explorer URL - `NEXT_PUBLIC_INDEXER_URL` is the YACI indexer URL -- `NEXT_PUBLIC_OSMOSIS_TESTNET_CHAIN_ID` is the osmosis testnet chain ID -- `NEXT_PUBLIC_OSMOSIS_TESTNET_RPC_URL` is the osmosis testnet RPC URL -- `NEXT_PUBLIC_OSMOSIS_TESTNET_API_URL` is the osmosis testnet API URL -- `NEXT_PUBLIC_OSMOSIS_TESTNET_EXPLORER_URL` is the osmosis testnet block explorer URL +- `NEXT_PUBLIC_OSMOSIS_CHAIN_ID` is the osmosis chain ID +- `NEXT_PUBLIC_OSMOSIS_RPC_URL` is the osmosis RPC URL +- `NEXT_PUBLIC_OSMOSIS_API_URL` is the osmosis API URL +- `NEXT_PUBLIC_OSMOSIS_EXPLORER_URL` is the osmosis block explorer URL ### Development From 09bf7059dbb77c347a76467624fc71cd36afe232 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:35:57 -0700 Subject: [PATCH 16/63] Update config/env.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- config/env.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/env.ts b/config/env.ts index 5bef3ad9..70cd7717 100644 --- a/config/env.ts +++ b/config/env.ts @@ -2,8 +2,8 @@ const env = { chainId: process.env.NEXT_PUBLIC_CHAIN_ID ?? '', rpcUrl: process.env.NEXT_PUBLIC_RPC_URL ?? '', explorerUrl: process.env.NEXT_PUBLIC_EXPLORER_URL ?? '', - osmosisTestnetExplorerUrl: process.env.NEXT_PUBLIC_OSMOSIS_TESTNET_EXPLORER_URL ?? '', - osmosisTestnetChainId: process.env.NEXT_PUBLIC_OSMOSIS_TESTNET_CHAIN_ID ?? '', + osmosisExplorerUrl: process.env.NEXT_PUBLIC_OSMOSIS_EXPLORER_URL ?? '', + osmosisChainId: process.env.NEXT_PUBLIC_OSMOSIS_CHAIN_ID ?? '', web3AuthClientId: process.env.NEXT_PUBLIC_WEB3AUTH_CLIENT_ID ?? '', walletConnectKey: process.env.NEXT_PUBLIC_WALLETCONNECT_KEY ?? '', web3AuthNetwork: process.env.NEXT_PUBLIC_WEB3AUTH_NETWORK ?? '', From 7b1a642b6cd64baac255fa644a8bda347a5c9191 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 14 Jan 2025 12:34:53 -0700 Subject: [PATCH 17/63] chore: add coderabbit changes --- components/bank/components/historyBox.tsx | 54 +++++++++++++++-------- components/bank/forms/ibcSendForm.tsx | 17 ++++--- components/groups/components/myGroups.tsx | 5 ++- 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/components/bank/components/historyBox.tsx b/components/bank/components/historyBox.tsx index b5cb321d..127cdd7b 100644 --- a/components/bank/components/historyBox.tsx +++ b/components/bank/components/historyBox.tsx @@ -221,20 +221,34 @@ export function HistoryBox({ let metadata = metadatas?.metadatas.find(m => m.base === amt.denom); if (amt.denom.startsWith('ibc/')) { - metadata = { - description: assetInfo?.description ?? '', - denom_units: - assetInfo?.denom_units?.map(unit => ({ - ...unit, - aliases: unit.aliases || [], - })) ?? [], - base: assetInfo?.base ?? '', - display: assetInfo?.display ?? '', - name: assetInfo?.name ?? '', - symbol: assetInfo?.symbol ?? '', - uri: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', - uri_hash: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', - }; + if (assetInfo) { + metadata = { + description: assetInfo?.description ?? '', + denom_units: + assetInfo?.denom_units?.map(unit => ({ + ...unit, + aliases: unit.aliases || [], + })) ?? [], + base: assetInfo?.base ?? '', + display: assetInfo?.display ?? '', + name: assetInfo?.name ?? '', + symbol: assetInfo?.symbol ?? '', + uri: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + uri_hash: assetInfo?.logo_URIs?.svg ?? assetInfo?.logo_URIs?.png ?? '', + }; + } else { + // assetInfo is undefined + metadata = { + description: '', + denom_units: [], + base: '', + display: '', + name: '', + symbol: '', + uri: '', + uri_hash: '', + }; + } } return ; @@ -252,8 +266,10 @@ export function HistoryBox({ if (amt.denom.startsWith('ibc/')) { const assetInfo = denomToAsset(env.chain, amt.denom); - if (assetInfo?.traces?.[0]?.counterparty?.base_denom) { - display = assetInfo.traces[0].counterparty.base_denom.slice(1); + if (assetInfo?.traces && assetInfo.traces.length > 0) { + if (assetInfo.traces[0].counterparty?.base_denom) { + display = assetInfo.traces[0].counterparty.base_denom.slice(1); + } } } @@ -301,8 +317,10 @@ export function HistoryBox({ if (amt.denom.startsWith('ibc/')) { const assetInfo = denomToAsset(env.chain, amt.denom); - if (assetInfo?.traces?.[0]?.counterparty?.base_denom) { - baseDenom = assetInfo.traces[0].counterparty.base_denom.slice(1); + if (assetInfo?.traces && assetInfo.traces.length > 0) { + if (assetInfo.traces[0].counterparty?.base_denom) { + baseDenom = assetInfo.traces[0].counterparty.base_denom.slice(1); + } } } diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 507da093..321159b4 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -81,6 +81,17 @@ export default function IbcSendForm({ availableToChains: IbcChain[]; }>) { const { address: osmosisAddress } = useChain(env.osmosisTestnetChain); + + const formatTokenDisplayName = (displayName: string) => { + if (displayName.startsWith('factory')) { + return displayName.split('/').pop()?.toUpperCase(); + } + if (displayName.startsWith('u')) { + return displayName.slice(1).toUpperCase(); + } + return truncateString(displayName, 10).toUpperCase(); + }; + const [isSending, setIsSending] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [feeWarning, setFeeWarning] = useState(''); @@ -571,11 +582,7 @@ export default function IbcSendForm({ values.selectedToken?.denom ?? 'Select'; - return tokenDisplayName.startsWith('factory') - ? tokenDisplayName.split('/').pop()?.toUpperCase() - : tokenDisplayName.startsWith('u') - ? tokenDisplayName.slice(1).toUpperCase() - : truncateString(tokenDisplayName, 10).toUpperCase(); + return formatTokenDisplayName(tokenDisplayName); })()} diff --git a/components/groups/components/myGroups.tsx b/components/groups/components/myGroups.tsx index e5756a6f..91204c4f 100644 --- a/components/groups/components/myGroups.tsx +++ b/components/groups/components/myGroups.tsx @@ -264,7 +264,10 @@ export function YourGroups({ if (coreBalance.denom.startsWith('ibc/')) { const assetInfo = denomToAsset(env.chain, coreBalance.denom); - const baseDenom = assetInfo?.traces?.[1]?.counterparty?.base_denom; + let baseDenom = ''; + if (assetInfo?.traces && assetInfo.traces.length > 1) { + baseDenom = assetInfo.traces[1]?.counterparty?.base_denom ?? ''; + } return { denom: baseDenom ?? '', // normalized denom (e.g., 'umfx') From 6d570b0f88687459fb12e21d8fd29545e6ff71cc Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:36:56 -0700 Subject: [PATCH 18/63] Update config/env.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- config/env.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/env.ts b/config/env.ts index 70cd7717..731e3eae 100644 --- a/config/env.ts +++ b/config/env.ts @@ -8,7 +8,7 @@ const env = { walletConnectKey: process.env.NEXT_PUBLIC_WALLETCONNECT_KEY ?? '', web3AuthNetwork: process.env.NEXT_PUBLIC_WEB3AUTH_NETWORK ?? '', chain: process.env.NEXT_PUBLIC_CHAIN ?? '', - osmosisTestnetChain: process.env.NEXT_PUBLIC_OSMOSIS_TESTNET_CHAIN ?? '', + osmosisChain: process.env.NEXT_PUBLIC_OSMOSIS_CHAIN ?? '', chainTier: process.env.NEXT_PUBLIC_CHAIN_TIER ?? '', apiUrl: process.env.NEXT_PUBLIC_API_URL ?? '', indexerUrl: process.env.NEXT_PUBLIC_INDEXER_URL ?? '', From bd0319f188108ef98289d320962906d7fde723a2 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:37:05 -0700 Subject: [PATCH 19/63] Update config/env.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- config/env.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/env.ts b/config/env.ts index 731e3eae..65a47c52 100644 --- a/config/env.ts +++ b/config/env.ts @@ -12,8 +12,8 @@ const env = { chainTier: process.env.NEXT_PUBLIC_CHAIN_TIER ?? '', apiUrl: process.env.NEXT_PUBLIC_API_URL ?? '', indexerUrl: process.env.NEXT_PUBLIC_INDEXER_URL ?? '', - osmosisTestnetApiUrl: process.env.NEXT_PUBLIC_OSMOSIS_TESTNET_API_URL ?? '', - osmosisTestnetRpcUrl: process.env.NEXT_PUBLIC_OSMOSIS_TESTNET_RPC_URL ?? '', + osmosisApiUrl: process.env.NEXT_PUBLIC_OSMOSIS_API_URL ?? '', + osmosisRpcUrl: process.env.NEXT_PUBLIC_OSMOSIS_RPC_URL ?? '', }; export default env; From 958a27ffa474825a35d913c3c5b4136a10201a89 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:37:20 -0700 Subject: [PATCH 20/63] Update components/bank/components/sendBox.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- components/bank/components/sendBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/components/sendBox.tsx b/components/bank/components/sendBox.tsx index 974bd998..b3e49e5c 100644 --- a/components/bank/components/sendBox.tsx +++ b/components/bank/components/sendBox.tsx @@ -52,7 +52,7 @@ export default function SendBox({ prefix: 'manifest', }, { - id: env.osmosisTestnetChain, + id: env.osmosisChain, name: 'Osmosis', icon: '/osmosis.svg', prefix: 'osmo', From de95589424f74635f9435b8fd9397ec32168d372 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:37:29 -0700 Subject: [PATCH 21/63] Update pages/_app.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- pages/_app.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/_app.tsx b/pages/_app.tsx index 813c90a7..068650de 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -190,8 +190,8 @@ function ManifestApp({ Component, pageProps }: ManifestAppProps) { rest: [env.apiUrl], }, ['osmosistestnet']: { - rpc: [env.osmosisTestnetRpcUrl], - rest: [env.osmosisTestnetApiUrl], + rpc: [env.osmosisRpcUrl], + rest: [env.osmosisApiUrl], }, }, }; From 1e474cf33c2610f6992736a6734887629435bc50 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:37:39 -0700 Subject: [PATCH 22/63] Update pages/bank.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- pages/bank.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/bank.tsx b/pages/bank.tsx index b7e7661e..7d6f59fb 100644 --- a/pages/bank.tsx +++ b/pages/bank.tsx @@ -155,7 +155,7 @@ export default function Bank() { return mfxCombinedBalance ? [mfxCombinedBalance, ...otherBalances] : otherBalances; }, [balances, resolvedBalances, metadatas]); - const { address: osmosisAddress } = useChain(env.osmosisTestnetChain); + const { address: osmosisAddress } = useChain(env.osmosisChain); const { balances: osmosisBalances, isBalancesLoading: isOsmosisBalancesLoading, From 036be3f4677493408ed8b140b4b6391496d3c38f Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:37:46 -0700 Subject: [PATCH 23/63] Update scripts/ibcTransferAll.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- scripts/ibcTransferAll.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/ibcTransferAll.ts b/scripts/ibcTransferAll.ts index 7324d6a1..1a88de9c 100644 --- a/scripts/ibcTransferAll.ts +++ b/scripts/ibcTransferAll.ts @@ -27,9 +27,9 @@ const getIbcInfo = (fromChain: string, toChain: string) => { // Configuration const MANIFEST_RPC = env.rpcUrl; -const OSMOSIS_RPC = env.osmosisTestnetRpcUrl; +const OSMOSIS_RPC = env.osmosisRpcUrl; const SOURCE_CHAIN = env.chain; -const TARGET_CHAIN = env.osmosisTestnetChain; +const TARGET_CHAIN = env.osmosisChain; // Helper function to format token info for asset list function formatTokenForAssetList(ibcDenom: string, denomTrace: any, originalDenom: string) { From 65dbb12f49f6b763efe075264ae6be6cf3dc6623 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:37:57 -0700 Subject: [PATCH 24/63] Update scripts/ibcTransferAll.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- scripts/ibcTransferAll.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/ibcTransferAll.ts b/scripts/ibcTransferAll.ts index 1a88de9c..73185a99 100644 --- a/scripts/ibcTransferAll.ts +++ b/scripts/ibcTransferAll.ts @@ -9,9 +9,9 @@ import * as path from 'path'; // Environment Configuration const env = { rpcUrl: 'https://nodes.liftedinit.tech/manifest/testnet/rpc', - osmosisTestnetRpcUrl: 'https://rpc.osmotest5.osmosis.zone', + osmosisRpcUrl: 'https://rpc.osmotest5.osmosis.zone', chain: 'manifest-testnet', - osmosisTestnetChain: 'osmo-test-5', + osmosisChain: 'osmo-test-5', }; // IBC Configuration From f0e7e8d00dc3773f54e5e57b7e947c0c88d0ce96 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:38:21 -0700 Subject: [PATCH 25/63] Update components/bank/forms/ibcSendForm.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- components/bank/forms/ibcSendForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 321159b4..5f91be48 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -80,7 +80,7 @@ export default function IbcSendForm({ admin?: string; availableToChains: IbcChain[]; }>) { - const { address: osmosisAddress } = useChain(env.osmosisTestnetChain); + const { address: osmosisAddress } = useChain(env.osmosisChain); const formatTokenDisplayName = (displayName: string) => { if (displayName.startsWith('factory')) { From 52672ce29640817d9215256402b625bce2492354 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:38:34 -0700 Subject: [PATCH 26/63] Update components/bank/forms/ibcSendForm.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- components/bank/forms/ibcSendForm.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 5f91be48..3cd3bd16 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -96,10 +96,10 @@ export default function IbcSendForm({ const [searchTerm, setSearchTerm] = useState(''); const [feeWarning, setFeeWarning] = useState(''); const { tx } = useTx( - selectedFromChain === env.osmosisTestnetChain ? env.osmosisTestnetChain : env.chain + selectedFromChain === env.osmosisChain ? env.osmosisChain : env.chain ); const { estimateFee } = useFeeEstimation( - selectedFromChain === env.osmosisTestnetChain ? env.osmosisTestnetChain : env.chain + selectedFromChain === env.osmosisChain ? env.osmosisChain : env.chain ); const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; const [isContactsOpen, setIsContactsOpen] = useState(false); From d7bcb839a147ae4a3b15eb36c26ea71da40c23be Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:38:50 -0700 Subject: [PATCH 27/63] Update components/bank/forms/ibcSendForm.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- components/bank/forms/ibcSendForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 3cd3bd16..ac1acda3 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -117,7 +117,7 @@ export default function IbcSendForm({ // Update the filtered balances logic to use passed props instead of hooks const filteredBalances = useMemo(() => { const sourceBalances = - selectedFromChain === env.osmosisTestnetChain ? osmosisBalances : balances; + selectedFromChain === env.osmosisChain ? osmosisBalances : balances; return sourceBalances?.filter(token => { const displayName = token.metadata?.display ?? token.denom; From 3e1c22fa11ec07fcd5fe7fe7121d6888b77188bf Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:39:42 -0700 Subject: [PATCH 28/63] Update components/bank/forms/ibcSendForm.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- components/bank/forms/ibcSendForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index ac1acda3..2816d4a6 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -128,7 +128,7 @@ export default function IbcSendForm({ // Update initialSelectedToken to consider the chain const initialSelectedToken = useMemo(() => { const sourceBalances = - selectedFromChain === env.osmosisTestnetChain ? osmosisBalances : balances; + selectedFromChain === env.osmosisChain ? osmosisBalances : balances; return ( sourceBalances?.find(token => token.coreDenom === selectedDenom) || From 38129b10cc21af8d74aed91ca60c6f196ecd8270 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:39:55 -0700 Subject: [PATCH 29/63] Update components/bank/forms/ibcSendForm.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- components/bank/forms/ibcSendForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 2816d4a6..c15c6778 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -139,7 +139,7 @@ export default function IbcSendForm({ // Update the loading check if ( - (selectedFromChain === env.osmosisTestnetChain + (selectedFromChain === env.osmosisChain ? isOsmosisBalancesLoading : isBalancesLoading) || !initialSelectedToken From 16da549bbf81faef782e0a4f5f6b41de40d3f3c1 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:40:18 -0700 Subject: [PATCH 30/63] Update components/bank/forms/ibcSendForm.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- components/bank/forms/ibcSendForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index c15c6778..add21c13 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -212,7 +212,7 @@ export default function IbcSendForm({ sourceChannel: source_channel, sender: admin ? admin - : selectedFromChain === env.osmosisTestnetChain + : selectedFromChain === env.osmosisChain ? (osmosisAddress ?? '') : (address ?? ''), receiver: values.recipient ?? '', From ed1b3ee056739641efd427e12e2f66ce4fed8c4d Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:40:35 -0700 Subject: [PATCH 31/63] Update components/bank/forms/ibcSendForm.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- components/bank/forms/ibcSendForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index add21c13..910290a7 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -242,7 +242,7 @@ export default function IbcSendForm({ : transferMsg; const fee = await estimateFee( - selectedFromChain === env.osmosisTestnetChain ? (osmosisAddress ?? '') : (address ?? ''), + selectedFromChain === env.osmosisChain ? (osmosisAddress ?? '') : (address ?? ''), [msg] ); From c748bc0c17504e4f02ec1308afbe62312961cadc Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:40:50 -0700 Subject: [PATCH 32/63] Update hooks/useLcdQueryClient.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- hooks/useLcdQueryClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooks/useLcdQueryClient.ts b/hooks/useLcdQueryClient.ts index 4c0774af..5bcde93b 100644 --- a/hooks/useLcdQueryClient.ts +++ b/hooks/useLcdQueryClient.ts @@ -22,7 +22,7 @@ export const useLcdQueryClient = () => { export const useOsmosisLcdQueryClient = () => { const lcdQueryClient = useQuery({ - queryKey: ['lcdQueryClientOsmosis', env.osmosisTestnetApiUrl], + queryKey: ['lcdQueryClientOsmosis', env.osmosisApiUrl], queryFn: () => createLcdQueryClient({ restEndpoint: env.osmosisTestnetApiUrl, From 3ff70b4cb601269a3d0c719bdfd5bf208266320a Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:41:09 -0700 Subject: [PATCH 33/63] Update hooks/useLcdQueryClient.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- hooks/useLcdQueryClient.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hooks/useLcdQueryClient.ts b/hooks/useLcdQueryClient.ts index 5bcde93b..510f3ff9 100644 --- a/hooks/useLcdQueryClient.ts +++ b/hooks/useLcdQueryClient.ts @@ -25,9 +25,9 @@ export const useOsmosisLcdQueryClient = () => { queryKey: ['lcdQueryClientOsmosis', env.osmosisApiUrl], queryFn: () => createLcdQueryClient({ - restEndpoint: env.osmosisTestnetApiUrl, + restEndpoint: env.osmosisApiUrl, }), - enabled: !!env.osmosisTestnetApiUrl, + enabled: !!env.osmosisApiUrl, staleTime: Infinity, }); From e50afae16adf1d3d9edff7a91aecfb15523a8589 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:41:19 -0700 Subject: [PATCH 34/63] Update hooks/useTx.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Félix C. Morency <1102868+fmorency@users.noreply.github.com> Signed-off-by: Joseph Chalabi <100090645+chalabi2@users.noreply.github.com> --- hooks/useTx.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooks/useTx.tsx b/hooks/useTx.tsx index 8b916029..b1810927 100644 --- a/hooks/useTx.tsx +++ b/hooks/useTx.tsx @@ -47,7 +47,7 @@ export const useTx = (chainName: string) => { const { setToastMessage } = useToast(); const [isSigning, setIsSigning] = useState(false); const explorerUrl = - chainName === env.osmosisTestnetChain ? env.osmosisTestnetExplorerUrl : env.explorerUrl; + chainName === env.osmosisChain ? env.osmosisExplorerUrl : env.explorerUrl; const tx = async (msgs: Msg[], options: TxOptions) => { if (!address) { From 891c4b675cc4f70ef9de3d295957253f1b9333e2 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 14 Jan 2025 12:46:49 -0700 Subject: [PATCH 35/63] chore: add transfer script instructions --- components/bank/forms/ibcSendForm.tsx | 14 ++++---------- package.json | 3 ++- pages/bank.tsx | 2 +- scripts/ibcTransferAll.ts | 5 ++++- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 910290a7..79ee0af2 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -95,9 +95,7 @@ export default function IbcSendForm({ const [isSending, setIsSending] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [feeWarning, setFeeWarning] = useState(''); - const { tx } = useTx( - selectedFromChain === env.osmosisChain ? env.osmosisChain : env.chain - ); + const { tx } = useTx(selectedFromChain === env.osmosisChain ? env.osmosisChain : env.chain); const { estimateFee } = useFeeEstimation( selectedFromChain === env.osmosisChain ? env.osmosisChain : env.chain ); @@ -116,8 +114,7 @@ export default function IbcSendForm({ // Update the filtered balances logic to use passed props instead of hooks const filteredBalances = useMemo(() => { - const sourceBalances = - selectedFromChain === env.osmosisChain ? osmosisBalances : balances; + const sourceBalances = selectedFromChain === env.osmosisChain ? osmosisBalances : balances; return sourceBalances?.filter(token => { const displayName = token.metadata?.display ?? token.denom; @@ -127,8 +124,7 @@ export default function IbcSendForm({ // Update initialSelectedToken to consider the chain const initialSelectedToken = useMemo(() => { - const sourceBalances = - selectedFromChain === env.osmosisChain ? osmosisBalances : balances; + const sourceBalances = selectedFromChain === env.osmosisChain ? osmosisBalances : balances; return ( sourceBalances?.find(token => token.coreDenom === selectedDenom) || @@ -139,9 +135,7 @@ export default function IbcSendForm({ // Update the loading check if ( - (selectedFromChain === env.osmosisChain - ? isOsmosisBalancesLoading - : isBalancesLoading) || + (selectedFromChain === env.osmosisChain ? isOsmosisBalancesLoading : isBalancesLoading) || !initialSelectedToken ) { return null; diff --git a/package.json b/package.json index d0d7f70b..febb42d8 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "update-deps": "bunx npm-check-updates --root --format group -i", "test:coverage": "bun test --coverage", "test:coverage:lcov": "bun run test:coverage --coverage-reporter=lcov --coverage-dir ./coverage", - "coverage:upload": "codecov" + "coverage:upload": "codecov", + "ibc-transfer": "tsx scripts/ibcTransferAll.ts" }, "author": "The Lifted Initiative", "license": "MIT", diff --git a/pages/bank.tsx b/pages/bank.tsx index 7d6f59fb..c89ccd2f 100644 --- a/pages/bank.tsx +++ b/pages/bank.tsx @@ -191,7 +191,7 @@ export default function Bank() { // Handle IBC tokens if (coreBalance.denom.startsWith('ibc/')) { - const assetInfo = denomToAsset(env.osmosisTestnetChain, coreBalance.denom); + const assetInfo = denomToAsset(env.osmosisChain, coreBalance.denom); const baseDenom = assetInfo?.traces?.[1]?.counterparty?.base_denom; diff --git a/scripts/ibcTransferAll.ts b/scripts/ibcTransferAll.ts index 73185a99..c87219c7 100644 --- a/scripts/ibcTransferAll.ts +++ b/scripts/ibcTransferAll.ts @@ -1,6 +1,9 @@ +// This script is used to transfer 1/6th of all IBC tokens (factory tokens included) from Manifest to Osmosis +// you can run this script by providing a mnemonic as an environment variable: `WALLET_MNEMONIC="..." bun run ibc-transfer` + import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; import { SigningStargateClient } from '@cosmjs/stargate'; -import { cosmos, ibc } from '@liftedinit/manifestjs'; + import { MsgTransfer } from '@liftedinit/manifestjs/dist/codegen/ibc/applications/transfer/v1/tx'; import axios from 'axios'; import * as fs from 'fs'; From 2cd2f92017858399d200b964672150ac19809e38 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 14 Jan 2025 12:49:55 -0700 Subject: [PATCH 36/63] chore: prettier --- hooks/useTx.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hooks/useTx.tsx b/hooks/useTx.tsx index b1810927..e87598f3 100644 --- a/hooks/useTx.tsx +++ b/hooks/useTx.tsx @@ -46,8 +46,7 @@ export const useTx = (chainName: string) => { const { address, getSigningStargateClient, estimateFee } = useChain(chainName); const { setToastMessage } = useToast(); const [isSigning, setIsSigning] = useState(false); - const explorerUrl = - chainName === env.osmosisChain ? env.osmosisExplorerUrl : env.explorerUrl; + const explorerUrl = chainName === env.osmosisChain ? env.osmosisExplorerUrl : env.explorerUrl; const tx = async (msgs: Msg[], options: TxOptions) => { if (!address) { From 5fef3a428286d2ba1cf6261a52f673bad404b0a9 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 14 Jan 2025 13:15:59 -0700 Subject: [PATCH 37/63] fix: fix form tests --- .../components/__tests__/sendBox.test.tsx | 66 ++++++++++++------- components/bank/components/sendBox.tsx | 4 +- .../bank/forms/__tests__/ibcSendForm.test.tsx | 13 ++-- components/bank/forms/ibcSendForm.tsx | 4 +- tests/mock.ts | 21 ++++++ tests/render.tsx | 4 +- 6 files changed, 78 insertions(+), 34 deletions(-) diff --git a/components/bank/components/__tests__/sendBox.test.tsx b/components/bank/components/__tests__/sendBox.test.tsx index 68531724..a4050395 100644 --- a/components/bank/components/__tests__/sendBox.test.tsx +++ b/components/bank/components/__tests__/sendBox.test.tsx @@ -1,7 +1,7 @@ import { test, expect, afterEach, describe, mock, jest } from 'bun:test'; import React from 'react'; import matchers from '@testing-library/jest-dom/matchers'; -import { screen, cleanup, waitFor, fireEvent } from '@testing-library/react'; +import { screen, cleanup, waitFor, fireEvent, within } from '@testing-library/react'; import SendBox from '@/components/bank/components/sendBox'; import { mockBalances } from '@/tests/mock'; import { renderWithChainProvider } from '@/tests/render'; @@ -17,6 +17,14 @@ mock.module('next/router', () => ({ }), })); +// Add this mock before your tests +mock.module('next/image', () => ({ + default: (props: any) => { + // eslint-disable-next-line @next/next/no-img-element + return {props.alt; + }, +})); + const renderWithProps = (props = {}) => { const defaultProps = { address: 'test_address', @@ -40,42 +48,56 @@ describe('SendBox', () => { test('toggles between Send and Cross-Chain Transfer', async () => { renderWithProps(); - expect(screen.getByText('Amount')).toBeInTheDocument(); + // Check initial send form + expect(screen.getByPlaceholderText('0.00')).toBeInTheDocument(); + expect(screen.queryByLabelText('to-chain-selector')).not.toBeInTheDocument(); - fireEvent.click(screen.getByText('Cross-Chain Transfer')); - await waitFor(() => expect(screen.getByText('Chain')).toBeInTheDocument()); - }); + // Switch to cross-chain transfer + fireEvent.click(screen.getByLabelText('cross-chain-transfer-tab')); - test('displays chain selection dropdown when in Cross-Chain Transfer mode', async () => { - renderWithProps(); - fireEvent.click(screen.getByText('Cross-Chain Transfer')); - await waitFor(() => expect(screen.getByText('Chain')).toBeInTheDocument()); + // Verify cross-chain elements are present + await waitFor(() => { + expect(screen.getByLabelText('from-chain-selector')).toBeInTheDocument(); + expect(screen.getByLabelText('to-chain-selector')).toBeInTheDocument(); + }); }); - test('selects a chain in Cross-Chain Transfer mode', async () => { + test('displays chain selection dropdowns in Cross-Chain Transfer mode', async () => { renderWithProps(); - const crossChainBtn = screen.getByLabelText('cross-chain-transfer-tab'); - fireEvent.click(crossChainBtn); + fireEvent.click(screen.getByLabelText('cross-chain-transfer-tab')); await waitFor(() => { - const chainSelector = screen.getByLabelText('chain-selector'); - expect(chainSelector).toBeTruthy(); + expect(screen.getByLabelText('from-chain-selector')).toBeInTheDocument(); + expect(screen.getByLabelText('to-chain-selector')).toBeInTheDocument(); }); + }); - const chainSelector = screen.getByLabelText('chain-selector'); - fireEvent.click(chainSelector); + test('selects chains in Cross-Chain Transfer mode', async () => { + renderWithProps(); + fireEvent.click(screen.getByLabelText('cross-chain-transfer-tab')); + // Select destination chain await waitFor(() => { - const osmosisOption = screen.getByText('Osmosis'); - expect(osmosisOption).toBeTruthy(); + const toChainSelector = screen.getByLabelText('to-chain-selector'); + expect(toChainSelector).toBeInTheDocument(); + fireEvent.click(toChainSelector); }); - const osmosisOption = screen.getByText('Osmosis'); - fireEvent.click(osmosisOption); + // Select Osmosis as destination + await waitFor(() => { + const toChainDropdown = screen.getByLabelText('to-chain-selector').closest('.dropdown'); + expect(toChainDropdown).toBeInTheDocument(); + + // Find and click the Osmosis option within the dropdown + const osmosisOption = within(toChainDropdown!).getByText('Osmosis'); + fireEvent.click(osmosisOption); + }); + // Verify selection using text content instead of complex matchers await waitFor(() => { - const updatedChainSelector = screen.getByLabelText('chain-selector'); - expect(updatedChainSelector.textContent).toContain('Osmosis'); + const selectedChain = screen.getByLabelText('to-chain-selector'); + const chainText = selectedChain.textContent; + expect(chainText?.includes('Osmosis')).toBe(true); }); }); }); diff --git a/components/bank/components/sendBox.tsx b/components/bank/components/sendBox.tsx index b3e49e5c..8668ba34 100644 --- a/components/bank/components/sendBox.tsx +++ b/components/bank/components/sendBox.tsx @@ -48,13 +48,13 @@ export default function SendBox({ { id: env.chain, name: 'Manifest', - icon: '/logo.svg', + icon: 'logo.svg', prefix: 'manifest', }, { id: env.osmosisChain, name: 'Osmosis', - icon: '/osmosis.svg', + icon: 'osmosis.svg', prefix: 'osmo', }, ], diff --git a/components/bank/forms/__tests__/ibcSendForm.test.tsx b/components/bank/forms/__tests__/ibcSendForm.test.tsx index 7941702e..f8e76a43 100644 --- a/components/bank/forms/__tests__/ibcSendForm.test.tsx +++ b/components/bank/forms/__tests__/ibcSendForm.test.tsx @@ -19,7 +19,7 @@ mock.module('next/router', () => ({ function renderWithProps(props = {}) { const defaultProps = { address: 'manifest1address', - destinationChain: 'osmosis', + destinationChain: 'osmosistestnet', balances: mockBalances, isBalancesLoading: false, refetchBalances: jest.fn(), @@ -27,13 +27,13 @@ function renderWithProps(props = {}) { setIsIbcTransfer: jest.fn(), ibcChains: [ { - id: 'osmosis', + id: 'osmosistestnet', name: 'Osmosis', icon: 'https://osmosis.zone/assets/icons/osmo-logo-icon.svg', prefix: 'osmo', }, ], - selectedChain: 'osmosis', + selectedChain: 'osmosistestnet', setSelectedChain: jest.fn(), }; @@ -45,9 +45,10 @@ describe('IbcSendForm Component', () => { test('renders form with correct details', () => { renderWithProps(); + expect(screen.getByText('From Chain')).toBeInTheDocument(); + expect(screen.getByText('To Chain')).toBeInTheDocument(); expect(screen.getByText('Amount')).toBeInTheDocument(); expect(screen.getByText('Send To')).toBeInTheDocument(); - expect(screen.getByText('Chain')).toBeInTheDocument(); }); test('empty balances', async () => { @@ -73,9 +74,9 @@ describe('IbcSendForm Component', () => { test('updates chain selector correctly', () => { renderWithProps(); - const chainSelector = screen.getByLabelText('chain-selector'); + const chainSelector = screen.getByRole('combobox', { name: 'to-chain-selector' }); fireEvent.click(chainSelector); - expect(chainSelector).toHaveTextContent('Osmosis'); + expect(screen.getByText('Osmosis')).toBeInTheDocument(); }); test('updates amount input correctly', () => { diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 79ee0af2..6002d543 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -446,13 +446,13 @@ export default function IbcSendForm({
    From a47b3d285bf7eb9e729b8d1f60056c0a3580ec17 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 14 Jan 2025 14:14:00 -0700 Subject: [PATCH 42/63] fix: proper module mock path for ibcSendForm in sendbox test --- .../components/__tests__/sendBox.test.tsx | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/components/bank/components/__tests__/sendBox.test.tsx b/components/bank/components/__tests__/sendBox.test.tsx index d7c10527..455e3333 100644 --- a/components/bank/components/__tests__/sendBox.test.tsx +++ b/components/bank/components/__tests__/sendBox.test.tsx @@ -26,7 +26,7 @@ mock.module('next/image', () => ({ })); // Add this mock at the top of your test file -mock.module('../forms/ibcSendForm', () => ({ +mock.module('@/components/bank/forms/ibcSendForm', () => ({ default: (props: any) => { return (
    @@ -81,26 +81,19 @@ describe('SendBox', () => { fireEvent.click(screen.getByLabelText('cross-chain-transfer-tab')); // Verify cross-chain elements are present - await waitFor( - () => { - expect(screen.getByLabelText('from-chain-selector')).toBeInTheDocument(); - expect(screen.getByLabelText('to-chain-selector')).toBeInTheDocument(); - }, - { timeout: 2000 } - ); + await waitFor(() => { + expect(screen.getByLabelText('from-chain-selector')).toBeInTheDocument(); + expect(screen.getByLabelText('to-chain-selector')).toBeInTheDocument(); + }); }); - test( - 'displays chain selection dropdowns in Cross-Chain Transfer mode', - async () => { - renderWithProps(); - fireEvent.click(screen.getByLabelText('cross-chain-transfer-tab')); + test('displays chain selection dropdowns in Cross-Chain Transfer mode', async () => { + renderWithProps(); + fireEvent.click(screen.getByLabelText('cross-chain-transfer-tab')); - await waitFor(() => { - expect(screen.getByLabelText('from-chain-selector')).toBeInTheDocument(); - expect(screen.getByLabelText('to-chain-selector')).toBeInTheDocument(); - }); - }, - { timeout: 2000 } - ); + await waitFor(() => { + expect(screen.getByLabelText('from-chain-selector')).toBeInTheDocument(); + expect(screen.getByLabelText('to-chain-selector')).toBeInTheDocument(); + }); + }); }); From c09f5a51ef706b50fe1ac70da1dafa7b9fb1596d Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Thu, 30 Jan 2025 22:53:58 -0700 Subject: [PATCH 43/63] add skip go --- components/bank/forms/ibcSendForm.tsx | 5 ++ contexts/skipGoContext.tsx | 29 +++++++++++ pages/_app.tsx | 71 ++++++++++++++------------- 3 files changed, 71 insertions(+), 34 deletions(-) create mode 100644 contexts/skipGoContext.tsx diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 6002d543..d015f930 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -33,6 +33,7 @@ import env from '@/config/env'; import { useChain } from '@cosmos-kit/react'; import { useSearchParams } from 'next/navigation'; import { Any } from 'cosmjs-types/google/protobuf/any'; +import { useSkipClient } from '@/contexts/skipGoContext'; //TODO: switch to main-net names export default function IbcSendForm({ @@ -99,6 +100,7 @@ export default function IbcSendForm({ const { estimateFee } = useFeeEstimation( selectedFromChain === env.osmosisChain ? env.osmosisChain : env.chain ); + const skipClient = useSkipClient(); const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; const [isContactsOpen, setIsContactsOpen] = useState(false); const [isIconRotated, setIsIconRotated] = useState(false); @@ -193,6 +195,9 @@ export default function IbcSendForm({ const { source_port, source_channel } = getIbcInfo(selectedFromChain, selectedToChain); + const testnetChains = await skipClient.chains({}); + + console.log(testnetChains); const token = { denom: values.selectedToken.coreDenom, amount: amountInBaseUnits, diff --git a/contexts/skipGoContext.tsx b/contexts/skipGoContext.tsx new file mode 100644 index 00000000..2cae678b --- /dev/null +++ b/contexts/skipGoContext.tsx @@ -0,0 +1,29 @@ +import React, { createContext, useContext } from 'react'; +import { SkipClient } from '@skip-go/client'; + +// Create the context +interface SkipContextType { + skipClient: SkipClient; +} + +const SkipContext = createContext(undefined); + +// Create the provider component +interface SkipProviderProps { + children: React.ReactNode; +} + +export function SkipProvider({ children }: SkipProviderProps) { + const skipClient = new SkipClient({}); + + return {children}; +} + +// Create a custom hook to use the Skip client +export function useSkipClient() { + const context = useContext(SkipContext); + if (context === undefined) { + throw new Error('useSkipClient must be used within a SkipProvider'); + } + return context.skipClient; +} diff --git a/pages/_app.tsx b/pages/_app.tsx index 068650de..2529507a 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -44,7 +44,8 @@ import { import MobileNav from '@/components/react/mobileNav'; import { OPENLOGIN_NETWORK_TYPE } from '@toruslabs/openlogin-utils'; -import { AssetList } from '@chain-registry/types'; + +import { SkipProvider } from '@/contexts/skipGoContext'; type ManifestAppProps = AppProps & { Component: AppProps['Component']; @@ -225,43 +226,45 @@ function ManifestApp({ Component, pageProps }: ManifestAppProps) { // @ts-ignore walletModal={TailwindModal} > - - -
    -
    - -
    + + + +
    +
    + +
    -
    -
    - +
    +
    + +
    +
    + +
    -
    - -
    -
    - {/* Web3auth signing modal */} - {isBrowser && - createPortal( - web3AuthPrompt?.resolve(false)} - data={web3AuthPrompt?.signData ?? ({} as SignData)} - approve={() => web3AuthPrompt?.resolve(true)} - reject={() => web3AuthPrompt?.resolve(false)} - />, - document.body - )} - - + {/* Web3auth signing modal */} + {isBrowser && + createPortal( + web3AuthPrompt?.resolve(false)} + data={web3AuthPrompt?.signData ?? ({} as SignData)} + approve={() => web3AuthPrompt?.resolve(true)} + reject={() => web3AuthPrompt?.resolve(false)} + />, + document.body + )} + + + } From 8b410498c743af0736931c634041e3ced525ce21 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Thu, 30 Jan 2025 23:21:53 -0700 Subject: [PATCH 44/63] check chain tier when rendering cross chain transfers --- components/bank/components/sendBox.tsx | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/components/bank/components/sendBox.tsx b/components/bank/components/sendBox.tsx index 8668ba34..feca0257 100644 --- a/components/bank/components/sendBox.tsx +++ b/components/bank/components/sendBox.tsx @@ -87,17 +87,19 @@ export default function SendBox({ > Send - + {env.chainTier === 'testnet' && ( + + )}
    @@ -105,7 +107,7 @@ export default function SendBox({
    ) : ( <> - {activeTab === 'cross-chain' ? ( + {activeTab === 'cross-chain' && env.chainTier === 'testnet' ? ( Date: Sat, 1 Feb 2025 20:13:17 -0700 Subject: [PATCH 45/63] add skip routes and messages --- bun.lockb | Bin 544188 -> 601940 bytes components/bank/components/sendBox.tsx | 21 +- components/bank/components/tokenList.tsx | 4 + components/bank/forms/ibcSendForm.tsx | 234 ++++++++++++++--------- components/bank/modals/sendModal.tsx | 3 + package.json | 1 + pages/bank.tsx | 27 ++- utils/ibc.ts | 10 +- 8 files changed, 193 insertions(+), 107 deletions(-) diff --git a/bun.lockb b/bun.lockb index db2f05581bc4f24407d24fa4e73e971f64254333..eeb222942dbdfa81161700fcbf99be0aff1d23b8 100755 GIT binary patch delta 138547 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 $?tBV!i=6ml!_MECSlY>svqt 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 HKZR^BqbLIRO-jq|&Q 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 Ue+?L>lE)3Z9yPs!S_c^Z2aMGE`~Uy| diff --git a/components/bank/components/sendBox.tsx b/components/bank/components/sendBox.tsx index feca0257..81076941 100644 --- a/components/bank/components/sendBox.tsx +++ b/components/bank/components/sendBox.tsx @@ -3,6 +3,7 @@ import SendForm from '../forms/sendForm'; import IbcSendForm from '../forms/ibcSendForm'; import env from '@/config/env'; import { CombinedBalanceInfo } from '@/utils/types'; +import { ChainContext } from '@cosmos-kit/core'; export interface IbcChain { id: string; @@ -25,6 +26,7 @@ export default function SendBox({ isOsmosisBalancesLoading, refetchOsmosisBalances, resolveOsmosisRefetch, + chains, }: { address: string; balances: CombinedBalanceInfo[]; @@ -39,10 +41,8 @@ export default function SendBox({ isOsmosisBalancesLoading: boolean; refetchOsmosisBalances: () => void; resolveOsmosisRefetch: () => void; + chains: Record; }) { - const [activeTab, setActiveTab] = useState<'send' | 'cross-chain'>('send'); - const [selectedFromChain, setSelectedFromChain] = useState(''); - const [selectedToChain, setSelectedToChain] = useState(''); const ibcChains = useMemo( () => [ { @@ -50,27 +50,34 @@ export default function SendBox({ name: 'Manifest', icon: 'logo.svg', prefix: 'manifest', + chainID: env.chainId, }, { id: env.osmosisChain, name: 'Osmosis', icon: 'osmosis.svg', prefix: 'osmo', + chainID: env.osmosisChainId, }, ], [] ); + const [activeTab, setActiveTab] = useState<'send' | 'cross-chain'>('send'); + const [selectedFromChain, setSelectedFromChain] = useState(ibcChains[0]); + const [selectedToChain, setSelectedToChain] = useState(ibcChains[1]); useEffect(() => { - if (selectedFromChain && selectedToChain && selectedFromChain === selectedToChain) { + if (selectedFromChain && selectedToChain && selectedFromChain.id === selectedToChain.id) { // If chains match, switch the destination chain to the other available chain - const otherChain = ibcChains.find(chain => chain.id !== selectedFromChain)?.id || ''; - setSelectedToChain(otherChain); + const otherChain = ibcChains.find(chain => chain.id !== selectedFromChain.id); + if (otherChain) { + setSelectedToChain(otherChain); + } } }, [selectedFromChain, selectedToChain, ibcChains]); const getAvailableToChains = useMemo(() => { - return ibcChains.filter(chain => chain.id !== selectedFromChain); + return ibcChains.filter(chain => chain.id !== selectedFromChain.id); }, [ibcChains, selectedFromChain]); return ( diff --git a/components/bank/components/tokenList.tsx b/components/bank/components/tokenList.tsx index 78190e9a..2f1ffdd2 100644 --- a/components/bank/components/tokenList.tsx +++ b/components/bank/components/tokenList.tsx @@ -4,6 +4,7 @@ import { shiftDigits, truncateString } from '@/utils'; import { CombinedBalanceInfo } from '@/utils/types'; import { SendTxIcon, QuestionIcon } from '@/components/icons'; import SendModal from '@/components/bank/modals/sendModal'; +import { ChainContext } from '@cosmos-kit/core'; interface TokenListProps { balances: CombinedBalanceInfo[] | undefined; @@ -20,6 +21,7 @@ interface TokenListProps { isOsmosisBalancesLoading?: boolean; refetchOsmosisBalances?: () => void; resolveOsmosisRefetch?: () => void; + chains: Record; } export function TokenList(props: Readonly) { @@ -38,6 +40,7 @@ export function TokenList(props: Readonly) { isOsmosisBalancesLoading, refetchOsmosisBalances, resolveOsmosisRefetch, + chains, } = props; const [selectedDenom, setSelectedDenom] = useState(null); const [isSendModalOpen, setIsSendModalOpen] = useState(false); @@ -252,6 +255,7 @@ export function TokenList(props: Readonly) { isOsmosisBalancesLoading={isOsmosisBalancesLoading ?? false} refetchOsmosisBalances={refetchOsmosisBalances ?? (() => {})} resolveOsmosisRefetch={resolveOsmosisRefetch ?? (() => {})} + chains={chains} />
    ); diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index d015f930..fb3864f6 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -24,16 +24,19 @@ import { DenomImage } from '@/components/factory'; import { Formik, Form } from 'formik'; import Yup from '@/utils/yupExtensions'; import { TextInput } from '@/components/react/inputs'; -import { IbcChain } from '@/components'; + import Image from 'next/image'; import { SearchIcon, TransferIcon } from '@/components/icons'; import { TailwindModal } from '@/components/react/modal'; import env from '@/config/env'; -import { useChain } from '@cosmos-kit/react'; +import { useChains } from '@cosmos-kit/react'; import { useSearchParams } from 'next/navigation'; import { Any } from 'cosmjs-types/google/protobuf/any'; import { useSkipClient } from '@/contexts/skipGoContext'; +import { SkipClient } from '@skip-go/client'; +import { IbcChain } from '@/components'; +import { ChainContext } from '@cosmos-kit/core'; //TODO: switch to main-net names export default function IbcSendForm({ @@ -58,9 +61,10 @@ export default function IbcSendForm({ refetchProposals, admin, availableToChains, + chains, }: Readonly<{ address: string; - destinationChain: string; + destinationChain: IbcChain; balances: CombinedBalanceInfo[]; isBalancesLoading: boolean; refetchBalances: () => void; @@ -68,10 +72,10 @@ export default function IbcSendForm({ isIbcTransfer: boolean; ibcChains: IbcChain[]; isGroup?: boolean; - selectedFromChain: string; - setSelectedFromChain: (selectedChain: string) => void; - selectedToChain: string; - setSelectedToChain: (selectedChain: string) => void; + selectedFromChain: IbcChain; + setSelectedFromChain: (selectedChain: IbcChain) => void; + selectedToChain: IbcChain; + setSelectedToChain: (selectedChain: IbcChain) => void; selectedDenom?: string; osmosisBalances: CombinedBalanceInfo[]; isOsmosisBalancesLoading: boolean; @@ -80,9 +84,8 @@ export default function IbcSendForm({ refetchProposals?: () => void; admin?: string; availableToChains: IbcChain[]; + chains: Record; }>) { - const { address: osmosisAddress } = useChain(env.osmosisChain); - const formatTokenDisplayName = (displayName: string) => { if (displayName.startsWith('factory')) { return displayName.split('/').pop()?.toUpperCase(); @@ -96,19 +99,21 @@ export default function IbcSendForm({ const [isSending, setIsSending] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [feeWarning, setFeeWarning] = useState(''); - const { tx } = useTx(selectedFromChain === env.osmosisChain ? env.osmosisChain : env.chain); + const { tx } = useTx(selectedFromChain.name === env.osmosisChain ? env.osmosisChain : env.chain); const { estimateFee } = useFeeEstimation( - selectedFromChain === env.osmosisChain ? env.osmosisChain : env.chain + selectedFromChain.name === env.osmosisChain ? env.osmosisChain : env.chain ); - const skipClient = useSkipClient(); + const { transfer } = ibc.applications.transfer.v1.MessageComposer.withTypeUrl; const [isContactsOpen, setIsContactsOpen] = useState(false); const [isIconRotated, setIsIconRotated] = useState(false); + const skipClient = new SkipClient({}); + const { submitProposal } = cosmos.group.v1.MessageComposer.withTypeUrl; useEffect(() => { if (isGroup) { - setSelectedFromChain(env.chain); + setSelectedFromChain(ibcChains.find(chain => chain.id === env.chain) ?? ibcChains[0]); } }, [isGroup, setSelectedFromChain]); @@ -116,7 +121,7 @@ export default function IbcSendForm({ // Update the filtered balances logic to use passed props instead of hooks const filteredBalances = useMemo(() => { - const sourceBalances = selectedFromChain === env.osmosisChain ? osmosisBalances : balances; + const sourceBalances = selectedFromChain.name === env.osmosisChain ? osmosisBalances : balances; return sourceBalances?.filter(token => { const displayName = token.metadata?.display ?? token.denom; @@ -126,7 +131,7 @@ export default function IbcSendForm({ // Update initialSelectedToken to consider the chain const initialSelectedToken = useMemo(() => { - const sourceBalances = selectedFromChain === env.osmosisChain ? osmosisBalances : balances; + const sourceBalances = selectedFromChain.name === env.osmosisChain ? osmosisBalances : balances; return ( sourceBalances?.find(token => token.coreDenom === selectedDenom) || @@ -137,7 +142,7 @@ export default function IbcSendForm({ // Update the loading check if ( - (selectedFromChain === env.osmosisChain ? isOsmosisBalancesLoading : isBalancesLoading) || + (selectedFromChain.name === env.osmosisChain ? isOsmosisBalancesLoading : isBalancesLoading) || !initialSelectedToken ) { return null; @@ -193,11 +198,13 @@ export default function IbcSendForm({ const exponent = values.selectedToken.metadata?.denom_units[1]?.exponent ?? 6; const amountInBaseUnits = parseNumberToBigInt(values.amount, exponent).toString(); - const { source_port, source_channel } = getIbcInfo(selectedFromChain, selectedToChain); + const { source_port, source_channel } = getIbcInfo(selectedFromChain.id, selectedToChain.id); - const testnetChains = await skipClient.chains({}); + const skipChains = await skipClient.chains({ + onlyTestnets: true, + }); + console.log('Available Skip chains:', skipChains); - console.log(testnetChains); const token = { denom: values.selectedToken.coreDenom, amount: amountInBaseUnits, @@ -206,56 +213,99 @@ export default function IbcSendForm({ const stamp = Date.now(); const timeoutInNanos = (stamp + 1.2e6) * 1e6; - const transferMsg = transfer({ - sourcePort: source_port, - sourceChannel: source_channel, - sender: admin - ? admin - : selectedFromChain === env.osmosisChain - ? (osmosisAddress ?? '') - : (address ?? ''), - receiver: values.recipient ?? '', - token, - timeoutHeight: { - revisionNumber: BigInt(0), - revisionHeight: BigInt(0), - }, - timeoutTimestamp: BigInt(timeoutInNanos), + const ibcDenom = getIbcDenom(selectedToChain.name, values.selectedToken.coreDenom); + + console.log({ + fromChain: selectedFromChain, + toChain: selectedToChain, + sourceDenom: values.selectedToken.coreDenom, + ibcDenom, + }); + + const route = await skipClient.route({ + amountIn: amountInBaseUnits, + sourceAssetDenom: values.selectedToken.coreDenom, + sourceAssetChainID: 'manifest-ledger-testnet', + destAssetDenom: ibcDenom ?? values.selectedToken.coreDenom, + destAssetChainID: 'osmo-test-5', + cumulativeAffiliateFeeBPS: '0', }); - const msg = isGroup - ? submitProposal({ - groupPolicyAddress: admin!, - messages: [ - Any.fromPartial({ - typeUrl: MsgTransfer.typeUrl, - value: MsgTransfer.encode(transferMsg.value).finish(), - }), - ], - metadata: '', - proposers: [address], - title: `IBC Transfer`, - summary: `This proposal will send ${values.amount} ${values.selectedToken.metadata?.display} to ${values.recipient} via IBC transfer`, - exec: 0, - }) - : transferMsg; - - const fee = await estimateFee( - selectedFromChain === env.osmosisChain ? (osmosisAddress ?? '') : (address ?? ''), - [msg] - ); - - await tx([msg], { - memo: values.memo, - fee, - onSuccess: () => { - refetchBalances(); - refetchHistory(); - refetchOsmosisBalances(); - resolveOsmosisRefetch(); - refetchProposals?.(); - }, + const userAddresses = route.requiredChainAddresses.map(chainID => ({ + address: + Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', + })); + console.log(userAddresses); + + // Log the validation result + + await skipClient.messages({ + sourceAssetDenom: values.selectedToken.coreDenom, + sourceAssetChainID: selectedFromChain.id, + destAssetDenom: ibcDenom ?? values.selectedToken.coreDenom, + destAssetChainID: selectedToChain.id, + amountIn: amountInBaseUnits, + amountOut: route.estimatedAmountOut ?? '', + addressList: userAddresses.map(user => user.address), + operations: route.operations, + estimatedAmountOut: route.estimatedAmountOut ?? '', + slippageTolerancePercent: '1', + affiliates: [], + chainIDsToAffiliates: {}, + postRouteHandler: undefined, + enableGasWarnings: false, }); + + console.log('skipClient.messages', skipClient.messages); + + // const transferMsg = transfer({ + // sourcePort: source_port, + // sourceChannel: source_channel, + // sender: admin + // ? admin + // : selectedFromChain === env.osmosisChain + // ? (osmosisAddress ?? '') + // : (address ?? ''), + // receiver: values.recipient ?? '', + // token, + // timeoutHeight: { + // revisionNumber: BigInt(0), + // revisionHeight: BigInt(0), + // }, + // timeoutTimestamp: BigInt(timeoutInNanos), + // }); + + // const msg = submitProposal({ + // groupPolicyAddress: admin!, + // messages: [ + // Any.fromPartial({ + // typeUrl: MsgTransfer.typeUrl, + // value: MsgTransfer.encode(transferMsg.value).finish(), + // }), + // ], + // metadata: '', + // proposers: [address], + // title: `IBC Transfer`, + // summary: `This proposal will send ${values.amount} ${values.selectedToken.metadata?.display} to ${values.recipient} via IBC transfer`, + // exec: 0, + // }); + + // const fee = await estimateFee( + // selectedFromChain === env.osmosisChain ? (osmosisAddress ?? '') : (address ?? ''), + // [msg] + // ); + + // await tx([msg], { + // memo: values.memo, + // fee, + // onSuccess: () => { + // refetchBalances(); + // refetchHistory(); + // refetchOsmosisBalances(); + // resolveOsmosisRefetch(); + // refetchProposals?.(); + // }, + // }); } catch (error) { console.error('Error during sending:', error); } finally { @@ -331,12 +381,12 @@ export default function IbcSendForm({ {selectedFromChain && ( chain.id === selectedFromChain)?.icon || - '' + ibcChains.find(chain => chain.id === selectedFromChain.id) + ?.icon || '' } alt={ - ibcChains.find(chain => chain.id === selectedFromChain)?.name || - '' + ibcChains.find(chain => chain.id === selectedFromChain.id) + ?.name || '' } width={24} height={24} @@ -344,7 +394,7 @@ export default function IbcSendForm({ /> )} - {ibcChains.find(chain => chain.id === selectedFromChain)?.name ?? + {ibcChains.find(chain => chain.id === selectedFromChain.id)?.name ?? 'Select Chain'} @@ -361,14 +411,14 @@ export default function IbcSendForm({
  • { - if (chain.id === selectedFromChain) { + if (chain.id === selectedFromChain.id) { return; } - setSelectedFromChain(chain.id); + setSelectedFromChain(chain); // Get the dropdown element and remove focus const dropdown = (e.target as HTMLElement).closest('.dropdown'); if (dropdown) { @@ -380,10 +430,10 @@ export default function IbcSendForm({ onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); - if (chain.id === selectedFromChain) { + if (chain.id === selectedFromChain.id) { return; } - setSelectedFromChain(chain.id); + setSelectedFromChain(chain); // Get the dropdown element and remove focus const dropdown = (e.target as HTMLElement).closest('.dropdown'); if (dropdown) { @@ -395,12 +445,12 @@ export default function IbcSendForm({ }} tabIndex={0} className={`flex items-center ${ - chain.id === selectedFromChain + chain.id === selectedFromChain.id ? 'opacity-50 cursor-not-allowed' : '' }`} style={ - chain.id === selectedFromChain + chain.id === selectedFromChain.id ? { pointerEvents: 'none' } : undefined } @@ -462,15 +512,19 @@ export default function IbcSendForm({ {selectedToChain && ( chain.id === selectedToChain)?.icon || ''} - alt={ibcChains.find(chain => chain.id === selectedToChain)?.name || ''} + src={ + ibcChains.find(chain => chain.id === selectedToChain.id)?.icon || '' + } + alt={ + ibcChains.find(chain => chain.id === selectedToChain.id)?.name || '' + } width={24} height={24} className="mr-2" /> )} - {ibcChains.find(chain => chain.id === selectedToChain)?.name ?? + {ibcChains.find(chain => chain.id === selectedToChain.id)?.name ?? 'Select Chain'} @@ -484,13 +538,17 @@ export default function IbcSendForm({ className="dropdown-content z-[100] menu p-2 shadow bg-base-300 rounded-lg w-full mt-1 dark:text-[#FFFFFF] text-[#161616]" > {availableToChains?.map(chain => ( -
  • +
  • { - if (chain.id === selectedToChain) { + if (chain.id === selectedToChain.id) { return; } - setSelectedToChain(chain.id); + setSelectedToChain(chain); // Get the dropdown element and remove focus const dropdown = (e.target as HTMLElement).closest('.dropdown'); if (dropdown) { @@ -502,10 +560,10 @@ export default function IbcSendForm({ onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); - if (chain.id === selectedToChain) { + if (chain.id === selectedToChain.id) { return; } - setSelectedToChain(chain.id); + setSelectedToChain(chain); // Get the dropdown element and remove focus const dropdown = (e.target as HTMLElement).closest('.dropdown'); if (dropdown) { @@ -517,10 +575,10 @@ export default function IbcSendForm({ }} tabIndex={0} className={`flex items-center ${ - chain.id === selectedToChain ? 'opacity-50 cursor-not-allowed' : '' + chain.id === selectedToChain.id ? 'opacity-50 cursor-not-allowed' : '' }`} style={ - chain.id === selectedToChain ? { pointerEvents: 'none' } : undefined + chain.id === selectedToChain.id ? { pointerEvents: 'none' } : undefined } aria-label={chain.name} > diff --git a/components/bank/modals/sendModal.tsx b/components/bank/modals/sendModal.tsx index eb7f14f0..005d147c 100644 --- a/components/bank/modals/sendModal.tsx +++ b/components/bank/modals/sendModal.tsx @@ -3,6 +3,7 @@ import SendBox from '../components/sendBox'; import { CombinedBalanceInfo } from '@/utils/types'; import { useEffect } from 'react'; import { createPortal } from 'react-dom'; +import { ChainContext } from '@cosmos-kit/core'; interface SendModalProps { modalId: string; @@ -21,6 +22,7 @@ interface SendModalProps { isOsmosisBalancesLoading: boolean; refetchOsmosisBalances: () => void; resolveOsmosisRefetch: () => void; + chains: Record; } export default function SendModal({ @@ -40,6 +42,7 @@ export default function SendModal({ isOsmosisBalancesLoading, refetchOsmosisBalances, resolveOsmosisRefetch, + chains, }: SendModalProps) { const handleClose = () => { if (setOpen) { diff --git a/package.json b/package.json index febb42d8..7e04d7c9 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@liftedinit/manifestjs": "0.0.1-rc.1", "@react-three/drei": "^9.114.0", "@react-three/fiber": "^8.17.8", + "@skip-go/client": "^0.16.7", "@tanstack/react-query": "^5.55.0", "@tanstack/react-query-devtools": "^5.55.0", "@types/file-saver": "^2.0.7", diff --git a/pages/bank.tsx b/pages/bank.tsx index c89ccd2f..97c20b76 100644 --- a/pages/bank.tsx +++ b/pages/bank.tsx @@ -10,7 +10,7 @@ import { useTokenBalancesResolved, useTokenFactoryDenomsMetadata, } from '@/hooks'; -import { useChain } from '@cosmos-kit/react'; +import { useChain, useChains } from '@cosmos-kit/react'; import React, { useMemo, useState, useCallback, useEffect } from 'react'; import { BankIcon } from '@/components/icons'; @@ -29,13 +29,20 @@ interface PageSizeConfig { } export default function Bank() { - const { address, isWalletConnected } = useChain(env.chain); - const { balances, isBalancesLoading, refetchBalances } = useTokenBalances(address ?? ''); + const chains = useChains([env.chain, env.osmosisChain]); + const isWalletConnected = Object.values(chains).every(chain => chain.isWalletConnected); + if (!isWalletConnected) { + Object.values(chains).forEach(chain => chain.connect()); + } + + const { balances, isBalancesLoading, refetchBalances } = useTokenBalances( + chains.manifesttestnet.address ?? '' + ); const { balances: resolvedBalances, isBalancesLoading: resolvedLoading, refetchBalances: resolveRefetch, - } = useTokenBalancesResolved(address ?? ''); + } = useTokenBalancesResolved(chains.manifesttestnet.address ?? ''); const { metadatas, isMetadatasLoading } = useTokenFactoryDenomsMetadata(); const [currentPage, setCurrentPage] = useState(1); @@ -86,7 +93,7 @@ export default function Bank() { refetch: refetchHistory, } = useGetFilteredTxAndSuccessfulProposals( env.indexerUrl, - address ?? '', + chains.manifesttestnet.address ?? '', currentPage, historyPageSize ); @@ -155,17 +162,16 @@ export default function Bank() { return mfxCombinedBalance ? [mfxCombinedBalance, ...otherBalances] : otherBalances; }, [balances, resolvedBalances, metadatas]); - const { address: osmosisAddress } = useChain(env.osmosisChain); const { balances: osmosisBalances, isBalancesLoading: isOsmosisBalancesLoading, refetchBalances: refetchOsmosisBalances, - } = useTokenBalancesOsmosis(osmosisAddress ?? ''); + } = useTokenBalancesOsmosis(chains.osmosistestnet.address ?? ''); const { balances: resolvedOsmosisBalances, isBalancesLoading: resolvedOsmosisLoading, refetchBalances: resolveOsmosisRefetch, - } = useOsmosisTokenBalancesResolved(osmosisAddress ?? ''); + } = useOsmosisTokenBalancesResolved(chains.osmosistestnet.address ?? ''); const { metadatas: osmosisMetadatas, @@ -308,9 +314,10 @@ export default function Bank() { isLoading={isLoading} balances={combinedBalances} refetchHistory={refetchHistory} - address={address ?? ''} + address={chains.manifesttestnet.address ?? ''} pageSize={tokenListPageSize} searchTerm={searchTerm} + chains={chains} /> ))} {activeTab === 'history' && @@ -320,7 +327,7 @@ export default function Bank() { { }; export const getIbcDenom = (chainName: string, denom: string) => { - const asset = denomToAsset(chainName, denom); - return asset?.base; + const allAssets = getAllAssets(chainName); + + // Find the asset that has this denom as its counterparty base_denom + const ibcAsset = allAssets.find(asset => asset.traces?.[0]?.counterparty?.base_denom === denom); + + // Return the IBC hash (base) if found + return ibcAsset?.base; }; export const normalizeIBCDenom = (chainName: string, denom: string) => { From a26855dd2f7dc9501ef8b07459f5e113db94bf4a Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Sat, 1 Feb 2025 20:23:42 -0700 Subject: [PATCH 46/63] add skip routes and messages --- components/bank/components/sendBox.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/components/bank/components/sendBox.tsx b/components/bank/components/sendBox.tsx index 81076941..8e870db3 100644 --- a/components/bank/components/sendBox.tsx +++ b/components/bank/components/sendBox.tsx @@ -137,6 +137,7 @@ export default function SendBox({ refetchOsmosisBalances={refetchOsmosisBalances} resolveOsmosisRefetch={resolveOsmosisRefetch} availableToChains={getAvailableToChains} + chains={chains} /> ) : ( Date: Sun, 2 Feb 2025 01:05:05 -0700 Subject: [PATCH 47/63] pass cosmos kit signers to skipClient context provider --- components/bank/components/sendBox.tsx | 1 + components/bank/forms/ibcSendForm.tsx | 75 ++++++++++++++++++++------ components/bank/modals/sendModal.tsx | 1 + components/react/modal.tsx | 24 ++++++++- components/wallet.tsx | 53 +++++++++++++++++- contexts/skipGoContext.tsx | 28 +++++++--- pages/bank.tsx | 9 ++-- 7 files changed, 160 insertions(+), 31 deletions(-) diff --git a/components/bank/components/sendBox.tsx b/components/bank/components/sendBox.tsx index 8e870db3..4e4910a3 100644 --- a/components/bank/components/sendBox.tsx +++ b/components/bank/components/sendBox.tsx @@ -10,6 +10,7 @@ export interface IbcChain { name: string; icon: string; prefix: string; + chainID: string; } export default function SendBox({ diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index fb3864f6..e52bdd37 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -34,7 +34,7 @@ import { useChains } from '@cosmos-kit/react'; import { useSearchParams } from 'next/navigation'; import { Any } from 'cosmjs-types/google/protobuf/any'; import { useSkipClient } from '@/contexts/skipGoContext'; -import { SkipClient } from '@skip-go/client'; + import { IbcChain } from '@/components'; import { ChainContext } from '@cosmos-kit/core'; @@ -108,7 +108,13 @@ export default function IbcSendForm({ const [isContactsOpen, setIsContactsOpen] = useState(false); const [isIconRotated, setIsIconRotated] = useState(false); - const skipClient = new SkipClient({}); + const getCosmosSigner = async () => { + const signer = chains[selectedFromChain.name].getOfflineSignerAmino(); + return signer; + }; + const skipClient = useSkipClient({ + getCosmosSigner: getCosmosSigner, + }); const { submitProposal } = cosmos.group.v1.MessageComposer.withTypeUrl; useEffect(() => { @@ -121,7 +127,7 @@ export default function IbcSendForm({ // Update the filtered balances logic to use passed props instead of hooks const filteredBalances = useMemo(() => { - const sourceBalances = selectedFromChain.name === env.osmosisChain ? osmosisBalances : balances; + const sourceBalances = selectedFromChain.id === env.osmosisChain ? osmosisBalances : balances; return sourceBalances?.filter(token => { const displayName = token.metadata?.display ?? token.denom; @@ -131,7 +137,7 @@ export default function IbcSendForm({ // Update initialSelectedToken to consider the chain const initialSelectedToken = useMemo(() => { - const sourceBalances = selectedFromChain.name === env.osmosisChain ? osmosisBalances : balances; + const sourceBalances = selectedFromChain.id === env.osmosisChain ? osmosisBalances : balances; return ( sourceBalances?.find(token => token.coreDenom === selectedDenom) || @@ -142,7 +148,7 @@ export default function IbcSendForm({ // Update the loading check if ( - (selectedFromChain.name === env.osmosisChain ? isOsmosisBalancesLoading : isBalancesLoading) || + (selectedFromChain.id === env.osmosisChain ? isOsmosisBalancesLoading : isBalancesLoading) || !initialSelectedToken ) { return null; @@ -213,7 +219,7 @@ export default function IbcSendForm({ const stamp = Date.now(); const timeoutInNanos = (stamp + 1.2e6) * 1e6; - const ibcDenom = getIbcDenom(selectedToChain.name, values.selectedToken.coreDenom); + const ibcDenom = getIbcDenom(selectedToChain.id, values.selectedToken.coreDenom); console.log({ fromChain: selectedFromChain, @@ -223,30 +229,37 @@ export default function IbcSendForm({ }); const route = await skipClient.route({ - amountIn: amountInBaseUnits, sourceAssetDenom: values.selectedToken.coreDenom, - sourceAssetChainID: 'manifest-ledger-testnet', - destAssetDenom: ibcDenom ?? values.selectedToken.coreDenom, - destAssetChainID: 'osmo-test-5', - cumulativeAffiliateFeeBPS: '0', + sourceAssetChainID: selectedFromChain.chainID, + destAssetChainID: selectedToChain.chainID, + destAssetDenom: ibcDenom ?? '', + amountIn: amountInBaseUnits, }); + console.log('route', route); + + const addressList = route.requiredChainAddresses.map(chainID => ({ + address: + Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', + })); + const userAddresses = route.requiredChainAddresses.map(chainID => ({ address: Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', + chainID: chainID, })); console.log(userAddresses); // Log the validation result - await skipClient.messages({ + const messages = await skipClient.messages({ sourceAssetDenom: values.selectedToken.coreDenom, - sourceAssetChainID: selectedFromChain.id, + sourceAssetChainID: selectedFromChain.chainID, destAssetDenom: ibcDenom ?? values.selectedToken.coreDenom, - destAssetChainID: selectedToChain.id, + destAssetChainID: selectedToChain.chainID, amountIn: amountInBaseUnits, amountOut: route.estimatedAmountOut ?? '', - addressList: userAddresses.map(user => user.address), + addressList: addressList.map(user => user.address), operations: route.operations, estimatedAmountOut: route.estimatedAmountOut ?? '', slippageTolerancePercent: '1', @@ -256,7 +269,34 @@ export default function IbcSendForm({ enableGasWarnings: false, }); - console.log('skipClient.messages', skipClient.messages); + await skipClient.executeRoute({ + route, + userAddresses, + simulate: true, + // Executes after all of the operations triggered by a user's signature complete. + // For multi-tx routes that require multiple user signatures, this will be called once for each tx in sequence + onTransactionCompleted: async (chainID, txHash, status) => { + console.log(`Route completed with tx hash: ${txHash} & status: ${status.state}`); + }, + // called after the transaction that the user signs gets broadcast on chain + onTransactionBroadcast: async ({ txHash, chainID }) => { + console.log(`Transaction broadcasted with tx hash: ${txHash}`); + }, + // called after the transaction that the user signs is successfully registered for tracking + onTransactionTracked: async ({ txHash, chainID }) => { + console.log(`Transaction tracked with tx hash: ${txHash}`); + }, + // called after the user signs a transaction + onTransactionSigned: async ({ chainID }) => { + console.log(`Transaction signed with chain ID: ${chainID}`); + }, + // validate gas balance on each chain + onValidateGasBalance: async ({ chainID, txIndex, status }) => { + console.log(`Validating gas balance for chain ${chainID}...`); + }, + }); + + console.log('skipClient.messages', messages); // const transferMsg = transfer({ // sourcePort: source_port, @@ -823,3 +863,6 @@ export default function IbcSendForm({
  • ); } +function useSkip(getCosmosSigner: () => Promise) { + throw new Error('Function not implemented.'); +} diff --git a/components/bank/modals/sendModal.tsx b/components/bank/modals/sendModal.tsx index 005d147c..396df1bf 100644 --- a/components/bank/modals/sendModal.tsx +++ b/components/bank/modals/sendModal.tsx @@ -113,6 +113,7 @@ export default function SendModal({ isOsmosisBalancesLoading={isOsmosisBalancesLoading} refetchOsmosisBalances={refetchOsmosisBalances} resolveOsmosisRefetch={resolveOsmosisRefetch} + chains={chains} />
    (State.Init); const [qrMessage, setQrMessage] = useState(''); - const current = walletRepo?.current; + const chains = useChains([env.chain, env.osmosisChain]); + + const chainStates = useMemo(() => { + return Object.values(chains).map(chain => ({ + connect: chain.connect, + openView: chain.openView, + status: chain.status, + username: chain.username, + address: chain.address, + disconnect: chain.disconnect, + })); + }, [chains]); + + const disconnect = async () => { + await Promise.all(chainStates.map(chain => chain.disconnect())); + }; + + const current = chains?.manifesttestnet?.walletRepo?.current; + const currentWalletData = current?.walletInfo; const walletStatus = current?.walletStatus || WalletStatus.Disconnected; const currentWalletName = current?.walletName; @@ -444,7 +464,7 @@ export const TailwindModal: React.FC< setCurrentView(ModalView.WalletList)} - disconnect={() => current?.disconnect()} + disconnect={() => disconnect()} name={currentWalletData?.prettyName!} logo={currentWalletData?.logo!.toString() ?? ''} username={current?.username} diff --git a/components/wallet.tsx b/components/wallet.tsx index cdd18dca..eec62206 100644 --- a/components/wallet.tsx +++ b/components/wallet.tsx @@ -2,7 +2,7 @@ import React, { MouseEventHandler, useEffect, useMemo, useState, useRef } from ' import { ArrowDownTrayIcon, ArrowPathIcon } from '@heroicons/react/24/outline'; import { ArrowUpIcon, CopyIcon } from './icons'; -import { useChain } from '@cosmos-kit/react'; +import { useChain, useChains } from '@cosmos-kit/react'; import { WalletStatus } from 'cosmos-kit'; import { MdWallet } from 'react-icons/md'; import env from '@/config/env'; @@ -36,7 +36,56 @@ interface WalletSectionProps { } export const WalletSection: React.FC = ({ chainName }) => { - const { connect, openView, status, username, address } = useChain(chainName); + const chains = useChains([env.chain, env.osmosisChain]); + + const chainStates = useMemo(() => { + return Object.values(chains).map(chain => ({ + connect: chain.connect, + openView: chain.openView, + status: chain.status, + username: chain.username, + address: chain.address, + })); + }, [chains]); + + const connect = async () => { + await Promise.all(chainStates.map(chain => chain.connect())); + }; + + const openView = () => { + chainStates[0]?.openView(); + }; + + const status = useMemo(() => { + if (chainStates.some(chain => chain.status === WalletStatus.Connecting)) { + return WalletStatus.Connecting; + } + if (chainStates.some(chain => chain.status === WalletStatus.Error)) { + return WalletStatus.Error; + } + if (chainStates.every(chain => chain.status === WalletStatus.Connected)) { + return WalletStatus.Connected; + } + return WalletStatus.Disconnected; + }, [chainStates]); + + const username = useMemo( + () => + chainStates + .map(chain => chain.username) + .filter(Boolean) + .join(' / ') || undefined, + [chainStates] + ); + + const address = useMemo( + () => + chainStates + .map(chain => chain.address) + .filter(Boolean) + .join(' / ') || undefined, + [chainStates] + ); const [localStatus, setLocalStatus] = useState(status); const timeoutRef = useRef>(); diff --git a/contexts/skipGoContext.tsx b/contexts/skipGoContext.tsx index 2cae678b..8ae401c1 100644 --- a/contexts/skipGoContext.tsx +++ b/contexts/skipGoContext.tsx @@ -1,9 +1,9 @@ -import React, { createContext, useContext } from 'react'; +import React, { createContext, useContext, useMemo } from 'react'; import { SkipClient } from '@skip-go/client'; // Create the context interface SkipContextType { - skipClient: SkipClient; + createClient: (options: any) => SkipClient; } const SkipContext = createContext(undefined); @@ -14,16 +14,30 @@ interface SkipProviderProps { } export function SkipProvider({ children }: SkipProviderProps) { - const skipClient = new SkipClient({}); + const createClient = useMemo(() => { + return (options: any) => new SkipClient(options); + }, []); - return {children}; + return {children}; } -// Create a custom hook to use the Skip client -export function useSkipClient() { +// Update the hook to accept getCosmosSigner +interface UseSkipClientOptions { + getCosmosSigner: () => Promise; +} + +export function useSkipClient(options: UseSkipClientOptions) { const context = useContext(SkipContext); if (context === undefined) { throw new Error('useSkipClient must be used within a SkipProvider'); } - return context.skipClient; + + // Create a new client with the provided options + const skipClient = useMemo(() => { + return context.createClient({ + getCosmosSigner: options.getCosmosSigner, + }); + }, [context.createClient, options.getCosmosSigner]); + + return skipClient; } diff --git a/pages/bank.tsx b/pages/bank.tsx index 97c20b76..91f12bcd 100644 --- a/pages/bank.tsx +++ b/pages/bank.tsx @@ -30,10 +30,11 @@ interface PageSizeConfig { export default function Bank() { const chains = useChains([env.chain, env.osmosisChain]); - const isWalletConnected = Object.values(chains).every(chain => chain.isWalletConnected); - if (!isWalletConnected) { - Object.values(chains).forEach(chain => chain.connect()); - } + + const isWalletConnected = useMemo( + () => Object.values(chains).every(chain => chain.isWalletConnected), + [chains] + ); const { balances, isBalancesLoading, refetchBalances } = useTokenBalances( chains.manifesttestnet.address ?? '' From 09ece7bf63b132a0f259fdd00fac7d9539e303b3 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Sun, 2 Feb 2025 01:49:37 -0700 Subject: [PATCH 48/63] bring to most recent --- components/bank/forms/ibcSendForm.tsx | 52 +++++++++++---------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index e52bdd37..836aecc0 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -221,13 +221,6 @@ export default function IbcSendForm({ const ibcDenom = getIbcDenom(selectedToChain.id, values.selectedToken.coreDenom); - console.log({ - fromChain: selectedFromChain, - toChain: selectedToChain, - sourceDenom: values.selectedToken.coreDenom, - ibcDenom, - }); - const route = await skipClient.route({ sourceAssetDenom: values.selectedToken.coreDenom, sourceAssetChainID: selectedFromChain.chainID, @@ -236,8 +229,6 @@ export default function IbcSendForm({ amountIn: amountInBaseUnits, }); - console.log('route', route); - const addressList = route.requiredChainAddresses.map(chainID => ({ address: Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', @@ -248,9 +239,6 @@ export default function IbcSendForm({ Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', chainID: chainID, })); - console.log(userAddresses); - - // Log the validation result const messages = await skipClient.messages({ sourceAssetDenom: values.selectedToken.coreDenom, @@ -296,15 +284,13 @@ export default function IbcSendForm({ }, }); - console.log('skipClient.messages', messages); - // const transferMsg = transfer({ // sourcePort: source_port, // sourceChannel: source_channel, // sender: admin // ? admin - // : selectedFromChain === env.osmosisChain - // ? (osmosisAddress ?? '') + // : selectedFromChain.id === env.osmosisChain + // ? (chains?.osmosistestnet?.address ?? '') // : (address ?? ''), // receiver: values.recipient ?? '', // token, @@ -315,23 +301,27 @@ export default function IbcSendForm({ // timeoutTimestamp: BigInt(timeoutInNanos), // }); - // const msg = submitProposal({ - // groupPolicyAddress: admin!, - // messages: [ - // Any.fromPartial({ - // typeUrl: MsgTransfer.typeUrl, - // value: MsgTransfer.encode(transferMsg.value).finish(), - // }), - // ], - // metadata: '', - // proposers: [address], - // title: `IBC Transfer`, - // summary: `This proposal will send ${values.amount} ${values.selectedToken.metadata?.display} to ${values.recipient} via IBC transfer`, - // exec: 0, - // }); + // const msg = isGroup + // ? submitProposal({ + // groupPolicyAddress: admin!, + // messages: [ + // Any.fromPartial({ + // typeUrl: MsgTransfer.typeUrl, + // value: MsgTransfer.encode(transferMsg.value).finish(), + // }), + // ], + // metadata: '', + // proposers: [address], + // title: `IBC Transfer`, + // summary: `This proposal will send ${values.amount} ${values.selectedToken.metadata?.display} to ${values.recipient} via IBC transfer`, + // exec: 0, + // }) + // : transferMsg; // const fee = await estimateFee( - // selectedFromChain === env.osmosisChain ? (osmosisAddress ?? '') : (address ?? ''), + // selectedFromChain.id === env.osmosisChain + // ? (chains.osmosistestnet.address ?? '') + // : (address ?? ''), // [msg] // ); From 3e39891dbf626fa06b269b273383dda95e94f47d Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Sun, 2 Feb 2025 23:00:09 -0700 Subject: [PATCH 49/63] update and add ibc denom scripts --- .gitignore | 2 +- components/bank/forms/ibcSendForm.tsx | 4 + package.json | 3 +- scripts/ibcTransferAll.ts | 194 ++++++++++++++++---------- scripts/printAllTokens.ts | 87 ++++++++++++ 5 files changed, 218 insertions(+), 72 deletions(-) create mode 100644 scripts/printAllTokens.ts diff --git a/.gitignore b/.gitignore index 669983e8..c5910cdb 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,4 @@ next-env.d.ts certificates -/scripts/demons.json \ No newline at end of file +/scripts/*.json \ No newline at end of file diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 836aecc0..348fbbd7 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -229,6 +229,8 @@ export default function IbcSendForm({ amountIn: amountInBaseUnits, }); + console.log('route', route); + const addressList = route.requiredChainAddresses.map(chainID => ({ address: Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', @@ -240,6 +242,8 @@ export default function IbcSendForm({ chainID: chainID, })); + console.log(userAddresses); + const messages = await skipClient.messages({ sourceAssetDenom: values.selectedToken.coreDenom, sourceAssetChainID: selectedFromChain.chainID, diff --git a/package.json b/package.json index 7e04d7c9..a0da39a8 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "test:coverage": "bun test --coverage", "test:coverage:lcov": "bun run test:coverage --coverage-reporter=lcov --coverage-dir ./coverage", "coverage:upload": "codecov", - "ibc-transfer": "tsx scripts/ibcTransferAll.ts" + "ibc-transfer": "tsx scripts/ibcTransferAll.ts", + "print-tokens": "tsx scripts/printAllTokens.ts" }, "author": "The Lifted Initiative", "license": "MIT", diff --git a/scripts/ibcTransferAll.ts b/scripts/ibcTransferAll.ts index c87219c7..40e1ce68 100644 --- a/scripts/ibcTransferAll.ts +++ b/scripts/ibcTransferAll.ts @@ -1,38 +1,56 @@ -// This script is used to transfer 1/6th of all IBC tokens (factory tokens included) from Manifest to Osmosis +// This script is used to transfer all tokens on manifest to destination chain then print out a list of tokens that can be used in the chain-registry // you can run this script by providing a mnemonic as an environment variable: `WALLET_MNEMONIC="..." bun run ibc-transfer` +// ENV's: +// DESTINATION_RPC_URL: the rpc url of the destination chain +// DESTINATION_CHAIN: the name of the destination chain +// DESTINATION_PREFIX: the prefix of the destination chain +// SOURCE_CHANNEL: the channel id of the source chain +// DESTINATION_CHANNEL: the channel id of the destination chain + +// You can provide the above env's in the command in the same fashion as the mnemonic or they will be set to default values +// Axelar example: +// WALLET_MNEMONIC="" DESTINATION_CHAIN="axelar-testnet-lisbon-3" DESTINATION_PREFIX="axelar" SOURCE_CHANNEL="channel-3" DESTINATION_CHANNEL="channel-591" DESTINATION_RPC_URL="https://axelar-testnet-rpc.polkachu.com/" bun run ibc-transfer +// Axlear query only: +// QUERY_ONLY=true WALLET_MNEMONIC="" DESTINATION_CHAIN="axelar-testnet-lisbon-3" DESTINATION_PREFIX="axelar" SOURCE_CHANNEL="channel-3" DESTINATION_CHANNEL="channel-591" DESTINATION_RPC_URL="https://axelar-testnet-rpc.polkachu.com/" QUERY_ONLY="true" bun run ibc-transfer + import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; import { SigningStargateClient } from '@cosmjs/stargate'; import { MsgTransfer } from '@liftedinit/manifestjs/dist/codegen/ibc/applications/transfer/v1/tx'; -import axios from 'axios'; + import * as fs from 'fs'; import * as path from 'path'; +import { ibc } from '@liftedinit/manifestjs'; // Environment Configuration const env = { rpcUrl: 'https://nodes.liftedinit.tech/manifest/testnet/rpc', - osmosisRpcUrl: 'https://rpc.osmotest5.osmosis.zone', + destinationRpcUrl: process.env.DESTINATION_RPC_URL || 'https://rpc.osmotest5.osmosis.zone', chain: 'manifest-testnet', - osmosisChain: 'osmo-test-5', + destinationChain: process.env.DESTINATION_CHAIN || 'osmo-test-5', + destinationPrefix: process.env.DESTINATION_PREFIX || 'osmo', + sourceChannel: process.env.SOURCE_CHANNEL || 'channel-0', + destinationChannel: process.env.DESTINATION_CHANNEL || 'channel-10016', }; +// Add option for query-only mode at the top with other constants +const QUERY_ONLY = process.env.QUERY_ONLY === 'true'; + // IBC Configuration const getIbcInfo = (fromChain: string, toChain: string) => { - if (fromChain === 'manifest-testnet' && toChain === 'osmo-test-5') { - return { - source_port: 'transfer', - source_channel: 'channel-0', - }; - } - throw new Error(`Unsupported chain combination: ${fromChain} -> ${toChain}`); + // Default configuration + return { + source_port: 'transfer', + source_channel: env.sourceChannel, + }; }; // Configuration const MANIFEST_RPC = env.rpcUrl; -const OSMOSIS_RPC = env.osmosisRpcUrl; +const DESTINATION_RPC = env.destinationRpcUrl; const SOURCE_CHAIN = env.chain; -const TARGET_CHAIN = env.osmosisChain; +const TARGET_CHAIN = env.destinationChain; // Helper function to format token info for asset list function formatTokenForAssetList(ibcDenom: string, denomTrace: any, originalDenom: string) { @@ -40,22 +58,21 @@ function formatTokenForAssetList(ibcDenom: string, denomTrace: any, originalDeno const displayName = tokenName.toUpperCase(); return { - description: `${displayName} Token`, + description: `${displayName} Token on Manifest Ledger Testnet`, denom_units: [ { denom: ibcDenom, exponent: 0, - aliases: [originalDenom], }, { - denom: displayName, + denom: tokenName, exponent: 6, }, ], type_asset: 'ics20', base: ibcDenom, name: displayName, - display: displayName, + display: tokenName, symbol: displayName, traces: [ { @@ -63,40 +80,50 @@ function formatTokenForAssetList(ibcDenom: string, denomTrace: any, originalDeno counterparty: { chain_name: 'manifesttestnet', base_denom: originalDenom, - channel_id: 'channel-0', + channel_id: env.sourceChannel, }, chain: { - channel_id: 'channel-10016', - path: denomTrace.path, + channel_id: env.destinationChannel, + path: `${denomTrace.path}/${originalDenom}`, }, }, ], - logo_URIs: { - png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', - svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', - }, images: [ { image_sync: { chain_name: 'manifesttestnet', base_denom: originalDenom, }, - png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', - svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', + png: `https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png`, + svg: `https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg`, }, ], + logo_URIs: { + png: `https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png`, + svg: `https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg`, + }, }; } -// Helper function to query denom trace +// Update the getDenomTrace function async function getDenomTrace(hash: string) { try { - const response = await axios.get( - `${OSMOSIS_RPC.replace('rpc', 'rest')}/ibc/apps/transfer/v1/denom_traces/${hash}` - ); - return response.data.denom_trace; - } catch (error) { - console.error('Error fetching denom trace:', error); + const { createRPCQueryClient } = ibc.ClientFactory; + const client = await createRPCQueryClient({ + rpcEndpoint: DESTINATION_RPC, + }); + + const response = await client.ibc.applications.transfer.v1.denomTrace({ + hash: hash, + }); + + console.log('Denom trace response:', response); + return response.denomTrace; + } catch (error: any) { + console.error('Error fetching denom trace:', { + error: error.message, + hash: hash, + }); return null; } } @@ -112,23 +139,26 @@ async function main() { const manifestWallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { prefix: 'manifest', }); - const osmosisWallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { - prefix: 'osmo', + const destinationWallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: env.destinationPrefix, }); // Get addresses const [manifestAccount] = await manifestWallet.getAccounts(); - const [osmosisAccount] = await osmosisWallet.getAccounts(); + const [destinationAccount] = await destinationWallet.getAccounts(); console.log('Manifest address:', manifestAccount.address); - console.log('Osmosis address:', osmosisAccount.address); + console.log('Destination address:', destinationAccount.address); // Create signing clients const manifestClient = await SigningStargateClient.connectWithSigner( MANIFEST_RPC, manifestWallet ); - const osmosisClient = await SigningStargateClient.connectWithSigner(OSMOSIS_RPC, osmosisWallet); + const destinationClient = await SigningStargateClient.connectWithSigner( + DESTINATION_RPC, + destinationWallet + ); // Query balances on Manifest chain const balances = await manifestClient.getAllBalances(manifestAccount.address); @@ -149,7 +179,7 @@ async function main() { sourcePort: source_port, sourceChannel: source_channel, sender: manifestAccount.address, - receiver: osmosisAccount.address, + receiver: destinationAccount.address, token: { denom: token.denom, amount: '1', @@ -163,8 +193,8 @@ async function main() { }; }); - // Execute transfers - if (messages.length > 0) { + // Execute transfers only if not in query-only mode + if (!QUERY_ONLY && messages.length > 0) { try { const fee = { amount: [{ denom: 'umfx', amount: '5500' }], @@ -172,63 +202,87 @@ async function main() { }; console.log('\nExecuting IBC transfers...'); - console.log(`Attempting to transfer 1 token each for ${messages.length} different denoms...`); + console.log(`Total tokens to transfer: ${messages.length}`); - const result = await manifestClient.signAndBroadcast(manifestAccount.address, messages, fee); + // Process each message individually + for (let i = 0; i < messages.length; i++) { + const message = messages[i]; + console.log(`\nProcessing transfer ${i + 1} of ${messages.length}`); + console.log(`Transferring token...`); - if (result.code !== 0) { - throw new Error(`Transaction failed with code ${result.code}. Logs: ${result.rawLog}`); - } + const result = await manifestClient.signAndBroadcast( + manifestAccount.address, + [message], // Send single message instead of batch + fee + ); + + if (result.code !== 0) { + throw new Error(`Transaction failed with code ${result.code}. Logs: ${result.rawLog}`); + } + + console.log('Transfer result:', { + code: result.code, + hash: result.transactionHash, + }); - console.log('Transfer result:', { - code: result.code, - hash: result.transactionHash, - }); + // Add a small delay between transfers to prevent rate limiting + if (i + 1 < messages.length) { + console.log('Waiting 5 seconds before next transfer...'); + await new Promise(resolve => setTimeout(resolve, 5000)); + } + } } catch (error) { console.error('Error during transfer:', error); - process.exit(1); // Exit with error code + process.exit(1); } + } else if (QUERY_ONLY) { + console.log('\nQuery-only mode - skipping transfers'); } else { console.log('No tokens to transfer'); } - // Wait a bit for the transfers to complete - console.log('\nWaiting 1 minute for transfers to complete...'); - await new Promise(resolve => setTimeout(resolve, 60000)); + if (!QUERY_ONLY) { + // Wait a bit for the transfers to complete + console.log('\nWaiting 1 minute for transfers to complete...'); + + await new Promise(resolve => setTimeout(resolve, 60000)); + } - // Query final balances on Osmosis - const osmosisBalances = await osmosisClient.getAllBalances(osmosisAccount.address); - console.log('\nOsmosis chain balances:', osmosisBalances); + // Query final balances on Destination + console.log('\nQuerying Destination balances...'); + const destinationBalances = await destinationClient.getAllBalances(destinationAccount.address); + console.log('Destination chain balances:', destinationBalances); // Query IBC denom traces for each IBC token and format them - const ibcTokens = osmosisBalances.filter(token => token.denom.startsWith('ibc/')); + const ibcTokens = destinationBalances.filter(token => token.denom.startsWith('ibc/')); const formattedTokens = []; if (ibcTokens.length > 0) { - console.log('\nIBC Denom Traces:'); + console.log('\nProcessing IBC Denom Traces:'); for (const token of ibcTokens) { try { const hash = token.denom.split('/')[1]; const denomTrace = await getDenomTrace(hash); - console.log(`${token.denom}:`, denomTrace); + console.log(`Processing ${token.denom}:`, denomTrace); - // Find original denom from balances - const originalDenom = balances.find( - b => denomTrace?.base_denom === b.denom || denomTrace?.path.includes(b.denom) - )?.denom; - - if (originalDenom && denomTrace) { + if (denomTrace) { + // Extract original denom from the denom trace + const originalDenom = denomTrace.baseDenom; formattedTokens.push(formatTokenForAssetList(token.denom, denomTrace, originalDenom)); } } catch (error) { - console.error(`Error querying denom trace for ${token.denom}:`, error); + console.error(`Error processing denom trace for ${token.denom}:`, error); } } // Save formatted tokens to file - const outputPath = path.join(__dirname, 'denoms.json'); - fs.writeFileSync(outputPath, JSON.stringify({ tokens: formattedTokens }, null, 2)); - console.log(`\nToken information saved to ${outputPath}`); + if (formattedTokens.length > 0) { + const outputPath = path.join(__dirname, 'chain-registry-tokens.json'); + fs.writeFileSync(outputPath, JSON.stringify({ tokens: formattedTokens }, null, 2)); + console.log(`\nChain Registry token information saved to ${outputPath}`); + } + } else { + console.log('No IBC tokens found in Destination balances'); } } diff --git a/scripts/printAllTokens.ts b/scripts/printAllTokens.ts new file mode 100644 index 00000000..53c4aeb3 --- /dev/null +++ b/scripts/printAllTokens.ts @@ -0,0 +1,87 @@ +// This script prints all the tokens in the manifest testnet chain in a format to be used in the chain-registry + +import { cosmos } from '@liftedinit/manifestjs'; +import * as fs from 'fs'; +import * as path from 'path'; + +// Environment Configuration +const env = { + rpcUrl: 'https://nodes.liftedinit.tech/manifest/testnet/rpc', + chain: 'manifest-testnet', +}; + +async function getTokenMetadata(denom: string) { + const { createRPCQueryClient } = cosmos.ClientFactory; + const client = await createRPCQueryClient({ rpcEndpoint: env.rpcUrl }); + try { + // Query token metadata using the bank module + const response = await client.cosmos.bank.v1beta1.denomMetadata({ denom }); + return response.metadata; + } catch (error) { + console.error(`Error fetching metadata for ${denom}:`, error); + return null; + } +} + +function formatTokenInfo(denom: string, metadata: any = null) { + const tokenName = denom.split('/').pop()?.replace('u', '') || ''; + const displayName = tokenName.toUpperCase(); + + return { + description: metadata?.description || `${displayName} Token`, + denom_units: [ + { + denom: denom, + exponent: 0, + }, + { + denom: displayName.toLowerCase(), + exponent: 6, + }, + ], + base: denom, + name: `${displayName} Token`, + display: displayName.toLowerCase(), + symbol: displayName, + logo_URIs: { + png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', + svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', + }, + images: [ + { + png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', + svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', + }, + ], + type_asset: 'factory_token', + }; +} + +async function main() { + // Create client + const { createRPCQueryClient } = cosmos.ClientFactory; + const client = await createRPCQueryClient({ rpcEndpoint: env.rpcUrl }); + + // Query balances for the specified address + const address = 'manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct'; + const balances = await client.cosmos.bank.v1beta1.allBalances({ address, resolveDenom: false }); + + // Filter for factory tokens and format them + const factoryTokens = balances.balances.filter(token => token.denom.startsWith('factory/')); + const formattedTokens = []; + + console.log(`Found ${factoryTokens.length} factory tokens`); + + for (const token of factoryTokens) { + const metadata = await getTokenMetadata(token.denom); + const formattedToken = formatTokenInfo(token.denom, metadata); + formattedTokens.push(formattedToken); + } + + // Save to file + const outputPath = path.join(__dirname, 'token_metadata.json'); + fs.writeFileSync(outputPath, JSON.stringify({ tokens: formattedTokens }, null, 2)); + console.log(`\nToken metadata saved to ${outputPath}`); +} + +main().catch(console.error); From 625ce3afdd2e8f845bc2a7d1047e529d3490cba5 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 4 Feb 2025 15:29:16 -0700 Subject: [PATCH 50/63] make skip hook more type safe --- components/bank/forms/ibcSendForm.tsx | 3 ++- contexts/skipGoContext.tsx | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index 348fbbd7..b0605c39 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -109,9 +109,10 @@ export default function IbcSendForm({ const [isIconRotated, setIsIconRotated] = useState(false); const getCosmosSigner = async () => { - const signer = chains[selectedFromChain.name].getOfflineSignerAmino(); + const signer = chains[selectedFromChain.id].getOfflineSignerAmino(); return signer; }; + const skipClient = useSkipClient({ getCosmosSigner: getCosmosSigner, }); diff --git a/contexts/skipGoContext.tsx b/contexts/skipGoContext.tsx index 8ae401c1..ffadd0dc 100644 --- a/contexts/skipGoContext.tsx +++ b/contexts/skipGoContext.tsx @@ -1,9 +1,11 @@ import React, { createContext, useContext, useMemo } from 'react'; -import { SkipClient } from '@skip-go/client'; +import { SkipClient, SkipClientOptions } from '@skip-go/client'; +import { OfflineDirectSigner } from '@cosmjs/proto-signing'; +import { OfflineAminoSigner } from '@cosmjs/amino'; // Create the context interface SkipContextType { - createClient: (options: any) => SkipClient; + createClient: (options: SkipClientOptions) => SkipClient; } const SkipContext = createContext(undefined); @@ -15,7 +17,7 @@ interface SkipProviderProps { export function SkipProvider({ children }: SkipProviderProps) { const createClient = useMemo(() => { - return (options: any) => new SkipClient(options); + return (options: SkipClientOptions) => new SkipClient(options); }, []); return {children}; @@ -23,7 +25,9 @@ export function SkipProvider({ children }: SkipProviderProps) { // Update the hook to accept getCosmosSigner interface UseSkipClientOptions { - getCosmosSigner: () => Promise; + getCosmosSigner: () => Promise< + OfflineAminoSigner | OfflineDirectSigner | (OfflineAminoSigner & OfflineDirectSigner) + >; } export function useSkipClient(options: UseSkipClientOptions) { From 5e9821895b0961e70803ba605421348c598aaa89 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Tue, 4 Feb 2025 16:47:00 -0700 Subject: [PATCH 51/63] fix tests --- .../components/__tests__/sendBox.test.tsx | 4 +- .../bank/forms/__tests__/ibcSendForm.test.tsx | 119 ++++++++++++------ tests/mock.ts | 21 ++++ tests/render.tsx | 5 +- 4 files changed, 105 insertions(+), 44 deletions(-) diff --git a/components/bank/components/__tests__/sendBox.test.tsx b/components/bank/components/__tests__/sendBox.test.tsx index 455e3333..9aee3e1d 100644 --- a/components/bank/components/__tests__/sendBox.test.tsx +++ b/components/bank/components/__tests__/sendBox.test.tsx @@ -32,12 +32,12 @@ mock.module('@/components/bank/forms/ibcSendForm', () => ({
    diff --git a/components/bank/forms/__tests__/ibcSendForm.test.tsx b/components/bank/forms/__tests__/ibcSendForm.test.tsx index 67320cf6..749c447f 100644 --- a/components/bank/forms/__tests__/ibcSendForm.test.tsx +++ b/components/bank/forms/__tests__/ibcSendForm.test.tsx @@ -17,31 +17,51 @@ mock.module('next/router', () => ({ })); function renderWithProps(props = {}) { + const defaultChains = [ + { + id: 'manifest', + name: 'Manifest', + icon: 'https://osmosis.zone/assets/icons/osmo-logo-icon.svg', + prefix: 'manifest', + chainID: 'manifest-1', + }, + { + id: 'osmosistestnet', + name: 'Osmosis', + icon: 'https://osmosis.zone/assets/icons/osmo-logo-icon.svg', + prefix: 'osmo', + chainID: 'osmo-test-1', + }, + ]; + const defaultProps = { address: 'manifest1address', - destinationChain: 'osmosistestnet', + destinationChain: defaultChains[1], balances: mockBalances, isBalancesLoading: false, refetchBalances: jest.fn(), + refetchHistory: jest.fn(), isIbcTransfer: true, - setIsIbcTransfer: jest.fn(), - ibcChains: [ - { - id: 'manifest', - name: 'Manifest', - icon: 'https://osmosis.zone/assets/icons/osmo-logo-icon.svg', - prefix: 'manifest', + ibcChains: defaultChains, + selectedFromChain: defaultChains[0], // Initialize with Manifest chain + setSelectedFromChain: jest.fn(), + selectedToChain: defaultChains[1], // Initialize with Osmosis chain + setSelectedToChain: jest.fn(), + osmosisBalances: [], + isOsmosisBalancesLoading: false, + refetchOsmosisBalances: jest.fn(), + resolveOsmosisRefetch: jest.fn(), + availableToChains: defaultChains, + chains: { + manifest: { + address: 'manifest1address', + getOfflineSignerAmino: jest.fn(), }, - { - id: 'osmosistestnet', - name: 'Osmosis', - icon: 'https://osmosis.zone/assets/icons/osmo-logo-icon.svg', - prefix: 'osmo', + osmosistestnet: { + address: 'osmo1address', + getOfflineSignerAmino: jest.fn(), }, - ], - selectedChain: 'osmosistestnet', - setSelectedChain: jest.fn(), - setSelectedFromChain: jest.fn(), + }, }; return renderWithChainProvider(); @@ -81,9 +101,26 @@ describe('IbcSendForm Component', () => { test('updates chain selector correctly', () => { renderWithProps(); - const chainSelector = screen.getByRole('combobox', { name: 'to-chain-selector' }); - fireEvent.click(chainSelector); - expect(screen.getByText('Osmosis')).toBeInTheDocument(); + + const fromChainSelector = screen.getByLabelText('from-chain-selector'); + fireEvent.click(fromChainSelector); + + // Get all Manifest options and select the enabled one + const manifestOptions = screen.getAllByRole('option', { name: 'Manifest' }); + const enabledManifestOption = manifestOptions.find( + option => !option.className.includes('opacity-50') + ); + fireEvent.click(enabledManifestOption!); + + expect(screen.getByLabelText('from-chain-selector')).toHaveTextContent('Manifest'); + + const toChainSelector = screen.getByLabelText('to-chain-selector'); + fireEvent.click(toChainSelector); + + const osmosisOption = screen.getAllByRole('option', { name: 'Osmosis' }); + fireEvent.click(osmosisOption[0]); + + expect(screen.getByLabelText('to-chain-selector')).toHaveTextContent('Osmosis'); }); test('updates amount input correctly', () => { @@ -118,47 +155,47 @@ describe('IbcSendForm Component', () => { test('handles chain selection correctly', async () => { renderWithProps(); - // Test from-chain selection const fromChainSelector = screen.getByLabelText('from-chain-selector'); - expect(fromChainSelector).toBeInTheDocument(); fireEvent.click(fromChainSelector); - // Find and click Manifest option - const manifestOption = screen.getByText('Manifest'); - fireEvent.click(manifestOption); + const manifestOptions = screen.getAllByRole('option', { name: 'Manifest' }); + const enabledManifestOption = manifestOptions.find( + option => !option.className.includes('opacity-50') + ); + fireEvent.click(enabledManifestOption!); - // Instead of checking the content directly, check for the presence of elements - const manifestIcon = screen.getAllByAltText('Manifest')[0]; - expect(manifestIcon).toBeInTheDocument(); + expect(screen.getByLabelText('from-chain-selector')).toHaveTextContent('Manifest'); - // Test to-chain selection const toChainSelector = screen.getByLabelText('to-chain-selector'); - expect(toChainSelector).toBeInTheDocument(); fireEvent.click(toChainSelector); - // Find and click Osmosis option - const osmosisOption = screen.getByText('Osmosis'); - fireEvent.click(osmosisOption); + const osmosisOption = screen.getAllByRole('option', { name: 'Osmosis' }); + fireEvent.click(osmosisOption[0]); - // Check for Osmosis icon instead of content - const osmosisIcon = screen.getAllByAltText('Osmosis')[0]; - expect(osmosisIcon).toBeInTheDocument(); + expect(screen.getByLabelText('to-chain-selector')).toHaveTextContent('Osmosis'); }); test('prevents selecting same chain for source and destination', async () => { renderWithProps(); - // Select Manifest as source chain const fromChainSelector = screen.getByLabelText('from-chain-selector'); fireEvent.click(fromChainSelector); - fireEvent.click(screen.getByText('Manifest')); + + const manifestOptions = screen.getAllByRole('option', { name: 'Manifest' }); + const enabledManifestOption = manifestOptions.find( + option => !option.className.includes('opacity-50') + ); + fireEvent.click(enabledManifestOption!); // Verify Manifest is not available in destination chain options const toChainSelector = screen.getByLabelText('to-chain-selector'); fireEvent.click(toChainSelector); - // The dropdown for destination chain should not show Manifest - const manifestOptions = screen.getAllByText('Manifest'); - expect(manifestOptions.length).toBe(1); // Only the source chain should show Manifest + // Check that there's only one active Manifest option (the source) + const activeManifestOptions = screen.getAllByRole('option', { name: 'Manifest' }); + const activeManifestOption = activeManifestOptions.find( + option => !option.className.includes('opacity-50') + ); + expect(activeManifestOption).toBeDefined(); }); }); diff --git a/tests/mock.ts b/tests/mock.ts index af0168d6..553c437e 100644 --- a/tests/mock.ts +++ b/tests/mock.ts @@ -197,6 +197,27 @@ export const osmosisAssetList = [ }, ]; +export const osmosisChain: Chain = { + chain_name: 'osmosistestnet', + chain_id: 'osmo-test-5', + status: 'live', + network_type: 'testnet', + pretty_name: 'Osmosis Testnet', + bech32_prefix: 'osmo', + slip44: 118, + fees: { + fee_tokens: [ + { + denom: 'uosmo', + fixed_min_gas_price: 0.001, + low_gas_price: 0.001, + average_gas_price: 0.001, + high_gas_price: 0.001, + }, + ], + }, +}; + export const defaultChain: Chain = { chain_name: 'manifest', chain_id: 'manifest-1', diff --git a/tests/render.tsx b/tests/render.tsx index d22525cc..b1b4dbd9 100644 --- a/tests/render.tsx +++ b/tests/render.tsx @@ -4,6 +4,7 @@ import { ChainProvider } from '@cosmos-kit/react'; import { ToastProvider } from '@/contexts'; import { defaultAssetLists, defaultChain, osmosisChain, osmosisAssetList } from '@/tests/mock'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { SkipProvider } from '@/contexts/skipGoContext'; const defaultOptions = { chains: [defaultChain, osmosisChain], @@ -17,7 +18,9 @@ export const renderWithChainProvider = (ui: React.ReactElement, options = {}) => return render( - {ui} + + {ui} + , options From fceee947a64d10c734491037cf66ea481a53b5e0 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Wed, 5 Feb 2025 13:37:54 -0700 Subject: [PATCH 52/63] use registry | add ibc assets to formatDenom --- .env.test | 32 +++- bun.lockb | Bin 601940 -> 601180 bytes components/bank/components/sendBox.tsx | 7 + components/bank/forms/ibcSendForm.tsx | 30 ++-- .../bank/handlers/createMessageUtils.tsx | 4 +- components/react/modal.tsx | 2 +- components/wallet.tsx | 2 +- config/env.ts | 29 +++- package.json | 6 +- pages/_app.tsx | 5 +- pages/bank.tsx | 2 +- utils/format.ts | 14 +- utils/ibc.ts | 162 ++---------------- 13 files changed, 106 insertions(+), 189 deletions(-) diff --git a/.env.test b/.env.test index a37d6dce..a3faac85 100644 --- a/.env.test +++ b/.env.test @@ -1,10 +1,30 @@ +# Wallet NEXT_PUBLIC_WALLETCONNECT_KEY=test_walletconnect_key NEXT_PUBLIC_WEB3AUTH_NETWORK=testnet NEXT_PUBLIC_WEB3AUTH_CLIENT_ID=test_client_id -NEXT_PUBLIC_CHAIN=manifest -NEXT_PUBLIC_CHAIN_ID=test_chain_id + +# Chains +NEXT_PUBLIC_CHAIN=manifesttestnet +NEXT_PUBLIC_OSMOSIS_CHAIN=osmosistestnet +NEXT_PUBLIC_CHAIN_ID='manifest-ledger-testnet' +NEXT_PUBLIC_OSMOSIS_CHAIN_ID='osmo-test-5' +NEXT_PUBLIC_AXELAR_CHAIN=axelartestnet +NEXT_PUBLIC_AXELAR_CHAIN_ID='axelar-testnet-1' + +# Ops NEXT_PUBLIC_CHAIN_TIER=testnet -NEXT_PUBLIC_RPC_URL=https://test.rpc.url -NEXT_PUBLIC_API_URL=https://test.api.url -NEXT_PUBLIC_EXPLORER_URL=https://test.explorer.url -NEXT_PUBLIC_INDEXER_URL=https://test.indexer.url \ No newline at end of file +# Explorer URLs +NEXT_PUBLIC_EXPLORER_URL=https://testnet.manifest.explorers.guru +NEXT_PUBLIC_OSMOSIS_EXPLORER_URL=https://manifest.io/testnet-osmosis +NEXT_PUBLIC_AXELAR_EXPLORER_URL=https://manifest.io/testnet-axelar +# Indexer URL +NEXT_PUBLIC_INDEXER_URL= +# RPC URLs +NEXT_PUBLIC_RPC_URL= +NEXT_PUBLIC_API_URL= +# Osmosis RPC URLs +NEXT_PUBLIC_OSMOSIS_API_URL= +NEXT_PUBLIC_OSMOSIS_RPC_URL= +# Axelar RPC URLs +NEXT_PUBLIC_AXELAR_API_URL= +NEXT_PUBLIC_AXELAR_RPC_URL= diff --git a/bun.lockb b/bun.lockb index eeb222942dbdfa81161700fcbf99be0aff1d23b8..a5a67572e1cf10fbcca50416956eec4d9ad10c04 100755 GIT binary patch delta 133777 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 z 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 delta 134199 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

    0Q2JF57Au99> zVEqO7EU-#-`3mF;M1KWB)q8>PufU)JV6BQO0PG9&O!_SRySv-_{_* zGVjOL=(+pWMW>OaJeoCJ_@VmZ1#@-3Ox2Gpv&VMWvZR#9o0?lLe0ICao9(|!|I@+J zqu3r2rko17+5)atB@}WyO6h(BVhREGZvaD20?yxnO5Xv7p1uP{-+^-i3_bk-k_5be z01Q0|c>DnB6#)!A6#=G2z%2oWo_+$U0)amPhMoj`egdt30SrC;0xW(3&jez_n(MPs zIUg3L&%jeyj{cCaAbqx|E@v5b(&fw6y1-`vhMn|)T!CmkAYQ!}2-gD!=>rG(gkiv5 zA22ik5|onxP#};Xkf?MGffxh8-4IAt@dD0Xd*-NuZt)a7s-x0!)p7TLNcPEn^^6AkbL9x86BD^|$0^v!BXZ=d6pL7t0zygw z961xn6tFD~aOA8s5L6n-7vRWQ8Nj*>5LpJ`$eBQ{fTIb(kuwt@+yp2R;K*57z`iUH zR~F#NnLvSnYdL@;XXSvHa)8NS07uUL0-XN>QUo}1Rvs`a4|tUaIC3VCBw+qGz`?V> z0gu0dbODZ^RRByY0Dct!4xtI83RqPHIEq#g@Tmx73veK<5@1mY2&n{cAWa}sz_v2L zfwam%P-P%rfCFh&0P8A1WEFq|X#%+dj-~(y(oBJHQ=mwI18HV}y%`W^25=xvpg_R& zAAkdC{{S)n047xd4y08DoT~yU0vt%I1{hTXys7~lNE1jBFgNGX{-viTm@_`?VUDCD zav-fbiZwYi#o-F~7mO#2d7iHE8Fl`0+ zwF0`SG=WqBtJZ*>@@)KNz`h+2*A5t@3Iz%TT-yUfRBU@7rafTN z0dP?+9RTMJK#IUHWo!!=*#cg+fU8OtND?sb2#i#o9RZJyK)QgNGV27Gb^`o50b^8} zK&pUMXTV+gb_RSp1K9%Om1P&eq6-kx1@Kf^0+|A~U4e-zxGNCU704IxQa0TH>ux|~ zH(-j&6UY^C><&y*5#53C?m&^i4CP=4*xLbdc7V4k6etjI?E%bIu|0s89)L+tz*o8S z1e|*UDFSnqu{~g94|v%FekxfYNx<9z@K>G=fQJK+E)by1dI6@r0KZoA4rhu&@uv`T@0zr;IzCehw=?hr*1tR+bt5lvq zu7G1dAXG*41H$_OMFMM;Lw~@&KM>a+2vdau1p=;4fKsteK#UV$G60BBE&~AP0YHkt zMrAw@Fd7JW4Fn=pvOto6`M90_=g1kwdgDYH?4=_tT&6mUkR38V^GxdG>tuN&aw24o9d zP?n49|o~Sf|Q~|3=z%%7L3GkT&WDC4dmR^8` z7ZBnFvTUQOsX+Ktph)1O za+n6#PXpqn0iRW&K!Jekbl|IsoesoI2TW!Fh00|H;5-9J5%{i*X97ku0k4@rkxCXw z5-|6c7a;m-g15W?@kY`Sc>ywuMNDS_ezO35l_roXU^N>sRKBwTpV>gRKuKlk16cR~ zAwGby$`Z&Fu=NE>t6*Os$QQ^LFi|#h0P8tGxh| zxA3sbi+|&vWklPotGp-2rSk&Y?=?Ky1#Vbc;{G(C=^iBI5oWG~i-COTZ_+2_&&p7FB^XZm5nnmlS*KO2c=gEI3Z)^G{Pyb%At8GyHPJ6Du*v8Pmo#|T32Gb0iul)F* zllRlPrLw22uF+y{y^N85JGUCRjo&xfte#%Mmljbu=avoe9> z%6yT&sek_02@RjE^H}$5bGcRPcc09ezGKVD$Ey}PY;XJaS5V2mRyBTYvx~eqqt=E0 zZe-pVl2XgK$hh{|)5jJ(ySzQJ!Sl`Iimjey@ztBOzU+iyPFEae*d#g4dNuG)iM@A@ z-nqDcp~1GkJ`dVe8RqxtT$SY;Bh5PBS^VF?P5bT!9QgL~?%t!m{l^XryW&%!%2Soj z>Z$zw`n^@N#rp0lZYleLl`34SKSZ~QatdP7RK+q;xq<8zCc*3#e?DVSz7q__Pcv%M z5 zS9hn6c|624_>s*RGZnIg6>wk2&GL6z>$oBNrQA@ZFo3_)3IhrR&I#~$TI+$BAi#S) zz~5;JI0pkE5kPxo837nA(>Lkdx=!4xI7jz4@4oEJ{yN_DWLo!MgPL`i*sX?Rh@XA# zUp?FI8oub6<0h-{?B1mt=oy`FV=!TGu-b90V2MS--2t8ECJtJre@)lFl+CW@W&5t` z@zTEhjwL_uY@B{SXmqz4C6ja_dsm6wwsPRlE+=>OzheK=&hwT1_w+5VuC@BUDWG=J zvFbgkH9*RA+tck{)7P`mTPH&k8I&8Y6&Ers*mMRfM*{`yFA$*X@wrjPhI z=Hsf6#}z!yjx{mvSoT)bsGi>MHcq_LG|%{2eE&wO#I{E&WraM0Ea7h3sfZ=qZJ!Xf zLyWAH!a+7(zVZ)c^_ zBK-DFd3ZTu@5uA3@()$5+G(xd(E+vm4+U<_>|>a=x#QcZQ&$Y=6m_~rt%md07r%>+ zs@6iT)_OJHls#*myT5a0Z-YncZM)ikYkfHK_2=8YVz<6KJ}TtN<(lEd_ zkoJ=wT{tqvyYu%Ai<%vMZnDvTO})`xW{JhoA%YbUb9*0OUG|@F)_`J zv2K5AMp9zR52u&^dRG2CHS%^jvs3$jyzTL*N8NRanFD;^S~`5IJICgUNoed`6%xub z<<4H+y&exWomH`N$IA}}Is3OZbns8k8FKH@)u573hc37~_;}sCp9z0`t9Cr)RIfF! z_8+Y5+sfw6)Oq*bK1++Zej~it>J3y`i+E7%*T{pvkOzN|%8*B?0Pvqu_2tWIEhiiQ zGwRv<%WKm%RCrZlafP#{gJ$VB>=3^r#o$XF>khR>?hU>gZ&Q%>D6`$G8MBq!ttX9V z#x#r^RqM&GVz)D-_+|(S{~9|j;MVK$HuZzQr><#z^x=W;8-2eYzd2=JqVu+8mUnKn zP}g#T%~}r6cs8@~to!A5mdP>?TJYjf@AGw+oZZvqwu)TKqf}$Pn~`hs-de6-9{KjS ztkiI2!p4~=&PBAoutMimL;t2T?KQ%TF)vMZno*x`G9vHUmxwX~qlkrs>mU6y+a?X>PKbE$xUjNXZD%-1j znAQ23ZutD`g3c=~*ct8!e&>Xof{rdfv7U$(UuFSYL1sQ$}n zk{aC%W{mQ(E%5JAKvU_Z!1$E3)N_mEc zZqkdl*yUUMY=+gK1HCqGFETD@HM(oNk-b|lI?=dI(icDXX2(|Rdv82gU)SqUvDK3g zX#I0CICC=0D@#9a(7Aevr+W2&==m-q_piD;Z1&ySpU^+7Yn01}=eG`b-)e5QCG*Jp z+21FeuaIMNbIHh@wksYEsJ(j6b)(1pWgV+`dv?2j-_$uY#QW{2VZCO)Ffp9?X^C!S z*Xd6xe00Azc5m09$dg?|Z$I+8IjA6Y?dtV92_2>kab04!=B2^EpF3PXQv5G$MiyVa zoxPi04ylxyR6nW9tcvB*dj9NmDQ0-bePx|uq949%ns##Nupz#K>hCqP+4S{sNtu8TsO?pUz=S_j|j zy7R7nS@Wi_%A5PPcgjD$7knvq_`1x^l}C4+Xg1K)Jbj)?ql*0|72A69akhU>28Z|j z6;x5bOV%o9$7yRiPk5X>VAwjd9S7GnSm&^GO40n>j(hHnA5b;IENZ~hH|dS1buHEB z_1T2#U&{0!QYUbm`x(m<{M8|=_p9rr^VP0izw@|f`0y^z^OJ8BzBFvIH+^A~E*thv z-B$AB?h5q`yG6H+-ckE!X6Y05UFt2LwRcWYv%Ax-E`7W#xAEa(t2d_j>UGaMXtevr zrq?YdeKpowt&=xu@G{#(^C9Q|y}o<*Vb7!W`&Qp}xU}wdv*V$AFFw54>fYVj&CTD> zx34(Cr$vpRxdTep<8L5Yy<-caTyFKaAD>`VM$dBWF&KV?(yJ1siX2ZRUj}L8UJ;b)y>dA)y|2Y|Knlh)VcWmCS z7J7OU%=Xl=Zu8UgV(RNyua0%6U7m4gQ&IYYkYkhA>6`WVIeXjSmu9mbPS^FFV6ikj z|NSmq%ie3Uzwj5CtX|6lIi)T*PRgup6|^eHk z(y{NC*4yH~>EL(&+v6?sZ+@A(zFhB?%aXT$^Vm9|*y_n=6aP6G)Yf{M*Fz5UZ?!Z&z`(=uI|3OEhgRiviOGQzJkwYhwSg{J$1-w=krIWz0Y@9(79W) z;O`g52DdoJ--oh#Rhqc9h??`ysdi=8SGc&VTg|m;0lm9zS=#%KSIb7_Rvj!I^R4!W z5~oa)8y{?0He^V%FULCEH<&WA!m8aP1HVlAYWud>>UkDlJ^NZO8YQ35TORRdUQEw! z1|v=Sw*TILTdR$`u3CLq;dbhkO>l%+sXOP)ynCfhs9p8#grFUMfkVpvciVAtrvrDA z=3m{y^M16|fS>6?i5vO*LNygl_`E zRsl0qj(~k6V7D6ZR-vnb0)fv0vsIT+AZ9ZV9SZoW_X5safVfCtt}2WKjJ5)z&-r zvmM;dD%Ct1$Q1~S20~SiK=>}eZYQu-h3*9GV}Q>BVXDh6pg}fv14JpeJ%DK(a86*mD*qpl zD&YMe5UoxL`0NGh#R0q2v^c6fuQ|B>wQ3+3fKo&#{7W#U28T4g)3$K#Fon0Fne!1WqX9!+=L3;B^={rIH0qlK}HX;EeK21X2ak z12sr|zt1JQQV}R{Z;HnBf z3gimp3uGvpV?cNc5P1x^q4EUmj{}Y=z%3P#0u%@o3EWW*$AOp=K-_U4OBD(@p9EY_ z0QXev3Bc$SU~&@3RxT%jB!LuxhsyXA;Bgx8ItApYWC7DNfca_QiSj%Rqza@9JX2<8 z0H3pf-x=VAN)xa+2Uwj2@|5pcAX6Y);FYpG2Lzo5Le2sCDoeon0$_U{c&mcX1GxhE z0`Ha01t2^Xh`a!NRCxmSX@FxY@L5Hq0tEs^0$-Iw8W3|4h)V+sRiS|MCBXF}@Lk1T z1dJ{NCYOLB<#Gu~5=asFrHn5F9_fJBWrntN4b_p$3~iZSLCn)xL|=KPvq-8yx`3fF zy8`%J1^li6B~_Y$#Wld{DqyU9uL79@*#f1NbWn5ZlP>+67R22f4~X8^eZ z`2yvY&2=FB1`v52sG#x$>~8{&H-Jhi;s#J4P$W=AIot$dZUJ#O0W(!7;Cvf!y#-WN zv9|!DJAlb;z+Ac929g9)1ZpVbJAg+f;B^P6rIH0qvjFoaFX1gt*-wjY2gD)!A>dU21gK;I({F%zA+Sh!76PdP=>mbu>>J?o9q{`GELCX&7C!*1??ABf z{SIUbWD6`;mOp@?A|T`k5TddG-Ic0&5tCJk!A1J}bPbpC_5^>aX?g~0O)Bwuczg!u zf*MT!O3W!`ut;z1Y8M0J>FzV8Oq%7cQ(AfH8EoM-hl#$y7{hyJeDtGSu#qg3xI^Ed zm9F6`KF7SYT(tD>i|W0tm-wcH!4>`A*E4PUm?>l3b#!VbW|uPPZJ<}PXX46=1{-uu zCV5VtD6hO-`pTu>H!!$h@cTL~DjWPTINZvhvEKSt2CIckyuCfg%A#u)@}X;TLrO2P zZdHRIUBfDC5LI5^U`V2~xxw(?*P!OrH!w2XycNItus>bfV88EoCA};E<1v#w zn@pJTzc&%JNX%(w&|6P$%|g|rrNQQkL+)}_TvYyy?-=v4krPLm8;ttBkyNub21dFU z5^dTT{LZhFih9**gKZ{z0!%D+Zk-t*VgibLE_D>2ABW(y`Fr*$nf-V-T!U! ztGa)%?(a=CX8M?xEx5(}vAX};RBiRu3TK0wdal#dUT1^)hUU}xf?^wf{C&Y|E(VkI zZuqE#Flx{`W4*a$RzB z)|!>lmXnV+>-^jJ;Fr=G%7-NO_>KR2>t(sHeE42l?E~9PSWa$O-Xf$KCSNb7U6#$M zQ&n5;FU{l)$IRIYay@^G$p_D{x9K$17ObExDAy$)@+qf^m|Q^K;B=;D zl{J&kHT2QU6qBtYTWXGGRkiE;8`F)zz z&`dsZ?vQ3RF}dL?^q*`-PIa{9Oqq|aW3nBq+_F5ea`oj$6rqEG;F~9fZxI= zifU%T`H`A+(9DwaqcyYDtRd%@YCB;^O!k>ZB=2VD?2J7$YtDR_W<4=k8F_+Rq}_(Y|CaOr{h_Z9 zw9VB^yKpNOY$tmZr{0>iW?nunS@zmKm~8$w^j+J5`)kX!#X2!BCnu&dE8qWJH5<%S zZq9~!8fx2r2q?GLj{0j?I8&X0{&ov*Z zStsm)_MJ1zU&GGe9_=2xVR9o~XrDaWa2lg6*OmEr&Bkih4LhWnyJp?71kJ{2W``Zt zY`kXv@{H%Lp@)V&v00jVYG#kk)@*`i4%j@+CTi9To3Gg<&3a>7Si>i=EMIs%HJLvzkrQtUq>6v+0^SVdpiQp_zPlrD--(9)H;x2GT_h zy|o4Z#V%W}~qO znl09B4E9j7K+VQtk2G7NnLC!F*-}GpUpD_ZdaPlPw%~Z|sb;~Nd0?lt=k#Tod17ZY zTdvsz?5t)hG@FQ>*DOS{Npk-$Xt+{CFBVMIY?Wq{v5T6m)@%xPNwZMRrec>hTcg=D zEM2p;noY;9h{^U}ry(y$b*^d)hG{kvyQbNC&AhP;&6H-du*}%Y!UPFP{=7pv&GEI7Ou%O zmZ^L>kYo$jlJcBo!9IrrpNhJbV0KeZMoIh3eApd z7K;5jq;o>EHJE>f_Cx2ShHJs=nw`>Y9rh2Ks4mmfnuRfME}Mg7abXzZD)R1 zY5w7KU9%m`yJ~hrvuJFDzlJw8+zGbT?3QM`u=bkW)+`45QHp;!-O((T`4DZnOiZ@m zZd!@S3zoaua(kFxr7h=wPs9JfK<(-FzGiXQ63wzT+lvKh_CT|Jn4h*X4>jA5IcxSv zvv{ndW;y>ef1LxMm4=VC1rK7aG<%}iA*`lmPc=)xJ{j{5r)QcSX5Lv_!RMMKV*7bQ zlG6*#l9)eOg2!J@xf&)jKamB6^E5lc{5$3sF@4EY_OqijoaGiX&DWMY#(W*^M&4ku z`BSJK7RXetLoR!qDq%~Qe)QKae1bD3pgiGx((EMj^1Uyo&rIbCPmw%}1u^}qEq9uE zE9RFoEzs-?^G!4>)a)#F(SUt~={HQS&;K0%ECS{9L&NjTPtxosCTo3xY&6qlMdceN zl^SZMr&$_ygA2&>h`weQnV0{AD9KF#Q{o>$yci%*YN^QM>GI=HIjBWZ#j;T5jVGebB73W|^|14dRUKJXM&= z6=snA(te352VFe_PI*h|f7U~(G|NZ$TNZeORC zh7XzlB&*6v_GFoTL{qfKxURNb4mK4#&$Pa_++*hd{IOjF&7NRAw98s(mwk%$)U06% zZeMQX88u)=c9cfig`YFOfaKH|lRNN&=4g+5Q*F6i%u};wn&n{=FxhvSV{(sQ(r|6L zmYThi`#%D_!WUa>_?r1z+P=_MvwW`NLW&+>1Sw=IBBh6O#n$&nn3;+2ljMG>7I=QQQ}aKo(?44OKvxVIBWg%(kXB)RwHthGYP8CVA5=noTm;=u0xdIG4&&IWnQq zY|=3_mfUF^d5|Yfq*_#;8j=h~ek8^ptLQvt<_Ya8#p`y8rQM}e_4S7T_{$*UHrh@* z*%rGfhGJZ=SZ5BSE8 z|DAqN5&fiJbchn@FeOqFCDRc)O2;ULj?)P`Ny%LA5nXjy8P>OycQ`vo=jj5al6-=B z0?8ks?Vz2sOX-FiRxn%2Y%ndO<+Ot2Jw;Y2t8l{_hVmw=&6QKQVIA9@d?UnAC8#pV zAg4Sp$#_9Vlcov1Up>GN#Uh?&MzgKAPOs!itf zFT3zy8X~(gjUjV()&5MKXd;cH@s!Ms$P0N_=0}hlEyre)5BZV{)`uMF6z5ONPn%Ah z=}1>i_{E+w=sMk`+jNJr=q}x(2lS90(H@GUy(D9>36xC7D24WMz56Mi4$wh5Ov!YF z_W1M9d|E&YNd{vBX&OzT`#g%-B;&F2$JTc!ldRbaG9KHX8c}1KOl7D7RisK(g-ofC z@8xeKW3xY~h}yHY{B8NC6Lq1k)SY@zPqHTm>chg0)R+2^jK?~WjKK~hd+J5=Nq&6_ zphdKpWK7nZUh-t|hGgtj###?kVkx$NG;1g0tZ}rD(GUO#ATr#3{u?+vnkd+Kkr7PP_hE@G#Fi6IJWUNQVc4RDP6e(IlODTwg zX)y)RB=VvuG>zP89E~RrTE&L_i=UwK3b_KwFF64uRf!Rz7-6^~r!_sOBj>BN?K}rn4kNGcpvjnQ!$iw3qo9 z+D_|9(HfGWnWZGdG2{ICNB(zD3u;NGWJdpx{O30ro{{00%XE>_Sec6y#|_fdkQbL1D2*=CWx7H~={O~jj0MEf7#d6CXgqmv`#PS?$NMyPZlmqAgQ97t36Fmz zuB-|b06(aR5)DekRg?z^?dyey`^__f=<#YI!$XSljk5AV3P4985fdqpm0_~ z2Ci0+eDus?w&oLm{&`BzN#4@x5%uC84x~Xen1+xuxzJD=M#IUKMv#nrdDASKO~)vO zj+2aleIpt5l0mK_s)|=58O-wk#hU)46~JWHau|)IQRGHrX(%~U9~wXdNk+J2L~8`e zfRzo&AXO7;N?&;5lL0FEw5bG2r2Vv!D#m))Cb3&|jq3_8gmlME_# z;92$rjb?rz$)J)0$v{#!lCh)a)PiKps13@(AX zYEl6=DuYK6Jd16h5SmEQ+~ZW*z_ZyViloi7MMXv#HuaaWrFc3(2k8(c&|ylXndD8g zXg2xK9GXY-X#vUjm5f(SW_~(7Wxh63`9)lQ@jk-&V|0S%Q#ZC-ce0b0HOrYjI4W>*QMc{HDTkONJnhP0Az zlR8Y_bNf2EoXMk?^om~7Bg&!2^n{+$GdfH%T62)XDS|f86q-uYX$H-t2{egTlZ*@v zAsG#FAsGSsmrlzwxFOw8(CpV(Q^emmD zSlUB-X&WtPU*E|7Ed%K?aDIjz?JR}R63WF|FqHul8RO_cwj|>iGHlU=n#v%Wj4{fX zl?)-irN^xO6M9CuBx6!C2K9i9`uf_@Sd(vB+0mx3`5DVQzz<7T}XzPx|1Er zuu@O5r#IaG@1cQ2rWFo~_PhyrOTO=T-grx`Sw{^s6);huk`0QQ~NAWJ>A zzXkWEA#Ekay;(!Axkm%IQ4=yEJu;wATu7IDA|o&|;IfyV(Q|r1x%7}8Q4Yn?UD{4l zX$H+CZ?a@RQS$iDV(n*AW$u9~Ri|Do(2yEa6DrG%&tZCxVyGs|)S}u{hvcuiDs!)E z&|tnRtSE>Z_{#NH@arLJFp3BqLK{G)G=U*I=e5)uP%| zp0$=Eb`M$WOC-l3c91(QXU*m4n;dNGO5Mqs6_k5&ffe7)G=d^2m~yzD-mIhtE8$5K zXd>zGwc*^Bs~p4}!HheNqf%_<-c0*Ze{$hox1$au$D$_DGw$VMI>;3#kRkWJ3HN?9 z(|o3%xYtok1E>`C7gPB#-{<&DF6Tiu_)!|+&zXK?Pqx&U%&8I?(svg6Nb*^@59ty` zQUFb)5%ira@5!_?Sy2`GfEmzHN}~7N_AV5{L_ry@NitD47yI&XeBMC`)v9fRFB6vgol(PGCFJ7ALcV1z;qy;;p*k7sPeRNUj`A`9L2@&dU(;AdS7**ce5 zp{wLa^GS|hOs5$%it5vC?qLJAgxvet-1D&{hY^O693_b0>w2tETdK*O*+h}#znOo+ zNQVBG@x{;F;3tx`lNFPpei_-9gK57=4wil8%HGoll2Q71B!loitjHXCh!0{qgj}c> zS+H^oS-HiugeJ36US)aw|2$SB0T}@QbG`v9WJz_XHT_v*S>Z3N$e*p!hb!+({YehS z6>#G+X#Rt~uu_FoM2BbsO`?O^`F(o**+DqtN#m*bl@*_t9c&$i(w`Ol#SN68DO}EH zFKfi~ezZ}9(~mu2M2 zi!YPO`QJCjRJM$46)({ z{NEGVWn>S_qg;ATVm+w`+0i?aum7T-R75f~^qs!YXOhdv_otkf-Sit3QUR6VTSBg@ zH?OvI3^>!3Glop%6|B6P9Zd4x-tq%QezTR=b6rV3-Jk|lr)nghL?UlfB)>Qq(+4U= zp(^x{q4Fp#vm{41{-uFblVmtc=G&7k$uO8T$uG6?W1v3OCD|bI19CE}=Shv2m;WqW zjd}S+SYCt5GqXCCVAxGvOE5I_mqp}D!fmMy$&nQC*3^nxl6<`d$=h!?Ct0Q`$z_|6 zd`)iJMw@nEDyv)EI&xlCQ%3TfsJ|}X5&f9yOODisdQ&fwU*J2DJ#{8Kk{60yNyZ9g zzMIT*-?}rEU;2BJTpw5b`$K_vG?&dXGiK}u(m2jQ6$~hGXt5y2_Xpy zGZ7pDggCB?%R+Ei+}&N0;O+~BySu~UvcTf*&H{_e;{Kh})s;+!49oBR_ zTeoiAx+PuR!?Z>~d!QZF*b-<9v<6xL&4E@xQ-EnIE;X*3;itp!9F$RnN@mywXlEBk za&@m*lPzVZVyKLc09%T6r;Lp21a#K#DXXeaH(cxWjgGa%o_ZveL`A4(?~7|zun*uU z1nbuuQ1w<7>1Ri)>a6neo?AQ2+k~yw9~We3i+VFa?PNU-4G9!Tz zz;Iv~z{-pUSRq;nyJJD1Fwm3sL-QaJRXHB8C)9`#XKz+ioxMqo!~GaNj_M~bKFw6V zjrWXao`=9e-~iwcMDNGHL*fjPizU;%sWJY38L=IdC9kcsX98LkJ&bS*%pWVjee1CZ%5U@5Q! zSPiTMmIEt*RRC$2Zyi9b@SY*#W*FhyH{!w%*az$db_2VBoxl!YJFpG-1K0{|0X74h z^pN*^#LF$1lu(KGmHrd=)bvf@FW?Yx0XPqw1&#sffFrmP66qGlfZF+ z^t@-<3H@5#m!L9LBnec)89hT|^R4S7-! z@~1FY0P>;k+}N2|D=PFp@HcP=V9nbDw}D##iAi%0xC<~3X-UVl2f#l70A=J>U(v1JQ2yNA;#bm>4hu-*EpG_@aX~Fd#k=z=ajz3Zw**0o+gHK3WpM z0&uQqMz{GEFod*TuH?C`91IkPfI$cu zM`mj4xisiX0nA$fQ1?oZmq;sycqOQck1mJEU+fZi&l;6QSQ1c#rEyK8qUCeDk<3Qn zx(7hxD&vr@jE;FoukMuqiRmbO0Iy?SV!> zL!bZz=Y}thkk@S5wrqcPhgJw%0L;_`XbKEMd~<{(WcxP*S^`|zw+6VnFM~8PWdY1f zL6i^_j6!t;C{SmB!r9YBcSA&1J#s7x?2T(mHx%JOpdZi|;D&4r5C!xHTtP$OyCdZ4 zU;wTM1A~Aez)0Xe;zuAH4v?k_zy&np#~^Mr`~N6h&}oo>nYav@giu@BAe^XQQ|kSCk1DgTzBUk}eWC!AQ0W7No?)M|yM<2Nt7kdCIav#8Zh6eyO_Ng9z3UPem z$r%Hmeue^>fHt@fLC8mZu0Rmr3uFXtBac7A!wA`^*APAeTH^X9&CDB#d=T*$u5SR> zfs+6qP#A!3xc&-!0X_pKfMdW>;1IxkM*tSU>ny-=yL--#)NF~fr0u{qU<(j!KeeK| ziXkIw`3+^iM)(T&7ofy9fd_!SkSve_vsTP^6*vu?1I_|x0QNa{=qms_{6&Npfb(qs zOStd{!DWObVy`D7f(0sVP$Rsi{l5fMfmH7;;2+>`;0|yXpe^0g!~1&3xQDoY3_J&( zvi+an;u-J)cnMH)O85!*2z&tE18;z&z&pSKa3=5;;WC7dGl4vaAB1?;wkfV1nUqq~1xN>Y0*L?*fU`wjFB{n0rmt7LT+|4+zEcs zJU5pXupyCCM>ky4g2{kW&D6N&^fDE~lt3~dDL`A{**i5AO^$2Umb54JkTkrf5NVLk zuBZ6w)7EHh-bzAB%^I+)@yMeez%ImNB0MgV9&kfiS|AO;+K@46N#loW(s<};DqiI! zUruu~fQEUchS2_04F%vM`kX)@kPFBSaL*_Q!bu3TBg_V51!zc_5vnzv3h4{7=;@H7_OTj>g*N zpqkkXDua@onqi^T3YjWlmf?B{z#+IY(tZUh0qiBTpNhCH50nGS0_wnns;oG?$;DNa zJ>udX&E#%i!^sIBwld^|g&_L@i0cRRARW_zExPAmPl4^*nuE#4eDN9|%)dp$-H32i?>LC0LXbdz0SoMZL z1E4;@bcN=)ZUc~}HP8xZ3A6wvffvgF&uHxd4w-jGf`^RM4!4n@FXH+Dy?~xTDS+`T zq_-ZY=oAg_?XUZTj`T4=6c7z?2FTf8a$4kcTr2_xAz?7UMqUcAp_3+tV+Z(z+X9#Y z7vMVRE(2SEM7V#8kf$A9BYXoGacuxNm~bb38{)nKUx078e}!-#FqG1;2`DwU-}mBr z4=@gx4eSDT0Na6)z-nM6umqS1ECLn+^MQH59AG*y6_^H01SSCEfziM)fMs#AI11O% z!}SOjC7g?RfKIu^VZ>1!NlXt1;$HZu$|I#!jGUNQay*INM=Os%L4>u{}T*5jJv z_$Gv#fem)|8||)*=z^r%qSL9#0K4Q0&PZ7p3!+LCa}}z1du>olJ3-6t$#l}HkZHU1 z_#ZW2EPu8?nKR;FgcRl_K-HZFZUQfW=fGdUA>b+S1b7TkOAmnuz(2r!;4VN1^*2Dl z?f|!dYrqxYGH?;N07Re1zk|S8;0$mAI0_s9{sh=g`vD3_2gMqyreV6O2?ba2Dvp(4 z+!26+upIguJ0}!vIE)BYGZNbylyXS+g_5~!ySM`F1+nL$;_aJ93B_`bu>UK`jv;~> z=-ucl?Q5(ushS*jNT-0LVUsB>oYZMfAyfjWko2rHeklf%dYwQ?%S5G47B~U07ls;R zVUAiO?Kyyj(4VkE>^=0V1`yqENJ z(kni!kP@17M*yVbb#Pov1<2UZ(5@oRJ`=l~8VPB=%rhQv6h;ZW9BIn{3PO5%OjQ9k z;dr*cV`g?aO2{rGjYKlIjC(Sn6?44cFe{nF=b<#A{KE~WcEeQ}b>l>;hQR zBLE3i;YxbPTGJ*}!MAa(deK5$v(|F}=2gw1G^Dk^BC;o-+U?pYc7Wm}gLIBPKry7S z9K1LovFAsjn060fc@zZq(*G+XA`?{$5-$cgVAwNK*3V{Av}~#)z$}3IsBRAH%;#uR zN>JHTpns~?-UbxGBgB&_8B$_;NbLRco&; z(y3;k#UBAk$ALy!y(2w^+6#adp98`Ln}9-au(3C+x43@|ya7G~pMVmm%h6*mEs zig_rQ=k|Dvj;G#uW{+q0Y66)6f4~(u09r0Mk^?t^6o4P%(*SNfinb6D9teE_cOWg` z12EnbA=4P|7-vJ=e9(|CJ+6yFNNCPuO#MzFAq zKn8%j&S?Q}yHLedM>@AnSo=yq7Jypdnf_m%MNfSiq}+eE`a%&hx7pe+nx7$a80cR0=a>?$fvZ% z3I`=_25*H()|{GPBvmsHU?E|+4+kOuzOBb=#tFN${J75tB0@F+3`WJ*{5S9a2QBGWyww0DurK!MD>wMSwe*QeI0Rh|VUaU?>eY2MpwSG5A;n1|^#5K`+Dj)l_<$dhR* zzII~tG?l2DT4{@fw52x4#2s+1np@+V49fzofVuz+wYM?m^Fr6AeYQkeBY@|Ssjd1z zJ%IZjQ-DL<`)Pp)5;sHWhx-OPQDcP6+z?>qruuyogiK>xb0C)44|q}Fa)1(?c{>2n z?eUKW*$!x{U(-0}fEl|dyX;(ClZJ6B14Dsfz-rJh2TB4fff0y%f{^yJ4)r|Tnrop_5gczSGWCr+VIp5CVTRPDp$i!}D!%cdCZRU-zCm1~dC=~lN`~E|O{H#biz`n2ZlOrC0 zJ77Qbr^US+@D=$y0dF7;?q`9QKAz#jONj770)=qJb!wms?o%P`g)k+;rwHj}J_6|g z4}eaI4l4!HlL1MABmf1sAT$Gf|1>eccjiri0r(f`j{xb2(EcxRLjfKGFM#L3Gk}FY z0ek?alQFM5B@mJawbU74%_wX);1yu6JvzDch*R2l&Gsi#s)&rg0H1+RKo5W#V66iI z3it+~W+h@l87l6w65GLt$yS_VJ_*2FRapVzCVRg3F+b z&V!3fxClf@hV)W&JjxI76)p)7J%RpB&P7S2Ld8Jd96 zAfh_rMcS#UJkrVmrGcVAVW0@$2WBM^mH-}uz8J!#&{lDT9Hf5H!%_&g;iXVo!p#bM|Ll9b! zu>?>Y7@^-YZZxjP0b_wNK(UAThd)~ji%6a`X_hTs4_rE!Oc8lSfp+HfV*VqSeB$*Z z7tinrsKp)SHLe}G+bc`gD3h^4NMLYSV5s)0OIoCyf3;!c*lll)ASFC7C@>`0P+t^% z?Bd;;=k9P+F6QpBOoMm!y52`-4Gc%sb*BF=FI(y2{nZUj#^At^h`?Y>9g*URJf+J- zU;Jq4c->^2h?r!ES&uLc!s*#N=h#;DeF<>O9~cZtg7%BOC=NeXb`^n*XL~T)jmf=c zd4|YB!;5NSg+nqN)Df;vT)e{5VIogX!(6YOOFMqXV@EFynkL|#Kb(Rqy7-JBnS7>0|RPh30`hha)BK0I-$WL=1CtYn`q8xEJayy&3f z8){fB8b5UjHEtD?pSrX({wcmZbs2!)c8h+78ebRFp1FjY9w!nfp1F8gxo2brlQD~z zZjQ|A(+*6ap-`wbjW9lkaP(MSAXpW+`c&%BJR@cGsP}MD83e|PqV;n~!_`en&|TOy zp!}*z=kJ0p1TBk(n~$;nreVd2M>T?AR?SuTy>O{y^cU@4KEA*1;1UkIOHbpIDs zDIu02(pn9jiQVB*WYfM?MrCJr2ts-J;m$>xS0K+Kaxw@JrCzz@Oxibzv=^Bu?!I<$ zOWGhWGC+X8#41omoQ5K)OFz?{29eL6bpl5yG7z?L1<|bi5Z8L`+6^|&L`pC$9?f+x zsrdW~E&c`+>@CYvT=@F!m-As7g{Ge+BF}4xv0jvW4XOF%o7A8y=5cdsf!#^^gN_Y~ zx{ej=Ub~b^b_PbB9t2NPOnHMI!jBMwUp6Ke`$i`c{f5)=hv61@M|x7EJdzb`Twvm+)QVk(P{ z?_9jAbigf(XjW(czS*hgx|oc05W_Cr4`c5oL7lA@6l_t zj_GZzBKEqO-9_gQE`GAhSHiCe-u!?ry9m;!UW?U&)!>hbjsSx^~P!UbKGGfCgNIqT|Kf8FF9{3B}XSC#QJ=>^e zzpvYIa58>|R-OQS0P{%|{&=L@R4 z8lPs?=AUs0RoqSjZJoXIw1k-VR05m837m$gDxdH-PP z$kZ1um|=GX5kvL-C3b&B_0MD#SH8N0;Ai+!euHeyaf+3?_UYbu%-)Xgc52GgTC1xl z4g%v~@f+!;fX*9qhhkQopSo^Qo;bQSVjKy)a!8kwyHv@1UYBdq5kpB-lPn28(0HA6 zVFA*m_3YWNPWLfyEpc?^C#Nxc8=FkdiT^z&mokSMOHb~N|KldF!vAcOZ=1bMhXW^n zHhY;a1x}fOSxk`8?CNqS5aYU-ch&5XRJ(+brNqtoW)EmB$RPC+f*+RC^uzEN^aMA4 z&uA`XS`;L5nZQsFMFW#LiLs<;X)@W8RYvtDTGPV4XO`cSK|DHH^yu42aYM?{GXc%A|56|mQs^|$m0lGP{gBt1 z7E3wwx0pH8BHk=KpPj=#hE#YULy%ZwF?&bU00FC$BWLK=-}9cw_@uD_^EOD~AepA* zikh~o`3oW?zn0T5xS$xH0)kBk1$)cDnct?iNK~5x6y{%f!Tc^#I8skE=Be1`#Y11D zgvfTCUQo*5?pSTt*lK4hEN40M))zm1Gv{F+aHmIvHVcU3NucHO zqIe3lgf6E^FVk8V`O-kDHXhOAyKMI541+?!1lx+!NzIy-)W(9FGzYVv$d;zopslPE zScCasy-pqHCk@?Qc|{VW=wq1T-x_&2l7?<6KW@zV^Fu+Q_XCZ;w-N+Dwu$0m#niLQ zSWg;-gW#sSQYEHy1;mSFKUCgNQ^fKbjl<@hL`F1CTQ*jSqdh< zp;Gm}sP#GI_DAk9>uyiVT;Y0Q(7=}1tO>WLWBZym{32GTgut(hiyN>{Wd`x}%aWYS zsh1Q#3!6mo)|HYlZxSvlDS}e{l-6z+5K*ACCEQ0t10xK&7^cl7#W7MQEhQIhbMB@a z(tcpaH6~*|F4wTIRb4VWC^#_Ph#L26(z%yDX)U1X@ITvGRms8ltU;ya%%t^^m=ER( zbt{9V?BwWeCsV_WWebXLsm*z<4a>*@clFX&!>UeScNhyoEEfYqLJh4%q$`NKh{#B@ zXLN9|p+89JvyaxCa{SD>felSYthu=AGEC7^LMJxuvv<~9%-=^KhAwbELe8cJ1fTEb zo^w*|#Ifu*BZa0nyLN#Kru|KQ<5G?xg$90cpy#@zXLBWH%9J!_bNJs#;QDa1d( z_c)d*F3Tr92Oe4yQOKHq4@RQR;-H@0_)NwQCG^P?m+{_s;g&fcZb4r+wHjDJeFI8W4Ggk^P zT3M>H-fM8}0G1LVKtF~uY z!CS3DZ@5VkSeT(5Qm`C}8MWfynx!w!ni|KpuZTwGe4&QXAaMmrRIaf-H=LZETk#Jy z%+%Q$l0=rOHEohjWezc{t|4Z7nmr?f4afD|Iqvl;y5&ftJ#j@}M@m}oUEI4wnOaK* zHc@;-3@?zv;pFIt_ZP*>K3uXw9jvQSR0i9s7<@cxN}BbZ3bc81qJC3F6JltN6f1Hc zj1M6vXk@=X(I zaP7j>MWP{77kAL)8u@V;>a01Ka-F6(Z69k*eUTzRY+cu%=YCMq8?A}nx@Shl z4QX7lW(p1#{`t+GqF4!Yk_hhxvNJ5Nu~k@82Cvj5g~JZiQ*5u-*GWA1fV3E`hyKz) z%(TJR{{{*in~Di;WwYM*Z8DErYiJg9zMc)lDNsZ_0tFXR(P7g&e@gYRk;YvU^c7OL zu)T62RiF7a5B5U}H+xX-mj=Su2cwfmLy^zNJl&-2fS~t-ad0ECHiOwqn0?J*rV@=r zAzw&Qw~@4s-)mkvH2+%974CF3nAG4rM9jF$frcX6H9g;(97Leq%h`mm^t_%g<5FYGp1zH z{3%*$c{Ls9Xe`G1p&?&25c?R0G!}0eDixIQH>Wq1Z6X@@n*&UdO~gola{*JsCgPyK z`GHQLfijlikt(3n_F0fm(C#^BA zv=FvTptuJLj)a#B)tKD&Qs3jcnLvdvTZk&4i1-2uj(+T3p zV3|&n3vVUngTi_U6l~<}XYMyy+I6Gswi<=DtKx0)ZY`2!F;_I{mG(?nEuuqyv#+Up zdodO+EFz}8R9*6|X9k9M9G}-@Fvcey-UH{?!?WP#}qyW&a^nk*ee#c~M!JBVAj zw-xLloqn1wQ90k;O*B@|0oFA;h!|3K=^z3Ng0d&Nxi5Hsv8;O^^;-aR4s~kN!Eqf# zlY+2CP);dmu4r4_QFf=cDYrIkcWb8^t;4!Pir*TDucXwi*|x5eY{#13oBO5sx`IQb zPPwO(h$)29Pj(Vj3ZwK}prrarjrT3ny6f61ag;ARi4&wu+*#N_X;L{I?-eKh+&P;n z^my0N8yi*B7O7IYh_0fd0EdcQ#cXnF)>Q(By9)mz z2rqOMQJ}It=qhXd@1aYnRwWy@782^Mr1&`G6x)iJH|ryhK8o1BVzl8fS}gN`4#qN@ zIN{J0qB5({k*R(!J_o{^IMzVVB)*0xkmyh^y*}c#o7qi_&uC6U^G{U_2Kv1TE8)U= z%6XExYNoH#S1f(1iw)~m{z?r6s&$sN7rRP9Yr~L}?Yd~`z=JLJS9=s!;fp=R4U`(& zo_hOzcR#zAXjB|@u&qADVO#Kwx5|L?_k$kXpw{6q=zT3Kb9`n_3~`<%kW-h{=6oRi z+FL}GKn~qfY_>kqr``MNdn4(Rvs~lrZSL3t4oX(W6Wm91f*Kr6&9RX)_Z6pTdyZTc zonq%KeO6yFwTro^A$a>nIUr8{!aeSj?{N{)&% z6Gct3{kAzo%ZZMK1BX$QG?aEOt!&OvGOjNJ8C zy^MN;B1KMTDw=8!5J9t0ff0Nf>wG=rWFe&0!Q1p?u$T*tSU-ZZCxkBBD*wpM#qw0wIBV;v_$#KJ zSZO^r8 z8~Mz(b1w)PV}Cu$U%3Rylsbt`-Tp`8ds~w zNTJKR`#S&dp*^4Wic9%CTI@nzTgowVSk988?44d6&b#Oo7?%CUh(MMSGDf7x1QH zJ)a=W)SUOx@xz<0g>r8%7@IWt42dR+Te-~}Z8Imz6-A3t>1yN=c`868eKN3UqF5Vf z_VOB!2IkDUYwbz_9kTAmE+9s7EG)&^PG)cJv}T+ns*Hlhux^MMiLmV?5t9e&haQu} z35JND&GcuJ#MU5qhgLzbOhozzV*>;Ev$hgJJ>t?8ACWjXmJV|l$pkwa?StWgG|LHf zCOuStVX}A;3?o^qo7IFob;o4gR2Y2+j}f4P;CvY;NrOv&HmI4c>*>Z?!)i^6^5sxb`YFRWu@{Y&S1k z1X_j8ZTsf}`zE)Wz}=B>xJ{_D&Q!6QlwGEZzrxUA^)iH4g!$JW6reK}(<4x$YSX1| zUav^D|Bm;LZ<=l*0>knd8cY|bBEUUls(2Iu?x8b;Z(cZ%vNL3k0R=6WwnfarLQGqC zhU4h|4ACwxa$KAte)YG6h^=|itUfcvIb<_snJ>kl^g#LkLl>woq^ zFOi}WH1eIW&~Uv<&|7?sh^3Xx15K&siSdbWdIFZ{Jx{K@7kZSLP`GWmE}G)CCkY61RwhAUbg5wu^QBEDuIIgNDJnboZ>a3JhnKZ zxXwb}dPs3a%Ke$CD{g<*$P`ynZ=}%Q*1UUbW!ZIe`k0LE^m3N#Df#LoF48<^!S5#H zNW}PqcKbXLR2dy~0t|<{L*w5rn!C*>(Lhc0+M&Fq^JUGRT^W0S?Ut{61Q^OQCO9fQ zPedWF^;#WSn}~h8ZC5QHkr%SE>7TXSkS&XU8V_I2jM@ z^=HWmobb_~c*UL4k&lW+Xr$RkK0NU@RbC|8MS`6kB6?1wEOc8WHubNG;)yIc8Ms6$ zXVtv6wT{*(@=~i{7>B<%OGKfn=mb$qMW?FZ^J~vS2 zWOiY;K=6pAaNup*zDgRAUEw!i4lDF%8u z_grfu1xHq5{%%yVSCcKnT{RwBN`Itq^Yp-|evQJL^oIc_>|K7i(I3BWgS7M-*$Emv zxlqXPAa^~@&*LmA&JwQ?GwY+a@fD02_rv<;P}8n8!nXm&iSIYn;Qh6+>(CletP%2` zUn5*ITfA&{Q4+gz+N0h_BZ5uMAisVx?A01E7rY{ptd$CZ? z-24sMoH^>{KDYEp(Wi}h*NSJ%8wm<-jyK9*s+-%qrrdktll&mOLFBYt4EKc^Lc++k zqGm%(AiZ15kt4&^JPoon$nXz3F&|c=n>Sx4c7Za19ZPg`jiQuz*$_Rh^E#0Nm3GDo z;^=CzB_OaqRIl0~x;4T;=8f%9ddO_Xg{Av!D)O&Z=`hT~IZvVB?%ylSWs`W;$n0;z zCai1YAI$TD404%;hm08b)_P$X(4%oezCV8Jn{I9vFKU}TeM1Z%H_OS`uhyqq%MbtS z9Hi4tIKGWxB-JzJ3;DqlsD@jl9lnS;7xvZ76b5$M>?nVD^cGR1&Ubcby1hk=W;6z; zT)&}X@2Z0pM^SOTE>0%B1G7}n+~oQqRb6f8HCtWS?C`B(JZ=-nQc1;04wW3nzSZ+$Caa;<>!zbWSU;p|8c;!ByIp?UtHp zyew_GgV~RB(9(3~$lyC|i#tusUWr5VZP+8e;ws|c9=S&Jurx|?-1M1eW%QZQC8W4Q z7hV@CX3wAg;Q%c~b4U;Nh*T|M>>u}tJuT1($wYKhJTXPLZ;2pWq-iCOt^Oj8Bil%?Y^Mh2*brWAFHs|Wqm1q?Qen%NSzwxaaU2a6=ow<4~x>R@ThdgVL7Y2vbpW5biJb%BNHdmC}Aa1QouNFY+jMN zY1Kt@k-{f%NZEQ=tZs!y*mqcr4dND1EBO8{N5p3^Gz~f;f?DJ3Rtbw_+~=yF>#?S} zdux@(ngfUGj!I|qw!@Tx?#UMOlpzmgLmd@F|JE=8d4k0cB^?4O{l@(&eG*lwF>MP- zv1kg%3j^bhiDM|nI`f#6^2z%q*BhoyLeHHuTlh7O6RWsU{Lo0uOzUZUQ$Z}Hd zTRbk8Y?(IPTTsl#m;~{3GVJFzN>NK zNfFi7>~9PdbK077W-fhNP8%Ix+`;iiETs8_a@uL}tgSg9nWBVC%h(PNP)F2~y}$Cv zmY-)tZ+yl6p=~P~riqU2&<<8Hq8$dlkAuaoc4n_CgU(3LS)t{y?m0@A$KD$I6JA&{ z%s~ph?yQ!ALn6f3fgu|$U5p16icA%DAi{AY%ZCVj)f zm_k(U3~NlV0zAv4Z$IMD1$s<6F$=`9t9!VxPMO7N#)OE+2yDeJ$fk;!H85khGbOkY z!Ttg{Yg`ciUC*{YGQ?F=^ zcT{v1O^}ib+B+5QUcJt>*A}Ee0*bicqA1c8E<=Ub3w<#f^RAIy;X1}%7K^)@D^{L* zMP^@CH*!Rpdn-CaHZGJyL$P%#wH>$nwHUNCqZ$`wxZvp2-gDZVX^lL2kq6UUZ72ve zt+^t4bc3V&eUxnf{GaNUEIOrfySR!c9VFeebyv#5PhUsvLkgvaN_JckH@cY{WHw!u zHBNz$g~l}5QlY$Mc@!u)%t7t%u8Kz8Q9r$2dYDt}?v4|AmBsDu(Bs|f;xlM$3m`JJ zl#0eianW}WBj&;i=^U1fc-lN`TJ&*3JK&f%RFDhVr1rHG%n3vDD#@v|F z6N1f0Rz8}}TJwJNjNk9jCvkm(>Pdo#?7fd!hF~M=ol%$R5kW{tIh#N3L+W)A9u=tb3E?e!CAJ%7w+5b}Sucl0rP~1$S!| z8G56a}T zOB`;Pd|T{^K}QNVth_B!^nrd4ATRa1*}s&>4)CO@B~tuDCCEM-jUAt_MrI(+dm01BQFQ{;BdpBGh!_ATJz`>rdpNnw6e6t11RPV zhZC+K_V$5ft;AIXwqc;li87|w`f#A_t&NAlN%P~_)x9HJ`$CN^Aw@b+e9ay5$C>G4 ztbF1{l3>Hkzoi;CXFa_3Vvm+Q`@=m7bd?mMK5O4n^y~{SiM`sD-~`w8bchy9)kHXd z1o7XGG1Nnf|9m8(9(XuDX0bVc%pxDmw6IOMC(Uv6JO75kKxqRIZ@zd=0_X1^78jXfz)v&ybcw@)q1T*{15kF9=snO}$@q&nG!Q0)7g;_JgvygXm3_L@ z{-#ZjXM4q^qkixzoyarD9BND8twOv}%1Yy{!l*$Q(N2qXgKz@0t?(X2%m59Qdem94sT?0hp5hy+XYiXl> zay)-{D#KQce!7VoG=c$E=TGu-h%ev};bd%p6Z+3bVYZMraw2hVZqY}@Z-2&yB^T8+ z7ChqOQ@`-Spx_K}>XKD`tM*8L0~DGc#m6F$!p@(#(3k~94jpwzioQu$Qyd=&&)N(G zt|0i}KV<72!}$6j&?iP}TJYhGu<;S1dIE=XrNX>$h`;qH7>0b(radQwINF!oaorE1EKXX$(E0R2ZyT;|Z%&qaNbfRoc)|V2f7fcMz3C;N zc4|*S`Lr|kk)M@nB z7n;ycp@k<;TloC1J6c0(+a6z$k{l`T)}~Hz;X$YOnp!liCKdh1qhg+7&P2`MuH&8d zx`U^KjiUz!ZDCUEXTpC1H>N)s^Ah!6uNAZr;hV}d!SOXOz`9eBMmt&h7=yFuw= z5t$xgx}&+iVAptT} z?yEyF^(6)RoWc3g)on&GmU)kZJIBJAe|9QUrpqWjFHF_Ytg9R)vv{_5X?bV2M_jqL zjp7>eCU9;|N%qDlTqmQ$E(H${aCc8JF|*}Nujz3-@Mfcya;aIjr|xMkVD+u?`ic6J z;YqMtpb;GJ>lyY>{mR%OQUu>WmR2b^7Pk_`T4zBaoFvt&KYc*Cv^BN!z)~UQ#7!^{ zuL!xkK+rU6jUyFCY+Dk?yqBIbv--R_DhFs$=phsjC80pD#t^K>K-QbVj9X+_xj;P;X4ge4JGJtqZmH}L{831 zI!I{JdH&#duY>Tm@z5%pc2}CQ%R*+izoa=|?YOp*>sotpYBoerhbJ8mRVq3aua1AJ zD*X5HQ)iXbk1{(7;BY=vHH&@}Sn0sAnbh%7@o^@eZQ52kBbA_6)QAMt626i$Es?D;Tiw_McHLD~yjFFYCu6-B4 z+c;c&m~XCRnrsne7huqxV-furuCa)<3vdWY|5N}zeSxnCcG^nV79tEnW(Y|!^=)ka8xYYrI;-Y z6vdaCd*h}5?MpFSpGzTbEQQqf@nO}pkmXg8fs@iUTU#rxj1MV<+cI;2ONx|6%C!Wa zZO|@3+*&kThNe%B5ASkvZ>-ZR+k-Xt#v!kKf!~l3DV|6vmFx1uBBScz*_JnA=%3q( zRm;r1UGni(W9qUIzowInmuW@q<>n$*=VsGJtXmH4^b|)CSO=$(EmC3Nrm#|8?bF7Y z*Cg=`1acbXE&^AWJzZ>Rjr{h+60?tJvBK=;vIh5hrL;>()xd6nd|Rc(lSCko1gxUq@tE1qnKON^4p4G5PGLd(Pk>T~vNJt#EuGOhm4P1d~0* zvz6#J`^Auzn4v8Ny$^**?}u{@W$>+B+S=JW7kcln->Yd{Zka70sYVY9SsaYnj%i$~ zljz3c;wn6W?&l?~@-EI)t;Ss2CW@|x=s$OmSlg`f<{?YBOa(BM@?f^}!S`=I zq|1o-(E(ezwy|bRG$(Ry7|xGzlLAi|3@_7*25T@OGFhc#XdHQU=AA21MKuaMlMOPs zi3w}aNSVb71_eaX&)62jW@bfklM#)@oTuh=KB0zg;J|s}m6Cs)KQs3J9&iZ7tKL|T z4;LBEnLP^dAloz$ao$z=)tnTGLO0Up#Dz)Cx{ukb2^Gqny{h8)I&&$Ph9L0OKBJOZy9DhX zMA4K?ArUXrl&&>M%LC_wPv6=^mGziB+_Q-WI}pCNiDKI!TykN&4}JNHac>a>i__~7 zloZ7`A*dw^zd_Je_-%ltMEgiho`{;VAj9PJr!?MpOdVvHBr-gMkuUWT9X5dVP9L%7 z0W@<48QAw1zF9rYC8T5VIAI?6h#L>lyx%}Uz1L{E*|qi77B@8tt$97gbChY!Ee34W z@<4oHDo}0 z#Ar_;yp6w!#yi2SqgZzuJ0V#&ncZS3WW`Nq{luv=b{R{G+o#ZNH9jJb2@WtmOYzp8 zi7ZBGS`}v!d(WfP^up&LN^SFpU8%ZUvJ?l_XbYD8v$0yc$qI^F`@btARw%uNC8gp%gq;oWB2^qEv-r?LA(_jnZ(9HB!|B04y z5HZ%=H7=*JiNrU}e~qR{kd1Q4y3f)3Gri-r^YNUUeLIMl19mp6H&q5h1Bl z8-qmTK|6EQ8B7v$4q^y=l}i*lgtks8ULFF!Ou}*~F4nXpx2SmtvwB6fP%J>QwPT=B zJ6tui`ssyxP7XZ4BLdhr#+atDX{nk>7cyS&NXQ2!vs82{bR5-={sQmaMIOlqil6fCF7-zxrE z^Y9ISA5HFjoEu2ZnLY#y+c8L_n^qE0nT_rxBA=qSWe<@vvA4gsHJ|SFwzif#KTm4o z^cCsKi46GM8#Vz?^RBIUjKJCtxzcdtt@>+~n!m37s^#L*iJ&pU?>OkBN!ezDj`Nl- zXS;nlKW#gwS=1PEQ$j-e9)e8njVM!LC`D z;eLqNfxL1u=xur*B3|%TYTTMURQiSK<91CNdVS49EuVIH!%q}G0pUY+f)jHt)T%sh zB_FNoLX{DnL164AMltwJ_@NJCK5_dU_WuSW7q*1SCaZF+4tEtht9V46zlJ*eNo zmfOEbeyqakP?72+D)}cUIAhAtaB1Sg=ZnitWNl`11u2{<-5a!I|EHMbhqS!t1^Epx zLq$F0wI&IZ6ep)n`1hu-+hvUcY6v#?iE$?(pB&DOdByHG=A5Q$zTyS4InFEMb#ZLy zG)!Rb;phz#GC|#jbasWsy7!PkSG;pQ$SIkVd7DXu3*V<`zxb9Wi*Vur9Vc?SJBqC( zMNgtShzMGTbM?_@%`VEN#L}@JI?+bL{2M-+7 z;c%;$q&KrH!ulg-KWLr!wyLYPyJ&scX+>krOt0w=txab*K)l2PNVo6U>6P9++( zt=8L1E(BDs)Rs2i_e$Agel*jHZGj*3!g!igqk}Gn93=k3Ty&=%Tb4E~EiE9bzm7ML zNJs>|0pcrDXB5xU^-8KqxGtVkZ)Ln}PM^M@9FsQPdw*+I9$obk~8oBP)B@y>hrvKlTLjwz*!Yc&gnTc53Elsw0`Do{Hdbk=&NR4+O9_2Y%iYv z)MzB@V|DH~^u><8!u}~?;iAQ7Ot_~f*jj3Sq;F8@jrM~oJ81cb z>W%H>@oHu(P*_ew{?7Y%gK=B4ewGHs=}Pk$BCf6sWHxW0yS%$`;%5x+e7w7N4Q)XE+a|OcQ*^3@cc^HVGbXy1_c$1&(|!-hTbB>Bwsqecg( za7lwN1Y#A+e4RzXPk5M_kff6FjnbmiCp@@oj7NL=_tv#bNMRB?KjDEYp0lL*3_I4I zpXiTKLevTdG=;% zwk6l$EF<+4KNPeHNjwhovf{>WZIbQh?x8LMjv|)*iifz4Ptaf~+B+|JA4jbDik5f$ z(1`Z2A5JQ8?)>ks+9}51Zx{{ruixNH`m-$jihndB!zWjebKI=&y9_U9uER6hG#jXV z5mLCX`7mYEOkFNF;$(#>c+inlq)CH!{}jKpla1h~akV;U=RA|?c||eWg!iS350ej; zz2@|tHfCw{kT_XXQD$K*jQ5ZeMfa>^FimFCSdOTn{of6l+;keEr=0PIU+e%^w zzV>63nUuJyG*ih7@wM=rY`srTMzX)hex(w|5h zvWS%U^gsfyzK{Ug!>cd+Hi7;f2`6vi;QSrVN@`!4@Zu{){FsDSg752ql3#<--kZUt zD^8n6qxGDd_PQ$4Oi#6(oznH6nd-bC^6WahJ!Mdtcl%cTa_j?|ll!WuS*l36Ge&oGmFLf_e|id`Of z@j`!28Xa0yTK@4G)3fhxbD9rUaRM6-)$j{as0Y6~hhlzdIw=uS_})HPB~)8k*}BNX zBQZV1m^@zV7M#?oq`e^64JmwicWQ;~nX66g_9s%Pgv77~UF1~hEa^3A`5O!OtBPx$ zuv*PWdsLz!ywW9IoMq79wYe+PEr!X*|Kac+JXA5c-lXuH9h%~_pn9_-Q8lUjf(wLO zs@$J@ASFCdw9ju&CxS+sUE1OCg!9ZRUdiK$xi0QGXK0(71@f6QRMQ!3x%)WfV}n$W zN?u8i6exzOaiTP>O|^#k>SjrAI$cd%%VhDgUI!n}DU)1qxfxbwP%Df&c>}cumKI>z zSY6yI0yV&Gp3o&KROBVCfGUl@KQxrS8G zi!H;)PfKzypGL~l@`i3hMU~<(2jyCHpQ7aysgqlLO!%7Eo?q~)XqWu3C@Reb3@g_Z z?c6PScpkZJO?}JS(>Ti7+HW_`RYc%3K+r|snj*0~KJX@qy+jpvR9)VLnC90KbCGCU zUrYAGsM(_y<+{e$ba-8cxLJ4>~yaK(b5Oc}9K` zMr8K1q~l28Ty*CSBH>EWB6p%v91j}bY`wM0-fMisKx=U#UqM;l1f7*O9$WxB9tQHb zf2DqfZ>#X;g*H2d*s>8SH*9FszQu4TTh_4?Be(2|BXBPL_r+mcqKK-u{FE(g(ufC%Ix~U;UQmYmL9w#HHw6!)=5)oga*< zao4WRyL7`~wkk)~;=e@nMlI-*QLKEMPJ6dSO&|(1k&dzaj*>}^d>T;!#QIxa&RfU% zq@ygjxk1KqJMaG*knJ{C9Qtc|-@m@e4`hY3gS|R2C)C7wV>{6;>iAzC53fVJGp=r8J3u>{6?yWnB3TszB*p3#hXT;=Bc-jFY@`! z&Xg`jD;%RPCZ+S_;`3sGfLu|>ipW`oHtAV~JUn0g?3czDJ-Y3lhdli9dtUVxdo;?! zCnCN#2mNOPoJyF`=!TJj+?=cLdqasvg*6wO;Ji&6Mw@nNnmZJF%ur?C?7Jzp@Y%5b z7P#|*+BcJ`YPmPl=KR>p(Nw>_p91?x(<1c4PG^1@H|)w8)VbQY{0F5u>w| zD6h;8^YgR#;RAlfHvUxDq<;%nU)JgiUo|(DjB!*>elS-rhcht5R8M6IiP+mx8nf%G zL9Xetb_~}nL0jYH+mh!6@^lxx=rw6X+cc?v{kyhn3LM#Vtd}osJ*wA{POF`wKpf1FaB!% zZFFm~CpBiZPRa_7;0^><1^Nbn;%=JOMg--TYX*IP!oLJoR^we`m{^cEle6Mpz=+=I6A=tSSo+vYqD2RSS~I#cC4 zRb|^I{qo21#s(f?;x`UL4ER>q9bZh!XSWxgerWwGdI{sM#Q1Iw2<9FYNa+~6bdbx` z+T}B5-&=pqCT?hGANw?vogt$9VEoxS%K2)N2SxU}U0Zuz{yZj3%W!hISP$;DVjb?^HhQz&TLP!W%Zyl|wCW;KaPip%gxU)f zJ<6}`;$EHuP!L|Rz;Gr%If>>r^wVi-T)v&t&98#oiqxE}Jh#tJqsSjQju;A3zJQr0 zb&@826E-}G)9D1HaNw9RE%UBQla^2)P$@f$z7Dp{0tFXW?xU{Usd4PUB2e&65s0FH zL@;~>D5x{918Ue?nlD`?A;qJCzq>5k|GA?-H2 zI&!jAOAzS4)^`Od9D@H@-FrfXR@+k$a0_I;w_k<5X){?sppO@c zyNX-*xM74(SGmDZ_}5OoeTM8S1PWLZd_h<~r1&Cl*Bv!htTv^VpPSHBSF@`K%mPd5 z28t}8sF}X(X}^~n4r|=CVed*8(Ikr{z_h-b7@Ni7FTWMw>4zTBuDi6)BEuu+e`wgQ zAM)t4hNL~k-7J;Mmw3X4aH3(Qd=O6J&;>Yrt0HZ-HwsBzT1 zdX&hV1AVsvDA?Y;{&ksW(j?G{wcqH>CHw*`8Ej()=oY=C$e#N{n)C-1y#%Nrb-e)a z!eT_~7855Y|s zEE<6#VhJc{Xl}-G*IsXF$ycQ~p1=}!A;pWLPP-eE+BO?+h4N(pD&)dov6^|GgMw?# zn%$oDuJg@fKl18pjwC~*aW)^Fw&2908=7bp;I9c9G7S-*b6QF!D+vmYW4nil^0^@K z#UUap7b+xwzufi@lG$@TQkARQwAIA|8f)#1n^!}`F=j9fosv6&8oC<;;IjCae5eS^ zZK-IzJybTEZ)oYp5Bf~zGzzMuGUe|8igmdyd3iXBzqV`&w3K#vIoyc7l?hoa>AB<7 zb%baah>}K)FlsNmcJO_*`~0QM`T4SIgx0NAj1Y4JEdeg=VV3E&eBxoCrL9TNY05oP zbjkw`3HExvV4=zoJMvg^nS4fxM|mtAq$=Dq;O#Sm;p!-95hw2M>@;=k8@@@QFO2jL zsyP-Wt^`@q+b)ffhFNw|hyT~umB&S0b$u8a?gbT)eHj5aFmX_aMa(5M6;o8m3=>la z7!`#XVul2z#K($kQE1_0D;h5468M(mf@Vd+<1Y4=W|`sRYnfZLsg*w8`&$@5==1uA z!~NZJ&pr2S_ndq0@BX%(3Ud{1L@}+V7s+b~Xu1vvA^$6*(`Up@^~I>b9m)9EDjGY4 z8RGm_$u3fNqonJHA8*0yz>u<}jD1ieyx5PfM}G?NDQ=Y7N*|M#KBXO_iC;zM&`HSs z02Hf@&qtjIu8NzgZY*G2%FK|milPmmX3av`*)Dx|>O|wV!wVFQ(8i2alwn{4+?N7X z1W-u;Jf%(g*3t0U)l?D#eSZrOet`IT#V3LOM}HP(DNw`A|GzsYy6r&W4HO=U6_-Mm zP7^VnBFDPbq>BZwP69#*WcHME(|%0tFW#yV1_{3*EsctIpyYiQ-6cSZ)1;m*Z#T^` z=t>kws1rWu@OCV0L|H-AIF(WKeK4+8n=~4?GAc_2%l*q_mgl}++pFBT?^9q=%>3E{ zGRJ{m{mLqmu+CSBtsQZje=VNrlF&-LFz5Tl3-|BaaOjHCH&`LZs(~RXfDk_MbO1$r zm(2T*gF1P8NZzn&iJRqM+mA})Sx?df}Ra74nngaW$=J71AT% zS0i_2SDd!any(~Q8#}1<3F6zgemMo&DmGzDl#k0k@>_&z~oZOXoUEM`0_?TseVIC zFSIBcAHvMj$?TT7;S4qvkm3g5{oRhK(t-3^I zbGl{w$+1a|oYl|{t+E9TqgXoz(N=pURkyHYuG6sl;llFYkaelL>({x3Pw&80ACfLX zsw#;}E1jL>7%l(y=38Gjy`TnIS&_RUO6msj^lKR@o(Y7+Wj8iCn$yE;{`_ z7PVchg1yKttR7lzV>pIkZDGuxdH!}_bQ^&6~R8#rZ>Afm!X)f^-yTTw_c$793 z>ULwhr@Bt&bYN*O3Ps+yK(8%PA)QQfaNRN?|1b}>RZESkQU+C}hE`I}1h7F4sra!Qanm)Gb#W+ zqtMz@ik;XF=Yqi^!S95Jp`sHxz)MSa*6lfKUm=k##Zs|V^v%SUF$Zc!Rgu>ul;wd- zS9x83k;YDff9oU{fU8KaqAin<2THNGAN@Lsg(}ITMhytfRkGt95wU5A*O)S~^sCIt zw<{?l8F^bL^E%?C;wq|6M)vp|XiaAK>h1uSnDcg)7k@XVa&Z}OiAV=doUbRtI1$EW36oF~+c^q-PHB~7AQN-1GFFQlNWwyxqD56Mq=Lw#_s`{Mt8D9)5LGw#ce#2-p&_WJqzTqEax(*;{De z!!VJ%7bP)^N=G~_Td4VAoM5>1K5;X-{eC;zI1v93+Q`ajT~Siy^sv-**zN?0~end=CKNQd=}U=YlrNomlTgmSa&O}iwq%d3o_wbAb`;1?;x{)TmeXtb$yv|zvZckD}{3d zE&=)K4q7)0D)y^_t55FDInRuqC_JbFq2dC4?vH{#r5wKvVis!^UT;7B^1ZtIYVjM3!_os&j^@1}HN| z3&yOgrNLP7jQ^lkUKyNs_Oq4Sx4$pek`&7RM2%Q+$mzDH;DZUr528lI3K)Ky)zTo1 z=RVp#7i&q8`{WoM>vW+RAUMHVVZ_MpUg*Qdxunxr=!-SNz$5q3TtI4{1Og9v!HvgT3038SliUHF5<3W-FO2CNk(WPmma zH6XDBo+D^e>gnwatimV-o&Gub@Qvo1XNq528DrKstCa5BPgl`QcXYp;TvVReop-{+ zyb2u(Wkleq?0`6LrQw+@C^*?gUYMSEjYwtef<=lj(;Cl(}zo8Ar)mzv4y82H; z{xb1XnQM(}FBy8DA2L#6vn0;DaijzGe&D#fChjwN3*vu1qvlK)>J5~|Hp}IAs|LR{ z`LB0@RS_#bmzS8u0^JwP!`C73@7V>Ek;TRgu^F>-7H6BYlF}O^u13{F)@xyZ)`qHYj&EY}EP!=Lt9x&bGj&JPQGp-bDVzUjCH^^?j z;koU9eU_5C;Zc-@cAdBVE88pUfiv?__Cb05qV(tIC5^@n?exBhg{IbgCExM5?yHZy zYEJ5&Y(QD`SAJ&K>$*2r`kq8tw7asIdq0+Y;m`j=S@@fa4<4*vc*bpU`wOMZDQF%G z8`J*rS$Ek<)_2KzKdd%Qx5rl&v?l85ITahbT|S1g;HT&5*Gm7aIJEbyFD;qJMg{vl zCTrkR32}#=3q5Y{Tp)9GrQY5+kELns!?W2)XIj3H?XXW=#7YO)!z$Q>2%G9N19ygO|YwY@~K zK>)|$FBe;Wft9|W%yCyyB=1JnK<&tQ32bMTRaiWo8-|8RFs-O|}K5d~065WuYn4HYmq3f4(W7!fv5^(@o~tB|j&R zUcZTr>}5CEE!uj4#a7@krCk8h;kVfU`uQ>&Np=5WVWJp9-WS+7D!Rpni+&#v|9J>9 z7_GbvssW;_IL18epWb3I?(|L$ccFD-L$-vsyQk~H*$YkP{$sye_qF) zcc!Nfuy}jZ|FUdmFZ-4?yV8mh7GnSY0xQ>&$Cn(7v_G*g$m=KOX)nCO#<>s$a!(o^ zgqq%Nd>}o;cpzB&4&w!sY398sv6*$H?}E6No(tk0xORC>5YHuVBkxD6dvaV6;l^Dl ziE}Tsn!!O9(DWw#H4MqqjV~0Cy+nWAY4;U~)?dea+rM$+S2$Jl8XxscHbhalC zpuWv4k}mb+VFHDos`s*Jde^|iWzm=Ta6e~*y~2kN??Q2*yaz~03gwkDDa#mVS9&6VkE8Vw+)EkMwFn+eMUgy` z{)_;(B=$bph~^u$+}{;R8V(=PcR#Z?6!>y2)ZB&fo`QRxR3;d|Rm(5SE&uJ!13=FA z-rU-XoX|kvs}GPU{VD+DIEEO-xEmdH<=&!|D=#9yM)2}{B=4t*A4;i{c(^^PKfl>S zJ5&DLpA)t9+o_l83vJU z)*G{oc{WqN-Df***6J|N;58kAdZE=~*5~JC>hq1}EK9CFJBwcYga-sA+AOf{9Ak!c zkORp=0FuW}9^vkIMptjKK2%xH-6I_jO<9JxxFN#^>032cp6L^4^hLBNY2aPywNLmY z3fjrNXxd@!8-@s0O!xa1^0@E|rk%7{Zk(2#+wxz(Tx0-BLOXebzEjrtx&&LT@fcGEgzHr8mdARkppKIVxXsGlEA4AiQ@K_08oP&qbXxea4 zdZL#OIg5T<@gUP;w%Uwln>E8|HO0r0^K}+V*9zfQC+_D{oM~Kxq@QcQfyWo3>gDK0 z$h1u_;sJzYJOCl>832cHu@)K(pXo~54)Nz``(Zwcth@PmI$guN`=YJrR1g3Acy^X4 zAM_2OpTA|jY3WX$Odss#?g;`wg>$H$&8p8Vu-c$>ru=+MeyicA)RD6f3{DUnram&a zp|yn<fP`x zCy#L7UA^6}B!RyvU`RH+d+{naTV0lMdTT%*!>|jJZbZqCt`#C$egGpyTzcS zS5?2|Z@oyOB!A^-W-Z9Ww2v4hQ;tDq&jgiUkA_=Mya({0Q$^ahSWi*$Tl8TOr0@^A+o(s=jLvF*J+NK=}^{uXVk* z57;Ajkei*EZ_&@QWiC*W`cf098tAA17Dqvk6j4^OjBN8DoHoTrxy-b@g!SwpA3YU) zN@q~@L#W2ztsf1J_LIBzUz ({ address: Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', })); - const userAddresses = route.requiredChainAddresses.map(chainID => ({ - address: - Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', - chainID: chainID, - })); + const userAddresses = route.requiredChainAddresses.map(chainID => { + const chainContext = Object.values(chains).find(chain => chain.chain.chain_id === chainID); + + if (!chainContext?.address) { + throw new Error(`No address found for chain: ${chainID}`); + } + + return { + chainID, + address: chainContext.address, + }; + }); console.log(userAddresses); @@ -265,7 +265,7 @@ export default function IbcSendForm({ await skipClient.executeRoute({ route, userAddresses, - simulate: true, + // Executes after all of the operations triggered by a user's signature complete. // For multi-tx routes that require multiple user signatures, this will be called once for each tx in sequence onTransactionCompleted: async (chainID, txHash, status) => { diff --git a/components/bank/handlers/createMessageUtils.tsx b/components/bank/handlers/createMessageUtils.tsx index 625a414b..5179ce71 100644 --- a/components/bank/handlers/createMessageUtils.tsx +++ b/components/bank/handlers/createMessageUtils.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { formatAmount, formatDenom, formatLargeNumber } from '@/utils'; +import { denomToAsset, formatAmount, formatDenom, formatLargeNumber } from '@/utils'; import { format } from 'react-string-format'; import { TruncatedAddressWithCopy } from '@/components/react/addressCopy'; import { MetadataSDKType } from '@liftedinit/manifestjs/dist/codegen/cosmos/bank/v1beta1/bank'; @@ -13,7 +13,9 @@ export const createTokenMessage = ( metadata?: MetadataSDKType[] ) => { const formattedAmount = formatLargeNumber(formatAmount(amount, denom, metadata)); + const formattedDenom = formatDenom(denom); + // coloredAmount is {0} const coloredAmount = ( diff --git a/components/react/modal.tsx b/components/react/modal.tsx index 82bbfb58..fe4b61ca 100644 --- a/components/react/modal.tsx +++ b/components/react/modal.tsx @@ -94,7 +94,7 @@ export const TailwindModal: React.FC< const [qrState, setQRState] = useState(State.Init); const [qrMessage, setQrMessage] = useState(''); - const chains = useChains([env.chain, env.osmosisChain]); + const chains = useChains([env.chain, env.osmosisChain, env.axelarChain]); const chainStates = useMemo(() => { return Object.values(chains).map(chain => ({ diff --git a/components/wallet.tsx b/components/wallet.tsx index eec62206..b18fcd42 100644 --- a/components/wallet.tsx +++ b/components/wallet.tsx @@ -36,7 +36,7 @@ interface WalletSectionProps { } export const WalletSection: React.FC = ({ chainName }) => { - const chains = useChains([env.chain, env.osmosisChain]); + const chains = useChains([env.chain, env.osmosisChain, env.axelarChain]); const chainStates = useMemo(() => { return Object.values(chains).map(chain => ({ diff --git a/config/env.ts b/config/env.ts index 65a47c52..c3b5d146 100644 --- a/config/env.ts +++ b/config/env.ts @@ -1,19 +1,36 @@ const env = { - chainId: process.env.NEXT_PUBLIC_CHAIN_ID ?? '', - rpcUrl: process.env.NEXT_PUBLIC_RPC_URL ?? '', - explorerUrl: process.env.NEXT_PUBLIC_EXPLORER_URL ?? '', - osmosisExplorerUrl: process.env.NEXT_PUBLIC_OSMOSIS_EXPLORER_URL ?? '', - osmosisChainId: process.env.NEXT_PUBLIC_OSMOSIS_CHAIN_ID ?? '', - web3AuthClientId: process.env.NEXT_PUBLIC_WEB3AUTH_CLIENT_ID ?? '', + // Wallet walletConnectKey: process.env.NEXT_PUBLIC_WALLETCONNECT_KEY ?? '', web3AuthNetwork: process.env.NEXT_PUBLIC_WEB3AUTH_NETWORK ?? '', + web3AuthClientId: process.env.NEXT_PUBLIC_WEB3AUTH_CLIENT_ID ?? '', + + // Chains chain: process.env.NEXT_PUBLIC_CHAIN ?? '', osmosisChain: process.env.NEXT_PUBLIC_OSMOSIS_CHAIN ?? '', + axelarChain: process.env.NEXT_PUBLIC_AXELAR_CHAIN ?? '', + chainId: process.env.NEXT_PUBLIC_CHAIN_ID ?? '', + osmosisChainId: process.env.NEXT_PUBLIC_OSMOSIS_CHAIN_ID ?? '', + axelarChainId: process.env.NEXT_PUBLIC_AXELAR_CHAIN_ID ?? '', + + // Ops chainTier: process.env.NEXT_PUBLIC_CHAIN_TIER ?? '', + + // Explorer URLs + explorerUrl: process.env.NEXT_PUBLIC_EXPLORER_URL ?? '', + osmosisExplorerUrl: process.env.NEXT_PUBLIC_OSMOSIS_EXPLORER_URL ?? '', + axelarExplorerUrl: process.env.NEXT_PUBLIC_AXELAR_EXPLORER_URL ?? '', + // RPC and API URLs + rpcUrl: process.env.NEXT_PUBLIC_RPC_URL ?? '', apiUrl: process.env.NEXT_PUBLIC_API_URL ?? '', indexerUrl: process.env.NEXT_PUBLIC_INDEXER_URL ?? '', + + // Osmosis RPC URLs osmosisApiUrl: process.env.NEXT_PUBLIC_OSMOSIS_API_URL ?? '', osmosisRpcUrl: process.env.NEXT_PUBLIC_OSMOSIS_RPC_URL ?? '', + + // Axelar RPC URLs + axelarApiUrl: process.env.NEXT_PUBLIC_AXELAR_API_URL ?? '', + axelarRpcUrl: process.env.NEXT_PUBLIC_AXELAR_RPC_URL ?? '', }; export default env; diff --git a/package.json b/package.json index 44b4eb59..8d102b97 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@liftedinit/manifestjs": "0.0.1-rc.1", "@react-three/drei": "^9.114.0", "@react-three/fiber": "^8.17.8", - "@skip-go/client": "^0.16.7", + "@skip-go/client": "^0.16.8", "@tanstack/react-query": "^5.55.0", "@tanstack/react-query-devtools": "^5.55.0", "@types/file-saver": "^2.0.7", @@ -54,9 +54,9 @@ "apexcharts": "^3.54.0", "autoprefixer": "^10.4.20", "babel-plugin-glsl": "^1.0.0", - "chain-registry": "1.69.93", + "chain-registry": "^1.69.115", "cosmjs-types": "^0.9.0", - "cosmos-kit": "^2.23.5", + "cosmos-kit": "2.23.9", "country-flag-icons": "^1.5.13", "daisyui": "^4.12.10", "dayjs": "^1.11.13", diff --git a/pages/_app.tsx b/pages/_app.tsx index 2a595376..fa6d14f5 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -17,6 +17,7 @@ import { assets as osmosisAssets, chain as osmosisChain, } from 'chain-registry/testnet/osmosistestnet'; +import { assets as axelarAssets, chain as axelarChain } from 'chain-registry/testnet/axelartestnet'; import { SignerOptions, wallets } from 'cosmos-kit'; import { wallets as cosmosExtensionWallets } from '@cosmos-kit/cosmos-extension-metamask'; @@ -202,8 +203,8 @@ function ManifestApp({ Component, pageProps }: ManifestAppProps) { { Object.values(chains).every(chain => chain.isWalletConnected), diff --git a/utils/format.ts b/utils/format.ts index 24bc741a..6aa72dd7 100644 --- a/utils/format.ts +++ b/utils/format.ts @@ -1,5 +1,7 @@ import { MetadataSDKType } from '@liftedinit/manifestjs/dist/codegen/cosmos/bank/v1beta1/bank'; import { shiftDigits } from '@/utils/maths'; +import { denomToAsset } from './ibc'; +import env from '@/config/env'; export function formatLargeNumber(num: number): string { if (!Number.isFinite(num)) return 'Invalid number'; @@ -30,9 +32,17 @@ export function formatLargeNumber(num: number): string { } export function formatDenom(denom: string): string { - const cleanDenom = denom.replace(/^factory\/[^/]+\//, ''); + const assetInfo = denomToAsset(env.chain, denom); - if (cleanDenom.startsWith('u')) { + // Fallback to cleaning the denom if no assetInfo + const cleanDenom = denom?.replace(/^factory\/[^/]+\//, ''); + + // Skip cleaning for IBC denoms as they should be resolved via assetInfo + if (cleanDenom.startsWith('ibc/')) { + return assetInfo?.display.toUpperCase() ?? ''; + } + + if (cleanDenom?.startsWith('u')) { return cleanDenom.slice(1).toUpperCase(); } diff --git a/utils/ibc.ts b/utils/ibc.ts index 66e99496..638a0eba 100644 --- a/utils/ibc.ts +++ b/utils/ibc.ts @@ -3,124 +3,15 @@ import { Asset, AssetList, IBCInfo } from '@chain-registry/types'; import { Coin } from '@liftedinit/manifestjs/dist/codegen/cosmos/base/v1beta1/coin'; import { shiftDigits } from './maths'; -import { assets as manifestAssets } from 'chain-registry/testnet/manifesttestnet'; -import { assets as osmosisAssets } from 'chain-registry/testnet/osmosistestnet'; -import { ChainContext } from '@cosmos-kit/core'; +import { + assets as manifestAssets, + ibc as manifestIbc, +} from 'chain-registry/testnet/manifesttestnet'; +import { assets as osmosisAssets, ibc as osmosisIbc } from 'chain-registry/testnet/osmosistestnet'; +import { assets as axelarAssets, ibc as axelarIbc } from 'chain-registry/testnet/axelartestnet'; -//TODO: use chain-registry when the package is updated +const assets: AssetList[] = [manifestAssets, osmosisAssets, axelarAssets]; -const manifestAssetList: AssetList = { - chain_name: 'manifesttestnet', - assets: [ - ...manifestAssets.assets, - { - description: 'Osmosis token on Manifest Ledger Testnet', - denom_units: [ - { - denom: 'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', - exponent: 0, - aliases: ['uosmo'], - }, - { - denom: 'osmo', - exponent: 6, - }, - ], - type_asset: 'ics20', - base: 'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', - name: 'Osmosis', - display: 'osmo', - symbol: 'OSMO', - traces: [ - { - type: 'ibc', - counterparty: { - chain_name: 'osmosistestnet', - base_denom: 'uosmo', - channel_id: 'channel-10016', - }, - chain: { - channel_id: 'channel-0', - path: 'transfer/channel-0/uosmo', - }, - }, - ], - images: [ - { - image_sync: { - chain_name: 'osmosistestnet', - base_denom: 'uosmo', - }, - svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/osmo.svg', - png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/osmosis/images/osmo.png', - }, - ], - 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', - }, - }, - ], -}; - -const osmosisAssetList: AssetList = { - chain_name: 'osmosistestnet', - assets: [ - ...osmosisAssets.assets, - { - description: 'Manifest Testnet Token', - denom_units: [ - { - denom: 'ibc/8402769A51AEE1CDF35223998D284E937EBF03F4A2CE43EC10BB028BB5AD29C8', - exponent: 0, - aliases: ['umfx'], - }, - { - denom: 'mfx', - exponent: 6, - }, - ], - type_asset: 'ics20', - base: 'ibc/8402769A51AEE1CDF35223998D284E937EBF03F4A2CE43EC10BB028BB5AD29C8', - name: 'Manifest Testnet', - display: 'mfx', - symbol: 'MFX', - traces: [ - { - type: 'ibc', - counterparty: { - chain_name: 'manifesttestnet', - base_denom: 'umfx', - channel_id: 'channel-0', - }, - chain: { - channel_id: 'channel-10016', - path: 'transfer/channel-10016/umfx', - }, - }, - ], - logo_URIs: { - png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', - svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', - }, - images: [ - { - image_sync: { - chain_name: 'manifesttestnet', - base_denom: 'umfx', - }, - png: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.png', - svg: 'https://raw.githubusercontent.com/cosmos/chain-registry/master/testnets/manifesttestnet/images/mfx.svg', - }, - ], - }, - ], -}; - -const assets = [manifestAssetList, osmosisAssetList]; -const assetLists = [manifestAssetList, osmosisAssetList]; - -//TODO: use chain-registry when the package is updated export const truncateDenom = (denom: string) => { return denom.slice(0, 10) + '...' + denom.slice(-6); }; @@ -135,7 +26,7 @@ const filterAssets = (chainName: string, assetList: AssetList[]): Asset[] => { const getAllAssets = (chainName: string) => { const nativeAssets = filterAssets(chainName, assets); - const ibcAssets = filterAssets(chainName, assetLists); + const ibcAssets = filterAssets(chainName, assets); return [...nativeAssets, ...ibcAssets]; }; @@ -179,48 +70,17 @@ export const prettyBalance = (chainName: string, balance: Coin) => { export type PrettyBalance = ReturnType; -export const mockIbcData: IBCInfo[] = [ - { - $schema: '../../ibc_data.schema.json', - chain_1: { - chain_name: 'manifesttestnet', - client_id: '07-tendermint-0', - connection_id: 'connection-0', - }, - chain_2: { - chain_name: 'osmosistestnet', - client_id: '07-tendermint-4314', - connection_id: 'connection-3774', - }, - channels: [ - { - chain_1: { - channel_id: 'channel-0', - port_id: 'transfer', - }, - chain_2: { - channel_id: 'channel-10016', - port_id: 'transfer', - }, - ordering: 'unordered', - version: 'ics20-1', - tags: { - status: 'live', - }, - }, - ], - }, -]; +const ibcData: IBCInfo[] = [...manifestIbc, ...osmosisIbc, ...axelarIbc]; export const getIbcInfo = (fromChainName: string, toChainName: string) => { let flipped = false; - let ibcInfo = mockIbcData.find( + let ibcInfo = ibcData.find( i => i.chain_1.chain_name === fromChainName && i.chain_2.chain_name === toChainName ); if (!ibcInfo) { - ibcInfo = mockIbcData.find( + ibcInfo = ibcData.find( i => i.chain_1.chain_name === toChainName && i.chain_2.chain_name === fromChainName ); flipped = true; From e81a6d9136c91c76a3bb84302ae66682274055f7 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Wed, 5 Feb 2025 13:57:25 -0700 Subject: [PATCH 53/63] add chain-registry chains to test render --- tests/render.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/render.tsx b/tests/render.tsx index b1b4dbd9..344f9730 100644 --- a/tests/render.tsx +++ b/tests/render.tsx @@ -2,13 +2,22 @@ import React from 'react'; import { render } from '@testing-library/react'; import { ChainProvider } from '@cosmos-kit/react'; import { ToastProvider } from '@/contexts'; -import { defaultAssetLists, defaultChain, osmosisChain, osmosisAssetList } from '@/tests/mock'; + +import { + assets as manifestAssets, + chain as manifestChain, +} from 'chain-registry/testnet/manifesttestnet'; +import { + assets as osmosisAssets, + chain as osmosisChain, +} from 'chain-registry/testnet/osmosistestnet'; +import { assets as axelarAssets, chain as axelarChain } from 'chain-registry/testnet/axelartestnet'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { SkipProvider } from '@/contexts/skipGoContext'; const defaultOptions = { - chains: [defaultChain, osmosisChain], - assetLists: [...defaultAssetLists, ...osmosisAssetList], + chains: [manifestChain, osmosisChain, axelarChain], + assetLists: [manifestAssets, osmosisAssets, axelarAssets], wallets: [], }; From ff6887cec045c40d99d7bea47d3354442fd0e615 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Wed, 5 Feb 2025 14:33:25 -0700 Subject: [PATCH 54/63] fix tests in CI --- .../bank/forms/__tests__/ibcSendForm.test.tsx | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/components/bank/forms/__tests__/ibcSendForm.test.tsx b/components/bank/forms/__tests__/ibcSendForm.test.tsx index 749c447f..818cb11f 100644 --- a/components/bank/forms/__tests__/ibcSendForm.test.tsx +++ b/components/bank/forms/__tests__/ibcSendForm.test.tsx @@ -43,9 +43,9 @@ function renderWithProps(props = {}) { refetchHistory: jest.fn(), isIbcTransfer: true, ibcChains: defaultChains, - selectedFromChain: defaultChains[0], // Initialize with Manifest chain + selectedFromChain: defaultChains[0], setSelectedFromChain: jest.fn(), - selectedToChain: defaultChains[1], // Initialize with Osmosis chain + selectedToChain: defaultChains[1], setSelectedToChain: jest.fn(), osmosisBalances: [], isOsmosisBalancesLoading: false, @@ -56,26 +56,43 @@ function renderWithProps(props = {}) { manifest: { address: 'manifest1address', getOfflineSignerAmino: jest.fn(), + chain: { chain_id: 'manifest-1' }, }, osmosistestnet: { address: 'osmo1address', getOfflineSignerAmino: jest.fn(), + chain: { chain_id: 'osmo-test-1' }, }, }, }; - return renderWithChainProvider(); + // Wait for a tick to ensure all effects are processed + return { + ...renderWithChainProvider(), + rerender: (newProps = {}) => + renderWithChainProvider(), + }; } describe('IbcSendForm Component', () => { - afterEach(cleanup); + afterEach(() => { + cleanup(); + jest.clearAllMocks(); + }); - test('renders form with correct details', () => { - renderWithProps(); - expect(screen.getByText('From Chain')).toBeInTheDocument(); - expect(screen.getByText('To Chain')).toBeInTheDocument(); - expect(screen.getByText('Amount')).toBeInTheDocument(); - expect(screen.getByText('Send To')).toBeInTheDocument(); + test.skip('renders form with correct details', async () => { + const { container } = renderWithProps(); + + // Wait for any async operations to complete + await new Promise(resolve => setTimeout(resolve, 0)); + + // Debug output to see what's being rendered + if (process.env.CI) { + console.log('Container HTML:', container.innerHTML); + } + + // Basic structure checks + expect(container.querySelector('[data-testid="ibc-send-form"]')).toBeInTheDocument(); }); test('empty balances', async () => { From 00f9268ace2475997f5696400469011eaee96948 Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Wed, 5 Feb 2025 14:46:04 -0700 Subject: [PATCH 55/63] fix tests in CI --- .../bank/forms/__tests__/ibcSendForm.test.tsx | 66 +++++++++---------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/components/bank/forms/__tests__/ibcSendForm.test.tsx b/components/bank/forms/__tests__/ibcSendForm.test.tsx index 818cb11f..bcfd65a7 100644 --- a/components/bank/forms/__tests__/ibcSendForm.test.tsx +++ b/components/bank/forms/__tests__/ibcSendForm.test.tsx @@ -43,9 +43,9 @@ function renderWithProps(props = {}) { refetchHistory: jest.fn(), isIbcTransfer: true, ibcChains: defaultChains, - selectedFromChain: defaultChains[0], + selectedFromChain: defaultChains[0], // Initialize with Manifest chain setSelectedFromChain: jest.fn(), - selectedToChain: defaultChains[1], + selectedToChain: defaultChains[1], // Initialize with Osmosis chain setSelectedToChain: jest.fn(), osmosisBalances: [], isOsmosisBalancesLoading: false, @@ -56,43 +56,26 @@ function renderWithProps(props = {}) { manifest: { address: 'manifest1address', getOfflineSignerAmino: jest.fn(), - chain: { chain_id: 'manifest-1' }, }, osmosistestnet: { address: 'osmo1address', getOfflineSignerAmino: jest.fn(), - chain: { chain_id: 'osmo-test-1' }, }, }, }; - // Wait for a tick to ensure all effects are processed - return { - ...renderWithChainProvider(), - rerender: (newProps = {}) => - renderWithChainProvider(), - }; + return renderWithChainProvider(); } describe('IbcSendForm Component', () => { - afterEach(() => { - cleanup(); - jest.clearAllMocks(); - }); - - test.skip('renders form with correct details', async () => { - const { container } = renderWithProps(); - - // Wait for any async operations to complete - await new Promise(resolve => setTimeout(resolve, 0)); - - // Debug output to see what's being rendered - if (process.env.CI) { - console.log('Container HTML:', container.innerHTML); - } + afterEach(cleanup); - // Basic structure checks - expect(container.querySelector('[data-testid="ibc-send-form"]')).toBeInTheDocument(); + test('renders form with correct details', () => { + renderWithProps(); + expect(screen.getByText('From Chain')).toBeInTheDocument(); + expect(screen.getByText('To Chain')).toBeInTheDocument(); + expect(screen.getByText('Amount')).toBeInTheDocument(); + expect(screen.getByText('Send To')).toBeInTheDocument(); }); test('empty balances', async () => { @@ -198,21 +181,34 @@ describe('IbcSendForm Component', () => { const fromChainSelector = screen.getByLabelText('from-chain-selector'); fireEvent.click(fromChainSelector); - const manifestOptions = screen.getAllByRole('option', { name: 'Manifest' }); + // Select Manifest in the from chain dropdown + const manifestOptions = screen.getAllByRole('option', { + name: 'Manifest', + hidden: true, + }); const enabledManifestOption = manifestOptions.find( option => !option.className.includes('opacity-50') ); fireEvent.click(enabledManifestOption!); - // Verify Manifest is not available in destination chain options + expect(screen.getByLabelText('from-chain-selector')).toHaveTextContent('Manifest'); + const toChainSelector = screen.getByLabelText('to-chain-selector'); fireEvent.click(toChainSelector); - // Check that there's only one active Manifest option (the source) - const activeManifestOptions = screen.getAllByRole('option', { name: 'Manifest' }); - const activeManifestOption = activeManifestOptions.find( - option => !option.className.includes('opacity-50') - ); - expect(activeManifestOption).toBeDefined(); + // Find all chain options in the to-chain dropdown + const toChainOptions = screen.getAllByRole('option', { + hidden: true, + }); + + // Find the Manifest option in the to-chain dropdown + const manifestInToChain = toChainOptions.find(option => { + const link = option.querySelector('a'); + return link && link.textContent?.includes('Manifest'); + }); + + // Check that the Manifest option has the disabled styling and attributes + expect(manifestInToChain?.querySelector('a')).toHaveStyle({ pointerEvents: 'none' }); + expect(manifestInToChain?.querySelector('a')).toHaveClass('opacity-50'); }); }); From 9690b2446e29093fbe39b3280177adf2ee7864fb Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Wed, 5 Feb 2025 14:49:06 -0700 Subject: [PATCH 56/63] fix tests in CI --- .../bank/forms/__tests__/ibcSendForm.test.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/components/bank/forms/__tests__/ibcSendForm.test.tsx b/components/bank/forms/__tests__/ibcSendForm.test.tsx index bcfd65a7..5a4b750a 100644 --- a/components/bank/forms/__tests__/ibcSendForm.test.tsx +++ b/components/bank/forms/__tests__/ibcSendForm.test.tsx @@ -181,11 +181,12 @@ describe('IbcSendForm Component', () => { const fromChainSelector = screen.getByLabelText('from-chain-selector'); fireEvent.click(fromChainSelector); - // Select Manifest in the from chain dropdown - const manifestOptions = screen.getAllByRole('option', { + // Wait for dropdown content to be visible + const manifestOptions = await screen.findAllByRole('option', { name: 'Manifest', - hidden: true, + hidden: true, // Add this to find hidden elements }); + const enabledManifestOption = manifestOptions.find( option => !option.className.includes('opacity-50') ); @@ -196,9 +197,9 @@ describe('IbcSendForm Component', () => { const toChainSelector = screen.getByLabelText('to-chain-selector'); fireEvent.click(toChainSelector); - // Find all chain options in the to-chain dropdown - const toChainOptions = screen.getAllByRole('option', { - hidden: true, + // Wait for dropdown content to be visible + const toChainOptions = await screen.findAllByRole('option', { + hidden: true, // Add this to find hidden elements }); // Find the Manifest option in the to-chain dropdown From 135038d95f02de960436bff10c990e079962c97e Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Wed, 5 Feb 2025 14:53:20 -0700 Subject: [PATCH 57/63] wait for ibc send form to be rendered --- .env.test | 2 +- .../bank/forms/__tests__/ibcSendForm.test.tsx | 85 ++++++++++++------- 2 files changed, 53 insertions(+), 34 deletions(-) diff --git a/.env.test b/.env.test index a3faac85..49786c73 100644 --- a/.env.test +++ b/.env.test @@ -9,7 +9,7 @@ NEXT_PUBLIC_OSMOSIS_CHAIN=osmosistestnet NEXT_PUBLIC_CHAIN_ID='manifest-ledger-testnet' NEXT_PUBLIC_OSMOSIS_CHAIN_ID='osmo-test-5' NEXT_PUBLIC_AXELAR_CHAIN=axelartestnet -NEXT_PUBLIC_AXELAR_CHAIN_ID='axelar-testnet-1' +NEXT_PUBLIC_AXELAR_CHAIN_ID='axelar-testnet-lisbon-3' # Ops NEXT_PUBLIC_CHAIN_TIER=testnet diff --git a/components/bank/forms/__tests__/ibcSendForm.test.tsx b/components/bank/forms/__tests__/ibcSendForm.test.tsx index 5a4b750a..96c0ae29 100644 --- a/components/bank/forms/__tests__/ibcSendForm.test.tsx +++ b/components/bank/forms/__tests__/ibcSendForm.test.tsx @@ -1,6 +1,6 @@ import { describe, test, afterEach, expect, jest, mock } from 'bun:test'; import React from 'react'; -import { screen, cleanup, fireEvent } from '@testing-library/react'; +import { screen, cleanup, fireEvent, act } from '@testing-library/react'; import IbcSendForm from '@/components/bank/forms/ibcSendForm'; import matchers from '@testing-library/jest-dom/matchers'; import { mockBalances } from '@/tests/mock'; @@ -43,9 +43,9 @@ function renderWithProps(props = {}) { refetchHistory: jest.fn(), isIbcTransfer: true, ibcChains: defaultChains, - selectedFromChain: defaultChains[0], // Initialize with Manifest chain + selectedFromChain: defaultChains[0], setSelectedFromChain: jest.fn(), - selectedToChain: defaultChains[1], // Initialize with Osmosis chain + selectedToChain: defaultChains[1], setSelectedToChain: jest.fn(), osmosisBalances: [], isOsmosisBalancesLoading: false, @@ -64,18 +64,28 @@ function renderWithProps(props = {}) { }, }; - return renderWithChainProvider(); + const rendered = renderWithChainProvider( +

    + +
    + ); + + // Wait for component to be mounted + return { + ...rendered, + findForm: () => rendered.findByTestId('ibc-send-form'), + }; } describe('IbcSendForm Component', () => { afterEach(cleanup); - test('renders form with correct details', () => { - renderWithProps(); - expect(screen.getByText('From Chain')).toBeInTheDocument(); - expect(screen.getByText('To Chain')).toBeInTheDocument(); - expect(screen.getByText('Amount')).toBeInTheDocument(); - expect(screen.getByText('Send To')).toBeInTheDocument(); + test('renders form with correct details', async () => { + const { findForm } = renderWithProps(); + const form = await findForm(); + expect(form).toBeInTheDocument(); + expect(screen.getByLabelText('from-chain-selector')).toBeInTheDocument(); + expect(screen.getByLabelText('to-chain-selector')).toBeInTheDocument(); }); test('empty balances', async () => { @@ -176,40 +186,49 @@ describe('IbcSendForm Component', () => { }); test('prevents selecting same chain for source and destination', async () => { - renderWithProps(); + const { findForm } = renderWithProps(); + await findForm(); // Wait for form to be mounted const fromChainSelector = screen.getByLabelText('from-chain-selector'); - fireEvent.click(fromChainSelector); + await act(async () => { + fireEvent.click(fromChainSelector); + }); // Wait for dropdown content to be visible - const manifestOptions = await screen.findAllByRole('option', { - name: 'Manifest', - hidden: true, // Add this to find hidden elements + await act(async () => { + const manifestOptions = await screen.findAllByRole('option', { + name: 'Manifest', + hidden: true, + }); + + const enabledManifestOption = manifestOptions.find( + option => !option.className.includes('opacity-50') + ); + fireEvent.click(enabledManifestOption!); }); - const enabledManifestOption = manifestOptions.find( - option => !option.className.includes('opacity-50') - ); - fireEvent.click(enabledManifestOption!); - expect(screen.getByLabelText('from-chain-selector')).toHaveTextContent('Manifest'); const toChainSelector = screen.getByLabelText('to-chain-selector'); - fireEvent.click(toChainSelector); - - // Wait for dropdown content to be visible - const toChainOptions = await screen.findAllByRole('option', { - hidden: true, // Add this to find hidden elements + await act(async () => { + fireEvent.click(toChainSelector); }); - // Find the Manifest option in the to-chain dropdown - const manifestInToChain = toChainOptions.find(option => { - const link = option.querySelector('a'); - return link && link.textContent?.includes('Manifest'); + // Wait for dropdown content to be visible + await act(async () => { + const toChainOptions = await screen.findAllByRole('option', { + hidden: true, + }); + + // Find the Manifest option in the to-chain dropdown + const manifestInToChain = toChainOptions.find(option => { + const link = option.querySelector('a'); + return link && link.textContent?.includes('Manifest'); + }); + + // Check that the Manifest option has the disabled styling and attributes + expect(manifestInToChain?.querySelector('a')).toHaveStyle({ pointerEvents: 'none' }); + expect(manifestInToChain?.querySelector('a')).toHaveClass('opacity-50'); }); - - // Check that the Manifest option has the disabled styling and attributes - expect(manifestInToChain?.querySelector('a')).toHaveStyle({ pointerEvents: 'none' }); - expect(manifestInToChain?.querySelector('a')).toHaveClass('opacity-50'); }); }); From 1ed0bc40fcf928fd02cfa9fd90b784cd3a90a0d9 Mon Sep 17 00:00:00 2001 From: "Felix C. Morency" <1102868+fmorency@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:07:48 -0500 Subject: [PATCH 58/63] fix: tests --- .../components/__tests__/sendBox.test.tsx | 21 +------------------ .../components/__tests__/tokenList.test.tsx | 1 + .../bank/forms/__tests__/ibcSendForm.test.tsx | 7 +++++-- .../bank/forms/__tests__/sendForm.test.tsx | 5 ++++- 4 files changed, 11 insertions(+), 23 deletions(-) diff --git a/components/bank/components/__tests__/sendBox.test.tsx b/components/bank/components/__tests__/sendBox.test.tsx index 9aee3e1d..dc84a4bb 100644 --- a/components/bank/components/__tests__/sendBox.test.tsx +++ b/components/bank/components/__tests__/sendBox.test.tsx @@ -25,26 +25,6 @@ mock.module('next/image', () => ({ }, })); -// Add this mock at the top of your test file -mock.module('@/components/bank/forms/ibcSendForm', () => ({ - default: (props: any) => { - return ( -
    -
    - -
    -
    - -
    -
    - ); - }, -})); - const renderWithProps = (props = {}) => { const defaultProps = { address: 'test_address', @@ -63,6 +43,7 @@ const renderWithProps = (props = {}) => { describe('SendBox', () => { afterEach(() => { cleanup(); + mock.restore(); }); test('renders correctly', () => { diff --git a/components/bank/components/__tests__/tokenList.test.tsx b/components/bank/components/__tests__/tokenList.test.tsx index 5f2cf6af..d2ae8e75 100644 --- a/components/bank/components/__tests__/tokenList.test.tsx +++ b/components/bank/components/__tests__/tokenList.test.tsx @@ -58,6 +58,7 @@ expect.extend(matchers); describe('TokenList', () => { afterEach(() => { cleanup(); + mock.restore(); }); test('renders correctly', () => { diff --git a/components/bank/forms/__tests__/ibcSendForm.test.tsx b/components/bank/forms/__tests__/ibcSendForm.test.tsx index 96c0ae29..a5b3c462 100644 --- a/components/bank/forms/__tests__/ibcSendForm.test.tsx +++ b/components/bank/forms/__tests__/ibcSendForm.test.tsx @@ -1,4 +1,4 @@ -import { describe, test, afterEach, expect, jest, mock } from 'bun:test'; +import { describe, test, afterEach, expect, jest, mock, beforeAll } from 'bun:test'; import React from 'react'; import { screen, cleanup, fireEvent, act } from '@testing-library/react'; import IbcSendForm from '@/components/bank/forms/ibcSendForm'; @@ -78,7 +78,10 @@ function renderWithProps(props = {}) { } describe('IbcSendForm Component', () => { - afterEach(cleanup); + afterEach(() => { + cleanup(); + mock.restore(); + }); test('renders form with correct details', async () => { const { findForm } = renderWithProps(); diff --git a/components/bank/forms/__tests__/sendForm.test.tsx b/components/bank/forms/__tests__/sendForm.test.tsx index bf77ba4f..27be74fb 100644 --- a/components/bank/forms/__tests__/sendForm.test.tsx +++ b/components/bank/forms/__tests__/sendForm.test.tsx @@ -35,7 +35,10 @@ function renderWithProps(props = {}) { } describe('SendForm Component', () => { - afterEach(cleanup); + afterEach(() => { + cleanup(); + mock.restore(); + }); test('renders form with correct details', () => { renderWithProps(); From ceb195338e9ea184aa847ed381f1936a958a0062 Mon Sep 17 00:00:00 2001 From: "Felix C. Morency" <1102868+fmorency@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:33:04 -0500 Subject: [PATCH 59/63] chore: bump typescript --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64bd0b58..fb4b6add 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", "prettier": "^3.3.3", - "typescript": "4.9.3" + "typescript": "5.7.3" }, "files": [ "." From 30cb4a87a13bd969573132ed3c0c96925e79c69d Mon Sep 17 00:00:00 2001 From: "Felix C. Morency" <1102868+fmorency@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:33:14 -0500 Subject: [PATCH 60/63] fix: build error --- .../factory/modals/updateDenomMetadata.tsx | 18 ++++++++---------- components/groups/components/groupControls.tsx | 4 +++- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/components/factory/modals/updateDenomMetadata.tsx b/components/factory/modals/updateDenomMetadata.tsx index b01d15d9..89e53dec 100644 --- a/components/factory/modals/updateDenomMetadata.tsx +++ b/components/factory/modals/updateDenomMetadata.tsx @@ -97,11 +97,10 @@ export default function UpdateDenomMetadataModal({ sender: admin, metadata: { description: values.description || formData.description, - denomUnits: - [ - { denom: fullDenom, exponent: 0, aliases: [symbol] }, - { denom: symbol, exponent: 6, aliases: [fullDenom] }, - ] || formData.denomUnits, + denomUnits: [ + { denom: fullDenom, exponent: 0, aliases: [symbol] }, + { denom: symbol, exponent: 6, aliases: [fullDenom] }, + ], base: fullDenom, display: symbol, name: values.name || formData.name, @@ -122,11 +121,10 @@ export default function UpdateDenomMetadataModal({ sender: address, metadata: { description: values.description || formData.description, - denomUnits: - [ - { denom: fullDenom, exponent: 0, aliases: [symbol] }, - { denom: symbol, exponent: 6, aliases: [fullDenom] }, - ] || formData.denomUnits, + denomUnits: [ + { denom: fullDenom, exponent: 0, aliases: [symbol] }, + { denom: symbol, exponent: 6, aliases: [fullDenom] }, + ], base: fullDenom, display: symbol, name: values.name || formData.name, diff --git a/components/groups/components/groupControls.tsx b/components/groups/components/groupControls.tsx index 1e67696e..de44a423 100644 --- a/components/groups/components/groupControls.tsx +++ b/components/groups/components/groupControls.tsx @@ -13,7 +13,7 @@ import { useRouter } from 'next/router'; import VoteDetailsModal from '@/components/groups/modals/voteDetailsModal'; import { useGroupsByMember } from '@/hooks/useQueries'; -import { useChain } from '@cosmos-kit/react'; +import { useChain, useChains } from '@cosmos-kit/react'; import { MemberSDKType } from '@liftedinit/manifestjs/dist/codegen/cosmos/group/v1/types'; import { ArrowRightIcon } from '@/components/icons'; import ProfileAvatar from '@/utils/identicon'; @@ -230,6 +230,7 @@ export default function GroupControls({ } const { address } = useChain(env.chain); + const chains = useChains([env.chain, env.osmosisChain, env.axelarChain]); const { groupByMemberData } = useGroupsByMember(address ?? ''); useEffect(() => { @@ -603,6 +604,7 @@ export default function GroupControls({ isGroup={true} admin={policyAddress} refetchProposals={refetchProposals} + chains={chains} /> )}
    From ec9481d5758f7f1bf75704563a134062c377ed21 Mon Sep 17 00:00:00 2001 From: "Felix C. Morency" <1102868+fmorency@users.noreply.github.com> Date: Thu, 6 Feb 2025 13:57:14 -0500 Subject: [PATCH 61/63] fix: build --- components/bank/forms/ibcSendForm.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/components/bank/forms/ibcSendForm.tsx b/components/bank/forms/ibcSendForm.tsx index e06f171b..3bacbe92 100644 --- a/components/bank/forms/ibcSendForm.tsx +++ b/components/bank/forms/ibcSendForm.tsx @@ -225,12 +225,12 @@ export default function IbcSendForm({ console.log('route', route); console.log('route.requiredChainAddresses', route.requiredChainAddresses); - const addressList = route.requiredChainAddresses.map(chainID => ({ + const addressList = route.requiredChainAddresses.map((chainID: string) => ({ address: Object.values(chains).find(chain => chain.chain.chain_id === chainID)?.address ?? '', })); - const userAddresses = route.requiredChainAddresses.map(chainID => { + const userAddresses = route.requiredChainAddresses.map((chainID: string) => { const chainContext = Object.values(chains).find(chain => chain.chain.chain_id === chainID); if (!chainContext?.address) { @@ -252,7 +252,7 @@ export default function IbcSendForm({ destAssetChainID: selectedToChain.chainID, amountIn: amountInBaseUnits, amountOut: route.estimatedAmountOut ?? '', - addressList: addressList.map(user => user.address), + addressList: addressList.map((user: { address: any }) => user.address), operations: route.operations, estimatedAmountOut: route.estimatedAmountOut ?? '', slippageTolerancePercent: '1', @@ -268,22 +268,27 @@ export default function IbcSendForm({ // Executes after all of the operations triggered by a user's signature complete. // For multi-tx routes that require multiple user signatures, this will be called once for each tx in sequence + // @ts-ignore onTransactionCompleted: async (chainID, txHash, status) => { console.log(`Route completed with tx hash: ${txHash} & status: ${status.state}`); }, // called after the transaction that the user signs gets broadcast on chain + // @ts-ignore onTransactionBroadcast: async ({ txHash, chainID }) => { console.log(`Transaction broadcasted with tx hash: ${txHash}`); }, // called after the transaction that the user signs is successfully registered for tracking + // @ts-ignore onTransactionTracked: async ({ txHash, chainID }) => { console.log(`Transaction tracked with tx hash: ${txHash}`); }, // called after the user signs a transaction + // @ts-ignore onTransactionSigned: async ({ chainID }) => { console.log(`Transaction signed with chain ID: ${chainID}`); }, // validate gas balance on each chain + // @ts-ignore onValidateGasBalance: async ({ chainID, txIndex, status }) => { console.log(`Validating gas balance for chain ${chainID}...`); }, From e61d629e310290b29716ea82be5fb1d4068a7b6c Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Thu, 6 Feb 2025 14:12:39 -0700 Subject: [PATCH 62/63] fix denom info modal --- bun.lockb | Bin 601180 -> 610422 bytes components/bank/components/tokenList.tsx | 6 +- next.config.cjs | 85 +++++++++++++++++++++++ postcss.config.cjs | 7 ++ 4 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 next.config.cjs create mode 100644 postcss.config.cjs diff --git a/bun.lockb b/bun.lockb index a5a67572e1cf10fbcca50416956eec4d9ad10c04..e90d21f27cabb3a87c70b70505a8ef7c7ecbccac 100755 GIT binary patch delta 132787 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

    yLHA)MugiKpj6=_+g%>P$j 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 delta 126735 zcmeFacYIaF_Wpm)fuq^M06_(m3y6xMh=__O5I7W3A<{wGPm z=oah+EZDmeMU54ES5VZeUcK0V?`LKX=KA4vzn@?GkNq-v=2-fu0J?Vw^<+WSd{_)6)v}@xHUis{c2VaXlKIfL_&fVB?>q%ql_dMZ+_FhQWis}nm zSG+YRYDg$l1U3(aDrZkGF_IniLm>)QmKT>4mlca8erZ;DURkK{BHO@(BwMb0a$ZsX#Mz;~;(aJMl!O$PP%#ypR8X9) zD#s;m7fcuvT`_?!VLIf;OFpW;5(qKX=t&c@+EASf>upzh5wVH z5rt3cZLn8Tig2RzVq~t^Ay_vb?gKP-rJ|afZ7bS!f=us{ED6rLQQfs5n12 z6nX%T?Ue-o%-&n78c%c7yy=GqcINQRd{zvs%SH#h%nmI(cM&f)>Go&;xE2o@(v^>FT zm<_7sU2QFvl;)QePQmaKt+w|-joee9M)GcuAgSC4D&Uua>dCn$*%0;N_^qPyClo8= zx|8ipxEz$@W|ij^F%Y3ya2b^C@-G18(DGBPVF^PDif0z&Pnul*Fa|1yCuU7APzNR! zmlkG`*nwPg;|@>*HvCk%sv=aGMvpbrr+}(R9n;gtJ6aqDCL=c<>5yM`4qS>-DX$(M z0?MF$^{nE@I@$c)aCvqVsQO2pVLfvQsP@WcOgeQ+MOi5H69cJ&dq9QMyABilCC8s| zIIT3NI5#g8nw?cTiRz)ev+N`p2FlgvfHJTPs17v)Wx(2)?NA3NZv!?puF5aU?ZAro zUYhO6D{21shn!H6nB22Fr4`93B}J1o;GwrWTYbej<;7F;%R^1O*^W;Do6=6m;pge0 z(9!V0p!)SicRR9gfU@%$Q2qWaZbR=iQ1W}NyrOb533+M)s1DSkNUOoEAfs5h5^M<; zgU5hl!6xA1-d0fwD1!!r%0B~C`4*r;s$(B(V12k^zYq20kJHaleL~|p5(?%;ATz46 zjmf~mbFG3~K^gV|L#)YBls8Ku7ka0!Rs6WaEui$QbT|`~0plI^1!chLpbTyW9#KJ} z2?<&B^LZ98?QgNXtRO#|hQ2|r*!vWeAr%8Ge+Mpu63bln^s?+?)}>_wZT*7$qNy@8 zzo@J{tDqqCDjhJ9z+}lMCo-6+$x2lD)gWsb%1nV)nbx%pL5&@2X!-1tywF>elk0ba zQuGuk10Hl(P@J1pHkn!ICc~o+bF*ffn99w{FPl9*KjaOw9w-}z|D_;jdO>k%ekgPs z71Y3HS8>`1J0wXL*q8{AtKn5}1>0g!JiF*r)4&Y441Q^(&CkxunS2Hl>KVA&nM}Tx zg*QgIShx`XOORJkkY7@spYzp)b_{oc3d;PV$$6#un}@g-Fy33J7>ZMOtMD(?s!RlkkYyzW`Q;45vE(cAQ$S7epRxT2DFC%5yah_}3!wBo25NY>IlKv^q0053 z{BZ+*(~v=i*i^- zFF~Oyp5PQPO6F=m!}ho-Tn)^ioIKEVrtQF4v#gU2EWc<{*(=D^KaO-VGnDApPn46onfU}g*YnQKEeq|Uy%Ic% z{Mn#J_~Au10u|hg8`C88yNhl5(k*Kw^6{30d5B zxwUNd3cFa$0$U;<18SC^Ji+3vm)V~7Lf!&-^5s_HzgOCjc?N8R{Buwd^SZ;S)z;JZ zx%?AU-^BJRt1z)v4ui{}ZlGM2LP7DbeA~nL6;|x7nN0zm7AASkk59_ zA=KZV+9-1Njebq)2^HU8Z@qAWQ<6}YP@aNZZrpQ|#qxsO@-mc^-fZjbLM|gClv5l` zFD>XWr8vK+ysSfE{;a&xWY_zzZ?T zFc8{qD^zX*6&D3}SOfMAw+erNYj_f8`_G;HlRK^ab-481ewPhMA8eti_>{}I{%$+9 zwmM$8)fW67G!44NG;uyk4BN16*6^Zx?6|)|`D18k2&k#L8GY)|wtKA}-|o?`PF;Bsat%>_SypK&%i7QAQG6uyybD)cJn@j# zf4bA#60A6qj3g4mFI~k~K@VOsy|9F#4vmJZM?*1G23_KM@Wi8*m&4WI`m+ z3w@4Uh9{0J-_elj?Eq!?InP)R+z*#wk!SJ0#&!*YCg9P}*|Cg*^2iqC8oR{~%U!uF z@Nndz8XNWISp%Lbfy;o2U^3Y0c^mb4r5rIkPAcw4puFTQKM93S z1z-8dtqwCu$aRN)YVrGzL!tKYSHad`;!t@nT)Rm#Pz{w$o~4e3$|keLvxI*1x$Su= zcTvUprJ=;*%++7m5U&E|vAPc?E7b6 zEuccKth~5X54j|S@IbM{#Dc6z?$PJ}c=Fi@4`_^|Ai-7n+h^7zf8Q?? z`{Wzn`bQtts^V(;r;Vi(BP5*Xcn+u$?gwgdISrKKAHvM0;ABw#D=jdKXlUIJw%P0c zWgWg6RDM%XBmdHmR{l7s?iBrGki#ko*}IJl*}nzUTwe=n#LlK6#dIR{u0SrHU63_3 zkC89Qo|-$6fk>ty)w>r%)W8;pt3j1d+?OZryY2loJLKPQ&=dE?i5vJtPZJIF#~?K@ zi95#0(+WZxf3uNt&!=323JT6AAq%S{ z0LwvnqA%D6Oc>JDd16XgPU-BD^5Q%m>X()=LFpYE_NcsP0{ zIQ}cx9G(VN96{m}CrI4kJ@5G8p!SVzpkjYLcqG^#RK3I_i^MJG>k+%pTr{1-9#0&8 zI5ccJ@_0wv!B61YZ+J-2VPbw!-eZS`D~#gYyzJuX+=#zP0lAJ0Bfkq&5Iu!rO~!=c z^$o%%W)l2sxD31uRJq&~+v7}!JwSCN@%AJ;KQ~{ldaYrSEx4e8-}N7@DpoWKo8X=S zYKY6xC!{;&W!&N!>@caIJZy*Xk5t>unPOZ6&hVZHP8-JM^0&K8$J@Qp$#>&xEHxb=5Dyk zy$u&W1!~rYDX;t&n%j^m$j3UaB}b_pCc_{SnvGv3TaVt3=T&jT(bf}*p}ris6g~V8 z+v5(c!)BRy8&qt?kFgEj(b5|B404q}+?89@CTy0ILQv%gtDGjo&#kPY4?(Rr&pKRi zoaIwN4fQaGJ&(6B+1}xmlvn;8pcKz{{P(uD+#fWg7{2BNYgmpma0=xrRB`5sw!lzV zu{$UajBRIo&<-vIhdWF^$twC1Me5<9CtLiNlh=ZZ$&Wz|#T%~NnD&-G;rJiznG7oM z4H=px*PLQK@dqgRWgWuij;zV4VY3yEgKK4;1*X((rn=MyyiEFUR6}Y~;^}r0rb3j$d1m&5>!R(+|`TWI1dBs;AGLZ4JBE z;SHeClb4%UR2~ZPbiBjN$yw!BA=g5cU&xC)Vx!vVW&Xc=j;)ZzDM-8PY}Y_XP-9ge z)R^}>&ko6bxKLw%Jt&W?1T|EJpc)`Q&+-#*Mv(yKuY*a}b`N!%Njlos>$m6ve)hT9%59bqkXBeV=czpdgv{!$eWZm>ufS~80dr{3ccTlT7&M!r5ei(xLiG62bU|G zQ_h@Fv#jTOW?MW0)VjzaWBMcvJU1j2Kax49jgA)CU zxv7D3j2T_0*!<%iCf?hGD5nQ3&rG!gz;^{2kI>Kp!z(JAkx&SH1$t?5fxkZnPCNoiJb$j`)FT6*1r^gJrFrG$`FW*xIe8xM0JX^cGA(QjdKYXJ>cd9> zCcyy|)QD{c<;d^LtU*<9ja(V1kxktC42Ej}R!;Z7Y}=|y@eJ$to=&`PhJW-4ttt|C zUip)XxFzH5a~Xz#ch0hbnw3*rT7*Bcrpz#YSw7pw(=1SNGriQD1w)CopcCp9z{i0K z&}N|Guz|zci|v$t4rC$>tqhT&#pkCIo3Yp7@pG;DECgylbTnLkJJew+sF{?Tmsi4T z{Lsg)-diPp@`H;V2xPUznG zw%Ib&%e(y-*k-SB!?p}mxbC?m9BKnTv(V_TsN7CMadR6e2i&;G_Gc|z!&07AqNO~v z2(HcOMHFaQ6BF$oxQ6vwhtrmZ&7ksNusU1Iita(D`I;ahNZ z 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

    @@ -136,9 +136,7 @@ export function TokenList(props: Readonly) { onClick={e => { e.stopPropagation(); setSelectedDenom(balance?.denom); - ( - document?.getElementById(`denom-info-modal`) as HTMLDialogElement - )?.showModal(); + setOpenDenomInfoModal(true); }} className="btn btn-md bg-base-300 text-primary btn-square group-hover:bg-secondary hover:outline hover:outline-primary hover:outline-1 outline-none" > diff --git a/next.config.cjs b/next.config.cjs new file mode 100644 index 00000000..5c857af4 --- /dev/null +++ b/next.config.cjs @@ -0,0 +1,85 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: 'standalone', + transpilePackages: ['@cosmos-kit/web3auth', 'react-syntax-highlighter'], + reactStrictMode: true, + + images: { + domains: [ + 'imgur.com', + 'i.imgur.com', + 'cloudfront.net', + 'cdn.jsdelivr.net', + 'raw.githubusercontent.com', + 's3.amazonaws.com', + 'storage.googleapis.com', + 'res.cloudinary.com', + 'images.unsplash.com', + 'media.giphy.com', + 'media.istockphoto.com', + 'upload.wikimedia.org', + 'istockphoto.com', + 't4.ftcdn.net', + ], + remotePatterns: [ + { + protocol: 'https', + hostname: '*.s3.amazonaws.com', + }, + { + protocol: 'https', + hostname: '*.storage.googleapis.com', + }, + { + protocol: 'https', + hostname: '*.cloudinary.com', + }, + { + protocol: 'https', + hostname: '*.imgix.net', + }, + { + protocol: 'https', + hostname: '*.staticflickr.com', + }, + { + protocol: 'https', + hostname: '*.twimg.com', + }, + { + protocol: 'https', + hostname: '*.pinimg.com', + }, + { + protocol: 'https', + hostname: '*.giphy.com', + }, + { + protocol: 'https', + hostname: '*.dropboxusercontent.com', + }, + { + protocol: 'https', + hostname: '*.googleusercontent.com', + }, + { + protocol: 'https', + hostname: '*.unsplash.com', + }, + { + protocol: 'https', + hostname: '*.istockphoto.com', + }, + { + protocol: 'https', + hostname: '*.upload.wikimedia.org', + }, + { + protocol: 'https', + hostname: '*.t4.ftcdn.net', + }, + ], + }, +}; + +module.exports = nextConfig; diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 00000000..c0c0592c --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,7 @@ +module.exports = { + plugins: { + tailwindcss: {}, + 'postcss-import': {}, + autoprefixer: {}, + }, +}; From 3387cf88fa5711b0d1219834c79fb070f9b4dfed Mon Sep 17 00:00:00 2001 From: Joseph Chalabi Date: Thu, 6 Feb 2025 14:13:15 -0700 Subject: [PATCH 63/63] remoce duplicate config files --- next.config.cjs | 85 ---------------------------------------------- postcss.config.cjs | 7 ---- 2 files changed, 92 deletions(-) delete mode 100644 next.config.cjs delete mode 100644 postcss.config.cjs diff --git a/next.config.cjs b/next.config.cjs deleted file mode 100644 index 5c857af4..00000000 --- a/next.config.cjs +++ /dev/null @@ -1,85 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - output: 'standalone', - transpilePackages: ['@cosmos-kit/web3auth', 'react-syntax-highlighter'], - reactStrictMode: true, - - images: { - domains: [ - 'imgur.com', - 'i.imgur.com', - 'cloudfront.net', - 'cdn.jsdelivr.net', - 'raw.githubusercontent.com', - 's3.amazonaws.com', - 'storage.googleapis.com', - 'res.cloudinary.com', - 'images.unsplash.com', - 'media.giphy.com', - 'media.istockphoto.com', - 'upload.wikimedia.org', - 'istockphoto.com', - 't4.ftcdn.net', - ], - remotePatterns: [ - { - protocol: 'https', - hostname: '*.s3.amazonaws.com', - }, - { - protocol: 'https', - hostname: '*.storage.googleapis.com', - }, - { - protocol: 'https', - hostname: '*.cloudinary.com', - }, - { - protocol: 'https', - hostname: '*.imgix.net', - }, - { - protocol: 'https', - hostname: '*.staticflickr.com', - }, - { - protocol: 'https', - hostname: '*.twimg.com', - }, - { - protocol: 'https', - hostname: '*.pinimg.com', - }, - { - protocol: 'https', - hostname: '*.giphy.com', - }, - { - protocol: 'https', - hostname: '*.dropboxusercontent.com', - }, - { - protocol: 'https', - hostname: '*.googleusercontent.com', - }, - { - protocol: 'https', - hostname: '*.unsplash.com', - }, - { - protocol: 'https', - hostname: '*.istockphoto.com', - }, - { - protocol: 'https', - hostname: '*.upload.wikimedia.org', - }, - { - protocol: 'https', - hostname: '*.t4.ftcdn.net', - }, - ], - }, -}; - -module.exports = nextConfig; diff --git a/postcss.config.cjs b/postcss.config.cjs deleted file mode 100644 index c0c0592c..00000000 --- a/postcss.config.cjs +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - 'postcss-import': {}, - autoprefixer: {}, - }, -};

    uDAfZnZ|j#wgD$*xO+8dpM}=%%=COW-xn#mqTiV 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 { className="flex flex-row justify-between gap-4 items-center p-4 bg-[#FFFFFFCC] dark:bg-[#FFFFFF0F] rounded-[16px] cursor-pointer hover:bg-[#FFFFFF66] dark:hover:bg-[#FFFFFF1A] transition-colors" onClick={() => { setSelectedDenom(balance?.denom); - (document?.getElementById(`denom-info-modal`) as HTMLDialogElement)?.showModal(); + setOpenDenomInfoModal(true); }} >