RobotBob reads a json file instructing it to make and take offers
as per an 'actions' json array, e.g. ["make","take","take","make],
and the tester will manually run CLI commands provided by the bot
during each step in a trade.
The test case (ScriptedBotTest) can be run with the test harness,
which will start and shutdown all the regtest/dao app: bitcoind,
seednode, arbnode, bob & alice nodes. The test case can also be
run without the test harness, and the user manages his own daemons.
Usage will be described in the PR before it leaves draft stage.
The trade simulation scripts check that bitcoind, seed node,
arbitration node, and bob & alice nodes are running at startup,
but the bash pgrep command used to find the PIDs does not work on
OSX (my darwin20), so an adjustment was made to the env script to
find java PIDs with ps and awk if running on OSX.
Two additonal startup checks were added: make sure the script is
running on supported OS (Linux or OSX), and bitcoin-cli is in
the PATH.
Also removed usage error text about registering dispute agents.
The scripts do that now.
There is no need to simulate the time it takes between
receiving a 'payment sent' msg and having funds (fiat) deposited
in the seller's bank account. But there is need to explain
that in the script.
The codacy issue "$/${} is unnecessary on arithmetic variables"
seems to not apply to $(echo $((1 + $RANDOM % 10))), but we
try another syntax to make her happy.
The script demonstrats a way to always keep one offer in the market.
As soon as the offer is taken and the trade is completed, another
offer is placed.
Code duplication needs to be reduced as new scripts are added.
- Refactor the createpaymentacct functions.
The steps required to create a payment account are still
displayed, but only for Alice, not Bob.
- Treat the trade protocol simulation as an atomic function.
This will reduce 'main' simulation script size as new
ones are added.
Migrate RpcService over to the new block notification daemon and RPC
client based on jsonrpc4j. Drop in own DTO classes in place of the ones
defined by btcd-cli4j and rename requestBtcBlock & addNewBtcBlockHandler
to requestDtoBlock & addNewDtoBlockHandler respectively.
Also remove now redundant filtering from the logback config and update
grade-witness.
Two regtest trading simulation scripts are contained in this change:
- trade-simulation.sh goes through the steps of creating F2F payment
accounts for Bob & Alice, and each step of a trade from createoffer to
completion.
- limit-order-simulation.sh shows one way to trigger creation of an offer
when a limit price is reached.
Each script prints CLI commands just before they are run.
Both scripts depend on functions contained in supporting bash and python3
scripts.
Examples:
trade-simulation.sh
Simulate the entire trade protocol between Bob (taker) & Alice (maker),
where Alice buys 0.1 BTC from Bob, paying in Renminbi (CYN).
Note the script takes a country code (CN) not a currency code, so the
script can create the appropriate country based face to face payment accounts.
$ apitest/scripts/trade-simulation.sh -d buy -c cn -m 0.0 -a 0.1
limit-order.sh
Create a CAD/BUY 0.1 BTC order at mkt price margin of 0.0% if price falls to
or below 47900 CAD.
Note the script takes a country code (CA) not a currency code, so the script
can create the appropriate country based face to face payment accounts.
$ apitest/scripts/limit-order-simulation.sh -l 47900 -d buy -c CA -m 0.0 -a 0.1
Create a USD/SELL 0.1 BTC order at mkt price margin of 0.0% if price rises to
or above 37200 USD.
$ apitest/scripts/limit-order-simulation.sh -l 37200 -d sell -c US -m 0.0 -a 0.1
Similar to 'getoffers' and 'getoffer', but filters out offers not
created by the user. The new methods are so similar some offer list
filtering and sorting was refactored in CoreOffersService.
Also fixed some createoffer apitest cases in anticipation of a new OfferFilter,
which will filter out offers not matching any user payment account.
Don't mix junit and jupter apis, apitest should only be using
jupiter. Also moved a file.deleteOnExit statement within the
method that created the file.