From cf995040d99acb6a538bdfc9ce42c6c2ed3ceec6 Mon Sep 17 00:00:00 2001 From: Nate Maninger Date: Fri, 23 Aug 2024 09:55:00 -0700 Subject: [PATCH] Add testing cluster (#686) --- .github/workflows/pr.yml | 3 +- go.work | 8 - go.work.sum | 13 - internal/cluster/README.md | 142 +++++++++ internal/cluster/cmd/clusterd/main.go | 231 +++++++++++++++ internal/cluster/go.mod | 47 +++ internal/cluster/go.sum | 121 ++++++++ internal/nextjs/go.mod | 3 + libs/sdk/project.json | 2 +- package.json | 400 +++++++++++++------------- 10 files changed, 747 insertions(+), 223 deletions(-) delete mode 100644 go.work delete mode 100644 go.work.sum create mode 100644 internal/cluster/README.md create mode 100644 internal/cluster/cmd/clusterd/main.go create mode 100644 internal/cluster/go.mod create mode 100644 internal/cluster/go.sum create mode 100644 internal/nextjs/go.mod diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index baffe9da8..ab96b3e86 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -128,4 +128,5 @@ jobs: uses: n8maninger/action-golang-test@v2 with: args: '-race' - package: ${{ matrix.module }}/... + working-directory: ${{ matrix.module }} + package: ./... diff --git a/go.work b/go.work deleted file mode 100644 index 26934701f..000000000 --- a/go.work +++ /dev/null @@ -1,8 +0,0 @@ -go 1.21.7 - -use ( - ./hostd - ./renterd - ./sdk - ./walletd -) diff --git a/go.work.sum b/go.work.sum deleted file mode 100644 index 0a6710ffc..000000000 --- a/go.work.sum +++ /dev/null @@ -1,13 +0,0 @@ -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= -go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= -go.sia.tech/mux v1.2.0 h1:ofa1Us9mdymBbGMY2XH/lSpY8itFsKIo/Aq8zwe+GHU= -go.sia.tech/mux v1.2.0/go.mod h1:Yyo6wZelOYTyvrHmJZ6aQfRoer3o4xyKQ4NmQLJrBSo= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/internal/cluster/README.md b/internal/cluster/README.md new file mode 100644 index 000000000..f814b39d9 --- /dev/null +++ b/internal/cluster/README.md @@ -0,0 +1,142 @@ +# Cluster + +Daemon for spinning up a cluster of nodes and connecting them to a local +test network. Primarily useful for local e2e API testing. + +## Updating Daemons + +The cluster daemon uses go.mod to manage the daemon dependency. To test a specific +version of a daemon against a cluster, update the go.mod file to point to the +desired commit. + +``` +go get -u go.sia.tech/hostd@asdasd +``` + +## Usage + +```bash +$ go run ./cmd/clusterd -renterd=1 --hostd=3 +``` + +Once the cluster is up, the cluster API will be available to interact with the +testnet. + +Each node has a unique api address to interact with its respective daemon. + +CTRL-C or SIGINT will shut down the cluster and cleanup the resources + +### `[GET] /nodes` +Lists all running nodes in the cluster + +**Response Body** +```json +[ + { + "id": "facaba60da2e71bb", + "type": "renterd", + "apiAddress": "http://[::]:53873/api", + "password": "sia is cool", + "walletAddress": "addr:1ca3bfe60a50fe3e700a67fae7c9670446849a0177b0da0378399c6d6ca9cb13dfcb3d084c2d" + }, + { + "id": "eabf85c452cf4bca", + "type": "walletd", + "apiAddress": "http://[::]:53874/api", + "password": "sia is cool", + "walletAddress": "addr:000000000000000000000000000000000000000000000000000000000000000089eb0d6a8a69" + }, + { + "id": "1c01bc97b794c8d7", + "type": "hostd", + "apiAddress": "http://[::]:53864/api", + "password": "sia is cool", + "walletAddress": "addr:862b5ca325b4c77ffe861a892e65f48bbcb43f2287b2dfe8d7c70459659f7367a2ffbcf62de9" + }, + { + "id": "31b3a65f8a1842d2", + "type": "hostd", + "apiAddress": "http://[::]:53867/api", + "password": "sia is cool", + "walletAddress": "addr:b906d603430c7e814a107910d8029f931da96a6f2afef6e6dfa93b488e9b337ae29d9f195d23" + }, + { + "id": "712e5c22050c0700", + "type": "hostd", + "apiAddress": "http://[::]:53870/api", + "password": "sia is cool", + "walletAddress": "addr:42fd84ddb08a96105c41b31414913a1a3e09a94046d8444f65398e9b96a814a7708027a323f7" + } +] +``` + +### `[*] /nodes/proxy/:filter/*path` + +Any API request may be proxied through the cluster to all nodes matching the filter. + +For example, to get the tip of all `hostd` nodes in the cluster you can make a request to `[GET] /nodes/proxy/hostd/api/consensus/tip`. Auth is handled automatically and the response from every node is returned. + +**Response:** +```json +[ + { + "nodeID": "29203b5ef83d58e6", + "statusCode": 200, + "data": { + "height": 1517, + "id": "bid:0209ceee2949574d1fc16df6aa4096d8a77533ffa9805ba78beb9e647b948fb0" + } + }, + { + "nodeID": "8361d1ff9eee0afa", + "statusCode": 200, + "data": { + "height": 1484, + "id": "bid:aac08c682c20ea109b07dcf10745401e688faa653c0f28aa52c46fba0305f0e9" + } + }, + { + "nodeID": "853d14ea98344417", + "statusCode": 200, + "data": { + "height": 1461, + "id": "bid:14c5dd55aa4f04ce821d450f39e70b04d6ed02be3bb34c20c9cf59f781f60e04" + } + }, + { + "nodeID": "f7acabfdef326b0e", + "statusCode": 200, + "data": { + "height": 1100, + "id": "bid:e855de5f38e9d106ca822bbd117ae643a68ceec288f70ff18c94779c0779b71e" + } + }, + { + "nodeID": "a71cc2160aa8ba5b", + "statusCode": 200, + "data": { + "height": 1406, + "id": "bid:ba90e5d211a0ed9710b52d7ddcd5c65412751a8d84127b5236eb693a004e0eb0" + } + }, + { + "nodeID": "1eab0e2ec98a038a", + "statusCode": 200, + "data": { + "height": 1411, + "id": "bid:ebde5578fb79f0c90a003a1425fff0159e9e6f7935bf817ebd7b2b9cf5c908c7" + } + } +] +``` + +### `POST /mine` + +Mines a preset number of blocks on the testnet + +**Request Body** +```json +{ + "blocks": 10 +} +``` diff --git a/internal/cluster/cmd/clusterd/main.go b/internal/cluster/cmd/clusterd/main.go new file mode 100644 index 000000000..f8b2322ab --- /dev/null +++ b/internal/cluster/cmd/clusterd/main.go @@ -0,0 +1,231 @@ +// This file is copied from go.sia.tech/cluster/cmd/clusterd/main.go +// in order to manage the daemon dependencies locally. This file should be +// updated to match the upstream version when necessary. +package main + +import ( + "context" + "flag" + "fmt" + "net" + "net/http" + "os" + "os/signal" + "path/filepath" + "sync" + "time" + + "go.sia.tech/cluster/api" + "go.sia.tech/cluster/nodes" + "go.sia.tech/core/gateway" + "go.sia.tech/core/types" + "go.sia.tech/coreutils" + "go.sia.tech/coreutils/chain" + "go.sia.tech/coreutils/syncer" + "go.sia.tech/coreutils/testutil" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +func main() { + var ( + dir string + apiAddr string + logLevel string + network string + + siafundAddr string + + renterdCount int + hostdCount int + walletdCount int + ) + + flag.StringVar(&dir, "dir", "", "directory to store renter data") + flag.StringVar(&apiAddr, "api", ":3001", "API address") + flag.StringVar(&logLevel, "log", "info", "logging level") + flag.StringVar(&network, "network", "v1", "network to use (v1 or v2)") + flag.StringVar(&siafundAddr, "siafund", "", "address to send siafunds to") + + flag.IntVar(&renterdCount, "renterd", 0, "number of renter daemons to run") + flag.IntVar(&hostdCount, "hostd", 0, "number of host daemons to run") + flag.IntVar(&walletdCount, "walletd", 0, "number of wallet daemons to run") + flag.Parse() + + cfg := zap.NewProductionEncoderConfig() + cfg.TimeKey = "" // prevent duplicate timestamps + cfg.EncodeTime = zapcore.RFC3339TimeEncoder + cfg.EncodeDuration = zapcore.StringDurationEncoder + cfg.EncodeLevel = zapcore.CapitalColorLevelEncoder + + cfg.StacktraceKey = "" + cfg.CallerKey = "" + encoder := zapcore.NewConsoleEncoder(cfg) + + var level zap.AtomicLevel + switch logLevel { + case "debug": + level = zap.NewAtomicLevelAt(zap.DebugLevel) + case "info": + level = zap.NewAtomicLevelAt(zap.InfoLevel) + case "warn": + level = zap.NewAtomicLevelAt(zap.WarnLevel) + case "error": + level = zap.NewAtomicLevelAt(zap.ErrorLevel) + default: + fmt.Printf("invalid log level %q", level) + os.Exit(1) + } + + log := zap.New(zapcore.NewCore(encoder, zapcore.Lock(os.Stdout), level)) + defer log.Sync() + + zap.RedirectStdLog(log) + + if hostdCount == 0 && renterdCount == 0 && walletdCount == 0 { + log.Panic("no nodes to run") + } + + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) + defer cancel() + + dir, err := os.MkdirTemp(dir, "sia-cluster-*") + if err != nil { + log.Panic("failed to create temp dir", zap.Error(err)) + } + defer func() { + if err := os.RemoveAll(dir); err != nil { + log.Error("failed to remove temp dir", zap.Error(err)) + } else { + log.Debug("removed temp dir", zap.String("dir", dir)) + } + }() + + // use modified Zen testnet + n, genesis := chain.TestnetZen() + n.InitialTarget = types.BlockID{0xFF} + n.HardforkDevAddr.Height = 1 + n.HardforkTax.Height = 1 + n.HardforkStorageProof.Height = 1 + n.HardforkOak.Height = 1 + n.HardforkASIC.Height = 1 + n.HardforkFoundation.Height = 1 + + if siafundAddr != "" { + // if the siafund address is set, send the siafunds to it + var addr types.Address + if err := addr.UnmarshalText([]byte(siafundAddr)); err != nil { + log.Panic("failed to parse siafund address", zap.Error(err)) + } + genesis.Transactions[0].SiafundOutputs[0].Address = addr + } + + switch network { + case "v1": + n.HardforkV2.AllowHeight = 10000 // ideally unattainable + n.HardforkV2.RequireHeight = 12000 + case "v2": + n.HardforkV2.AllowHeight = 2 + n.HardforkV2.RequireHeight = 3 + default: + log.Fatal("invalid network", zap.String("network", network)) + } + + apiListener, err := net.Listen("tcp", apiAddr) + if err != nil { + log.Panic("failed to listen on api address", zap.Error(err)) + } + defer apiListener.Close() + + bdb, err := coreutils.OpenBoltChainDB(filepath.Join(dir, "consensus.db")) + if err != nil { + log.Panic("failed to open bolt db", zap.Error(err)) + } + defer bdb.Close() + + dbstore, tipState, err := chain.NewDBStore(bdb, n, genesis) + if err != nil { + log.Panic("failed to create dbstore", zap.Error(err)) + } + cm := chain.NewManager(dbstore, tipState) + + syncerListener, err := net.Listen("tcp", ":0") + if err != nil { + log.Panic("failed to listen on api address", zap.Error(err)) + } + defer syncerListener.Close() + + _, port, err := net.SplitHostPort(syncerListener.Addr().String()) + s := syncer.New(syncerListener, cm, testutil.NewMemPeerStore(), gateway.Header{ + GenesisID: genesis.ID(), + UniqueID: gateway.GenerateUniqueID(), + NetAddress: "127.0.0.1:" + port, + }, syncer.WithLogger(log.Named("syncer")), syncer.WithMaxInboundPeers(10000), syncer.WithBanDuration(time.Second), syncer.WithPeerDiscoveryInterval(5*time.Second), syncer.WithSyncInterval(5*time.Second)) // essentially no limit on inbound peers + if err != nil { + log.Panic("failed to create syncer", zap.Error(err)) + } + defer s.Close() + go s.Run(ctx) + + nm := nodes.NewManager(dir, cm, s, log.Named("cluster")) + + server := &http.Server{ + Handler: api.Handler(cm, s, nm, log.Named("api")), + ReadTimeout: 5 * time.Second, + } + defer server.Close() + go server.Serve(apiListener) + + var wg sync.WaitGroup + for i := 0; i < hostdCount; i++ { + wg.Add(1) + ready := make(chan struct{}, 1) + go func() { + defer wg.Done() + if err := nm.StartHostd(ctx, ready); err != nil { + log.Panic("hostd failed to start", zap.Error(err)) + } + }() + <-ready + } + + for i := 0; i < renterdCount; i++ { + wg.Add(1) + ready := make(chan struct{}, 1) + go func() { + defer wg.Done() + if err := nm.StartRenterd(ctx, ready); err != nil { + log.Panic("renterd failed to start", zap.Error(err)) + } + }() + <-ready + } + + for i := 0; i < walletdCount; i++ { + wg.Add(1) + ready := make(chan struct{}, 1) + go func() { + defer wg.Done() + if err := nm.StartWalletd(ctx, ready); err != nil { + log.Panic("walletd failed to start", zap.Error(err)) + } + }() + <-ready + } + + // mine until all payouts have matured + for n := 144; n > 0; { + b, ok := coreutils.MineBlock(cm, types.VoidAddress, 5*time.Second) + if !ok { + continue + } else if err := cm.AddBlocks([]types.Block{b}); err != nil { + log.Panic("failed to add funding block", zap.Error(err)) + } + n-- + log.Debug("mined block", zap.Stringer("index", cm.Tip())) + } + + <-ctx.Done() + wg.Wait() + log.Info("shutdown complete") +} diff --git a/internal/cluster/go.mod b/internal/cluster/go.mod new file mode 100644 index 000000000..69909fc68 --- /dev/null +++ b/internal/cluster/go.mod @@ -0,0 +1,47 @@ +module go.sia.tech/web/cluster + +go 1.23.0 + +require ( + go.sia.tech/cluster v0.0.0-20240820001441-51c7ee96dadd + go.sia.tech/core v0.4.4-0.20240814175157-ebc804c7119c + go.sia.tech/coreutils v0.2.6-0.20240814205841-6bd57953a01b + go.uber.org/zap v1.27.0 +) + +require ( + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/aws/aws-sdk-go v1.55.5 // indirect + github.com/cloudflare/cloudflare-go v0.101.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.5 // indirect + github.com/goccy/go-json v0.10.3 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/gotd/contrib v0.20.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/julienschmidt/httprouter v1.3.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/reedsolomon v1.12.3 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect + github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df // indirect + github.com/shopspring/decimal v1.4.0 // indirect + go.etcd.io/bbolt v1.3.10 // indirect + go.sia.tech/gofakes3 v0.0.4 // indirect + go.sia.tech/hostd v1.1.3-0.20240820000212-be52ed2b3528 // indirect + go.sia.tech/jape v0.12.0 // indirect + go.sia.tech/mux v1.2.0 // indirect + go.sia.tech/renterd v1.0.8-0.20240819141600-60ee37f3596c // indirect + go.sia.tech/walletd v0.8.1-0.20240817143605-6f9aaeec1812 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/net v0.27.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/text v0.17.0 // indirect + golang.org/x/time v0.6.0 // indirect + golang.org/x/tools v0.22.0 // indirect + lukechampine.com/frand v1.4.2 // indirect + nhooyr.io/websocket v1.8.17 // indirect +) diff --git a/internal/cluster/go.sum b/internal/cluster/go.sum new file mode 100644 index 000000000..b3db22e6a --- /dev/null +++ b/internal/cluster/go.sum @@ -0,0 +1,121 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/cloudflare/cloudflare-go v0.101.0 h1:SXWNSEDkbdY84iFIZGyTdWQwDfd98ljv0/4UubpleBQ= +github.com/cloudflare/cloudflare-go v0.101.0/go.mod h1:xXQHnoXKR48JlWbFS42i2al3nVqimVhcYvKnIdXLw9g= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= +github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/gotd/contrib v0.20.0 h1:1Wc4+HMQiIKYQuGHVwVksIx152HFTP6B5n88dDe0ZYw= +github.com/gotd/contrib v0.20.0/go.mod h1:P6o8W4niqhDPHLA0U+SA/L7l3BQHYLULpeHfRSePn9o= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/reedsolomon v1.12.3 h1:tzUznbfc3OFwJaTebv/QdhnFf2Xvb7gZ24XaHLBPmdc= +github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/Tq7bFKGIb4m4WI= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.75 h1:0uLrB6u6teY2Jt+cJUVi9cTvDRuBKWSRzSAcznRkwlE= +github.com/minio/minio-go/v7 v7.0.75/go.mod h1:qydcVzV8Hqtj1VtEocfxbmVFa2siu6HGa+LDEPogjD8= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 h1:GHRpF1pTW19a8tTFrMLUcfWwyC0pnifVo2ClaLq+hP8= +github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8= +github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df h1:S77Pf5fIGMa7oSwp8SQPp7Hb4ZiI38K3RNBKD2LLeEM= +github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df/go.mod h1:dcuzJZ83w/SqN9k4eQqwKYMgmKWzg/KzJAURBhRL1tc= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= +go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= +go.sia.tech/cluster v0.0.0-20240820001441-51c7ee96dadd h1:qZBFCe++If6jfPSpKnqc2r3YuwB6vHo16Q+0MY9+rqg= +go.sia.tech/cluster v0.0.0-20240820001441-51c7ee96dadd/go.mod h1:l3XsHo9m1KD4IOCSWZwnNfG49tHj/Lqnk+FgP2WXMf8= +go.sia.tech/core v0.4.4-0.20240814175157-ebc804c7119c h1:HJuHf6pBV9GOseVs3Yby3xbYzV8vZWTcsgrO2UGgQW8= +go.sia.tech/core v0.4.4-0.20240814175157-ebc804c7119c/go.mod h1:Zuq0Tn2aIXJyO0bjGu8cMeVWe+vwQnUfZhG1LCmjD5c= +go.sia.tech/coreutils v0.2.6-0.20240814205841-6bd57953a01b h1:iV7PdyUf7CC6slo4CgY+XuJ6gRS/HtZGjzLVm383rTo= +go.sia.tech/coreutils v0.2.6-0.20240814205841-6bd57953a01b/go.mod h1:TjQITC7A7u3sX22sN54SmcPcn+YmnodEqzNElAA7G/s= +go.sia.tech/gofakes3 v0.0.4 h1:Kvo8j5cVdJRBXvV1KBJ69bocY23twG8ao/HCdwuPMeI= +go.sia.tech/gofakes3 v0.0.4/go.mod h1:6hh4lETCMbyFFNWp3FRE838geY6vh1Aeas7LtYDpQdc= +go.sia.tech/hostd v1.1.3-0.20240820000212-be52ed2b3528 h1:eEXlG61s4moa93ei/w5PZ21c4UYWzap3/12wC6YACpM= +go.sia.tech/hostd v1.1.3-0.20240820000212-be52ed2b3528/go.mod h1:HCxy9lZMjqZ+OEBlufeGzBwcmEOx2SWmEAtESnO9Tx8= +go.sia.tech/jape v0.12.0 h1:13fBi7c5X8zxTQ05Cd9ZsIfRJgdvGoZqbEzH861z7BU= +go.sia.tech/jape v0.12.0/go.mod h1:wU+h6Wh5olDjkPXjF0tbZ1GDgoZ6VTi4naFw91yyWC4= +go.sia.tech/mux v1.2.0 h1:ofa1Us9mdymBbGMY2XH/lSpY8itFsKIo/Aq8zwe+GHU= +go.sia.tech/mux v1.2.0/go.mod h1:Yyo6wZelOYTyvrHmJZ6aQfRoer3o4xyKQ4NmQLJrBSo= +go.sia.tech/renterd v1.0.8-0.20240819141600-60ee37f3596c h1:olGf5i0MAcBigQmDPjAkYEzCGXtrhAIR+8pHhRYwlwU= +go.sia.tech/renterd v1.0.8-0.20240819141600-60ee37f3596c/go.mod h1:4WBm73ImkuCqUa8ry0PVcLRQcdJpDdI/wm4kHlspopM= +go.sia.tech/walletd v0.8.1-0.20240817143605-6f9aaeec1812 h1:J8rx4UsK8+OVHgALdC/D9HP+NVf4ryieyXCNG78gZ2A= +go.sia.tech/walletd v0.8.1-0.20240817143605-6f9aaeec1812/go.mod h1:ZYZ7kfgmXU6C6Xgbq8VEV8sA7SItnbCBhQqW91KCPiM= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20190829051458-42f498d34c4d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +lukechampine.com/frand v1.4.2 h1:RzFIpOvkMXuPMBb9maa4ND4wjBn71E1Jpf8BzJHMaVw= +lukechampine.com/frand v1.4.2/go.mod h1:4S/TM2ZgrKejMcKMbeLjISpJMO+/eZ1zu3vYX9dtj3s= +nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= +nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= diff --git a/internal/nextjs/go.mod b/internal/nextjs/go.mod new file mode 100644 index 000000000..e2212e793 --- /dev/null +++ b/internal/nextjs/go.mod @@ -0,0 +1,3 @@ +module go.sia.tech/web/nextjs + +go 1.23.0 diff --git a/libs/sdk/project.json b/libs/sdk/project.json index d0c68e004..f4382420c 100644 --- a/libs/sdk/project.json +++ b/libs/sdk/project.json @@ -15,7 +15,7 @@ "options": { "commands": [ "cp $(go env GOROOT)/misc/wasm/wasm_exec.js libs/sdk/src/utils/wasm_exec.js", - "GOOS=js GOARCH=wasm go build -o libs/sdk/src/resources/sdk.wasm ./sdk" + "cd sdk && GOOS=js GOARCH=wasm go build -o ../libs/sdk/src/resources/sdk.wasm ." ] } }, diff --git a/package.json b/package.json index 3d6c0640a..63f4b4ab2 100644 --- a/package.json +++ b/package.json @@ -1,201 +1,201 @@ { - "name": "web", - "version": "0.0.0", - "license": "MIT", - "engines": { - "node": ">=20.10.0" - }, - "scripts": { - "start": "nx serve", - "build": "nx build", - "test": "nx test", - "release": "changeset publish", - "version": "changeset version && npm install", - "build:wasm": "GOOS=js GOARCH=wasm go build -o apps/walletd/public/walletd.wasm ./walletd/wasm" - }, - "private": true, - "workspaces": { - "packages": [ - "libs/*", - "apps/*" - ] - }, - "dependencies": { - "@carbon/icons-react": "^10.47.0", - "@changesets/cli": "^2.25.0", - "@dnd-kit/core": "^6.1.0", - "@ledgerhq/hw-transport-web-ble": "^6.27.19", - "@ledgerhq/hw-transport-webhid": "^6.27.19", - "@mdx-js/loader": "^2.1.1", - "@mdx-js/react": "^2.1.1", - "@next/mdx": "^12.1.6", - "@notionhq/client": "^2.2.8", - "@nx-tools/nx-container": "^5.2.0", - "@radix-ui/react-accordion": "^1.0.0", - "@radix-ui/react-alert-dialog": "^1.0.0", - "@radix-ui/react-avatar": "^1.0.0", - "@radix-ui/react-checkbox": "^1.0.0", - "@radix-ui/react-dialog": "^1.0.0", - "@radix-ui/react-dropdown-menu": "^1.0.0", - "@radix-ui/react-hover-card": "^1.0.3", - "@radix-ui/react-label": "^1.0.0", - "@radix-ui/react-menu": "^1.0.0", - "@radix-ui/react-navigation-menu": "^1.1.3", - "@radix-ui/react-popover": "^1.0.0", - "@radix-ui/react-progress": "^1.0.0", - "@radix-ui/react-radio-group": "^1.0.0", - "@radix-ui/react-scroll-area": "^1.0.0", - "@radix-ui/react-separator": "^1.0.0", - "@radix-ui/react-slider": "^1.0.0", - "@radix-ui/react-switch": "^1.0.0", - "@radix-ui/react-tabs": "^1.0.0", - "@radix-ui/react-tooltip": "^1.0.0", - "@radix-ui/react-use-layout-effect": "^1.0.0", - "@react-spring/web": "^9.7.3", - "@siacentral/ledgerjs-sia": "^1.1.0", - "@tailwindcss/container-queries": "^0.1.1", - "@technically/lodash": "^4.17.0", - "@visx/axis": "^2.18.0", - "@visx/brush": "^2.18.0", - "@visx/curve": "^2.17.0", - "@visx/event": "^2.17.0", - "@visx/gradient": "^2.17.0", - "@visx/grid": "^2.18.0", - "@visx/marker": "^2.18.0", - "@visx/pattern": "^2.17.0", - "@visx/responsive": "^2.17.0", - "@visx/scale": "^2.18.0", - "@visx/shape": "^2.18.0", - "@visx/tooltip": "^2.17.0", - "@visx/xychart": "^2.18.0", - "axios": "^0.27.2", - "bignumber.js": "^9.0.2", - "blakejs": "^1.2.1", - "class-variance-authority": "^0.7.0", - "clipboard-polyfill": "^4.0.1", - "cmdk": "^0.2.0", - "core-js": "^3.6.5", - "d3-array": "^3.1.6", - "d3-time-format": "^4.1.0", - "date-fns": "^2.28.0", - "detect-gpu": "^5.0.34", - "dotenv": "^16.0.3", - "dotenv-webpack": "^7.1.0", - "encoding": "^0.1.13", - "express": "4.18.2", - "feed": "^4.2.2", - "formik": "^2.2.9", - "framer-motion": "^7.6.5", - "gray-matter": "^4.0.3", - "html-to-image": "^1.11.11", - "identicon.js": "^2.3.3", - "jest-environment-jsdom": "29.4.3", - "next": "14.0.4", - "next-mdx-remote": "^4.0.3", - "next-themes": "^0.2.1", - "node-cron": "^3.0.2", - "node-fetch": "^3.3.2", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-dropzone": "^14.2.3", - "react-globe.gl": "^2.24.2", - "react-hook-form": "^7.52.0", - "react-hot-toast": "^2.2.0", - "react-idle-timer": "^5.7.2", - "react-intersection-observer": "^9.1.0", - "react-is": "18.2.0", - "react-number-format": "^5.3.1", - "react-qr-code": "^2.0.7", - "regenerator-runtime": "0.13.7", - "remark-gfm": "^3.0.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", - "rss-parser": "^3.13.0", - "sharp": "^0.31.2", - "swr": "^2.1.1", - "tailwindcss-shadow-fill": "^1.0.1", - "tailwindcss-text-fill": "^0.2.0", - "typed.js": "^2.0.12", - "use-debounce": "^9.0.3", - "use-local-storage-state": "^18.3.3", - "usehooks-ts": "^2.9.1", - "uuid": "^9.0.0", - "yup": "^0.32.11" - }, - "devDependencies": { - "@babel/core": "^7.14.5", - "@babel/preset-react": "^7.14.5", - "@commitlint/cli": "^16.2.4", - "@commitlint/config-angular": "^16.2.4", - "@commitlint/config-conventional": "^16.2.4", - "@nx/devkit": "18.0.3", - "@nx/eslint": "18.0.3", - "@nx/eslint-plugin": "18.0.3", - "@nx/jest": "18.0.3", - "@nx/js": "18.0.3", - "@nx/next": "18.0.3", - "@nx/playwright": "18.0.3", - "@nx/react": "18.0.3", - "@nx/rollup": "18.0.3", - "@nx/webpack": "18.0.3", - "@nx/workspace": "18.0.3", - "@playwright/test": "^1.36.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", - "@rollup/plugin-wasm": "^6.2.2", - "@svgr/webpack": "8.1.0", - "@swc-node/register": "~1.6.7", - "@swc/cli": "~0.1.62", - "@swc/core": "1.3.102", - "@swc/helpers": "~0.5.2", - "@swc/jest": "0.2.20", - "@testing-library/react": "^14.0.0", - "@testing-library/user-event": "^14.5.2", - "@types/carbon__icons-react": "^10.31.2", - "@types/d3-array": "^3.0.2", - "@types/d3-time-format": "^4.0.0", - "@types/express": "4.17.17", - "@types/jest": "29.4.4", - "@types/node": "18.19.14", - "@types/react": "18.2.33", - "@types/react-dom": "18.2.14", - "@types/request": "^2.48.8", - "@types/request-promise-native": "^1.0.18", - "@typescript-eslint/eslint-plugin": "6.21.0", - "@typescript-eslint/parser": "6.21.0", - "autoprefixer": "10.4.13", - "axios-mock-adapter": "^1.22.0", - "playwright": "^1.42.1", - "babel-jest": "29.4.3", - "css-loader": "^6.4.0", - "eslint": "8.48.0", - "eslint-config-next": "13.1.1", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-playwright": "^0.15.3", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-hooks": "4.6.0", - "husky": "^7.0.4", - "jest": "29.4.3", - "msw": "^2.1.7", - "nx": "18.0.3", - "postcss": "8.4.21", - "prettier": "2.7.1", - "react-refresh": "^0.10.0", - "rollup-plugin-preserve-directives": "^0.2.0", - "style-loader": "^3.3.0", - "stylus": "0.59.0", - "stylus-loader": "^7.1.0", - "swc-loader": "^0.2.3", - "tailwind-scrollbar": "^2.0.1", - "tailwindcss": "3.2.7", - "ts-jest": "29.1.1", - "ts-node": "10.9.1", - "tslib": "^2.6.2", - "typescript": "5.3.3", - "undici": "5.28.3", - "url-loader": "^4.1.1", - "webpack": "5.88.2", - "webpack-merge": "^5.8.0" - } -} + "name": "web", + "version": "0.0.0", + "license": "MIT", + "engines": { + "node": ">=20.10.0" + }, + "scripts": { + "start": "nx serve", + "build": "nx build", + "test": "nx test", + "release": "changeset publish", + "version": "changeset version && npm install", + "build:wasm": "cd walletd && GOOS=js GOARCH=wasm go build -o ../apps/walletd/public/walletd.wasm ./wasm" + }, + "private": true, + "workspaces": { + "packages": [ + "libs/*", + "apps/*" + ] + }, + "dependencies": { + "@carbon/icons-react": "^10.47.0", + "@changesets/cli": "^2.25.0", + "@dnd-kit/core": "^6.1.0", + "@ledgerhq/hw-transport-web-ble": "^6.27.19", + "@ledgerhq/hw-transport-webhid": "^6.27.19", + "@mdx-js/loader": "^2.1.1", + "@mdx-js/react": "^2.1.1", + "@next/mdx": "^12.1.6", + "@notionhq/client": "^2.2.8", + "@nx-tools/nx-container": "^5.2.0", + "@radix-ui/react-accordion": "^1.0.0", + "@radix-ui/react-alert-dialog": "^1.0.0", + "@radix-ui/react-avatar": "^1.0.0", + "@radix-ui/react-checkbox": "^1.0.0", + "@radix-ui/react-dialog": "^1.0.0", + "@radix-ui/react-dropdown-menu": "^1.0.0", + "@radix-ui/react-hover-card": "^1.0.3", + "@radix-ui/react-label": "^1.0.0", + "@radix-ui/react-menu": "^1.0.0", + "@radix-ui/react-navigation-menu": "^1.1.3", + "@radix-ui/react-popover": "^1.0.0", + "@radix-ui/react-progress": "^1.0.0", + "@radix-ui/react-radio-group": "^1.0.0", + "@radix-ui/react-scroll-area": "^1.0.0", + "@radix-ui/react-separator": "^1.0.0", + "@radix-ui/react-slider": "^1.0.0", + "@radix-ui/react-switch": "^1.0.0", + "@radix-ui/react-tabs": "^1.0.0", + "@radix-ui/react-tooltip": "^1.0.0", + "@radix-ui/react-use-layout-effect": "^1.0.0", + "@react-spring/web": "^9.7.3", + "@siacentral/ledgerjs-sia": "^1.1.0", + "@tailwindcss/container-queries": "^0.1.1", + "@technically/lodash": "^4.17.0", + "@visx/axis": "^2.18.0", + "@visx/brush": "^2.18.0", + "@visx/curve": "^2.17.0", + "@visx/event": "^2.17.0", + "@visx/gradient": "^2.17.0", + "@visx/grid": "^2.18.0", + "@visx/marker": "^2.18.0", + "@visx/pattern": "^2.17.0", + "@visx/responsive": "^2.17.0", + "@visx/scale": "^2.18.0", + "@visx/shape": "^2.18.0", + "@visx/tooltip": "^2.17.0", + "@visx/xychart": "^2.18.0", + "axios": "^0.27.2", + "bignumber.js": "^9.0.2", + "blakejs": "^1.2.1", + "class-variance-authority": "^0.7.0", + "clipboard-polyfill": "^4.0.1", + "cmdk": "^0.2.0", + "core-js": "^3.6.5", + "d3-array": "^3.1.6", + "d3-time-format": "^4.1.0", + "date-fns": "^2.28.0", + "detect-gpu": "^5.0.34", + "dotenv": "^16.0.3", + "dotenv-webpack": "^7.1.0", + "encoding": "^0.1.13", + "express": "4.18.2", + "feed": "^4.2.2", + "formik": "^2.2.9", + "framer-motion": "^7.6.5", + "gray-matter": "^4.0.3", + "html-to-image": "^1.11.11", + "identicon.js": "^2.3.3", + "jest-environment-jsdom": "29.4.3", + "next": "14.0.4", + "next-mdx-remote": "^4.0.3", + "next-themes": "^0.2.1", + "node-cron": "^3.0.2", + "node-fetch": "^3.3.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-dropzone": "^14.2.3", + "react-globe.gl": "^2.24.2", + "react-hook-form": "^7.52.0", + "react-hot-toast": "^2.2.0", + "react-idle-timer": "^5.7.2", + "react-intersection-observer": "^9.1.0", + "react-is": "18.2.0", + "react-number-format": "^5.3.1", + "react-qr-code": "^2.0.7", + "regenerator-runtime": "0.13.7", + "remark-gfm": "^3.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", + "rss-parser": "^3.13.0", + "sharp": "^0.31.2", + "swr": "^2.1.1", + "tailwindcss-shadow-fill": "^1.0.1", + "tailwindcss-text-fill": "^0.2.0", + "typed.js": "^2.0.12", + "use-debounce": "^9.0.3", + "use-local-storage-state": "^18.3.3", + "usehooks-ts": "^2.9.1", + "uuid": "^9.0.0", + "yup": "^0.32.11" + }, + "devDependencies": { + "@babel/core": "^7.14.5", + "@babel/preset-react": "^7.14.5", + "@commitlint/cli": "^16.2.4", + "@commitlint/config-angular": "^16.2.4", + "@commitlint/config-conventional": "^16.2.4", + "@nx/devkit": "18.0.3", + "@nx/eslint": "18.0.3", + "@nx/eslint-plugin": "18.0.3", + "@nx/jest": "18.0.3", + "@nx/js": "18.0.3", + "@nx/next": "18.0.3", + "@nx/playwright": "18.0.3", + "@nx/react": "18.0.3", + "@nx/rollup": "18.0.3", + "@nx/webpack": "18.0.3", + "@nx/workspace": "18.0.3", + "@playwright/test": "^1.36.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", + "@rollup/plugin-wasm": "^6.2.2", + "@svgr/webpack": "8.1.0", + "@swc-node/register": "~1.6.7", + "@swc/cli": "~0.1.62", + "@swc/core": "1.3.102", + "@swc/helpers": "~0.5.2", + "@swc/jest": "0.2.20", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.5.2", + "@types/carbon__icons-react": "^10.31.2", + "@types/d3-array": "^3.0.2", + "@types/d3-time-format": "^4.0.0", + "@types/express": "4.17.17", + "@types/jest": "29.4.4", + "@types/node": "18.19.14", + "@types/react": "18.2.33", + "@types/react-dom": "18.2.14", + "@types/request": "^2.48.8", + "@types/request-promise-native": "^1.0.18", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", + "autoprefixer": "10.4.13", + "axios-mock-adapter": "^1.22.0", + "playwright": "^1.42.1", + "babel-jest": "29.4.3", + "css-loader": "^6.4.0", + "eslint": "8.48.0", + "eslint-config-next": "13.1.1", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-playwright": "^0.15.3", + "eslint-plugin-react": "7.32.2", + "eslint-plugin-react-hooks": "4.6.0", + "husky": "^7.0.4", + "jest": "29.4.3", + "msw": "^2.1.7", + "nx": "18.0.3", + "postcss": "8.4.21", + "prettier": "2.7.1", + "react-refresh": "^0.10.0", + "rollup-plugin-preserve-directives": "^0.2.0", + "style-loader": "^3.3.0", + "stylus": "0.59.0", + "stylus-loader": "^7.1.0", + "swc-loader": "^0.2.3", + "tailwind-scrollbar": "^2.0.1", + "tailwindcss": "3.2.7", + "ts-jest": "29.1.1", + "ts-node": "10.9.1", + "tslib": "^2.6.2", + "typescript": "5.3.3", + "undici": "5.28.3", + "url-loader": "^4.1.1", + "webpack": "5.88.2", + "webpack-merge": "^5.8.0" + } +} \ No newline at end of file