diff --git a/README.md b/README.md index 56b8f13..005dcaa 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ - 🎓 [Crash Course](#crash-course-geniusyield-dex-orders-and-the-smart-order-routers) - 🚀 [Building and running](#building-and-running-the-smart-order-router) - 🧠 [Strategies](#strategies) +- 💰 [Yield Accelerator Rewards](#yield-accelerator-rewards) - 🛠️ [Troubleshooting](#troubleshooting) - ⚖️ [License](#license) @@ -132,17 +133,17 @@ Using the previous example we could have two cases: Commodity A | Currency B Commodity B | Currency A -| Amount | Price | Type | -|:-----------:|:-------------:|:------:| -| `10 GENS` | `2 ADA` | Sell | -| `8 GENS` | `2.5 ADA` | Buy | +| Amount | Price | Type | +| :-------: | :-------: | :---: | +| `10 GENS` | `2 ADA` | Sell | +| `8 GENS` | `2.5 ADA` | Buy | -| Amount | Price | Type | -|:-----------:|:--------------:|:------:| -| `20 ADA` | `0.4 GENS` | Sell | -| `20 ADA` | `0.5 GENS` | Buy | +| Amount | Price | Type | +| :------: | :--------: | :---: | +| `20 ADA` | `0.4 GENS` | Sell | +| `20 ADA` | `0.5 GENS` | Buy | @@ -571,6 +572,33 @@ Questions: Choosing between one strategy or the other will always enforce some m will it be possible to merge the two strategies into a single one? Or it will be better to run two different SOR instances? +## Yield Accelerator Rewards + +SOR's fill orders and therefore participate in the GeniusYield Yield Accelerator Program and accumulate rewards. + +Traders wishing to check and claim their rewards can easily do so in the [GeniusYield UI](https://app.geniusyield.co/earn), +but unfortunately, at the moment, the UI only works for users who connect their wallets to the UI and are identified by +the wallet stake key hash. + +An SOR, on the other hand, normally just uses a simple payment signing key and an associated address without staking component. + +To allow SOR operators to check and claim rewards, we are providing two simple bash scripts, +one for [checking](./scripts/check-bot-rewards.sh) and one for [claiming](./scripts/claim-bot-rewards.sh) rewards. +Both scripts require the `cardano-cli` to be installed and available in the `PATH`, and in order to claim, +you additionally need a connection to a running Cardano node. + +To check your rewards, run the following command: + +```shell +./scripts/check-bot-rewards.sh +``` + +To claim your rewards, run the following command: + +```shell +./scripts/claim-bot-rewards.sh +``` + ## Troubleshooting ### Provider related error messages diff --git a/scripts/check-bot-rewards.sh b/scripts/check-bot-rewards.sh new file mode 100755 index 0000000..d4c79bd --- /dev/null +++ b/scripts/check-bot-rewards.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +echo "bot payment signing key file: $1" + +VKEY_TMP_FILE=$(mktemp) +cardano-cli key verification-key --signing-key-file "$1" --verification-key-file "$VKEY_TMP_FILE" + +PKH_TMP_FILE=$(mktemp) +cardano-cli address key-hash --payment-verification-key-file "$VKEY_TMP_FILE" --out-file "$PKH_TMP_FILE" +PKH=$(cat "$PKH_TMP_FILE") +echo "bot pubkey hash: $PKH" + +rm "$VKEY_TMP_FILE" +rm "$PKH_TMP_FILE" + +curl 'https://api.geniusyield.co/user/connect' \ + -H 'content-type: application/json' \ + --data-raw "{\"walletStakeKeyHash\":\"$PKH\",\"userType\":\"INDIVIDUAL\"}" \ + --compressed > /dev/null 2>&1 + +curl 'https://api.geniusyield.co/yield-farming/rewards' \ + -H "authorization: WalletStakeKeyHash $PKH" \ + -H 'content-type: application/json' \ + --compressed + +echo "" diff --git a/scripts/claim-bot-rewards.sh b/scripts/claim-bot-rewards.sh new file mode 100755 index 0000000..5bbccab --- /dev/null +++ b/scripts/claim-bot-rewards.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +echo "node socket path: $2" +echo "bot payment signing key file: $1" + +VKEY_TMP_FILE=$(mktemp) +cardano-cli key verification-key --signing-key-file "$1" --verification-key-file "$VKEY_TMP_FILE" + +PKH_TMP_FILE=$(mktemp) +cardano-cli address key-hash --payment-verification-key-file "$VKEY_TMP_FILE" --out-file "$PKH_TMP_FILE" +PKH=$(cat "$PKH_TMP_FILE") +echo "bot pubkey hash: $PKH" + +ADDR_TMP_FILE=$(mktemp) +cardano-cli address build --mainnet --payment-verification-key-file "$VKEY_TMP_FILE" --out-file "$ADDR_TMP_FILE" +ADDR=$(cat "$ADDR_TMP_FILE") +echo "bot address (Bech32): $ADDR" + +CBOR=$(cardano-cli address info --address "$ADDR" | jq .base16) +echo "bot address (CBOR): $CBOR" + +rm "$VKEY_TMP_FILE" +rm "$PKH_TMP_FILE" +rm "$ADDR_TMP_FILE" + +curl 'https://api.geniusyield.co/user/connect' \ + -H 'content-type: application/json' \ + --data-raw "{\"walletStakeKeyHash\":\"$PKH\",\"userType\":\"INDIVIDUAL\"}" \ + --compressed > /dev/null 2>&1 + +DATA="{\"walletAddress\":$CBOR,\"walletRewardAddresses\":[\"e1$PKH\"],\"walletStakeKeyHash\":\"$PKH\",\"collateralUtxo\":[\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"],\"walletUnusedAddresses\":[$CBOR],\"walletUsedAddresses\":[$CBOR]}" + +PAYLOAD=$(curl -s 'https://api.geniusyield.co/yield-farming/rewards/claim' \ + -H "authorization: WalletStakeKeyHash $PKH" \ + -H 'content-type: application/json' \ + --data-raw "$DATA" \ + --compressed | jq .transactionPayload) + +echo "" +echo "tx payload: $PAYLOAD" +echo "" + +TX=$(cat << EOF +{ + "type": "Witnessed Tx BabbageEra", + "description": "Ledger Cddl Format", + "cborHex": $PAYLOAD +} +EOF +) + +TX_TMP_FILE=$(mktemp) +echo "$TX" > $TX_TMP_FILE + +cardano-cli transaction sign --mainnet --tx-file "$TX_TMP_FILE" --signing-key-file "$1" --out-file "$TX_TMP_FILE" +cardano-cli transaction view --tx-file "$TX_TMP_FILE" +echo "" + +TID=$(cardano-cli transaction txid --tx-file "$TX_TMP_FILE") + +cardano-cli transaction submit --socket-path "$2" --mainnet --tx-file "$TX_TMP_FILE" + +rm $TX_TMP_FILE + +echo "tx-id: $TID" +echo ""