Skip to main content
Viper VIPER SOL·BASE·BSC·ETH·HYPE·HOOD
  • Features
  • Docs
  • Releases
  • Referrals
  • FAQ
  • Socials
Start Trading
No releases match that search.
August 2026
v1.52.0Aug 31 v1.51.0Aug 31 v1.50.0Aug 30 v1.49.0Aug 30 v1.48.0Aug 29 v1.47.0Aug 29 v1.46.0Aug 29 v1.45.0Aug 28 v1.44.0Aug 28 v1.43.0Aug 28 v1.42.0Aug 27 v1.41.0Aug 25 v1.40.0Aug 24 v1.39.0Aug 24 v1.38.0Aug 23 v1.37.0Aug 23 v1.36.0Aug 22 v1.35.0Aug 22 v1.34.0Aug 21 v1.33.0Aug 21 v1.32.0Aug 21 v1.31.0Aug 21 v1.30.0Aug 20 v1.29.0Aug 20 v1.28.0Aug 20 v1.27.0Aug 19 v1.26.0Aug 17 v1.25.0Aug 15 v1.24.0Aug 14 v1.23.0Aug 13 v1.22.0Aug 8 v1.21.0Aug 1 v1.20.0Aug 1
July 2026
v1.19.0Jul 31 v1.18.0Jul 31 v1.17.0Jul 30 v1.16.0Jul 30 v1.15.0Jul 28 v1.14.0Jul 27 v1.13.0Jul 27 v1.12.1Jul 26 v1.12.0Jul 25 v1.11.0Jul 25 v1.10.0Jul 24 v1.9.0Jul 24 v1.8.0Jul 23 v1.7.0Jul 23 v1.6.0Jul 23 v1.5.0Jul 22 v1.4.0Jul 22 v1.3.0Jul 20 v1.2.0Jul 19 v1.1.0Jul 19 v1.0.0Jul 18 v0.1.0Jul 17

Release Notes

What's new in Viper Trading Bot — plain-English notes for every release, newest first.

v1.52.0 — 2026-08-31

Fixed

  • Move Everything no longer cancels your open orders when it can't unlock your wallet. The wallet is opened first, so a failure now leaves your orders exactly as they were instead of cancelling them and moving nothing.
  • Move Everything's confirm screen now tells you exactly what it moves on EVM chains: your native balance, USDC/USDT, and tokens you've traded with the bot. It used to say everything else "stays put", which was wrong — your native balance and stablecoins move whether or not you ever traded them. It also points you at ➕ Add Token on /positions, which is what actually brings a token you transferred in into scope.
  • Trade history recovery no longer records a wrong amount when a token's decimals can't be read. Previously it guessed 18 decimals, which made the recorded amount far too small on tokens that use fewer; it now records nothing rather than something false.
  • Copy trades now reliably get their take-profit order. The bot waits for the buy to settle before reading your new balance, the same allowance call-channel buys already had. Previously a copy trade could end up with no take-profit order and no message telling you so — and a buy that added to a position you already held could size the order off your old balance, selling less than the percentage you set.
  • Take-profit orders, stop-loss orders and copy sells no longer act on an unreadable token. If the token's decimals can't be confirmed, these now stop instead of assuming a common default, which could size an order or record a trade off by a large factor.

v1.51.0 — 2026-08-31

Fixed

  • When a market-data provider goes down — not just rate-limits you, but returns errors or stops responding — the bot now notices and backs off across the whole app, then switches price lookups to the standby provider where you have one enabled. Previously only an explicit rate-limit response triggered this, so a provider outage meant the bot kept hammering it and never failed over.
  • An outage now costs far fewer requests than it used to. A failed batch of token lookups used to retry every token one at a time, turning a brief provider wobble into a self-sustaining storm; those retries are now skipped, since a provider that just failed a batch cannot answer the individual requests either.
  • Solana price lookups can now fall back to the standby provider during an outage, the same as the other chains. This is off by default and enabled per-deployment.
  • During an outage, background price rediscovery no longer stalls what you are doing — buying, pasting a contract address, checking a price, or Move Everything. The two used to share one queue, and because the bot handles one action at a time, a single slow background retry could hold up every user. Repeat attempts for a token already being retried are skipped too, so an outage generates less repeated traffic.

v1.50.0 — 2026-08-30

Fixed

  • Call channels no longer attempt a buy when the posted address is not a token — a wallet address or a pasted link, say. The bot now skips the buy and tells you why, at most once per channel per day, instead of firing a trade that could only fail.
  • Copy trades run the same check before spending.
  • Buys from call channels and copy trades on Base, BSC, Ethereum, Hyperliquid and Robinhood now use the token's real decimals. For tokens that do not use the usual 18, the price-impact safety check was being scaled against the wrong number.

v1.49.0 — 2026-08-30

Performance

  • Price lookups are noticeably faster and hit the market-data providers far less. Tokens priced through a shared intermediate now cost one on-chain quote per refresh instead of one per token, and the bot no longer requests the same pair list twice during pool discovery.
  • Hyperliquid screens load with fewer duplicate requests. Opening the perps hub used to ask Hyperliquid for the same account data up to five times at once; identical simultaneous requests are now shared, and three screens that fetched your main-account balance twice now fetch it once.
  • Solana swaps shave a round trip off every attempt, and Solana price lookups now share their results with the rest of the bot instead of discarding them.

Fixed

  • A rate-limit response from any one price source now backs off every part of the bot that talks to that source, instead of just one. Previously one component kept requesting while the rest were paused, which risked a longer block.
  • Large Solana price requests are now split into batches. A long enough list of tokens could produce a request that some networks reject outright, which would have made every price silently unavailable rather than just some.

v1.48.0 — 2026-08-29

Performance

  • Bridge transfer status updates arrive sooner. A timing quirk meant a status check was skipped about half the time on a quiet bot, stretching updates out toward 20 seconds; they now average around 15.
  • Copy trades on Robinhood are detected about 0.2 seconds sooner, and the bot makes roughly a third fewer requests to do it.
  • The overnight stats job no longer loads every chain's full trade history at once, which had been the bot's single largest memory spike.

Fixed

  • Perps liquidation and close alerts no longer skip the same accounts repeatedly when Hyperliquid is slow. One slow wallet is now skipped for a single cycle instead of cutting the whole round short.
  • Prediction-market settlement alerts can no longer be suppressed by a failed positions lookup.
  • Perps alerts are no longer repeated during a burst. When Telegram rate-limits a rapid run of fill alerts, the bot now stops cleanly and records what it already delivered, so the remaining alerts arrive on the next cycle instead of the whole batch being sent again.
  • Progress made while working through a long EVM wallet catch-up now keeps the bot marked alive, so a catch-up that is steadily getting through transactions is no longer cut short and re-attempted from the start. A single very large history fetch can still take long enough to trip the health check.

v1.47.0 — 2026-08-29

Performance

  • Trade history, the home screen and the wallet-burn list load noticeably faster, and the perps orders view, limit-order builder and burn list no longer refetch everything when you page, change a setting, or tick a checkbox.
  • Perps trade history with a long fill record is much faster to open — funding is now attributed in one pass instead of rescanning the whole funding record for every closed position.
  • One trader's activity no longer clears everyone else's cached screens, so the bot stays responsive for all users when any single account is trading heavily.

Fixed

  • The Refresh button on the home screen and on trade history now genuinely refetches instead of redisplaying what was already on screen.
  • The bot no longer freezes for everyone while an EVM wallet monitor catches up after a gap. A long catch-up could previously hold up every user's commands until it finished.
  • Requesting a bridge quote no longer holds up other users. The live quote updates now run in the background instead of blocking the bot for up to five seconds per refresh.

v1.46.0 — 2026-08-29

Fixed

  • Limit orders past the first ten on a Solana wallet are now tracked correctly. If you had more than 10 active limit orders, the ones beyond the tenth were invisible to the order checker — a fill on one of them was never recorded, and the order kept being re-checked indefinitely.
  • The bot no longer stalls when a token reports an invalid decimals value. A non-standard token contract could previously lock the bot up for everyone; such values are now rejected and the token is treated as having unknown decimals.
  • Wallet and price monitors now back off properly when a connection is closed by the provider, instead of reconnecting in a tight loop. On Solana, a run of failed connections also escalates to the backup polling path as it was meant to.
  • Adding or removing a monitored wallet no longer delays monitoring while the connection re-subscribes.
  • A rate limit on reading your limit orders no longer blocks you from creating or cancelling them.
  • The bot now shuts down cleanly on restart, closing network connections and releasing the database pool instead of being terminated outright.

v1.45.0 — 2026-08-28

Fixed

  • Setup wizards (Add Channel, Add Copy Trade, /setpin, /import) no longer keep running invisibly after you try to leave them. Typing any command — /start, /positions, /history, anything — now ends the wizard. Previously the command ran but the wizard stayed live underneath it, so your *next* ordinary message was silently swallowed as wizard input. The worst case was during /import: a message you meant as a command could be deleted and read as a private key. The command you type to leave is consumed by the wizard rather than run, so re-send it — the reply tells you so.
  • /setpin now offers a tappable Cancel button on every prompt, including the "Confirm PIN" step and the retry after an invalid PIN. This flow deletes your messages as you type them for security, so previously there was nothing left on screen to act on.
  • Starting a second setup wizard now ends the first one instead of leaving both running. Opening Add Channel in the middle of /setpin used to leave the PIN flow live and invisible, where it could later capture a message you meant for something else.
  • Setup wizards now time out reliably. A busy moment at the wrong instant could previously cause the expiry to be skipped entirely, leaving a wizard armed until the bot restarted.
  • A 💱 Swap Stables trade on Solana that runs out of time now tells you the transaction expired, and tells you sooner. Previously you waited out the whole confirmation window and were then shown a vague "confirmation timed out" — even when the swap had already lapsed and was never going to land.

v1.44.0 — 2026-08-28

Fixed

  • On-chain token prices are more accurate on Base, BSC, Ethereum, Hyperliquid and Robinhood. Prices quoted against a low-decimal, high-value token (for example a gold-backed or stablecoin pair) could read several percent low — one reported case was 12.6% under the true price. On Base, BSC, Ethereum and Robinhood, an affected price now either comes back accurate or falls back to a second market-data source, rather than showing a confident wrong number; on Hyperliquid there's no fallback source, so an affected price is withheld and shows as pending instead. This feeds your position values, PnL, and limit / take-profit / stop-loss triggers.
  • A pool price that fails its own sanity check is no longer quietly re-served through a less-checked route. Previously a price rejected for looking wrong could still reach you by a second path; it now has to pass the same check.

Changed

  • Single-hop V2 pairs on Base, Ethereum and BSC are now priced from the pool's own reserves instead of a swap quote, so the displayed price no longer has a trading fee baked into it. Expect valuations on those pairs to read roughly 0.3% higher and closer to the true market price. Trades still execute through the normal route, so what you pay is unchanged.

v1.43.0 — 2026-08-28

Added

  • Token prices now fall back to a second market-data source when the primary one is rate-limited or unreachable, so buy/sell cards and price lookups keep showing a price during an outage instead of dropping to "no price". Applies to Base, BSC, Ethereum, and Robinhood.

v1.42.0 — 2026-08-27

Added

  • 📥 Add Funds now warns you to check the network before sending, and tells you to keep a little of each chain's own coin back for gas.
  • /cancel is now listed in Telegram's command menu and in /help. It backs you out of a setup that is waiting on your reply — a wallet import, a PIN, a copy-trade or call-channel subscription — so the next thing you type is read as a normal message again. The command already worked; it was just never advertised.

Changed

  • ⬅️ Back now returns to the screen you came from instead of jumping to the main menu.
  • Chains are listed in one consistent order across balances, history, positions and every chain picker, and status glyphs and wording now read the same way across every screen. Two screens keep their own order on purpose: the /trending chain chips and the call-channel setup steps.
  • Clearer, more accurate copy across perps, prediction markets, bridge, trending, buy/sell, positions, orders, wallet, settings, copy-trading, call channels and stablecoin swaps — including labels, ranges and figures that were previously wrong or misleading.

Fixed

  • An abandoned prediction-market amount prompt no longer captures every message you send afterwards — any command now clears it.
  • The prediction-market ticket no longer offers a one-tap retry when your order may already have been submitted.
  • Bridge failure notifications now carry navigation buttons instead of leaving you on a card with no way forward.
  • ↻ Refresh on a token info card no longer says "Already up to date." when the refresh actually failed — it now tells you it failed so you can try again.
  • A prediction-market order that fails in an unexpected way no longer leaves the ticket stuck: every later Confirm used to answer "Already submitting — please wait." The recovery message now points at 📈 Browse Markets, which really does clear the stuck ticket, instead of /predict, which did not.
  • Removed references to commands that no longer exist.

v1.41.0 — 2026-08-25

Changed

  • After an order fails for a clear reason — not enough margin, a rejected price — the ticket now stays on screen so you can adjust and try again. When the outcome is genuinely unknown, such as a timeout or a submission that could not be confirmed, the ticket is cleared and you are told to check before retrying, so an order can't be placed twice by accident.

Fixed

  • Every tap now gives a visible response. Previously some actions — a failed order, an expired screen, a stale confirmation — left a card with no buttons and no way forward except starting over.
  • ❌ Cancel now actually cancels. On several prompts it closed the message but left the bot still waiting for input, so the next thing you typed was silently swallowed as your answer.
  • Abandoning a Move Everything PIN prompt no longer consumes your next message as a failed PIN attempt.
  • The Predict markets list no longer fails to open when several markets have long titles; long names are shortened and the card tells you if any rows were left out.
  • 📜 History opened from a bridge quote no longer discards the transfer you were part-way through building.
  • ❌ Cancel on a perps prompt — reduce, leverage, margin, take-profit, a dex transfer — now really cancels. It used to close the prompt while the bot kept waiting, so the next thing you typed could be read as your answer and act on your position without a confirmation step.
  • Amount, price and slippage prompts across Buy, Positions, Limit Orders and stablecoin swaps now carry a ❌ Cancel, and cancelling clears the prompt instead of leaving it waiting for your next message.
  • After a bridge whose outcome could not be confirmed, you can no longer navigate back to a live ✅ Confirm bridge for that same transfer — which could have sent it twice.
  • A bridge in progress keeps its buttons. They used to disappear as soon as the transfer started moving and only come back at the end.
  • The Session expired card now offers a real ⬅️ Back to the screen you came from, and 🏠 Menu reliably goes to the main menu. On some screens both buttons went to the same place and neither went home.
  • ❌ Cancel on the wallet import prompt no longer does nothing when tapped after the import already finished or timed out.
  • Tapping a stale row in your Copy Trades or Call Channels list now says the entry is gone, instead of showing an empty list implying you have none.

v1.40.0 — 2026-08-24

Changed

  • Balances, prices, market caps and PnL percentages now show — when a read fails, instead of a confident $0.00 or a green +0.00%. A zero you see is a real zero.
  • /balance and /start now say when a total may be understated because a price feed is unavailable, rather than quietly leaving a chain out of the sum.
  • The buy-by-ticker pick-list now shows each candidate's full contract address and labelled liquidity across two lines, so a copycat token is distinguishable from the real one.
  • Withdraw and Move Everything confirmations now state the amount, the gas reserve being held back, and where the funds are going.
  • Importing a private key over an existing EVM wallet now asks first, and says that it re-points the wallet on every EVM chain.

Fixed

  • An abandoned "sell what %?" prompt could be answered by your next message and applied to a different token. It is now cleared when the flow ends.
  • Re-opening the Add Channel or Add Copy Trade wizard mid-setup could carry a stale amount into the new run and store it against the wrong chain.
  • A limit order now re-checks the token it is about to submit against the one you selected.
  • A take-profit percentage typed into any entry point is now bounded, and no longer accepts values that could never trigger.
  • A bridge whose broadcast outcome is unknown no longer offers a one-tap retry, which could send twice.
  • Move Everything now distinguishes a transfer that is unconfirmed from one that failed, and shows the transaction hash it already has.
  • Withdraw now offers tokens you hold less than one whole unit of, and no longer shows a zero balance with live percentage buttons when the balance simply could not be read.
  • The token safety panel no longer reports "All clear" when the safety check did not run or the token is blocked for an unlisted reason. Buying is never blocked by an unavailable check.
  • Perps: the $10 minimum order size is now checked before leverage is set, and the flip confirmation shows the size being closed against the size being opened.
  • Token search now says when the search service is unavailable, rather than reporting that no token was found.

v1.39.0 — 2026-08-24

Changed

  • The release notes page is now searchable, and opens on the newest release. Releases are listed down the left, grouped by month; clicking one shows just its notes instead of making you scroll a single ever-growing page. Search matches the full text of every release, highlights the hits, and shows how many each release contains. Every release still has its own link you can share, and the page works the same without JavaScript.

v1.38.0 — 2026-08-23

Added

  • New 📥 Add Funds screen — the deposit screen the bot never had. It shows which coin funds which chain, both of your wallet addresses, and the two ways to arrive with funds you already hold: bridge them across, or import a wallet you already own. Reach it from the first screen after signing up, or any time from /wallet. It names only the chains you can actually receive on, so it never points you at a chain whose address it isn't showing you. The old "How to Fund" button led to a screen whose only action was *withdraw*.

Changed

  • The first screen a new user sees is simpler and gets you to a trade faster. Three short steps, a Buy button on the very first keyboard, and a way back to the full menu that can't dead-end. The first /start is also noticeably quicker.
  • /start and /help now sit at the top of the command menu instead of last.
  • The Buy screen now tells you that typing a ticker like PEPE works, not just pasting a contract address.

Fixed

  • Referral links with lowercase codes now credit the referrer on a brand-new signup. Previously the credit was silently dropped on the first visit and only worked if that person came back later.
  • Pasting a chart link or a "CA: 0x…" message now gets a reply telling you what to send instead of being silently ignored. Text that merely contains an address-shaped run — a transaction hash, a signature — stays silent.
  • /help listed five chains instead of six — Robinhood was missing.

v1.37.0 — 2026-08-23

Added

  • If you block the bot, your activity now pauses automatically instead of the bot repeatedly trying and failing to reach you. Active limit orders, copy trades, and call-channel subscriptions are paused within about a minute of a block. The moment you message the bot again, everything that was paused resumes automatically, with a summary of what came back. Your wallets, keys, and trade history are untouched the whole time. One tradeoff: a stop-loss can't protect a position while you're blocking the bot, since it's paused along with everything else.

Fixed

  • Sell orders that can no longer be filled are now cancelled automatically, instead of sitting in your order list forever. This is checked after every action that can reduce a token balance to nothing — copy-trade sells, take-profit/stop-loss fills, /burn, unwrapping wSOL, withdrawals, and bridging out. A full take-profit exit also cancels a matching trailing stop-loss on the same token, since there's nothing left for it to protect.

v1.36.0 — 2026-08-22

Changed

  • Limit orders no longer hold your wallet's execution lock while the "tx submitted, awaiting confirmation" status update sends, or while the "order paused, tap Resume" advisory sends on a rare mid-fill recovery hiccup — two more spots where a trade could queue behind a slow Telegram round-trip.

Fixed

  • Hyperliquid Core spot balances are now matched by their unique on-chain token index instead of by display name. Hyperliquid allows two different tokens to share the same short name, so a balance lookup by name could previously return the wrong token's balance. Every place that reads a Core spot balance, including Core-to-perps transfers, now resolves the correct token even when names collide.
  • On the perps order screens, price and amount fields (stop-loss, take-profit, margin, leverage, limit price) reject a stray trailing % instead of silently reading it as the bare number — 50% no longer becomes a $50 stop price or a 50x leverage setting.
  • A filled limit order's "Order filled" card could be overwritten by a stale "awaiting confirmation" update, leaving the wrong status as the message you keep. The final card now always wins.
  • When Telegram rate-limits the bot, a message now gives up after one wait instead of sleeping a second time it was never going to use — halving the worst-case delay before a notification falls back or fails.

v1.35.0 — 2026-08-22

Changed

  • Slippage is now typed as a percent everywhere. Typing 1 means 1% on every screen. It previously meant 0.01% on the five /settings slippage screens while meaning 1% on the trading screens — both silently accepted, a 100x difference depending on which screen you were on. Decimals work too (0.25 = 0.25%), and a trailing % is accepted. Your saved values are unchanged; only what you type changed.
  • Default slippage is now 3% on every chain. Base, Ethereum, Hyperliquid, and Solana move up from 1%; BSC and Robinhood were already 3%. This only affects users who never set slippage themselves — an explicit setting always wins. Slippage is a maximum tolerance, not a price, so a wider bound mainly turns reverts into fills; the separate 10% price-impact guard that catches genuinely bad fills is unchanged.
  • Trades no longer hold your wallet's execution lock while Telegram messages send, so a second trade on the same wallet is not queued behind a notification. Withdrawals no longer hold that lock while waiting for you to answer a confirmation prompt.

Fixed

  • /positions and /orders no longer fail to open when you hold a lot. Both screens could exceed Telegram's message-size limit and show nothing at all. They now drop optional context first — the detail card, then warnings, then the balances block — always keep your actual position and order list, and tell you when something was left out.
  • Robinhood take-profit and stop-loss orders were being created at 1% slippage instead of the 3% the chain actually uses, and the settings screen displayed 1% while swaps ran at 3%. All three now read the same source.
  • Link previews no longer appear on any bot message, so cards and layouts stop collapsing.
  • On the perps order ticket, a trailing % is accepted only for slippage again. Typing 50% for margin, leverage, limit price, take-profit, or stop-loss now shows an error instead of being read as the bare number.

v1.34.0 — 2026-08-21

Added

  • Hyperliquid Core spot holdings beyond USDC and HYPE now show up on /start and /positions. Any other token sitting in your Core spot balance appears as its own indented row under the Hyperliquid block, priced in USD from Hyperliquid's own market data. Dust-sized holdings stay hidden, and the list caps at 10 rows with a "+K more" summary line for anything beyond that.

Fixed

  • A timed-out perps withdrawal confirmation could risk sending a second real transfer on retry. Retrying is now refused while the first transfer may still be in flight, and points you to your Core spot balance to finish the withdrawal from there.

v1.33.0 — 2026-08-21

Fixed

  • Perps now shows your real buying power on a Hyperliquid unified account. If your account has spot and perps merged into one balance, the bot previously read your free margin as $0.00 even when fully funded — so the hub looked empty, order sizing clamped every preset to zero, and the Deposit and Withdraw menus disagreed with each other. Free margin, the order ticket, and both transfer menus now report what you can actually trade against. When a balance read fails the bot falls back to the old number rather than guessing high, so it can under-report for a moment but will never size an order your account cannot back.
  • Withdrawing and depositing works on a unified account. Withdrawals were blocked outright because the amount check read the same $0.00, and the withdraw screen's 25/50/75/Max shortcuts reported "nothing available". Deposits appeared to hang, because the bot was watching a number that never moves on a unified account. Both now work, and a deposit is detected when it lands.
  • Token symbols in Chinese, Japanese, and Korean no longer break column alignment. Those characters take two spaces in a monospace row but were counted as one, so any list containing them — positions, orders, markets, balances — came out ragged.

v1.32.0 — 2026-08-21

Added

  • Copy trading now follows a leader who pays with a stablecoin. If a wallet you copy buys a token with USDC (or sells one back into USDC), that trade is now mirrored — previously it was silently skipped. Your copy is still funded from your own native balance, sized from the leader's spend converted at the current price. If that price is briefly unavailable, a percentage-sized copy is skipped rather than guessed at; a fixed-size copy still goes through, because its size never depended on the price.

Fixed

  • Copy trading no longer mirrors a leader's stablecoin shuffles. Moving ETH into USDC, USDC back into ETH, or USDC into USDT is a treasury rotation, not a position — those never trigger a copy on any chain now. Previously they could register as a "buy" of the stablecoin.
  • A leader's trade is now identified by the token that actually moved, not by whichever side of the swap happened to have the largest raw number. A swap into a high-value token quoted in small units (wrapped BTC, for example) is no longer mistaken for a trade in the token that paid for it.
  • A leftover scrap of some other token in the same transaction can no longer disguise a stablecoin shuffle as a real trade. Rounding dust from a multi-hop route, or an unrelated transfer bundled into the same transaction, used to be able to out-rank the tokens that actually moved and turn a treasury rotation into a copied buy — or, worse, into a copied sell that closed your whole position.
  • Copy trading now ignores trades worth under $1 when the leader paid in a stablecoin. A dust-sized amount is not a trading signal, and one arriving in a copied wallet could previously trigger a full exit of your position in that token.

v1.31.0 — 2026-08-21

Added

  • The bridge builder now has a 🔄 Start Over button. It clears a half-built bridge and drops you back on the from-chain screen without leaving the bridge flow — useful when a quote has gone stale or you picked the wrong chain several steps back.

Changed

  • The 🌉 Bridge button on the main menu now always opens a fresh bridge. It used to resume a half-finished one, which could land you on a stale, unrefreshed quote card with no way to start over. Anything already submitted is unaffected — in-flight bridges are tracked independently and keep updating.

Fixed

  • Move Everything no longer sweeps a chain it could only partially read. If a balance lookup comes back incomplete, the chain is now reported as unreadable and skipped instead of moving part of your tokens and reporting the wallet as emptied. Retry once the network settles.
  • Some messages could render a link preview when a token name, contract address, or error text happened to contain a URL — collapsing the card layout and pulling in an unwanted thumbnail. Previews are now suppressed across every trading screen, plus the start, orders, referral, and navigation messages.

v1.30.0 — 2026-08-20

Added

  • Copy trades can now be rate-limited. Each wallet you follow gets an optional cooldown — set it from the copy-trade card as 30s, 5m, 2h, or 1d (up to 7 days, 0 turns it off), and the bot will copy at most one buy from that wallet per interval. Sells are never delayed, so you can still follow a leader out of a position immediately.
  • Copy-trade success notifications now include the token's contract address as a tap-to-copy field, matching the failure and pending messages.

Fixed

  • Copy trades no longer mirror a leader's stablecoin moves. When a wallet you follow rotated into USDC the bot would buy USDC alongside them, and when they rotated out of USDC it would tell you to sell your own stablecoins. Both directions are now skipped.

v1.29.0 — 2026-08-20

Fixed

  • Your Hyperliquid balance no longer counts the same money twice. Hyperliquid moved accounts to a unified model where your Core USDC balance already includes the funds backing your perps positions — the bot was adding the perps figure on top, overstating the Hyperliquid total. On the reported account that was $556 of phantom balance on a real $1,749.
  • Hyperliquid withdrawals now size against what you can actually move. The old figure could be larger than your real spendable Core spot balance, and when it was, the Core-side move quietly did nothing while the wallet-side transaction still went through — leaving the funds parked at Core spot with no sign anything had gone wrong.
  • The Hyperliquid withdraw menu no longer calls a perfectly normal Core spot balance a "stalled withdraw". It now describes it as what it is — spendable Core spot USDC you can move to your wallet.

v1.28.0 — 2026-08-20

Fixed

  • Bridge slippage is now always read as a percentage. Typing 10 meant 10% up to 9.99%, but from 10 upward it was silently read as 0.1% — so asking for 10% slippage gave you 100x less than you wanted and the bridge simply failed to fill. Anything above the cliff also lost its decimals (12.7% became 0.12%). The prompt now asks for a percentage and nothing else.
  • Buy-amount presets can no longer produce a dead "Buy 0" button. Editing a higher preset slot used to blank out the slots before it, and those blank slots still rendered as buttons that would submit a zero-amount buy.
  • Stablecoin balances now show a dash when they can't be read, instead of a confident $0.00 that was indistinguishable from an empty wallet.
  • The positions card now lines up. The profit/loss percentage is a fixed width, so the separator dot stops shifting left and right as the number changes.
  • The perps hub card now lines up too, the same way — its profit/loss percentage was drifting for the same reason.
  • The limit-order builder no longer claims you have 0 USDC available when it simply couldn't read your balance. It now shows a dash, and if you try to place the order it says it can't read your balance and to try again, instead of telling you that you don't have enough.
  • Token prices on Base and Robinhood are no longer at risk of being read upside-down for pools priced in ETH.
  • A network outage no longer makes the bot re-check every token you hold at once, which could get its price lookups rate-limited exactly when they were needed most.

v1.27.0 — 2026-08-19

Fixed

  • Limit-order status updates no longer quote the wrong price. When the bot recovered an order whose confirmation arrived late, the "Current Price" line showed the price of the chain's own coin (for example SOL) instead of the token you actually traded — so a 3 SOL buy of a memecoin displayed a price of $77.44. Where no price can be worked out at all, the line is now left out rather than showing $0.00.
  • Solana limit orders and stop-losses are now protected against filling twice. If an earlier attempt might still be live, the bot refuses to send a second one, matching the protection the other chains already had.
  • Token prices now recover on their own when a trading pool goes dead. Previously a pool that stopped returning a usable price could keep being used for up to an hour before the bot looked for a better one.

v1.26.0 — 2026-08-17

Added

  • The server now restarts the bot automatically if it stops responding, instead of leaving it running but stuck. Previously a wedged bot stayed "up" indefinitely and only a person noticing could recover it.

Fixed

  • A call-channel Telegram session that's no longer authorized (for example, logged out remotely) now fails right away with a clear error, instead of risking a hang of the entire bot on a login-code prompt or repeatedly texting/calling your phone for a code on every retry.
  • Call-channel monitoring no longer stays silently dead after it loses its connection. A broken connection used to block the bot's own health checks, which meant every other wallet and price monitor stopped being watched too, for as long as it stayed broken. The health check now finishes regardless, and a call-channel connection that is technically open but receiving nothing is treated as broken rather than healthy.
  • Your positions no longer show fewer tokens than you actually hold when part of a wallet read fails. A partly-failed read used to be saved and reused as though it were complete; the bot now retries instead. A copy sell for a token that was in the part which did read successfully still goes through.
  • A scheduled check that starts late is no longer silently skipped. Anything running more than a second behind used to be dropped without a trace.
  • Swap failure messages no longer show a link-preview card, and token names inside them are properly escaped.

v1.25.0 — 2026-08-15

Fixed

  • A Solana swap that ran out of time before it could land is now reported as expired as soon as the bot can tell, instead of staying in "still checking" until a later sweep caught up with it.
  • A failed Solana swap no longer blames slippage for a problem that came from somewhere else. Solana routes a trade through other programs, and any of them can report an error — the bot used to present those as its own "slippage too low" verdict and send you to change a setting that was never the problem. The message now shows which step failed and what the underlying error code was, and mentions slippage only as a possibility.
  • A Solana trade sent through MEV protection can no longer be reported as failed on the strength of an unreadable reply from the relay. If the relay answers with something the bot can't recognise as a transaction ID, the bot now re-sends the very same signed transaction over its normal connection rather than treating the trade as finished — which had left a limit order free to fire a second time.

v1.24.0 — 2026-08-14

Fixed

  • A copy-trade sell is no longer silently skipped when the network can't be reached. Previously an RPC outage looked identical to "you don't hold this token", so the bot quietly did nothing and you kept a position the wallet you follow had already exited. You now get a message instead, on Solana and on all EVM chains.
  • A limit order left in limbo — broadcast, but with a fate the bot can't determine — is now paused with an explanation after about an hour, instead of sitting invisibly stuck forever.
  • Move Everything no longer quietly leaves a token behind when the network hiccups mid-sweep. It retries the move and tells you if it couldn't, rather than reporting the wallet emptied.
  • A sell limit order or stop-loss is no longer paused just because the network was briefly unreachable — it retries instead. Previously a short outage could pause your stop-losses, and a paused stop-loss doesn't fire when the outage clears.
  • Take-profit orders are no longer silently skipped when a balance check fails.
  • During a broad network outage you now get one summary message rather than a separate one for every wallet and token, with a count of the suppressed alerts carried into the next message you receive.
  • A limit order that retries after a brief failure no longer sends a fresh "order triggered" alert on every attempt. You now get one alert per trigger, and it updates in place as the order progresses.

v1.23.0 — 2026-08-13

Added

  • Buy an exact number of tokens directly from the Positions page — the same option the token card already offered.
  • Set slippage for an individual limit order from the order builder. Leave it alone and the order uses your chain's slippage setting at fill time; set it explicitly and it's honored, including for Solana orders.

Changed

  • The limit-order builder card now moves to the bottom of the chat when you type a value, instead of staying above your message.
  • Refreshing Positions no longer re-runs pool discovery every time. Prices are still fetched live on every refresh; newly launched tokens re-check their pools more often than established ones.

v1.22.0 — 2026-08-08

Fixed

  • Limit orders could execute the same trade more than once when the network dropped a broadcast confirmation. Orders now verify whether a transaction already went through before sending another.
  • A limit order no longer keeps retrying when its last transaction's outcome can't be confirmed. It now pauses and tells you, so you can check /history and resume once it's safe.
  • Swaps that fail because the price moved mid-execution now say so, and by how much, instead of showing an unreadable error code.
  • /burn no longer shows a token as being worth $0.00 when its price simply could not be fetched. The value is left blank instead, so a price outage can't make a token look worthless.
  • Move Everything now tells you when it couldn't read your holdings on a chain, instead of quietly showing a plan with that chain missing. The confirmation card warns that some holdings there may be missing rather than implying there are none.
  • A Solana outage no longer pauses your stop-losses and limit orders with a misleading "not enough balance — top up your wallet" reason. They now retry on their own once the outage clears, instead of sitting paused until you noticed and re-enabled them by hand.
  • A prediction that settled as a loss is no longer announced as a win, and a claim no longer reports a $0.00 payout when the real payout wasn't reported back. Both used to stick permanently once recorded.
  • The Predict hub no longer shows a confident $0.00 balance while Solana is unreachable — a failed balance read is no longer mistaken for an empty wallet, and is no longer remembered for the next half-minute.
  • Perps actions no longer act on a position read that failed. Closing a position or setting a trigger used to tell you "no open position" when the read had simply failed, and adjusting isolated margin could act on the wrong side of a position it couldn't see. All three now stop and ask you to try again.

v1.21.0 — 2026-08-01

Changed

  • The percentage on /positions is now your unrealized profit or loss — the gain or loss on what you still hold. It agrees with the price and avg entry shown right above it, so a token trading below your avg entry always reads red, even if you already took profit earlier. Money you have already taken out now appears on its own realized line when you open a position, with a total line underneath that matches /history.

Fixed

  • The largest of your four configured buy amounts now shows a green checkmark when selected in the limit-order builder. Previously it was the one amount that could be selected but never appeared as selected anywhere on screen.
  • A custom stop-loss sell percentage now shows on its button instead of leaving all three buttons unmarked.
  • Typing a limit-order amount, trigger price, or trailing stop percentage now updates the order card in place instead of posting a second copy below it.
  • Switching from a token amount to a percentage in the limit-order builder no longer shows the typed percentage on the wrong button.

v1.20.0 — 2026-08-01

Added

  • Tokens whose deepest liquidity sits on a DEX outside a chain's main Uniswap family — a SushiSwap V3 pool, for example — are now priced from that pool directly on Base, Ethereum, BSC and Robinhood. Those pools used to be skipped entirely, so the price came from a third-party listing that could be stale or based on a much shallower pool.

Changed

  • ↻ Refresh on /positions now genuinely re-prices. It drops the pool the bot had pinned for each token you hold and looks again, so a token stuck on a drained or stale pool finally updates instead of holding the same figure until the hourly refresh expires. Tokens that still come back without a pool now get one last live price check rather than showing as pending.
  • One caveat on that first refresh: a token you transferred in yourself and never traded through the bot can drop off the list for a single render and reappear on the next tap.
  • Hitting a rate limit while pricing your positions no longer blocks buying and selling. Price lookups and trade quotes now back off separately, and price lookups are paced to the provider's limit so a large refresh no longer rate-limits itself into showing nothing.

Fixed

  • On Robinhood Chain the dollar stablecoin is now labelled USDG (Global Dollar), which is what it has always been. It was previously shown as USDC — a different issuer's asset.

v1.19.0 — 2026-07-31

Changed

  • Working out which chain a token is on now gives up after 5 seconds instead of sometimes taking the better part of a minute. If it can't finish in time it asks you to pick a chain rather than guessing — and because the bot handles messages one at a time, a slow lookup no longer holds everyone else up.

Fixed

  • The ⬅️ Back button on the stablecoin swap menu now remembers which chain you picked, so returning to a token that's listed on more than one chain reopens its card instead of asking you to choose again. This is the same fix v1.18.0 shipped for the ↻ Refresh button.

v1.18.0 — 2026-07-31

Added

  • BSC tokens that trade against a tokenized stock (rather than against BNB or a stablecoin) are now found and priced. Previously these either didn't show up at all or showed the stock's price instead of the token's.
  • BSC now reads prices from Uniswap V4 pools, alongside the PancakeSwap pools it already used.
  • When a token isn't listed by our main price source, the bot now falls back to a second source instead of giving up. This mostly affects brand-new or thinly-traded tokens.

Changed

  • Looking up a token anywhere in the bot — pasting an address, /price, the price refresh button, the limit order builder, and the hide/unhide links — now tells you honestly what happened instead of guessing Base and showing you a wrong card. A token that isn't on any chain gets a not-found message. A token listed on more than one chain asks you to paste the address again so you can pick which one. Only a genuine price-source outage tells you it's worth retrying.
  • For a token priced from a stock pair, market cap, FDV and 24h change are now left blank rather than showing the paired stock's figures. The token's own price is unaffected. If the token also trades in a normal pool of its own, those figures are taken from that pool instead of being left blank.
  • The ↻ Refresh button on a token card now remembers which chain you picked, so refreshing a token that's listed on more than one chain reopens the card instead of asking you to choose again.

Fixed

  • Prices taken from a two-token hop are now cross-checked against the token's deepest direct pool, so a stale or thin intermediate pool can no longer skew the quoted price. This cross-check now also covers tokens found via the second price source, which previously slipped past it.
  • Paging through /positions with a token selected no longer blanks out the buttons. The token list, page arrows and navigation stay put.
  • Opening the limit-order builder on a token whose chain can't be determined now tells you so, instead of the button doing nothing at all.
  • Swapping any token to SOL now always delivers spendable SOL. On the opt-in 0x Solana swap engine the proceeds were arriving as wrapped SOL, which doesn't pay gas and doesn't show as your SOL balance. Jupiter swaps were never affected.
  • SOL-funded buys on the 0x Solana swap engine now spend your SOL directly instead of quoting against a wrapped balance you don't hold.
  • Solana token prices on /positions now update on every refresh. They could sit unchanged for up to a minute while the market moved.

v1.17.0 — 2026-07-30

Added

  • Wrapped SOL now has its own line in your Solana balances, and an ↩️ Unwrap wSOL button appears whenever you're holding some. Unwrapping returns the SOL to your wallet along with the token account's rent.

Fixed

  • Wrapped SOL left over from a swap no longer shows up as a position with "cost basis unknown — added manually". It was never a position — it's wrapped native SOL — and it's now shown in your balances instead. Your portfolio total is unchanged; the value just lives in the right place.
  • ➕ Add Token now declines native, wrapped-native, and stablecoin addresses, explaining that those are tracked in your balances rather than as positions. Adding one used to create a phantom position with no cost basis.

v1.16.0 — 2026-07-30

Fixed

  • Opening a new position on a coin you already held could silently change the leverage of your EXISTING position, since Hyperliquid's leverage setting applies per-coin, not per-order. New positions (and /perps_long, /perps_short) now lock to your existing position's leverage, matching what already happens when you use ➕ Add.
  • A prediction-market claim that took a while to confirm and then landed later could lose its "claimed" record and notification if enough time had passed. The claim itself was never at risk — only the bot's own tracking of it — and it's now recovered correctly.

v1.15.0 — 2026-07-28

Fixed

  • Sell orders could sell more of a position than you asked for. A 50% limit, stop-loss, take-profit or sell-to-stablecoin order could reach up to 100% of the position when the balance changed between the moment the order was sized and the moment it executed. All four paths now size against the freshest balance.
  • Perpetuals could report a Close or Open as successful when the exchange had actually cancelled the order — telling you a position was flat while it was still open. Recovery now reads the order's real status.
  • A Solana swap that may have reached the network was reported as a hard failure, so it was never tracked or reconciled. It is now reported as unconfirmed and tracked, matching the other Solana swap path.
  • Prediction-market claims could record a permanent $0.00 payout when the real payout was unknown, and auto-claim could get stuck reporting "claim already in progress" forever.
  • Burning tokens to reclaim rent could block your other trades on that wallet for as long as the burn confirmations were pending. Burns now only hold the lock while broadcasting, matching every other trade.
  • Reclaiming rent from empty token accounts could disrupt a trade running on that wallet at the same time, because the two were never held apart. Claims and trades can no longer overlap.
  • A copy-trade sell could stall for up to 15 seconds, holding up every other action on that wallet, when a copy buy for the same token was still going through. The sell now waits before taking the wallet rather than while holding it, so nothing else is blocked.

v1.14.0 — 2026-07-27

Added

  • New /settings → 🔎 Discovered tokens screen shows how many tokens the bot is tracking on each chain against that chain's limit, with a per-chain Clear all so you can free up space yourself.

Fixed

  • Tokens sent to your wallet could stop appearing on a chain once enough very low-value ones had built up, with no way to tell why or clear them. Space now frees up on its own when a chain is full, and the new settings screen lets you clear a chain yourself.

Changed

  • Added further safety checks to Solana swap transaction signing: swap route data is now checked against the blockchain before anything is signed. On the rare occasion it can't be checked, the swap stops and asks you to try again instead of going ahead.

v1.13.0 — 2026-07-27

Added

  • Tokens sent to your wallet from outside the bot now show up automatically in /positions on Base, BSC, Ethereum, and Hyperliquid once their value clears a small threshold — no need to add them manually first. Robinhood is not included for now. ➕ Add Token still works for tokens below that threshold, on Robinhood, and for tokens received before this existed.

Changed

  • Added further safety checks to Solana swap and cross-chain bridge transaction signing.

v1.12.1 — 2026-07-26

Fixed

  • A cross-chain bridge that goes quiet is now followed for a full 24 hours instead of roughly 12 minutes. Transfers that settle slowly used to stop being tracked before they landed, leaving you without a final status message — now you still get one.
  • Searching for a token by ticker no longer lets a token with a misleading price reading push a legitimate match out of the results.
  • A malformed reply from the token data provider no longer causes a whole batch of token lookups to come back empty — only the bad entry is skipped.
  • An extreme liquidity figure from the token data provider no longer errors out ticker search or token lookups; the bad figure is now ignored like any other unusable value.

Changed

  • Added further safety checks to Solana transaction signing.

v1.12.0 — 2026-07-25

Added

  • New Use 0x Swaps setting for Solana (Settings → Solana), off by default. With it on, your Solana swaps are routed and priced by 0x instead of Jupiter. If 0x cannot produce a usable swap, the bot quietly falls back to Jupiter and your trade goes through as normal — the fallback only ever happens before anything is sent to the chain, so a swap is never submitted twice. Everything else behaves the same: your slippage setting, priority fees, MEV protection and fees all work exactly as they do today, and the fee you pay is identical either way.

v1.11.0 — 2026-07-25

Fixed

  • Failure messages now tell you what actually happened. A copy-trade or call-channel buy that times out is reported as still pending instead of "Failed", a cancel on the perps Orders view now says whether it succeeded, may have applied, or was rejected (with the exchange's own reason), and Hyperliquid errors that previously showed a generic "Action failed" now show the real cause. Wording across the bot distinguishes a temporary problem from a permanent one, and messages no longer show two status icons at once.
  • Prediction-market fixes: an error left over from an earlier action is no longer shown against your current one; a claim that timed out and then landed now records its payout and sends the 🎉 you were owed; placing an order with no Solana wallet gives a clear message instead of a generic failure; and a broadcast with no confirmation is described honestly as "may or may not have gone through" rather than as a definite failure.
  • Bridges and alerts are no longer dropped while still in progress. A bridge whose source transaction has landed but whose destination leg is still settling is no longer reported as "recovered" and removed from tracking. Near-liquidation alerts now work for wallets whose only position is on a builder market, even when a market read fails the first time it is seen.
  • Trades and gas fees recorded during a price-feed outage are no longer permanently valued at $0 — the last remaining recovery paths that stored the outage placeholder now record the price as unknown, so your history re-derives it from the current price.

v1.10.0 — 2026-07-24

Added

  • Buy an exact number of tokens on Base, Ethereum, BSC, Hyperliquid, and Robinhood with the new "🎯 Buy Tokens" button on the buy card. The bot computes the required native spend via 0x and hard-caps it using your own Price Impact Guard setting (plus your slippage and the platform fee) — never past your balance minus the gas reserve — so a tighter guard means a tighter cap. Before it executes you see the estimated spend, and the receipt shows what was actually spent with an ≈ marker. Tokens with unknown prices, amounts smaller than one whole unit, or transfer taxes are refused up front rather than risking an overpay.

v1.9.0 — 2026-07-24

Fixed

  • Trades recorded during a price-feed outage are no longer permanently valued at $0 — recording and daily-stats paths now treat the outage sentinel as "price unknown" and fall back to the current price.
  • Token lookups during a market-data outage now show a "price sources are degraded" notice instead of silently assuming the wrong chain (price checks, hide/unhide, limit-order entry, and chart lookups). A token that exists on more than one chain is handled as before and is no longer mislabelled as degraded.
  • Hardened outage recovery across the board: wallet monitoring no longer skips blocks when an RPC hides an error inside a 200 response, bridge-recovery tracking survives 0x outages and Telegram send failures, failed-trade records retry through transient database contention, and a Jito rate limit now pauses only the affected region instead of switching MEV protection off everywhere.

v1.8.0 — 2026-07-23

Fixed

  • Token prices derived through a two-hop route (a pool quoted in another token, e.g. a tokenized stock) are now checked against the token's direct stable/native pools on every poll — when they diverge by more than 10%, the direct pool's price (where sells actually execute) is served instead. Applies on Base, Ethereum, and Robinhood.
  • Two-hop prices no longer understate by the intermediate pool's swap fee (up to ~1% on 1%-fee pools) — the fee is now backed out of the intermediate leg, and pool drift calibration measures against the same corrected value.

v1.7.0 — 2026-07-23

Fixed

  • Brand-new tokens whose DexScreener listing still reports zero liquidity (indexing lag) are now probed on-chain instead of showing no price for their first hours — applies on Base, Ethereum, BSC, and Robinhood.
  • Fallback prices no longer trust a pair quoted in an unreliable token (e.g. a tokenized stock): when on-chain quoting is unavailable, the price now comes from the deepest stable- or native-quoted pair that holds meaningful liquidity, fixing grossly wrong prices on newly listed tokens.

v1.6.0 — 2026-07-23

Fixed

  • When a trade, withdrawal, or bridge broadcast ends in an unknown state (for example a network drop mid-send), the bot no longer reports it as failed — it now tells you the transaction may still land, tracks it, and follows up once the outcome is confirmed on-chain. This covers limit orders, copy trades, call-channel buys, withdrawals, Move Everything, bridges, and stablecoin swaps on every chain.
  • Orders recovered from an unknown broadcast now record the real on-chain amounts instead of a zero-amount placeholder, keeping positions and P&L accurate.
  • Stablecoin swap failure messages now show the actual failure reason instead of a generic "try again", and a swap that simply hasn't confirmed yet is no longer mislabeled as "reverted".
  • Solana withdrawals now show a "broadcast — confirming on-chain" status instead of an unqualified "sent" message, since Solana withdrawals aren't polled for confirmation the way EVM withdrawals are. Check the explorer link to verify it landed.

v1.5.0 — 2026-07-22

Fixed

  • On Solana, the platform fee is now charged only after your swap actually confirms — a swap that fails or expires is no longer billed. This applies to copy-trade buys and sells and call-channel buys (manual trades already worked this way).
  • Copy-trade sell fees are now calculated from the actual settled proceeds of the sale instead of the pre-trade estimate.

v1.4.0 — 2026-07-22

Fixed

  • Tokens whose main liquidity pool is a Uniswap V4 pool quoted in another token (e.g. tokenized-stock pairs like AI/nvda on Robinhood Chain) now price on-chain instead of falling back to the DexScreener price. Pool discovery also handles pairs that list the token on the quote side.

v1.3.0 — 2026-07-20

Fixed

  • Call-channel buys now work when a call links the token through a DexScreener chart URL. A DexScreener link points at a trading-pair address, not the token itself, so the bot previously tried to buy the pair address and failed with a "no routes" error. It now resolves the link to the real token and buys that — on both Solana and EVM chains. A message that includes both the chart link and the plain token address still results in a single buy.

v1.2.0 — 2026-07-19

Added

  • Bridge transfers to a custom destination address now ask for your PIN first (when you have one set) — same protection withdrawals already had. Preset destinations (your own wallets, your perps account) are unaffected.

Changed

  • /setpin now only works in a private chat, never in a group.

Fixed

  • Perps transfer confirmations no longer report a false success when a balance read fails mid-transfer, and typed custom HYPE amounts now account for the gas reserve (previously they could fail on-chain after passing the bot's checks).
  • Exported private-key messages are now auto-deleted even if the bot restarts within the 15-second delete window.

v1.1.0 — 2026-07-19

Changed

  • Robinhood: tokens transferred into your wallet no longer auto-appear in /positions. The automatic discovery (via the Blockscout API) added several seconds to every multi-chain /positions load, so it was removed. /positions shows tokens you've traded through the bot again — to track a transferred-in token, add it manually via ➕ Add Token. Adding a token on Robinhood also no longer runs a pre-add tradability check, matching the other EVM chains.

Performance

  • A cold /positions load can no longer be stalled ~30 seconds by a slow token-metadata provider — the render-time metadata fetch now uses the same short single-attempt budget as the price fetch.

v1.0.0 — 2026-07-18

Changed

  • New Price Impact Guard blocks trades that would execute far below the screen price. Before every EVM trade, the bot now compares the firm quote's effective execution price (price impact plus pool fee) against a fresh on-chain reference and blocks the trade when the gap exceeds your limit. This can stop a trade that previously would have gone through. New controls live in /settings → 🔐 Security: 🛡️ Price Impact Guard (on by default; turning it off takes two taps) and 📉 Max Impact (10% by default). The 10% ceiling is set to catch genuinely broken pricing while leaving routine 2–8% thin-pool memecoin buys alone. This is separate from Slippage, which still bounds quote-vs-fill drift and is unchanged. Behavior on a block: manual swaps stop with "Price impact too high"; limit orders and stop-losses are not cancelled — they stay active, keep retrying, and send a one-time "still trying to fill" notice; copy trades and call-channel buys are skipped with a notification. Applies to Base, BSC, Ethereum, Hyperliquid, and Robinhood — not Solana. Note that sells are covered too, so a stop-loss or copy-trade sell on a crashing, illiquid token can be blocked while the price keeps falling; you are always notified, and can still exit manually from /positions or raise Max Impact.
  • Perps Quick Long/Short buttons are always visible. The /perps hub's quick-fire row (keyed to your Quick Ticker setting, BTC by default) now renders whenever you open the hub, directly above Deposit/Withdraw. Before: it appeared only on an empty hub and disappeared as soon as any position was open, on the assumption that Add/Reduce/Close covered it — so opening a second position took extra taps.
  • Predict /history win-rate counts fee-eaten wins correctly. A resolved Predict position now counts as a win whenever its payout is at least its cost, so a position that resolved in your favor but was eaten by fees no longer shows as a loss. Before: wins were classified by the sign of realized PnL, so a barely-profitable outcome that netted negative after fees was miscounted against your win rate.
  • Predict hub "In positions" shows live market value. The hub's "In positions" figure now reflects the current market value of your open positions — the same number as the hero total up top — with a (+N unpriced) suffix when some positions can't be priced. Before: it summed cost basis, which could disagree with the hero value.
  • Bridges from Solana no longer fail to route when a platform fee is set. With a bridge fee configured, a Solana-origin bridge could return no available route at all. Fee parameters are now applied only to EVM-origin quotes, so Solana-origin bridges quote and route normally again; EVM-origin bridges still collect the fee.
  • Robinhood Chain (4663) promoted to a full 5th EVM trading chain. Robinhood previously only worked as a bridge destination (Arbitrum Orbit L2, native ETH, USDG (Paxos) instead of USDC since Robinhood has no canonical USDC/USDT). It now trades like Base/BSC/Ethereum/ Hyperliquid: swaps and limit orders execute via 0x Protocol (polling- first, no public WSS yet); limit orders can be paid in USDG as well as ETH; /bridge now sends FROM Robinhood too, not just to it; Swap Stables gets a USDG-aware picker (native ↔ USDG only — no USDT leg, no stable-to-stable swap); /trending, wallet create/import/export, /history, and every balances/positions/wallet-list UI surface now include Robinhood. Explorer links use Blockscout. Copy trading and call channels stay deferred to a follow-up (#509).
  • Jupiter Predict sports events show market-type tabs. Event cards for Polymarket sports events now expose special-markets tabs (moneyline, spreads, totals, and more) instead of just the headline market, so you can pick the exact bet you want directly from /predict.
  • GX/Saba special markets ship gated off. Support for Jupiter's GX/Saba special markets lands behind a new JUPITER_PREDICT_GX_ENABLED setting, default false — it stays off until an orderability probe confirms order builds are signable. Polymarket special markets are unaffected and ship enabled.
  • Predict buy card shows partial fills and jupUSD refunds. When a Predict order fills for less than the deposit, the pending-open row now reads ≈$X filled (≈$Y back as jupUSD) confirming… instead of just the full deposit. The 0.1% open-fee is now charged on the estimated filled amount (orderCostUsd − estimatedTotalFeeUsd from the build response, clamped to never exceed the fee-on-deposit; falls back to the deposit when the estimate is absent) rather than on the whole deposit — so a partially-filled order is never over-charged.
  • One-tap jupUSD → USDC convert on the Predict hub. /predict now shows your jupUSD balance as a sub-row and a 💱 Convert jupUSD → USDC button (both hidden below $0.01) that jumps straight into the Swap-Stables amount step — jupUSD change left over from partial fills no longer has to be converted by hand.
  • Solana stable swaps honor your Stablecoin Slippage setting. Bug fix: Swap-Stables on Solana (USDC↔USDT and stable↔SOL) ignored the Stablecoin Slippage setting and used the general Solana slippage default (100 bps) instead of the stablecoin default (25 bps) — running at 4× the intended tolerance. It now passes the stablecoin slippage through, matching the EVM side.
  • Low-SOL swaps explain themselves instead of failing blank. When a Solana swap can't be built because the wallet lacks enough SOL to fund the destination token account's rent (e.g. swapping USDC straight into a new token with only cents of SOL left), the bot now surfaces the real reason — Insufficient SOL — fund the wallet with a bit more SOL. — rather than the generic Swap failed — no response from Jupiter. The build-time compute-unit simulation threads its rejection string up; a funds/rent error aborts before broadcast with the catalog message, while other (non-funds) simulator quirks fall back to a default compute-unit limit and broadcast anyway.
  • Take-Profit orders now work on Hyperliquid. Copy-trade and call-channel buys on Hyperliquid can create automatic take-profit sell orders, same as Base/Ethereum/BSC. Before: TP orders were silently skipped on Hyperliquid because the allow-list omitted it.
  • $5 hard minimum on all bridges. Bridges now enforce a $5 USD floor at confirm time — a sub-$5 bridge is blocked before any quote is fetched with Minimum bridge size is $5. (the destination-chain screen still shows the soft advisory below $5). When the amount can't be priced in USD the gate fails open and LI.FI's own per-route minimum applies.
  • LI.FI bridge errors translate at submit. Failed bridge quotes and failed execution now route raw upstream messages through a 9-entry substring catalog (integrations/lifi_error_catalog.translate_lifi_error) before showing them to the user. Before: cryptic LI.FI strings like "No available routes" or "ChainNotSupportedError" leaked verbatim. Now: users see friendlier copy such as "No bridge route available for this pair." or "Cannot estimate gas fees — destination chain may be congested." Catalog has a 180-day staleness pin (tests/integrations/test_lifi_error_catalog_last_verified.py) so the date is re-verified against LI.FI's evolving message text. Wired at bot/handlers/bridge/submit.py:330 (stale-quote refresh) and :463 (post-execution terminal failure).
  • Jupiter Ultra V2 timeout shows actionable text. When Ultra V2 /swap/v2/execute times out, users now see ⚠️ Submission timed out — check /history before retrying. instead of the generic Beam execute-failure message. Backed by Jupiter's non-idempotency contract: a timed-out execute may have landed, retrying with the same signed tx blob would race the pre-confirmation window. The Trigger path catches timeouts the same way internally but has no ContextVar surface — Trigger users see the generic Trigger failure text (intentional asymmetry; Trigger orders are user-managed).
  • Limit orders that lose their insurance row pause instead of silently broadcasting. When a limit-order's pre-stage FailedSwap insert exhausts 3 OperationalError retries, the executor now pauses the order post-broadcast (before recording) and shows ⚠️ Order paused — could not stage recovery row. Tap ▶️ Resume to retry. Before: the broadcast tx had no reconciler insurance row, so a late-confirm would lose the Trade-row record. After: the user can decide to Resume once the on-chain status is known, and sweep_stranded_executing_orders (15-min TTL) is the cascade-failure escape hatch if the pause UPDATE itself fails.
  • Bot-tracked-only PnL for transferred-in tokens. When a token is surfaced via ➕ Add Token (or any path that produces a synthetic Trade row — direction="buy", amount_in=0, no tx_signature), PnL math now excludes that row from cost basis, Avg Entry, Buys count, and proceeds-cap calculations. Before the fix, a transferred-in token shown alongside one real buy would render Avg Entry weighted against the transferred-in balance (e.g. TIBBIR bug-report: $0.01719 instead of the real ~$0.13) and PnL would display the on-paper move of the *whole* balance (+200,728% instead of the user's actual ~$0 outcome on the tiny real position). New behavior:
  • Synthetic-only positions render Avg Entry: N/A and zero PnL — no inflated stats until the first real buy.
  • Once a real buy lands, Avg Entry, Buys count, and PnL reflect only bot-executed buys; transferred-in balance is still visible in the Balance line and contributes to the hold-time chip (⏱️ Xd / Xw) so users still see "when the bot first saw the token".
  • "Sell 100%" still drains the full on-chain balance (including transferred-in tokens); only the *derived statistics* changed, not the sell mechanics.
  • The walk-loop that decides when a position has closed (_closed_trade_pnl and _current_position_trades in bot/handlers/trading/_helpers/pnl.py) now also skips synthetic rows so a large transferred-in balance can't inflate peak_tokens and suppress the closed-trade summary on a real-position-closing sell.
  • BSC limit-order failure-message label: BNB → BSC. Limit-order failure notifications on BSC now read "BSC limit buy failed: ..." instead of "BNB limit buy failed: ...". Intentional unification with the rest of the user-facing chain label set (copy-trade already used "BSC"). Token-symbol text ("BNB") is unchanged — only the chain name in failure stems flipped. Part of the cross-chain dedup refactor (v9 plan 3) that introduced the EvmChainDisplay frozen dataclass as the single source of per-chain UX labels.
  • Liveness hardening for WSS, scheduler ticks, and swap-path errors (v7 Plan 3). Five fault classes were tightened in this release:
  • WSS message-flow staleness restarts. Each WSS subscriber (Base NewHeads, Ethereum NewHeads, Base / BSC / Ethereum / Solana wallet monitors, Coinbase native price feed) now stamps _last_event_at on every received message and exposes is_stale(now, max_silence_s). The 2-minute scheduler health-tick checks each subscriber and restarts any whose feed has gone silent past its threshold (30s for EVM, 60s for Solana / native prices). The newheads stale-restart skips chains with no active orders, mirroring the existing watchdog so an idle chain doesn't cycle through spurious WSS reconnects.
  • APScheduler tick top-level timeout. Eight scheduler tick callables (4 limit-order ticks, check_trigger_orders, the inflight- buys / progress-refs sweepers, reconcile_failed_swaps) now wrap their body in _with_top_level_guard(fn, *, name, timeout_s) which combines asyncio.wait_for(...) with an outer try/except. Without this guard, a wedged HTTP call could wedge the scheduler job indefinitely AND any raised exception would disappear as a silent APScheduler misfire.
  • Narrow exception classification on the swap path. Five regions now distinguish construction bugs (ValueError / KeyError / AttributeError / TypeError → re-raise) from transient errors (httpx.HTTPError / ConnectionError / TimeoutError → return None): EVM swap_base.get_price (new PriceFetchError exception for transient errors), EVM tx_helpers (with boundary wrappers in client_base.py to preserve the str | None contract for transfer / withdraw callers), Solana client/tx's close_empty_accounts_tx and burn_and_close_account_tx, Solana jupiter_build's simulate_build_cu and assemble_transaction. Solana jito.relay_via_jito keeps its return-None-on-retry-exhaust semantic (private-mempool relay, no tip — distinct from a bundle relay) and now carries a documenting comment explaining that intent.
  • Solana RPC retries. Five critical paths now retry on transient HTTP errors via retry_async + _is_http_retryable: simulate_transaction, simulate_for_cu_limit, get_sol_balance (3 attempts with jitter), get_recent_prioritization_fees, get_latest_blockhash. Three max_attempts=2 sites in client/token.py were bumped to 3.
  • DexScreener 429 cooldown. Both integrations/dexscreener.py and chains/native_prices.py now parse Retry-After on a 429, set a module-level monotonic-timestamp gate, and short-circuit subsequent calls until the cooldown expires. Prevents 429 storms from burning through the rate limit.
  • EVM newheads retry budget. _WSS_MAX_RETRIES raised from 3 to 5 (delays 2 / 4 / 8 / 16 / 30 ≈ 60s total) so a transient WSS outage at the upstream provider doesn't immediately fall back to polling.
  • _is_blockhash_valid is now tri-state (bool | None). True = valid, False = expired (terminal), None = RPC error or empty blockhash. Callers in confirm_transaction's polling now check valid is False so an RPC unknown falls through to TIMEOUT instead of being mis-classified as EXPIRED — a potentially-valid tx is no longer lost when the RPC briefly fails.
  • Notifications are now at-least-once with row-claim dedup. Previously the background workers (limit-order dispatcher, copy-trade executors, failed_swaps reconciler) could occasionally double-send a fill / "earlier swap recorded" / "we're tracking it" message under concurrent ticks or on retry. They now route through notify_once, gated by per-row idempotency timestamps (Order.fill_notified_at, Trade.notified_at, FailedSwap.notified_at) added in migration 51a734f6b1e7. The conditional UPDATE acts as the dedup boundary — exactly one tick wins. The winning tick runs the Telegram send; on truthy return the claim is committed, on raise OR on None/False the claim is rolled back so the next reconciler/scheduler tick can re-drive the same row. Note: callsites without a downstream retry driver (failed-swap-late-confirm) still fire once and lose the message on Telegram outage — same failure mode as before, just expressed via rollback instead of commit-then-lose. See docs/DECISIONS.md → "At-Least-Once Notifications" for details.
  • Settings handlers no longer clobber concurrent writes. Settings toggles that previously did set_settings(full_dict) + commit (last-writer-wins) now use update_user_settings_atomic per key (SQL json_set / json_remove). Two handlers writing different keys in the same window will both persist.
  • State-management hardening (v7). Thirteen findings (4 HIGH, 9 MEDIUM) from a concurrency / shared-state audit:
  • TP/SL creation is now an additive upsert. Multiple "buy at $X then take-profit at $Y" actions on the same token now collapse into a single sell order with a summed amount instead of N duplicate active rows. Backed by a partial unique index uq_order_active_user_wallet_token_kind_trigger on (user_id, wallet_id, token_in, order_type, trigger_price) where status='active' AND side='sell'. Trailing SLs (trigger_price IS NULL) bypass the upsert. BUY-side limit DCA semantics are preserved (the predicate is side='sell').
  • Limit-order edit-while-executing race fix. A user editing a limit order at the moment a tick has just claimed it could create a duplicate active row alongside the in-flight execution. The edit handler now captures cancel_order's return value and surfaces an "Order is currently executing" message instead.
  • Auto-cancel-confirm now re-fetches native balance. When the user confirms cancelling sell orders to free balance for a buy / withdraw, the handler re-checks current + freed >= required against fresh native balance and aborts cleanly if a concurrent buy drained the wallet between prompt and confirm.
  • EvmWalletMonitor lifecycle lock. start / stop / watch_wallet / unwatch_wallet / restart_dead_tasks are now serialized under _lifecycle_lock with cancel-outside-the-lock on stop, mirroring EvmNewHeadsSubscriber. Prevents orphaned monitor tasks if a stop races a concurrent watch / restart.
  • Solana monitor (sig, wallet) ring-buffer dedup. A single transaction touching two tracked wallets now dispatches per (sig, wallet) instead of being silently swallowed by sig-only dedup. Ring buffer is deque(maxlen=4096) + set with mirror- discard before deque append. All three dispatch paths (Helius transactionSubscribe, standard logsSubscribe, HTTP polling fallback) migrated.
  • Per-row atomic UPDATE for single-column writes. User username / first-name sync, PIN-attempt reset, admin setfee_command, and 9 call-channel TP/SL setters now use update(...).where(...).values(...) instead of ORM-mutate-and-commit. Defensive alignment so a future full-row commit can't clobber a concurrent update_user_settings_atomic (or similar atomic write).
  • Wallet-switch invalidates BOTH old and new balance caches. Previously only the newly-active pubkey was invalidated, so /positions could show wallet A's stale balance under wallet B's pubkey for ~30-60s.
  • Native-price 90s staleness gate. ETH / SOL / BNB getters now serve the cached Coinbase WS price ONLY if its timestamp is within 90s; otherwise they fall through to the existing DexScreener fallback. A wedged WS feed can no longer serve frozen prices for up to 60s.
  • notify_once drops on persistent DB error. Previously a persistent SQLAlchemy error during the conditional UPDATE fell through to await send_fn(...), risking a duplicate Telegram message. The fallthrough is removed; persistent DB errors now log a warning and return False (re-driveable by a later reconciler tick). Re-sending duplicates is worse UX than dropping.
  • EVM custom-amount sell — clamp inside lock. "Sell N tokens" now passes the absolute amount through to the swap pipeline; the clamp min(N, on-chain balance) and the display percentage recompute happen inside wallet_lock against the freshly-read balance instead of off a stale UI snapshot.
  • Burn batch under wallet_lock. _execute_batch_burn's body (re-fetch + build + broadcast + confirm) is now wrapped in wallet_lock(user_id, "solana"). The re-fetch of burnable token accounts is INSIDE the lock so it can't be invalidated by a concurrent buy mid-batch.

Fixed

  • Hyperliquid-perps bridge deposits now use the correct USDC decimals. LI.FI returns two USDC tokens for Hyperliquid-perps (chainId 1337); the bot now deterministically selects the 6-decimal perps-deposit USDC regardless of response iteration order, so deposit amounts resolve with the right scale.
  • Copy-trade timeout pending text ("⏳ submitted but slow") will no longer fire twice on the same on-chain tx. Migration d2e8b1c3a701 adds the (chain, tx_hash) unique constraint on failed_swaps so the duplicate-insert IntegrityError gate (Solana E-M2 + EVM dual-chain D-F2) actually fires.
  • The reconciler's "earlier swap has been recorded" message is now routed through notify_once. Previously the IntegrityError branch fell through to bot.send_message, allowing two parallel ticks to each notify (B-F2).

Performance

  • wallet_lock for limit-order execution no longer covers the user-facing fill notification (notify_once UPDATE + Telegram editMessageText, which can take seconds under rate-limit). The notification is now deferred to run after the lock releases (D-F3).
  • wallet_lock for trigger-order fee/recording no longer covers the Jupiter Token API + DexScreener fallback HTTP call. The token-info lookup runs before lock acquisition (D-F4).

v0.1.0 — 2026-07-17

Added

  • Initial public release notes page.

Privacy Policy · Terms of Service · Home · Docs

Viper VIPER SOL·BASE·BSC·ETH·HYPE·HOOD

Trade Faster. Strike Smarter.

Features Docs Releases Privacy Terms Telegram Support

Trading cryptocurrencies involves significant risk. Viper is a tool — not financial advice.

© 2026 Viper