diff --git a/apitest/scripts/rolling-offer-simulation.sh b/apitest/scripts/rolling-offer-simulation.sh new file mode 100755 index 0000000000..541f645b59 --- /dev/null +++ b/apitest/scripts/rolling-offer-simulation.sh @@ -0,0 +1,125 @@ +#! /bin/bash + +# Demonstrates a way to always keep one offer in the market, using the API CLI with a local regtest bitcoin node. +# Alice creates an offer, waits for Bob to take it, and completes the trade protocol with him. Then Alice +# creates a new offer... +# +# Stop the script by entering ^C. +# +# A country code argument is used to create a country based face to face payment account for the simulated offer. +# +# Prerequisites: +# +# - Linux or OSX with bash, Java 10, or Java 11-12 (JDK language compatibility 10), and bitcoin-core (v0.19, v0.20). +# +# - Bisq must be fully built with apitest dao setup files installed. +# Build command: `./gradlew clean build :apitest:installDaoSetup` +# +# - All supporting nodes must be run locally, in dev/dao/regtest mode: +# bitcoind, seednode, arbdaemon, alicedaemon, bobdaemon +# +# These should be run using the apitest harness. From the root project dir, run: +# `$ ./bisq-apitest --apiPassword=xyz --supportingApps=bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon --shutdownAfterTests=false` +# +# - Only regtest btc can be bought or sold with the test payment account. +# +# Usage: +# +# This script must be run from the root of the project, e.g.: +# +# `$ apitest/scripts/rolling-offer-simulation.sh -d buy -c us -m 2.00 -a 0.125` +# +# Script options: -d -c (-m || -f ) -a +# +# Example: +# +# Create a buy/usd offer to sell 0.1 btc at 2% above market price, using a US face to face payment account: +# +# `$ apitest/scripts/rolling-offer-simulation.sh -d sell -c us -m 2.00 -a 0.1` + + +APP_BASE_NAME=$(basename "$0") +APP_HOME=$(pwd -P) +APITEST_SCRIPTS_HOME="$APP_HOME/apitest/scripts" + +source "$APITEST_SCRIPTS_HOME/trade-simulation-env.sh" +source "$APITEST_SCRIPTS_HOME/trade-simulation-utils.sh" + +checksetup +parseopts "$@" + +printdate "Started $APP_BASE_NAME with parameters:" +printscriptparams +printbreak + +registerdisputeagents + +showcreatepaymentacctsteps "Alice" "$ALICE_PORT" + +CMD="$CLI_BASE --port=$ALICE_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM" +printdate "ALICE CLI: $CMD" +CMD_OUTPUT=$(createpaymentacct "$CMD") +echo "$CMD_OUTPUT" +printbreak +export ALICE_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT") +export CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT") +printdate "Alice's F2F payment-account-id: $ALICE_ACCT_ID, currency-code: $CURRENCY_CODE" +exitoncommandalert $? +printbreak + +printdate "Bob creates his F2F payment account." +CMD="$CLI_BASE --port=$BOB_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM" +printdate "BOB CLI: $CMD" +CMD_OUTPUT=$(createpaymentacct "$CMD") +echo "$CMD_OUTPUT" +printbreak +export BOB_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT") +export CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT") +printdate "Bob's F2F payment-account-id: $BOB_ACCT_ID, currency-code: $CURRENCY_CODE" +exitoncommandalert $? +printbreak + +DONE=0 +while : ; do + if [ "$DONE" -ne 0 ]; then + break + fi + + printdate "ALICE $ALICE_ROLE: Creating $DIRECTION $CURRENCY_CODE offer with payment acct $ALICE_ACCT_ID." + CURRENT_PRICE=$(getcurrentprice "$ALICE_PORT" "$CURRENCY_CODE") + exitoncommandalert $? + printdate "Current Market Price: $CURRENT_PRICE" + CMD=$(gencreateoffercommand "$ALICE_PORT" "$ALICE_ACCT_ID") + printdate "ALICE CLI: $CMD" + OFFER_ID=$(createoffer "$CMD") + exitoncommandalert $? + printdate "ALICE $ALICE_ROLE: Created offer with id: $OFFER_ID." + printbreak + sleeptraced 3 + + # Show Alice's new offer. + printdate "ALICE $ALICE_ROLE: Looking at her new $DIRECTION $CURRENCY_CODE offer." + CMD="$CLI_BASE --port=$ALICE_PORT getmyoffer --offer-id=$OFFER_ID" + printdate "ALICE CLI: $CMD" + OFFER=$($CMD) + exitoncommandalert $? + echo "$OFFER" + printbreak + sleeptraced 5 + + # Generate some btc blocks. + printdate "Generating btc blocks after publishing Alice's offer." + genbtcblocks 3 5 + printbreak + sleeptraced 3 + + RANDOM_WAIT=$(echo $((1 + $RANDOM % 10))) + printdate "Bob will take Alice's offer in $RANDOM_WAIT seconds..." + sleeptraced "$RANDOM_WAIT" + + executetrade + exitoncommandalert $? + printbreak +done + +exit 0