From 072dd22edc8b2dd634ec97e095799855cbfaf2be Mon Sep 17 00:00:00 2001 From: nahuhh <50635951+nahuhh@users.noreply.github.com> Date: Thu, 3 Oct 2024 01:52:59 +0000 Subject: [PATCH] add placeorder script --- bsx-placeorder | 25 ++ bsx/placeorders/placebid.json.template | 25 ++ bsx/placeorders/placeoffer.json.template | 27 ++ bsx/placeorders/placeorders.sh | 329 ++++++++++++++++++ .../placeorders_state.json.template | 6 + 5 files changed, 412 insertions(+) create mode 100755 bsx-placeorder create mode 100644 bsx/placeorders/placebid.json.template create mode 100644 bsx/placeorders/placeoffer.json.template create mode 100755 bsx/placeorders/placeorders.sh create mode 100644 bsx/placeorders/placeorders_state.json.template diff --git a/bsx-placeorder b/bsx-placeorder new file mode 100755 index 0000000..3464dc6 --- /dev/null +++ b/bsx-placeorder @@ -0,0 +1,25 @@ +#!/bin/bash +export SWAP_DATADIR=$HOME/coinswaps + +# Colors +red="echo -e -n \e[31;1m" +green="echo -e -n \e[32;1m" +nocolor="echo -e -n \e[0m" + +# Check if basicswap is running +if [[ -f $SWAP_DATADIR/particl/particl.pid ]]; then + bsx_pid=$(cat $SWAP_DATADIR/particl/particl.pid) + bsx_run=$(pidof particld | grep $bsx_pid) + if ! [[ $bsx_run ]]; then + $red"\nError: BasicSwapDEX must be running.\n"; $nocolor + exit + fi +else + $red"\nError: BasicSwapDEX must be running.\n"; $nocolor + exit +fi + +mv $HOME/.local/bin/bsx/placeorders/* $SWAP_DATADIR/basicswap/scripts/ +cd $SWAP_DATADIR/basicswap/scripts/ + +./placeorders.sh diff --git a/bsx/placeorders/placebid.json.template b/bsx/placeorders/placebid.json.template new file mode 100644 index 0000000..c33dcb0 --- /dev/null +++ b/bsx/placeorders/placebid.json.template @@ -0,0 +1,25 @@ +{ + "offers": [], + "bids": [ + { + "coin_from": "COIN_TO_BUY", + "coin_to": "COIN_TO_SELL", + "amount": AMOUNT, + "maxrate": RATE, + "address": "-1", + "min_swap_amount": MIN_SWAP, + "max_coin_from_balance": -1, + "min_coin_to_balance": 0, + "max_concurrent": MAXBIDS, + "name": "GUI Bid" + } + ], + "stealthex": [], + "min_seconds_between_offers": 5, + "max_seconds_between_offers": 5, + "min_seconds_between_bids": 10, + "max_seconds_between_bids": 10, + "num_enabled_offers": 0, + "num_enabled_bids": 1, + "num_enabled_swaps": 0 +} diff --git a/bsx/placeorders/placeoffer.json.template b/bsx/placeorders/placeoffer.json.template new file mode 100644 index 0000000..f5ed0f3 --- /dev/null +++ b/bsx/placeorders/placeoffer.json.template @@ -0,0 +1,27 @@ +{ + "offers": [ + { + "enabled": true, + "coin_from": "COIN_TO_SELL", + "coin_to": "COIN_TO_BUY", + "amount": AMOUNT, + "minrate": RATE, + "ratetweakpercent": PERCENT, + "amount_variable": true, + "address": "-1", + "name": "GUI Offer", + "min_coin_from_amt": AMOUNT, + "min_swap_amount": MIN_SWAP, + "offer_valid_seconds": 1200 + } + ], + "bids": [], + "stealthex": [], + "min_seconds_between_offers": 10, + "max_seconds_between_offers": 10, + "min_seconds_between_bids": 10, + "max_seconds_between_bids": 10, + "num_enabled_offers": 1, + "num_enabled_bids": 0, + "num_enabled_swaps": 0 +} diff --git a/bsx/placeorders/placeorders.sh b/bsx/placeorders/placeorders.sh new file mode 100755 index 0000000..ca78c3a --- /dev/null +++ b/bsx/placeorders/placeorders.sh @@ -0,0 +1,329 @@ +#!/bin/bash +############################ +########################### +#set -x +PORT=12700 # BasicSwapDex http port + +# config file location +taker=placebid.json +maker=placeoffer.json +state=placeorders_state.json + +# Defaults +ALLOW_SPLIT_ORDERS=true # Sane default TODO +MAXBIDS=10 # TODO +PERCENT=2.5 # Max slippage for "Market" order types + +# FUNC - dont touch +BUYORSELL="" +AMOUNT="" +TAKER_RATE="" +MAKER_RATE="" +OB_MIN="" +MIN_MAKER="" +MIN_TAKER="" +########################### +############################ + +# Colors +cy="echo -e -n \e[36;1m" +cy2="\e[36;1m" +red="echo -e -n \e[31;1m" +red2="\e[31;1m" +grn="echo -e -n \e[32;1m" +grn2="\e[32;1m" +nc="echo -e -n \e[0m" +nc2="\e[0m" + +# Choose Coins +coin_prompt_buy() { + THEIR_COIN=$COIN + theircoin=$coinsymbol + theircapital=$coinname +} +coin_prompt_sell() { + YOUR_COIN=$COIN + yourcoin=$coinsymbol + yourcapital=$coinname +} +coin() { + coin="" + echo -e "\n[1] Bitcoin\n[2] Monero\n[3] Litecoin\n[4] Firo\n[5] Dash\n[6] PIVX\n[7] Particl\n[8] Wownero\n" + until [[ $coin =~ ^[1-8]$ ]]; do + read -p 'Select an option: ' coin + case $coin in + 1) COIN="bitcoin" + coinname="Bitcoin" + coinsymbol="BTC" + ;; + 2) COIN="monero" + coinname="Monero" + coinsymbol="XMR" + ;; + 3) COIN="litecoin" + coinname="Litecoin" + coinsymbol="LTC" + ;; + 4) COIN="zcoin" + coinname="Firo" + coinsymbol="FIRO" + ;; + 5) COIN="dash" + coinname="Dash" + coinsymbol="DASH" + ;; + 6) COIN="pivx" + coinname="PIVX" + coinsymbol="PIVX" + ;; + 7) COIN="particl" + coinname="Particl" + coinsymbol="PART" + ;; + 8) COIN="wownero" + coinname="Wownero" + coinsymbol="WOW" + ;; + *) $red "\nYou must answer 1-8\n"; $nc + ;; + esac + done +} + +book_min() { + if [[ $coin = 1 ]]; then # BITCOIN + OB_MIN=0.0050 + MIN_SWAP=0.0010 + elif [[ $coin = 2 ]]; then # MONERO + OB_MIN=0.2000 + MIN_SWAP=0.0300 + elif [[ $coin = 3 ]]; then # LITECOIN + OB_MIN=0.4000 + MIN_SWAP=0.0600 + elif [[ $coin = 4 ]]; then # FIRO + OB_MIN=20.0000 + MIN_SWAP=8.0000 + elif [[ $coin = 5 ]]; then # DASH + OB_MIN=1.0000 + MIN_SWAP=0.2000 + elif [[ $coin = 6 ]]; then # PIVX + OB_MIN=50.0000 + MIN_SWAP=10.0000 + elif [[ $coin = 7 ]]; then # PARTICL + OB_MIN=50.0000 + MIN_SWAP=10.0000 + elif [[ $coin = 8 ]]; then # WOWNERO + OB_MIN=50.0000 + MIN_SWAP=10.0000 + fi +} + +set_fiat() { + echo -e "[1] USD [default]\n[2] EUR\n[3] CAD\n[4] AUD\n[5] CUSTOM" + read -p 'Select an option: ' fiat_select + case $fiat_select in + 1) FIAT=USD + fiat=usd + ;; + 2) FIAT=EUR + fiat=eur + ;; + 3) FIAT=CAD + fiat=cad + ;; + 4) FIAT=AUD + fiat=aud + ;; + 5) read -p 'Please enter the 3 character currency code [example: jpy] ' FIAT + fiat=$FIAT + ;; + *) FIAT=USD + fiat=usd + ;; + esac +} + +coin_price() { + echo -e "\nCurrent Market Rates are.." + YOUR_FIAT=$(curl -s "https://api.coingecko.com/api/v3/simple/price?ids=$THEIR_COIN,$YOUR_COIN&vs_currencies=$fiat" | jq -r ".$YOUR_COIN.$fiat") + THEIR_FIAT=$(curl -s "https://api.coingecko.com/api/v3/simple/price?ids=$THEIR_COIN,$YOUR_COIN&vs_currencies=$fiat" | jq -r ".$THEIR_COIN.$fiat") + TAKER_RATE=$(echo "scale=8;( $THEIR_FIAT / $YOUR_FIAT )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + MAKER_RATE=$(echo "scale=8;(1 / $TAKER_RATE /1)" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + $cy"$THEIR_FIAT $FIAT$nc2/$grn2$theircoin$nc2 which is $red2$TAKER_RATE $yourcoin$nc2/$grn2$theircoin$nc2\n" + $cy"$YOUR_FIAT $FIAT$nc2/$red2$yourcoin$nc2 which is $grn2$MAKER_RATE $theircoin$nc2/$red2$yourcoin$nc2\n"; +} + +buy_sell() { + echo -e "\n[1] BUY a specific amount of $grn2$theircapital$nc2\n[2] SELL a specific amount of your $red2$yourcapital$nc2\n" + until [[ $BUYORSELL =~ ^[12]$ ]]; do + read -p 'Select an option: ' BUYORSELL + case $BUYORSELL in + 1) read -p "How much $theircapital do you want to BUY? [example: 1] " AMOUNT + echo -e "\n4. Rate you will pay:" + echo -e "[1] LIMIT: Specific Crypto Rate $red2$yourcoin$nc2/$grn2$theircoin$nc2\n[2] LIMIT: $red2$TAKER_RATE $yourcoin$nc2/$grn2$theircoin $cy2+/- CUSTOM Percent$nc2\n[3] LIMIT: $red2$TAKER_RATE $yourcoin$nc2/$grn2$theircoin$nc2\n[4] MARKET +$PERCENT%: $red2$TAKER_RATE $yourcoin$nc2/$grn2$theircoin $cy2+ $PERCENT%$nc2\n[ENTER] LIMIT: Specific Fiat Rate $cy2$FIAT$nc2/$grn2$theircoin$nc2" + read -p 'Select an option: ' RATESEL + case $RATESEL in + 1) read -p $"At what rate would you like to Pay? [example: $TAKER_RATE] " RATE + PRICE=$(echo "scale=2;( $YOUR_FIAT * $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PERCENT=0 + ;; + 2) read -p 'Pay this much % above or below market [example: [0.5|-0.5] ' PERCENT + RATE=$(echo "scale=8;( $TAKER_RATE * ( $PERCENT / 100 + 1)/1)" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PRICE=$(echo "scale=2;( $YOUR_FIAT * $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + ;; + 3) RATE=$TAKER_RATE + PRICE=$THEIR_FIAT + PERCENT=0 + ;; + 4) RATE=$(echo "scale=9;( $TAKER_RATE * ( $PERCENT / 100 + 1)/1)" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PRICE=$(echo "scale=2;( $YOUR_FIAT * $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + ;; + *) read -p $"Enter specific price in $FIAT to PAY? [example: "$THEIR_FIAT"] " PRICE + RATE=$(echo "scale=8;( $PRICE / $YOUR_FIAT )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PERCENT=0 + ;; + esac + MAKER_RATE=$(echo "scale=8;( 1 / $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + echo -e "\nPaying: $red2 $PRICE$FIAT$nc2 which is $red2($RATE $yourcoin$nc2/$grn2$theircoin$nc2)" + echo -e "Rate to be paid: $grn2$MAKER_RATE $theircoin$nc2/$red2$yourcoin$nc2\n" + ;; + 2) read -p "How much YOUR $yourcapital do you want to SELL [example: 1] " AMOUNT + echo -e "\n4. Rate to charge:\n" + echo -e "[1] LIMIT: Specific Crypto Rate $grn2$theircoin$nc2/$red2$yourcoin$nc2\n[2] LIMIT: $grn2$MAKER_RATE $theircoin$nc2/$red2$yourcoin $cy2+/- CUSTOM Percent$nc2\n[3] LIMIT: $grn2$MAKER_RATE $theircoin$nc2/$red2$yourcoin$nc2\n[4] MARKET +$PERCENT%: $grn2$MAKER_RATE $theircoin$nc2/$red2$yourcoin $cy2+ $PERCENT%$nc2\n[ENTER] LIMIT: Specific rate $cy2$FIAT$nc2/$red2$yourcoin$nc2" + read -p 'Select an option: ' RATESEL + case $RATESEL in + 1) read -p $"Enter specific rate to Charge? [example: $MAKER_RATE] " RATE + PRICE=$(echo "scale=2;( $THEIR_FIAT * $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PERCENT=0 + ;; + 2) read -p 'Charge this much % above or below market [example: [0.5|-0.5] ' PERCENT + RATE=$(echo "scale=8;( $MAKER_RATE * ( $PERCENT / 100 + 1)/1)" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PRICE=$(echo "scale=2;( $THEIR_FIAT * $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + ;; + 3) RATE=$MAKER_RATE + PRICE=$(echo "scale=8;( $THEIR_FIAT * $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PERCENT=0 + ;; + 4) RATE=$(echo "scale=8;( $MAKER_RATE * ( $PERCENT / 100 + 1)/1)" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PRICE=$(echo "scale=8;( $THEIR_FIAT * $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + ;; + *) read -p $"Enter specific price in $FIAT to Charge? [example: "$YOUR_FIAT"] " PRICE + RATE=$(echo "scale=8;( $PRICE / $THEIR_FIAT )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + PERCENT=0 + ;; + esac + TAKER_RATE=$(echo "scale=8;(1 / $RATE )" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + echo -e "Selling at $PRICE$FIAT which is a rate of $grn2$RATE $theircoin$nc2/$red2$yourcoin$nc2" + ;; + *) $red "\nYou must answer 1 or 2\n"; $nc + ;; + esac + done +} + +# TODO // ENABLE SPLIT ORDERS +split_orders() { + if [ $ALLOW_SPLIT_ORDERS = true ]; then + MIN_SWAP=$(echo "scale=0;( $AMOUNT / $MAXBIDS )/1" | bc) + echo -e "$cy2#TODO$nc2 Splitting into multiple bids if necessary. $red2$MAXBIDS$nc2 tx at most" + else + MIN_SWAP=$AMOUNT + $red"One order only. Not Recommended";$nc + echo "$MIN_SWAP" + fi +} + +apply_config() { + # Convert amount + MIN_TAKER=$(echo "scale=8;( $MIN_SWAP * $MAKER_RATE )/1" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + sed -i -z "s/MIN_SWAP/$MIN_TAKER/" $taker + sed -i -z "s/MIN_SWAP/$MIN_SWAP/" $maker + sed -i -z "s/COIN_TO_SELL/$yourcapital/" $taker $maker + sed -i -z "s/COIN_TO_BUY/$theircapital/" $taker $maker + sed -i -z "s/PERCENT/$PERCENT/" $maker + sed -i -z "s/MAXBIDS/$MAXBIDS/" $taker + echo -e "\nMinumum amt per swap = $grn2$MIN_TAKER $theircoin$nc2" + echo -e " = $red2$MIN_SWAP $yourcoin$nc2\n" + if [[ $BUYORSELL = 1 ]]; then + MAKERAMOUNT=$(echo "scale=8;( $AMOUNT / $MAKER_RATE )/1" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + echo -e "Outgoing: $red2$MAKERAMOUNT $yourcoin$nc2" + echo -e "Incoming: $grn2~$AMOUNT $theircoin$nc2" + sed -i -z "s/AMOUNT/$MAKERAMOUNT/g" $maker + sed -i -z "s/RATE/$MAKER_RATE/" $maker + sed -i -z "s/RATE/$RATE/" $taker + sed -i -z "s/AMOUNT/$AMOUNT/g" $taker + else + TAKERAMOUNT=$(echo "scale=8;( $AMOUNT * $MAKER_RATE )/1" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./') + echo -e "Outgoing: $red2$AMOUNT $yourcoin$nc2" + echo -e "Incoming: $grn2~$TAKERAMOUNT $theircoin$nc2" + sed -i -z "s/AMOUNT/$TAKERAMOUNT/g" $taker + sed -i -z "s/RATE/$TAKER_RATE/" $taker + sed -i -z "s/RATE/$RATE/" $maker + sed -i -z "s/AMOUNT/$AMOUNT/g" $maker + fi +} + +revert_config() { + cp placeorders_state.json.template $state + cp placeoffer.json.template $maker + cp placebid.json.template $taker +} + +check_bids() { + # oneshot. Check for matching offers before posting one + apply_config + FOUNDBID=$(python createoffers.py --configfile $taker --statefile $state --port=$PORT --oneshot --debug | grep "New bid") + if [[ $FOUNDBID ]]; then + $grn"Placed bid successfully! Check BasicSwapDEX to confirm\n";$nc + elif [[ $AMOUNT < $OB_MIN && -z $FOUNDBID ]]; then + echo -e "Checking for a matching offer" + echo -e "No matching offers found $red2:@ !!!$nc2\nBid quantity too$red2 low$nc2 to post to order book.\nTrying again in 30 seconds" + sleep 2 + revert_config + sleep 30 + apply_config + $cy"Rechecking bids\n";$nc + recheck_bids + else + # Post as limit order on the book + $cy"No matching offers found. Posting to the orderbook\n";$nc + ORDERPLACED=$(python createoffers.py --configfile $maker --statefile $state --port=$PORT --oneshot | grep "New offer") + if [[ $ORDERPLACED ]]; then + revert_config + $grn"OFFER POSTED! Please check BasicSwapDEX to confirm\n";$nc + else + revert_config + $red"Placing Order failed. Try again$nc2\n" + fi + fi +} + +recheck_bids() { + check_bids + echo rechecking +} + +# 1. Choose coins + revert_config + set_fiat + + $grn"\n\nName of coin to buy";$nc + coin + coin_prompt_buy + + $red"\n\nName of coin to sell";$nc + coin + coin_prompt_sell + + echo -e "Buying: $grn2$theircapital$nc2" + echo -e "Selling: $red2$yourcapital$nc2" + +#2. Set rates +# Pull Market rate + coin_price + buy_sell + # split_orders + book_min + +#3. Attempt bid / Post offer + check_bids diff --git a/bsx/placeorders/placeorders_state.json.template b/bsx/placeorders/placeorders_state.json.template new file mode 100644 index 0000000..5118d1e --- /dev/null +++ b/bsx/placeorders/placeorders_state.json.template @@ -0,0 +1,6 @@ +{ + "offers": { + }, + "bids": { + } +}