Changelog
NotArb Changelogs
Last updated
NotArb Changelogs
Last updated
We'll break these update notes into several parts:
New Setup Configurations
New Mint Configurations
Default Strategy Fields
Jito Example Configuration
Spam Example Configuration
Extra Features & Notes
You'll notice some of these configurations changed from rpc
to rpc_url
as we will now only be defining "rpc" configurations for spam sending. It's also important to note the following configurations have been removed:
[[static_mints]]
[dynamic_mints]
As mentioned above, [[static_mints]]
and [dynamic_mints]
have been removed. The two remaining mint configurations are:
You can now optionally pass %TIMESTAMP%
in your url
field to add a milliseconds timestamp to your url for caching purposes, for example:
url="https://notarb.org/mints?t=%TIMESTAMP%"
Mint Tags You can now tag mints like so:
Multiple tags are allowed, use commas as separators. Mint tags can be used as part of strategies to either accept specific mints or skip them, here's an include example: mint_include_tags=[ ["perps"] ]
Notice this is an array of tag groups, where in order for the mint to be accepted it has to match at least one group. In this example "perps" is its own group. If any mints have tag "perps" it'll be accepted by the strategy. However, if you were to do: mint_include_tags=[ ["perps", "something"] ]
The strategy would only accept mints that have both tags "perps" and "something" Now, onto a multiple group example: mint_include_tags=[ ["perps", "something"], ["meme"] ]
A mint will be accepted by the strategy if any of the groups match, so the mint will either have to have both tags "perps" and "something" OR just have "meme" Remember, only one group needs to match! Now, that brings us to skipping mints per strategy: mint_exclude_tags=[ ["someTag"] ]
The same logic applies, only one tag group must match for a mint to be skipped by the strategy.
The following fields can be set per all strategies:
mint_include_tags
string[][]
mint_exclude_tags
string[][]
entry_quote_error_print
bool
exit_quote_error_print
bool
same_pool_error_print
bool
kamino_borrow_amount
num
max_lookup_tables
num
(default 4)min_spend
num
max_spend
num
min_priority_fee_lamports
num
max_priority_fee_lamports
num
min_swap_routes
num
max_swap_routes
num
cu_limit
num
(if not set, automatically set for jito only)cooldown_ms
num
OR cooldownstring
(ex: "1ms")
entry_only_direct_routes OR entry_direct
bool
entry_legacy
bool
entry_restrict_intermediate_tokens
bool
entry_max_accounts
num
entry_include_dexes
string[]
entry_exclude_dexes
string[]
exit_only_direct_routes OR exit_direct
bool
exit_legacy
bool
exit_restrict_intermediate_tokens
bool
exit_max_accounts
num
exit_include_dexes
string[]
exit_exclude_dexes
string[]
min_gain_bps
num
min_gain_percent
num
min_gain_lamports
num
(yes, this works with any base)min_gain_sol
num
At the moment, only static proxy tip transactions are supported. Because of this, you must keep in mind your min gain should be able to cover the following:
5000 lamports network fee for swap tx.
5000 lamports network fee for tip tx.
At minimum 1000 lamports for tip.
Priority fee, if set.
Min gains are purely gains between the Jupiter exit and entry quotes. They do not factor in fees for you. Nor should they be looked at as what you'll net. They're simply an estimation of what you'll gross before network fees. The following fields can be set per Jito strategies:
static_tip_percent
num
static_tip_lamports
num
static_tip_sol
num
The following fields can be set per Spam strategies:
max_opportunity_age_ms
num
OR max_opportunity_agestring
(ex: "100ms")spam_senders
array
Extra Features & Notes
All swaps will now be done on our own swap program instead of Jupiter's.
As seen above, a new strategy field
kamino_borrow_amount
is now available for Kamino flash loans.A new plugin system has been implemented, but still in the works.
Additional encryption has been added to protected keypairs. (Reminder: this encryption will simply buy you time if your server is compromised.)
In order to run the new jar, the following vm arg must be added: "--add-exports=java.base/jdk.internal.util=ALL-UNNAMED"
You can either add this to vm_args
inside of the run-bot.sh file, or to the notarb_java.sh file after --enable-preview. If you run multiple bots on the same server and you're trading anything other than WSOL, you'll want to add the following configuration and either use a bind ip or proxy.
Edit: The optional [wsol_unwrapper]
configuration slightly changed, here's an example:
Edit: The following mints support Kamino flash loans:
SOL, USDC, USDT, USDS, PYUSD, JLP, JUPSOL
Several changes to increase overall performance and speed.
Jupiter configurations should now set
DISABLE_SWAP_CACHE_LOADING="true"
as NotArb will be responsible for providing important swap data.Because NotArb no longer uses Jupiter to build transactions, the bot now requires a field called
blockhash_rpc_url="http://rpc.url:1234"
inside of[bot_misc]
- this field is temporary and will most likely be moved.A new Strategy field
max_lookup_tables
has been added, and for testing purposes currently defaults to 10.
About Lookup Tables
Lookup tables allow transactions to include more accounts while bringing the size of the transaction down. Smaller transaction sizes can technically send over the network faster, but you have to keep in mind the time it takes for the validator processing the transaction to lookup said table on chain. With that being said, the maximum number of lookup tables to include per strategy will be something you have to feel out and decide what you prefer.
What Does Not Work
Simulation mode has not yet been converted.
"Unique" spam transactions have not yet been converted.
"Unique" jito transactions when sending the same transaction to multiple zones has not yet been converted.
What's New
Unbound static jito tip transactions are now smarter than ever and will cover the amount required to open a proxy wallet account, returning said amount at the end of the transaction
Added the TRUMP (6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN) token as a base token
Added support for unbound grpc static tips. (Unbound depends on multiple IPs. Static txs will only send if the static tip can cover the cost of the proxy wallet rent...)
Updated outdated libs
Added several new base tokens, thanks to @Spif. A full list can be found here: https://github.com/NotArb/Jupiter/blob/main/BASE_TOKENS.txt
Introduced a new strategy field: skip_user_accounts_rpc_calls. Set this to true only if you are absolutely certain all trades will involve tokens with pre-opened accounts. Alternatively, use the new [account_tokens_fetcher] feature to let the bot smartly skip unnecessary RPC calls.
Updated GitHub docs.
One of my commits from last night was overwritten before this update that causes the [token_accounts_fetcher] to not work... fixed in .89
Added a new optional
[token_accounts_fetcher]
feature, more on this below.Fixed an issue that would cause extra data to be added to JSON encoded strings.
Other miscellaneous under the hood changes.
The token accounts fetcher is a new optional feature that can be used to help speed up Jupiter /swap requests. How does it work?
When the token accounts fetcher is enabled, a background task will run every 5 seconds monitoring your open token accounts. The bot will then be able to determine if RPC calls can be skipped when making /swap requests to Jupiter. In the case that they can, swap time is significantly improved.
How to enable it:
Keep in mind this feature is optional and will not stop token accounts from being opened.
Changed default Jito Bundle encoding to Base64
Jupiter price fetches will now skip responses marked as "low" confidence.
The [url_mints] fetches will no longer append ?notArbMs to the url. (We will attempt to bypass cache on our end, you should ensure your webhost does the same for your url)
Fixed some mislabled bot output & config docs.
[bot_misc] You can now optionally set jito_threads=-1 and/or spam_threads=-1 to use dynamic thread pooling. (This will not work with swap_threads!) [bot_misc]
Added a new optional debug field debug_executors=true which will print executor information every 10 seconds. (Only use for debugging, this will slightly slow down cycles)
Warning: Versions below v0.1.85 will be discontinued in the near future. Two new [bot_misc]
fields have been added:
acknowledge_terms_of_service
acknowledge_external_price_risk
I don't want this to scare anyone, but from a legal standpoint I have to lookout for myself. With that being said, this new mandatory configuration field must be set to true to use NotArb.
What you'll see when the bot doesn't have this set to true:
acknowledge_external_price_risk
Similar to above, this field is required to arb with non-wsol bases.
What you'll see when the bot doesn't have this set to true:
v0.1.85 Notes
Added a secondary layer of price validation for non-wsol tokens.
Added a secondary layer of price validation for usd pegged tokens. (USDC, USDT, PYUSD, etc...)
The Jupiter Management server will now default to Jupiter v6.0.29 instead of the latest versions. The latest versions are only advised if you manually adjust new Jupiter thread envs.
v0.1.86 Notes
Transaction prints will now include the baseMint and targetMint
This update will require update configurations. Previous configs will not work.
Overhauled mint configuration for both the bot and Jupiter management server. More on this below.
You can now make multiple [[swap]] configs with the same mint
values. Why? This can help keep configs tidy!
Removed deprecated strategy field jito_tip_percent
which was replaced with jito_dynamic_tip_percent
Removed deprecated strategy field spam_cooldown
which was replaced with cooldown
All mint loading for both the bot and Jupiter management server have been changed, please change your configs accordingly.
Jupiter Example:
Static Mints Static mints are a fixed list of mints loaded straight from your configuration file that will never change except for on restarts. Bot Example:
Jupiter Example:
File Mints File mints are loaded from a local file either in json or raw text format. Bot Example:
Jupiter Example:
URL Mints URL mints are loaded from a web url which supports json or raw text format. Bot Example:
Jupiter Example:
The Jupiter Management Server config [dynamic_mint_filter] field
skip_no_volume
has been replaced withmin_daily_volume
andmax_daily_volume
- Volume is measured in USDC by Jupiter. To include any token even if there's no volume, setmin_daily_volume=-1
(The same changes apply to the bot config [jupiter_token_fetcher])Slightly optimized PublicKey hashing.
Jito HTTP UUIDs are now set differently. More on this below.
You can now optionally use two separate Jupiter servers, one for making quotes and one for making swaps. (More below)
Restructured NotArb release packaging and added several new tool scripts. (More below)
Repackaging & Tool Scripts NotArb's release packaging has been restructured to support newly added tool scripts:
protect-keypair.sh
wsol-unwrapper.sh
update-jar.sh
We'll be adding more useful tool scripts in the future like one for closing token accounts. Jito HTTP UUIDs Along with the package restructuring, the way Jito HTTP UUIDs are set have also been changed. Before, Jito HTTP UUIDs were set with a VM arg, which didn't make much sense. However, now they're set with program args as shown in the example run script below: This script is available in the latest download of NotArb
Jito UUIDs will no longer be assigned to [[jito]] configs by default. Please assign a UUID by putting either uuid="jito-uuid-example"
OR uuid="actual-uuid"
inside of your desired [[jito]] configs. If no uuid is set, HTTP requests will not be sent with UUIDs. Jupiter Servers You can now optionally use two separate Jupiter servers, here's an example:
This feature is for those who'd like to experiment with load balancing requests between two servers. This feature is optional, and you can continue to use the normal [jupiter] config.
v0.1.82 released with some quick (minor) fixes to how grpc is built, and to allow proxy jito senders to send alongside normal instead of either or.
Fixed an issue that caused an error "Missing ATA in map" to print.
Reworked some quote logic along with the "Missing ATA..." fix, the Jupiter 500 error should be resolved now too.
The strategy field
jito_min_dynamic_proxy_tip_lamports
introduced in the last version has been removed. Proxy wallet transactions will now require 0.01 SOL balance to use. You will fund the wallet with 0.01, process the transaction, and then receive your 0.01 back. This allows us to use proxy wallets for smaller profits.Jito static transactions will no longer send with proxy wallets. Proxy wallets must exclusively use dynamic tipping.
Please keep in mind, your first NotArb transaction on our new program account will open a PDA account which requires 0.001 SOL rent.
A new strategy field
jito_min_dynamic_proxy_tip_lamports
has been added for when using [[jito]] fieldproxy_wallet=true
(More info on this below)Optimized the proxy tip transaction building for [[jito]] field
proxy_wallet=true
Completely reworked how public keys are decoded/encoded by NotArb, increasing overall bot performance.
Made Jito static tip transactions send when [[jito]] field
proxy_wallet=true
(before only dynamic tips would send proxy wallet transactions)When strategy field
cooldown="0ms"
is set, cooldown logic will be skipped for that strategy to increase performance.
When using proxy_wallet=true
tips must be at least greater than or equal to 890,880 (minimum account rent) + 5000 (solana network fee) lamports. By default, NotArb will not send dynamic tip proxy transactions if the estimated tip is less than 895,880 lamports. However, you can adjust this value by using strategy field jito_min_dynamic_proxy_tip_lamports
, which defaults to 895,880. Adjusting this field lower may help transactions get through that could potentially slip up causing the acutal dynamic tip to be greater than what the bot initially sees. Similar to dynamic tip proxy transactions, static tip proxy transactions also require a minimum tip of 895,880 lamports. Although, since this tip is set staticially from the bot by jito_static_tip_lamports
or jito_static_tip_percent
the minimum tip cannot be adjusted.
Priority fees set using SOL values greater than or equal to 1 SOL are no longer allowed. If you would like to set a priority fee of 1 SOL or more, please set the fee by lamports instead, as this value is not capped. Places this change has been applied to:
Strategy fields
min_priority_fee_sol
andmax_priority_fee_sol
Wsol unwrapper field
priority_fee_sol
Grpc transactions will now have unique prints.
Quick update guys, the logic for protect_keypair=true
has been reworked to address an issue that caused the file to be loaded wrong. This update will require you to re-enter your keypair in whichever file you want to protect. The bot should throw an error on startup for older versions of the protected keypair file. To be more specific on what changed, we added another layer of encryption and added slightly more advanced machine detection. Keep in mind, protected keypairs are tied to the machine.
This update includes a critical improvement to the Jito queue system, so it’s highly recommended to update for that alone. Apologies for the tag, but this one felt important. The previous version will still function, though not quite as optimally. Take care!
Identified and resolved an issue causing Jito queues to process much slower than intended.
The Jupiter Management server will now do a sanity check on manually provided mint addresses to ensure they're proper on startup.
Added proper debugs for Jupiter Price API lookup fails.
Strategy min gains now factor in network fee + priority fee (if any)
Added several new Jito features, more on them below.
The following fields have been added to [[jito]]
configs:
http_enabled
- enables http sending (default true)
grpc_enabled
- enables grpc sending (default false)
UUID's do not apply to grpc sending.
priority_queue
- enables priority queuing by estimated opportunity profit (default true)
bind_ip
- binds outgoing connections to a system ip address (default none)
proxy_wallet
- tips with a "proxy" wallet (default false)
If you use proxy_wallet=true
you should keep in mind these wallets are temporary, used exclusively for tipping, and fully managed by the bot—including creation and minimum balance requirements—so you don’t need to handle these aspects yourself. Each arbitrage transaction must generate enough profit to cover around 890,880 lamports for account rent and an additional 5,000 lamports for network fees. As a result, these transactions will only occur for larger-profit trades, but there’s no need to adjust your minimum gains; the bot performs an exclusive check to meet these requirements.
Deprecated Strategy field
jito_tip_percent
and replaced it withjito_dynamic_tip_percent
andjito_static_tip_percent
, more info on how these work below.Added a new Stratey field
jito_unwrap_tip
and when set to true your Jito tip will come directly from your WSOL profit rather than your SOL balance. This makes transactions more complex and will technically be worse in comparison to not using it. However, it's good if you want Jito transactions to never tip directly from your SOL balance. This also allows much larger tips even if your balance can't cover it.Once again reworked how swap workers process to increase overall performance. One day I may be happy with how it performs...
Reworked the
[wsol_unwrapper]
code to be more effecient. It'll no longer require your whole WSOL balance to be unwrapped. For example, if you setunwrap_sol
to 1 andmin_sol
to 0.5, as soon as your balance goes below 0.5 the bot will attempt to unwrap exactly 1 Solana.Other under the hood performance improvements and optimizations.
Although the jito_tip_percent
field has been deprecated, it will still register as jito_dynamic_tip_percent
to replicate it's previous usage. The new field jito_static_tip_percent
will add a static tip to your Jito transaction before sending it to chain based off of the opporunity profit seen by the bot at the time of the quote. Although "static" Jito transactions should technically be faster, there's a greater chance they slip too far to ensure profit. Use static tipping cautiously. When using jito_static_tip_percent
, fields jito_static_tip_lamports
and jito_static_tip_sol
will be ignored. Both jito_static_tip_percent
and jito_dynamic_tip_percent
will respect jito_max_tip_lamports
and jito_max_tip_sol
The new field jito_unwrap_tip
will only work when your base mint is WSOL. This new feature is optional, but is useful at times where a large transaction may require a tip that your balance doesn't cover. For example, say you send a transaction that has 100 SOL profit and you have your tip percent set to 50. In order for this transaction to succeed, you need to have a SOL balance of 50 SOL normally, but if using jito_unwrap_tip
the tip will come straight from the profit.
Use Strong Passwords: Change default root/admin passwords and use strong, unique passwords.
Restrict SSH Access: Disable root login and limit access to specific IPs
Further optimized process speed for swap workers.
Reworked Jito queue logic to enhance process speed & to prioritize higher gain transactions.
Added new prints to Jito transaction messages such as the bundle explorer link & estimated gain in lamports.
Added an experimental option when setting jito_static_tip_lamports=-1
which will "static" tip 50% of the estimated gain. (This will be added as a feature in the future if it works well)
Fixed an issue from v0.1.68-alpha patch notes cooldowns causing txs to be skipped. For example, if you had dynamic + static tipping enabled, only dynamic would send in the same strategy. This is now fixed.
Quick update!, Updated the Jupiter Management Server to use the latest version of Jupiter: (v6.0.29)
Updated the default Jupiter version to 6.0.33:
Dynamic Mints Dynamic mint loading pulls from Jupiter's official Token List API and filters tokens with your desired settings. Bot Example:
Added several new base tokens, thanks to @spif. A full list can be found here:
Made several changes to the on-chain program which is now: (Other program accounts will continue to work until everyone is off of them)
Updated the Jupiter Management Server to the latest Jupiter version:
Updated the Jupiter Management Server to latest Jup Version 6.0.31:
Made proxy wallet transactions execute the tip on a separate program:
Updated the Jupiter Management Server to download the latest version of Jupiter, v6.0.30. Read more here:
Fully overhauled and optimized NotArb's on-chain program. We're back on FAM:
You can now enable protect_keypair=true
in the [bot_misc]
section to add an extra layer of security to your keypair file. Note: This will overwrite your existing keypair_path
file, and the new file will only be usable on the current machine. While this feature offers additional protection, it’s not a foolproof solution. It can, however, provide extra time and defense if your machine is ever compromised. Remember to keep your host(s) secure, here are some things you can do: