commit da6ba29817ea44293d0611ac885ac59bef67308e Author: upong Date: Mon Apr 3 21:00:36 2023 +0200 Initial commit diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..19bd362 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +ADDRESS=WALLET1,WALLET2 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..5b0c996 --- /dev/null +++ b/go.mod @@ -0,0 +1,17 @@ +module sui-faucet + +go 1.18 + +require ( + github.com/go-co-op/gocron v1.19.0 + github.com/joho/godotenv v1.5.1 + github.com/rs/zerolog v1.29.0 +) + +require ( + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..1ebacff --- /dev/null +++ b/go.sum @@ -0,0 +1,26 @@ +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/go-co-op/gocron v1.19.0 h1:XlPLqNnxnKblmCRLdfcWV1UgbukQaU54QdNeR1jtgak= +github.com/go-co-op/gocron v1.19.0/go.mod h1:UqVyvM90I1q/R1qGEX6cBORI6WArLuEgYlbncLMvzRM= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= +github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/main.go b/main.go new file mode 100644 index 0000000..c455b1e --- /dev/null +++ b/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "encoding/json" + "io" + "net/http" + "os" + "strings" + "time" + + "github.com/go-co-op/gocron" + "github.com/joho/godotenv" + "github.com/rs/zerolog/log" +) + +func main() { + godotenv.Load() //nolint:errcheck + + address := strings.Split(os.Getenv("ADDRESS"), ",") + + s := gocron.NewScheduler(time.UTC) + + for _, a := range address { + s.Every(6).Hours().Do(func() { //nolint:errcheck + url := "https://faucet.devnet.sui.io/gas" + + request := `{"FixedAmountRequest":{"recipient":"` + a + `"}}` + + resp, err := http.Post(url, "application/json", strings.NewReader(request)) + if err != nil { + log.Err(err).Msg("error sending request") + panic(err) + } + + defer func() { + _ = resp.Body.Close() + }() + + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Err(err).Msg("error reading response body") + panic(err) + } + + if resp.StatusCode == http.StatusCreated { + type Data struct { + TransferredGasObjects []struct { + Amount uint `json:"amount"` + ID string `json:"id"` + TransferTxDigest string `json:"transferTxDigest"` + } + } + + var d Data + err = json.Unmarshal(body, &d) + if err != nil { + log.Err(err).Msg("error unmarshalling data") + panic(err) + } + log.Info().Msg("Claim successful!") + } else { + log.Error().Msg(string(body)) + } + }) + } + + s.StartBlocking() +}