diff --git a/Dockerfile b/Dockerfile index 9f3014e..b637410 100644 --- a/Dockerfile +++ b/Dockerfile @@ -82,7 +82,11 @@ ENV PATH=${BITCOIN_PREFIX}/bin:$PATH COPY --from=bitcoin-core /opt /opt COPY ./manager/target/${ARCH}-unknown-linux-musl/release/bitcoind-manager \ ./docker_entrypoint.sh \ + ./actions/getaddress.sh \ + ./actions/getbalance.sh \ ./actions/reindex.sh \ + ./actions/sendcoin.sh \ + ./actions/sendall.sh \ ./actions/reindex_chainstate.sh \ ./actions/prioritise-transaction.sh \ ./check-rpc.sh \ diff --git a/actions/getaddress.sh b/actions/getaddress.sh new file mode 100644 index 0000000..4c0f170 --- /dev/null +++ b/actions/getaddress.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +set -e + +if ! bitcoin-cli listwalletdir | jq -e '.wallets[] | select(.name == "coin")' &> /dev/null; then + bitcoin-cli createwallet "coin" &> /dev/null +fi + +if ! bitcoin-cli getwalletinfo &> /dev/null; then + bitcoin-cli loadwallet coin &> /dev/null +fi + +ADDRESS=$(bitcoin-cli getnewaddress "" "bech32") + +result=" { + \"version\": \"0\", + \"message\": \"$ADDRESS\", + \"value\": null, + \"copyable\": true, + \"qr\": false +}" + +echo $result \ No newline at end of file diff --git a/actions/getbalance.sh b/actions/getbalance.sh new file mode 100644 index 0000000..2a7c5b3 --- /dev/null +++ b/actions/getbalance.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +set -e + +if ! bitcoin-cli listwalletdir | jq -e '.wallets[] | select(.name == "coin")' &> /dev/null; then + bitcoin-cli createwallet "coin" &> /dev/null +fi + +if ! bitcoin-cli getwalletinfo &> /dev/null; then + bitcoin-cli loadwallet coin &> /dev/null +fi + +TRUSTED=$(bitcoin-cli getbalances | jq -r '.mine.trusted') +UNTRUSTED=$(bitcoin-cli getbalances | jq -r '.mine.untrusted_pending') +IMMATURE=$(bitcoin-cli getbalances | jq -r '.mine.immature') + +result=" { + \"version\": \"0\", + \"message\": \"Your wallet balance: $TRUSTED BTC. / + Non confirmed balance: $UNTRUSTED BTC. / + Immanture balance from mining: $IMMATURE BTC.\", + \"value\": null, + \"copyable\": true, + \"qr\": false +}" + +echo $result \ No newline at end of file diff --git a/actions/sendall.sh b/actions/sendall.sh new file mode 100644 index 0000000..c7b320b --- /dev/null +++ b/actions/sendall.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +set -e + +if ! bitcoin-cli listwalletdir | jq -e '.wallets[] | select(.name == "coin")' &> /dev/null; then + bitcoin-cli createwallet "coin" &> /dev/null +fi + +if ! bitcoin-cli getwalletinfo &> /dev/null; then + bitcoin-cli loadwallet coin &> /dev/null +fi + +cat > input.json +ADDRESS=$(jq -r '.["address"]' input.json) + +FEE=$(jq -r '.["fee"]' input.json) +if [ $FEE = "null" ]; then + FEE="0" +fi + +TXID=$(bitcoin-cli -named sendall recipients="[\"$ADDRESS\"]" fee_rate=$FEE | jq -r '.txid') + +result=" { + \"version\": \"0\", + \"message\": \"txid: $TXID\", + \"value\": null, + \"copyable\": true, + \"qr\": false +}" + +echo $result \ No newline at end of file diff --git a/actions/sendcoin.sh b/actions/sendcoin.sh new file mode 100644 index 0000000..d314353 --- /dev/null +++ b/actions/sendcoin.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +set -e + +if ! bitcoin-cli listwalletdir | jq -e '.wallets[] | select(.name == "coin")' &> /dev/null; then + bitcoin-cli createwallet "coin" &> /dev/null +fi + +if ! bitcoin-cli getwalletinfo &> /dev/null; then + bitcoin-cli loadwallet coin &> /dev/null +fi + +cat > input.json +ADDRESS=$(jq -r '.["address"]' input.json) + +AMOUNT=$(jq -r '.["amount"]' input.json) +if [ $AMOUNT = "null" ]; then + AMOUNT="0" +fi + +FEE=$(jq -r '.["fee"]' input.json) +if [ $FEE = "null" ]; then + FEE="0" +fi + +TXID=$(bitcoin-cli -named sendtoaddress address=$ADDRESS amount=$AMOUNT fee_rate=$FEE) + +result=" { + \"version\": \"0\", + \"message\": \"txid: $TXID\", + \"value\": null, + \"copyable\": true, + \"qr\": false +}" + +echo $result \ No newline at end of file diff --git a/manifest.yaml b/manifest.yaml index 203a5b2..b6c2da4 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -225,6 +225,104 @@ actions: range: "[-1000000,1000000]" default: 0 nullable: true + getaddress: + name: "Get new address" + description: "Get a new Bitcoin address." + allowed-statuses: + - running + implementation: + type: docker + image: main + system: false + entrypoint: getaddress.sh + args: [] + io-format: json + mounts: + main: /root/.bitcoin + inject: true + getbalance: + name: "Get wallet balance" + description: "Get wallet balance." + allowed-statuses: + - running + implementation: + type: docker + image: main + system: false + entrypoint: getbalance.sh + args: [] + io-format: json + mounts: + main: /root/.bitcoin + inject: true + sendcoin: + name: "Send bitcoin" + description: "Send bitcoin to an address." + allowed-statuses: + - running + implementation: + type: docker + image: main + system: false + entrypoint: sendcoin.sh + args: [] + io-format: json + mounts: + main: /root/.bitcoin + inject: true + input-spec: + address: + type: string + name: Address + description: "The bitcoin address you want to send your bitcoins." + placeholder: "" + nullable: false + amount: + type: number + name: Amount (BTC) + description: "The amount of bitcoin you want to send to the address." + integral: false + range: "[0,21000000]" + default: 0 + nullable: false + fee: + type: number + name: Fee (sat/vbytes) + description: "The amount of fee you want to pay for this transaction (in sat per vbytes)" + integral: false + range: "[0,1000000]" + default: 0 + nullable: false + sendall: + name: "Send all bitcoin" + description: "Send ALL bitcoin in the wallet." + allowed-statuses: + - running + implementation: + type: docker + image: main + system: false + entrypoint: sendall.sh + args: [] + io-format: json + mounts: + main: /root/.bitcoin + inject: true + input-spec: + address: + type: string + name: Address + description: "The bitcoin address you want to send your bitcoins." + placeholder: "" + nullable: false + fee: + type: number + name: Fee (sat/vbytes) + description: "The amount of fee you want to pay for this transaction (in sat per vbytes)" + integral: false + range: "[0,1000000]" + default: 0 + nullable: false migrations: from: "*":