From 9df58b9511c81bb5e6829fa9e9601542fed25cce Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Tue, 6 May 2025 10:40:04 +0530 Subject: [PATCH] Throw error if balance is zero --- src/App.tsx | 4 +-- src/screens/SignRequestEmbed.tsx | 2 +- src/screens/SignTxEmbed.tsx | 54 ++++++++++++++++++-------------- src/screens/WalletEmbed.tsx | 1 - src/types.ts | 4 +-- src/utils/constants.ts | 2 +- 6 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 80272a4..55a00b7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -390,7 +390,7 @@ const App = (): React.JSX.Element => { }} /> <>, @@ -404,7 +404,7 @@ const App = (): React.JSX.Element => { }} />
, diff --git a/src/screens/SignRequestEmbed.tsx b/src/screens/SignRequestEmbed.tsx index b5ec810..0d7fc00 100644 --- a/src/screens/SignRequestEmbed.tsx +++ b/src/screens/SignRequestEmbed.tsx @@ -19,7 +19,7 @@ import { useNetworks } from '../context/NetworksContext'; const REACT_APP_ALLOWED_URLS = process.env.REACT_APP_ALLOWED_URLS; -type SignRequestProps = NativeStackScreenProps; +type SignRequestProps = NativeStackScreenProps; const SignRequestEmbed = ({ route }: SignRequestProps) => { const [displayAccount, setDisplayAccount] = useState(); diff --git a/src/screens/SignTxEmbed.tsx b/src/screens/SignTxEmbed.tsx index 110648c..60cfc15 100644 --- a/src/screens/SignTxEmbed.tsx +++ b/src/screens/SignTxEmbed.tsx @@ -19,7 +19,7 @@ import { getMnemonic, getPathKey, sendMessage } from '../utils/misc'; import { useNetworks } from '../context/NetworksContext'; import TxErrorDialog from '../components/TxErrorDialog'; import { Account, NetworksDataState } from '../types'; -import { REQUEST_SIGN_TX, REQUEST_COSMOS_ACCOUNTS_DATA, COSMOS_ACCOUNTS_RESPONSE, SIGN_TX_RESPONSE } from '../utils/constants'; +import { REQUEST_SIGN_TX, REQUEST_COSMOS_ACCOUNTS, COSMOS_ACCOUNTS_RESPONSE, SIGN_TX_RESPONSE } from '../utils/constants'; // Type Definitions interface GetAccountsRequestData { @@ -36,7 +36,7 @@ type IncomingMessageData = SignTxRequestData | GetAccountsRequestData; interface IncomingMessageEventData { id: string; - type: typeof REQUEST_SIGN_TX | typeof REQUEST_COSMOS_ACCOUNTS_DATA; + type: typeof REQUEST_SIGN_TX | typeof REQUEST_COSMOS_ACCOUNTS; data: IncomingMessageData; } @@ -60,6 +60,8 @@ interface GetAccountsResponse { }>; } +const REACT_APP_ALLOWED_URLS = process.env.REACT_APP_ALLOWED_URLS; + export const SignTxEmbed = () => { const [isTxApprovalVisible, setIsTxApprovalVisible] = useState(false); const [transactionDetails, setTransactionDetails] = useState(null); @@ -77,7 +79,6 @@ export const SignTxEmbed = () => { const requestData = data as GetAccountsRequestData; const mnemonic = await getMnemonic(); - console.log(`Received ${REQUEST_COSMOS_ACCOUNTS_DATA}`); try { const requestedNetworkData = networksData.find(networkData => networkData.chainId === requestData.chainId) @@ -104,7 +105,7 @@ export const SignTxEmbed = () => { const response: GetAccountsResponse = { accounts: responseAccounts }; sendMessage(source, COSMOS_ACCOUNTS_RESPONSE, {data: response}, origin); } catch (error: unknown) { - console.error(`Error handling ${REQUEST_COSMOS_ACCOUNTS_DATA}:`, error); + console.error(`Error handling ${REQUEST_COSMOS_ACCOUNTS}:`, error); const errorMsg = error instanceof Error ? error.message : String(error); sendMessage(source, COSMOS_ACCOUNTS_RESPONSE, { error: `Failed to get accounts: ${errorMsg}` }, origin); @@ -117,7 +118,6 @@ export const SignTxEmbed = () => { const origin = event.origin; const requestData = data as SignTxRequestData; - console.log(`Received ${REQUEST_SIGN_TX}`); setIsTxApprovalVisible(false); setTransactionDetails(null); setTxError(null); @@ -132,20 +132,18 @@ export const SignTxEmbed = () => { if (!account) throw new Error(`Account not found for address "${signerAddress}" on chain "${signDoc.chainId}".`); // Balance Check - let balanceAmount = 'N/A'; - try { - // Use a temporary read-only client for balance - const tempWallet = await DirectSecp256k1Wallet.fromKey( - new Uint8Array(Buffer.from((await getPathKey(`${network.namespace}:${network.chainId}`, account.index)).privKey.replace(/^0x/, ''), 'hex')), - network.addressPrefix - ); + // Use a temporary read-only client for balance + const tempWallet = await DirectSecp256k1Wallet.fromKey( + new Uint8Array(Buffer.from((await getPathKey(`${network.namespace}:${network.chainId}`, account.index)).privKey.replace(/^0x/, ''), 'hex')), + network.addressPrefix + ); - const client = await SigningStargateClient.connectWithSigner(network.rpcUrl!, tempWallet); - const balance = await client.getBalance(account.address, network.nativeDenom!); - balanceAmount = balance.amount; - client.disconnect(); - } catch (balanceError) { - console.warn("Could not retrieve balance:", balanceError); + const client = await SigningStargateClient.connectWithSigner(network.rpcUrl!, tempWallet); + const balance = await client.getBalance(account.address, network.nativeDenom!); + client.disconnect(); + + if (!balance || balance.amount === "0") { + throw new Error(`${account.address} does not have any balance`) } setTransactionDetails({ @@ -155,7 +153,7 @@ export const SignTxEmbed = () => { chainId: signDoc.chainId, account, requestedNetwork: network, - balance: balanceAmount, + balance: balance.amount, signDoc, txBody }); @@ -176,10 +174,22 @@ export const SignTxEmbed = () => { return; // Basic validation } + if (!REACT_APP_ALLOWED_URLS) { + console.log('Allowed URLs are not set'); + return; + } + + const allowedUrls = REACT_APP_ALLOWED_URLS.split(',').map(url => url.trim()); + + if (!allowedUrls.includes(event.origin)) { + console.log('Unauthorized app.'); + return; + } + const messageData = event.data as IncomingMessageEventData; switch (messageData.type) { - case REQUEST_COSMOS_ACCOUNTS_DATA: + case REQUEST_COSMOS_ACCOUNTS: handleGetCosmosAccountsRequest(event as MessageEvent); break; case REQUEST_SIGN_TX: @@ -192,10 +202,8 @@ export const SignTxEmbed = () => { useEffect(() => { window.addEventListener('message', handleIncomingMessage); - console.log("SendTxEmbed: Message listener added."); return () => { window.removeEventListener('message', handleIncomingMessage); - console.log("SendTxEmbed: Message listener removed."); }; }, [handleIncomingMessage]); @@ -221,7 +229,6 @@ export const SignTxEmbed = () => { const signResponse = await wallet.signDirect(signerAddress, signDoc); sendMessage(source as Window, SIGN_TX_RESPONSE, {data: signResponse}, origin); - console.log("Sent signDirect response"); setIsTxApprovalVisible(false); setTransactionDetails(null); @@ -240,7 +247,6 @@ export const SignTxEmbed = () => { const rejectRequestHandler = () => { if (!transactionDetails) return; const { source, origin } = transactionDetails; - console.log("Rejecting request"); sendMessage(source as Window, SIGN_TX_RESPONSE, { error: "User rejected the signature request." }, origin); setIsTxApprovalVisible(false); diff --git a/src/screens/WalletEmbed.tsx b/src/screens/WalletEmbed.tsx index 8471140..8646d54 100644 --- a/src/screens/WalletEmbed.tsx +++ b/src/screens/WalletEmbed.tsx @@ -140,7 +140,6 @@ export const WalletEmbed = () => { }); if (!checkSufficientFunds(amount, balance.amount)) { - console.log("Insufficient funds detected. Throwing error."); throw new Error('Insufficient funds'); } diff --git a/src/types.ts b/src/types.ts index 5c5317c..ae93310 100644 --- a/src/types.ts +++ b/src/types.ts @@ -40,8 +40,8 @@ export type StackParamsList = { }; "wallet-embed": undefined; "auto-sign-in": undefined; - "sign-request-embed": undefined; - "sign-tx-embed": undefined; + "sign-message-request-embed": undefined; + "sign-tx-request-embed": undefined; }; export type Account = { diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 1e1a1e8..c845a1a 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -76,7 +76,7 @@ export const IS_NUMBER_REGEX = /^\d+$/; export const IS_IMPORT_WALLET_ENABLED = false; // iframe request types -export const REQUEST_COSMOS_ACCOUNTS_DATA = 'REQUEST_COSMOS_ACCOUNTS_DATA'; +export const REQUEST_COSMOS_ACCOUNTS = 'REQUEST_COSMOS_ACCOUNTS'; export const REQUEST_SIGN_TX = 'REQUEST_SIGN_TX'; export const REQUEST_SIGN_MESSAGE = 'REQUEST_SIGN_MESSAGE'; export const REQUEST_WALLET_ACCOUNTS = 'REQUEST_WALLET_ACCOUNTS';