Seller Bot
Objective
Check if there are any AFFECTION™ tokens to sell
Check if AFFECTION™ price is above pDAI/pUSDC by % difference
Sell AFFECTION™ and recheck the prices before selling again
Only broadcast when gas prices are below rapid gas fee limit
Send PLS to Buyer Bot
Instructions
Deposit 20k PLS for gas to sell tokens
Run it by typing into terminal:
python bot-seller.py
Stop the bot by pressing
CTRL + C
You can right click the PyCharm terminal to open a menu and select "Split Right". This will let you watch all 3 bots on one screen.
Python Code
from core import *
# set config variables
sell_percent_diff_pdai = 15
sell_percent_diff_pusdc = 25
sell_with_amount_affection = 500
slippage_percent = 5
wallet_min_pls = 20000
loop_delay = 3
loop_sell_delay = 10
rapid_gas_fee_limit = 650000
# load wallet C and set address for logging
set_logging(wallet_c_address, 'INFO')
account = load_wallet(wallet_c_address, os.getenv('SECRET'))
# load affection contract/info
affection_address = '0x24F0154C1dCe548AdF15da2098Fdd8B8A3B8151D'
affection_info = get_token_info(affection_address)
affection_contract = load_contract(affection_address)
affection_sample_result_last = None
# load wpls contract/info
wpls_address = '0xA1077a294dDE1B09bB078844df40758a5D0f9a27'
wpls_info = get_token_info(wpls_address)
wpls_contract = load_contract(wpls_address)
# load contract addresses
pdai_address = '0x6B175474E89094C44Da98b954EedeAC495271d0F'
pusdc_address = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
while True:
# log the wallet's pls balance
logging.info("PLS Balance: {:.15f}".format(get_pls_balance(account.address)))
# take samples of 1 pdai/pusdc/affection to wpls price
pdai_sample_result = sample_exchange_rate('PulseX_v2', pdai_address, wpls_address)
pusdc_sample_result = sample_exchange_rate('PulseX_v2', pusdc_address, wpls_address)
affection_sample_result = sample_exchange_rate('PulseX_v2', affection_address, wpls_address)
if not pdai_sample_result or not pusdc_sample_result or not affection_sample_result:
logging.warning("Failed to sample prices")
log_end_loop(loop_delay)
continue
# log the current rates
logging.info("pDAI Rate: 1 = {} PLS".format(pdai_sample_result / 10 ** 18))
logging.info("pUSDC Rate: 1 = {} PLS".format(pusdc_sample_result / 10 ** 18))
logging.info("AFFECTION™ Rate: 1 = {} PLS".format(affection_sample_result / 10 ** 18))
# log the balance
affection_balance = get_token_balance(affection_address, wallet_c_address)
logging.info("AFFECTION™ Balance: {:.15f}".format(affection_balance))
# check if wallet c has at least 1 token
if affection_balance > 1:
# get amounts of affection to sell
sells = math.floor(affection_balance / sell_with_amount_affection)
selling_amounts = [sell_with_amount_affection] * sells
selling_amounts.append(math.floor(affection_balance - sum(selling_amounts)))
# start selling affection in different amounts
logging.info("Selling {} AFFECTION™...".format(sum(selling_amounts)))
i = 0
while i < len(selling_amounts):
# check the current gas price
if get_beacon_gas_prices('rapid', beacon_gasnow_cache_seconds) > rapid_gas_fee_limit:
logging.warning("Gas fees are too high")
log_end_loop(loop_delay)
break
amount = selling_amounts[i]
# check if the pdai/pusdc price is cheaper than affection price
if (pdai_sample_result < affection_sample_result
or pusdc_sample_result < affection_sample_result):
pdai_percent_diff = ((pdai_sample_result - affection_sample_result) / affection_sample_result) * 100
pusdc_percent_diff = ((pusdc_sample_result - affection_sample_result) / affection_sample_result) * 100
# pdai/pusdc price must be cheaper and over the diff threshold
if (pdai_percent_diff < 0 and abs(pdai_percent_diff) >= sell_percent_diff_pdai) \
or (pusdc_percent_diff < 0 and abs(pusdc_percent_diff) >= sell_percent_diff_pusdc):
estimated_swap_result = estimate_swap_result(
'PulseX_v2',
affection_address,
wpls_address,
amount
)
if estimated_swap_result:
if swap_tokens(
account,
'PulseX_v2',
[affection_address, wpls_address],
estimated_swap_result,
slippage_percent,
wallet_a_address
):
logging.info("Swapped {} AFFECTION™ to PLS".format(amount))
i += 1
else:
logging.warning("No estimated swap result from RPC")
break
# delay if amounts remain in the list
if i < len(selling_amounts):
logging.info("Waiting for {} seconds...".format(loop_sell_delay))
time.sleep(loop_sell_delay)
# resample the prices
pdai_sample_result = sample_exchange_rate('PulseX_v2', pdai_address, wpls_address)
pusdc_sample_result = sample_exchange_rate('PulseX_v2', pusdc_address, wpls_address)
affection_sample_result = sample_exchange_rate('PulseX_v2', affection_address, wpls_address)
if not pdai_sample_result or not pusdc_sample_result or not affection_sample_result:
logging.warning("Failed to sample prices")
break
else:
logging.info("AFFECTION™ price is not within targeted range for selling")
break
else:
logging.info("AFFECTION™ price is too low")
break
# wait before next loop
log_end_loop(loop_delay)
Source
Last updated