diff --git a/apitest/scripts/trade-simulation-utils.sh b/apitest/scripts/trade-simulation-utils.sh index 2c7f93138ab..180e1894dfd 100755 --- a/apitest/scripts/trade-simulation-utils.sh +++ b/apitest/scripts/trade-simulation-utils.sh @@ -152,6 +152,51 @@ getpaymentaccounts() { echo "$CMD_OUTPUT" } +showcreatepaymentacctsteps() { + USER="$1" + PORT="$2" + printdate "$USER looks for the ID of the face to face payment account method (Bob will use same payment method)." + CMD="$CLI_BASE --port=$PORT getpaymentmethods" + printdate "$USER CLI: $CMD" + PAYMENT_ACCT_METHODS=$(getpaymentaccountmethods "$CMD") + echo "$PAYMENT_ACCT_METHODS" + printbreak + + printdate "$USER uses the F2F payment method id to create a face to face payment account in country $COUNTRY_CODE." + CMD="$CLI_BASE --port=$PORT getpaymentacctform --payment-method-id=F2F" + printdate "$USER CLI: $CMD" + getpaymentaccountform "$CMD" + printbreak + + printdate "$USER edits the $COUNTRY_CODE payment account form, and (optionally) renames it as $F2F_ACCT_FORM" + editpaymentaccountform "$COUNTRY_CODE" + cat "$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM" + + # Remove the autogenerated json template because we are going to use one created by a python script in the next step. + CMD="rm -v $APP_HOME/f2f_*.json" + DELETE_JSON_TEMPLATE=$($CMD) + printdate "$DELETE_JSON_TEMPLATE" + printbreak +} + +gencreateoffercommand() { + PORT="$1" + ACCT_ID="$2" + CMD="$CLI_BASE --port=$PORT createoffer" + CMD+=" --payment-account=$ACCT_ID" + CMD+=" --direction=$DIRECTION" + CMD+=" --currency-code=$CURRENCY_CODE" + CMD+=" --amount=$AMOUNT" + if [ -z "$MKT_PRICE_MARGIN" ]; then + CMD+=" --fixed-price=$FIXED_PRICE" + else + CMD+=" --market-price-margin=$MKT_PRICE_MARGIN" + fi + CMD+=" --security-deposit=15.0" + CMD+=" --fee-currency=BSQ" + echo "$CMD" +} + createoffer() { CREATE_OFFER_CMD="$1" OFFER_DESC=$($CREATE_OFFER_CMD) @@ -165,6 +210,124 @@ createoffer() { echo "$NEW_OFFER_ID" } +getfirstofferid() { + PORT="$1" + CMD="$CLI_BASE --port=$PORT getoffers --direction=$DIRECTION --currency-code=$CURRENCY_CODE" + CMD_OUTPUT=$($CMD) + commandalert $? "Could not get current $DIRECTION / $CURRENCY_CODE offers." + FIRST_OFFER_DETAIL=$(echo -e "$CMD_OUTPUT" | sed -n '2p') + FIRST_OFFER_ID=$(echo -e "$FIRST_OFFER_DETAIL" | awk '{print $NF}') + commandalert $? "Could parse the offer-id from the first listed offer." + echo "$FIRST_OFFER_ID" +} + +# This is a large function that should be broken up if it ever makes sense to not treat a trade +# execution simulation as an atomic operation. But we are not testing api methods here, just +# demonstrating how to use them to get through the trade protocol. It should work for any trade +# between Bob & Alice, as long as Alice is maker, Bob is taker, and the offer to be taken is the +# first displayed in Bob's getoffers command output. +executetrade() { + # Bob list available offers. + printdate "BOB $BOB_ROLE: Looking at $DIRECTION $CURRENCY_CODE offers." + CMD="$CLI_BASE --port=$BOB_PORT getoffers --direction=$DIRECTION --currency-code=$CURRENCY_CODE" + printdate "BOB CLI: $CMD" + OFFERS=$($CMD) + exitoncommandalert $? + echo "$OFFERS" + printbreak + + OFFER_ID=$(getfirstofferid "$BOB_PORT") + exitoncommandalert $? + printdate "First offer found: $OFFER_ID" + + # Take Alice's offer. + CMD="$CLI_BASE --port=$BOB_PORT takeoffer --offer-id=$OFFER_ID --payment-account=$BOB_ACCT_ID --fee-currency=bsq" + printdate "BOB CLI: $CMD" + TRADE=$($CMD) + commandalert $? "Could not take offer." + # Print the takeoffer command's console output. + printdate "$TRADE" + printbreak + sleeptraced 10 + + # Generate some btc blocks + printdate "Generating btc blocks after Bob takes Alice's offer." + genbtcblocks 3 3 + printbreak + sleeptraced 5 + + # Send payment sent and received messages. + if [ "$DIRECTION" = "BUY" ] + then + PAYER="ALICE $ALICE_ROLE" + PAYER_PORT=$ALICE_PORT + PAYER_CLI="ALICE CLI" + PAYEE="BOB $BOB_ROLE" + PAYEE_PORT=$BOB_PORT + PAYEE_CLI="BOB CLI" + else + PAYER="BOB $BOB_ROLE" + PAYER_PORT=$BOB_PORT + PAYER_CLI="BOB CLI" + PAYEE="ALICE $ALICE_ROLE" + PAYEE_PORT=$ALICE_PORT + PAYEE_CLI="ALICE CLI" + fi + + # Confirm payment started. + printdate "$PAYER: Sending fiat payment sent msg." + CMD="$CLI_BASE --port=$PAYER_PORT confirmpaymentstarted --trade-id=$OFFER_ID" + printdate "$PAYER_CLI: $CMD" + SENT_MSG=$($CMD) + commandalert $? "Could not send confirmpaymentstarted message." + # Print the confirmpaymentstarted command's console output. + printdate "$SENT_MSG" + printbreak + + sleeptraced 2 + printdate "Generating btc blocks after fiat payment sent msg." + genbtcblocks 3 5 + sleeptraced 2 + printbreak + + # Confirm payment received. + printdate "$PAYEE: Sending fiat payment received msg." + CMD="$CLI_BASE --port=$PAYEE_PORT confirmpaymentreceived --trade-id=$OFFER_ID" + printdate "$PAYEE_CLI: $CMD" + RCVD_MSG=$($CMD) + commandalert $? "Could not send confirmpaymentreceived message." + # Print the confirmpaymentreceived command's console output. + printdate "$RCVD_MSG" + printbreak + sleeptraced 4 + + # Generate some btc blocks + printdate "Generating btc blocks after fiat transfer." + genbtcblocks 3 5 + printbreak + sleeptraced 3 + + # Complete the trade on the seller side. + if [ "$DIRECTION" = "BUY" ] + then + printdate "BOB $BOB_ROLE: Closing trade by keeping funds in Bisq wallet." + CMD="$CLI_BASE --port=$BOB_PORT keepfunds --trade-id=$OFFER_ID" + printdate "BOB CLI: $CMD" + else + printdate "ALICE (taker): Closing trade by keeping funds in Bisq wallet." + CMD="$CLI_BASE --port=$ALICE_PORT keepfunds --trade-id=$OFFER_ID" + printdate "ALICE CLI: $CMD" + fi + KEEP_FUNDS_MSG=$($CMD) + commandalert $? "Could close trade with keepfunds command." + # Print the keepfunds command's console output. + printdate "$KEEP_FUNDS_MSG" + sleeptraced 5 + printbreak + + printdate "Trade $OFFER_ID complete." +} + getcurrentprice() { PORT="$1" CURRENCY_CODE="$2" diff --git a/apitest/scripts/trade-simulation.sh b/apitest/scripts/trade-simulation.sh index 477703d8ec1..cf8bda74102 100755 --- a/apitest/scripts/trade-simulation.sh +++ b/apitest/scripts/trade-simulation.sh @@ -55,63 +55,38 @@ printbreak registerdisputeagents -printdate "Alice looks for the ID of the face to face payment account method (Bob will use same payment method)." -CMD="$CLI_BASE --port=$ALICE_PORT getpaymentmethods" -printdate "ALICE CLI: $CMD" -getpaymentaccountmethods "$CMD" -printbreak +# Demonstrate how to create a country based, face to face account. +showcreatepaymentacctsteps "Alice" "$ALICE_PORT" -printdate "Alice uses the F2F payment method id to create a face to face payment account in country $COUNTRY_CODE." -CMD="$CLI_BASE --port=$ALICE_PORT getpaymentacctform --payment-method-id=F2F" +CMD="$CLI_BASE --port=$ALICE_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM" printdate "ALICE CLI: $CMD" -getpaymentaccountform "$CMD" +CMD_OUTPUT=$(createpaymentacct "$CMD") +echo "$CMD_OUTPUT" printbreak - -printdate "Bob & Alice edit their $COUNTRY_CODE payment account forms, and renames them to $F2F_ACCT_FORM" -editpaymentaccountform "$COUNTRY_CODE" -cat "$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM" - -# Remove the autogenerated json template because we are going to use one created by a python script in the next step. -CMD="rm -v $APP_HOME/f2f_*.json" -DELETE_JSON_TEMPLATE=$($CMD) -printdate "$DELETE_JSON_TEMPLATE" +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 and Alice create their face to face $COUNTRY_CODE payment accounts." +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" -BOB_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT") -BOB_ACCT_CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT") -printdate "BOB F2F payment-account-id = $BOB_ACCT_ID, currency-code = $BOB_ACCT_CURRENCY_CODE." printbreak - -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" -ALICE_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT") -ALICE_ACCT_CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT") -printdate "ALICE F2F payment-account-id = $ALICE_ACCT_ID, currency-code = $ALICE_ACCT_CURRENCY_CODE." +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 -printdate "ALICE $ALICE_ROLE: Creating $DIRECTION $ALICE_ACCT_CURRENCY_CODE offer with payment acct $ALICE_ACCT_ID." -CURRENT_PRICE=$(getcurrentprice "$ALICE_PORT" "$ALICE_ACCT_CURRENCY_CODE") +# Alice creates an offer. +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="$CLI_BASE --port=$ALICE_PORT createoffer" -CMD+=" --payment-account=$ALICE_ACCT_ID" -CMD+=" --direction=$DIRECTION" -CMD+=" --currency-code=$ALICE_ACCT_CURRENCY_CODE" -CMD+=" --amount=$AMOUNT" -if [ -z "$MKT_PRICE_MARGIN" ]; then - CMD+=" --fixed-price=$FIXED_PRICE" -else - CMD+=" --market-price-margin=$MKT_PRICE_MARGIN" -fi -CMD+=" --security-deposit=15.0" -CMD+=" --fee-currency=BSQ" +CMD=$(gencreateoffercommand "$ALICE_PORT" "$ALICE_ACCT_ID") printdate "ALICE CLI: $CMD" OFFER_ID=$(createoffer "$CMD") exitoncommandalert $? @@ -135,98 +110,9 @@ genbtcblocks 3 5 printbreak sleeptraced 10 -# List offers. -printdate "BOB $BOB_ROLE: Looking at $DIRECTION $BOB_ACCT_CURRENCY_CODE offers." -CMD="$CLI_BASE --port=$BOB_PORT getoffers --direction=$DIRECTION --currency-code=$BOB_ACCT_CURRENCY_CODE" -printdate "BOB CLI: $CMD" -OFFERS=$($CMD) +# Go through the trade protocol. +executetrade exitoncommandalert $? -echo "$OFFERS" -printbreak -sleeptraced 3 - -# Take offer. -printdate "BOB $BOB_ROLE: Taking offer $OFFER_ID with payment acct $BOB_ACCT_ID." -CMD="$CLI_BASE --port=$BOB_PORT takeoffer --offer-id=$OFFER_ID --payment-account=$BOB_ACCT_ID --fee-currency=bsq" -printdate "BOB CLI: $CMD" -TRADE=$($CMD) -commandalert $? "Could not take offer." - -echo "$TRADE" -printbreak -sleeptraced 10 - -# Generating some btc blocks -printdate "Generating btc blocks after Bob takes Alice's offer." -genbtcblocks 3 3 -printbreak -sleeptraced 6 - -# Send payment sent and received messages. -if [ "$DIRECTION" = "BUY" ] -then - PAYER="ALICE $ALICE_ROLE" - PAYER_PORT=$ALICE_PORT - PAYER_CLI="ALICE CLI" - PAYEE="BOB $BOB_ROLE" - PAYEE_PORT=$BOB_PORT - PAYEE_CLI="BOB CLI" -else - PAYER="BOB $BOB_ROLE" - PAYER_PORT=$BOB_PORT - PAYER_CLI="BOB CLI" - PAYEE="ALICE $ALICE_ROLE" - PAYEE_PORT=$ALICE_PORT - PAYEE_CLI="ALICE CLI" -fi - -# Confirm payment started. -printdate "$PAYER: Sending fiat payment sent msg." -CMD="$CLI_BASE --port=$PAYER_PORT confirmpaymentstarted --trade-id=$OFFER_ID" -printdate "$PAYER_CLI: $CMD" -SENT_MSG=$($CMD) -commandalert $? "Could not send confirmpaymentstarted message." - -printdate "$SENT_MSG" -printbreak - -sleeptraced 2 -printdate "Generating btc blocks after fiat payment sent msg." -genbtcblocks 3 5 -sleeptraced 2 -printbreak - -# Confirm payment received. -printdate "$PAYEE: Sending fiat payment received msg." -CMD="$CLI_BASE --port=$PAYEE_PORT confirmpaymentreceived --trade-id=$OFFER_ID" -printdate "$PAYEE_CLI: $CMD" -RCVD_MSG=$($CMD) -commandalert $? "Could not send confirmpaymentreceived message." -printdate "$RCVD_MSG" -printbreak -sleeptraced 4 - -# Generate some btc blocks -printdate "Generating btc blocks after fiat transfer." -genbtcblocks 3 5 -printbreak -sleeptraced 3 - -# Complete the trade on the seller side. -if [ "$DIRECTION" = "BUY" ] -then - printdate "BOB $BOB_ROLE: Closing trade by keeping funds in Bisq wallet." - CMD="$CLI_BASE --port=$BOB_PORT keepfunds --trade-id=$OFFER_ID" - printdate "BOB CLI: $CMD" -else - printdate "ALICE (taker): Closing trade by keeping funds in Bisq wallet." - CMD="$CLI_BASE --port=$ALICE_PORT keepfunds --trade-id=$OFFER_ID" - printdate "ALICE CLI: $CMD" -fi -KEEP_FUNDS_MSG=$($CMD) -commandalert $? "Could close trade with keepfunds command." -printdate "$KEEP_FUNDS_MSG" -sleeptraced 5 printbreak # Get balances after trade completion.