);
diff --git a/frontend/src/components/NewTxnMsg.tsx b/frontend/src/components/NewTxnMsg.tsx
index f5aab5b1a..462d8aed3 100644
--- a/frontend/src/components/NewTxnMsg.tsx
+++ b/frontend/src/components/NewTxnMsg.tsx
@@ -1,229 +1,270 @@
import {
- DELEGATE_TYPE_URL,
- DEPOSIT_TYPE_URL,
- IBC_SEND_TYPE_URL,
- MAP_TXN_TYPES,
- MSG_AUTHZ_EXEC,
- MSG_AUTHZ_GRANT,
- MSG_AUTHZ_REVOKE,
- REDELEGATE_TYPE_URL,
- SEND_TYPE_URL,
- UNDELEGATE_TYPE_URL,
- VOTE_OPTIONS,
- VOTE_TYPE_URL,
+ DELEGATE_TYPE_URL,
+ DEPOSIT_TYPE_URL,
+ IBC_SEND_TYPE_URL,
+ MAP_TXN_TYPES,
+ MSG_AUTHZ_EXEC,
+ MSG_AUTHZ_GRANT,
+ MSG_AUTHZ_REVOKE,
+ MSG_GRANT_ALLOWANCE,
+ MSG_REVOKE_ALLOWANCE,
+ REDELEGATE_TYPE_URL,
+ SEND_TYPE_URL,
+ UNDELEGATE_TYPE_URL,
+ VOTE_OPTIONS,
+ VOTE_TYPE_URL,
} from '@/utils/constants';
import {
- capitalizeFirstLetter,
- getTypeURLName,
- parseAmount,
- shortenAddress,
+ getTypeURLName,
+ parseAmount,
+ shortenAddress,
+ shortenString,
} from '@/utils/util';
import { get } from 'lodash';
import React from 'react';
const NewTxnMsg = ({
- msgs,
- currency,
- failed,
+ msgs,
+ currency,
+ failed,
}: {
- msgs: NewMsg[];
- currency: Currency;
- failed: boolean;
+ msgs: NewMsg[];
+ currency: Currency;
+ failed: boolean;
}) => {
- const status = failed ? 'failed' : 'successfully';
+ const status = failed ? 'failed' : 'successfully';
- if (!msgs.length) {
- return null
- }
+ if (!msgs.length) {
+ return null;
+ }
- const msgType = msgs[0]?.typeUrl || get(msgs, '[0][@type]', '');
- const txTypeText = msgs?.length
- ? failed
- ? 'while ' + MAP_TXN_TYPES[msgType]?.[1] + ' to'
- : MAP_TXN_TYPES[msgType]?.[0] + ' to'
- : '';
- return (
- <>
- {msgs?.length ? (
-
- {msgType === SEND_TYPE_URL ? (
-
-
- {parseAmount(msgs[0]?.amount, currency)}{' '}
- {status} {txTypeText}
-
-
-
-
- {shortenAddress(msgs[0]?.toAddress || '', 15) || '-'}
-
-
-
-
-
- ) : null}
- {msgType === DELEGATE_TYPE_URL ? (
-
-
- {parseAmount([msgs[0]?.amount], currency)}{' '}
- {status} {txTypeText}
-
-
-
-
- {msgs[0]?.validator_address || '-'}
-
-
-
-
-
-
- ) : null}
- {msgType === UNDELEGATE_TYPE_URL ? (
-
-
- {parseAmount([msgs[0]?.amount], currency)}{' '}
- {status}{' '}
-
- {failed
- ? 'while ' + MAP_TXN_TYPES[msgType][1] + ' from'
- : MAP_TXN_TYPES[msgType][0] + 'from'}
-
-
-
-
-
- {shortenAddress(
- msgs[0]?.validator_address || '',
- 15
- ) || '-'}
-
-
-
-
-
- ) : null}
- {msgType === REDELEGATE_TYPE_URL ? (
-
-
- {parseAmount([msgs[0]?.amount], currency)}{' '}
- {status}{' '}
-
- {failed
- ? 'while ' + MAP_TXN_TYPES[msgType][1]
- : MAP_TXN_TYPES[msgType][0]}
-
-
-
-
- ) : null}
- {msgType === VOTE_TYPE_URL ? (
-
-
- {capitalizeFirstLetter(status)}{' '}
-
- {failed
- ? 'while ' + MAP_TXN_TYPES[msgType][1]
- : MAP_TXN_TYPES[msgType][0]}
-
- {VOTE_OPTIONS[get(msgs, '[0].option', 0) - 1]}
- on
- proposal #{parseInt(get(msgs, '[0].proposal_id', ''))}
-
-
-
- ) : null}
- {msgType === DEPOSIT_TYPE_URL ? (
-
-
- {parseAmount(msgs[0]?.amount, currency)}{' '}
- {status}{' '}
-
- {failed
- ? 'while ' + MAP_TXN_TYPES[msgType][1]
- : MAP_TXN_TYPES[msgType][0]}
-
- on proposal #{parseInt(msgs[0]?.proposal_id)}
-
-
-
- ) : null}
- {msgType === IBC_SEND_TYPE_URL ? (
-
-
- {parseAmount([msgs[0]?.token], currency)}{' '}
- {status} {txTypeText}
-
-
-
-
- {shortenAddress(msgs[0]?.receiver || '', 15) || '-'}
-
-
-
-
-
- ) : null}
- {msgType === MSG_AUTHZ_REVOKE ? (
-
-
- {status}
-
-
- {'revoked authz from '}
- {shortenAddress(get(msgs, '[0].grantee', '') || '', 15) || '-'}
-
-
-
-
-
- ) : null}
- {msgType === MSG_AUTHZ_EXEC ? (
-
-
- {status} Executed
-
-
-
- {
- get(msgs, '[0].msgs', []).map((m, mindex) => (
- {getTypeURLName(get(m, '@type'))}
- ))
- }
-
-
-
-
-
- ) : null}
- {msgType === MSG_AUTHZ_GRANT ? (
-
-
- {status} granted to
-
-
-
- {shortenAddress(get(msgs, '[0].grantee', '') || '', 15) || '-'}
-
-
-
-
-
- ) : null}
+ const msgType = msgs[0]?.typeUrl || get(msgs, '[0][@type]', '');
+ const txTypeText = msgs?.length
+ ? failed
+ ? 'while ' + MAP_TXN_TYPES[msgType]?.[1] + ' to'
+ : MAP_TXN_TYPES[msgType]?.[0] + ' to'
+ : '';
+ return (
+ <>
+ {msgs?.length ? (
+
+ {msgType === SEND_TYPE_URL ? (
+
+
+ {parseAmount(msgs[0]?.amount, currency)}{' '}
+ {status} {txTypeText}
+
+
+
+
+ {shortenAddress(msgs[0]?.to_address || '', 15) || '-'}
+
+
+
+
+
+ ) : null}
+ {msgType === DELEGATE_TYPE_URL ? (
+
+
+ {parseAmount([msgs[0]?.amount], currency)}{' '}
+ {status} {txTypeText}
+
+
+
+
+ {shortenString(msgs[0]?.validator_address, 24) || '-'}
+
+
+
+
+
+ ) : null}
+ {msgType === UNDELEGATE_TYPE_URL ? (
+
+
+ {parseAmount([msgs[0]?.amount], currency)}{' '}
+ {status}{' '}
+
+ {failed
+ ? 'while ' + MAP_TXN_TYPES[msgType][1] + ' from'
+ : MAP_TXN_TYPES[msgType][0] + 'from'}
+
+
+
+
+
+ {shortenString(msgs[0]?.validator_address || '', 24) || '-'}
+
+
+
+
+
+ ) : null}
+ {msgType === REDELEGATE_TYPE_URL ? (
+
+
+ {parseAmount([msgs[0]?.amount], currency)}{' '}
+ {status}{' '}
+
+ {failed
+ ? 'while ' + MAP_TXN_TYPES[msgType][1]
+ : MAP_TXN_TYPES[msgType][0]}
+
+
+
+
+ ) : null}
+ {msgType === VOTE_TYPE_URL ? (
+
+
+ {status}{' '}
+
+ {failed
+ ? 'while ' + MAP_TXN_TYPES[msgType][1]
+ : MAP_TXN_TYPES[msgType][0]}
+
+ {VOTE_OPTIONS[get(msgs, '[0].option', 0) - 1]}
+ on
+
+ proposal #{parseInt(get(msgs, '[0].proposal_id', ''))}
+
+
+
+
+ ) : null}
+ {msgType === DEPOSIT_TYPE_URL ? (
+
+
+ {parseAmount(msgs[0]?.amount, currency)}{' '}
+ {status}{' '}
+
+ {failed
+ ? 'while ' + MAP_TXN_TYPES[msgType][1]
+ : MAP_TXN_TYPES[msgType][0]}
+
+ on proposal #{parseInt(msgs[0]?.proposal_id)}
+
+
+
+ ) : null}
+ {msgType === IBC_SEND_TYPE_URL ? (
+
+
+ {parseAmount([msgs[0]?.token], currency)}{' '}
+ {status} {txTypeText}
+
+
+
+
+ {shortenAddress(msgs[0]?.receiver || '', 15) || '-'}
+
+
+
+
+
+ ) : null}
+ {msgType === MSG_AUTHZ_GRANT ? (
+
+
+ {status} granted to{' '}
+
+
+
+
+ {shortenAddress(get(msgs, '[0].grantee', '') || '', 15) ||
+ '-'}
+
+
+
+
+
+ ) : null}
+ {msgType === MSG_AUTHZ_REVOKE ? (
+
+
+ {status}{' '}
+
+
+
+
+ {' '}
+ {'revoked authz from '}
+ {shortenAddress(get(msgs, '[0].grantee', '') || '', 15) ||
+ '-'}
+
+
+
+
+
+ ) : null}
+ {msgType === MSG_AUTHZ_EXEC ? (
+
+
+ {status} Executed{' '}
+
+
+
+
+ {get(msgs, '[0].msgs', []).map((m, mindex) => (
+
+ Authz {getTypeURLName(get(m, '@type'))}
+
+ ))}
+
+
+
+
+
+ ) : null}
+ {msgType === MSG_GRANT_ALLOWANCE ? (
+
+
+ {status} granted allowance
+ to{' '}
+
+
+
+
+ {shortenAddress(get(msgs, '[0].grantee', '') || '', 15) ||
+ '-'}
+
+
+
+
+
+ ) : null}
+ {msgType === MSG_REVOKE_ALLOWANCE ? (
+
+
+ {status} revoked allowance
+ from{' '}
+
+
+
+
+ {shortenAddress(get(msgs, '[0].grantee', '') || '', 15) ||
+ '-'}
+
- ) : null}
- >
- );
+
+
+
+ ) : null}
+
+ ) : null}
+ >
+ );
};
export default NewTxnMsg;
const MoreMessages = ({ msgs }: { msgs: NewMsg[] }) => {
- return (
- <>
- {msgs.length > 1 ? (
-
+{msgs.length - 1}
- ) : null}
- >
- );
+ return (
+ <>
+ {msgs.length > 1 ? (
+
+{msgs.length - 1}
+ ) : null}
+ >
+ );
};
diff --git a/frontend/src/components/txn-status-popups/TransactionStatusPopup.tsx b/frontend/src/components/txn-status-popups/TransactionStatusPopup.tsx
index c1facf2fd..da8ef5067 100644
--- a/frontend/src/components/txn-status-popups/TransactionStatusPopup.tsx
+++ b/frontend/src/components/txn-status-popups/TransactionStatusPopup.tsx
@@ -8,7 +8,7 @@ import useGetChainInfo from '@/custom-hooks/useGetChainInfo';
import { getRecentTransactions } from '@/store/features/recent-transactions/recentTransactionsSlice';
import { dialogBoxPaperPropStyles } from '@/utils/commonStyles';
import { IBC_SEND_TYPE_URL, SEND_TYPE_URL } from '@/utils/constants';
-import { getTxnURL, shortenMsg } from '@/utils/util';
+import { getTxnURL, getTxnURLOnResolute, shortenMsg } from '@/utils/util';
import { Dialog, DialogContent } from '@mui/material';
import Image from 'next/image';
import Link from 'next/link';
@@ -29,7 +29,7 @@ const TransactionStatusPopup = () => {
const [isOpen, setIsOpen] = useState(false);
const dispatch = useAppDispatch();
const { getChainInfo, getDenomInfo } = useGetChainInfo();
- const { explorerTxHashEndpoint = '' } = tx?.chainID
+ const { explorerTxHashEndpoint = '', chainName = '' } = tx?.chainID
? getChainInfo(tx.chainID)
: {};
const {
@@ -129,8 +129,8 @@ const TransactionStatusPopup = () => {
/>
{
return (
@@ -26,7 +28,7 @@ const TxnStatus = ({
diff --git a/frontend/src/store/features/recent-transactions/recentTransactionsService.tsx b/frontend/src/store/features/recent-transactions/recentTransactionsService.tsx
index 1d770ec03..6c905af65 100644
--- a/frontend/src/store/features/recent-transactions/recentTransactionsService.tsx
+++ b/frontend/src/store/features/recent-transactions/recentTransactionsService.tsx
@@ -14,11 +14,10 @@ const ALL_TXNS_URL = (
offset: number
) => `/txns/${chainID}/${address}?limit=${limit}&offset=${offset}`;
-const TXN_URL = (
- address: string,
- chainID: string,
- txhash: string,
-) => `/txns/${chainID}/${address}/${txhash}`;
+const TXN_URL = (address: string, chainID: string, txhash: string) =>
+ `/txns/${chainID}/${address}/${txhash}`;
+
+const ANY_CHAIN_TX_URL = (txHash: string) => `/search/txns/${txHash}`;
export const fetchRecentTransactions = ({
payload,
@@ -56,8 +55,12 @@ export const fetchTx = ({
}): Promise
=>
Axios.get(`${BASE_URL}${TXN_URL(address, chainID, txhash)}`);
+export const fetchAnyChainTx = (txHash: string): Promise =>
+ Axios.get(`${BASE_URL}${ANY_CHAIN_TX_URL(txHash)}`);
+
export default {
recentTransactions: fetchRecentTransactions,
allTransactions: fetchAllTransactions,
- fetchTx: fetchTx
+ fetchTx: fetchTx,
+ fetchAnyChainTx,
};
diff --git a/frontend/src/store/features/recent-transactions/recentTransactionsSlice.tsx b/frontend/src/store/features/recent-transactions/recentTransactionsSlice.tsx
index cde00212c..b694a3d0b 100644
--- a/frontend/src/store/features/recent-transactions/recentTransactionsSlice.tsx
+++ b/frontend/src/store/features/recent-transactions/recentTransactionsSlice.tsx
@@ -1,7 +1,7 @@
'use client';
import { TxStatus } from '@/types/enums';
-import { ERR_UNKNOWN } from '@/utils/errors';
+import { ERR_TXN_NOT_FOUND, ERR_UNKNOWN } from '@/utils/errors';
import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { AxiosError } from 'axios';
import recentTransactionsService from './recentTransactionsService';
@@ -31,7 +31,7 @@ interface RecentTransactionsState {
data?: ParsedTransaction[];
status: TxStatus;
error: string;
- }
+ };
}
const initialState: RecentTransactionsState = {
@@ -49,7 +49,7 @@ const initialState: RecentTransactionsState = {
data: undefined,
status: TxStatus.INIT,
error: '',
- }
+ },
};
export const getRecentTransactions = createAsyncThunk(
@@ -182,9 +182,7 @@ export const getTransaction = createAsyncThunk(
try {
const response = await recentTransactionsService.fetchTx(data);
let txns: ParsedTransaction[] = [];
- const txnsData = response?.data?.data?.data
- console.log('dddddddddddddddddddd', txnsData)
- // txnsData.forEach((txn: ParsedTransaction) => {
+ const txnsData = response?.data?.data?.data;
const { txhash, messages } = txnsData;
if (messages[0]?.['@type'] === IBC_SEND_TYPE_URL) {
const ibcTx = getIBCTxn(txhash);
@@ -218,7 +216,7 @@ export const getTransaction = createAsyncThunk(
// total: response?.data?.data?.total,
// },
// };
- return { data: txns }
+ return { data: txns };
} catch (error) {
if (error instanceof AxiosError)
return rejectWithValue({
@@ -229,6 +227,39 @@ export const getTransaction = createAsyncThunk(
}
);
+export const getAnyChainTransaction = createAsyncThunk(
+ 'recent-txns/get-any-chain-txn',
+ async (
+ data: {
+ txhash: string;
+ },
+ { rejectWithValue }
+ ) => {
+ try {
+ const response = await recentTransactionsService.fetchAnyChainTx(
+ data.txhash
+ );
+ let txns: ParsedTransaction[] = [];
+ const txnsData = response?.data?.data?.data;
+ let formattedTxn = txnsData;
+ if (txnsData) {
+ formattedTxn = { ...formattedTxn, isIBCPending: false };
+ formattedTxn = { ...formattedTxn, isIBCTxn: false };
+ } else {
+ throw new Error(ERR_TXN_NOT_FOUND);
+ }
+
+ txns = [...txns, formattedTxn];
+
+ return { data: txns };
+ /* eslint-disable @typescript-eslint/no-explicit-any */
+ } catch (error: any) {
+ const errMsg = error?.message || ERR_TXN_NOT_FOUND;
+ return rejectWithValue(errMsg);
+ }
+ }
+);
+
export const txRepeatTransaction = createAsyncThunk(
'recent-txns/repeat-txn',
async (
@@ -243,7 +274,8 @@ export const txRepeatTransaction = createAsyncThunk(
data.messages,
GAS_FEE,
'',
- `${data.basicChainInfo.feeAmount * 10 ** data.basicChainInfo.decimals}${data.basicChainInfo.feeCurrencies[0].coinDenom
+ `${data.basicChainInfo.feeAmount * 10 ** data.basicChainInfo.decimals}${
+ data.basicChainInfo.feeCurrencies[0].coinDenom
}`,
data.basicChainInfo.rest,
data?.feegranter?.length ? data.feegranter : undefined,
@@ -364,6 +396,21 @@ export const recentTransactionsSlice = createSlice({
const payload = action.payload as { message: string };
state.txns.error = payload.message || '';
});
+ builder
+ .addCase(getAnyChainTransaction.pending, (state) => {
+ state.txn.status = TxStatus.PENDING;
+ state.txn.error = '';
+ })
+ .addCase(getAnyChainTransaction.fulfilled, (state, action) => {
+ state.txn.status = TxStatus.IDLE;
+ state.txn.data = action?.payload?.data || [];
+ state.txns.error = '';
+ })
+ .addCase(getAnyChainTransaction.rejected, (state, action) => {
+ state.txn.status = TxStatus.REJECTED;
+ state.txn.data = [];
+ state.txn.error = action.error.message || 'Failed to fetch transaction';
+ });
builder
.addCase(txRepeatTransaction.pending, (state) => {
state.txnRepeat.status = TxStatus.PENDING;
diff --git a/frontend/src/txns/authz/revoke.ts b/frontend/src/txns/authz/revoke.ts
index 66d598c71..1664f2c0c 100644
--- a/frontend/src/txns/authz/revoke.ts
+++ b/frontend/src/txns/authz/revoke.ts
@@ -1,6 +1,6 @@
import { MsgRevoke } from 'cosmjs-types/cosmos/authz/v1beta1/tx';
-const msgAuthzRevokeTypeUrl = '/cosmos.authz.v1beta1.MsgRevoke';
+export const msgAuthzRevokeTypeUrl = '/cosmos.authz.v1beta1.MsgRevoke';
export function AuthzRevokeMsg(
granter: string,
diff --git a/frontend/src/txns/feegrant/revoke.ts b/frontend/src/txns/feegrant/revoke.ts
index 1b8e3c77a..89ca4b9cd 100644
--- a/frontend/src/txns/feegrant/revoke.ts
+++ b/frontend/src/txns/feegrant/revoke.ts
@@ -1,6 +1,6 @@
import { MsgRevokeAllowance } from "cosmjs-types/cosmos/feegrant/v1beta1/tx";
-const revokeTypeUrl = "/cosmos.feegrant.v1beta1.MsgRevokeAllowance";
+export const revokeTypeUrl = "/cosmos.feegrant.v1beta1.MsgRevokeAllowance";
export function FeegrantRevokeMsg(granter: string, grantee: string): Msg {
return {
diff --git a/frontend/src/utils/commonStyles.ts b/frontend/src/utils/commonStyles.ts
index 41bec37b1..46b02787e 100644
--- a/frontend/src/utils/commonStyles.ts
+++ b/frontend/src/utils/commonStyles.ts
@@ -74,7 +74,7 @@ export const multiSelectDropDownStyle = {
export const customSelectStyles = {
'& .MuiOutlinedInput-input': {
color: '#fffffff0',
- fontSize: '14px'
+ fontSize: '14px',
},
'& .MuiOutlinedInput-root': {
padding: '0px !important',
@@ -92,5 +92,30 @@ export const customSelectStyles = {
fontWeight: 200,
},
borderRadius: '100px',
- height: '40px'
+ height: '40px',
+};
+
+export const paginationComponentStyles = {
+ '& .MuiPaginationItem-page': {
+ '&:hover': {
+ backgroundColor: '#FFFFFF05',
+ },
+ fontSize: '12px',
+ minWidth: '24px',
+ height: '24px',
+ borderRadius: '4px',
+ color: '#ffffff80',
+ fontWeight: '200',
+ },
+ '& .Mui-selected': {
+ backgroundColor: '#FFFFFF05',
+ fontWeight: '600',
+ color: '#ffffff',
+ },
+ '& .MuiPaginationItem-icon': {
+ color: '#fff',
+ },
+ '& .MuiPaginationItem-ellipsis, & .MuiPaginationItem-ellipsisIcon': {
+ color: 'white',
+ },
};
diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts
index 9cb5e1edc..8538acf9a 100644
--- a/frontend/src/utils/constants.ts
+++ b/frontend/src/utils/constants.ts
@@ -58,6 +58,9 @@ export const VOTE_TYPE_URL = '/cosmos.gov.v1beta1.MsgVote';
export const MSG_AUTHZ_REVOKE = '/cosmos.authz.v1beta1.MsgRevoke';
export const MSG_AUTHZ_EXEC = '/cosmos.authz.v1beta1.MsgExec';
export const MSG_AUTHZ_GRANT = '/cosmos.authz.v1beta1.MsgGrant';
+export const MSG_GRANT_ALLOWANCE = '/cosmos.feegrant.v1beta1.MsgGrantAllowance';
+export const MSG_REVOKE_ALLOWANCE =
+ '/cosmos.feegrant.v1beta1.MsgRevokeAllowance';
export const MULTI_TRANSFER_MSG_COUNT = 3;
export const DELETE_TXN_DIALOG_IMAGE_PATH = '/delete-txn-popup-image.png';
diff --git a/frontend/src/utils/errors.ts b/frontend/src/utils/errors.ts
index fe70daaab..4e5fd6ba6 100644
--- a/frontend/src/utils/errors.ts
+++ b/frontend/src/utils/errors.ts
@@ -33,3 +33,4 @@ export const PERMISSION_NOT_SELECTED_ERROR =
'Atleast one permission must be selected';
export const FAILED_TO_FETCH = 'Failed to fetch';
export const NETWORK_ERROR = 'Network error';
+export const ERR_TXN_NOT_FOUND = 'TXN not found';
\ No newline at end of file
diff --git a/frontend/src/utils/transaction.ts b/frontend/src/utils/transaction.ts
index b60951c74..fb8523360 100644
--- a/frontend/src/utils/transaction.ts
+++ b/frontend/src/utils/transaction.ts
@@ -45,6 +45,8 @@ import {
serializeMsgDeposit,
} from '@/txns/gov/deposit';
import { voteOptionNumber, voteOptions } from './constants';
+import { msgAuthzRevokeTypeUrl } from '@/txns/authz/revoke';
+import { revokeTypeUrl } from '@/txns/feegrant/revoke';
export function NewTransaction(
txResponse: ParsedTxResponse,
@@ -232,8 +234,12 @@ export const formattedMsgType = (msgType: string) => {
return 'Exec Authz';
case msgAuthzGrantTypeUrl:
return 'Grant Authz';
+ case msgAuthzRevokeTypeUrl:
+ return 'Revoke Authz';
case msgFeegrantGrantTypeUrl:
return 'Grant Allowance';
+ case revokeTypeUrl:
+ return 'Revoke Allowance';
case msgVoteTypeUrl:
return 'Vote';
case msgDepositTypeUrl:
diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts
index 62a3b7801..4dfdb01ca 100644
--- a/frontend/src/utils/util.ts
+++ b/frontend/src/utils/util.ts
@@ -487,6 +487,13 @@ export const getTxnURL = (
return cleanURL(explorerTxHashEndpoint) + '/' + hash;
};
+export const getTxnURLOnResolute = (
+ chainName: string,
+ hash: string
+): string => {
+ return `/transactions/history/${chainName.toLowerCase()}/${hash}`;
+};
+
export const parseAmount = (amount: Coin[], currency: Currency) => {
return formatCoin(
parseBalance(amount, currency.coinDecimals, currency.coinMinimalDenom),