Files
nigiri/cli/cmd/faucet.go
Francis 88fca5db00 Add faucet command (#93)
* added faucet command

* chopsticks ports imported from env

* changed order of assignments

* test: sleep after start nigiri

* sleep after each strat and each stop

* small changes on faucet

* added check for txId

* json err control

* correcting json err control

* small fixes

* fixes on faucet command

* http.StatusOK

* try with 0.0.0.0 interface

* try with 127.0.0.1 interface

* fixes in travis

Co-authored-by: Marco Argentieri <3596602+tiero@users.noreply.github.com>
2020-09-11 19:13:43 +01:00

110 lines
2.4 KiB
Go

package cmd
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"github.com/spf13/cobra"
"github.com/vulpemventures/nigiri/cli/constants"
"github.com/vulpemventures/nigiri/cli/controller"
)
var FaucetCmd = &cobra.Command{
Args: func(cmd *cobra.Command, args []string) error {
if len(args) != 1 {
return errors.New("Insert receiving address")
}
return nil
},
Use: "faucet <address>",
Short: "Generate and send bitcoin to given address",
RunE: faucet,
PreRunE: faucetChecks,
}
func faucetChecks(cmd *cobra.Command, args []string) error {
datadir, _ := cmd.Flags().GetString("datadir")
isLiquidService, _ := cmd.Flags().GetBool("liquid")
ctl, err := controller.NewController()
if err != nil {
return err
}
if err := ctl.ParseDatadir(datadir); err != nil {
return err
}
if len(args) != 1 {
return constants.ErrInvalidArgs
}
if isRunning, err := ctl.IsNigiriRunning(); err != nil {
return err
} else if !isRunning {
return constants.ErrNigiriNotRunning
}
if err := ctl.ReadConfigFile(datadir); err != nil {
return err
}
if isLiquidService && isLiquidService != ctl.GetConfigBoolField(constants.AttachLiquid) {
return constants.ErrNigiriLiquidNotEnabled
}
return nil
}
func faucet(cmd *cobra.Command, address []string) error {
isLiquidService, err := cmd.Flags().GetBool("liquid")
datadir, _ := cmd.Flags().GetString("datadir")
if err != nil {
return err
}
request := map[string]string{
"address": address[0],
}
ctl, err := controller.NewController()
if err != nil {
return err
}
envPath := ctl.GetResourcePath(datadir, "env")
env, _ := ctl.ReadComposeEnvironment(envPath)
envPorts := env["ports"].(map[string]map[string]int)
requestPort := envPorts["bitcoin"]["chopsticks"]
if isLiquidService {
requestPort = envPorts["liquid"]["chopsticks"]
}
payload, err := json.Marshal(request)
if err != nil {
return err
}
res, err := http.Post("http://127.0.0.1:"+strconv.Itoa(requestPort)+"/faucet", "application/json", bytes.NewBuffer(payload))
if err != nil {
return err
}
data, err := ioutil.ReadAll(res.Body)
if err != nil {
return err
}
if res.StatusCode != http.StatusOK {
return errors.New(string(data))
}
var dat map[string]string
if err := json.Unmarshal([]byte(data), &dat); err != nil {
return errors.New("Internal error. Try again.")
}
if dat["txId"] == "" {
return errors.New("Not Successful")
}
fmt.Println("txId: " + dat["txId"])
return nil
}