@kimafinance/kima-transaction-widget 1.3.6 → 1.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2561,11 +2561,12 @@ function useIsWalletReady() {
2561
2561
  checkChainId();
2562
2562
  }, [externalProvider, sourceChain, switchNetwork, walletChainId, isConnected]);
2563
2563
  useEffect(() => {
2564
- if (isConnected) {
2564
+ if (isConnected && sourceChain.compatibility === "EVM" /* EVM */) {
2565
2565
  console.debug(
2566
2566
  "useIsWalletReady:EVM: Dispatching source address:",
2567
2567
  walletAddress
2568
2568
  );
2569
+ console.log("dispatching evm address: ", walletAddress);
2569
2570
  dispatch(setSourceAddress(walletAddress ?? ""));
2570
2571
  }
2571
2572
  }, [walletAddress, isConnected, dispatch]);
@@ -2644,6 +2645,12 @@ var checkPoolBalance = ({
2644
2645
  const targetToken = poolTokens.find(
2645
2646
  (token) => token.tokenSymbol === finalTargetCurrency
2646
2647
  );
2648
+ if (!targetToken) {
2649
+ return {
2650
+ isPoolAvailable: false,
2651
+ error: `${CHAIN_NAMES_TO_STRING[targetChain]} has no ${targetCurrency} pool!`
2652
+ };
2653
+ }
2647
2654
  const { amount: targetTokenBalance } = targetToken;
2648
2655
  if (parseFloat(amount) > parseFloat(targetTokenBalance))
2649
2656
  return {
@@ -2798,6 +2805,33 @@ function useEvmAllowance() {
2798
2805
  refetchInterval: 60 * 1e3,
2799
2806
  enabled
2800
2807
  });
2808
+ const signMessage = async (data) => {
2809
+ if (!walletProvider) {
2810
+ console.error("No available provider");
2811
+ return;
2812
+ }
2813
+ if (!allowanceData?.decimals) {
2814
+ console.warn("useEvmAllowance: Missing required data");
2815
+ return;
2816
+ }
2817
+ try {
2818
+ const walletClient = createWalletClient({
2819
+ account: walletAddress,
2820
+ chain: sourceChain,
2821
+ transport: custom(window.ethereum)
2822
+ // WARNING: NEED TO MAKE SURE THIS USING THE ETHEREUM OBJECT IS STABLE ENOUGH
2823
+ });
2824
+ return await walletClient.signMessage({
2825
+ account: walletAddress,
2826
+ message: `Target Address: ${data.targetAddress}
2827
+ Target Chain: ${data.targetChain}
2828
+ Target Symbol: ${data.targetSymbol}`
2829
+ });
2830
+ } catch (error) {
2831
+ console.error("useEvmAllowance: Error on signing message:", error);
2832
+ throw new Error("Error on signing message");
2833
+ }
2834
+ };
2801
2835
  const approveErc20TokenTransfer = async (isCancel = false) => {
2802
2836
  if (!walletProvider) {
2803
2837
  console.error("No available provider");
@@ -2863,6 +2897,7 @@ function useEvmAllowance() {
2863
2897
  isApproved: allowanceData?.allowance ? allowanceData.allowance >= allowanceNumber : false,
2864
2898
  approve: approveErc20TokenTransfer,
2865
2899
  isLoading,
2900
+ signMessage,
2866
2901
  refetch
2867
2902
  };
2868
2903
  }
@@ -2956,6 +2991,7 @@ var WalletProvider2 = ({
2956
2991
  return /* @__PURE__ */ React73.createElement(ConnectionProvider, { endpoint }, /* @__PURE__ */ React73.createElement(
2957
2992
  SolanaWalletProvider,
2958
2993
  {
2994
+ autoConnect: false,
2959
2995
  wallets: [
2960
2996
  new PhantomWalletAdapter(),
2961
2997
  new SolflareWalletAdapter(),
@@ -3069,7 +3105,8 @@ function useSolanaAllowance() {
3069
3105
  const { connection: internalConnection } = useConnection2();
3070
3106
  const {
3071
3107
  publicKey: internalPublicKey,
3072
- signTransaction: internalSignTransaction
3108
+ signTransaction: internalSignTransaction,
3109
+ signMessage: internalSignMessage
3073
3110
  } = useWallet2();
3074
3111
  const selectedCoin = useSelector6(selectSourceCurrency);
3075
3112
  const tokenOptions = useSelector6(selectTokenOptions);
@@ -3078,6 +3115,7 @@ function useSolanaAllowance() {
3078
3115
  const isSolanaProvider = sourceChain.shortName === "SOL" && externalProvider?.type === "solana" && externalProvider.provider && externalProvider.signer instanceof PublicKey5;
3079
3116
  const userPublicKey = isSolanaProvider ? externalProvider.signer : sourceChain.shortName === "SOL" ? internalPublicKey : void 0;
3080
3117
  const signTransaction = isSolanaProvider && externalProvider.provider.signTransaction ? externalProvider.provider.signTransaction : sourceChain.shortName === "SOL" ? internalSignTransaction : void 0;
3118
+ const signMessage = isSolanaProvider && externalProvider.provider.signMessage ? externalProvider.provider.signMessage : sourceChain.shortName === "SOL" ? internalSignMessage : void 0;
3081
3119
  const connection = isSolanaProvider && externalProvider.provider.connection ? externalProvider.provider.connection : sourceChain.shortName === "SOL" ? internalConnection : void 0;
3082
3120
  const {
3083
3121
  data: allowanceData,
@@ -3106,6 +3144,23 @@ function useSolanaAllowance() {
3106
3144
  staleTime: 1e3 * 60
3107
3145
  // 1 min
3108
3146
  });
3147
+ const signSolanaMessage = async (data) => {
3148
+ if (!signMessage) {
3149
+ console.warn("useSolanaAllowance: Missing Solana provider setup");
3150
+ return;
3151
+ }
3152
+ try {
3153
+ const message = `Target Address: ${data.targetAddress}
3154
+ Target Chain: ${data.targetChain}
3155
+ Target Symbol: ${data.targetSymbol}`;
3156
+ const encodedMessage = new TextEncoder().encode(message);
3157
+ const signature = await signMessage(encodedMessage);
3158
+ return `0x${Buffer.from(signature).toString("hex")}`;
3159
+ } catch (error2) {
3160
+ console.error("Error signing message:", error2);
3161
+ throw error2;
3162
+ }
3163
+ };
3109
3164
  const approveSPLTokenTransfer = async (isCancel = false) => {
3110
3165
  if (!allowanceAmount) {
3111
3166
  console.warn("useSolanaAllowance: Missing allowance amount");
@@ -3163,7 +3218,8 @@ function useSolanaAllowance() {
3163
3218
  return {
3164
3219
  ...allowanceData,
3165
3220
  isApproved: allowanceData?.allowance ? allowanceData.allowance >= allowanceNumber : false,
3166
- approve: approveSPLTokenTransfer
3221
+ approve: approveSPLTokenTransfer,
3222
+ signMessage: signSolanaMessage
3167
3223
  };
3168
3224
  }
3169
3225
 
@@ -3293,7 +3349,8 @@ var WalletProvider3 = ({ children, networkOption }) => {
3293
3349
  {
3294
3350
  adapters,
3295
3351
  onError,
3296
- onChainChanged
3352
+ onChainChanged,
3353
+ autoConnect: false
3297
3354
  },
3298
3355
  children
3299
3356
  );
@@ -3643,7 +3700,8 @@ function useTronAllowance() {
3643
3700
  const { pools } = useGetPools_default(backendUrl, networkOption);
3644
3701
  const {
3645
3702
  address: internalUserAddress,
3646
- signTransaction: internalSignTronTransaction
3703
+ signTransaction: internalSignTronTransaction,
3704
+ signMessage: internalSignMessage
3647
3705
  } = useWallet5();
3648
3706
  const [approvalsCount, setApprovalsCount] = useState4(0);
3649
3707
  const isTronProvider2 = sourceChain.shortName === "TRX" && externalProvider?.type === "tron" && externalProvider.provider.tronWeb instanceof TronWeb3 && typeof externalProvider.signer === "string";
@@ -3655,6 +3713,7 @@ function useTronAllowance() {
3655
3713
  isTronProvider2 && tronWeb.setAddress(TRON_USDK_OWNER_ADDRESS);
3656
3714
  const userAddress = isTronProvider2 ? externalProvider.signer : internalUserAddress;
3657
3715
  const signTronTransaction = isTronProvider2 ? externalProvider.provider.signTransaction : internalSignTronTransaction;
3716
+ const signMessage = isTronProvider2 ? externalProvider.provider.signMessage : internalSignMessage;
3658
3717
  const {
3659
3718
  data: allowanceData,
3660
3719
  isLoading,
@@ -3675,6 +3734,22 @@ function useTronAllowance() {
3675
3734
  staleTime: 1e3 * 60
3676
3735
  // 1 min
3677
3736
  });
3737
+ const signTronMessage = async (data) => {
3738
+ if (!tronWeb) {
3739
+ console.warn("TronWeb not initialized");
3740
+ return;
3741
+ }
3742
+ try {
3743
+ const message = `Target Address: ${data.targetAddress}
3744
+ Target Chain: ${data.targetChain}
3745
+ Target Symbol: ${data.targetSymbol}`;
3746
+ const signedMessage = await signMessage(message);
3747
+ return signedMessage;
3748
+ } catch (error2) {
3749
+ console.error("Error signing message:", error2);
3750
+ throw error2;
3751
+ }
3752
+ };
3678
3753
  const approveTrc20TokenTransfer = async (isCancel = false) => {
3679
3754
  if (!userAddress || !pools || !tronWeb || !tokenOptions || !selectedCoin || !allowanceAmount) {
3680
3755
  console.warn("Missing required data for approveTrc20TokenTransfer");
@@ -3713,7 +3788,8 @@ function useTronAllowance() {
3713
3788
  return {
3714
3789
  ...allowanceData,
3715
3790
  isApproved: allowanceData?.allowance ? allowanceData.allowance >= allowanceNumber : false,
3716
- approve: approveTrc20TokenTransfer
3791
+ approve: approveTrc20TokenTransfer,
3792
+ signMessage: signTronMessage
3717
3793
  };
3718
3794
  }
3719
3795
 
@@ -3880,10 +3956,10 @@ var KimaProvider = ({
3880
3956
  var KimaProvider_default = KimaProvider;
3881
3957
 
3882
3958
  // src/components/KimaTransactionWidget.tsx
3883
- import React112, { useEffect as useEffect20 } from "react";
3959
+ import React113, { useEffect as useEffect20 } from "react";
3884
3960
 
3885
3961
  // src/components/KimaWidgetWrapper.tsx
3886
- import React111, { useEffect as useEffect19 } from "react";
3962
+ import React112, { useEffect as useEffect19 } from "react";
3887
3963
  import { useDispatch as useDispatch26, useSelector as useSelector38 } from "react-redux";
3888
3964
 
3889
3965
  // src/components/TransactionWidget.tsx
@@ -4640,12 +4716,13 @@ var AddressInput = ({
4640
4716
  const targetChain = useSelector21(selectTargetChain);
4641
4717
  const { walletAddress: sourceAddress, isReady } = useIsWalletReady4();
4642
4718
  const targetAddress = useSelector21(selectTargetAddress);
4643
- const isEvm = (chain) => {
4644
- return chain !== "SOL" && chain !== "TRX" && chain !== "BTC";
4719
+ const isCompatible = (sourceChain2, targetChain2) => {
4720
+ return sourceChain2.compatibility === targetChain2.compatibility;
4645
4721
  };
4646
4722
  useEffect12(() => {
4647
4723
  if (mode === "payment" /* payment */) return;
4648
- if (isEvm(sourceChain) && isEvm(targetChain)) {
4724
+ if (isCompatible(sourceChain, targetChain)) {
4725
+ if (targetAddress !== "") return;
4649
4726
  dispatch(setTargetAddress(isReady && sourceAddress ? sourceAddress : ""));
4650
4727
  return;
4651
4728
  }
@@ -5198,7 +5275,7 @@ var TransactionWidget = ({ theme }) => {
5198
5275
  };
5199
5276
 
5200
5277
  // src/components/TransferWidget.tsx
5201
- import React110, { useEffect as useEffect18, useState as useState14, useRef as useRef7 } from "react";
5278
+ import React111, { useEffect as useEffect18, useState as useState14, useRef as useRef7 } from "react";
5202
5279
  import { useDispatch as useDispatch25, useSelector as useSelector37 } from "react-redux";
5203
5280
 
5204
5281
  // src/components/reusable/SingleForm.tsx
@@ -5369,18 +5446,8 @@ var NetworkSelector_default = React102.memo(NetworkSelector);
5369
5446
 
5370
5447
  // src/components/reusable/SingleForm.tsx
5371
5448
  var SingleForm = ({
5372
- allowance,
5373
5449
  balance,
5374
- decimals,
5375
- formStep,
5376
- onBack,
5377
- onCancelApprove,
5378
- onNext,
5379
- getButtonLabel,
5380
- isApproving,
5381
- isSigning,
5382
- isSubmitting,
5383
- isCancellingApprove
5450
+ decimals
5384
5451
  }) => {
5385
5452
  const dispatch = useDispatch17();
5386
5453
  const mode = useSelector30(selectMode);
@@ -5389,7 +5456,6 @@ var SingleForm = ({
5389
5456
  const { totalFeeUsd } = useSelector30(selectServiceFee);
5390
5457
  const compliantOption = useSelector30(selectCompliantOption);
5391
5458
  const targetCompliant = useSelector30(selectTargetCompliant);
5392
- const transactionOption = useSelector30(selectTransactionOption);
5393
5459
  const sourceNetwork = useSelector30(selectSourceChain);
5394
5460
  const targetNetwork = useSelector30(selectTargetChain);
5395
5461
  const { isReady } = useIsWalletReady4();
@@ -5423,23 +5489,16 @@ var SingleForm = ({
5423
5489
  const maxValue = useMemo15(() => {
5424
5490
  if (!balance) return 0;
5425
5491
  if (totalFeeUsd < 0) return balance;
5426
- const amountMinusFees = preciseSubtraction(balance, totalFeeUsd);
5427
- return amountMinusFees > 0 ? amountMinusFees : 0;
5492
+ return preciseSubtraction(balance, totalFeeUsd);
5428
5493
  }, [balance, totalFeeUsd, feeDeduct]);
5429
5494
  useEffect15(() => {
5430
5495
  if (!errorMessage) return;
5431
5496
  toast4.error(errorMessage);
5432
5497
  }, [errorMessage]);
5433
5498
  useEffect15(() => {
5434
- if (amountValue && amount != "") return;
5499
+ if (amountValue && amount !== "") return;
5435
5500
  setAmountValue(amount);
5436
5501
  }, [amount]);
5437
- useEffect15(() => {
5438
- if (!feeDeduct && maxValue < +amountValue) {
5439
- setAmountValue(maxValue.toString());
5440
- dispatch(setAmount(maxValue.toString()));
5441
- }
5442
- }, [feeDeduct]);
5443
5502
  return /* @__PURE__ */ React103.createElement("div", { className: "single-form" }, /* @__PURE__ */ React103.createElement("div", { className: "form-item" }, /* @__PURE__ */ React103.createElement("span", { className: "label" }, "Source Network:"), /* @__PURE__ */ React103.createElement("div", { className: "items" }, /* @__PURE__ */ React103.createElement(NetworkSelector_default, { type: "source" }), /* @__PURE__ */ React103.createElement(CoinDropdown_default, null))), /* @__PURE__ */ React103.createElement(
5444
5503
  "div",
5445
5504
  {
@@ -5460,27 +5519,21 @@ var SingleForm = ({
5460
5519
  theme: theme.colorMode,
5461
5520
  placeholder: "Target address"
5462
5521
  }
5463
- )) : null, mode === "bridge" /* bridge */ ? /* @__PURE__ */ React103.createElement("div", { className: `form-item ${theme.colorMode}` }, /* @__PURE__ */ React103.createElement("span", { className: "label" }, "Amount:"), /* @__PURE__ */ React103.createElement("div", { className: `amount-label-container items ${theme.colorMode}` }, /* @__PURE__ */ React103.createElement(
5522
+ )) : null, /* @__PURE__ */ React103.createElement("div", { className: `form-item ${theme.colorMode}` }, /* @__PURE__ */ React103.createElement("span", { className: "label" }, "Amount:"), /* @__PURE__ */ React103.createElement("div", { className: `amount-label-container items ${theme.colorMode}` }, /* @__PURE__ */ React103.createElement(
5464
5523
  "input",
5465
5524
  {
5466
5525
  className: `${theme.colorMode}`,
5467
5526
  type: "text",
5468
- placeholder: "Amount",
5527
+ placeholder: "Enter amount",
5469
5528
  value: amountValue || "",
5470
5529
  onChange: (e) => {
5471
5530
  const value = e.target.value;
5472
5531
  const maskedValue = value.replace(/[^0-9.]/g, "").replace(/(\..*?)\..*/g, "$1").replace(new RegExp(`(\\.\\d{${decimals}})\\d+`), "$1");
5473
- const numericValue = parseFloat(maskedValue);
5474
- if (!isNaN(numericValue) && numericValue > maxValue) {
5475
- setAmountValue(maxValue.toString());
5476
- dispatch(setAmount(maxValue.toString()));
5477
- } else {
5478
- setAmountValue(maskedValue);
5479
- dispatch(setAmount(maskedValue));
5480
- }
5532
+ setAmountValue(maskedValue);
5533
+ dispatch(setAmount(maskedValue));
5481
5534
  }
5482
5535
  }
5483
- ), /* @__PURE__ */ React103.createElement(
5536
+ ), /* @__PURE__ */ React103.createElement("div", { className: "max-disclaimer" }, /* @__PURE__ */ React103.createElement(
5484
5537
  "span",
5485
5538
  {
5486
5539
  className: "max-button",
@@ -5490,22 +5543,7 @@ var SingleForm = ({
5490
5543
  }
5491
5544
  },
5492
5545
  "Max"
5493
- ))) : /* @__PURE__ */ React103.createElement("div", { className: `form-item ${theme.colorMode}` }, /* @__PURE__ */ React103.createElement("span", { className: "label" }, "Amount:"), /* @__PURE__ */ React103.createElement("div", { className: `amount-label-container items ${theme.colorMode}` }, /* @__PURE__ */ React103.createElement(
5494
- "input",
5495
- {
5496
- className: `${theme.colorMode}`,
5497
- type: "number",
5498
- placeholder: "Amount",
5499
- value: transactionOption?.amount || amountValue || "",
5500
- onChange: (e) => {
5501
- let _amount = +e.target.value;
5502
- const decimal = sourceNetwork.shortName === "BTC" /* BTC */ || targetNetwork.shortName === "BTC" /* BTC */ ? 8 : 2;
5503
- setAmountValue(e.target.value);
5504
- dispatch(setAmount(_amount.toFixed(decimal)));
5505
- },
5506
- disabled: transactionOption?.amount !== void 0
5507
- }
5508
- ), /* @__PURE__ */ React103.createElement("div", { className: `coin-wrapper ${theme.colorMode}` }, /* @__PURE__ */ React103.createElement("div", { className: "icon-wrapper" }, /* @__PURE__ */ React103.createElement(TargetIcon, null)), targetCurrency))));
5546
+ ), totalFeeUsd !== -1 && /* @__PURE__ */ React103.createElement("p", null, "Est fees: $ ", totalFeeUsd, " USD")))));
5509
5547
  };
5510
5548
  var SingleForm_default = SingleForm;
5511
5549
 
@@ -5564,6 +5602,7 @@ import { useWallet as useWallet7 } from "@solana/wallet-adapter-react";
5564
5602
  import { WalletReadyState } from "@solana/wallet-adapter-base";
5565
5603
  var SolanaWalletSelect = () => {
5566
5604
  const theme = useSelector31(selectTheme);
5605
+ const sourceChain = useSelector31(selectSourceChain);
5567
5606
  const dispatch = useDispatch18();
5568
5607
  const sliderRef = useRef5();
5569
5608
  const { wallet, wallets, select, connect, connected } = useWallet7();
@@ -5607,17 +5646,30 @@ var SolanaWalletSelect = () => {
5607
5646
  }, []);
5608
5647
  const handleWalletClick = useCallback2(
5609
5648
  (walletName) => {
5649
+ console.log(
5650
+ "SolanaWalletSelect: handleWalletClick: walletName: ",
5651
+ walletName
5652
+ );
5610
5653
  select(walletName);
5611
5654
  },
5612
5655
  [select]
5613
5656
  );
5614
5657
  useEffect16(() => {
5615
- if (connected) return;
5616
- if (wallet) {
5617
- connect();
5618
- dispatch(setSolanaConnectModal(false));
5658
+ console.log("SolanaWalletSelect: useEffect: wallet: ", wallet);
5659
+ if (!wallet) return;
5660
+ if (sourceChain.shortName !== "SOL") {
5661
+ console.log("SolanaWalletSelect: source chain is not sol...");
5662
+ return;
5663
+ }
5664
+ if (!connected) {
5665
+ console.log(
5666
+ "SolanaWalletSelect: Wallet exists but not connected, connecting wallet:",
5667
+ wallet
5668
+ );
5669
+ connect().catch((err) => console.error("Solana connect error:", err));
5619
5670
  }
5620
- }, [wallet]);
5671
+ dispatch(setSolanaConnectModal(false));
5672
+ }, [wallet, sourceChain]);
5621
5673
  return /* @__PURE__ */ React104.createElement("div", { className: `wallet-select` }, /* @__PURE__ */ React104.createElement("div", { className: "slide-area hide-scrollbar", ref: sliderRef }, /* @__PURE__ */ React104.createElement("div", { className: "wallet-container" }, detected.map((wallet2, index) => /* @__PURE__ */ React104.createElement(
5622
5674
  "div",
5623
5675
  {
@@ -5659,7 +5711,7 @@ var AccountDetailsModal = () => {
5659
5711
  solanaWalletDisconnect();
5660
5712
  dispatch(setAccountDetailsModal(false));
5661
5713
  };
5662
- if (sourceChain !== "SOL") return;
5714
+ if (sourceChain.shortName !== "SOL") return;
5663
5715
  return /* @__PURE__ */ React105.createElement(
5664
5716
  "div",
5665
5717
  {
@@ -5731,7 +5783,7 @@ var AccountDetailsModal2 = () => {
5731
5783
  const { balance: tronBalance } = useGetTrxBalance_default();
5732
5784
  const selectedNetwork = useSelector34(selectSourceChain);
5733
5785
  const networkDetails = useMemo18(
5734
- () => networkOptions.find(({ id }) => id === selectedNetwork),
5786
+ () => networkOptions.find(({ id }) => id === selectedNetwork.shortName),
5735
5787
  [selectedNetwork]
5736
5788
  );
5737
5789
  const explorerUrl = useMemo18(() => {
@@ -5741,7 +5793,7 @@ var AccountDetailsModal2 = () => {
5741
5793
  tronWalletDisconnect();
5742
5794
  dispatch(setAccountDetailsModal(false));
5743
5795
  };
5744
- if (sourcheChain !== "TRX") return;
5796
+ if (sourcheChain.shortName !== "TRX") return;
5745
5797
  return /* @__PURE__ */ React107.createElement(
5746
5798
  "div",
5747
5799
  {
@@ -5760,7 +5812,7 @@ var AccountDetailsModal2 = () => {
5760
5812
  fill: theme.colorMode === "light" ? "black" : "white"
5761
5813
  }
5762
5814
  )
5763
- )))), /* @__PURE__ */ React107.createElement("div", { className: "modal-content" }, /* @__PURE__ */ React107.createElement("div", { className: "summary" }, networkDetails && /* @__PURE__ */ React107.createElement(networkDetails.icon, { width: 60, height: 60 }), /* @__PURE__ */ React107.createElement("div", { className: "address" }, /* @__PURE__ */ React107.createElement("h2", null, getShortenedAddress(walletAddress || "")), /* @__PURE__ */ React107.createElement(CopyButton_default, { text: walletAddress })), /* @__PURE__ */ React107.createElement("h3", null, tronBalance, " ", selectedNetwork)), /* @__PURE__ */ React107.createElement(SecondaryButton_default, { className: "block-explorer" }, /* @__PURE__ */ React107.createElement(ExternalLink_default, { className: "link", to: explorerUrl }, /* @__PURE__ */ React107.createElement(Explorer_default, { fill: "#778DA3" }), /* @__PURE__ */ React107.createElement("p", null, "Block explorer"), /* @__PURE__ */ React107.createElement(ExternalUrl_default, { fill: "#778DA3" }))), /* @__PURE__ */ React107.createElement(PrimaryButton_default, { clickHandler: handleDisconnect }, "Disconnect")))
5815
+ )))), /* @__PURE__ */ React107.createElement("div", { className: "modal-content" }, /* @__PURE__ */ React107.createElement("div", { className: "summary" }, networkDetails && /* @__PURE__ */ React107.createElement(networkDetails.icon, { width: 60, height: 60 }), /* @__PURE__ */ React107.createElement("div", { className: "address" }, /* @__PURE__ */ React107.createElement("h2", null, getShortenedAddress(walletAddress || "")), /* @__PURE__ */ React107.createElement(CopyButton_default, { text: walletAddress })), /* @__PURE__ */ React107.createElement("h3", null, tronBalance, " ", selectedNetwork.shortName)), /* @__PURE__ */ React107.createElement(SecondaryButton_default, { className: "block-explorer" }, /* @__PURE__ */ React107.createElement(ExternalLink_default, { className: "link", to: explorerUrl }, /* @__PURE__ */ React107.createElement(Explorer_default, { fill: "#778DA3" }), /* @__PURE__ */ React107.createElement("p", null, "Block explorer"), /* @__PURE__ */ React107.createElement(ExternalUrl_default, { fill: "#778DA3" }))), /* @__PURE__ */ React107.createElement(PrimaryButton_default, { clickHandler: handleDisconnect }, "Disconnect")))
5764
5816
  );
5765
5817
  };
5766
5818
  var AccountDetailsModal_default2 = AccountDetailsModal2;
@@ -5891,7 +5943,8 @@ var useValidateTransaction = ({
5891
5943
  sourceCompliant,
5892
5944
  targetCompliant,
5893
5945
  mode,
5894
- pools
5946
+ pools,
5947
+ formStep
5895
5948
  }) => {
5896
5949
  const maxValue = useMemo20(() => {
5897
5950
  if (!balance) return 0;
@@ -5939,24 +5992,22 @@ var useValidateTransaction = ({
5939
5992
  };
5940
5993
  }
5941
5994
  }
5942
- console.log("useValidate:amount: ", amount);
5943
- console.log("useValidate:maxValue ", maxValue);
5944
- if (+amount < totalFeeUsd) {
5995
+ if (+amount > balance && formStep === 0) {
5945
5996
  return {
5946
- error: "ValidationError" /* Error */,
5947
- message: "Fees are greater than the amount to transfer"
5997
+ error: "Warning" /* Warning */,
5998
+ message: "The entered amount exceeds your available balance. This transaction is likely to fail. Proceed with caution."
5948
5999
  };
5949
6000
  }
5950
- if (+amount > maxValue) {
6001
+ if (+amount > maxValue && formStep === 0) {
5951
6002
  return {
5952
- error: "ValidationError" /* Error */,
5953
- message: `Amount exceeds the maximum allowed value [$${maxValue}]`
6003
+ error: "Warning" /* Warning */,
6004
+ message: "The entered amount exceeds the maximum transferable amount (available balance minus transaction fees). Reduce the amount or allow fees to be deducted from the transferred amount. Otherwise, your transaction may fail. Proceed with caution."
5954
6005
  };
5955
6006
  }
5956
- if (balance < +amount) {
6007
+ if (+amount < totalFeeUsd && formStep === 0) {
5957
6008
  return {
5958
- error: "ValidationError" /* Error */,
5959
- message: "Insufficient balance for the transaction"
6009
+ error: "Warning" /* Warning */,
6010
+ message: "Transaction fees exceed the transfer amount. This may result in an ineffective transaction. Proceed with caution."
5960
6011
  };
5961
6012
  }
5962
6013
  if (!isApproved && isSubmitting) {
@@ -6001,7 +6052,7 @@ var useSubmitTransaction = ({
6001
6052
  }) => {
6002
6053
  const dispatch = useDispatch24();
6003
6054
  const [isSubmitting, setSubmitting] = useState13(false);
6004
- const submitTransaction = async () => {
6055
+ const submitTransaction = async (signature) => {
6005
6056
  try {
6006
6057
  setSubmitting(true);
6007
6058
  const params = JSON.stringify({
@@ -6018,7 +6069,8 @@ var useSubmitTransaction = ({
6018
6069
  htlcCreationVout: 0,
6019
6070
  htlcExpirationTimestamp: "0",
6020
6071
  htlcVersion: "",
6021
- senderPubKey: ""
6072
+ senderPubKey: "",
6073
+ options: signature
6022
6074
  });
6023
6075
  const transactionResult = await fetchWrapper.post(
6024
6076
  `${backendUrl}/submit`,
@@ -6110,6 +6162,31 @@ function useDisconnectWallet4() {
6110
6162
  return mainConnection ? { disconnectWallet: mainConnection.disconnectWallet } : defaultDisconnect;
6111
6163
  }
6112
6164
 
6165
+ // src/components/reusable/WarningModal.tsx
6166
+ import React110 from "react";
6167
+ var WarningModal = ({
6168
+ message,
6169
+ onAcknowledge,
6170
+ onCancel
6171
+ }) => {
6172
+ return /* @__PURE__ */ React110.createElement("div", { className: "warning-modal-overlay" }, /* @__PURE__ */ React110.createElement("div", { className: "warning-modal" }, /* @__PURE__ */ React110.createElement("h3", null, "Warning"), /* @__PURE__ */ React110.createElement("p", null, message), /* @__PURE__ */ React110.createElement("div", { className: "warning-modal-buttons" }, /* @__PURE__ */ React110.createElement(
6173
+ SecondaryButton_default,
6174
+ {
6175
+ className: "warning-modal-cancel",
6176
+ clickHandler: onCancel
6177
+ },
6178
+ "Cancel"
6179
+ ), /* @__PURE__ */ React110.createElement(
6180
+ PrimaryButton_default,
6181
+ {
6182
+ className: "warning-modal-acknowledge",
6183
+ clickHandler: onAcknowledge
6184
+ },
6185
+ "Acknowledge"
6186
+ ))));
6187
+ };
6188
+ var WarningModal_default = WarningModal;
6189
+
6113
6190
  // src/components/TransferWidget.tsx
6114
6191
  var TransferWidget = ({
6115
6192
  theme,
@@ -6120,6 +6197,7 @@ var TransferWidget = ({
6120
6197
  const dispatch = useDispatch25();
6121
6198
  const mainRef = useRef7(null);
6122
6199
  const [formStep, setFormStep] = useState14(0);
6200
+ const [warningModalOpen, setWarningModalOpen] = useState14(null);
6123
6201
  const dAppOption = useSelector37(selectDappOption);
6124
6202
  const mode = useSelector37(selectMode);
6125
6203
  const transactionOption = useSelector37(selectTransactionOption);
@@ -6150,7 +6228,7 @@ var TransferWidget = ({
6150
6228
  const { width: windowWidth } = useWidth_default();
6151
6229
  const { disconnectWallet } = useDisconnectWallet4();
6152
6230
  const { balance } = useBalance2();
6153
- const { allowance, isApproved, approve, decimals } = useAllowance({
6231
+ const { allowance, isApproved, approve, decimals, signMessage } = useAllowance({
6154
6232
  setApproving,
6155
6233
  setCancellingApprove
6156
6234
  });
@@ -6181,7 +6259,8 @@ var TransferWidget = ({
6181
6259
  compliantOption,
6182
6260
  mode,
6183
6261
  pools,
6184
- feeDeduct
6262
+ feeDeduct,
6263
+ formStep
6185
6264
  });
6186
6265
  const { submitTransaction, isSubmitting } = useSubmitTransaction_default({
6187
6266
  amount: BigInt(submitAmount ?? "0"),
@@ -6198,7 +6277,7 @@ var TransferWidget = ({
6198
6277
  const handleSubmit = async () => {
6199
6278
  const { error, message: validationMessage } = validate(true);
6200
6279
  if (error === "ValidationError" /* Error */) {
6201
- return toast5.error(validationMessage, { icon: /* @__PURE__ */ React110.createElement(Error_default, null) });
6280
+ return toast5.error(validationMessage, { icon: /* @__PURE__ */ React111.createElement(Error_default, null) });
6202
6281
  }
6203
6282
  if (error === "ApprovalNeeded" /* ApprovalNeeded */) {
6204
6283
  return approve();
@@ -6207,18 +6286,30 @@ var TransferWidget = ({
6207
6286
  keplrHandler && keplrHandler(sourceAddress);
6208
6287
  return;
6209
6288
  }
6210
- const { success, message: submitMessage } = await submitTransaction();
6211
- if (!success) return toast5.error(submitMessage, { icon: /* @__PURE__ */ React110.createElement(Error_default, null) });
6289
+ const signature = await signMessage?.({
6290
+ targetAddress,
6291
+ targetChain: targetChain.shortName,
6292
+ targetSymbol: targetCurrency
6293
+ });
6294
+ const { success, message: submitMessage } = await submitTransaction(
6295
+ JSON.stringify({ signature })
6296
+ );
6297
+ if (!success) return toast5.error(submitMessage, { icon: /* @__PURE__ */ React111.createElement(Error_default, null) });
6212
6298
  };
6213
6299
  const onNext = () => {
6214
- const { error, message } = validate();
6300
+ const { error, message: validationMessage } = validate();
6301
+ if (error === "Warning" /* Warning */ && formStep === 0) {
6302
+ console.log("validationError: Warning: ", validationMessage);
6303
+ setWarningModalOpen({ message: validationMessage });
6304
+ return;
6305
+ }
6215
6306
  if (error !== "ValidationError" /* Error */ && !formStep) {
6216
6307
  return setFormStep(1);
6217
6308
  }
6218
6309
  if (error !== "ValidationError" /* Error */ && formStep > 0) {
6219
6310
  return handleSubmit();
6220
6311
  }
6221
- toast5.error(message, { icon: /* @__PURE__ */ React110.createElement(Error_default, null) });
6312
+ toast5.error(validationMessage, { icon: /* @__PURE__ */ React111.createElement(Error_default, null) });
6222
6313
  mainRef.current?.click();
6223
6314
  };
6224
6315
  const onBack = () => {
@@ -6278,7 +6369,7 @@ var TransferWidget = ({
6278
6369
  useEffect18(() => {
6279
6370
  dispatch(setTheme(theme));
6280
6371
  }, [theme]);
6281
- return /* @__PURE__ */ React110.createElement(
6372
+ return /* @__PURE__ */ React111.createElement(
6282
6373
  "div",
6283
6374
  {
6284
6375
  className: `kima-card ${theme.colorMode}`,
@@ -6286,14 +6377,28 @@ var TransferWidget = ({
6286
6377
  background: theme.colorMode === "light" /* light */ ? theme.backgroundColorLight : theme.backgroundColorDark
6287
6378
  }
6288
6379
  },
6289
- mode === "payment" /* payment */ && !transactionOption && /* @__PURE__ */ React110.createElement("h2", { className: "invalid-option-banner" }, "We're unable to process your payment. Please ensure the necessary transaction details are provided. Contact support if the issue persists."),
6290
- /* @__PURE__ */ React110.createElement("div", { className: "transfer-card" }, /* @__PURE__ */ React110.createElement("div", { className: "kima-card-header" }, /* @__PURE__ */ React110.createElement("div", { className: "topbar" }, /* @__PURE__ */ React110.createElement("div", { className: "title" }, /* @__PURE__ */ React110.createElement("h3", null, formStep === 0 ? titleOption?.initialTitle ? titleOption.initialTitle : mode === "payment" /* payment */ ? "New Purchase" : "New Transfer" : titleOption?.confirmTitle ? titleOption.confirmTitle : mode === "payment" /* payment */ ? "Confirm Purchase" : "Transfer Details")), /* @__PURE__ */ React110.createElement("div", { className: "control-buttons" }, pendingTxs > 0 ? /* @__PURE__ */ React110.createElement(TxButton_default, { theme }) : null, /* @__PURE__ */ React110.createElement(
6380
+ warningModalOpen && /* @__PURE__ */ React111.createElement(
6381
+ WarningModal_default,
6382
+ {
6383
+ message: warningModalOpen.message,
6384
+ onAcknowledge: () => {
6385
+ setWarningModalOpen(null);
6386
+ setFormStep(1);
6387
+ },
6388
+ onCancel: () => {
6389
+ setWarningModalOpen(null);
6390
+ setFormStep(0);
6391
+ }
6392
+ }
6393
+ ),
6394
+ mode === "payment" /* payment */ && !transactionOption && /* @__PURE__ */ React111.createElement("h2", { className: "invalid-option-banner" }, "We're unable to process your payment. Please ensure the necessary transaction details are provided. Contact support if the issue persists."),
6395
+ /* @__PURE__ */ React111.createElement("div", { className: "transfer-card" }, /* @__PURE__ */ React111.createElement("div", { className: "kima-card-header" }, /* @__PURE__ */ React111.createElement("div", { className: "topbar" }, /* @__PURE__ */ React111.createElement("div", { className: "title" }, /* @__PURE__ */ React111.createElement("h3", null, formStep === 0 ? titleOption?.initialTitle ? titleOption.initialTitle : mode === "payment" /* payment */ ? "New Purchase" : "New Transfer" : titleOption?.confirmTitle ? titleOption.confirmTitle : mode === "payment" /* payment */ ? "Confirm Purchase" : "Transfer Details")), /* @__PURE__ */ React111.createElement("div", { className: "control-buttons" }, pendingTxs > 0 ? /* @__PURE__ */ React111.createElement(TxButton_default, { theme }) : null, /* @__PURE__ */ React111.createElement(
6291
6396
  ExternalLink_default,
6292
6397
  {
6293
6398
  to: helpURL ? helpURL : "https://docs.kima.network/kima-network/try-kima-with-the-demo-app"
6294
6399
  },
6295
- /* @__PURE__ */ React110.createElement("div", { className: "menu-button" }, "I need help")
6296
- ), formStep === 0 && mode !== "payment" /* payment */ && /* @__PURE__ */ React110.createElement(
6400
+ /* @__PURE__ */ React111.createElement("div", { className: "menu-button" }, "I need help")
6401
+ ), formStep === 0 && mode !== "payment" /* payment */ && /* @__PURE__ */ React111.createElement(
6297
6402
  "button",
6298
6403
  {
6299
6404
  className: "reset-button",
@@ -6301,7 +6406,7 @@ var TransferWidget = ({
6301
6406
  disabled: isApproving || isSubmitting || isSigning
6302
6407
  },
6303
6408
  "Reset"
6304
- ))), mode === "payment" /* payment */ && paymentTitleOption?.title && /* @__PURE__ */ React110.createElement("h4", { className: "subtitle" }, paymentTitleOption.title)), /* @__PURE__ */ React110.createElement("div", { className: "kima-card-content", ref: mainRef }, formStep === 0 ? /* @__PURE__ */ React110.createElement(
6409
+ ))), mode === "payment" /* payment */ && paymentTitleOption?.title && /* @__PURE__ */ React111.createElement("h4", { className: "subtitle" }, paymentTitleOption.title)), /* @__PURE__ */ React111.createElement("div", { className: "kima-card-content", ref: mainRef }, formStep === 0 ? /* @__PURE__ */ React111.createElement(
6305
6410
  SingleForm_default,
6306
6411
  {
6307
6412
  ...{
@@ -6319,7 +6424,7 @@ var TransferWidget = ({
6319
6424
  isCancellingApprove
6320
6425
  }
6321
6426
  }
6322
- ) : /* @__PURE__ */ React110.createElement(
6427
+ ) : /* @__PURE__ */ React111.createElement(
6323
6428
  ConfirmDetails_default,
6324
6429
  {
6325
6430
  ...{
@@ -6338,12 +6443,12 @@ var TransferWidget = ({
6338
6443
  isApproved
6339
6444
  }
6340
6445
  }
6341
- )), /* @__PURE__ */ React110.createElement(
6446
+ )), /* @__PURE__ */ React111.createElement(
6342
6447
  "div",
6343
6448
  {
6344
6449
  className: `kima-card-footer ${mode === "bridge" /* bridge */ && formStep !== 0 && "confirm"}`
6345
6450
  },
6346
- /* @__PURE__ */ React110.createElement("div", { className: `button-group` }, formStep !== 0 && /* @__PURE__ */ React110.createElement(
6451
+ /* @__PURE__ */ React111.createElement("div", { className: `button-group` }, formStep !== 0 && /* @__PURE__ */ React111.createElement(
6347
6452
  SecondaryButton_default,
6348
6453
  {
6349
6454
  clickHandler: onBack,
@@ -6351,7 +6456,7 @@ var TransferWidget = ({
6351
6456
  disabled: isApproving || isSubmitting || isSigning
6352
6457
  },
6353
6458
  formStep > 0 ? "Back" : "Cancel"
6354
- ), allowance > 0 && formStep !== 0 ? /* @__PURE__ */ React110.createElement(
6459
+ ), allowance > 0 && formStep !== 0 ? /* @__PURE__ */ React111.createElement(
6355
6460
  SecondaryButton_default,
6356
6461
  {
6357
6462
  clickHandler: onCancelApprove,
@@ -6360,7 +6465,7 @@ var TransferWidget = ({
6360
6465
  disabled: isCancellingApprove || isApproving || isSubmitting || isSigning
6361
6466
  },
6362
6467
  isCancellingApprove ? "Cancelling Approval" : "Cancel Approve"
6363
- ) : null, /* @__PURE__ */ React110.createElement(
6468
+ ) : null, /* @__PURE__ */ React111.createElement(
6364
6469
  PrimaryButton_default,
6365
6470
  {
6366
6471
  clickHandler: onNext,
@@ -6369,7 +6474,7 @@ var TransferWidget = ({
6369
6474
  },
6370
6475
  getButtonLabel()
6371
6476
  ))
6372
- ), /* @__PURE__ */ React110.createElement(SolanaWalletConnectModal_default, null), /* @__PURE__ */ React110.createElement(TronWalletConnectModal_default, null), /* @__PURE__ */ React110.createElement(
6477
+ ), /* @__PURE__ */ React111.createElement(SolanaWalletConnectModal_default, null), /* @__PURE__ */ React111.createElement(TronWalletConnectModal_default, null), /* @__PURE__ */ React111.createElement(
6373
6478
  Toaster2,
6374
6479
  {
6375
6480
  position: "top-right",
@@ -6394,7 +6499,7 @@ var TransferWidget = ({
6394
6499
  }
6395
6500
  }
6396
6501
  }
6397
- ), /* @__PURE__ */ React110.createElement("div", { className: "floating-footer" }, /* @__PURE__ */ React110.createElement("div", { className: `items ${theme.colorMode}` }, /* @__PURE__ */ React110.createElement("span", null, "Powered by"), /* @__PURE__ */ React110.createElement(FooterLogo_default, { width: 50, fill: "black" }), /* @__PURE__ */ React110.createElement("strong", null, "Network"))))
6502
+ ), /* @__PURE__ */ React111.createElement("div", { className: "floating-footer" }, /* @__PURE__ */ React111.createElement("div", { className: `items ${theme.colorMode}` }, /* @__PURE__ */ React111.createElement("span", null, "Powered by"), /* @__PURE__ */ React111.createElement(FooterLogo_default, { width: 50, fill: "black" }), /* @__PURE__ */ React111.createElement("strong", null, "Network"))))
6398
6503
  );
6399
6504
  };
6400
6505
 
@@ -6468,7 +6573,7 @@ var KimaWidgetWrapper = ({
6468
6573
  if (!chainData?.length) return;
6469
6574
  indexPluginsByChain(chainData);
6470
6575
  }, [chainData]);
6471
- return submitted ? /* @__PURE__ */ React111.createElement(TransactionWidget, { theme }) : /* @__PURE__ */ React111.createElement(
6576
+ return submitted ? /* @__PURE__ */ React112.createElement(TransactionWidget, { theme }) : /* @__PURE__ */ React112.createElement(
6472
6577
  TransferWidget,
6473
6578
  {
6474
6579
  theme,
@@ -6507,7 +6612,7 @@ var KimaTransactionWidget = ({
6507
6612
  dispatch(setTargetChain(chainData[1]));
6508
6613
  }
6509
6614
  }, [chainData]);
6510
- return isLoadingEnvs || isLoadingChainData ? /* @__PURE__ */ React112.createElement(ring_default, null) : /* @__PURE__ */ React112.createElement(
6615
+ return isLoadingEnvs || isLoadingChainData ? /* @__PURE__ */ React113.createElement(ring_default, null) : /* @__PURE__ */ React113.createElement(
6511
6616
  KimaWidgetWrapper_default,
6512
6617
  {
6513
6618
  ...{