diff --git a/.circleci/config.yml b/.circleci/config.yml index 0dafceb09..30ebaf5d9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1031,7 +1031,7 @@ workflows: requires: - build suite: utest-unit-rest - target: "./blockstore/... ./build/... ./chain/... ./conformance/... ./gateway/... ./journal/... ./lib/... ./markets/... ./paychmgr/... ./provider/... ./tools/..." + target: "./blockstore/... ./build/... ./chain/... ./conformance/... ./curiosrc/... ./gateway/... ./journal/... ./lib/... ./markets/... ./paychmgr/... ./tools/..." resource_class: 2xlarge - test: name: test-unit-storage diff --git a/.gitignore b/.gitignore index c40a76fd0..ea354ba73 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ /lotus-chainwatch /lotus-shed /lotus-sim -/lotus-provider +/curio /lotus-townhall /lotus-fountain /lotus-stats @@ -36,6 +36,9 @@ build/paramfetch.sh /darwin /linux *.snap +curio +devgen.car +localnet.json *-fuzz.zip /chain/types/work_msg/ diff --git a/Dockerfile b/Dockerfile index 14469533b..5b77b134a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -109,7 +109,7 @@ COPY --from=lotus-builder /opt/filecoin/lotus-wallet /usr/local/bin/ COPY --from=lotus-builder /opt/filecoin/lotus-gateway /usr/local/bin/ COPY --from=lotus-builder /opt/filecoin/lotus-miner /usr/local/bin/ COPY --from=lotus-builder /opt/filecoin/lotus-worker /usr/local/bin/ -COPY --from=lotus-builder /opt/filecoin/lotus-provider /usr/local/bin/ +COPY --from=lotus-builder /opt/filecoin/curio /usr/local/bin/ COPY --from=lotus-builder /opt/filecoin/lotus-stats /usr/local/bin/ COPY --from=lotus-builder /opt/filecoin/lotus-fountain /usr/local/bin/ @@ -118,13 +118,13 @@ RUN mkdir /var/lib/lotus RUN mkdir /var/lib/lotus-miner RUN mkdir /var/lib/lotus-worker RUN mkdir /var/lib/lotus-wallet -RUN mkdir /var/lib/lotus-provider +RUN mkdir /var/lib/curio RUN chown fc: /var/tmp/filecoin-proof-parameters RUN chown fc: /var/lib/lotus RUN chown fc: /var/lib/lotus-miner RUN chown fc: /var/lib/lotus-worker RUN chown fc: /var/lib/lotus-wallet -RUN chown fc: /var/lib/lotus-provider +RUN chown fc: /var/lib/curio VOLUME /var/tmp/filecoin-proof-parameters @@ -132,7 +132,7 @@ VOLUME /var/lib/lotus VOLUME /var/lib/lotus-miner VOLUME /var/lib/lotus-worker VOLUME /var/lib/lotus-wallet -VOLUME /var/lib/lotus-provider +VOLUME /var/lib/curio EXPOSE 1234 EXPOSE 2345 diff --git a/Makefile b/Makefile index 5724e38fa..6a1c9cc8a 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ CLEAN+=build/.update-modules deps: $(BUILD_DEPS) .PHONY: deps -build-devnets: build lotus-seed lotus-shed lotus-provider +build-devnets: build lotus-seed lotus-shed curio .PHONY: build-devnets debug: GOFLAGS+=-tags=debug @@ -97,14 +97,14 @@ lotus-miner: $(BUILD_DEPS) .PHONY: lotus-miner BINS+=lotus-miner -lotus-provider: $(BUILD_DEPS) - rm -f lotus-provider - $(GOCC) build $(GOFLAGS) -o lotus-provider ./cmd/lotus-provider -.PHONY: lotus-provider -BINS+=lotus-provider +curio: $(BUILD_DEPS) + rm -f curio + $(GOCC) build $(GOFLAGS) -o curio ./cmd/curio +.PHONY: curio +BINS+=curio -lp2k: GOFLAGS+=-tags=2k -lp2k: lotus-provider +cu2k: GOFLAGS+=-tags=2k +cu2k: curio lotus-worker: $(BUILD_DEPS) rm -f lotus-worker @@ -124,13 +124,13 @@ lotus-gateway: $(BUILD_DEPS) .PHONY: lotus-gateway BINS+=lotus-gateway -build: lotus lotus-miner lotus-worker lotus-provider +build: lotus lotus-miner lotus-worker curio @[[ $$(type -P "lotus") ]] && echo "Caution: you have \ an existing lotus binary in your PATH. This may cause problems if you don't run 'sudo make install'" || true .PHONY: build -install: install-daemon install-miner install-worker install-provider +install: install-daemon install-miner install-worker install-curio install-daemon: install -C ./lotus /usr/local/bin/lotus @@ -138,8 +138,8 @@ install-daemon: install-miner: install -C ./lotus-miner /usr/local/bin/lotus-miner -install-provider: - install -C ./lotus-provider /usr/local/bin/lotus-provider +install-curio: + install -C ./curio /usr/local/bin/curio install-worker: install -C ./lotus-worker /usr/local/bin/lotus-worker @@ -156,8 +156,8 @@ uninstall-daemon: uninstall-miner: rm -f /usr/local/bin/lotus-miner -uninstall-provider: - rm -f /usr/local/bin/lotus-provider +uninstall-curio: + rm -f /usr/local/bin/curio uninstall-worker: rm -f /usr/local/bin/lotus-worker @@ -260,13 +260,13 @@ install-miner-service: install-miner install-daemon-service @echo "To start the service, run: 'sudo systemctl start lotus-miner'" @echo "To enable the service on startup, run: 'sudo systemctl enable lotus-miner'" -install-provider-service: install-provider install-daemon-service +install-curio-service: install-curio install-daemon-service mkdir -p /etc/systemd/system mkdir -p /var/log/lotus - install -C -m 0644 ./scripts/lotus-provider.service /etc/systemd/system/lotus-provider.service + install -C -m 0644 ./scripts/curio.service /etc/systemd/system/curio.service systemctl daemon-reload @echo - @echo "lotus-provider service installed. Don't forget to run 'sudo systemctl start lotus-provider' to start it and 'sudo systemctl enable lotus-provider' for it to be enabled on startup." + @echo "Curio service installed. Don't forget to run 'sudo systemctl start curio' to start it and 'sudo systemctl enable curio' for it to be enabled on startup." install-main-services: install-miner-service @@ -286,10 +286,10 @@ clean-miner-service: rm -f /etc/systemd/system/lotus-miner.service systemctl daemon-reload -clean-provider-service: - -systemctl stop lotus-provider - -systemctl disable lotus-provider - rm -f /etc/systemd/system/lotus-provider.service +clean-curio-service: + -systemctl stop curio + -systemctl disable curio + rm -f /etc/systemd/system/curio.service systemctl daemon-reload clean-main-services: clean-daemon-service @@ -366,7 +366,7 @@ docsgen-md-bin: api-gen actors-gen docsgen-openrpc-bin: api-gen actors-gen $(GOCC) build $(GOFLAGS) -o docgen-openrpc ./api/docgen-openrpc/cmd -docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker docsgen-md-provider +docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker docsgen-md-curio docsgen-md-full: docsgen-md-bin ./docgen-md "api/api_full.go" "FullNode" "api" "./api" > documentation/en/api-v1-unstable-methods.md @@ -375,8 +375,8 @@ docsgen-md-storage: docsgen-md-bin ./docgen-md "api/api_storage.go" "StorageMiner" "api" "./api" > documentation/en/api-v0-methods-miner.md docsgen-md-worker: docsgen-md-bin ./docgen-md "api/api_worker.go" "Worker" "api" "./api" > documentation/en/api-v0-methods-worker.md -docsgen-md-provider: docsgen-md-bin - ./docgen-md "api/api_lp.go" "Provider" "api" "./api" > documentation/en/api-v0-methods-provider.md +docsgen-md-curio: docsgen-md-bin + ./docgen-md "api/api_curio.go" "Curio" "api" "./api" > documentation/en/api-v0-methods-curio.md docsgen-openrpc: docsgen-openrpc-full docsgen-openrpc-storage docsgen-openrpc-worker docsgen-openrpc-gateway @@ -401,16 +401,16 @@ gen: actors-code-gen type-gen cfgdoc-gen docsgen api-gen circleci jen: gen -snap: lotus lotus-miner lotus-worker lotus-provider +snap: lotus lotus-miner lotus-worker curio snapcraft # snapcraft upload ./lotus_*.snap # separate from gen because it needs binaries -docsgen-cli: lotus lotus-miner lotus-worker lotus-provider +docsgen-cli: lotus lotus-miner lotus-worker curio python3 ./scripts/generate-lotus-cli.py ./lotus config default > documentation/en/default-lotus-config.toml ./lotus-miner config default > documentation/en/default-lotus-miner-config.toml - ./lotus-provider config default > documentation/en/default-lotus-provider-config.toml + ./curio config default > documentation/en/default-curio-config.toml .PHONY: docsgen-cli print-%: diff --git a/api/api_lp.go b/api/api_curio.go similarity index 98% rename from api/api_lp.go rename to api/api_curio.go index 15e219fa5..c94c8a9ab 100644 --- a/api/api_lp.go +++ b/api/api_curio.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/storiface" ) -type LotusProvider interface { +type Curio interface { Version(context.Context) (Version, error) //perm:admin AllocatePieceToSector(ctx context.Context, maddr address.Address, piece PieceDealInfo, rawSize int64, source url.URL, header http.Header) (SectorOffset, error) //perm:write diff --git a/api/client/client.go b/api/client/client.go index 4d51221f9..4a8ff9272 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -15,9 +15,9 @@ import ( "github.com/filecoin-project/lotus/lib/rpcenc" ) -// NewProviderRpc creates a new http jsonrpc client. -func NewProviderRpc(ctx context.Context, addr string, requestHeader http.Header) (api.LotusProvider, jsonrpc.ClientCloser, error) { - var res v1api.LotusProviderStruct +// NewCurioRpc creates a new http jsonrpc client. +func NewCurioRpc(ctx context.Context, addr string, requestHeader http.Header) (api.Curio, jsonrpc.ClientCloser, error) { + var res v1api.CurioStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader, jsonrpc.WithErrors(api.RPCErrors)) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 29ac1d3e8..2d34a0903 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -456,10 +456,10 @@ func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []r i = &api.GatewayStruct{} t = reflect.TypeOf(new(struct{ api.Gateway })).Elem() permStruct = append(permStruct, reflect.TypeOf(api.GatewayStruct{}.Internal)) - case "Provider": - i = &api.LotusProviderStruct{} - t = reflect.TypeOf(new(struct{ api.LotusProvider })).Elem() - permStruct = append(permStruct, reflect.TypeOf(api.LotusProviderStruct{}.Internal)) + case "Curio": + i = &api.CurioStruct{} + t = reflect.TypeOf(new(struct{ api.Curio })).Elem() + permStruct = append(permStruct, reflect.TypeOf(api.CurioStruct{}.Internal)) default: panic("unknown type") } diff --git a/api/proxy_gen.go b/api/proxy_gen.go index ae48591ec..58214ae8b 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -115,6 +115,35 @@ type CommonNetStub struct { NetStub } +type CurioStruct struct { + Internal CurioMethods +} + +type CurioMethods struct { + AllocatePieceToSector func(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) `perm:"write"` + + Shutdown func(p0 context.Context) error `perm:"admin"` + + StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"` + + StorageDetachLocal func(p0 context.Context, p1 string) error `perm:"admin"` + + StorageFindSector func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) `perm:"admin"` + + StorageInfo func(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) `perm:"admin"` + + StorageList func(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) `perm:"admin"` + + StorageLocal func(p0 context.Context) (map[storiface.ID]string, error) `perm:"admin"` + + StorageStat func(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) `perm:"admin"` + + Version func(p0 context.Context) (Version, error) `perm:"admin"` +} + +type CurioStub struct { +} + type EthSubscriberStruct struct { Internal EthSubscriberMethods } @@ -849,35 +878,6 @@ type GatewayMethods struct { type GatewayStub struct { } -type LotusProviderStruct struct { - Internal LotusProviderMethods -} - -type LotusProviderMethods struct { - AllocatePieceToSector func(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) `perm:"write"` - - Shutdown func(p0 context.Context) error `perm:"admin"` - - StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"` - - StorageDetachLocal func(p0 context.Context, p1 string) error `perm:"admin"` - - StorageFindSector func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) `perm:"admin"` - - StorageInfo func(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) `perm:"admin"` - - StorageList func(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) `perm:"admin"` - - StorageLocal func(p0 context.Context) (map[storiface.ID]string, error) `perm:"admin"` - - StorageStat func(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) `perm:"admin"` - - Version func(p0 context.Context) (Version, error) `perm:"admin"` -} - -type LotusProviderStub struct { -} - type NetStruct struct { Internal NetMethods } @@ -1488,6 +1488,116 @@ func (s *CommonStub) Version(p0 context.Context) (APIVersion, error) { return *new(APIVersion), ErrNotSupported } +func (s *CurioStruct) AllocatePieceToSector(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) { + if s.Internal.AllocatePieceToSector == nil { + return *new(SectorOffset), ErrNotSupported + } + return s.Internal.AllocatePieceToSector(p0, p1, p2, p3, p4, p5) +} + +func (s *CurioStub) AllocatePieceToSector(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) { + return *new(SectorOffset), ErrNotSupported +} + +func (s *CurioStruct) Shutdown(p0 context.Context) error { + if s.Internal.Shutdown == nil { + return ErrNotSupported + } + return s.Internal.Shutdown(p0) +} + +func (s *CurioStub) Shutdown(p0 context.Context) error { + return ErrNotSupported +} + +func (s *CurioStruct) StorageAddLocal(p0 context.Context, p1 string) error { + if s.Internal.StorageAddLocal == nil { + return ErrNotSupported + } + return s.Internal.StorageAddLocal(p0, p1) +} + +func (s *CurioStub) StorageAddLocal(p0 context.Context, p1 string) error { + return ErrNotSupported +} + +func (s *CurioStruct) StorageDetachLocal(p0 context.Context, p1 string) error { + if s.Internal.StorageDetachLocal == nil { + return ErrNotSupported + } + return s.Internal.StorageDetachLocal(p0, p1) +} + +func (s *CurioStub) StorageDetachLocal(p0 context.Context, p1 string) error { + return ErrNotSupported +} + +func (s *CurioStruct) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) { + if s.Internal.StorageFindSector == nil { + return *new([]storiface.SectorStorageInfo), ErrNotSupported + } + return s.Internal.StorageFindSector(p0, p1, p2, p3, p4) +} + +func (s *CurioStub) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) { + return *new([]storiface.SectorStorageInfo), ErrNotSupported +} + +func (s *CurioStruct) StorageInfo(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) { + if s.Internal.StorageInfo == nil { + return *new(storiface.StorageInfo), ErrNotSupported + } + return s.Internal.StorageInfo(p0, p1) +} + +func (s *CurioStub) StorageInfo(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) { + return *new(storiface.StorageInfo), ErrNotSupported +} + +func (s *CurioStruct) StorageList(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) { + if s.Internal.StorageList == nil { + return *new(map[storiface.ID][]storiface.Decl), ErrNotSupported + } + return s.Internal.StorageList(p0) +} + +func (s *CurioStub) StorageList(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) { + return *new(map[storiface.ID][]storiface.Decl), ErrNotSupported +} + +func (s *CurioStruct) StorageLocal(p0 context.Context) (map[storiface.ID]string, error) { + if s.Internal.StorageLocal == nil { + return *new(map[storiface.ID]string), ErrNotSupported + } + return s.Internal.StorageLocal(p0) +} + +func (s *CurioStub) StorageLocal(p0 context.Context) (map[storiface.ID]string, error) { + return *new(map[storiface.ID]string), ErrNotSupported +} + +func (s *CurioStruct) StorageStat(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) { + if s.Internal.StorageStat == nil { + return *new(fsutil.FsStat), ErrNotSupported + } + return s.Internal.StorageStat(p0, p1) +} + +func (s *CurioStub) StorageStat(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) { + return *new(fsutil.FsStat), ErrNotSupported +} + +func (s *CurioStruct) Version(p0 context.Context) (Version, error) { + if s.Internal.Version == nil { + return *new(Version), ErrNotSupported + } + return s.Internal.Version(p0) +} + +func (s *CurioStub) Version(p0 context.Context) (Version, error) { + return *new(Version), ErrNotSupported +} + func (s *EthSubscriberStruct) EthSubscription(p0 context.Context, p1 jsonrpc.RawParams) error { if s.Internal.EthSubscription == nil { return ErrNotSupported @@ -5338,116 +5448,6 @@ func (s *GatewayStub) Web3ClientVersion(p0 context.Context) (string, error) { return "", ErrNotSupported } -func (s *LotusProviderStruct) AllocatePieceToSector(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) { - if s.Internal.AllocatePieceToSector == nil { - return *new(SectorOffset), ErrNotSupported - } - return s.Internal.AllocatePieceToSector(p0, p1, p2, p3, p4, p5) -} - -func (s *LotusProviderStub) AllocatePieceToSector(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) { - return *new(SectorOffset), ErrNotSupported -} - -func (s *LotusProviderStruct) Shutdown(p0 context.Context) error { - if s.Internal.Shutdown == nil { - return ErrNotSupported - } - return s.Internal.Shutdown(p0) -} - -func (s *LotusProviderStub) Shutdown(p0 context.Context) error { - return ErrNotSupported -} - -func (s *LotusProviderStruct) StorageAddLocal(p0 context.Context, p1 string) error { - if s.Internal.StorageAddLocal == nil { - return ErrNotSupported - } - return s.Internal.StorageAddLocal(p0, p1) -} - -func (s *LotusProviderStub) StorageAddLocal(p0 context.Context, p1 string) error { - return ErrNotSupported -} - -func (s *LotusProviderStruct) StorageDetachLocal(p0 context.Context, p1 string) error { - if s.Internal.StorageDetachLocal == nil { - return ErrNotSupported - } - return s.Internal.StorageDetachLocal(p0, p1) -} - -func (s *LotusProviderStub) StorageDetachLocal(p0 context.Context, p1 string) error { - return ErrNotSupported -} - -func (s *LotusProviderStruct) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) { - if s.Internal.StorageFindSector == nil { - return *new([]storiface.SectorStorageInfo), ErrNotSupported - } - return s.Internal.StorageFindSector(p0, p1, p2, p3, p4) -} - -func (s *LotusProviderStub) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) { - return *new([]storiface.SectorStorageInfo), ErrNotSupported -} - -func (s *LotusProviderStruct) StorageInfo(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) { - if s.Internal.StorageInfo == nil { - return *new(storiface.StorageInfo), ErrNotSupported - } - return s.Internal.StorageInfo(p0, p1) -} - -func (s *LotusProviderStub) StorageInfo(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) { - return *new(storiface.StorageInfo), ErrNotSupported -} - -func (s *LotusProviderStruct) StorageList(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) { - if s.Internal.StorageList == nil { - return *new(map[storiface.ID][]storiface.Decl), ErrNotSupported - } - return s.Internal.StorageList(p0) -} - -func (s *LotusProviderStub) StorageList(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) { - return *new(map[storiface.ID][]storiface.Decl), ErrNotSupported -} - -func (s *LotusProviderStruct) StorageLocal(p0 context.Context) (map[storiface.ID]string, error) { - if s.Internal.StorageLocal == nil { - return *new(map[storiface.ID]string), ErrNotSupported - } - return s.Internal.StorageLocal(p0) -} - -func (s *LotusProviderStub) StorageLocal(p0 context.Context) (map[storiface.ID]string, error) { - return *new(map[storiface.ID]string), ErrNotSupported -} - -func (s *LotusProviderStruct) StorageStat(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) { - if s.Internal.StorageStat == nil { - return *new(fsutil.FsStat), ErrNotSupported - } - return s.Internal.StorageStat(p0, p1) -} - -func (s *LotusProviderStub) StorageStat(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) { - return *new(fsutil.FsStat), ErrNotSupported -} - -func (s *LotusProviderStruct) Version(p0 context.Context) (Version, error) { - if s.Internal.Version == nil { - return *new(Version), ErrNotSupported - } - return s.Internal.Version(p0) -} - -func (s *LotusProviderStub) Version(p0 context.Context) (Version, error) { - return *new(Version), ErrNotSupported -} - func (s *NetStruct) ID(p0 context.Context) (peer.ID, error) { if s.Internal.ID == nil { return *new(peer.ID), ErrNotSupported @@ -7673,10 +7673,10 @@ func (s *WorkerStub) WaitQuiet(p0 context.Context) error { var _ ChainIO = new(ChainIOStruct) var _ Common = new(CommonStruct) var _ CommonNet = new(CommonNetStruct) +var _ Curio = new(CurioStruct) var _ EthSubscriber = new(EthSubscriberStruct) var _ FullNode = new(FullNodeStruct) var _ Gateway = new(GatewayStruct) -var _ LotusProvider = new(LotusProviderStruct) var _ Net = new(NetStruct) var _ Signable = new(SignableStruct) var _ StorageMiner = new(StorageMinerStruct) diff --git a/api/v1api/latest.go b/api/v1api/latest.go index b8eeed2de..a1e63b6ad 100644 --- a/api/v1api/latest.go +++ b/api/v1api/latest.go @@ -13,4 +13,4 @@ func PermissionedFullAPI(a FullNode) FullNode { return api.PermissionedFullAPI(a) } -type LotusProviderStruct = api.LotusProviderStruct +type CurioStruct = api.CurioStruct diff --git a/api/version.go b/api/version.go index e968bf93b..124f53dab 100644 --- a/api/version.go +++ b/api/version.go @@ -60,7 +60,7 @@ var ( MinerAPIVersion0 = newVer(1, 5, 0) WorkerAPIVersion0 = newVer(1, 7, 0) - ProviderAPIVersion0 = newVer(1, 0, 0) + CurioAPIVersion0 = newVer(1, 0, 0) ) //nolint:varcheck,deadcode diff --git a/build/openrpc/full.json b/build/openrpc/full.json index 993eb4fe4..bf949dbf5 100644 --- a/build/openrpc/full.json +++ b/build/openrpc/full.json @@ -37,7 +37,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1502" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1612" } }, { @@ -60,7 +60,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1513" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1623" } }, { @@ -103,7 +103,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1524" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1634" } }, { @@ -214,7 +214,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1546" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1656" } }, { @@ -454,7 +454,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1557" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1667" } }, { @@ -685,7 +685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1568" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1678" } }, { @@ -784,7 +784,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1579" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1689" } }, { @@ -816,7 +816,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1590" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1700" } }, { @@ -922,7 +922,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1601" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1711" } }, { @@ -1019,7 +1019,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1612" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1722" } }, { @@ -1078,7 +1078,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1623" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1733" } }, { @@ -1171,7 +1171,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1634" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1744" } }, { @@ -1255,7 +1255,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1645" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1755" } }, { @@ -1355,7 +1355,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1656" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1766" } }, { @@ -1411,7 +1411,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1667" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1777" } }, { @@ -1484,7 +1484,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1678" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1788" } }, { @@ -1557,7 +1557,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1689" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1799" } }, { @@ -1604,7 +1604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1700" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1810" } }, { @@ -1636,7 +1636,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1711" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1821" } }, { @@ -1691,7 +1691,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1722" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1832" } }, { @@ -1743,7 +1743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1744" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1854" } }, { @@ -1780,7 +1780,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1755" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1865" } }, { @@ -1827,7 +1827,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1766" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1876" } }, { @@ -1874,7 +1874,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1777" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1887" } }, { @@ -1954,7 +1954,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1788" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1898" } }, { @@ -2006,7 +2006,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1799" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1909" } }, { @@ -2065,7 +2065,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1810" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1920" } }, { @@ -2136,7 +2136,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1821" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1931" } }, { @@ -2177,7 +2177,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1832" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1942" } }, { @@ -2245,7 +2245,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1854" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1964" } }, { @@ -2306,7 +2306,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1865" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1975" } }, { @@ -2413,7 +2413,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1876" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1986" } }, { @@ -2569,7 +2569,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1887" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1997" } }, { @@ -2635,7 +2635,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1898" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2008" } }, { @@ -2976,7 +2976,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1909" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2019" } }, { @@ -3021,7 +3021,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1920" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2030" } }, { @@ -3068,7 +3068,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1953" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2063" } }, { @@ -3139,7 +3139,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1964" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2074" } }, { @@ -3282,7 +3282,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1975" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2085" } }, { @@ -3612,7 +3612,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1986" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2096" } }, { @@ -3680,7 +3680,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1997" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2107" } }, { @@ -3914,7 +3914,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2008" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2118" } }, { @@ -4077,7 +4077,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2019" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2129" } }, { @@ -4160,7 +4160,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2030" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2140" } }, { @@ -4201,7 +4201,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2041" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2151" } }, { @@ -4272,7 +4272,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2052" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2162" } }, { @@ -4416,7 +4416,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2063" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2173" } }, { @@ -4456,7 +4456,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2074" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2184" } }, { @@ -4497,7 +4497,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2085" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2195" } }, { @@ -4622,7 +4622,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2096" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2206" } }, { @@ -4747,7 +4747,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2107" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2217" } }, { @@ -4786,7 +4786,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2118" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2228" } }, { @@ -4833,7 +4833,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2129" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2239" } }, { @@ -4888,7 +4888,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2140" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2250" } }, { @@ -4917,7 +4917,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2151" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2261" } }, { @@ -5054,7 +5054,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2162" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2272" } }, { @@ -5083,7 +5083,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2173" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2283" } }, { @@ -5137,7 +5137,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2184" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2294" } }, { @@ -5228,7 +5228,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2195" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2305" } }, { @@ -5256,7 +5256,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2206" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2316" } }, { @@ -5346,7 +5346,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2217" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2327" } }, { @@ -5602,7 +5602,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2228" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2338" } }, { @@ -5847,7 +5847,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2239" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2349" } }, { @@ -5903,7 +5903,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2250" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2360" } }, { @@ -5950,7 +5950,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2261" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2371" } }, { @@ -6048,7 +6048,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2272" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2382" } }, { @@ -6114,7 +6114,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2283" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2393" } }, { @@ -6180,7 +6180,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2294" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2404" } }, { @@ -6289,7 +6289,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2305" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2415" } }, { @@ -6347,7 +6347,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2316" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2426" } }, { @@ -6469,7 +6469,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2327" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2437" } }, { @@ -6673,7 +6673,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2338" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2448" } }, { @@ -6868,7 +6868,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2349" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2459" } }, { @@ -7055,7 +7055,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2360" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2470" } }, { @@ -7259,7 +7259,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2371" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2481" } }, { @@ -7350,7 +7350,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2382" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2492" } }, { @@ -7408,7 +7408,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2393" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2503" } }, { @@ -7666,7 +7666,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2404" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2514" } }, { @@ -7941,7 +7941,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2415" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2525" } }, { @@ -7969,7 +7969,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2426" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2536" } }, { @@ -8007,7 +8007,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2437" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2547" } }, { @@ -8115,7 +8115,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2448" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2558" } }, { @@ -8153,7 +8153,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2459" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2569" } }, { @@ -8182,7 +8182,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2470" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2580" } }, { @@ -8245,7 +8245,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2481" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2591" } }, { @@ -8308,7 +8308,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2492" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2602" } }, { @@ -8353,7 +8353,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2503" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2613" } }, { @@ -8475,7 +8475,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2514" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2624" } }, { @@ -8630,7 +8630,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2525" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2635" } }, { @@ -8684,7 +8684,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2536" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2646" } }, { @@ -8738,7 +8738,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2547" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2657" } }, { @@ -8793,7 +8793,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2558" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2668" } }, { @@ -8936,7 +8936,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2569" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2679" } }, { @@ -9063,7 +9063,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2580" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2690" } }, { @@ -9165,7 +9165,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2591" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2701" } }, { @@ -9388,7 +9388,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2602" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2712" } }, { @@ -9571,7 +9571,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2613" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2723" } }, { @@ -9651,7 +9651,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2624" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2734" } }, { @@ -9696,7 +9696,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2635" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2745" } }, { @@ -9752,7 +9752,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2646" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2756" } }, { @@ -9832,7 +9832,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2657" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2767" } }, { @@ -9912,7 +9912,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2668" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2778" } }, { @@ -10397,7 +10397,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2679" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2789" } }, { @@ -10591,7 +10591,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2690" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2800" } }, { @@ -10746,7 +10746,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2701" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2811" } }, { @@ -10995,7 +10995,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2712" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2822" } }, { @@ -11150,7 +11150,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2723" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2833" } }, { @@ -11327,7 +11327,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2734" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2844" } }, { @@ -11425,7 +11425,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2745" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2855" } }, { @@ -11590,7 +11590,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2756" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2866" } }, { @@ -11629,7 +11629,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2767" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2877" } }, { @@ -11694,7 +11694,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2778" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2888" } }, { @@ -11740,7 +11740,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2789" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2899" } }, { @@ -11890,7 +11890,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2800" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2910" } }, { @@ -12027,7 +12027,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2811" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2921" } }, { @@ -12258,7 +12258,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2822" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2932" } }, { @@ -12395,7 +12395,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2833" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2943" } }, { @@ -12560,7 +12560,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2844" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2954" } }, { @@ -12637,7 +12637,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2855" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2965" } }, { @@ -12832,7 +12832,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2877" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2987" } }, { @@ -13011,7 +13011,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2888" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2998" } }, { @@ -13173,7 +13173,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2899" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3009" } }, { @@ -13321,7 +13321,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2910" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3020" } }, { @@ -13549,7 +13549,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2921" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3031" } }, { @@ -13697,7 +13697,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2932" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3042" } }, { @@ -13909,7 +13909,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2943" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3053" } }, { @@ -14115,7 +14115,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2954" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3064" } }, { @@ -14183,7 +14183,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2965" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3075" } }, { @@ -14300,7 +14300,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2976" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3086" } }, { @@ -14391,7 +14391,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2987" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3097" } }, { @@ -14477,7 +14477,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2998" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3108" } }, { @@ -14672,7 +14672,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3009" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3119" } }, { @@ -14834,7 +14834,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3020" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3130" } }, { @@ -15030,7 +15030,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3031" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3141" } }, { @@ -15210,7 +15210,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3042" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3152" } }, { @@ -15373,7 +15373,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3053" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3163" } }, { @@ -15400,7 +15400,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3064" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3174" } }, { @@ -15427,7 +15427,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3075" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3185" } }, { @@ -15526,7 +15526,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3086" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3196" } }, { @@ -15572,7 +15572,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3097" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3207" } }, { @@ -15672,7 +15672,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3108" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3218" } }, { @@ -15788,7 +15788,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3119" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3229" } }, { @@ -15836,7 +15836,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3130" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3240" } }, { @@ -15928,7 +15928,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3141" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3251" } }, { @@ -16043,7 +16043,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3152" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3262" } }, { @@ -16091,7 +16091,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3163" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3273" } }, { @@ -16128,7 +16128,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3174" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3284" } }, { @@ -16400,7 +16400,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3185" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3295" } }, { @@ -16448,7 +16448,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3196" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3306" } }, { @@ -16506,7 +16506,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3207" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3317" } }, { @@ -16711,7 +16711,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3218" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3328" } }, { @@ -16914,7 +16914,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3229" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3339" } }, { @@ -17083,7 +17083,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3240" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3350" } }, { @@ -17287,7 +17287,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3251" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3361" } }, { @@ -17454,7 +17454,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3262" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3372" } }, { @@ -17661,7 +17661,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3273" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3383" } }, { @@ -17729,7 +17729,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3284" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3394" } }, { @@ -17781,7 +17781,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3295" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3405" } }, { @@ -17830,7 +17830,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3306" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3416" } }, { @@ -17921,7 +17921,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3317" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3427" } }, { @@ -18427,7 +18427,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3328" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3438" } }, { @@ -18533,7 +18533,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3339" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3449" } }, { @@ -18585,7 +18585,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3350" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3460" } }, { @@ -19137,7 +19137,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3361" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3471" } }, { @@ -19251,7 +19251,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3372" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3482" } }, { @@ -19348,7 +19348,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3383" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3493" } }, { @@ -19448,7 +19448,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3394" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3504" } }, { @@ -19536,7 +19536,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3405" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3515" } }, { @@ -19636,7 +19636,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3416" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3526" } }, { @@ -19723,7 +19723,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3427" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3537" } }, { @@ -19814,7 +19814,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3438" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3548" } }, { @@ -19939,7 +19939,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3449" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3559" } }, { @@ -20048,7 +20048,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3460" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3570" } }, { @@ -20118,7 +20118,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3471" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3581" } }, { @@ -20221,7 +20221,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3482" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3592" } }, { @@ -20282,7 +20282,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3493" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3603" } }, { @@ -20412,7 +20412,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3504" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3614" } }, { @@ -20519,7 +20519,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3515" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3625" } }, { @@ -20728,7 +20728,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3526" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3636" } }, { @@ -20805,7 +20805,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3537" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3647" } }, { @@ -20882,7 +20882,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3548" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3658" } }, { @@ -20991,7 +20991,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3559" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3669" } }, { @@ -21100,7 +21100,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3570" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3680" } }, { @@ -21161,7 +21161,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3581" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3691" } }, { @@ -21271,7 +21271,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3592" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3702" } }, { @@ -21332,7 +21332,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3603" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3713" } }, { @@ -21400,7 +21400,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3614" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3724" } }, { @@ -21468,7 +21468,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3625" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3735" } }, { @@ -21549,7 +21549,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3636" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3746" } }, { @@ -21698,7 +21698,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3647" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3757" } }, { @@ -21770,7 +21770,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3658" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3768" } }, { @@ -21929,7 +21929,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3669" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3779" } }, { @@ -22094,7 +22094,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3680" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3790" } }, { @@ -22164,7 +22164,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3691" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3801" } }, { @@ -22232,7 +22232,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3702" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3812" } }, { @@ -22325,7 +22325,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3713" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3823" } }, { @@ -22396,7 +22396,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3724" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3834" } }, { @@ -22597,7 +22597,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3735" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3845" } }, { @@ -22729,7 +22729,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3746" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3856" } }, { @@ -22866,7 +22866,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3757" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3867" } }, { @@ -22977,7 +22977,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3768" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3878" } }, { @@ -23109,7 +23109,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3779" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3889" } }, { @@ -23240,7 +23240,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3790" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3900" } }, { @@ -23311,7 +23311,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3801" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3911" } }, { @@ -23395,7 +23395,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3812" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3922" } }, { @@ -23481,7 +23481,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3823" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3933" } }, { @@ -23664,7 +23664,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3834" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3944" } }, { @@ -23691,7 +23691,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3845" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3955" } }, { @@ -23744,7 +23744,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3856" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3966" } }, { @@ -23832,7 +23832,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3867" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3977" } }, { @@ -24283,7 +24283,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3878" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3988" } }, { @@ -24450,7 +24450,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3889" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3999" } }, { @@ -24548,7 +24548,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3900" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4010" } }, { @@ -24721,7 +24721,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3911" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4021" } }, { @@ -24819,7 +24819,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3922" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4032" } }, { @@ -24970,7 +24970,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3933" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4043" } }, { @@ -25055,7 +25055,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3944" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4054" } }, { @@ -25123,7 +25123,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3955" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4065" } }, { @@ -25175,7 +25175,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3966" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4076" } }, { @@ -25243,7 +25243,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3977" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4087" } }, { @@ -25404,7 +25404,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3988" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4098" } }, { @@ -25451,7 +25451,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4010" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4120" } }, { @@ -25498,7 +25498,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4021" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4131" } }, { @@ -25541,7 +25541,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4043" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4153" } }, { @@ -25637,7 +25637,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4054" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4164" } }, { @@ -25903,7 +25903,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4065" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4175" } }, { @@ -25926,7 +25926,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4076" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4186" } }, { @@ -25969,7 +25969,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4087" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4197" } }, { @@ -26020,7 +26020,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4098" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4208" } }, { @@ -26065,7 +26065,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4109" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4219" } }, { @@ -26093,7 +26093,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4120" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4230" } }, { @@ -26133,7 +26133,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4131" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4241" } }, { @@ -26192,7 +26192,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4142" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4252" } }, { @@ -26236,7 +26236,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4153" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4263" } }, { @@ -26295,7 +26295,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4164" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4274" } }, { @@ -26332,7 +26332,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4175" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4285" } }, { @@ -26376,7 +26376,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4186" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4296" } }, { @@ -26416,7 +26416,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4197" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4307" } }, { @@ -26491,7 +26491,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4208" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4318" } }, { @@ -26699,7 +26699,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4219" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4329" } }, { @@ -26743,7 +26743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4230" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4340" } }, { @@ -26833,7 +26833,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4241" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4351" } }, { @@ -26860,7 +26860,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4252" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4362" } } ] diff --git a/build/openrpc/gateway.json b/build/openrpc/gateway.json index 94e2dcd1c..b2ffc2ab5 100644 --- a/build/openrpc/gateway.json +++ b/build/openrpc/gateway.json @@ -242,7 +242,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4263" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4373" } }, { @@ -473,7 +473,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4274" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4384" } }, { @@ -572,7 +572,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4285" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4395" } }, { @@ -604,7 +604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4296" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4406" } }, { @@ -710,7 +710,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4307" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4417" } }, { @@ -803,7 +803,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4318" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4428" } }, { @@ -887,7 +887,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4329" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4439" } }, { @@ -987,7 +987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4340" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4450" } }, { @@ -1043,7 +1043,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4351" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4461" } }, { @@ -1116,7 +1116,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4362" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4472" } }, { @@ -1189,7 +1189,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4373" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4483" } }, { @@ -1236,7 +1236,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4384" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4494" } }, { @@ -1268,7 +1268,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4395" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4505" } }, { @@ -1305,7 +1305,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4417" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4527" } }, { @@ -1352,7 +1352,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4428" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4538" } }, { @@ -1392,7 +1392,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4439" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4549" } }, { @@ -1439,7 +1439,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4450" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4560" } }, { @@ -1468,7 +1468,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4461" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4571" } }, { @@ -1605,7 +1605,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4472" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4582" } }, { @@ -1634,7 +1634,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4483" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4593" } }, { @@ -1688,7 +1688,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4494" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4604" } }, { @@ -1779,7 +1779,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4505" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4615" } }, { @@ -1807,7 +1807,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4516" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4626" } }, { @@ -1897,7 +1897,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4527" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4637" } }, { @@ -2153,7 +2153,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4538" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4648" } }, { @@ -2398,7 +2398,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4549" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4659" } }, { @@ -2454,7 +2454,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4560" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4670" } }, { @@ -2501,7 +2501,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4571" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4681" } }, { @@ -2599,7 +2599,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4582" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4692" } }, { @@ -2665,7 +2665,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4593" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4703" } }, { @@ -2731,7 +2731,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4604" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4714" } }, { @@ -2840,7 +2840,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4615" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4725" } }, { @@ -2898,7 +2898,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4626" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4736" } }, { @@ -3020,7 +3020,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4637" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4747" } }, { @@ -3207,7 +3207,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4648" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4758" } }, { @@ -3411,7 +3411,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4659" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4769" } }, { @@ -3502,7 +3502,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4670" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4780" } }, { @@ -3560,7 +3560,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4681" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4791" } }, { @@ -3818,7 +3818,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4692" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4802" } }, { @@ -4093,7 +4093,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4703" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4813" } }, { @@ -4121,7 +4121,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4714" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4824" } }, { @@ -4159,7 +4159,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4725" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4835" } }, { @@ -4267,7 +4267,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4736" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4846" } }, { @@ -4305,7 +4305,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4747" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4857" } }, { @@ -4334,7 +4334,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4758" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4868" } }, { @@ -4397,7 +4397,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4769" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4879" } }, { @@ -4460,7 +4460,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4780" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4890" } }, { @@ -4505,7 +4505,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4791" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4901" } }, { @@ -4627,7 +4627,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4802" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4912" } }, { @@ -4782,7 +4782,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4813" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4923" } }, { @@ -4836,7 +4836,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4824" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4934" } }, { @@ -4890,7 +4890,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4835" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4945" } }, { @@ -4992,7 +4992,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4846" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4956" } }, { @@ -5215,7 +5215,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4857" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4967" } }, { @@ -5398,7 +5398,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4868" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4978" } }, { @@ -5592,7 +5592,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4879" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4989" } }, { @@ -5638,7 +5638,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4890" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5000" } }, { @@ -5788,7 +5788,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4901" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5011" } }, { @@ -5925,7 +5925,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4912" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5022" } }, { @@ -5993,7 +5993,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4923" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5033" } }, { @@ -6110,7 +6110,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4934" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5044" } }, { @@ -6201,7 +6201,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4945" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5055" } }, { @@ -6287,7 +6287,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4956" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5066" } }, { @@ -6314,7 +6314,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4967" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5077" } }, { @@ -6341,7 +6341,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4978" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5088" } }, { @@ -6409,7 +6409,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4989" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5099" } }, { @@ -6915,7 +6915,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5000" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5110" } }, { @@ -7012,7 +7012,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5011" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5121" } }, { @@ -7112,7 +7112,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5022" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5132" } }, { @@ -7212,7 +7212,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5033" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5143" } }, { @@ -7337,7 +7337,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5044" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5154" } }, { @@ -7446,7 +7446,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5055" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5165" } }, { @@ -7549,7 +7549,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5066" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5176" } }, { @@ -7679,7 +7679,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5077" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5187" } }, { @@ -7786,7 +7786,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5088" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5198" } }, { @@ -7847,7 +7847,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5099" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5209" } }, { @@ -7915,7 +7915,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5110" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5220" } }, { @@ -7996,7 +7996,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5121" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5231" } }, { @@ -8155,7 +8155,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5132" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5242" } }, { @@ -8248,7 +8248,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5143" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5253" } }, { @@ -8449,7 +8449,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5154" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5264" } }, { @@ -8560,7 +8560,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5165" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5275" } }, { @@ -8691,7 +8691,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5176" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5286" } }, { @@ -8777,7 +8777,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5187" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5297" } }, { @@ -8804,7 +8804,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5198" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5308" } }, { @@ -8857,7 +8857,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5209" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5319" } }, { @@ -8945,7 +8945,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5220" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5330" } }, { @@ -9396,7 +9396,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5231" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5341" } }, { @@ -9563,7 +9563,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5242" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5352" } }, { @@ -9736,7 +9736,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5253" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5363" } }, { @@ -9804,7 +9804,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5264" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5374" } }, { @@ -9872,7 +9872,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5275" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5385" } }, { @@ -10033,7 +10033,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5286" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5396" } }, { @@ -10078,7 +10078,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5308" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5418" } }, { @@ -10123,7 +10123,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5319" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5429" } }, { @@ -10150,7 +10150,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5330" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5440" } } ] diff --git a/cli/util/api.go b/cli/util/api.go index fe1ac1536..7940f67c6 100644 --- a/cli/util/api.go +++ b/cli/util/api.go @@ -76,42 +76,8 @@ func GetAPIInfoMulti(ctx *cli.Context, t repo.RepoType) ([]APIInfo, error) { if path == "" { continue } - - p, err := homedir.Expand(path) - if err != nil { - return []APIInfo{}, xerrors.Errorf("could not expand home dir (%s): %w", f, err) - } - - r, err := repo.NewFS(p) - if err != nil { - return []APIInfo{}, xerrors.Errorf("could not open repo at path: %s; %w", p, err) - } - - exists, err := r.Exists() - if err != nil { - return []APIInfo{}, xerrors.Errorf("repo.Exists returned an error: %w", err) - } - - if !exists { - return []APIInfo{}, errors.New("repo directory does not exist. Make sure your configuration is correct") - } - - ma, err := r.APIEndpoint() - if err != nil { - return []APIInfo{}, xerrors.Errorf("could not get api endpoint: %w", err) - } - - token, err := r.APIToken() - if err != nil { - log.Warnf("Couldn't load CLI token, capabilities may be limited: %v", err) - } - - return []APIInfo{{ - Addr: ma.String(), - Token: token, - }}, nil + return GetAPIInfoFromRepoPath(path, t) } - for _, env := range fallbacksEnvs { env, ok := os.LookupEnv(env) if ok { @@ -122,6 +88,42 @@ func GetAPIInfoMulti(ctx *cli.Context, t repo.RepoType) ([]APIInfo, error) { return []APIInfo{}, fmt.Errorf("could not determine API endpoint for node type: %v. Try setting environment variable: %s", t.Type(), primaryEnv) } +func GetAPIInfoFromRepoPath(path string, t repo.RepoType) ([]APIInfo, error) { + p, err := homedir.Expand(path) + if err != nil { + return []APIInfo{}, xerrors.Errorf("could not expand home dir (%s): %w", path, err) + } + + r, err := repo.NewFS(p) + if err != nil { + return []APIInfo{}, xerrors.Errorf("could not open repo at path: %s; %w", p, err) + } + + exists, err := r.Exists() + if err != nil { + return []APIInfo{}, xerrors.Errorf("repo.Exists returned an error: %w", err) + } + + if !exists { + return []APIInfo{}, errors.New("repo directory does not exist. Make sure your configuration is correct") + } + + ma, err := r.APIEndpoint() + if err != nil { + return []APIInfo{}, xerrors.Errorf("could not get api endpoint: %w", err) + } + + token, err := r.APIToken() + if err != nil { + log.Warnf("Couldn't load CLI token, capabilities may be limited: %v", err) + } + + return []APIInfo{{ + Addr: ma.String(), + Token: token, + }}, nil +} + func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) { ainfos, err := GetAPIInfoMulti(ctx, t) if err != nil || len(ainfos) == 0 { @@ -164,28 +166,6 @@ func GetRawAPIMulti(ctx *cli.Context, t repo.RepoType, version string) ([]HttpHe return httpHeads, nil } -func GetRawAPIMultiV2(ctx *cli.Context, ainfoCfg []string, version string) ([]HttpHead, error) { - var httpHeads []HttpHead - - if len(ainfoCfg) == 0 { - return httpHeads, xerrors.Errorf("could not get API info: none configured. \nConsider getting base.toml with './lotus-provider config get base >/tmp/base.toml' \nthen adding \n[APIs] \n ChainApiInfo = [\" result_from lotus auth api-info --perm=admin \"]\n and updating it with './lotus-provider config set /tmp/base.toml'") - } - for _, i := range ainfoCfg { - ainfo := ParseApiInfo(i) - addr, err := ainfo.DialArgs(version) - if err != nil { - return httpHeads, xerrors.Errorf("could not get DialArgs: %w", err) - } - httpHeads = append(httpHeads, HttpHead{addr: addr, header: ainfo.AuthHeader()}) - } - - if IsVeryVerbose { - _, _ = fmt.Fprintf(ctx.App.Writer, "using raw API %s endpoint: %s\n", version, httpHeads[0].addr) - } - - return httpHeads, nil -} - func GetRawAPI(ctx *cli.Context, t repo.RepoType, version string) (string, http.Header, error) { heads, err := GetRawAPIMulti(ctx, t, version) if err != nil { @@ -342,14 +322,14 @@ func GetFullNodeAPIV1Single(ctx *cli.Context) (v1api.FullNode, jsonrpc.ClientClo } type GetFullNodeOptions struct { - ethSubHandler api.EthSubscriber + EthSubHandler api.EthSubscriber } type GetFullNodeOption func(*GetFullNodeOptions) func FullNodeWithEthSubscribtionHandler(sh api.EthSubscriber) GetFullNodeOption { return func(opts *GetFullNodeOptions) { - opts.ethSubHandler = sh + opts.EthSubHandler = sh } } @@ -364,8 +344,8 @@ func GetFullNodeAPIV1(ctx *cli.Context, opts ...GetFullNodeOption) (v1api.FullNo } var rpcOpts []jsonrpc.Option - if options.ethSubHandler != nil { - rpcOpts = append(rpcOpts, jsonrpc.WithClientHandler("Filecoin", options.ethSubHandler), jsonrpc.WithClientHandlerAlias("eth_subscription", "Filecoin.EthSubscription")) + if options.EthSubHandler != nil { + rpcOpts = append(rpcOpts, jsonrpc.WithClientHandler("Filecoin", options.EthSubHandler), jsonrpc.WithClientHandlerAlias("eth_subscription", "Filecoin.EthSubscription")) } heads, err := GetRawAPIMulti(ctx, repo.FullNode, "v1") @@ -415,68 +395,6 @@ func GetFullNodeAPIV1(ctx *cli.Context, opts ...GetFullNodeOption) (v1api.FullNo return &v1API, finalCloser, nil } -func GetFullNodeAPIV1LotusProvider(ctx *cli.Context, ainfoCfg []string, opts ...GetFullNodeOption) (v1api.FullNode, jsonrpc.ClientCloser, error) { - if tn, ok := ctx.App.Metadata["testnode-full"]; ok { - return tn.(v1api.FullNode), func() {}, nil - } - - var options GetFullNodeOptions - for _, opt := range opts { - opt(&options) - } - - var rpcOpts []jsonrpc.Option - if options.ethSubHandler != nil { - rpcOpts = append(rpcOpts, jsonrpc.WithClientHandler("Filecoin", options.ethSubHandler), jsonrpc.WithClientHandlerAlias("eth_subscription", "Filecoin.EthSubscription")) - } - - heads, err := GetRawAPIMultiV2(ctx, ainfoCfg, "v1") - if err != nil { - return nil, nil, err - } - - if IsVeryVerbose { - _, _ = fmt.Fprintln(ctx.App.Writer, "using full node API v1 endpoint:", heads[0].addr) - } - - var fullNodes []api.FullNode - var closers []jsonrpc.ClientCloser - - for _, head := range heads { - v1api, closer, err := client.NewFullNodeRPCV1(ctx.Context, head.addr, head.header, rpcOpts...) - if err != nil { - log.Warnf("Not able to establish connection to node with addr: %s, Reason: %s", head.addr, err.Error()) - continue - } - fullNodes = append(fullNodes, v1api) - closers = append(closers, closer) - } - - // When running in cluster mode and trying to establish connections to multiple nodes, fail - // if less than 2 lotus nodes are actually running - if len(heads) > 1 && len(fullNodes) < 2 { - return nil, nil, xerrors.Errorf("Not able to establish connection to more than a single node") - } - - finalCloser := func() { - for _, c := range closers { - c() - } - } - - var v1API api.FullNodeStruct - FullNodeProxy(fullNodes, &v1API) - - v, err := v1API.Version(ctx.Context) - if err != nil { - return nil, nil, err - } - if !v.APIVersion.EqMajorMinor(api.FullAPIVersion1) { - return nil, nil, xerrors.Errorf("Remote API version didn't match (expected %s, remote %s)", api.FullAPIVersion1, v.APIVersion) - } - return &v1API, finalCloser, nil -} - type GetStorageMinerOptions struct { PreferHttp bool } diff --git a/cmd/lotus-provider/cli.go b/cmd/curio/cli.go similarity index 96% rename from cmd/lotus-provider/cli.go rename to cmd/curio/cli.go index dc1bdde16..ea3c13d72 100644 --- a/cmd/lotus-provider/cli.go +++ b/cmd/curio/cli.go @@ -18,8 +18,8 @@ import ( "github.com/filecoin-project/lotus/api" lcli "github.com/filecoin-project/lotus/cli" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" - "github.com/filecoin-project/lotus/cmd/lotus-provider/rpc" + "github.com/filecoin-project/lotus/cmd/curio/deps" + "github.com/filecoin-project/lotus/cmd/curio/rpc" ) const providerEnvVar = "PROVIDER_API_INFO" @@ -177,7 +177,7 @@ var cliCmd = &cli.Command{ } { - api, closer, err := rpc.GetProviderAPI(cctx) + api, closer, err := rpc.GetCurioAPI(cctx) if err != nil { return err } diff --git a/cmd/lotus-provider/config.go b/cmd/curio/config.go similarity index 92% rename from cmd/lotus-provider/config.go rename to cmd/curio/config.go index 1f155f543..20f2d0597 100644 --- a/cmd/lotus-provider/config.go +++ b/cmd/curio/config.go @@ -15,7 +15,7 @@ import ( "github.com/urfave/cli/v2" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/node/config" ) @@ -48,7 +48,7 @@ var configDefaultCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { comment := !cctx.Bool("no-comment") - cfg, err := getDefaultConfig(comment) + cfg, err := deps.GetDefaultConfig(comment) if err != nil { return err } @@ -58,15 +58,6 @@ var configDefaultCmd = &cli.Command{ }, } -func getDefaultConfig(comment bool) (string, error) { - c := config.DefaultLotusProvider() - cb, err := config.ConfigUpdate(c, nil, config.Commented(comment), config.DefaultKeepUncommented(), config.NoEnv()) - if err != nil { - return "", err - } - return string(cb), nil -} - var configSetCmd = &cli.Command{ Name: "set", Aliases: []string{"add", "update", "create"}, @@ -106,12 +97,12 @@ var configSetCmd = &cli.Command{ return fmt.Errorf("cannot read stream/file %w", err) } - lp := config.DefaultLotusProvider() // ensure it's toml - _, err = deps.LoadConfigWithUpgrades(string(bytes), lp) + curioConfig := config.DefaultCurioConfig() // ensure it's toml + _, err = deps.LoadConfigWithUpgrades(string(bytes), curioConfig) if err != nil { return fmt.Errorf("cannot decode file: %w", err) } - _ = lp + _ = curioConfig err = setConfig(db, name, string(bytes)) @@ -216,7 +207,7 @@ var configRmCmd = &cli.Command{ var configViewCmd = &cli.Command{ Name: "interpret", Aliases: []string{"view", "stacked", "stack"}, - Usage: "Interpret stacked config layers by this version of lotus-provider, with system-generated comments.", + Usage: "Interpret stacked config layers by this version of curio, with system-generated comments.", ArgsUsage: "a list of layers to be interpreted as the final config", Flags: []cli.Flag{ &cli.StringSliceFlag{ @@ -230,11 +221,11 @@ var configViewCmd = &cli.Command{ if err != nil { return err } - lp, err := deps.GetConfig(cctx, db) + curioConfig, err := deps.GetConfig(cctx, db) if err != nil { return err } - cb, err := config.ConfigUpdate(lp, config.DefaultLotusProvider(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) + cb, err := config.ConfigUpdate(curioConfig, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) if err != nil { return xerrors.Errorf("cannot interpret config: %w", err) } @@ -299,12 +290,12 @@ var configEditCmd = &cli.Command{ } if cctx.IsSet("source") && source != layer && !cctx.Bool("no-interpret-source") { - lp := config.DefaultLotusProvider() + lp := config.DefaultCurioConfig() if _, err := toml.Decode(sourceConfig, lp); err != nil { return xerrors.Errorf("parsing source config: %w", err) } - cb, err := config.ConfigUpdate(lp, config.DefaultLotusProvider(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) + cb, err := config.ConfigUpdate(lp, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) if err != nil { return xerrors.Errorf("interpreting source config: %w", err) } @@ -362,9 +353,18 @@ var configEditCmd = &cli.Command{ }, } +func getDefaultConfig(comment bool) (string, error) { + c := config.DefaultCurioConfig() + cb, err := config.ConfigUpdate(c, nil, config.Commented(comment), config.DefaultKeepUncommented(), config.NoEnv()) + if err != nil { + return "", err + } + return string(cb), nil +} + func diff(sourceConf, newConf string) (string, error) { - lpSrc := config.DefaultLotusProvider() - lpNew := config.DefaultLotusProvider() + lpSrc := config.DefaultCurioConfig() + lpNew := config.DefaultCurioConfig() _, err := toml.Decode(sourceConf, lpSrc) if err != nil { diff --git a/cmd/lotus-provider/config_new.go b/cmd/curio/config_new.go similarity index 95% rename from cmd/lotus-provider/config_new.go rename to cmd/curio/config_new.go index e9d8382ac..38ca44597 100644 --- a/cmd/lotus-provider/config_new.go +++ b/cmd/curio/config_new.go @@ -18,7 +18,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" cliutil "github.com/filecoin-project/lotus/cli/util" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/repo" ) @@ -73,7 +73,7 @@ var configNewCmd = &cli.Command{ msg := "Layer " + configColor(name) + ` created. ` // setup config - lpCfg := config.DefaultLotusProvider() + lpCfg := config.DefaultCurioConfig() for _, addr := range cctx.Args().Slice() { maddr, err := address.NewFromString(addr) @@ -86,7 +86,7 @@ var configNewCmd = &cli.Command{ return xerrors.Errorf("Failed to get miner info: %w", err) } - lpCfg.Addresses = append(lpCfg.Addresses, config.LotusProviderAddresses{ + lpCfg.Addresses = append(lpCfg.Addresses, config.CurioAddresses{ PreCommitControl: nil, CommitControl: nil, TerminateControl: nil, diff --git a/cmd/curio/deps/apiinfo.go b/cmd/curio/deps/apiinfo.go new file mode 100644 index 000000000..0dd96d817 --- /dev/null +++ b/cmd/curio/deps/apiinfo.go @@ -0,0 +1,94 @@ +package deps + +import ( + "fmt" + "net/http" + + "github.com/urfave/cli/v2" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/client" + "github.com/filecoin-project/lotus/api/v1api" + cliutil "github.com/filecoin-project/lotus/cli/util" +) + +func getFullNodeAPIV1Curio(ctx *cli.Context, ainfoCfg []string, opts ...cliutil.GetFullNodeOption) (v1api.FullNode, jsonrpc.ClientCloser, error) { + if tn, ok := ctx.App.Metadata["testnode-full"]; ok { + return tn.(v1api.FullNode), func() {}, nil + } + + var options cliutil.GetFullNodeOptions + for _, opt := range opts { + opt(&options) + } + + var rpcOpts []jsonrpc.Option + if options.EthSubHandler != nil { + rpcOpts = append(rpcOpts, jsonrpc.WithClientHandler("Filecoin", options.EthSubHandler), jsonrpc.WithClientHandlerAlias("eth_subscription", "Filecoin.EthSubscription")) + } + + var httpHeads []httpHead + version := "v1" + { + if len(ainfoCfg) == 0 { + return nil, nil, xerrors.Errorf("could not get API info: none configured. \nConsider getting base.toml with './curio config get base >/tmp/base.toml' \nthen adding \n[APIs] \n ChainApiInfo = [\" result_from lotus auth api-info --perm=admin \"]\n and updating it with './curio config set /tmp/base.toml'") + } + for _, i := range ainfoCfg { + ainfo := cliutil.ParseApiInfo(i) + addr, err := ainfo.DialArgs(version) + if err != nil { + return nil, nil, xerrors.Errorf("could not get DialArgs: %w", err) + } + httpHeads = append(httpHeads, httpHead{addr: addr, header: ainfo.AuthHeader()}) + } + } + + if cliutil.IsVeryVerbose { + _, _ = fmt.Fprintln(ctx.App.Writer, "using full node API v1 endpoint:", httpHeads[0].addr) + } + + var fullNodes []api.FullNode + var closers []jsonrpc.ClientCloser + + for _, head := range httpHeads { + v1api, closer, err := client.NewFullNodeRPCV1(ctx.Context, head.addr, head.header, rpcOpts...) + if err != nil { + log.Warnf("Not able to establish connection to node with addr: %s, Reason: %s", head.addr, err.Error()) + continue + } + fullNodes = append(fullNodes, v1api) + closers = append(closers, closer) + } + + // When running in cluster mode and trying to establish connections to multiple nodes, fail + // if less than 2 lotus nodes are actually running + if len(httpHeads) > 1 && len(fullNodes) < 2 { + return nil, nil, xerrors.Errorf("Not able to establish connection to more than a single node") + } + + finalCloser := func() { + for _, c := range closers { + c() + } + } + + var v1API api.FullNodeStruct + cliutil.FullNodeProxy(fullNodes, &v1API) + + v, err := v1API.Version(ctx.Context) + if err != nil { + return nil, nil, err + } + if !v.APIVersion.EqMajorMinor(api.FullAPIVersion1) { + return nil, nil, xerrors.Errorf("Remote API version didn't match (expected %s, remote %s)", api.FullAPIVersion1, v.APIVersion) + } + return &v1API, finalCloser, nil +} + +type httpHead struct { + addr string + header http.Header +} diff --git a/cmd/lotus-provider/deps/deps.go b/cmd/curio/deps/deps.go similarity index 63% rename from cmd/lotus-provider/deps/deps.go rename to cmd/curio/deps/deps.go index e03e7dd24..4ce660739 100644 --- a/cmd/lotus-provider/deps/deps.go +++ b/cmd/curio/deps/deps.go @@ -1,4 +1,4 @@ -// Package deps provides the dependencies for the lotus provider node. +// Package deps provides the dependencies for the curio node. package deps import ( @@ -9,8 +9,9 @@ import ( "fmt" "net" "net/http" + "net/url" "os" - "regexp" + "path/filepath" "strings" "github.com/BurntSushi/toml" @@ -18,6 +19,7 @@ import ( ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" logging "github.com/ipfs/go-log/v2" + "github.com/samber/lo" "github.com/urfave/cli/v2" "golang.org/x/xerrors" @@ -27,7 +29,8 @@ import ( "github.com/filecoin-project/go-statestore" "github.com/filecoin-project/lotus/api" - cliutil "github.com/filecoin-project/lotus/cli/util" + curio "github.com/filecoin-project/lotus/curiosrc" + "github.com/filecoin-project/lotus/curiosrc/multictladdr" "github.com/filecoin-project/lotus/journal" "github.com/filecoin-project/lotus/journal/alerting" "github.com/filecoin-project/lotus/journal/fsjournal" @@ -36,25 +39,90 @@ import ( "github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo" - "github.com/filecoin-project/lotus/provider" - "github.com/filecoin-project/lotus/provider/multictladdr" "github.com/filecoin-project/lotus/storage/paths" "github.com/filecoin-project/lotus/storage/sealer" "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) -var log = logging.Logger("lotus-provider/deps") +var log = logging.Logger("curio/deps") func MakeDB(cctx *cli.Context) (*harmonydb.DB, error) { - dbConfig := config.HarmonyDB{ - Username: cctx.String("db-user"), - Password: cctx.String("db-password"), - Hosts: strings.Split(cctx.String("db-host"), ","), - Database: cctx.String("db-name"), - Port: cctx.String("db-port"), + // #1 CLI opts + fromCLI := func() (*harmonydb.DB, error) { + dbConfig := config.HarmonyDB{ + Username: cctx.String("db-user"), + Password: cctx.String("db-password"), + Hosts: strings.Split(cctx.String("db-host"), ","), + Database: cctx.String("db-name"), + Port: cctx.String("db-port"), + } + return harmonydb.NewFromConfig(dbConfig) } - return harmonydb.NewFromConfig(dbConfig) + + readToml := func(path string) (*harmonydb.DB, error) { + cfg, err := config.FromFile(path) + if err != nil { + return nil, err + } + if c, ok := cfg.(*config.StorageMiner); ok { + return harmonydb.NewFromConfig(c.HarmonyDB) + } + return nil, errors.New("not a miner config") + } + + // #2 Try local miner config + fromMinerEnv := func() (*harmonydb.DB, error) { + v := os.Getenv("LOTUS_MINER_PATH") + if v == "" { + return nil, errors.New("no miner env") + } + return readToml(filepath.Join(v, "config.toml")) + + } + + fromMiner := func() (*harmonydb.DB, error) { + u, err := os.UserHomeDir() + if err != nil { + return nil, err + } + return readToml(filepath.Join(u, ".lotusminer/config.toml")) + } + fromEnv := func() (*harmonydb.DB, error) { + // #3 Try env + u, err := url.Parse(os.Getenv("CURIO_DB")) + if err != nil { + return nil, errors.New("no db connection string found in CURIO_DB env") + } + cfg := config.DefaultStorageMiner().HarmonyDB + if u.User.Username() != "" { + cfg.Username = u.User.Username() + } + if p, ok := u.User.Password(); ok && p != "" { + cfg.Password = p + } + if u.Hostname() != "" { + cfg.Hosts = []string{u.Hostname()} + } + if u.Port() != "" { + cfg.Port = u.Port() + } + if strings.TrimPrefix(u.Path, "/") != "" { + cfg.Database = strings.TrimPrefix(u.Path, "/") + } + + return harmonydb.NewFromConfig(cfg) + } + + for _, f := range []func() (*harmonydb.DB, error){fromCLI, fromMinerEnv, fromMiner, fromEnv} { + db, err := f() + if err != nil { + continue + } + return db, nil + } + log.Error("No db connection string found. User CLI args or env var: set CURIO_DB=postgres://USER:PASSWORD@HOST:PORT/DATABASE") + return fromCLI() //in-case it's not about bad config. } type JwtPayload struct { @@ -93,8 +161,8 @@ func GetDeps(ctx context.Context, cctx *cli.Context) (*Deps, error) { } type Deps struct { - Cfg *config.LotusProviderConfig - DB *harmonydb.DB + Cfg *config.CurioConfig // values + DB *harmonydb.DB // has itest capability Full api.FullNode Verif storiface.Verifier LW *sealer.LocalWorker @@ -128,7 +196,7 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context, return err } if !ok { - if err := r.Init(repo.Provider); err != nil { + if err := r.Init(repo.Curio); err != nil { return err } } @@ -156,7 +224,7 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context, } if deps.As == nil { - deps.As, err = provider.AddressSelector(deps.Cfg.Addresses)() + deps.As, err = curio.AddressSelector(deps.Cfg.Addresses)() if err != nil { return err } @@ -186,7 +254,7 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context, if v := os.Getenv("FULLNODE_API_INFO"); v != "" { cfgApiInfo = []string{v} } - deps.Full, fullCloser, err = cliutil.GetFullNodeAPIV1LotusProvider(cctx, cfgApiInfo) + deps.Full, fullCloser, err = getFullNodeAPIV1Curio(cctx, cfgApiInfo) if err != nil { return err } @@ -236,7 +304,7 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`, wstates := statestore.New(dssync.MutexWrap(ds.NewMapDatastore())) // todo localWorker isn't the abstraction layer we want to use here, we probably want to go straight to ffiwrapper - // maybe with a lotus-provider specific abstraction. LocalWorker does persistent call tracking which we probably + // maybe with a curio specific abstraction. LocalWorker does persistent call tracking which we probably // don't need (ehh.. maybe we do, the async callback system may actually work decently well with harmonytask) deps.LW = sealer.NewLocalWorker(sealer.WorkerConfig{ MaxParallelChallengeReads: deps.Cfg.Proving.ParallelCheckLimit, @@ -273,21 +341,30 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`, return nil } -var oldAddresses = regexp.MustCompile("(?i)^\\[addresses\\]$") - -func LoadConfigWithUpgrades(text string, lp *config.LotusProviderConfig) (toml.MetaData, error) { +func LoadConfigWithUpgrades(text string, curioConfigWithDefaults *config.CurioConfig) (toml.MetaData, error) { // allow migration from old config format that was limited to 1 wallet setup. - newText := oldAddresses.ReplaceAllString(text, "[[addresses]]") - - if text != newText { - log.Warnw("Upgraded config!", "old", text, "new", newText) + newText := strings.Join(lo.Map(strings.Split(text, "\n"), func(line string, _ int) string { + if strings.EqualFold(line, "[addresses]") { + return "[[addresses]]" + } + return line + }), "\n") + meta, err := toml.Decode(newText, &curioConfigWithDefaults) + for i := range curioConfigWithDefaults.Addresses { + if curioConfigWithDefaults.Addresses[i].PreCommitControl == nil { + curioConfigWithDefaults.Addresses[i].PreCommitControl = []string{} + } + if curioConfigWithDefaults.Addresses[i].CommitControl == nil { + curioConfigWithDefaults.Addresses[i].CommitControl = []string{} + } + if curioConfigWithDefaults.Addresses[i].TerminateControl == nil { + curioConfigWithDefaults.Addresses[i].TerminateControl = []string{} + } } - - meta, err := toml.Decode(newText, &lp) return meta, err } -func GetConfig(cctx *cli.Context, db *harmonydb.DB) (*config.LotusProviderConfig, error) { - lp := config.DefaultLotusProvider() +func GetConfig(cctx *cli.Context, db *harmonydb.DB) (*config.CurioConfig, error) { + curioConfig := config.DefaultCurioConfig() have := []string{} layers := append([]string{"base"}, cctx.StringSlice("layers")...) // Always stack on top of "base" layer for _, layer := range layers { @@ -298,26 +375,35 @@ func GetConfig(cctx *cli.Context, db *harmonydb.DB) (*config.LotusProviderConfig return nil, fmt.Errorf("missing layer '%s' ", layer) } if layer == "base" { - return nil, errors.New(`lotus-provider defaults to a layer named 'base'. - Either use 'migrate' command or edit a base.toml and upload it with: lotus-provider config set base.toml`) + return nil, errors.New(`curio defaults to a layer named 'base'. + Either use 'migrate' command or edit a base.toml and upload it with: curio config set base.toml`) } return nil, fmt.Errorf("could not read layer '%s': %w", layer, err) } - meta, err := LoadConfigWithUpgrades(text, lp) + meta, err := LoadConfigWithUpgrades(text, curioConfig) if err != nil { - return lp, fmt.Errorf("could not read layer, bad toml %s: %w", layer, err) + return curioConfig, fmt.Errorf("could not read layer, bad toml %s: %w", layer, err) } for _, k := range meta.Keys() { have = append(have, strings.Join(k, " ")) } - log.Infow("Using layer", "layer", layer, "config", lp) + log.Infow("Using layer", "layer", layer, "config", curioConfig) } _ = have // FUTURE: verify that required fields are here. // If config includes 3rd-party config, consider JSONSchema as a way that // 3rd-parties can dynamically include config requirements and we can // validate the config. Because of layering, we must validate @ startup. - return lp, nil + return curioConfig, nil +} + +func GetDefaultConfig(comment bool) (string, error) { + c := config.DefaultCurioConfig() + cb, err := config.ConfigUpdate(c, nil, config.Commented(comment), config.DefaultKeepUncommented(), config.NoEnv()) + if err != nil { + return "", err + } + return string(cb), nil } func GetDepsCLI(ctx context.Context, cctx *cli.Context) (*Deps, error) { @@ -331,7 +417,7 @@ func GetDepsCLI(ctx context.Context, cctx *cli.Context) (*Deps, error) { return nil, err } - full, fullCloser, err := cliutil.GetFullNodeAPIV1LotusProvider(cctx, cfg.Apis.ChainApiInfo) + full, fullCloser, err := getFullNodeAPIV1Curio(cctx, cfg.Apis.ChainApiInfo) if err != nil { return nil, err } diff --git a/cmd/curio/guidedsetup/guidedsetup.go b/cmd/curio/guidedsetup/guidedsetup.go new file mode 100644 index 000000000..038b07e3f --- /dev/null +++ b/cmd/curio/guidedsetup/guidedsetup.go @@ -0,0 +1,590 @@ +// guidedSetup for migration from lotus-miner to Curio +// +// IF STRINGS CHANGED { +// follow instructions at ../internal/translations/translations.go +// } +package guidedsetup + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "math/bits" + "net/http" + "os" + "os/signal" + "path" + "reflect" + "strings" + "syscall" + "time" + + "github.com/BurntSushi/toml" + "github.com/charmbracelet/lipgloss" + "github.com/manifoldco/promptui" + "github.com/mitchellh/go-homedir" + "github.com/samber/lo" + "github.com/urfave/cli/v2" + "golang.org/x/text/language" + "golang.org/x/text/message" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/v0api" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/types" + cliutil "github.com/filecoin-project/lotus/cli/util" + _ "github.com/filecoin-project/lotus/cmd/curio/internal/translations" + "github.com/filecoin-project/lotus/lib/harmony/harmonydb" + "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/repo" +) + +// URL to upload user-selected fields to help direct developer's focus. +const DeveloperFocusRequestURL = "https://curiostorage.org/cgi-bin/savedata.php" + +var GuidedsetupCmd = &cli.Command{ + Name: "guided-setup", + Usage: "Run the guided setup for migrating from lotus-miner to Curio", + Flags: []cli.Flag{ + &cli.StringFlag{ // for cliutil.GetFullNodeAPI + Name: "repo", + EnvVars: []string{"LOTUS_PATH"}, + Hidden: true, + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) (err error) { + T, say := SetupLanguage() + setupCtrlC(say) + + say(header, "This interactive tool migrates lotus-miner to Curio in 5 minutes.") + say(notice, "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.") + + // Run the migration steps + migrationData := MigrationData{ + T: T, + say: say, + selectTemplates: &promptui.SelectTemplates{ + Help: T("Use the arrow keys to navigate: ↓ ↑ → ← "), + }, + cctx: cctx, + } + for _, step := range migrationSteps { + step(&migrationData) + } + for _, closer := range migrationData.closers { + closer() + } + return nil + }, +} + +func setupCtrlC(say func(style lipgloss.Style, key message.Reference, a ...interface{})) { + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + go func() { + <-c + say(notice, "Ctrl+C pressed in Terminal") + os.Exit(2) + }() +} + +var ( + header = lipgloss.NewStyle(). + Align(lipgloss.Left). + Foreground(lipgloss.Color("#00FF00")). + Background(lipgloss.Color("#242424")). + BorderStyle(lipgloss.NormalBorder()). + Width(60).Margin(1) + + notice = lipgloss.NewStyle(). + Align(lipgloss.Left). + Bold(true). + Foreground(lipgloss.Color("#CCCCCC")). + Background(lipgloss.Color("#333300")).MarginBottom(1) + + green = lipgloss.NewStyle(). + Align(lipgloss.Left). + Foreground(lipgloss.Color("#00FF00")). + Background(lipgloss.Color("#000000")) + + plain = lipgloss.NewStyle().Align(lipgloss.Left) + + section = lipgloss.NewStyle(). + Align(lipgloss.Left). + Foreground(lipgloss.Color("#000000")). + Background(lipgloss.Color("#FFFFFF")). + Underline(true) + + code = lipgloss.NewStyle(). + Align(lipgloss.Left). + Foreground(lipgloss.Color("#00FF00")). + Background(lipgloss.Color("#f8f9fa")) +) + +func SetupLanguage() (func(key message.Reference, a ...interface{}) string, func(style lipgloss.Style, key message.Reference, a ...interface{})) { + langText := "en" + problem := false + if len(os.Getenv("LANG")) > 1 { + langText = os.Getenv("LANG")[:2] + } else { + problem = true + } + + lang, err := language.Parse(langText) + if err != nil { + lang = language.English + problem = true + fmt.Println("Error parsing language") + } + + langs := message.DefaultCatalog.Languages() + have := lo.SliceToMap(langs, func(t language.Tag) (string, bool) { return t.String(), true }) + if _, ok := have[lang.String()]; !ok { + lang = language.English + problem = true + } + if problem { + _ = os.Setenv("LANG", "en-US") // for later users of this function + notice.Copy().AlignHorizontal(lipgloss.Right). + Render("$LANG=" + langText + " unsupported. Available: " + strings.Join(lo.Keys(have), ", ")) + fmt.Println("Defaulting to English. Please reach out to the Curio team if you would like to have additional language support.") + } + return func(key message.Reference, a ...interface{}) string { + return message.NewPrinter(lang).Sprintf(key, a...) + }, func(sty lipgloss.Style, key message.Reference, a ...interface{}) { + msg := message.NewPrinter(lang).Sprintf(key, a...) + fmt.Println(sty.Render(msg)) + } +} + +type migrationStep func(*MigrationData) + +var migrationSteps = []migrationStep{ + readMinerConfig, // Tells them to be on the miner machine + yugabyteConnect, // Miner is updated + configToDB, // work on base configuration migration. + verifySectors, // Verify the sectors are in the database + doc, + oneLastThing, + complete, +} + +type MigrationData struct { + T func(key message.Reference, a ...interface{}) string + say func(style lipgloss.Style, key message.Reference, a ...interface{}) + selectTemplates *promptui.SelectTemplates + MinerConfigPath string + MinerConfig *config.StorageMiner + DB *harmonydb.DB + MinerID address.Address + full v0api.FullNode + cctx *cli.Context + closers []jsonrpc.ClientCloser +} + +func complete(d *MigrationData) { + stepCompleted(d, d.T("Lotus-Miner to Curio Migration.")) + d.say(plain, "Try the web interface with %s for further guided improvements.", "--layers=gui") + d.say(plain, "You can now migrate your market node (%s), if applicable.", "Boost") +} +func configToDB(d *MigrationData) { + d.say(section, "Migrating lotus-miner config.toml to Curio in-database configuration.") + + { + var closer jsonrpc.ClientCloser + var err error + d.full, closer, err = cliutil.GetFullNodeAPI(d.cctx) + d.closers = append(d.closers, closer) + if err != nil { + d.say(notice, "Error getting API: %s", err.Error()) + os.Exit(1) + } + } + ainfo, err := cliutil.GetAPIInfo(d.cctx, repo.FullNode) + if err != nil { + d.say(notice, "could not get API info for FullNode: %w", err) + os.Exit(1) + } + token, err := d.full.AuthNew(context.Background(), api.AllPermissions) + if err != nil { + d.say(notice, "Error getting token: %s", err.Error()) + os.Exit(1) + } + + chainApiInfo := fmt.Sprintf("%s:%s", string(token), ainfo.Addr) + + d.MinerID, err = SaveConfigToLayer(d.MinerConfigPath, "", false, chainApiInfo) + if err != nil { + d.say(notice, "Error saving config to layer: %s. Aborting Migration", err.Error()) + os.Exit(1) + } +} + +// bucket returns the power's 4 highest bits (rounded down). +func bucket(power *api.MinerPower) uint64 { + rawQAP := power.TotalPower.QualityAdjPower.Uint64() + magnitude := lo.Max([]int{bits.Len64(rawQAP), 5}) + + // shifting erases resolution so we cannot distinguish SPs of similar scales. + return rawQAP >> (uint64(magnitude) - 4) << (uint64(magnitude - 4)) +} + +type uploadType int + +const uploadTypeIndividual uploadType = 0 +const uploadTypeAggregate uploadType = 1 + +// const uploadTypeHint uploadType = 2 +const uploadTypeNothing uploadType = 3 + +func oneLastThing(d *MigrationData) { + d.say(section, "The Curio team wants to improve the software you use. Tell the team you're using `%s`.", "curio") + i, _, err := (&promptui.Select{ + Label: d.T("Select what you want to share with the Curio team."), + Items: []string{ + d.T("Individual Data: Miner ID, Curio version, chain (%s or %s). Signed.", "mainnet", "calibration"), + d.T("Aggregate-Anonymous: version, chain, and Miner power (bucketed)."), + d.T("Hint: I am someone running Curio on whichever chain."), + d.T("Nothing.")}, + Templates: d.selectTemplates, + }).Run() + preference := uploadType(i) + if err != nil { + d.say(notice, "Aborting remaining steps.", err.Error()) + os.Exit(1) + } + if preference != uploadTypeNothing { + msgMap := map[string]any{ + "domain": "curio-newuser", + "net": build.BuildTypeString(), + } + if preference == uploadTypeIndividual || preference == uploadTypeAggregate { + // articles of incorporation + power, err := d.full.StateMinerPower(context.Background(), d.MinerID, types.EmptyTSK) + if err != nil { + d.say(notice, "Error getting miner power: %s", err.Error()) + os.Exit(1) + } + msgMap["version"] = build.BuildVersion + msgMap["net"] = build.BuildType + msgMap["power"] = map[uploadType]uint64{ + uploadTypeIndividual: power.MinerPower.QualityAdjPower.Uint64(), + uploadTypeAggregate: bucket(power)}[preference] + + if preference == uploadTypeIndividual { // Sign it + msgMap["miner_id"] = d.MinerID + msg, err := json.Marshal(msgMap) + if err != nil { + d.say(notice, "Error marshalling message: %s", err.Error()) + os.Exit(1) + } + mi, err := d.full.StateMinerInfo(context.Background(), d.MinerID, types.EmptyTSK) + if err != nil { + d.say(notice, "Error getting miner info: %s", err.Error()) + os.Exit(1) + } + sig, err := d.full.WalletSign(context.Background(), mi.Worker, msg) + if err != nil { + d.say(notice, "Error signing message: %s", err.Error()) + os.Exit(1) + } + msgMap["signature"] = base64.StdEncoding.EncodeToString(sig.Data) + } + } + msg, err := json.Marshal(msgMap) + if err != nil { + d.say(notice, "Error marshalling message: %s", err.Error()) + os.Exit(1) + } + + resp, err := http.DefaultClient.Post(DeveloperFocusRequestURL, "application/json", bytes.NewReader(msg)) + if err != nil { + d.say(notice, "Error sending message: %s", err.Error()) + } + if resp != nil { + defer func() { _ = resp.Body.Close() }() + if resp.StatusCode != 200 { + b, err := io.ReadAll(resp.Body) + if err == nil { + d.say(notice, "Error sending message: Status %s, Message: ", resp.Status, string(b)) + } + } else { + stepCompleted(d, d.T("Message sent.")) + } + } + } +} + +func doc(d *MigrationData) { + d.say(plain, "Documentation: ") + d.say(plain, "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.", "base", "--layers") + d.say(plain, "You can add other layers for per-machine configuration changes.") + + d.say(plain, "Filecoin %s channels: %s and %s", "Slack", "#fil-curio-help", "#fil-curio-dev") + + d.say(plain, "Start multiple Curio instances with the '%s' layer to redundancy.", "post") + //d.say(plain, "Point your browser to your web GUI to complete setup with %s and advanced featues.", "Boost") + d.say(plain, "One database can serve multiple miner IDs: Run a migration for each lotus-miner.") +} + +func verifySectors(d *MigrationData) { + var i []int + var lastError string + fmt.Println() + d.say(section, "Please start (or restart) %s now that database credentials are in %s.", "lotus-miner", "config.toml") + d.say(notice, "Waiting for %s to write sectors into Yugabyte.", "lotus-miner") + + mid, err := address.IDFromAddress(d.MinerID) + if err != nil { + d.say(notice, "Error interpreting miner ID: %s: ID: %s", err.Error(), d.MinerID.String()) + os.Exit(1) + } + + for { + err := d.DB.Select(context.Background(), &i, ` + SELECT count(*) FROM sector_location WHERE miner_id=$1`, mid) + if err != nil { + if err.Error() != lastError { + d.say(notice, "Error verifying sectors: %s", err.Error()) + lastError = err.Error() + } + continue + } + if i[0] > 0 { + break + } + fmt.Print(".") + time.Sleep(5 * time.Second) + } + d.say(plain, "The sectors are in the database. The database is ready for %s.", "Curio") + d.say(notice, "Now shut down lotus-miner and move the systems to %s.", "Curio") + + _, err = (&promptui.Prompt{Label: d.T("Press return to continue")}).Run() + if err != nil { + d.say(notice, "Aborting migration.") + os.Exit(1) + } + stepCompleted(d, d.T("Sectors verified. %d sector locations found.", i)) +} + +func yugabyteConnect(d *MigrationData) { + harmonyCfg := config.DefaultStorageMiner().HarmonyDB //copy the config to a local variable + if d.MinerConfig != nil { + harmonyCfg = d.MinerConfig.HarmonyDB //copy the config to a local variable + } + var err error + d.DB, err = harmonydb.NewFromConfig(harmonyCfg) + if err == nil { + goto yugabyteConnected + } + for { + i, _, err := (&promptui.Select{ + Label: d.T("Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)"), + Items: []string{ + d.T("Host: %s", strings.Join(harmonyCfg.Hosts, ",")), + d.T("Port: %s", harmonyCfg.Port), + d.T("Username: %s", harmonyCfg.Username), + d.T("Password: %s", harmonyCfg.Password), + d.T("Database: %s", harmonyCfg.Database), + d.T("Continue to connect and update schema.")}, + Size: 6, + Templates: d.selectTemplates, + }).Run() + if err != nil { + d.say(notice, "Database config error occurred, abandoning migration: %s ", err.Error()) + os.Exit(1) + } + switch i { + case 0: + host, err := (&promptui.Prompt{ + Label: d.T("Enter the Yugabyte database host(s)"), + }).Run() + if err != nil { + d.say(notice, "No host provided") + continue + } + harmonyCfg.Hosts = strings.Split(host, ",") + case 1, 2, 3, 4: + val, err := (&promptui.Prompt{ + Label: d.T("Enter the Yugabyte database %s", []string{"port", "username", "password", "database"}[i-1]), + }).Run() + if err != nil { + d.say(notice, "No value provided") + continue + } + switch i { + case 1: + harmonyCfg.Port = val + case 2: + harmonyCfg.Username = val + case 3: + harmonyCfg.Password = val + case 4: + harmonyCfg.Database = val + } + continue + case 5: + d.DB, err = harmonydb.NewFromConfig(harmonyCfg) + if err != nil { + if err.Error() == "^C" { + os.Exit(1) + } + d.say(notice, "Error connecting to Yugabyte database: %s", err.Error()) + continue + } + goto yugabyteConnected + } + } + +yugabyteConnected: + d.say(plain, "Connected to Yugabyte. Schema is current.") + if !reflect.DeepEqual(harmonyCfg, d.MinerConfig.HarmonyDB) || !d.MinerConfig.Subsystems.EnableSectorIndexDB { + d.MinerConfig.HarmonyDB = harmonyCfg + d.MinerConfig.Subsystems.EnableSectorIndexDB = true + + d.say(plain, "Enabling Sector Indexing in the database.") + buf, err := config.ConfigUpdate(d.MinerConfig, config.DefaultStorageMiner()) + if err != nil { + d.say(notice, "Error encoding config.toml: %s", err.Error()) + os.Exit(1) + } + _, err = (&promptui.Prompt{ + Label: d.T("Press return to update %s with Yugabyte info. A Backup file will be written to that folder before changes are made.", "config.toml")}).Run() + if err != nil { + os.Exit(1) + } + p, err := homedir.Expand(d.MinerConfigPath) + if err != nil { + d.say(notice, "Error expanding path: %s", err.Error()) + os.Exit(1) + } + tomlPath := path.Join(p, "config.toml") + stat, err := os.Stat(tomlPath) + if err != nil { + d.say(notice, "Error reading filemode of config.toml: %s", err.Error()) + os.Exit(1) + } + fBackup, err := os.CreateTemp(p, "config-backup-*.toml") + if err != nil { + d.say(notice, "Error creating backup file: %s", err.Error()) + os.Exit(1) + } + fBackupContents, err := os.ReadFile(tomlPath) + if err != nil { + d.say(notice, "Error reading config.toml: %s", err.Error()) + os.Exit(1) + } + _, err = fBackup.Write(fBackupContents) + if err != nil { + d.say(notice, "Error writing backup file: %s", err.Error()) + os.Exit(1) + } + err = fBackup.Close() + if err != nil { + d.say(notice, "Error closing backup file: %s", err.Error()) + os.Exit(1) + } + + filemode := stat.Mode() + err = os.WriteFile(path.Join(p, "config.toml"), buf, filemode) + if err != nil { + d.say(notice, "Error writing config.toml: %s", err.Error()) + os.Exit(1) + } + d.say(section, "Restart Lotus Miner. ") + } + stepCompleted(d, d.T("Connected to Yugabyte")) +} + +func readMinerConfig(d *MigrationData) { + d.say(plain, "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.") + + verifyPath := func(dir string) (*config.StorageMiner, error) { + cfg := config.DefaultStorageMiner() + dir, err := homedir.Expand(dir) + if err != nil { + return nil, err + } + _, err = toml.DecodeFile(path.Join(dir, "config.toml"), &cfg) + return cfg, err + } + + dirs := map[string]*config.StorageMiner{"~/.lotusminer": nil, "~/.lotus-miner-local-net": nil} + if v := os.Getenv("LOTUS_MINER_PATH"); v != "" { + dirs[v] = nil + } + for dir := range dirs { + cfg, err := verifyPath(dir) + if err != nil { + delete(dirs, dir) + } + dirs[dir] = cfg + } + + var otherPath bool + if len(dirs) > 0 { + _, str, err := (&promptui.Select{ + Label: d.T("Select the location of your lotus-miner config directory?"), + Items: append(lo.Keys(dirs), d.T("Other")), + Templates: d.selectTemplates, + }).Run() + if err != nil { + if err.Error() == "^C" { + os.Exit(1) + } + otherPath = true + } else { + if str == d.T("Other") { + otherPath = true + } else { + d.MinerConfigPath = str + d.MinerConfig = dirs[str] + } + } + } + if otherPath { + minerPathEntry: + str, err := (&promptui.Prompt{ + Label: d.T("Enter the path to the configuration directory used by %s", "lotus-miner"), + }).Run() + if err != nil { + d.say(notice, "No path provided, abandoning migration ") + os.Exit(1) + } + cfg, err := verifyPath(str) + if err != nil { + d.say(notice, "Cannot read the config.toml file in the provided directory, Error: %s", err.Error()) + goto minerPathEntry + } + d.MinerConfigPath = str + d.MinerConfig = cfg + } + + // Try to lock Miner repo to verify that lotus-miner is not running + { + r, err := repo.NewFS(d.MinerConfigPath) + if err != nil { + d.say(plain, "Could not create repo from directory: %s. Aborting migration", err.Error()) + os.Exit(1) + } + lr, err := r.Lock(repo.StorageMiner) + if err != nil { + d.say(plain, "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration", err.Error()) + os.Exit(1) + } + _ = lr.Close() + } + + stepCompleted(d, d.T("Read Miner Config")) +} +func stepCompleted(d *MigrationData, step string) { + fmt.Print(green.Render("✔ ")) + d.say(plain, "Step Complete: %s\n", step) +} diff --git a/cmd/curio/guidedsetup/shared.go b/cmd/curio/guidedsetup/shared.go new file mode 100644 index 000000000..e4b840bf2 --- /dev/null +++ b/cmd/curio/guidedsetup/shared.go @@ -0,0 +1,264 @@ +package guidedsetup + +import ( + "bytes" + "context" + "encoding/base64" + "errors" + "fmt" + "os" + "path" + "strings" + + "github.com/BurntSushi/toml" + "github.com/ipfs/go-datastore" + "github.com/samber/lo" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + + "github.com/filecoin-project/lotus/cmd/curio/deps" + "github.com/filecoin-project/lotus/lib/harmony/harmonydb" + "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/modules" + "github.com/filecoin-project/lotus/node/repo" +) + +const ( + FlagMinerRepo = "miner-repo" +) + +const FlagMinerRepoDeprecation = "storagerepo" + +func SaveConfigToLayer(minerRepoPath, layerName string, overwrite bool, chainApiInfo string) (minerAddress address.Address, err error) { + _, say := SetupLanguage() + ctx := context.Background() + + r, err := repo.NewFS(minerRepoPath) + if err != nil { + return minerAddress, err + } + + ok, err := r.Exists() + if err != nil { + return minerAddress, err + } + + if !ok { + return minerAddress, fmt.Errorf("repo not initialized at: %s", minerRepoPath) + } + + lr, err := r.LockRO(repo.StorageMiner) + if err != nil { + return minerAddress, fmt.Errorf("locking repo: %w", err) + } + defer func() { + err = lr.Close() + if err != nil { + fmt.Println("error closing repo: ", err) + } + }() + + cfgNode, err := lr.Config() + if err != nil { + return minerAddress, fmt.Errorf("getting node config: %w", err) + } + smCfg := cfgNode.(*config.StorageMiner) + + db, err := harmonydb.NewFromConfig(smCfg.HarmonyDB) + if err != nil { + return minerAddress, fmt.Errorf("could not reach the database. Ensure the Miner config toml's HarmonyDB entry"+ + " is setup to reach Yugabyte correctly: %w", err) + } + + var titles []string + err = db.Select(ctx, &titles, `SELECT title FROM harmony_config WHERE LENGTH(config) > 0`) + if err != nil { + return minerAddress, fmt.Errorf("miner cannot reach the db. Ensure the config toml's HarmonyDB entry"+ + " is setup to reach Yugabyte correctly: %s", err.Error()) + } + + // Copy over identical settings: + + buf, err := os.ReadFile(path.Join(lr.Path(), "config.toml")) + if err != nil { + return minerAddress, fmt.Errorf("could not read config.toml: %w", err) + } + curioCfg := config.DefaultCurioConfig() + + ensureEmptyArrays(curioCfg) + _, err = deps.LoadConfigWithUpgrades(string(buf), curioCfg) + + if err != nil { + return minerAddress, fmt.Errorf("could not decode toml: %w", err) + } + + // Populate Miner Address + mmeta, err := lr.Datastore(ctx, "/metadata") + if err != nil { + return minerAddress, xerrors.Errorf("opening miner metadata datastore: %w", err) + } + defer func() { + // _ = mmeta.Close() + }() + + maddrBytes, err := mmeta.Get(ctx, datastore.NewKey("miner-address")) + if err != nil { + return minerAddress, xerrors.Errorf("getting miner address datastore entry: %w", err) + } + + addr, err := address.NewFromBytes(maddrBytes) + if err != nil { + return minerAddress, xerrors.Errorf("parsing miner actor address: %w", err) + } + + minerAddress = addr + + curioCfg.Addresses = []config.CurioAddresses{{ + MinerAddresses: []string{addr.String()}, + PreCommitControl: smCfg.Addresses.PreCommitControl, + CommitControl: smCfg.Addresses.CommitControl, + TerminateControl: smCfg.Addresses.TerminateControl, + DisableOwnerFallback: smCfg.Addresses.DisableOwnerFallback, + DisableWorkerFallback: smCfg.Addresses.DisableWorkerFallback, + }} + + ks, err := lr.KeyStore() + if err != nil { + return minerAddress, xerrors.Errorf("keystore err: %w", err) + } + js, err := ks.Get(modules.JWTSecretName) + if err != nil { + return minerAddress, xerrors.Errorf("error getting JWTSecretName: %w", err) + } + + curioCfg.Apis.StorageRPCSecret = base64.StdEncoding.EncodeToString(js.PrivateKey) + + curioCfg.Apis.ChainApiInfo = append(curioCfg.Apis.ChainApiInfo, chainApiInfo) + // Express as configTOML + configTOML := &bytes.Buffer{} + if err = toml.NewEncoder(configTOML).Encode(curioCfg); err != nil { + return minerAddress, err + } + + if lo.Contains(titles, "base") { + // append addresses + var baseCfg = config.DefaultCurioConfig() + var baseText string + err = db.QueryRow(ctx, "SELECT config FROM harmony_config WHERE title='base'").Scan(&baseText) + if err != nil { + return minerAddress, xerrors.Errorf("Cannot load base config: %w", err) + } + ensureEmptyArrays(baseCfg) + _, err := deps.LoadConfigWithUpgrades(baseText, baseCfg) + if err != nil { + return minerAddress, xerrors.Errorf("Cannot load base config: %w", err) + } + for _, addr := range baseCfg.Addresses { + if lo.Contains(addr.MinerAddresses, curioCfg.Addresses[0].MinerAddresses[0]) { + goto skipWritingToBase + } + } + // write to base + { + baseCfg.Addresses = append(baseCfg.Addresses, curioCfg.Addresses[0]) + baseCfg.Addresses = lo.Filter(baseCfg.Addresses, func(a config.CurioAddresses, _ int) bool { + return len(a.MinerAddresses) > 0 + }) + + cb, err := config.ConfigUpdate(baseCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) + if err != nil { + return minerAddress, xerrors.Errorf("cannot interpret config: %w", err) + } + _, err = db.Exec(ctx, "UPDATE harmony_config SET config=$1 WHERE title='base'", string(cb)) + if err != nil { + return minerAddress, xerrors.Errorf("cannot update base config: %w", err) + } + say(plain, "Configuration 'base' was updated to include this miner's address and its wallet setup.") + } + say(plain, "Compare the configurations %s to %s. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", "base", "mig-"+curioCfg.Addresses[0].MinerAddresses[0]) + skipWritingToBase: + } else if layerName == "" { + cfg, err := deps.GetDefaultConfig(true) + if err != nil { + return minerAddress, xerrors.Errorf("Cannot get default config: %w", err) + } + _, err = db.Exec(ctx, `INSERT INTO harmony_config (title, config) VALUES ('base', $1) + ON CONFLICT(title) DO UPDATE SET config=EXCLUDED.config`, cfg) + + if err != nil { + return minerAddress, xerrors.Errorf("Cannot insert base config: %w", err) + } + say(notice, "Configuration 'base' was created to include this miner's address and its wallet setup.") + } + + if layerName == "" { // only make mig if base exists and we are different. // compare to base. + layerName = fmt.Sprintf("mig-%s", curioCfg.Addresses[0].MinerAddresses[0]) + overwrite = true + } else { + if lo.Contains(titles, layerName) && !overwrite { + return minerAddress, errors.New("the overwrite flag is needed to replace existing layer: " + layerName) + } + } + if overwrite { + _, err := db.Exec(ctx, "DELETE FROM harmony_config WHERE title=$1", layerName) + if err != nil { + return minerAddress, xerrors.Errorf("Cannot delete existing layer: %w", err) + } + } + + _, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ($1, $2)", layerName, configTOML.String()) + if err != nil { + return minerAddress, xerrors.Errorf("Cannot insert layer after layer created message: %w", err) + } + say(plain, "Layer %s created. ", layerName) + + dbSettings := getDBSettings(*smCfg) + say(plain, "To work with the config: ") + fmt.Println(code.Render(`curio ` + dbSettings + ` config edit base`)) + say(plain, `To run Curio: With machine or cgroup isolation, use the command (with example layer selection):`) + fmt.Println(code.Render(`curio ` + dbSettings + ` run --layer=post`)) + return minerAddress, nil +} + +func getDBSettings(smCfg config.StorageMiner) string { + dbSettings := "" + def := config.DefaultStorageMiner().HarmonyDB + if def.Hosts[0] != smCfg.HarmonyDB.Hosts[0] { + dbSettings += ` --db-host="` + strings.Join(smCfg.HarmonyDB.Hosts, ",") + `"` + } + if def.Port != smCfg.HarmonyDB.Port { + dbSettings += " --db-port=" + smCfg.HarmonyDB.Port + } + if def.Username != smCfg.HarmonyDB.Username { + dbSettings += ` --db-user="` + smCfg.HarmonyDB.Username + `"` + } + if def.Password != smCfg.HarmonyDB.Password { + dbSettings += ` --db-password="` + smCfg.HarmonyDB.Password + `"` + } + if def.Database != smCfg.HarmonyDB.Database { + dbSettings += ` --db-name="` + smCfg.HarmonyDB.Database + `"` + } + return dbSettings +} + +func ensureEmptyArrays(cfg *config.CurioConfig) { + if cfg.Addresses == nil { + cfg.Addresses = []config.CurioAddresses{} + } else { + for i := range cfg.Addresses { + if cfg.Addresses[i].PreCommitControl == nil { + cfg.Addresses[i].PreCommitControl = []string{} + } + if cfg.Addresses[i].CommitControl == nil { + cfg.Addresses[i].CommitControl = []string{} + } + if cfg.Addresses[i].TerminateControl == nil { + cfg.Addresses[i].TerminateControl = []string{} + } + } + } + if cfg.Apis.ChainApiInfo == nil { + cfg.Apis.ChainApiInfo = []string{} + } +} diff --git a/cmd/curio/internal/translations/catalog.go b/cmd/curio/internal/translations/catalog.go new file mode 100644 index 000000000..1aca33033 --- /dev/null +++ b/cmd/curio/internal/translations/catalog.go @@ -0,0 +1,331 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package translations + +import ( + "golang.org/x/text/language" + "golang.org/x/text/message" + "golang.org/x/text/message/catalog" +) + +type dictionary struct { + index []uint32 + data string +} + +func (d *dictionary) Lookup(key string) (data string, ok bool) { + p, ok := messageKeyToIndex[key] + if !ok { + return "", false + } + start, end := d.index[p], d.index[p+1] + if start == end { + return "", false + } + return d.data[start:end], true +} + +func init() { + dict := map[string]catalog.Dictionary{ + "en": &dictionary{index: enIndex, data: enData}, + "ko": &dictionary{index: koIndex, data: koData}, + "zh": &dictionary{index: zhIndex, data: zhData}, + } + fallback := language.MustParse("en") + cat, err := catalog.NewFromMap(dict, catalog.Fallback(fallback)) + if err != nil { + panic(err) + } + message.DefaultCatalog = cat +} + +var messageKeyToIndex = map[string]int{ + "Aborting migration.": 41, + "Aborting remaining steps.": 19, + "Aggregate-Anonymous: version, net, and Miner power (bucketed).": 16, + "Cannot read the config.toml file in the provided directory, Error: %s": 70, + "Compare the configurations %s to %s. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.": 76, + "Configuration 'base' was created to include this miner's address and its wallet setup.": 77, + "Configuration 'base' was updated to include this miner's address and its wallet setup.": 75, + "Connected to Yugabyte": 64, + "Connected to Yugabyte. Schema is current.": 56, + "Continue to connect and update schema.": 49, + "Could not create repo from directory: %s. Aborting migration": 71, + "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration": 72, + "Ctrl+C pressed in Terminal": 3, + "Database config error occurred, abandoning migration: %s ": 50, + "Database: %s": 48, + "Documentation: ": 27, + "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.": 1, + "Enabling Sector Indexing in the database.": 57, + "Enter the Yugabyte database %s": 53, + "Enter the Yugabyte database host(s)": 51, + "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)": 43, + "Enter the path to the configuration directory used by %s": 68, + "Error connecting to Yugabyte database: %s": 55, + "Error connecting to lotus node: %s %s": 9, + "Error encoding config.toml: %s": 58, + "Error expanding path: %s": 60, + "Error getting miner info: %s": 22, + "Error getting miner power: %s": 20, + "Error getting token: %s": 11, + "Error interpreting miner ID: %s: ID: %s": 36, + "Error marshalling message: %s": 21, + "Error reading filemode of config.toml: %s": 61, + "Error reading from database: %s. Aborting Migration.": 8, + "Error saving config to layer: %s. Aborting Migration": 12, + "Error sending message: %s": 24, + "Error sending message: Status %s, Message: ": 25, + "Error signing message: %s": 23, + "Error verifying sectors: %s": 37, + "Error writing config.toml: %s": 62, + "Filecoin %s channels: %s and %s": 30, + "Hint: I am someone running Curio on net.": 17, + "Host: %s": 44, + "Individual Data: Miner ID, Curio version, net (%s or %s). Signed.": 15, + "Layer %s created. ": 78, + "Lotus-Miner to Curio Migration.": 4, + "Message sent.": 26, + "Migrating config.toml to database.": 7, + "No host provided": 52, + "No path provided, abandoning migration ": 69, + "No value provided": 54, + "Nothing.": 18, + "Now shut down lotus-miner and move the systems to %s.": 39, + "One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 33, + "Other": 67, + "Password: %s": 47, + "Please start (or restart) %s now that database credentials are in %s.": 34, + "Point your browser to your web GUI to complete setup with %s and advanced featues.": 32, + "Port: %s": 45, + "Press return to continue": 40, + "Press return to update %s with Yugabyte info. Backup the file now.": 59, + "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.": 13, + "Read Miner Config": 73, + "Restart Lotus Miner. ": 63, + "Sectors verified. %d sector locations found.": 42, + "Select the location of your lotus-miner config directory?": 66, + "Select what you want to share with the Curio team.": 14, + "Start multiple Curio instances with the '%s' layer to redundancy.": 31, + "Step Complete: %s\n": 74, + "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.": 28, + "The sectors are in the database. The database is ready for %s.": 38, + "This interactive tool migrates lotus-miner to Curio in 5 minutes.": 0, + "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):": 80, + "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.": 65, + "To work with the config: ": 79, + "Try the web interface with %s for further guided improvements.": 5, + "Use the arrow keys to navigate: ↓ ↑ → ← ": 2, + "Username: %s": 46, + "Waiting for %s to write sectors into Yugabyte.": 35, + "You can add other layers for per-machine configuration changes.": 29, + "You can now migrate your market node (%s), if applicable.": 6, + "could not get API info for FullNode: %w": 10, +} + +var enIndex = []uint32{ // 82 elements + // Entry 0 - 1F + 0x00000000, 0x00000042, 0x0000009b, 0x000000d0, + 0x000000eb, 0x0000010b, 0x0000014d, 0x0000018a, + 0x000001ad, 0x000001e5, 0x00000211, 0x0000023c, + 0x00000257, 0x0000028f, 0x000002e6, 0x00000319, + 0x00000361, 0x000003a0, 0x000003c9, 0x000003d2, + 0x000003ec, 0x0000040d, 0x0000042e, 0x0000044e, + 0x0000046b, 0x00000488, 0x000004bb, 0x000004c9, + 0x000004dd, 0x00000548, 0x00000588, 0x000005b1, + // Entry 20 - 3F + 0x000005f6, 0x0000064c, 0x0000069d, 0x000006e9, + 0x0000071b, 0x00000749, 0x00000768, 0x000007aa, + 0x000007e3, 0x000007fc, 0x00000810, 0x00000840, + 0x000008a2, 0x000008ae, 0x000008ba, 0x000008ca, + 0x000008da, 0x000008ea, 0x00000911, 0x00000952, + 0x00000976, 0x00000987, 0x000009a9, 0x000009bb, + 0x000009e8, 0x00000a12, 0x00000a3c, 0x00000a5e, + 0x00000aa4, 0x00000ac0, 0x00000aed, 0x00000b0e, + // Entry 40 - 5F + 0x00000b28, 0x00000b3e, 0x00000b8b, 0x00000bc5, + 0x00000bcb, 0x00000c07, 0x00000c33, 0x00000c7c, + 0x00000cbc, 0x00000d0d, 0x00000d1f, 0x00000d39, + 0x00000d90, 0x00000e2d, 0x00000e84, 0x00000e9e, + 0x00000ebc, 0x00000f1c, +} // Size: 352 bytes + +const enData string = "" + // Size: 3868 bytes + "\x02This interactive tool migrates lotus-miner to Curio in 5 minutes." + + "\x02Each step needs your confirmation and can be reversed. Press Ctrl+C " + + "to exit at any time.\x04\x00\x01 0\x02Use the arrow keys to navigate: ↓ " + + "↑ → ←\x02Ctrl+C pressed in Terminal\x02Lotus-Miner to Curio Migration." + + "\x02Try the web interface with %[1]s for further guided improvements." + + "\x02You can now migrate your market node (%[1]s), if applicable.\x02Migr" + + "ating config.toml to database.\x02Error reading from database: %[1]s. Ab" + + "orting Migration.\x02Error connecting to lotus node: %[1]s %[2]s\x02coul" + + "d not get API info for FullNode: %[1]w\x02Error getting token: %[1]s\x02" + + "Error saving config to layer: %[1]s. Aborting Migration\x02Protocol Labs" + + " wants to improve the software you use. Tell the team you're using Curio" + + ".\x02Select what you want to share with the Curio team.\x02Individual Da" + + "ta: Miner ID, Curio version, net (%[1]s or %[2]s). Signed.\x02Aggregate-" + + "Anonymous: version, net, and Miner power (bucketed).\x02Hint: I am someo" + + "ne running Curio on net.\x02Nothing.\x02Aborting remaining steps.\x02Err" + + "or getting miner power: %[1]s\x02Error marshalling message: %[1]s\x02Err" + + "or getting miner info: %[1]s\x02Error signing message: %[1]s\x02Error se" + + "nding message: %[1]s\x04\x00\x01 .\x02Error sending message: Status %[1]" + + "s, Message:\x02Message sent.\x04\x00\x01 \x0f\x02Documentation:\x02The '" + + "%[1]s' layer stores common configuration. All curio instances can includ" + + "e it in their %[2]s argument.\x02You can add other layers for per-machin" + + "e configuration changes.\x02Filecoin %[1]s channels: %[2]s and %[3]s\x02" + + "Start multiple Curio instances with the '%[1]s' layer to redundancy.\x02" + + "Point your browser to your web GUI to complete setup with %[1]s and adva" + + "nced featues.\x02One database can serve multiple miner IDs: Run a migrat" + + "ion for each lotus-miner.\x02Please start (or restart) %[1]s now that da" + + "tabase credentials are in %[2]s.\x02Waiting for %[1]s to write sectors i" + + "nto Yugabyte.\x02Error interpreting miner ID: %[1]s: ID: %[2]s\x02Error " + + "verifying sectors: %[1]s\x02The sectors are in the database. The databas" + + "e is ready for %[1]s.\x02Now shut down lotus-miner and move the systems " + + "to %[1]s.\x02Press return to continue\x02Aborting migration.\x02Sectors " + + "verified. %[1]d sector locations found.\x02Enter the info to connect to " + + "your Yugabyte database installation (https://download.yugabyte.com/)\x02" + + "Host: %[1]s\x02Port: %[1]s\x02Username: %[1]s\x02Password: %[1]s\x02Data" + + "base: %[1]s\x02Continue to connect and update schema.\x04\x00\x01 <\x02D" + + "atabase config error occurred, abandoning migration: %[1]s\x02Enter the " + + "Yugabyte database host(s)\x02No host provided\x02Enter the Yugabyte data" + + "base %[1]s\x02No value provided\x02Error connecting to Yugabyte database" + + ": %[1]s\x02Connected to Yugabyte. Schema is current.\x02Enabling Sector " + + "Indexing in the database.\x02Error encoding config.toml: %[1]s\x02Press " + + "return to update %[1]s with Yugabyte info. Backup the file now.\x02Error" + + " expanding path: %[1]s\x02Error reading filemode of config.toml: %[1]s" + + "\x02Error writing config.toml: %[1]s\x04\x00\x01 \x15\x02Restart Lotus M" + + "iner.\x02Connected to Yugabyte\x02To start, ensure your sealing pipeline" + + " is drained and shut-down lotus-miner.\x02Select the location of your lo" + + "tus-miner config directory?\x02Other\x02Enter the path to the configurat" + + "ion directory used by %[1]s\x04\x00\x01 '\x02No path provided, abandonin" + + "g migration\x02Cannot read the config.toml file in the provided director" + + "y, Error: %[1]s\x02Could not create repo from directory: %[1]s. Aborting" + + " migration\x02Could not lock miner repo. Your miner must be stopped: %[1" + + "]s\x0a Aborting migration\x02Read Miner Config\x04\x00\x01\x0a\x15\x02St" + + "ep Complete: %[1]s\x02Configuration 'base' was updated to include this m" + + "iner's address and its wallet setup.\x02Compare the configurations %[1]s" + + " to %[2]s. Changes between the miner IDs other than wallet addreses shou" + + "ld be a new, minimal layer for runners that need it.\x02Configuration 'b" + + "ase' was created to include this miner's address and its wallet setup." + + "\x04\x00\x01 \x15\x02Layer %[1]s created.\x04\x00\x01 \x19\x02To work wi" + + "th the config:\x02To run Curio: With machine or cgroup isolation, use th" + + "e command (with example layer selection):" + +var koIndex = []uint32{ // 82 elements + // Entry 0 - 1F + 0x00000000, 0x0000004d, 0x000000c8, 0x0000010c, + 0x0000012d, 0x00000150, 0x00000150, 0x000001a0, + 0x000001da, 0x0000022f, 0x0000022f, 0x0000022f, + 0x0000022f, 0x00000287, 0x00000315, 0x0000034e, + 0x000003aa, 0x000003f4, 0x00000437, 0x00000452, + 0x00000477, 0x000004b1, 0x000004e4, 0x0000051e, + 0x00000548, 0x00000572, 0x000005b4, 0x000005d8, + 0x000005e5, 0x0000066b, 0x000006bd, 0x000006bd, + // Entry 20 - 3F + 0x000006bd, 0x0000071e, 0x0000071e, 0x0000071e, + 0x00000762, 0x00000762, 0x00000789, 0x000007f4, + 0x0000083e, 0x00000865, 0x00000880, 0x000008cf, + 0x0000093d, 0x0000094e, 0x0000095c, 0x00000974, + 0x00000988, 0x000009a2, 0x000009cc, 0x00000a2f, + 0x00000a6b, 0x00000a95, 0x00000acd, 0x00000af1, + 0x00000b45, 0x00000b86, 0x00000b86, 0x00000bcd, + 0x00000c39, 0x00000c39, 0x00000c88, 0x00000cc6, + // Entry 40 - 5F + 0x00000cea, 0x00000d00, 0x00000d6b, 0x00000dba, + 0x00000dc1, 0x00000e09, 0x00000e5b, 0x00000eb5, + 0x00000eb5, 0x00000eb5, 0x00000ecd, 0x00000ee7, + 0x00000f51, 0x0000100b, 0x0000106f, 0x0000109e, + 0x0000109e, 0x0000112a, +} // Size: 352 bytes + +const koData string = "" + // Size: 4394 bytes + "\x02이 대화형 도구는 5분 안에 lotus-miner를 Curio로 이주합니다.\x02각 단계는 확인이 필요하며 되돌릴 수 있" + + "습니다. 언제든지 Ctrl+C를 눌러 종료할 수 있습니다.\x04\x00\x01 ?\x02화살표 키를 사용하여 이동하세요: ↓" + + " ↑ → ←\x02터미널에서 Ctrl+C가 눌림\x02Lotus-Miner에서 Curio로 이주.\x02해당하는 경우 이제 시장 " + + "노드를 이주할 수 있습니다 (%[1]s).\x02config.toml을 데이터베이스로 이주 중입니다.\x02데이터베이스에서 읽" + + "는 중 오류 발생: %[1]s. 마이그레이션 중단.\x02레이어에 구성을 저장하는 중 오류 발생: %[1]s. 마이그레이션 중" + + "단\x02Protocol Labs는 당신이 사용하는 소프트웨어를 개선하고 싶어합니다. Curio를 사용 중이라고 팀에 알려주세" + + "요.\x02Curio 팀과 공유하고 싶은 것을 선택하세요.\x02개별 데이터: 마이너 ID, Curio 버전, 네트워크 (%[" + + "1]s 또는 %[2]s). 서명됨.\x02집계-익명: 버전, 네트워크, 그리고 마이너 파워 (버킷).\x02힌트: 네트워크에서 C" + + "urio를 실행 중인 사람입니다.\x02아무것도 없습니다.\x02나머지 단계를 중단합니다.\x02마이너 파워를 가져오는 중 오류 " + + "발생: %[1]s\x02메시지를 마샬하는 중 오류 발생: %[1]s\x02마이너 정보를 가져오는 중 오류 발생: %[1]s" + + "\x02메시지 서명 중 오류 발생: %[1]s\x02메시지 전송 중 오류 발생: %[1]s\x04\x00\x01 =\x02메시지 " + + "전송 중 오류 발생: 상태 %[1]s, 메시지:\x02메시지가 전송되었습니다.\x04\x00\x01 \x08\x02문서:" + + "\x02'%[1]s' 레이어에는 공통 구성이 저장됩니다. 모든 Curio 인스턴스는 %[2]s 인수에 포함시킬 수 있습니다." + + "\x02기계별 구성 변경을 위해 다른 레이어를 추가할 수 있습니다.\x02브라우저를 웹 GUI로 이동하여 %[1]s 및 고급 기능" + + "으로 설정을 완료하세요.\x02%[1]s가 Yugabyte에 섹터를 기록하도록 대기 중입니다.\x02섹터 확인 중 오류 발생:" + + " %[1]s\x02섹터가 데이터베이스에 있습니다. 데이터베이스가 %[1]s를 위해 준비되었습니다.\x02이제 lotus-miner" + + "를 종료하고 시스템을 %[1]s로 이동하세요.\x02계속하려면 리턴을 누르세요\x02마이그레이션 중단.\x02섹터가 확인되었습" + + "니다. %[1]d개의 섹터 위치를 찾았습니다.\x02Yugabyte 데이터베이스 설치에 연결할 정보를 입력하십시오 (https" + + "://download.yugabyte.com/)\x02호스트: %[1]s\x02포트: %[1]s\x02사용자 이름: %[1]s" + + "\x02비밀번호: %[1]s\x02데이터베이스: %[1]s\x02계속 연결 및 스키마 업데이트.\x04\x00\x01 ^\x02데" + + "이터베이스 구성 오류가 발생하여 마이그레이션을 포기합니다: %[1]s\x02Yugabyte 데이터베이스 호스트를 입력하십시오" + + "\x02호스트가 제공되지 않았습니다\x02Yugabyte 데이터베이스 %[1]s을 입력하십시오\x02값이 제공되지 않았습니다" + + "\x02Yugabyte 데이터베이스에 연결하는 중 오류가 발생했습니다: %[1]s\x02Yugabyte에 연결되었습니다. 스키마가" + + " 현재입니다.\x02config.toml을 인코딩하는 중 오류가 발생했습니다: %[1]s\x02%[1]s을 Yugabyte 정보로" + + " 업데이트하려면 리턴을 누르세요. 지금 파일을 백업하세요.\x02config.toml의 파일 모드를 읽는 중 오류가 발생했습니다:" + + " %[1]s\x02config.toml을 쓰는 중 오류가 발생했습니다: %[1]s\x04\x00\x01 \x1f\x02로터스 마이" + + "너 재시작.\x02Yugabyte에 연결됨\x02시작하려면 밀봉 파이프라인이 비어 있고 lotus-miner가 종료되었는지 확" + + "인하세요.\x02로터스 마이너 구성 디렉토리의 위치를 선택하시겠습니까?\x02기타\x02%[1]s에서 사용하는 구성 디렉터리 " + + "경로를 입력하세요.\x04\x00\x01 M\x02경로가 제공되지 않았으므로 마이그레이션을 포기합니다\x02제공된 디렉토리에서" + + " config.toml 파일을 읽을 수 없습니다. 오류: %[1]s\x02마이너 구성 읽기\x04\x00\x01\x0a\x15" + + "\x02단계 완료: %[1]s\x02이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 업데이트되었습니다.\x02구성 " + + "%[1]s를 %[2]s과 비교하세요. 지갑 주소 이외의 마이너 ID 사이의 변경 사항은 필요한 실행자를 위한 새로운 최소한의 레이" + + "어여야 합니다.\x02이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 생성되었습니다.\x04\x00\x01 *" + + "\x02레이어 %[1]s가 생성되었습니다.\x02Curio를 실행하려면: 기계 또는 cgroup 격리를 사용하여 다음 명령을 사용" + + "하세요 (예제 레이어 선택과 함께):" + +var zhIndex = []uint32{ // 82 elements + // Entry 0 - 1F + 0x00000000, 0x00000048, 0x00000097, 0x000000ca, + 0x000000e3, 0x00000100, 0x00000100, 0x00000141, + 0x0000016b, 0x000001a4, 0x000001a4, 0x000001a4, + 0x000001a4, 0x000001dd, 0x0000022f, 0x0000025c, + 0x000002a9, 0x000002e7, 0x00000317, 0x00000321, + 0x00000337, 0x0000035b, 0x00000379, 0x0000039d, + 0x000003bb, 0x000003d9, 0x0000040e, 0x00000421, + 0x00000430, 0x0000048a, 0x000004c7, 0x000004c7, + // Entry 20 - 3F + 0x000004c7, 0x0000051e, 0x0000051e, 0x0000051e, + 0x00000544, 0x00000544, 0x00000562, 0x0000059e, + 0x000005d0, 0x000005e0, 0x000005f0, 0x00000623, + 0x0000067d, 0x0000068c, 0x0000069b, 0x000006ad, + 0x000006bc, 0x000006ce, 0x000006ed, 0x00000725, + 0x0000074a, 0x0000075a, 0x00000778, 0x00000785, + 0x000007b1, 0x000007de, 0x000007de, 0x00000801, + 0x00000845, 0x00000845, 0x00000874, 0x00000897, + // Entry 40 - 5F + 0x000008b7, 0x000008cc, 0x00000917, 0x00000947, + 0x0000094e, 0x00000978, 0x0000099c, 0x000009e0, + 0x000009e0, 0x000009e0, 0x000009f3, 0x00000a0d, + 0x00000a59, 0x00000adb, 0x00000b27, 0x00000b41, + 0x00000b41, 0x00000b98, +} // Size: 352 bytes + +const zhData string = "" + // Size: 2968 bytes + "\x02这个交互式工具可以在5分钟内将lotus-miner迁移到Curio。\x02每一步都需要您的确认,并且可以撤销。随时按Ctrl+C退出" + + "。\x04\x00\x01 .\x02使用箭头键进行导航:↓ ↑ → ←\x02在终端中按下Ctrl+C\x02Lotus-Miner到Cu" + + "rio迁移。\x02如果适用,您现在可以迁移您的市场节点(%[1]s)。\x02正在将config.toml迁移到数据库。\x02读取数据库时出" + + "错:%[1]s。正在中止迁移。\x02保存配置到层时出错:%[1]s。正在中止迁移\x02Protocol Labs希望改进您使用的软件。告" + + "诉团队您正在使用Curio。\x02选择您想与Curio团队分享的内容。\x02个人数据:矿工ID、Curio版本、网络(%[1]s或%[2" + + "]s)。已签名。\x02聚合-匿名:版本、网络和矿工功率(分桶)。\x02提示:我是在网络上运行Curio的人。\x02没有。\x02中止剩余步" + + "骤。\x02获取矿工功率时出错:%[1]s\x02整理消息时出错:%[1]s\x02获取矿工信息时出错:%[1]s\x02签署消息时出错:%" + + "[1]s\x02发送消息时出错:%[1]s\x04\x00\x01 0\x02发送消息时出错:状态%[1]s,消息:\x02消息已发送。\x04" + + "\x00\x01 \x0a\x02文档:\x02'%[1]s'层存储通用配置。所有Curio实例都可以在其%[2]s参数中包含它。\x02您可以" + + "添加其他层进行每台机器的配置更改。\x02将您的浏览器指向您的网络GUI,以使用%[1]s和高级功能完成设置。\x02等待%[1]s将扇区写" + + "入Yugabyte。\x02验证扇区时出错:%[1]s\x02扇区在数据库中。数据库已准备好用于%[1]s。\x02现在关闭lotus-mi" + + "ner并将系统移至%[1]s。\x02按回车继续\x02中止迁移。\x02扇区已验证。发现了%[1]d个扇区位置。\x02输入连接到您的Yuga" + + "byte数据库安装的信息(https://download.yugabyte.com/)\x02主机:%[1]s\x02端口:%[1]s\x02" + + "用户名:%[1]s\x02密码:%[1]s\x02数据库:%[1]s\x02继续连接和更新架构。\x04\x00\x01 3\x02发生数据" + + "库配置错误,放弃迁移:%[1]s\x02输入Yugabyte数据库主机(S)\x02未提供主机\x02输入Yugabyte数据库 %[1]s" + + "\x02未提供值\x02连接到Yugabyte数据库时出错:%[1]s\x02已连接到Yugabyte。模式是当前的。\x02编码config." + + "toml时出错:%[1]s\x02按回车更新%[1]s以获取Yugabyte信息。现在备份文件。\x02读取config.toml文件模式时出错" + + ":%[1]s\x02写入config.toml时出错:%[1]s\x04\x00\x01 \x1b\x02重新启动Lotus Miner。" + + "\x02已连接到Yugabyte\x02开始之前,请确保您的密封管道已排空并关闭lotus-miner。\x02选择您的lotus-miner配" + + "置目录的位置?\x02其他\x02输入%[1]s使用的配置目录的路径\x04\x00\x01 \x1f\x02未提供路径,放弃迁移\x02无" + + "法读取提供的目录中的config.toml文件,错误:%[1]s\x02读取矿工配置\x04\x00\x01\x0a\x15\x02步骤完成" + + ":%[1]s\x02配置'base'已更新,包含了这个矿工的地址和其钱包设置。\x02比较配置%[1]s和%[2]s。矿工ID之间除了钱包地" + + "址的变化应该是需要的运行者的一个新的、最小的层。\x02配置'base'已创建,包括了这个矿工的地址和其钱包设置。\x04\x00\x01 " + + "\x15\x02层%[1]s已创建。\x02运行Curio:使用机器或cgroup隔离,使用命令(附带示例层选择):" + + // Total table size 12286 bytes (11KiB); checksum: 15B16994 diff --git a/cmd/curio/internal/translations/knowns/main.go b/cmd/curio/internal/translations/knowns/main.go new file mode 100644 index 000000000..a30a94065 --- /dev/null +++ b/cmd/curio/internal/translations/knowns/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + "path" + + "github.com/samber/lo" +) + +func main() { + for _, arg := range os.Args { + handleKnowns(arg) + } +} + +func handleKnowns(pathStart string) { + outpath := path.Join(pathStart, "out.gotext.json") + b, err := os.ReadFile(outpath) + if err != nil { + fmt.Println("cannot open "+outpath+":", err) + return + } + type TMsg struct { + ID string `json:"id"` + Translation string `json:"translation"` + Message string `json:"message"` + Placeholder json.RawMessage `json:"placeholder"` + } + type Dataformat struct { + Language string `json:"language"` + Messages []TMsg `json:"messages"` + } + var outData Dataformat + err = json.NewDecoder(bytes.NewBuffer(b)).Decode(&outData) + if err != nil { + fmt.Println("cannot decode "+outpath+":", err) + return + } + + f, err := os.Open(path.Join(pathStart, "messages.gotext.json")) + if err != nil { + fmt.Println("cannot open "+path.Join(pathStart, "messages.gotext.json")+":", err) + return + } + defer func() { _ = f.Close() }() + + var msgData Dataformat + err = json.NewDecoder(f).Decode(&msgData) + if err != nil { + fmt.Println("cannot decode "+path.Join(pathStart, "messages.gotext.json")+":", err) + return + } + + knowns := map[string]string{} + for _, msg := range msgData.Messages { + knowns[msg.ID] = msg.Translation + } + + toTranslate := lo.Filter(outData.Messages, func(msg TMsg, _ int) bool { + _, ok := knowns[msg.ID] + return !ok + }) + + outData.Messages = toTranslate // drop the "done" messages + var outJSON bytes.Buffer + enc := json.NewEncoder(&outJSON) + enc.SetIndent(" ", " ") + err = enc.Encode(outData) + if err != nil { + fmt.Println("cannot encode "+outpath+":", err) + return + } + err = os.WriteFile(outpath, outJSON.Bytes(), 0644) + if err != nil { + fmt.Println("cannot write "+outpath+":", err) + return + } + fmt.Println("rearranged successfully") +} diff --git a/cmd/curio/internal/translations/locales/en/out.gotext.json b/cmd/curio/internal/translations/locales/en/out.gotext.json new file mode 100644 index 000000000..1cd3957d4 --- /dev/null +++ b/cmd/curio/internal/translations/locales/en/out.gotext.json @@ -0,0 +1,1104 @@ +{ + "language": "en", + "messages": [ + { + "id": "This interactive tool migrates lotus-miner to Curio in 5 minutes.", + "message": "This interactive tool migrates lotus-miner to Curio in 5 minutes.", + "translation": "This interactive tool migrates lotus-miner to Curio in 5 minutes.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.", + "message": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.", + "translation": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Use the arrow keys to navigate: ↓ ↑ → ←", + "message": "Use the arrow keys to navigate: ↓ ↑ → ←", + "translation": "Use the arrow keys to navigate: ↓ ↑ → ←", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Ctrl+C pressed in Terminal", + "message": "Ctrl+C pressed in Terminal", + "translation": "Ctrl+C pressed in Terminal", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Lotus-Miner to Curio Migration.", + "message": "Lotus-Miner to Curio Migration.", + "translation": "Lotus-Miner to Curio Migration.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Try the web interface with {__layersgui} for further guided improvements.", + "message": "Try the web interface with {__layersgui} for further guided improvements.", + "translation": "Try the web interface with {__layersgui} for further guided improvements.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "__layersgui", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"--layers=gui\"" + } + ], + "fuzzy": true + }, + { + "id": "You can now migrate your market node ({Boost}), if applicable.", + "message": "You can now migrate your market node ({Boost}), if applicable.", + "translation": "You can now migrate your market node ({Boost}), if applicable.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Boost", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"Boost\"" + } + ], + "fuzzy": true + }, + { + "id": "Migrating config.toml to database.", + "message": "Migrating config.toml to database.", + "translation": "Migrating config.toml to database.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Error reading from database: {Error}. Aborting Migration.", + "message": "Error reading from database: {Error}. Aborting Migration.", + "translation": "Error reading from database: {Error}. Aborting Migration.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error connecting to lotus node: {Error} {Error_1}", + "message": "Error connecting to lotus node: {Error} {Error_1}", + "translation": "Error connecting to lotus node: {Error} {Error_1}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + }, + { + "id": "Error_1", + "string": "%[2]s", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "err2.Error()" + } + ], + "fuzzy": true + }, + { + "id": "could not get API info for FullNode: {Err}", + "message": "could not get API info for FullNode: {Err}", + "translation": "could not get API info for FullNode: {Err}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Err", + "string": "%[1]w", + "type": "error", + "underlyingType": "interface{Error() string}", + "argNum": 1, + "expr": "err" + } + ], + "fuzzy": true + }, + { + "id": "Error getting token: {Error}", + "message": "Error getting token: {Error}", + "translation": "Error getting token: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error saving config to layer: {Error}. Aborting Migration", + "message": "Error saving config to layer: {Error}. Aborting Migration", + "translation": "Error saving config to layer: {Error}. Aborting Migration", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.", + "message": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.", + "translation": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Select what you want to share with the Curio team.", + "message": "Select what you want to share with the Curio team.", + "translation": "Select what you want to share with the Curio team.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.", + "message": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.", + "translation": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Mainnet", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"mainnet\"" + }, + { + "id": "Testnet", + "string": "%[2]s", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "\"testnet\"" + } + ], + "fuzzy": true + }, + { + "id": "Aggregate-Anonymous: version, net, and Miner power (bucketed).", + "message": "Aggregate-Anonymous: version, net, and Miner power (bucketed).", + "translation": "Aggregate-Anonymous: version, net, and Miner power (bucketed).", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Hint: I am someone running Curio on net.", + "message": "Hint: I am someone running Curio on net.", + "translation": "Hint: I am someone running Curio on net.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Nothing.", + "message": "Nothing.", + "translation": "Nothing.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Aborting remaining steps.", + "message": "Aborting remaining steps.", + "translation": "Aborting remaining steps.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]v", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error getting miner power: {Error}", + "message": "Error getting miner power: {Error}", + "translation": "Error getting miner power: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error marshalling message: {Error}", + "message": "Error marshalling message: {Error}", + "translation": "Error marshalling message: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error getting miner info: {Error}", + "message": "Error getting miner info: {Error}", + "translation": "Error getting miner info: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error signing message: {Error}", + "message": "Error signing message: {Error}", + "translation": "Error signing message: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error sending message: {Error}", + "message": "Error sending message: {Error}", + "translation": "Error sending message: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error sending message: Status {Status}, Message:", + "message": "Error sending message: Status {Status}, Message:", + "translation": "Error sending message: Status {Status}, Message:", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Status", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "resp.Status" + }, + { + "id": "Stringb", + "string": "%[2]v", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "string(b)" + } + ], + "fuzzy": true + }, + { + "id": "Message sent.", + "message": "Message sent.", + "translation": "Message sent.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Documentation:", + "message": "Documentation:", + "translation": "Documentation:", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.", + "message": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.", + "translation": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Base", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"base\"" + }, + { + "id": "__layers", + "string": "%[2]s", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "\"--layers\"" + } + ], + "fuzzy": true + }, + { + "id": "You can add other layers for per-machine configuration changes.", + "message": "You can add other layers for per-machine configuration changes.", + "translation": "You can add other layers for per-machine configuration changes.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "translation": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Slack", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"Slack\"" + }, + { + "id": "Fil_curio_help", + "string": "%[2]s", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "\"#fil-curio-help\"" + }, + { + "id": "Fil_curio_dev", + "string": "%[3]s", + "type": "string", + "underlyingType": "string", + "argNum": 3, + "expr": "\"#fil-curio-dev\"" + } + ], + "fuzzy": true + }, + { + "id": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "message": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "translation": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Post", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"post\"" + } + ], + "fuzzy": true + }, + { + "id": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.", + "message": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.", + "translation": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Boost", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"Boost\"" + } + ], + "fuzzy": true + }, + { + "id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "translation": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "translation": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Lotus_miner", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"lotus-miner\"" + }, + { + "id": "Toml", + "string": "%[2]s", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "\"config.toml\"" + } + ], + "fuzzy": true + }, + { + "id": "Waiting for {Lotus_miner} to write sectors into Yugabyte.", + "message": "Waiting for {Lotus_miner} to write sectors into Yugabyte.", + "translation": "Waiting for {Lotus_miner} to write sectors into Yugabyte.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Lotus_miner", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"lotus-miner\"" + } + ], + "fuzzy": true + }, + { + "id": "Error interpreting miner ID: {Error}: ID: {String}", + "message": "Error interpreting miner ID: {Error}: ID: {String}", + "translation": "Error interpreting miner ID: {Error}: ID: {String}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + }, + { + "id": "String", + "string": "%[2]s", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "d.MinerID.String()" + } + ], + "fuzzy": true + }, + { + "id": "Error verifying sectors: {Error}", + "message": "Error verifying sectors: {Error}", + "translation": "Error verifying sectors: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "The sectors are in the database. The database is ready for {Curio}.", + "message": "The sectors are in the database. The database is ready for {Curio}.", + "translation": "The sectors are in the database. The database is ready for {Curio}.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Curio", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"Curio\"" + } + ], + "fuzzy": true + }, + { + "id": "Now shut down lotus-miner and move the systems to {Curio}.", + "message": "Now shut down lotus-miner and move the systems to {Curio}.", + "translation": "Now shut down lotus-miner and move the systems to {Curio}.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Curio", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"Curio\"" + } + ], + "fuzzy": true + }, + { + "id": "Press return to continue", + "message": "Press return to continue", + "translation": "Press return to continue", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Aborting migration.", + "message": "Aborting migration.", + "translation": "Aborting migration.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Sectors verified. {I} sector locations found.", + "message": "Sectors verified. {I} sector locations found.", + "translation": "Sectors verified. {I} sector locations found.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "I", + "string": "%[1]d", + "type": "[]int", + "underlyingType": "[]int", + "argNum": 1, + "expr": "i" + } + ], + "fuzzy": true + }, + { + "id": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)", + "message": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)", + "translation": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Host: {Hosts_}", + "message": "Host: {Hosts_}", + "translation": "Host: {Hosts_}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Hosts_", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "strings.Join(harmonyCfg.Hosts, \",\")" + } + ], + "fuzzy": true + }, + { + "id": "Port: {Port}", + "message": "Port: {Port}", + "translation": "Port: {Port}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Port", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonyCfg.Port" + } + ], + "fuzzy": true + }, + { + "id": "Username: {Username}", + "message": "Username: {Username}", + "translation": "Username: {Username}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Username", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonyCfg.Username" + } + ], + "fuzzy": true + }, + { + "id": "Password: {Password}", + "message": "Password: {Password}", + "translation": "Password: {Password}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Password", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonyCfg.Password" + } + ], + "fuzzy": true + }, + { + "id": "Database: {Database}", + "message": "Database: {Database}", + "translation": "Database: {Database}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Database", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonyCfg.Database" + } + ], + "fuzzy": true + }, + { + "id": "Continue to connect and update schema.", + "message": "Continue to connect and update schema.", + "translation": "Continue to connect and update schema.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Database config error occurred, abandoning migration: {Error}", + "message": "Database config error occurred, abandoning migration: {Error}", + "translation": "Database config error occurred, abandoning migration: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Enter the Yugabyte database host(s)", + "message": "Enter the Yugabyte database host(s)", + "translation": "Enter the Yugabyte database host(s)", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "No host provided", + "message": "No host provided", + "translation": "No host provided", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Enter the Yugabyte database {Stringport_username_password_databasei_1}", + "message": "Enter the Yugabyte database {Stringport_username_password_databasei_1}", + "translation": "Enter the Yugabyte database {Stringport_username_password_databasei_1}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Stringport_username_password_databasei_1", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "[]string{\"port\", \"username\", \"password\", \"database\"}[i-1]" + } + ], + "fuzzy": true + }, + { + "id": "No value provided", + "message": "No value provided", + "translation": "No value provided", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Error connecting to Yugabyte database: {Error}", + "message": "Error connecting to Yugabyte database: {Error}", + "translation": "Error connecting to Yugabyte database: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Connected to Yugabyte. Schema is current.", + "message": "Connected to Yugabyte. Schema is current.", + "translation": "Connected to Yugabyte. Schema is current.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Enabling Sector Indexing in the database.", + "message": "Enabling Sector Indexing in the database.", + "translation": "Enabling Sector Indexing in the database.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Error encoding config.toml: {Error}", + "message": "Error encoding config.toml: {Error}", + "translation": "Error encoding config.toml: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Press return to update {Toml} with Yugabyte info. Backup the file now.", + "message": "Press return to update {Toml} with Yugabyte info. Backup the file now.", + "translation": "Press return to update {Toml} with Yugabyte info. Backup the file now.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Toml", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"config.toml\"" + } + ], + "fuzzy": true + }, + { + "id": "Error expanding path: {Error}", + "message": "Error expanding path: {Error}", + "translation": "Error expanding path: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error reading filemode of config.toml: {Error}", + "message": "Error reading filemode of config.toml: {Error}", + "translation": "Error reading filemode of config.toml: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Error writing config.toml: {Error}", + "message": "Error writing config.toml: {Error}", + "translation": "Error writing config.toml: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Restart Lotus Miner.", + "message": "Restart Lotus Miner.", + "translation": "Restart Lotus Miner.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Connected to Yugabyte", + "message": "Connected to Yugabyte", + "translation": "Connected to Yugabyte", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.", + "message": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.", + "translation": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Select the location of your lotus-miner config directory?", + "message": "Select the location of your lotus-miner config directory?", + "translation": "Select the location of your lotus-miner config directory?", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Other", + "message": "Other", + "translation": "Other", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Enter the path to the configuration directory used by {Lotus_miner}", + "message": "Enter the path to the configuration directory used by {Lotus_miner}", + "translation": "Enter the path to the configuration directory used by {Lotus_miner}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Lotus_miner", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"lotus-miner\"" + } + ], + "fuzzy": true + }, + { + "id": "No path provided, abandoning migration", + "message": "No path provided, abandoning migration", + "translation": "No path provided, abandoning migration", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Cannot read the config.toml file in the provided directory, Error: {Error}", + "message": "Cannot read the config.toml file in the provided directory, Error: {Error}", + "translation": "Cannot read the config.toml file in the provided directory, Error: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Could not create repo from directory: {Error}. Aborting migration", + "message": "Could not create repo from directory: {Error}. Aborting migration", + "translation": "Could not create repo from directory: {Error}. Aborting migration", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "translation": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Read Miner Config", + "message": "Read Miner Config", + "translation": "Read Miner Config", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Step Complete: {Step}", + "message": "Step Complete: {Step}", + "translation": "Step Complete: {Step}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Step", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "step" + } + ], + "fuzzy": true + }, + { + "id": "Configuration 'base' was updated to include this miner's address and its wallet setup.", + "message": "Configuration 'base' was updated to include this miner's address and its wallet setup.", + "translation": "Configuration 'base' was updated to include this miner's address and its wallet setup.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", + "message": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", + "translation": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Base", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "\"base\"" + }, + { + "id": "MinerAddresses0", + "string": "%[2]s", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "\"mig-\" + curioCfg.Addresses[0].MinerAddresses[0]" + } + ], + "fuzzy": true + }, + { + "id": "Configuration 'base' was created to include this miner's address and its wallet setup.", + "message": "Configuration 'base' was created to include this miner's address and its wallet setup.", + "translation": "Configuration 'base' was created to include this miner's address and its wallet setup.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Layer {LayerName} created.", + "message": "Layer {LayerName} created.", + "translation": "Layer {LayerName} created.", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "LayerName", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "layerName" + } + ], + "fuzzy": true + }, + { + "id": "To work with the config:", + "message": "To work with the config:", + "translation": "To work with the config:", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):", + "message": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):", + "translation": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):", + "translatorComment": "Copied from source.", + "fuzzy": true + } + ] +} \ No newline at end of file diff --git a/cmd/curio/internal/translations/locales/ko/messages.gotext.json b/cmd/curio/internal/translations/locales/ko/messages.gotext.json new file mode 100644 index 000000000..ab0f8c6af --- /dev/null +++ b/cmd/curio/internal/translations/locales/ko/messages.gotext.json @@ -0,0 +1,704 @@ +{ + "language": "ko", + "messages": [ + { + "id": "This interactive tool will walk you through migration of Curio.\nPress Ctrl+C to exit at any time.", + "message": "This interactive tool will walk you through migration of Curio.\nPress Ctrl+C to exit at any time.", + "translation": "이 대화형 도구는 Curio 마이그레이션 과정을 안내합니다.\n언제든지 종료하려면 Ctrl+C를 누르십시오." + }, + { + "id": "This tool confirms each action it does.", + "message": "This tool confirms each action it does.", + "translation": "이 도구는 수행하는 각 작업을 확인합니다." + }, + { + "id": "Ctrl+C pressed in Terminal", + "message": "Ctrl+C pressed in Terminal", + "translation": "터미널에서 Ctrl+C가 눌림" + }, + { + "id": "Verifying Sectors exist in Yugabyte.", + "message": "Verifying Sectors exist in Yugabyte.", + "translation": "Yugabyte에 섹터가 존재하는지 확인 중." + }, + { + "id": "Error verifying sectors: {Error}", + "message": "Error verifying sectors: {Error}", + "translation": "섹터 확인 중 오류 발생: {Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Sectors verified. {I} sectors found.", + "message": "Sectors verified. {I} sectors found.", + "translation": "섹터가 확인되었습니다. {I}개의 섹터가 발견되었습니다.", + "placeholders": [ + { + "id": "I", + "string": "%[1]d", + "type": "[]int", + "underlyingType": "[]int", + "argNum": 1, + "expr": "i" + } + ] + }, + { + "id": "Never remove the database info from the config.toml for lotus-miner as it avoids double PoSt.", + "message": "Never remove the database info from the config.toml for lotus-miner as it avoids double PoSt.", + "translation": "로터스 마이너의 config.toml에서 데이터베이스 정보를 제거하지 마십시오. 두 번의 PoSt를 피하기 위함입니다." + }, + { + "id": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)", + "message": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)", + "translation": "Yugabyte 데이터베이스 설치에 연결할 정보를 입력하십시오 (https://download.yugabyte.com/)" + }, + { + "id": "Host: {Hosts_}", + "message": "Host: {Hosts_}", + "translation": "호스트: {Hosts_}", + "placeholders": [ + { + "id": "Hosts_", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "strings.Join(harmonycfg.Hosts, \",\")" + } + ] + }, + { + "id": "Port: {Port}", + "message": "Port: {Port}", + "translation": "포트: {Port}", + "placeholders": [ + { + "id": "Port", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonycfg.Port" + } + ] + }, + { + "id": "Username: {Username}", + "message": "Username: {Username}", + "translation": "사용자 이름: {Username}", + "placeholders": [ + { + "id": "Username", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonycfg.Username" + } + ] + }, + { + "id": "Password: {Password}", + "message": "Password: {Password}", + "translation": "비밀번호: {Password}", + "placeholders": [ + { + "id": "Password", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonycfg.Password" + } + ] + }, + { + "id": "Database: {Database}", + "message": "Database: {Database}", + "translation": "데이터베이스: {Database}", + "placeholders": [ + { + "id": "Database", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonycfg.Database" + } + ] + }, + { + "id": "Continue to connect and update schema.", + "message": "Continue to connect and update schema.", + "translation": "계속 연결 및 스키마 업데이트." + }, + { + "id": "Database config error occurred, abandoning migration: {Error}", + "message": "Database config error occurred, abandoning migration: {Error}", + "translation": "데이터베이스 구성 오류가 발생하여 마이그레이션을 포기합니다: {Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Enter the Yugabyte database host(s)", + "message": "Enter the Yugabyte database host(s)", + "translation": "Yugabyte 데이터베이스 호스트를 입력하십시오" + }, + { + "id": "No host provided", + "message": "No host provided", + "translation": "호스트가 제공되지 않았습니다" + }, + { + "id": "Enter the Yugabyte database {Stringport_username_password_databasei_1}", + "message": "Enter the Yugabyte database {Stringport_username_password_databasei_1}", + "translation": "Yugabyte 데이터베이스 {Stringport_username_password_databasei_1}을 입력하십시오", + "placeholders": [ + { + "id": "Stringport_username_password_databasei_1", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "[]string{\"port\", \"username\", \"password\", \"database\"}[i-1]" + } + ] + }, + { + "id": "No value provided", + "message": "No value provided", + "translation": "값이 제공되지 않았습니다" + }, + { + "id": "Error connecting to Yugabyte database: {Error}", + "message": "Error connecting to Yugabyte database: {Error}", + "translation": "Yugabyte 데이터베이스에 연결하는 중 오류가 발생했습니다: {Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Connected to Yugabyte. Schema is current.", + "message": "Connected to Yugabyte. Schema is current.", + "translation": "Yugabyte에 연결되었습니다. 스키마가 현재입니다." + }, + { + "id": "Error encoding config.toml: {Error}", + "message": "Error encoding config.toml: {Error}", + "translation": "config.toml을 인코딩하는 중 오류가 발생했습니다: {Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Error reading filemode of config.toml: {Error}", + "message": "Error reading filemode of config.toml: {Error}", + "translation": "config.toml의 파일 모드를 읽는 중 오류가 발생했습니다: {Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Error writing config.toml: {Error}", + "message": "Error writing config.toml: {Error}", + "translation": "config.toml을 쓰는 중 오류가 발생했습니다: {Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Restart Lotus Miner.", + "message": "Restart Lotus Miner.", + "translation": "로터스 마이너 재시작." + }, + { + "id": "Connected to Yugabyte", + "message": "Connected to Yugabyte", + "translation": "Yugabyte에 연결됨" + }, + { + "id": "Select the location of your lotus-miner config directory?", + "message": "Select the location of your lotus-miner config directory?", + "translation": "로터스 마이너 구성 디렉토리의 위치를 선택하시겠습니까?" + }, + { + "id": "Other", + "message": "Other", + "translation": "기타" + }, + { + "id": "Enter the path to the configuration directory used by lotus-miner", + "message": "Enter the path to the configuration directory used by lotus-miner", + "translation": "로터스 마이너에서 사용하는 구성 디렉토리의 경로를 입력하십시오" + }, + { + "id": "No path provided, abandoning migration", + "message": "No path provided, abandoning migration", + "translation": "경로가 제공되지 않았으므로 마이그레이션을 포기합니다" + }, + { + "id": "Cannot read the config.toml file in the provided directory, Error: {Error}", + "message": "Cannot read the config.toml file in the provided directory, Error: {Error}", + "translation": "제공된 디렉토리에서 config.toml 파일을 읽을 수 없습니다. 오류: {Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Read Miner Config", + "message": "Read Miner Config", + "translation": "마이너 구성 읽기" + }, + { + "id": "Completed Step: {Step}", + "message": "Completed Step: {Step}", + "translation": "단계 완료: {Step}", + "placeholders": [ + { + "id": "Step", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "step" + } + ] + }, + { + "id": "This interactive tool migrates lotus-miner to Curio in 5 minutes.", + "translation": "이 대화형 도구는 5분 안에 lotus-miner를 Curio로 이주합니다.", + "message": "This interactive tool migrates lotus-miner to Curio in 5 minutes.", + "placeholder": null + }, + { + "id": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.", + "translation": "각 단계는 확인이 필요하며 되돌릴 수 있습니다. 언제든지 Ctrl+C를 눌러 종료할 수 있습니다.", + "message": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.", + "placeholder": null + }, + { + "id": "Use the arrow keys to navigate: ↓ ↑ → ←", + "translation": "화살표 키를 사용하여 이동하세요: ↓ ↑ → ←", + "message": "Use the arrow keys to navigate: ↓ ↑ → ←", + "placeholder": null + }, + { + "id": "Lotus-Miner to Curio Migration.", + "translation": "Lotus-Miner에서 Curio로 이주.", + "message": "Lotus-Miner to Curio Migration.", + "placeholder": null + }, + { + "id": "Try the web interface with for further guided improvements.", + "translation": "더 나은 안내를 위해 웹 인터페이스를 사용해보세요.", + "message": "Try the web interface with for further guided improvements.", + "placeholder": null + }, + { + "id": "You can now migrate your market node ({Boost}), if applicable.", + "translation": "해당하는 경우 이제 시장 노드를 이주할 수 있습니다 ({Boost}).", + "message": "You can now migrate your market node ({Boost}), if applicable.", + "placeholder": null + }, + { + "id": "Migrating config.toml to database.", + "translation": "config.toml을 데이터베이스로 이주 중입니다.", + "message": "Migrating config.toml to database.", + "placeholder": null + }, + { + "id": "Error reading from database: {Error}. Aborting Migration.", + "translation": "데이터베이스에서 읽는 중 오류 발생: {Error}. 마이그레이션 중단.", + "message": "Error reading from database: {Error}. Aborting Migration.", + "placeholder": null + }, + { + "id": "cannot read API: {Error}. Aborting Migration", + "translation": "API를 읽을 수 없습니다: {Error}. 마이그레이션 중단", + "message": "cannot read API: {Error}. Aborting Migration", + "placeholder": null + }, + { + "id": "Error saving config to layer: {Error}. Aborting Migration", + "translation": "레이어에 구성을 저장하는 중 오류 발생: {Error}. 마이그레이션 중단", + "message": "Error saving config to layer: {Error}. Aborting Migration", + "placeholder": null + }, + { + "id": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.", + "translation": "Protocol Labs는 당신이 사용하는 소프트웨어를 개선하고 싶어합니다. Curio를 사용 중이라고 팀에 알려주세요.", + "message": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.", + "placeholder": null + }, + { + "id": "Select what you want to share with the Curio team.", + "translation": "Curio 팀과 공유하고 싶은 것을 선택하세요.", + "message": "Select what you want to share with the Curio team.", + "placeholder": null + }, + { + "id": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.", + "translation": "개별 데이터: 마이너 ID, Curio 버전, 네트워크 ({Mainnet} 또는 {Testnet}). 서명됨.", + "message": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.", + "placeholder": null + }, + { + "id": "Aggregate-Anonymous: version, net, and Miner power (bucketed).", + "translation": "집계-익명: 버전, 네트워크, 그리고 마이너 파워 (버킷).", + "message": "Aggregate-Anonymous: version, net, and Miner power (bucketed).", + "placeholder": null + }, + { + "id": "Hint: I am someone running Curio on net.", + "translation": "힌트: 네트워크에서 Curio를 실행 중인 사람입니다.", + "message": "Hint: I am someone running Curio on net.", + "placeholder": null + }, + { + "id": "Nothing.", + "translation": "아무것도 없습니다.", + "message": "Nothing.", + "placeholder": null + }, + { + "id": "Aborting remaining steps.", + "translation": "나머지 단계를 중단합니다.", + "message": "Aborting remaining steps.", + "placeholder": null + }, + { + "id": "Error connecting to lotus node: {Error}", + "translation": "로터스 노드에 연결하는 중 오류 발생: {Error}", + "message": "Error connecting to lotus node: {Error}", + "placeholder": null + }, + { + "id": "Error getting miner power: {Error}", + "translation": "마이너 파워를 가져오는 중 오류 발생: {Error}", + "message": "Error getting miner power: {Error}", + "placeholder": null + }, + { + "id": "Error marshalling message: {Error}", + "translation": "메시지를 마샬하는 중 오류 발생: {Error}", + "message": "Error marshalling message: {Error}", + "placeholder": null + }, + { + "id": "Error getting miner info: {Error}", + "translation": "마이너 정보를 가져오는 중 오류 발생: {Error}", + "message": "Error getting miner info: {Error}", + "placeholder": null + }, + { + "id": "Error signing message: {Error}", + "translation": "메시지 서명 중 오류 발생: {Error}", + "message": "Error signing message: {Error}", + "placeholder": null + }, + { + "id": "Error sending message: {Error}", + "translation": "메시지 전송 중 오류 발생: {Error}", + "message": "Error sending message: {Error}", + "placeholder": null + }, + { + "id": "Error sending message: Status {Status}, Message:", + "translation": "메시지 전송 중 오류 발생: 상태 {Status}, 메시지:", + "message": "Error sending message: Status {Status}, Message:", + "placeholder": null + }, + { + "id": "Message sent.", + "translation": "메시지가 전송되었습니다.", + "message": "Message sent.", + "placeholder": null + }, + { + "id": "Documentation:", + "translation": "문서:", + "message": "Documentation:", + "placeholder": null + }, + { + "id": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.", + "translation": "'{Base}' 레이어에는 공통 구성이 저장됩니다. 모든 Curio 인스턴스는 {__layers} 인수에 포함시킬 수 있습니다.", + "message": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.", + "placeholder": null + }, + { + "id": "You can add other layers for per-machine configuration changes.", + "translation": "기계별 구성 변경을 위해 다른 레이어를 추가할 수 있습니다.", + "message": "You can add other layers for per-machine configuration changes.", + "placeholder": null + }, + { + "id": "Join {Fil_curio_help} in Filecoin {Slack} for help.", + "translation": "도움을 위해 Filecoin {Slack}의 {Fil_curio_help}에 가입하세요.", + "message": "Join {Fil_curio_help} in Filecoin {Slack} for help.", + "placeholder": null + }, + { + "id": "Join {Fil_curio_dev} in Filecoin {Slack} to follow development and feedback!", + "translation": "개발과 피드백을 따르려면 Filecoin {Slack}의 {Fil_curio_dev}에 가입하세요!", + "message": "Join {Fil_curio_dev} in Filecoin {Slack} to follow development and feedback!", + "placeholder": null + }, + { + "id": "Want PoST redundancy? Run many Curio instances with the '{Post}' layer.", + "translation": "PoST 중복성이 필요하신가요? '{Post}' 레이어와 함께 여러 Curio 인스턴스를 실행하세요.", + "message": "Want PoST redundancy? Run many Curio instances with the '{Post}' layer.", + "placeholder": null + }, + { + "id": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.", + "translation": "브라우저를 웹 GUI로 이동하여 {Boost} 및 고급 기능으로 설정을 완료하세요.", + "message": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.", + "placeholder": null + }, + { + "id": "For SPs with multiple Miner IDs, run 1 migration per lotus-miner all to the same 1 database. The cluster will serve all Miner IDs.", + "translation": "여러 마이너 ID가 있는 SP의 경우 각 lotus-miner당 1회 마이그레이션을 동일한 1개의 데이터베이스로 모두 실행하세요. 클러스터는 모든 마이너 ID를 제공합니다.", + "message": "For SPs with multiple Miner IDs, run 1 migration per lotus-miner all to the same 1 database. The cluster will serve all Miner IDs.", + "placeholder": null + }, + { + "id": "Please start {Lotus_miner} now that database credentials are in {Toml}.", + "translation": "데이터베이스 자격 증명이 {Toml}에 있으므로 이제 {Lotus_miner}를 시작하세요.", + "message": "Please start {Lotus_miner} now that database credentials are in {Toml}.", + "placeholder": null + }, + { + "id": "Waiting for {Lotus_miner} to write sectors into Yugabyte.", + "translation": "{Lotus_miner}가 Yugabyte에 섹터를 기록하도록 대기 중입니다.", + "message": "Waiting for {Lotus_miner} to write sectors into Yugabyte.", + "placeholder": null + }, + { + "id": "The sectors are in the database. The database is ready for {Curio}.", + "translation": "섹터가 데이터베이스에 있습니다. 데이터베이스가 {Curio}를 위해 준비되었습니다.", + "message": "The sectors are in the database. The database is ready for {Curio}.", + "placeholder": null + }, + { + "id": "Now shut down lotus-miner and move the systems to {Curio}.", + "translation": "이제 lotus-miner를 종료하고 시스템을 {Curio}로 이동하세요.", + "message": "Now shut down lotus-miner and move the systems to {Curio}.", + "placeholder": null + }, + { + "id": "Press return to continue", + "translation": "계속하려면 리턴을 누르세요", + "message": "Press return to continue", + "placeholder": null + }, + { + "id": "Aborting migration.", + "translation": "마이그레이션 중단.", + "message": "Aborting migration.", + "placeholder": null + }, + { + "id": "Sectors verified. {I} sector locations found.", + "translation": "섹터가 확인되었습니다. {I}개의 섹터 위치를 찾았습니다.", + "message": "Sectors verified. {I} sector locations found.", + "placeholder": null + }, + { + "id": "Press return to update {Toml} with Yugabyte info. Backup the file now.", + "translation": "{Toml}을 Yugabyte 정보로 업데이트하려면 리턴을 누르세요. 지금 파일을 백업하세요.", + "message": "Press return to update {Toml} with Yugabyte info. Backup the file now.", + "placeholder": null + }, + { + "id": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.", + "translation": "시작하려면 밀봉 파이프라인이 비어 있고 lotus-miner가 종료되었는지 확인하세요.", + "message": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.", + "placeholder": null + }, + { + "id": "Enter the path to the configuration directory used by {Lotus_miner}", + "translation": "{Lotus_miner}에서 사용하는 구성 디렉터리 경로를 입력하세요.", + "message": "Enter the path to the configuration directory used by {Lotus_miner}", + "placeholder": null + }, + { + "id": "Step Complete: {Step}", + "translation": "단계 완료: {Step}", + "message": "Step Complete: {Step}", + "placeholder": null + }, + { + "id": "Configuration 'base' was updated to include this miner's address and its wallet setup.", + "translation": "이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 업데이트되었습니다.", + "message": "Configuration 'base' was updated to include this miner's address and its wallet setup.", + "placeholder": null + }, + { + "id": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", + "translation": "구성 {Base}를 {MinerAddresses0}과 비교하세요. 지갑 주소 이외의 마이너 ID 사이의 변경 사항은 필요한 실행자를 위한 새로운 최소한의 레이어여야 합니다.", + "message": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", + "placeholder": null + }, + { + "id": "Configuration 'base' was created to include this miner's address and its wallet setup.", + "translation": "이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 생성되었습니다.", + "message": "Configuration 'base' was created to include this miner's address and its wallet setup.", + "placeholder": null + }, + { + "id": "Layer {LayerName} created.", + "translation": "레이어 {LayerName}가 생성되었습니다.", + "message": "Layer {LayerName} created.", + "placeholder": null + }, + { + "id": "To work with the config: \\n", + "translation": "구성을 사용하려면: \\n", + "message": "To work with the config: \\n", + "placeholder": null + }, + { + "id": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):", + "translation": "Curio를 실행하려면: 기계 또는 cgroup 격리를 사용하여 다음 명령을 사용하세요 (예제 레이어 선택과 함께):", + "message": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):", + "placeholder": null + }, + { + "id": "Try the web interface with {__layersgui} for further guided improvements.", + "translation": "더 많은 안내를 위해 {__layersgui}를 사용하여 웹 인터페이스를 시도하세요.", + "message": "Try the web interface with {__layersgui} for further guided improvements.", + "placeholder": null + }, + { + "id": "Error connecting to lotus node: {Error} {Error_1}", + "translation": "lotus 노드에 연결하는 중 오류 발생: {Error} {Error_1}", + "message": "Error connecting to lotus node: {Error} {Error_1}", + "placeholder": null + }, + { + "id": "could not get API info for FullNode: {Err}", + "translation": "FullNode의 API 정보를 가져올 수 없습니다: {Err}", + "message": "could not get API info for FullNode: {Err}", + "placeholder": null + }, + { + "id": "Error getting token: {Error}", + "translation": "토큰을 가져오는 중 오류 발생: {Error}", + "message": "Error getting token: {Error}", + "placeholder": null + }, + { + "id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "translation": "Filecoin {Slack} 채널: {Fil_curio_help} 및 {Fil_curio_dev}", + "message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "placeholder": null + }, + { + "id": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "translation": "'{Post}' 레이어로 여러 Curio 인스턴스를 시작하여 중복성을 확보하세요.", + "message": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "placeholder": null + }, + { + "id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "translation": "한 개의 데이터베이스는 여러 광부 ID를 제공할 수 있습니다: 각 lotus-miner에 대해 마이그레이션을 실행하세요.", + "message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "placeholder": null + }, + { + "id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "translation": "데이터베이스 자격 증명이 {Toml}에 입력되었으므로 지금 {Lotus_miner}을 시작하거나 다시 시작하세요.", + "message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "placeholder": null + }, + { + "id": "Error interpreting miner ID: {Error}: ID: {String}", + "translation": "광부 ID를 해석하는 중 오류 발생: {Error}: ID: {String}", + "message": "Error interpreting miner ID: {Error}: ID: {String}", + "placeholder": null + }, + { + "id": "Enabling Sector Indexing in the database.", + "translation": "데이터베이스에서 Sector Indexing을 활성화합니다.", + "message": "Enabling Sector Indexing in the database.", + "placeholder": null + }, + { + "id": "Error expanding path: {Error}", + "translation": "경로를 확장하는 중 오류 발생: {Error}", + "message": "Error expanding path: {Error}", + "placeholder": null + }, + { + "id": "Could not create repo from directory: {Error}. Aborting migration", + "translation": "디렉토리에서 저장소를 생성할 수 없습니다: {Error}. 마이그레이션을 중단합니다.", + "message": "Could not create repo from directory: {Error}. Aborting migration", + "placeholder": null + }, + { + "id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "translation": "광부 저장소를 잠금 해제할 수 없습니다. 귀하의 광부를 중지해야 합니다: {Error}\n 마이그레이션을 중단합니다.", + "message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "placeholder": null + }, + { + "id": "To work with the config:", + "translation": "구성 파일을 사용하려면:", + "message": "To work with the config:", + "placeholder": null + } + ] +} \ No newline at end of file diff --git a/cmd/curio/internal/translations/locales/ko/out.gotext.json b/cmd/curio/internal/translations/locales/ko/out.gotext.json new file mode 100644 index 000000000..9eb8915c0 --- /dev/null +++ b/cmd/curio/internal/translations/locales/ko/out.gotext.json @@ -0,0 +1,89 @@ +{ + "language": "ko", + "messages": [ + { + "id": "Try the web interface with {__layersgui} for further guided improvements.", + "translation": "", + "message": "Try the web interface with {__layersgui} for further guided improvements.", + "placeholder": null + }, + { + "id": "Error connecting to lotus node: {Error} {Error_1}", + "translation": "", + "message": "Error connecting to lotus node: {Error} {Error_1}", + "placeholder": null + }, + { + "id": "could not get API info for FullNode: {Err}", + "translation": "", + "message": "could not get API info for FullNode: {Err}", + "placeholder": null + }, + { + "id": "Error getting token: {Error}", + "translation": "", + "message": "Error getting token: {Error}", + "placeholder": null + }, + { + "id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "translation": "", + "message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "placeholder": null + }, + { + "id": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "translation": "", + "message": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "placeholder": null + }, + { + "id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "translation": "", + "message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "placeholder": null + }, + { + "id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "translation": "", + "message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "placeholder": null + }, + { + "id": "Error interpreting miner ID: {Error}: ID: {String}", + "translation": "", + "message": "Error interpreting miner ID: {Error}: ID: {String}", + "placeholder": null + }, + { + "id": "Enabling Sector Indexing in the database.", + "translation": "", + "message": "Enabling Sector Indexing in the database.", + "placeholder": null + }, + { + "id": "Error expanding path: {Error}", + "translation": "", + "message": "Error expanding path: {Error}", + "placeholder": null + }, + { + "id": "Could not create repo from directory: {Error}. Aborting migration", + "translation": "", + "message": "Could not create repo from directory: {Error}. Aborting migration", + "placeholder": null + }, + { + "id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "translation": "", + "message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "placeholder": null + }, + { + "id": "To work with the config:", + "translation": "", + "message": "To work with the config:", + "placeholder": null + } + ] + } diff --git a/cmd/curio/internal/translations/locales/zh/messages.gotext.json b/cmd/curio/internal/translations/locales/zh/messages.gotext.json new file mode 100644 index 000000000..ffb5f3bde --- /dev/null +++ b/cmd/curio/internal/translations/locales/zh/messages.gotext.json @@ -0,0 +1,704 @@ +{ + "language": "zh", + "messages": [ + { + "id": "This interactive tool will walk you through migration of Curio.\nPress Ctrl+C to exit at any time.", + "message": "This interactive tool will walk you through migration of Curio.\nPress Ctrl+C to exit at any time.", + "translation": "此互动工具将引导您完成Curio的迁移。\n随时按Ctrl+C退出。" + }, + { + "id": "This tool confirms each action it does.", + "message": "This tool confirms each action it does.", + "translation": "此工具确认其执行的每个操作。" + }, + { + "id": "Ctrl+C pressed in Terminal", + "message": "Ctrl+C pressed in Terminal", + "translation": "在终端中按下Ctrl+C" + }, + { + "id": "Verifying Sectors exist in Yugabyte.", + "message": "Verifying Sectors exist in Yugabyte.", + "translation": "正在验证Yugabyte中的扇区是否存在。" + }, + { + "id": "Error verifying sectors: {Error}", + "message": "Error verifying sectors: {Error}", + "translation": "验证扇区时出错:{Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Sectors verified. {I} sectors found.", + "message": "Sectors verified. {I} sectors found.", + "translation": "已验证扇区。找到了{I}个扇区。", + "placeholders": [ + { + "id": "I", + "string": "%[1]d", + "type": "[]int", + "underlyingType": "[]int", + "argNum": 1, + "expr": "i" + } + ] + }, + { + "id": "Never remove the database info from the config.toml for lotus-miner as it avoids double PoSt.", + "message": "Never remove the database info from the config.toml for lotus-miner as it avoids double PoSt.", + "translation": "从config.toml中永远不要删除lotus-miner的数据库信息,因为它避免了双PoSt。" + }, + { + "id": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)", + "message": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)", + "translation": "输入连接到您的Yugabyte数据库安装的信息(https://download.yugabyte.com/)" + }, + { + "id": "Host: {Hosts_}", + "message": "Host: {Hosts_}", + "translation": "主机:{Hosts_}", + "placeholders": [ + { + "id": "Hosts_", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "strings.Join(harmonycfg.Hosts, \",\")" + } + ] + }, + { + "id": "Port: {Port}", + "message": "Port: {Port}", + "translation": "端口:{Port}", + "placeholders": [ + { + "id": "Port", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonycfg.Port" + } + ] + }, + { + "id": "Username: {Username}", + "message": "Username: {Username}", + "translation": "用户名:{Username}", + "placeholders": [ + { + "id": "Username", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonycfg.Username" + } + ] + }, + { + "id": "Password: {Password}", + "message": "Password: {Password}", + "translation": "密码:{Password}", + "placeholders": [ + { + "id": "Password", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonycfg.Password" + } + ] + }, + { + "id": "Database: {Database}", + "message": "Database: {Database}", + "translation": "数据库:{Database}", + "placeholders": [ + { + "id": "Database", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "harmonycfg.Database" + } + ] + }, + { + "id": "Continue to connect and update schema.", + "message": "Continue to connect and update schema.", + "translation": "继续连接和更新架构。" + }, + { + "id": "Database config error occurred, abandoning migration: {Error}", + "message": "Database config error occurred, abandoning migration: {Error}", + "translation": "发生数据库配置错误,放弃迁移:{Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Enter the Yugabyte database host(s)", + "message": "Enter the Yugabyte database host(s)", + "translation": "输入Yugabyte数据库主机(S)" + }, + { + "id": "No host provided", + "message": "No host provided", + "translation": "未提供主机" + }, + { + "id": "Enter the Yugabyte database {Stringport_username_password_databasei_1}", + "message": "Enter the Yugabyte database {Stringport_username_password_databasei_1}", + "translation": "输入Yugabyte数据库 {Stringport_username_password_databasei_1}", + "placeholders": [ + { + "id": "Stringport_username_password_databasei_1", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "[]string{\"port\", \"username\", \"password\", \"database\"}[i-1]" + } + ] + }, + { + "id": "No value provided", + "message": "No value provided", + "translation": "未提供值" + }, + { + "id": "Error connecting to Yugabyte database: {Error}", + "message": "Error connecting to Yugabyte database: {Error}", + "translation": "连接到Yugabyte数据库时出错:{Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Connected to Yugabyte. Schema is current.", + "message": "Connected to Yugabyte. Schema is current.", + "translation": "已连接到Yugabyte。模式是当前的。" + }, + { + "id": "Error encoding config.toml: {Error}", + "message": "Error encoding config.toml: {Error}", + "translation": "编码config.toml时出错:{Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Error reading filemode of config.toml: {Error}", + "message": "Error reading filemode of config.toml: {Error}", + "translation": "读取config.toml文件模式时出错:{Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Error writing config.toml: {Error}", + "message": "Error writing config.toml: {Error}", + "translation": "写入config.toml时出错:{Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Restart Lotus Miner.", + "message": "Restart Lotus Miner.", + "translation": "重新启动Lotus Miner。" + }, + { + "id": "Connected to Yugabyte", + "message": "Connected to Yugabyte", + "translation": "已连接到Yugabyte" + }, + { + "id": "Select the location of your lotus-miner config directory?", + "message": "Select the location of your lotus-miner config directory?", + "translation": "选择您的lotus-miner配置目录的位置?" + }, + { + "id": "Other", + "message": "Other", + "translation": "其他" + }, + { + "id": "Enter the path to the configuration directory used by lotus-miner", + "message": "Enter the path to the configuration directory used by lotus-miner", + "translation": "输入lotus-miner使用的配置目录的路径" + }, + { + "id": "No path provided, abandoning migration", + "message": "No path provided, abandoning migration", + "translation": "未提供路径,放弃迁移" + }, + { + "id": "Cannot read the config.toml file in the provided directory, Error: {Error}", + "message": "Cannot read the config.toml file in the provided directory, Error: {Error}", + "translation": "无法读取提供的目录中的config.toml文件,错误:{Error}", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ] + }, + { + "id": "Read Miner Config", + "message": "Read Miner Config", + "translation": "读取矿工配置" + }, + { + "id": "Completed Step: {Step}", + "message": "Completed Step: {Step}", + "translation": "完成步骤:{Step}", + "placeholders": [ + { + "id": "Step", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "step" + } + ] + }, + { + "id": "This interactive tool migrates lotus-miner to Curio in 5 minutes.", + "translation": "这个交互式工具可以在5分钟内将lotus-miner迁移到Curio。", + "message": "This interactive tool migrates lotus-miner to Curio in 5 minutes.", + "placeholder": null + }, + { + "id": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.", + "translation": "每一步都需要您的确认,并且可以撤销。随时按Ctrl+C退出。", + "message": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.", + "placeholder": null + }, + { + "id": "Use the arrow keys to navigate: ↓ ↑ → ←", + "translation": "使用箭头键进行导航:↓ ↑ → ←", + "message": "Use the arrow keys to navigate: ↓ ↑ → ←", + "placeholder": null + }, + { + "id": "Lotus-Miner to Curio Migration.", + "translation": "Lotus-Miner到Curio迁移。", + "message": "Lotus-Miner to Curio Migration.", + "placeholder": null + }, + { + "id": "Try the web interface with for further guided improvements.", + "translation": "尝试使用网页界面进行进一步的指导改进。", + "message": "Try the web interface with for further guided improvements.", + "placeholder": null + }, + { + "id": "You can now migrate your market node ({Boost}), if applicable.", + "translation": "如果适用,您现在可以迁移您的市场节点({Boost})。", + "message": "You can now migrate your market node ({Boost}), if applicable.", + "placeholder": null + }, + { + "id": "Migrating config.toml to database.", + "translation": "正在将config.toml迁移到数据库。", + "message": "Migrating config.toml to database.", + "placeholder": null + }, + { + "id": "Error reading from database: {Error}. Aborting Migration.", + "translation": "读取数据库时出错:{Error}。正在中止迁移。", + "message": "Error reading from database: {Error}. Aborting Migration.", + "placeholder": null + }, + { + "id": "cannot read API: {Error}. Aborting Migration", + "translation": "无法读取API:{Error}。正在中止迁移", + "message": "cannot read API: {Error}. Aborting Migration", + "placeholder": null + }, + { + "id": "Error saving config to layer: {Error}. Aborting Migration", + "translation": "保存配置到层时出错:{Error}。正在中止迁移", + "message": "Error saving config to layer: {Error}. Aborting Migration", + "placeholder": null + }, + { + "id": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.", + "translation": "Protocol Labs希望改进您使用的软件。告诉团队您正在使用Curio。", + "message": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.", + "placeholder": null + }, + { + "id": "Select what you want to share with the Curio team.", + "translation": "选择您想与Curio团队分享的内容。", + "message": "Select what you want to share with the Curio team.", + "placeholder": null + }, + { + "id": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.", + "translation": "个人数据:矿工ID、Curio版本、网络({Mainnet}或{Testnet})。已签名。", + "message": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.", + "placeholder": null + }, + { + "id": "Aggregate-Anonymous: version, net, and Miner power (bucketed).", + "translation": "聚合-匿名:版本、网络和矿工功率(分桶)。", + "message": "Aggregate-Anonymous: version, net, and Miner power (bucketed).", + "placeholder": null + }, + { + "id": "Hint: I am someone running Curio on net.", + "translation": "提示:我是在网络上运行Curio的人。", + "message": "Hint: I am someone running Curio on net.", + "placeholder": null + }, + { + "id": "Nothing.", + "translation": "没有。", + "message": "Nothing.", + "placeholder": null + }, + { + "id": "Aborting remaining steps.", + "translation": "中止剩余步骤。", + "message": "Aborting remaining steps.", + "placeholder": null + }, + { + "id": "Error connecting to lotus node: {Error}", + "translation": "连接到莲花节点时出错:{Error}", + "message": "Error connecting to lotus node: {Error}", + "placeholder": null + }, + { + "id": "Error getting miner power: {Error}", + "translation": "获取矿工功率时出错:{Error}", + "message": "Error getting miner power: {Error}", + "placeholder": null + }, + { + "id": "Error marshalling message: {Error}", + "translation": "整理消息时出错:{Error}", + "message": "Error marshalling message: {Error}", + "placeholder": null + }, + { + "id": "Error getting miner info: {Error}", + "translation": "获取矿工信息时出错:{Error}", + "message": "Error getting miner info: {Error}", + "placeholder": null + }, + { + "id": "Error signing message: {Error}", + "translation": "签署消息时出错:{Error}", + "message": "Error signing message: {Error}", + "placeholder": null + }, + { + "id": "Error sending message: {Error}", + "translation": "发送消息时出错:{Error}", + "message": "Error sending message: {Error}", + "placeholder": null + }, + { + "id": "Error sending message: Status {Status}, Message:", + "translation": "发送消息时出错:状态{Status},消息:", + "message": "Error sending message: Status {Status}, Message:", + "placeholder": null + }, + { + "id": "Message sent.", + "translation": "消息已发送。", + "message": "Message sent.", + "placeholder": null + }, + { + "id": "Documentation:", + "translation": "文档:", + "message": "Documentation:", + "placeholder": null + }, + { + "id": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.", + "translation": "'{Base}'层存储通用配置。所有Curio实例都可以在其{__layers}参数中包含它。", + "message": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.", + "placeholder": null + }, + { + "id": "You can add other layers for per-machine configuration changes.", + "translation": "您可以添加其他层进行每台机器的配置更改。", + "message": "You can add other layers for per-machine configuration changes.", + "placeholder": null + }, + { + "id": "Join {Fil_curio_help} in Filecoin {Slack} for help.", + "translation": "加入Filecoin {Slack}中的{Fil_curio_help}寻求帮助。", + "message": "Join {Fil_curio_help} in Filecoin {Slack} for help.", + "placeholder": null + }, + { + "id": "Join {Fil_curio_dev} in Filecoin {Slack} to follow development and feedback!", + "translation": "加入Filecoin {Slack}中的{Fil_curio_dev}来跟踪开发和反馈!", + "message": "Join {Fil_curio_dev} in Filecoin {Slack} to follow development and feedback!", + "placeholder": null + }, + { + "id": "Want PoST redundancy? Run many Curio instances with the '{Post}' layer.", + "translation": "需要PoST冗余?使用'{Post}'层运行多个Curio实例。", + "message": "Want PoST redundancy? Run many Curio instances with the '{Post}' layer.", + "placeholder": null + }, + { + "id": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.", + "translation": "将您的浏览器指向您的网络GUI,以使用{Boost}和高级功能完成设置。", + "message": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.", + "placeholder": null + }, + { + "id": "For SPs with multiple Miner IDs, run 1 migration per lotus-miner all to the same 1 database. The cluster will serve all Miner IDs.", + "translation": "对于具有多个矿工ID的SP,针对所有lotus-miner运行1次迁移到同一个数据库。集群将服务所有矿工ID。", + "message": "For SPs with multiple Miner IDs, run 1 migration per lotus-miner all to the same 1 database. The cluster will serve all Miner IDs.", + "placeholder": null + }, + { + "id": "Please start {Lotus_miner} now that database credentials are in {Toml}.", + "translation": "现在数据库凭证在{Toml}中,请启动{Lotus_miner}。", + "message": "Please start {Lotus_miner} now that database credentials are in {Toml}.", + "placeholder": null + }, + { + "id": "Waiting for {Lotus_miner} to write sectors into Yugabyte.", + "translation": "等待{Lotus_miner}将扇区写入Yugabyte。", + "message": "Waiting for {Lotus_miner} to write sectors into Yugabyte.", + "placeholder": null + }, + { + "id": "The sectors are in the database. The database is ready for {Curio}.", + "translation": "扇区在数据库中。数据库已准备好用于{Curio}。", + "message": "The sectors are in the database. The database is ready for {Curio}.", + "placeholder": null + }, + { + "id": "Now shut down lotus-miner and move the systems to {Curio}.", + "translation": "现在关闭lotus-miner并将系统移至{Curio}。", + "message": "Now shut down lotus-miner and move the systems to {Curio}.", + "placeholder": null + }, + { + "id": "Press return to continue", + "translation": "按回车继续", + "message": "Press return to continue", + "placeholder": null + }, + { + "id": "Aborting migration.", + "translation": "中止迁移。", + "message": "Aborting migration.", + "placeholder": null + }, + { + "id": "Sectors verified. {I} sector locations found.", + "translation": "扇区已验证。发现了{I}个扇区位置。", + "message": "Sectors verified. {I} sector locations found.", + "placeholder": null + }, + { + "id": "Press return to update {Toml} with Yugabyte info. Backup the file now.", + "translation": "按回车更新{Toml}以获取Yugabyte信息。现在备份文件。", + "message": "Press return to update {Toml} with Yugabyte info. Backup the file now.", + "placeholder": null + }, + { + "id": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.", + "translation": "开始之前,请确保您的密封管道已排空并关闭lotus-miner。", + "message": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.", + "placeholder": null + }, + { + "id": "Enter the path to the configuration directory used by {Lotus_miner}", + "translation": "输入{Lotus_miner}使用的配置目录的路径", + "message": "Enter the path to the configuration directory used by {Lotus_miner}", + "placeholder": null + }, + { + "id": "Step Complete: {Step}", + "translation": "步骤完成:{Step}", + "message": "Step Complete: {Step}", + "placeholder": null + }, + { + "id": "Configuration 'base' was updated to include this miner's address and its wallet setup.", + "translation": "配置'base'已更新,包含了这个矿工的地址和其钱包设置。", + "message": "Configuration 'base' was updated to include this miner's address and its wallet setup.", + "placeholder": null + }, + { + "id": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", + "translation": "比较配置{Base}和{MinerAddresses0}。矿工ID之间除了钱包地址的变化应该是需要的运行者的一个新的、最小的层。", + "message": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", + "placeholder": null + }, + { + "id": "Configuration 'base' was created to include this miner's address and its wallet setup.", + "translation": "配置'base'已创建,包括了这个矿工的地址和其钱包设置。", + "message": "Configuration 'base' was created to include this miner's address and its wallet setup.", + "placeholder": null + }, + { + "id": "Layer {LayerName} created.", + "translation": "层{LayerName}已创建。", + "message": "Layer {LayerName} created.", + "placeholder": null + }, + { + "id": "To work with the config: \\n", + "translation": "要使用配置:\\n", + "message": "To work with the config: \\n", + "placeholder": null + }, + { + "id": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):", + "translation": "运行Curio:使用机器或cgroup隔离,使用命令(附带示例层选择):", + "message": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):", + "placeholder": null + }, + { + "id": "Try the web interface with {__layersgui} for further guided improvements.", + "translation": "尝试使用{__layersgui}的Web界面进行进一步引导式改进。", + "message": "Try the web interface with {__layersgui} for further guided improvements.", + "placeholder": null + }, + { + "id": "Error connecting to lotus node: {Error} {Error_1}", + "translation": "连接到lotus节点时出错:{Error} {Error_1}", + "message": "Error connecting to lotus node: {Error} {Error_1}", + "placeholder": null + }, + { + "id": "could not get API info for FullNode: {Err}", + "translation": "无法获取FullNode的API信息:{Err}", + "message": "could not get API info for FullNode: {Err}", + "placeholder": null + }, + { + "id": "Error getting token: {Error}", + "translation": "获取令牌时出错:{Error}", + "message": "Error getting token: {Error}", + "placeholder": null + }, + { + "id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "translation": "Filecoin {Slack} 频道:{Fil_curio_help} 和 {Fil_curio_dev}", + "message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "placeholder": null + }, + { + "id": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "translation": "使用'{Post}'层启动多个Curio实例以实现冗余。", + "message": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "placeholder": null + }, + { + "id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "translation": "一个数据库可以服务多个矿工ID:为每个lotus-miner运行迁移。", + "message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "placeholder": null + }, + { + "id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "translation": "请立即启动(或重新启动){Lotus_miner},因为数据库凭据已在{Toml}中。", + "message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "placeholder": null + }, + { + "id": "Error interpreting miner ID: {Error}: ID: {String}", + "translation": "解释矿工ID时出错:{Error}:ID:{String}", + "message": "Error interpreting miner ID: {Error}: ID: {String}", + "placeholder": null + }, + { + "id": "Enabling Sector Indexing in the database.", + "translation": "在数据库中启用扇区索引。", + "message": "Enabling Sector Indexing in the database.", + "placeholder": null + }, + { + "id": "Error expanding path: {Error}", + "translation": "扩展路径时出错:{Error}", + "message": "Error expanding path: {Error}", + "placeholder": null + }, + { + "id": "Could not create repo from directory: {Error}. Aborting migration", + "translation": "无法从目录创建repo:{Error}。 中止迁移", + "message": "Could not create repo from directory: {Error}. Aborting migration", + "placeholder": null + }, + { + "id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "translation": "无法锁定矿工repo。 您的矿工必须停止:{Error}\n 中止迁移", + "message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "placeholder": null + }, + { + "id": "To work with the config:", + "translation": "要使用配置:", + "message": "To work with the config:", + "placeholder": null + } + ] +} \ No newline at end of file diff --git a/cmd/curio/internal/translations/locales/zh/out.gotext.json b/cmd/curio/internal/translations/locales/zh/out.gotext.json new file mode 100644 index 000000000..37ac5f933 --- /dev/null +++ b/cmd/curio/internal/translations/locales/zh/out.gotext.json @@ -0,0 +1,89 @@ +{ + "language": "zh", + "messages": [ + { + "id": "Try the web interface with {__layersgui} for further guided improvements.", + "translation": "", + "message": "Try the web interface with {__layersgui} for further guided improvements.", + "placeholder": null + }, + { + "id": "Error connecting to lotus node: {Error} {Error_1}", + "translation": "", + "message": "Error connecting to lotus node: {Error} {Error_1}", + "placeholder": null + }, + { + "id": "could not get API info for FullNode: {Err}", + "translation": "", + "message": "could not get API info for FullNode: {Err}", + "placeholder": null + }, + { + "id": "Error getting token: {Error}", + "translation": "", + "message": "Error getting token: {Error}", + "placeholder": null + }, + { + "id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "translation": "", + "message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}", + "placeholder": null + }, + { + "id": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "translation": "", + "message": "Start multiple Curio instances with the '{Post}' layer to redundancy.", + "placeholder": null + }, + { + "id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "translation": "", + "message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.", + "placeholder": null + }, + { + "id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "translation": "", + "message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.", + "placeholder": null + }, + { + "id": "Error interpreting miner ID: {Error}: ID: {String}", + "translation": "", + "message": "Error interpreting miner ID: {Error}: ID: {String}", + "placeholder": null + }, + { + "id": "Enabling Sector Indexing in the database.", + "translation": "", + "message": "Enabling Sector Indexing in the database.", + "placeholder": null + }, + { + "id": "Error expanding path: {Error}", + "translation": "", + "message": "Error expanding path: {Error}", + "placeholder": null + }, + { + "id": "Could not create repo from directory: {Error}. Aborting migration", + "translation": "", + "message": "Could not create repo from directory: {Error}. Aborting migration", + "placeholder": null + }, + { + "id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "translation": "", + "message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration", + "placeholder": null + }, + { + "id": "To work with the config:", + "translation": "", + "message": "To work with the config:", + "placeholder": null + } + ] + } diff --git a/cmd/curio/internal/translations/translations.go b/cmd/curio/internal/translations/translations.go new file mode 100644 index 000000000..361e8e894 --- /dev/null +++ b/cmd/curio/internal/translations/translations.go @@ -0,0 +1,27 @@ +// Usage: +// To UPDATE translations: +// +// 1. add/change strings in guidedsetup folder that use d.T() or d.say(). +// +// 2. run `go generate` in the cmd/curio/internal/translations/ folder. +// +// 3. ChatGPT 3.5 can translate the ./locales/??/out.gotext.json files' +// which ONLY include the un-translated messages. +// APPEND to the messages.gotext.json files's array. +// +// ChatGPT fuss: +// - on a good day, you may need to hit "continue generating". +// - > 60? you'll need to give it sections of the file. +// +// 4. Re-import with `go generate` again. +// +// To ADD a language: +// 1. Add it to the list in updateLang.sh +// 2. Run `go generate` in the cmd/curio/internal/translations/ folder. +// 3. Follow the "Update translations" steps here. +// 4. Code will auto-detect the new language and use it. +// +// FUTURE Reliability: OpenAPI automation. +package translations + +//go:generate ./updateLang.sh diff --git a/cmd/curio/internal/translations/updateLang.sh b/cmd/curio/internal/translations/updateLang.sh new file mode 100755 index 000000000..6325ab146 --- /dev/null +++ b/cmd/curio/internal/translations/updateLang.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +#OP: Only run if some file in ../guidedsetup* is newer than catalog.go +# Change this condition if using translations more widely. +if [ "$(find ../../guidedsetup/* -newermt "$(date -d '1 minute ago')" -newer catalog.go)" ] || [ "$(find locales/* -newermt "$(date -d '1 minute ago')" -newer catalog.go)" ]; then + gotext -srclang=en update -out=catalog.go -lang=en,zh,ko github.com/filecoin-project/lotus/cmd/curio/guidedsetup + go run knowns/main.go locales/zh locales/ko +fi diff --git a/cmd/lotus-provider/main.go b/cmd/curio/main.go similarity index 75% rename from cmd/lotus-provider/main.go rename to cmd/curio/main.go index b4342d49a..8c64af379 100644 --- a/cmd/lotus-provider/main.go +++ b/cmd/curio/main.go @@ -16,7 +16,8 @@ import ( "github.com/filecoin-project/lotus/build" lcli "github.com/filecoin-project/lotus/cli" cliutil "github.com/filecoin-project/lotus/cli/util" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" + "github.com/filecoin-project/lotus/cmd/curio/guidedsetup" "github.com/filecoin-project/lotus/lib/lotuslog" "github.com/filecoin-project/lotus/lib/tracing" "github.com/filecoin-project/lotus/node/repo" @@ -24,7 +25,7 @@ import ( var log = logging.Logger("main") -func SetupCloseHandler() { +func setupCloseHandler() { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { @@ -36,7 +37,6 @@ func SetupCloseHandler() { } func main() { - SetupCloseHandler() lotuslog.SetupLogLevels() @@ -48,10 +48,12 @@ func main() { configCmd, testCmd, webCmd, + guidedsetup.GuidedsetupCmd, + configMigrateCmd, sealCmd, } - jaeger := tracing.SetupJaegerTracing("lotus") + jaeger := tracing.SetupJaegerTracing("curio") defer func() { if jaeger != nil { _ = jaeger.ForceFlush(context.Background()) @@ -65,7 +67,7 @@ func main() { if jaeger != nil { _ = jaeger.Shutdown(cctx.Context) } - jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) + jaeger = tracing.SetupJaegerTracing("curio/" + cmd.Name) if cctx.IsSet("color") { color.NoColor = !cctx.Bool("color") @@ -80,10 +82,14 @@ func main() { } app := &cli.App{ - Name: "lotus-provider", + Name: "curio", Usage: "Filecoin decentralized storage network provider", Version: build.UserVersion(), EnableBashCompletion: true, + Before: func(c *cli.Context) error { + setupCloseHandler() + return nil + }, Flags: []cli.Flag{ &cli.BoolFlag{ // examined in the Before above @@ -93,48 +99,45 @@ func main() { }, &cli.StringFlag{ Name: "panic-reports", - EnvVars: []string{"LOTUS_PANIC_REPORT_PATH"}, + EnvVars: []string{"CURIO_PANIC_REPORT_PATH"}, Hidden: true, - Value: "~/.lotusprovider", // should follow --repo default + Value: "~/.curio", // should follow --repo default }, &cli.StringFlag{ Name: "db-host", - EnvVars: []string{"LOTUS_DB_HOST"}, + EnvVars: []string{"CURIO_DB_HOST", "CURIO_HARMONYDB_HOSTS"}, Usage: "Command separated list of hostnames for yugabyte cluster", Value: "yugabyte", }, &cli.StringFlag{ Name: "db-name", - EnvVars: []string{"LOTUS_DB_NAME", "LOTUS_HARMONYDB_HOSTS"}, + EnvVars: []string{"CURIO_DB_NAME", "CURIO_HARMONYDB_NAME"}, Value: "yugabyte", }, &cli.StringFlag{ Name: "db-user", - EnvVars: []string{"LOTUS_DB_USER", "LOTUS_HARMONYDB_USERNAME"}, + EnvVars: []string{"CURIO_DB_USER", "CURIO_HARMONYDB_USERNAME"}, Value: "yugabyte", }, &cli.StringFlag{ Name: "db-password", - EnvVars: []string{"LOTUS_DB_PASSWORD", "LOTUS_HARMONYDB_PASSWORD"}, + EnvVars: []string{"CURIO_DB_PASSWORD", "CURIO_HARMONYDB_PASSWORD"}, Value: "yugabyte", }, &cli.StringFlag{ Name: "db-port", - EnvVars: []string{"LOTUS_DB_PORT", "LOTUS_HARMONYDB_PORT"}, + EnvVars: []string{"CURIO_DB_PORT", "CURIO_HARMONYDB_PORT"}, Hidden: true, Value: "5433", }, &cli.StringFlag{ Name: deps.FlagRepoPath, - EnvVars: []string{"LOTUS_REPO_PATH"}, - Value: "~/.lotusprovider", + EnvVars: []string{"CURIO_REPO_PATH"}, + Value: "~/.curio", }, cliutil.FlagVeryVerbose, }, Commands: append(local, lcli.CommonCommands...), - Before: func(c *cli.Context) error { - return nil - }, After: func(c *cli.Context) error { if r := recover(); r != nil { p, err := homedir.Expand(c.String(FlagMinerRepo)) @@ -143,7 +146,7 @@ func main() { panic(r) } - // Generate report in LOTUS_PATH and re-raise panic + // Generate report in CURIO_PATH and re-raise panic build.GeneratePanicReport(c.String("panic-reports"), p, c.App.Name) panic(r) } @@ -151,6 +154,6 @@ func main() { }, } app.Setup() - app.Metadata["repoType"] = repo.Provider + app.Metadata["repoType"] = repo.Curio lcli.RunApp(app) } diff --git a/cmd/curio/migrate.go b/cmd/curio/migrate.go new file mode 100644 index 000000000..5cf55bcb4 --- /dev/null +++ b/cmd/curio/migrate.go @@ -0,0 +1,71 @@ +package main + +import ( + "fmt" + + "github.com/urfave/cli/v2" + "golang.org/x/xerrors" + + cliutil "github.com/filecoin-project/lotus/cli/util" + "github.com/filecoin-project/lotus/cmd/curio/guidedsetup" + "github.com/filecoin-project/lotus/node/repo" +) + +var configMigrateCmd = &cli.Command{ + Name: "from-miner", + Usage: "Express a database config (for curio) from an existing miner.", + Description: "Express a database config (for curio) from an existing miner.", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: FlagMinerRepo, + Aliases: []string{FlagMinerRepoDeprecation}, + EnvVars: []string{"LOTUS_MINER_PATH", "LOTUS_STORAGE_PATH"}, + Value: "~/.lotusminer", + Usage: fmt.Sprintf("Specify miner repo path. flag(%s) and env(LOTUS_STORAGE_PATH) are DEPRECATION, will REMOVE SOON", FlagMinerRepoDeprecation), + }, + &cli.StringFlag{ + Name: "repo", + EnvVars: []string{"LOTUS_PATH"}, + Hidden: true, + Value: "~/.lotus", + }, + &cli.StringFlag{ + Name: "to-layer", + Aliases: []string{"t"}, + Usage: "The layer name for this data push. 'base' is recommended for single-miner setup.", + }, + &cli.BoolFlag{ + Name: "overwrite", + Aliases: []string{"o"}, + Usage: "Use this with --to-layer to replace an existing layer", + }, + }, + Action: fromMiner, +} + +const ( + FlagMinerRepo = "miner-repo" +) + +const FlagMinerRepoDeprecation = "storagerepo" + +func fromMiner(cctx *cli.Context) (err error) { + minerRepoPath := cctx.String(FlagMinerRepo) + layerName := cctx.String("to-layer") + overwrite := cctx.Bool("overwrite") + + // Populate API Key + _, header, err := cliutil.GetRawAPI(cctx, repo.FullNode, "v0") + if err != nil { + return fmt.Errorf("cannot read API: %w", err) + } + + ainfo, err := cliutil.GetAPIInfo(&cli.Context{}, repo.FullNode) + if err != nil { + return xerrors.Errorf(`could not get API info for FullNode: %w + Set the environment variable to the value of "lotus auth api-info --perm=admin"`, err) + } + chainApiInfo := header.Get("Authorization")[7:] + ":" + ainfo.Addr + _, err = guidedsetup.SaveConfigToLayer(minerRepoPath, layerName, overwrite, chainApiInfo) + return err +} diff --git a/cmd/lotus-provider/pipeline.go b/cmd/curio/pipeline.go similarity index 92% rename from cmd/lotus-provider/pipeline.go rename to cmd/curio/pipeline.go index 74c49b16a..1c3f5d94a 100644 --- a/cmd/lotus-provider/pipeline.go +++ b/cmd/curio/pipeline.go @@ -12,9 +12,9 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" + "github.com/filecoin-project/lotus/curiosrc/seal" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" - "github.com/filecoin-project/lotus/provider/lpseal" ) var sealCmd = &cli.Command{ @@ -113,7 +113,7 @@ var sealStartCmd = &cli.Command{ return xerrors.Errorf("getting seal proof type: %w", err) } - num, err := lpseal.AllocateSectorNumbers(ctx, dep.Full, dep.DB, act, cctx.Int("count"), func(tx *harmonydb.Tx, numbers []abi.SectorNumber) (bool, error) { + num, err := seal.AllocateSectorNumbers(ctx, dep.Full, dep.DB, act, cctx.Int("count"), func(tx *harmonydb.Tx, numbers []abi.SectorNumber) (bool, error) { for _, n := range numbers { _, err := tx.Exec("insert into sectors_sdr_pipeline (sp_id, sector_number, reg_seal_proof) values ($1, $2, $3)", mid, n, spt) if err != nil { diff --git a/cmd/lotus-provider/proving.go b/cmd/curio/proving.go similarity index 94% rename from cmd/lotus-provider/proving.go rename to cmd/curio/proving.go index c003c907f..3b5a3e0e4 100644 --- a/cmd/lotus-provider/proving.go +++ b/cmd/curio/proving.go @@ -15,9 +15,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" + curio "github.com/filecoin-project/lotus/curiosrc" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" - "github.com/filecoin-project/lotus/provider" ) var testCmd = &cli.Command{ @@ -27,6 +27,9 @@ var testCmd = &cli.Command{ //provingInfoCmd, wdPostCmd, }, + Before: func(cctx *cli.Context) error { + return nil + }, } var wdPostCmd = &cli.Command{ @@ -47,7 +50,7 @@ var wdPostCmd = &cli.Command{ var wdPostTaskCmd = &cli.Command{ Name: "task", Aliases: []string{"scheduled", "schedule", "async", "asynchronous"}, - Usage: "Test the windowpost scheduler by running it on the next available lotus-provider. ", + Usage: "Test the windowpost scheduler by running it on the next available curio. ", Flags: []cli.Flag{ &cli.Uint64Flag{ Name: "deadline", @@ -148,7 +151,7 @@ It will not send any messages to the chain. Since it can compute any deadline, o &cli.StringFlag{ Name: "storage-json", Usage: "path to json file containing storage config", - Value: "~/.lotus-provider/storage.json", + Value: "~/.curio/storage.json", }, &cli.Uint64Flag{ Name: "partition", @@ -164,7 +167,8 @@ It will not send any messages to the chain. Since it can compute any deadline, o return err } - wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := provider.WindowPostScheduler(ctx, deps.Cfg.Fees, deps.Cfg.Proving, deps.Full, deps.Verif, deps.LW, nil, nil, + wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := curio.WindowPostScheduler( + ctx, deps.Cfg.Fees, deps.Cfg.Proving, deps.Full, deps.Verif, deps.LW, nil, nil, deps.As, deps.Maddrs, deps.DB, deps.Stor, deps.Si, deps.Cfg.Subsystems.WindowPostMaxTasks) if err != nil { return err diff --git a/cmd/lotus-provider/rpc/rpc.go b/cmd/curio/rpc/rpc.go similarity index 80% rename from cmd/lotus-provider/rpc/rpc.go rename to cmd/curio/rpc/rpc.go index 54eec45e8..4f3f278d1 100644 --- a/cmd/lotus-provider/rpc/rpc.go +++ b/cmd/curio/rpc/rpc.go @@ -27,34 +27,33 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/client" cliutil "github.com/filecoin-project/lotus/cli/util" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" + "github.com/filecoin-project/lotus/curiosrc/market" + "github.com/filecoin-project/lotus/curiosrc/web" "github.com/filecoin-project/lotus/lib/rpcenc" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/metrics/proxy" "github.com/filecoin-project/lotus/node/repo" - "github.com/filecoin-project/lotus/provider/lpmarket" - "github.com/filecoin-project/lotus/provider/lpweb" "github.com/filecoin-project/lotus/storage/paths" "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) -var log = logging.Logger("lp/rpc") - +var log = logging.Logger("curio/rpc") var permissioned = os.Getenv("LOTUS_DISABLE_AUTH_PERMISSIONED") != "1" -func LotusProviderHandler( +func CurioHandler( authv func(ctx context.Context, token string) ([]auth.Permission, error), remote http.HandlerFunc, - a api.LotusProvider, + a api.Curio, permissioned bool) http.Handler { mux := mux.NewRouter() readerHandler, readerServerOpt := rpcenc.ReaderParamDecoder() rpcServer := jsonrpc.NewServer(jsonrpc.WithServerErrors(api.RPCErrors), readerServerOpt) - wapi := proxy.MetricedAPI[api.LotusProvider, api.LotusProviderStruct](a) + wapi := proxy.MetricedAPI[api.Curio, api.CurioStruct](a) if permissioned { - wapi = api.PermissionedAPI[api.LotusProvider, api.LotusProviderStruct](wapi) + wapi = api.PermissionedAPI[api.Curio, api.CurioStruct](wapi) } rpcServer.Register("Filecoin", wapi) @@ -76,13 +75,16 @@ func LotusProviderHandler( return ah } -type ProviderAPI struct { +type CurioAPI struct { *deps.Deps paths.SectorIndex ShutdownChan chan struct{} } -func (p *ProviderAPI) StorageDetachLocal(ctx context.Context, path string) error { +func (p *CurioAPI) Version(context.Context) (api.Version, error) { + return api.CurioAPIVersion0, nil +} +func (p *CurioAPI) StorageDetachLocal(ctx context.Context, path string) error { path, err := homedir.Expand(path) if err != nil { return xerrors.Errorf("expanding local path: %w", err) @@ -130,7 +132,7 @@ func (p *ProviderAPI) StorageDetachLocal(ctx context.Context, path string) error return p.LocalStore.ClosePath(ctx, localPath.ID) } -func (p *ProviderAPI) StorageLocal(ctx context.Context) (map[storiface.ID]string, error) { +func (p *CurioAPI) StorageLocal(ctx context.Context) (map[storiface.ID]string, error) { ps, err := p.LocalStore.Local(ctx) if err != nil { return nil, err @@ -144,27 +146,23 @@ func (p *ProviderAPI) StorageLocal(ctx context.Context) (map[storiface.ID]string return out, nil } -func (p *ProviderAPI) StorageStat(ctx context.Context, id storiface.ID) (fsutil.FsStat, error) { +func (p *CurioAPI) StorageStat(ctx context.Context, id storiface.ID) (fsutil.FsStat, error) { return p.Stor.FsStat(ctx, id) } -func (p *ProviderAPI) Version(context.Context) (api.Version, error) { - return api.ProviderAPIVersion0, nil -} - -func (p *ProviderAPI) AllocatePieceToSector(ctx context.Context, maddr address.Address, piece api.PieceDealInfo, rawSize int64, source url.URL, header http.Header) (api.SectorOffset, error) { - di := lpmarket.NewPieceIngester(p.Deps.DB, p.Deps.Full) +func (p *CurioAPI) AllocatePieceToSector(ctx context.Context, maddr address.Address, piece api.PieceDealInfo, rawSize int64, source url.URL, header http.Header) (api.SectorOffset, error) { + di := market.NewPieceIngester(p.Deps.DB, p.Deps.Full) return di.AllocatePieceToSector(ctx, maddr, piece, rawSize, source, header) } // Trigger shutdown -func (p *ProviderAPI) Shutdown(context.Context) error { +func (p *CurioAPI) Shutdown(context.Context) error { close(p.ShutdownChan) return nil } -func (p *ProviderAPI) StorageAddLocal(ctx context.Context, path string) error { +func (p *CurioAPI) StorageAddLocal(ctx context.Context, path string) error { path, err := homedir.Expand(path) if err != nil { return xerrors.Errorf("expanding local path: %w", err) @@ -212,10 +210,10 @@ func ListenAndServe(ctx context.Context, dependencies *deps.Deps, shutdownChan c } // Serve the RPC. srv := &http.Server{ - Handler: LotusProviderHandler( + Handler: CurioHandler( authVerify, remoteHandler, - &ProviderAPI{dependencies, dependencies.Si, shutdownChan}, + &CurioAPI{dependencies, dependencies.Si, shutdownChan}, permissioned), ReadHeaderTimeout: time.Minute * 3, BaseContext: func(listener net.Listener) context.Context { @@ -230,7 +228,7 @@ func ListenAndServe(ctx context.Context, dependencies *deps.Deps, shutdownChan c eg.Go(srv.ListenAndServe) if dependencies.Cfg.Subsystems.EnableWebGui { - web, err := lpweb.GetSrv(ctx, dependencies) + web, err := web.GetSrv(ctx, dependencies) if err != nil { return err } @@ -252,8 +250,8 @@ func ListenAndServe(ctx context.Context, dependencies *deps.Deps, shutdownChan c return eg.Wait() } -func GetProviderAPI(ctx *cli.Context) (api.LotusProvider, jsonrpc.ClientCloser, error) { - addr, headers, err := cliutil.GetRawAPI(ctx, repo.Provider, "v0") +func GetCurioAPI(ctx *cli.Context) (api.Curio, jsonrpc.ClientCloser, error) { + addr, headers, err := cliutil.GetRawAPI(ctx, repo.Curio, "v0") if err != nil { return nil, nil, err } @@ -272,5 +270,5 @@ func GetProviderAPI(ctx *cli.Context) (api.LotusProvider, jsonrpc.ClientCloser, addr = u.String() - return client.NewProviderRpc(ctx.Context, addr, headers) + return client.NewCurioRpc(ctx.Context, addr, headers) } diff --git a/cmd/lotus-provider/run.go b/cmd/curio/run.go similarity index 88% rename from cmd/lotus-provider/run.go rename to cmd/curio/run.go index 018f746f0..35fdf4a4d 100644 --- a/cmd/lotus-provider/run.go +++ b/cmd/curio/run.go @@ -14,9 +14,9 @@ import ( "github.com/filecoin-project/lotus/build" lcli "github.com/filecoin-project/lotus/cli" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" - "github.com/filecoin-project/lotus/cmd/lotus-provider/rpc" - "github.com/filecoin-project/lotus/cmd/lotus-provider/tasks" + "github.com/filecoin-project/lotus/cmd/curio/deps" + "github.com/filecoin-project/lotus/cmd/curio/rpc" + "github.com/filecoin-project/lotus/cmd/curio/tasks" "github.com/filecoin-project/lotus/lib/ulimit" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node" @@ -28,7 +28,7 @@ type stackTracer interface { var runCmd = &cli.Command{ Name: "run", - Usage: "Start a lotus provider process", + Usage: "Start a Curio process", Flags: []cli.Flag{ &cli.StringFlag{ Name: "listen", @@ -53,12 +53,12 @@ var runCmd = &cli.Command{ &cli.StringFlag{ Name: "storage-json", Usage: "path to json file containing storage config", - Value: "~/.lotus-provider/storage.json", + Value: "~/.curio/storage.json", }, &cli.StringFlag{ Name: "journal", Usage: "path to journal files", - Value: "~/.lotus-provider/", + Value: "~/.curio/", }, &cli.StringSliceFlag{ Name: "layers", @@ -89,7 +89,7 @@ var runCmd = &cli.Command{ ctx, _ := tag.New(lcli.DaemonContext(cctx), tag.Insert(metrics.Version, build.BuildVersion), tag.Insert(metrics.Commit, build.CurrentCommit), - tag.Insert(metrics.NodeType, "provider"), + tag.Insert(metrics.NodeType, "curio"), ) shutdownChan := make(chan struct{}) { @@ -135,7 +135,7 @@ var runCmd = &cli.Command{ return err } finishCh := node.MonitorShutdown(shutdownChan) //node.ShutdownHandler{Component: "rpc server", StopFunc: rpcStopper}, - //node.ShutdownHandler{Component: "provider", StopFunc: stop}, + //node.ShutdownHandler{Component: "curio", StopFunc: stop}, <-finishCh return nil @@ -144,8 +144,8 @@ var runCmd = &cli.Command{ var webCmd = &cli.Command{ Name: "web", - Usage: "Start lotus provider web interface", - Description: `Start an instance of lotus provider web interface. + Usage: "Start Curio web interface", + Description: `Start an instance of Curio web interface. This creates the 'web' layer if it does not exist, then calls run with that layer.`, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cmd/lotus-provider/stop.go b/cmd/curio/stop.go similarity index 91% rename from cmd/lotus-provider/stop.go rename to cmd/curio/stop.go index 3376d762a..5c7bb9880 100644 --- a/cmd/lotus-provider/stop.go +++ b/cmd/curio/stop.go @@ -10,7 +10,7 @@ import ( var stopCmd = &cli.Command{ Name: "stop", - Usage: "Stop a running lotus provider", + Usage: "Stop a running Curio process", Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { api, closer, err := lcli.GetAPI(cctx) diff --git a/cmd/lotus-provider/storage.go b/cmd/curio/storage.go similarity index 97% rename from cmd/lotus-provider/storage.go rename to cmd/curio/storage.go index 987501816..7b57e9438 100644 --- a/cmd/lotus-provider/storage.go +++ b/cmd/curio/storage.go @@ -23,7 +23,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" - "github.com/filecoin-project/lotus/cmd/lotus-provider/rpc" + "github.com/filecoin-project/lotus/cmd/curio/rpc" "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -104,7 +104,7 @@ over time }, }, Action: func(cctx *cli.Context) error { - minerApi, closer, err := rpc.GetProviderAPI(cctx) + minerApi, closer, err := rpc.GetCurioAPI(cctx) if err != nil { return err } @@ -182,7 +182,7 @@ var storageDetachCmd = &cli.Command{ }, ArgsUsage: "[path]", Action: func(cctx *cli.Context) error { - minerApi, closer, err := rpc.GetProviderAPI(cctx) + minerApi, closer, err := rpc.GetCurioAPI(cctx) if err != nil { return err } @@ -213,7 +213,7 @@ var storageListCmd = &cli.Command{ //storageListSectorsCmd, }, Action: func(cctx *cli.Context) error { - minerApi, closer, err := rpc.GetProviderAPI(cctx) + minerApi, closer, err := rpc.GetCurioAPI(cctx) if err != nil { return err } @@ -412,7 +412,7 @@ var storageFindCmd = &cli.Command{ Usage: "find sector in the storage system", ArgsUsage: "[miner address] [sector number]", Action: func(cctx *cli.Context) error { - minerApi, closer, err := rpc.GetProviderAPI(cctx) + minerApi, closer, err := rpc.GetCurioAPI(cctx) if err != nil { return err } diff --git a/cmd/lotus-provider/tasks/tasks.go b/cmd/curio/tasks/tasks.go similarity index 64% rename from cmd/lotus-provider/tasks/tasks.go rename to cmd/curio/tasks/tasks.go index 6ecd680d0..cdda9d199 100644 --- a/cmd/lotus-provider/tasks/tasks.go +++ b/cmd/curio/tasks/tasks.go @@ -1,4 +1,4 @@ -// Package tasks contains tasks that can be run by the lotus-provider command. +// Package tasks contains tasks that can be run by the curio command. package tasks import ( @@ -8,18 +8,18 @@ import ( "github.com/samber/lo" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" + curio "github.com/filecoin-project/lotus/curiosrc" + "github.com/filecoin-project/lotus/curiosrc/chainsched" + "github.com/filecoin-project/lotus/curiosrc/ffi" + "github.com/filecoin-project/lotus/curiosrc/message" + "github.com/filecoin-project/lotus/curiosrc/seal" + "github.com/filecoin-project/lotus/curiosrc/winning" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" "github.com/filecoin-project/lotus/node/modules" - "github.com/filecoin-project/lotus/provider" - "github.com/filecoin-project/lotus/provider/chainsched" - "github.com/filecoin-project/lotus/provider/lpffi" - "github.com/filecoin-project/lotus/provider/lpmessage" - "github.com/filecoin-project/lotus/provider/lpseal" - "github.com/filecoin-project/lotus/provider/lpwinning" ) -var log = logging.Logger("lotus-provider/deps") +var log = logging.Logger("curio/deps") func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.TaskEngine, error) { cfg := dependencies.Cfg @@ -34,7 +34,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task si := dependencies.Si var activeTasks []harmonytask.TaskInterface - sender, sendTask := lpmessage.NewSender(full, full, db) + sender, sendTask := message.NewSender(full, full, db) activeTasks = append(activeTasks, sendTask) chainSched := chainsched.New(full) @@ -48,8 +48,10 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task // PoSt if cfg.Subsystems.EnableWindowPost { - wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := provider.WindowPostScheduler(ctx, cfg.Fees, cfg.Proving, full, verif, lw, sender, - chainSched, as, maddrs, db, stor, si, cfg.Subsystems.WindowPostMaxTasks) + wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := curio.WindowPostScheduler( + ctx, cfg.Fees, cfg.Proving, full, verif, lw, sender, chainSched, + as, maddrs, db, stor, si, cfg.Subsystems.WindowPostMaxTasks) + if err != nil { return nil, err } @@ -58,7 +60,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task } if cfg.Subsystems.EnableWinningPost { - winPoStTask := lpwinning.NewWinPostTask(cfg.Subsystems.WinningPostMaxTasks, db, lw, verif, full, maddrs) + winPoStTask := winning.NewWinPostTask(cfg.Subsystems.WinningPostMaxTasks, db, lw, verif, full, maddrs) activeTasks = append(activeTasks, winPoStTask) needProofParams = true } @@ -73,40 +75,40 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task { // Sealing - var sp *lpseal.SealPoller - var slr *lpffi.SealCalls + var sp *seal.SealPoller + var slr *ffi.SealCalls if hasAnySealingTask { - sp = lpseal.NewPoller(db, full) + sp = seal.NewPoller(db, full) go sp.RunPoller(ctx) - slr = lpffi.NewSealCalls(stor, lstor, si) + slr = ffi.NewSealCalls(stor, lstor, si) } // NOTE: Tasks with the LEAST priority are at the top if cfg.Subsystems.EnableSealSDR { - sdrTask := lpseal.NewSDRTask(full, db, sp, slr, cfg.Subsystems.SealSDRMaxTasks) + sdrTask := seal.NewSDRTask(full, db, sp, slr, cfg.Subsystems.SealSDRMaxTasks) activeTasks = append(activeTasks, sdrTask) } if cfg.Subsystems.EnableSealSDRTrees { - treesTask := lpseal.NewTreesTask(sp, db, slr, cfg.Subsystems.SealSDRTreesMaxTasks) - finalizeTask := lpseal.NewFinalizeTask(cfg.Subsystems.FinalizeMaxTasks, sp, slr, db) + treesTask := seal.NewTreesTask(sp, db, slr, cfg.Subsystems.SealSDRTreesMaxTasks) + finalizeTask := seal.NewFinalizeTask(cfg.Subsystems.FinalizeMaxTasks, sp, slr, db) activeTasks = append(activeTasks, treesTask, finalizeTask) } if cfg.Subsystems.EnableSendPrecommitMsg { - precommitTask := lpseal.NewSubmitPrecommitTask(sp, db, full, sender, as, cfg.Fees.MaxPreCommitGasFee) + precommitTask := seal.NewSubmitPrecommitTask(sp, db, full, sender, as, cfg.Fees.MaxPreCommitGasFee) activeTasks = append(activeTasks, precommitTask) } if cfg.Subsystems.EnablePoRepProof { - porepTask := lpseal.NewPoRepTask(db, full, sp, slr, cfg.Subsystems.PoRepProofMaxTasks) + porepTask := seal.NewPoRepTask(db, full, sp, slr, cfg.Subsystems.PoRepProofMaxTasks) activeTasks = append(activeTasks, porepTask) needProofParams = true } if cfg.Subsystems.EnableMoveStorage { - moveStorageTask := lpseal.NewMoveStorageTask(sp, slr, db, cfg.Subsystems.MoveStorageMaxTasks) + moveStorageTask := seal.NewMoveStorageTask(sp, slr, db, cfg.Subsystems.MoveStorageMaxTasks) activeTasks = append(activeTasks, moveStorageTask) } if cfg.Subsystems.EnableSendCommitMsg { - commitTask := lpseal.NewSubmitCommitTask(sp, db, full, sender, as, cfg.Fees.MaxCommitGasFee) + commitTask := seal.NewSubmitCommitTask(sp, db, full, sender, as, cfg.Fees.MaxCommitGasFee) activeTasks = append(activeTasks, commitTask) } } @@ -134,7 +136,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task } if hasAnySealingTask { - watcher, err := lpmessage.NewMessageWatcher(db, ht, chainSched, full) + watcher, err := message.NewMessageWatcher(db, ht, chainSched, full) if err != nil { return nil, err } diff --git a/cmd/lotus-provider/config_migrate.go b/cmd/lotus-provider/config_migrate.go deleted file mode 100644 index 572a798a5..000000000 --- a/cmd/lotus-provider/config_migrate.go +++ /dev/null @@ -1,254 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/base64" - "errors" - "fmt" - "os" - "path" - "strings" - - "github.com/BurntSushi/toml" - "github.com/fatih/color" - "github.com/ipfs/go-datastore" - "github.com/samber/lo" - "github.com/urfave/cli/v2" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - - cliutil "github.com/filecoin-project/lotus/cli/util" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" - "github.com/filecoin-project/lotus/lib/harmony/harmonydb" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/modules" - "github.com/filecoin-project/lotus/node/repo" -) - -var configMigrateCmd = &cli.Command{ - Name: "from-miner", - Usage: "Express a database config (for lotus-provider) from an existing miner.", - Description: "Express a database config (for lotus-provider) from an existing miner.", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: FlagMinerRepo, - Aliases: []string{FlagMinerRepoDeprecation}, - EnvVars: []string{"LOTUS_MINER_PATH", "LOTUS_STORAGE_PATH"}, - Value: "~/.lotusminer", - Usage: "Miner repo path", - }, - &cli.StringFlag{ - Name: "repo", - EnvVars: []string{"LOTUS_PATH"}, - Hidden: true, - Value: "~/.lotus", - }, - &cli.StringFlag{ - Name: "to-layer", - Aliases: []string{"t"}, - Usage: "The layer name for this data push. 'base' is recommended for single-miner setup.", - }, - &cli.BoolFlag{ - Name: "overwrite", - Aliases: []string{"o"}, - Usage: "Use this with --to-layer to replace an existing layer", - }, - }, - Action: fromMiner, -} - -const ( - FlagMinerRepo = "miner-repo" -) - -const FlagMinerRepoDeprecation = "storagerepo" - -func fromMiner(cctx *cli.Context) (err error) { - ctx := context.Background() - cliCommandColor := color.New(color.FgHiBlue).SprintFunc() - configColor := color.New(color.FgHiGreen).SprintFunc() - - r, err := repo.NewFS(cctx.String(FlagMinerRepo)) - if err != nil { - return err - } - - ok, err := r.Exists() - if err != nil { - return err - } - - if !ok { - return fmt.Errorf("repo not initialized") - } - - lr, err := r.LockRO(repo.StorageMiner) - if err != nil { - return fmt.Errorf("locking repo: %w", err) - } - defer func() { _ = lr.Close() }() - - cfgNode, err := lr.Config() - if err != nil { - return fmt.Errorf("getting node config: %w", err) - } - smCfg := cfgNode.(*config.StorageMiner) - - db, err := harmonydb.NewFromConfig(smCfg.HarmonyDB) - if err != nil { - return fmt.Errorf("could not reach the database. Ensure the Miner config toml's HarmonyDB entry"+ - " is setup to reach Yugabyte correctly: %w", err) - } - - var titles []string - err = db.Select(ctx, &titles, `SELECT title FROM harmony_config WHERE LENGTH(config) > 0`) - if err != nil { - return fmt.Errorf("miner cannot reach the db. Ensure the config toml's HarmonyDB entry"+ - " is setup to reach Yugabyte correctly: %s", err.Error()) - } - name := cctx.String("to-layer") - if name == "" { - name = fmt.Sprintf("mig%d", len(titles)) - } else { - if lo.Contains(titles, name) && !cctx.Bool("overwrite") { - return errors.New("the overwrite flag is needed to replace existing layer: " + name) - } - } - msg := "Layer " + configColor(name) + ` created. ` - - // Copy over identical settings: - - buf, err := os.ReadFile(path.Join(lr.Path(), "config.toml")) - if err != nil { - return fmt.Errorf("could not read config.toml: %w", err) - } - lpCfg := config.DefaultLotusProvider() - _, err = deps.LoadConfigWithUpgrades(string(buf), lpCfg) - if err != nil { - return fmt.Errorf("could not decode toml: %w", err) - } - - // Populate Miner Address - mmeta, err := lr.Datastore(ctx, "/metadata") - if err != nil { - return xerrors.Errorf("opening miner metadata datastore: %w", err) - } - defer func() { - _ = mmeta.Close() - }() - - maddrBytes, err := mmeta.Get(ctx, datastore.NewKey("miner-address")) - if err != nil { - return xerrors.Errorf("getting miner address datastore entry: %w", err) - } - - addr, err := address.NewFromBytes(maddrBytes) - if err != nil { - return xerrors.Errorf("parsing miner actor address: %w", err) - } - - lpCfg.Addresses = []config.LotusProviderAddresses{{ - MinerAddresses: []string{addr.String()}, - }} - - ks, err := lr.KeyStore() - if err != nil { - return xerrors.Errorf("keystore err: %w", err) - } - js, err := ks.Get(modules.JWTSecretName) - if err != nil { - return xerrors.Errorf("error getting JWTSecretName: %w", err) - } - - lpCfg.Apis.StorageRPCSecret = base64.StdEncoding.EncodeToString(js.PrivateKey) - - // Populate API Key - _, header, err := cliutil.GetRawAPI(cctx, repo.FullNode, "v0") - if err != nil { - return fmt.Errorf("cannot read API: %w", err) - } - - ainfo, err := cliutil.GetAPIInfo(&cli.Context{}, repo.FullNode) - if err != nil { - return xerrors.Errorf(`could not get API info for FullNode: %w - Set the environment variable to the value of "lotus auth api-info --perm=admin"`, err) - } - lpCfg.Apis.ChainApiInfo = []string{header.Get("Authorization")[7:] + ":" + ainfo.Addr} - - // WindowPoSt message - msg += "\n!! Before running lotus-provider with Window PoSt enabled, ensure any miner/worker answering of WindowPost is disabled by " + - "(on Miner) " + configColor("DisableBuiltinWindowPoSt=true") + " and (on Workers) not enabling windowpost on CLI or via " + - "environment variable " + configColor("LOTUS_WORKER_WINDOWPOST") + "." - - // WinningPoSt message - msg += "\n!! Before running lotus-provider with Winning PoSt enabled, ensure any miner/worker answering of WinningPost is disabled by " + - "(on Miner) " + configColor("DisableBuiltinWinningPoSt=true") + " and (on Workers) not enabling winningpost on CLI or via " + - "environment variable " + configColor("LOTUS_WORKER_WINNINGPOST") + "." - - // Express as configTOML - configTOML := &bytes.Buffer{} - if err = toml.NewEncoder(configTOML).Encode(lpCfg); err != nil { - return err - } - - if !lo.Contains(titles, "base") { - cfg, err := getDefaultConfig(true) - if err != nil { - return xerrors.Errorf("Cannot get default config: %w", err) - } - _, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ('base', $1)", cfg) - - if err != nil { - return err - } - } - - if cctx.Bool("overwrite") { - i, err := db.Exec(ctx, "DELETE FROM harmony_config WHERE title=$1", name) - if i != 0 { - fmt.Println("Overwriting existing layer") - } - if err != nil { - fmt.Println("Got error while deleting existing layer: " + err.Error()) - } - } - - _, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ($1, $2)", name, configTOML.String()) - if err != nil { - return err - } - - dbSettings := "" - def := config.DefaultStorageMiner().HarmonyDB - if def.Hosts[0] != smCfg.HarmonyDB.Hosts[0] { - dbSettings += ` --db-host="` + strings.Join(smCfg.HarmonyDB.Hosts, ",") + `"` - } - if def.Port != smCfg.HarmonyDB.Port { - dbSettings += " --db-port=" + smCfg.HarmonyDB.Port - } - if def.Username != smCfg.HarmonyDB.Username { - dbSettings += ` --db-user="` + smCfg.HarmonyDB.Username + `"` - } - if def.Password != smCfg.HarmonyDB.Password { - dbSettings += ` --db-password="` + smCfg.HarmonyDB.Password + `"` - } - if def.Database != smCfg.HarmonyDB.Database { - dbSettings += ` --db-name="` + smCfg.HarmonyDB.Database + `"` - } - - var layerMaybe string - if name != "base" { - layerMaybe = "--layer=" + name - } - - msg += ` -To work with the config: -` + cliCommandColor(`lotus-provider `+dbSettings+` config help `) - msg += ` -To run Lotus Provider: in its own machine or cgroup without other files, use the command: -` + cliCommandColor(`lotus-provider `+dbSettings+` run `+layerMaybe) - fmt.Println(msg) - return nil -} diff --git a/cmd/lotus-shed/lpdeal.go b/cmd/lotus-shed/deal.go similarity index 98% rename from cmd/lotus-shed/lpdeal.go rename to cmd/lotus-shed/deal.go index 01f886015..f8ef54563 100644 --- a/cmd/lotus-shed/lpdeal.go +++ b/cmd/lotus-shed/deal.go @@ -34,13 +34,13 @@ import ( "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" + cumarket "github.com/filecoin-project/lotus/curiosrc/market" + "github.com/filecoin-project/lotus/curiosrc/market/fakelm" "github.com/filecoin-project/lotus/lib/must" "github.com/filecoin-project/lotus/lib/nullreader" "github.com/filecoin-project/lotus/metrics/proxy" "github.com/filecoin-project/lotus/node" - "github.com/filecoin-project/lotus/provider/lpmarket" - "github.com/filecoin-project/lotus/provider/lpmarket/fakelm" "github.com/filecoin-project/lotus/storage/paths" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -88,7 +88,7 @@ var lpUtilStartDealCmd = &cli.Command{ } // open rpc - var rpc api.LotusProviderStruct + var rpc api.CurioStruct closer2, err := jsonrpc.NewMergeClient(ctx, cctx.String("provider-rpc"), "Filecoin", []interface{}{&rpc.Internal}, nil) if err != nil { return xerrors.Errorf("open rpc: %w", err) @@ -368,7 +368,7 @@ var lpBoostProxyCmd = &cli.Command{ defer closer() - pin := lpmarket.NewPieceIngester(db, full) + pin := cumarket.NewPieceIngester(db, full) si := paths.NewDBIndex(nil, db) diff --git a/provider/address.go b/curiosrc/address.go similarity index 89% rename from provider/address.go rename to curiosrc/address.go index 84a10a5d7..6d1738f2d 100644 --- a/provider/address.go +++ b/curiosrc/address.go @@ -1,4 +1,4 @@ -package provider +package curio import ( "golang.org/x/xerrors" @@ -6,11 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/curiosrc/multictladdr" "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/provider/multictladdr" ) -func AddressSelector(addrConf []config.LotusProviderAddresses) func() (*multictladdr.MultiAddressSelector, error) { +func AddressSelector(addrConf []config.CurioAddresses) func() (*multictladdr.MultiAddressSelector, error) { return func() (*multictladdr.MultiAddressSelector, error) { as := &multictladdr.MultiAddressSelector{ MinerMap: make(map[address.Address]api.AddressConfig), diff --git a/curiosrc/builder.go b/curiosrc/builder.go new file mode 100644 index 000000000..3a3294a29 --- /dev/null +++ b/curiosrc/builder.go @@ -0,0 +1,46 @@ +package curio + +import ( + "context" + "time" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/curiosrc/chainsched" + "github.com/filecoin-project/lotus/curiosrc/message" + "github.com/filecoin-project/lotus/curiosrc/multictladdr" + "github.com/filecoin-project/lotus/curiosrc/window" + "github.com/filecoin-project/lotus/lib/harmony/harmonydb" + "github.com/filecoin-project/lotus/node/config" + dtypes "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/storage/paths" + "github.com/filecoin-project/lotus/storage/sealer" + "github.com/filecoin-project/lotus/storage/sealer/storiface" +) + +//var log = logging.Logger("provider") + +func WindowPostScheduler(ctx context.Context, fc config.CurioFees, pc config.ProvingConfig, + api api.FullNode, verif storiface.Verifier, lw *sealer.LocalWorker, sender *message.Sender, chainSched *chainsched.CurioChainSched, + as *multictladdr.MultiAddressSelector, addresses map[dtypes.MinerAddress]bool, db *harmonydb.DB, + stor paths.Store, idx paths.SectorIndex, max int) (*window.WdPostTask, *window.WdPostSubmitTask, *window.WdPostRecoverDeclareTask, error) { + + // todo config + ft := window.NewSimpleFaultTracker(stor, idx, pc.ParallelCheckLimit, time.Duration(pc.SingleCheckTimeout), time.Duration(pc.PartitionCheckTimeout)) + + computeTask, err := window.NewWdPostTask(db, api, ft, lw, verif, chainSched, addresses, max) + if err != nil { + return nil, nil, nil, err + } + + submitTask, err := window.NewWdPostSubmitTask(chainSched, sender, db, api, fc.MaxWindowPoStGasFee, as) + if err != nil { + return nil, nil, nil, err + } + + recoverTask, err := window.NewWdPostRecoverDeclareTask(sender, db, api, ft, as, chainSched, fc.MaxWindowPoStGasFee, addresses) + if err != nil { + return nil, nil, nil, err + } + + return computeTask, submitTask, recoverTask, nil +} diff --git a/provider/chainsched/chain_sched.go b/curiosrc/chainsched/chain_sched.go similarity index 77% rename from provider/chainsched/chain_sched.go rename to curiosrc/chainsched/chain_sched.go index 238baac54..42a387fbc 100644 --- a/provider/chainsched/chain_sched.go +++ b/curiosrc/chainsched/chain_sched.go @@ -14,29 +14,29 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -var log = logging.Logger("chainsched") +var log = logging.Logger("curio/chainsched") type NodeAPI interface { ChainHead(context.Context) (*types.TipSet, error) ChainNotify(context.Context) (<-chan []*api.HeadChange, error) } -type ProviderChainSched struct { +type CurioChainSched struct { api NodeAPI callbacks []UpdateFunc started bool } -func New(api NodeAPI) *ProviderChainSched { - return &ProviderChainSched{ +func New(api NodeAPI) *CurioChainSched { + return &CurioChainSched{ api: api, } } type UpdateFunc func(ctx context.Context, revert, apply *types.TipSet) error -func (s *ProviderChainSched) AddHandler(ch UpdateFunc) error { +func (s *CurioChainSched) AddHandler(ch UpdateFunc) error { if s.started { return xerrors.Errorf("cannot add handler after start") } @@ -45,7 +45,7 @@ func (s *ProviderChainSched) AddHandler(ch UpdateFunc) error { return nil } -func (s *ProviderChainSched) Run(ctx context.Context) { +func (s *CurioChainSched) Run(ctx context.Context) { s.started = true var ( @@ -88,7 +88,7 @@ func (s *ProviderChainSched) Run(ctx context.Context) { continue } - ctx, span := trace.StartSpan(ctx, "ProviderChainSched.headChange") + ctx, span := trace.StartSpan(ctx, "CurioChainSched.headChange") s.update(ctx, nil, chg.Val) @@ -97,7 +97,7 @@ func (s *ProviderChainSched) Run(ctx context.Context) { continue } - ctx, span := trace.StartSpan(ctx, "ProviderChainSched.headChange") + ctx, span := trace.StartSpan(ctx, "CurioChainSched.headChange") var lowest, highest *types.TipSet = nil, nil @@ -122,15 +122,15 @@ func (s *ProviderChainSched) Run(ctx context.Context) { } } -func (s *ProviderChainSched) update(ctx context.Context, revert, apply *types.TipSet) { +func (s *CurioChainSched) update(ctx context.Context, revert, apply *types.TipSet) { if apply == nil { - log.Error("no new tipset in ProviderChainSched.update") + log.Error("no new tipset in CurioChainSched.update") return } for _, ch := range s.callbacks { if err := ch(ctx, revert, apply); err != nil { - log.Errorf("handling head updates in provider chain sched: %+v", err) + log.Errorf("handling head updates in curio chain sched: %+v", err) } } } diff --git a/provider/lpffi/sdr_funcs.go b/curiosrc/ffi/sdr_funcs.go similarity index 98% rename from provider/lpffi/sdr_funcs.go rename to curiosrc/ffi/sdr_funcs.go index 05a7bbd80..0520fd555 100644 --- a/provider/lpffi/sdr_funcs.go +++ b/curiosrc/ffi/sdr_funcs.go @@ -1,4 +1,4 @@ -package lpffi +package ffi import ( "context" @@ -19,8 +19,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" proof2 "github.com/filecoin-project/go-state-types/proof" + "github.com/filecoin-project/lotus/curiosrc/proof" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" - "github.com/filecoin-project/lotus/provider/lpproof" "github.com/filecoin-project/lotus/storage/paths" "github.com/filecoin-project/lotus/storage/sealer/proofpaths" "github.com/filecoin-project/lotus/storage/sealer/storiface" @@ -151,7 +151,7 @@ func (sb *SealCalls) TreeD(ctx context.Context, sector storiface.SectorRef, size } defer releaseSector() - return lpproof.BuildTreeD(data, unpaddedData, filepath.Join(paths.Cache, proofpaths.TreeDName), size) + return proof.BuildTreeD(data, unpaddedData, filepath.Join(paths.Cache, proofpaths.TreeDName), size) } func (sb *SealCalls) TreeRC(ctx context.Context, sector storiface.SectorRef, unsealed cid.Cid) (cid.Cid, cid.Cid, error) { diff --git a/provider/lpffi/task_storage.go b/curiosrc/ffi/task_storage.go similarity index 99% rename from provider/lpffi/task_storage.go rename to curiosrc/ffi/task_storage.go index 01d6671c7..ddc5e00a3 100644 --- a/provider/lpffi/task_storage.go +++ b/curiosrc/ffi/task_storage.go @@ -1,4 +1,4 @@ -package lpffi +package ffi import ( "context" diff --git a/provider/lpmarket/deal_ingest.go b/curiosrc/market/deal_ingest.go similarity index 95% rename from provider/lpmarket/deal_ingest.go rename to curiosrc/market/deal_ingest.go index 0858cf801..ea382717a 100644 --- a/provider/lpmarket/deal_ingest.go +++ b/curiosrc/market/deal_ingest.go @@ -1,4 +1,4 @@ -package lpmarket +package market import ( "context" @@ -17,8 +17,8 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/curiosrc/seal" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" - "github.com/filecoin-project/lotus/provider/lpseal" ) type Ingester interface { @@ -72,7 +72,7 @@ func (p *PieceIngester) AllocatePieceToSector(ctx context.Context, maddr address return api.SectorOffset{}, xerrors.Errorf("getting miner ID: %w", err) } - num, err := lpseal.AllocateSectorNumbers(ctx, p.api, p.db, maddr, 1, func(tx *harmonydb.Tx, numbers []abi.SectorNumber) (bool, error) { + num, err := seal.AllocateSectorNumbers(ctx, p.api, p.db, maddr, 1, func(tx *harmonydb.Tx, numbers []abi.SectorNumber) (bool, error) { if len(numbers) != 1 { return false, xerrors.Errorf("expected one sector number") } diff --git a/provider/lpmarket/fakelm/iface.go b/curiosrc/market/fakelm/iface.go similarity index 100% rename from provider/lpmarket/fakelm/iface.go rename to curiosrc/market/fakelm/iface.go diff --git a/provider/lpmarket/fakelm/lmimpl.go b/curiosrc/market/fakelm/lmimpl.go similarity index 98% rename from provider/lpmarket/fakelm/lmimpl.go rename to curiosrc/market/fakelm/lmimpl.go index abbc4d04d..1f6c5b91d 100644 --- a/provider/lpmarket/fakelm/lmimpl.go +++ b/curiosrc/market/fakelm/lmimpl.go @@ -20,9 +20,9 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/curiosrc/market" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/provider/lpmarket" "github.com/filecoin-project/lotus/storage/paths" sealing "github.com/filecoin-project/lotus/storage/pipeline" "github.com/filecoin-project/lotus/storage/sealer/storiface" @@ -37,12 +37,12 @@ type LMRPCProvider struct { ssize abi.SectorSize - pi lpmarket.Ingester + pi market.Ingester db *harmonydb.DB confLayer string } -func NewLMRPCProvider(si paths.SectorIndex, full api.FullNode, maddr address.Address, minerID abi.ActorID, ssize abi.SectorSize, pi lpmarket.Ingester, db *harmonydb.DB, confLayer string) *LMRPCProvider { +func NewLMRPCProvider(si paths.SectorIndex, full api.FullNode, maddr address.Address, minerID abi.ActorID, ssize abi.SectorSize, pi market.Ingester, db *harmonydb.DB, confLayer string) *LMRPCProvider { return &LMRPCProvider{ si: si, full: full, @@ -343,7 +343,7 @@ func (l *LMRPCProvider) AuthNew(ctx context.Context, perms []auth.Permission) ([ return nil, xerrors.Errorf("no harmony config found") } - lp := config.DefaultLotusProvider() + lp := config.DefaultCurioConfig() if _, err := toml.Decode(cs[0].Config, lp); err != nil { return nil, xerrors.Errorf("decode harmony config: %w", err) } diff --git a/provider/lpmessage/sender.go b/curiosrc/message/sender.go similarity index 98% rename from provider/lpmessage/sender.go rename to curiosrc/message/sender.go index 97f889ecc..614bc0be2 100644 --- a/provider/lpmessage/sender.go +++ b/curiosrc/message/sender.go @@ -1,4 +1,4 @@ -package lpmessage +package message import ( "bytes" @@ -22,7 +22,7 @@ import ( "github.com/filecoin-project/lotus/lib/promise" ) -var log = logging.Logger("lpmessage") +var log = logging.Logger("curio/message") var SendLockedWait = 100 * time.Millisecond @@ -187,7 +187,7 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b } else { // Note: this handles an unlikely edge-case: // We have previously signed the message but either failed to send it or failed to update the db - // note that when that happens the likely cause is the provider process losing its db connection + // note that when that happens the likely cause is the curio process losing its db connection // or getting killed before it can update the db. In that case the message lock will still be held // so it will be safe to rebroadcast the signed message diff --git a/provider/lpmessage/watch.go b/curiosrc/message/watch.go similarity index 97% rename from provider/lpmessage/watch.go rename to curiosrc/message/watch.go index 1a04a67a1..2253df284 100644 --- a/provider/lpmessage/watch.go +++ b/curiosrc/message/watch.go @@ -1,4 +1,4 @@ -package lpmessage +package message import ( "context" @@ -12,9 +12,9 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/curiosrc/chainsched" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" - "github.com/filecoin-project/lotus/provider/chainsched" ) const MinConfidence = 6 @@ -38,7 +38,7 @@ type MessageWatcher struct { bestTs atomic.Pointer[types.TipSetKey] } -func NewMessageWatcher(db *harmonydb.DB, ht *harmonytask.TaskEngine, pcs *chainsched.ProviderChainSched, api MessageWaiterApi) (*MessageWatcher, error) { +func NewMessageWatcher(db *harmonydb.DB, ht *harmonytask.TaskEngine, pcs *chainsched.CurioChainSched, api MessageWaiterApi) (*MessageWatcher, error) { mw := &MessageWatcher{ db: db, ht: ht, diff --git a/provider/multictladdr/multiaddresses.go b/curiosrc/multictladdr/multiaddresses.go similarity index 97% rename from provider/multictladdr/multiaddresses.go rename to curiosrc/multictladdr/multiaddresses.go index 4f1947729..af751ff17 100644 --- a/provider/multictladdr/multiaddresses.go +++ b/curiosrc/multictladdr/multiaddresses.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/lotus/storage/ctladdr" ) -var log = logging.Logger("multictladdr") +var log = logging.Logger("curio/multictladdr") type MultiAddressSelector struct { MinerMap map[address.Address]api.AddressConfig diff --git a/provider/lpproof/treed_build.go b/curiosrc/proof/treed_build.go similarity index 99% rename from provider/lpproof/treed_build.go rename to curiosrc/proof/treed_build.go index 12d0ee93e..59161caa9 100644 --- a/provider/lpproof/treed_build.go +++ b/curiosrc/proof/treed_build.go @@ -1,4 +1,4 @@ -package lpproof +package proof import ( "io" diff --git a/provider/lpproof/treed_build_test.go b/curiosrc/proof/treed_build_test.go similarity index 99% rename from provider/lpproof/treed_build_test.go rename to curiosrc/proof/treed_build_test.go index f9bbde20a..f69e98322 100644 --- a/provider/lpproof/treed_build_test.go +++ b/curiosrc/proof/treed_build_test.go @@ -1,4 +1,4 @@ -package lpproof +package proof import ( "bufio" diff --git a/provider/lpseal/README.md b/curiosrc/seal/README.md similarity index 100% rename from provider/lpseal/README.md rename to curiosrc/seal/README.md diff --git a/provider/lpseal/poller.go b/curiosrc/seal/poller.go similarity index 99% rename from provider/lpseal/poller.go rename to curiosrc/seal/poller.go index cbdcb3fd9..568280bdb 100644 --- a/provider/lpseal/poller.go +++ b/curiosrc/seal/poller.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "context" diff --git a/provider/lpseal/poller_commit_msg.go b/curiosrc/seal/poller_commit_msg.go similarity index 99% rename from provider/lpseal/poller_commit_msg.go rename to curiosrc/seal/poller_commit_msg.go index 19784e719..9a88129b0 100644 --- a/provider/lpseal/poller_commit_msg.go +++ b/curiosrc/seal/poller_commit_msg.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "context" diff --git a/provider/lpseal/poller_precommit_msg.go b/curiosrc/seal/poller_precommit_msg.go similarity index 99% rename from provider/lpseal/poller_precommit_msg.go rename to curiosrc/seal/poller_precommit_msg.go index 22deadc0e..4372cbb92 100644 --- a/provider/lpseal/poller_precommit_msg.go +++ b/curiosrc/seal/poller_precommit_msg.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "context" diff --git a/provider/lpseal/sector_num_alloc.go b/curiosrc/seal/sector_num_alloc.go similarity index 99% rename from provider/lpseal/sector_num_alloc.go rename to curiosrc/seal/sector_num_alloc.go index 6958a5e6b..010ebee39 100644 --- a/provider/lpseal/sector_num_alloc.go +++ b/curiosrc/seal/sector_num_alloc.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "context" diff --git a/provider/lpseal/task_finalize.go b/curiosrc/seal/task_finalize.go similarity index 94% rename from provider/lpseal/task_finalize.go rename to curiosrc/seal/task_finalize.go index 8d425f76a..72610b5e5 100644 --- a/provider/lpseal/task_finalize.go +++ b/curiosrc/seal/task_finalize.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "context" @@ -7,21 +7,21 @@ import ( "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/curiosrc/ffi" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" "github.com/filecoin-project/lotus/lib/harmony/resources" - "github.com/filecoin-project/lotus/provider/lpffi" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) type FinalizeTask struct { max int sp *SealPoller - sc *lpffi.SealCalls + sc *ffi.SealCalls db *harmonydb.DB } -func NewFinalizeTask(max int, sp *SealPoller, sc *lpffi.SealCalls, db *harmonydb.DB) *FinalizeTask { +func NewFinalizeTask(max int, sp *SealPoller, sc *ffi.SealCalls, db *harmonydb.DB) *FinalizeTask { return &FinalizeTask{ max: max, sp: sp, @@ -86,7 +86,7 @@ func (f *FinalizeTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.T StorageID string `db:"storage_id"` } - if 4 != storiface.FTCache { + if storiface.FTCache != 4 { panic("storiface.FTCache != 4") } diff --git a/provider/lpseal/task_movestorage.go b/curiosrc/seal/task_movestorage.go similarity index 94% rename from provider/lpseal/task_movestorage.go rename to curiosrc/seal/task_movestorage.go index 2085214b7..9092ec829 100644 --- a/provider/lpseal/task_movestorage.go +++ b/curiosrc/seal/task_movestorage.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "context" @@ -7,22 +7,22 @@ import ( "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/curiosrc/ffi" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" "github.com/filecoin-project/lotus/lib/harmony/resources" - "github.com/filecoin-project/lotus/provider/lpffi" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) type MoveStorageTask struct { sp *SealPoller - sc *lpffi.SealCalls + sc *ffi.SealCalls db *harmonydb.DB max int } -func NewMoveStorageTask(sp *SealPoller, sc *lpffi.SealCalls, db *harmonydb.DB, max int) *MoveStorageTask { +func NewMoveStorageTask(sp *SealPoller, sc *ffi.SealCalls, db *harmonydb.DB, max int) *MoveStorageTask { return &MoveStorageTask{ max: max, sp: sp, diff --git a/provider/lpseal/task_porep.go b/curiosrc/seal/task_porep.go similarity index 97% rename from provider/lpseal/task_porep.go rename to curiosrc/seal/task_porep.go index ba0283e0c..fb03ce59b 100644 --- a/provider/lpseal/task_porep.go +++ b/curiosrc/seal/task_porep.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "bytes" @@ -12,10 +12,10 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/curiosrc/ffi" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" "github.com/filecoin-project/lotus/lib/harmony/resources" - "github.com/filecoin-project/lotus/provider/lpffi" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -28,12 +28,12 @@ type PoRepTask struct { db *harmonydb.DB api PoRepAPI sp *SealPoller - sc *lpffi.SealCalls + sc *ffi.SealCalls max int } -func NewPoRepTask(db *harmonydb.DB, api PoRepAPI, sp *SealPoller, sc *lpffi.SealCalls, maxPoRep int) *PoRepTask { +func NewPoRepTask(db *harmonydb.DB, api PoRepAPI, sp *SealPoller, sc *ffi.SealCalls, maxPoRep int) *PoRepTask { return &PoRepTask{ db: db, api: api, diff --git a/provider/lpseal/task_sdr.go b/curiosrc/seal/task_sdr.go similarity index 94% rename from provider/lpseal/task_sdr.go rename to curiosrc/seal/task_sdr.go index 694ff6f46..c9cf55316 100644 --- a/provider/lpseal/task_sdr.go +++ b/curiosrc/seal/task_sdr.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "bytes" @@ -16,10 +16,10 @@ import ( "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/curiosrc/ffi" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" "github.com/filecoin-project/lotus/lib/harmony/resources" - "github.com/filecoin-project/lotus/provider/lpffi" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -35,12 +35,12 @@ type SDRTask struct { db *harmonydb.DB sp *SealPoller - sc *lpffi.SealCalls + sc *ffi.SealCalls max int } -func NewSDRTask(api SDRAPI, db *harmonydb.DB, sp *SealPoller, sc *lpffi.SealCalls, maxSDR int) *SDRTask { +func NewSDRTask(api SDRAPI, db *harmonydb.DB, sp *SealPoller, sc *ffi.SealCalls, maxSDR int) *SDRTask { return &SDRTask{ api: api, db: db, @@ -223,16 +223,16 @@ func (s *SDRTask) Adder(taskFunc harmonytask.AddTaskFunc) { s.sp.pollers[pollerSDR].Set(taskFunc) } -func (s *SDRTask) taskToSector(id harmonytask.TaskID) (lpffi.SectorRef, error) { - var refs []lpffi.SectorRef +func (s *SDRTask) taskToSector(id harmonytask.TaskID) (ffi.SectorRef, error) { + var refs []ffi.SectorRef err := s.db.Select(context.Background(), &refs, `SELECT sp_id, sector_number, reg_seal_proof FROM sectors_sdr_pipeline WHERE task_id_sdr = $1`, id) if err != nil { - return lpffi.SectorRef{}, xerrors.Errorf("getting sector ref: %w", err) + return ffi.SectorRef{}, xerrors.Errorf("getting sector ref: %w", err) } if len(refs) != 1 { - return lpffi.SectorRef{}, xerrors.Errorf("expected 1 sector ref, got %d", len(refs)) + return ffi.SectorRef{}, xerrors.Errorf("expected 1 sector ref, got %d", len(refs)) } return refs[0], nil diff --git a/provider/lpseal/task_submit_commit.go b/curiosrc/seal/task_submit_commit.go similarity index 94% rename from provider/lpseal/task_submit_commit.go rename to curiosrc/seal/task_submit_commit.go index 5b46b7e00..d7f133db7 100644 --- a/provider/lpseal/task_submit_commit.go +++ b/curiosrc/seal/task_submit_commit.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "bytes" @@ -14,11 +14,11 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/curiosrc/message" + "github.com/filecoin-project/lotus/curiosrc/multictladdr" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" "github.com/filecoin-project/lotus/lib/harmony/resources" - "github.com/filecoin-project/lotus/provider/lpmessage" - "github.com/filecoin-project/lotus/provider/multictladdr" "github.com/filecoin-project/lotus/storage/ctladdr" ) @@ -35,13 +35,13 @@ type SubmitCommitTask struct { db *harmonydb.DB api SubmitCommitAPI - sender *lpmessage.Sender + sender *message.Sender as *multictladdr.MultiAddressSelector maxFee types.FIL } -func NewSubmitCommitTask(sp *SealPoller, db *harmonydb.DB, api SubmitCommitAPI, sender *lpmessage.Sender, as *multictladdr.MultiAddressSelector, maxFee types.FIL) *SubmitCommitTask { +func NewSubmitCommitTask(sp *SealPoller, db *harmonydb.DB, api SubmitCommitAPI, sender *message.Sender, as *multictladdr.MultiAddressSelector, maxFee types.FIL) *SubmitCommitTask { return &SubmitCommitTask{ sp: sp, db: db, diff --git a/provider/lpseal/task_submit_precommit.go b/curiosrc/seal/task_submit_precommit.go similarity index 95% rename from provider/lpseal/task_submit_precommit.go rename to curiosrc/seal/task_submit_precommit.go index 9f6233f39..b04473fe7 100644 --- a/provider/lpseal/task_submit_precommit.go +++ b/curiosrc/seal/task_submit_precommit.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "bytes" @@ -16,11 +16,11 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/curiosrc/message" + "github.com/filecoin-project/lotus/curiosrc/multictladdr" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" "github.com/filecoin-project/lotus/lib/harmony/resources" - "github.com/filecoin-project/lotus/provider/lpmessage" - "github.com/filecoin-project/lotus/provider/multictladdr" "github.com/filecoin-project/lotus/storage/ctladdr" ) @@ -34,13 +34,13 @@ type SubmitPrecommitTask struct { sp *SealPoller db *harmonydb.DB api SubmitPrecommitTaskApi - sender *lpmessage.Sender + sender *message.Sender as *multictladdr.MultiAddressSelector maxFee types.FIL } -func NewSubmitPrecommitTask(sp *SealPoller, db *harmonydb.DB, api SubmitPrecommitTaskApi, sender *lpmessage.Sender, as *multictladdr.MultiAddressSelector, maxFee types.FIL) *SubmitPrecommitTask { +func NewSubmitPrecommitTask(sp *SealPoller, db *harmonydb.DB, api SubmitPrecommitTaskApi, sender *message.Sender, as *multictladdr.MultiAddressSelector, maxFee types.FIL) *SubmitPrecommitTask { return &SubmitPrecommitTask{ sp: sp, db: db, diff --git a/provider/lpseal/task_trees.go b/curiosrc/seal/task_trees.go similarity index 97% rename from provider/lpseal/task_trees.go rename to curiosrc/seal/task_trees.go index da0fcf1e9..6afef245b 100644 --- a/provider/lpseal/task_trees.go +++ b/curiosrc/seal/task_trees.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "context" @@ -13,10 +13,10 @@ import ( "github.com/filecoin-project/go-padreader" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/curiosrc/ffi" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" "github.com/filecoin-project/lotus/lib/harmony/harmonytask" "github.com/filecoin-project/lotus/lib/harmony/resources" - "github.com/filecoin-project/lotus/provider/lpffi" "github.com/filecoin-project/lotus/storage/pipeline/lib/nullreader" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -24,12 +24,12 @@ import ( type TreesTask struct { sp *SealPoller db *harmonydb.DB - sc *lpffi.SealCalls + sc *ffi.SealCalls max int } -func NewTreesTask(sp *SealPoller, db *harmonydb.DB, sc *lpffi.SealCalls, maxTrees int) *TreesTask { +func NewTreesTask(sp *SealPoller, db *harmonydb.DB, sc *ffi.SealCalls, maxTrees int) *TreesTask { return &TreesTask{ sp: sp, db: db, diff --git a/provider/lpseal/task_trees_test.go b/curiosrc/seal/task_trees_test.go similarity index 99% rename from provider/lpseal/task_trees_test.go rename to curiosrc/seal/task_trees_test.go index 204fa57fc..b65ddd4e8 100644 --- a/provider/lpseal/task_trees_test.go +++ b/curiosrc/seal/task_trees_test.go @@ -1,4 +1,4 @@ -package lpseal +package seal import ( "io" diff --git a/provider/lpweb/api/debug/debug.go b/curiosrc/web/api/debug/debug.go similarity index 97% rename from provider/lpweb/api/debug/debug.go rename to curiosrc/web/api/debug/debug.go index 845684519..c0e89ab8e 100644 --- a/provider/lpweb/api/debug/debug.go +++ b/curiosrc/web/api/debug/debug.go @@ -1,4 +1,4 @@ -// Package debug provides the API for various debug endpoints in lotus-provider. +// Package debug provides the API for various debug endpoints in curio. package debug import ( @@ -18,10 +18,10 @@ import ( "github.com/filecoin-project/lotus/api/client" "github.com/filecoin-project/lotus/build" cliutil "github.com/filecoin-project/lotus/cli/util" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" ) -var log = logging.Logger("lp/web/debug") +var log = logging.Logger("curio/web/debug") type debug struct { *deps.Deps diff --git a/curiosrc/web/api/routes.go b/curiosrc/web/api/routes.go new file mode 100644 index 000000000..c030f7d53 --- /dev/null +++ b/curiosrc/web/api/routes.go @@ -0,0 +1,13 @@ +// Package api provides the HTTP API for the lotus curio web gui. +package api + +import ( + "github.com/gorilla/mux" + + "github.com/filecoin-project/lotus/cmd/curio/deps" + "github.com/filecoin-project/lotus/curiosrc/web/api/debug" +) + +func Routes(r *mux.Router, deps *deps.Deps) { + debug.Routes(r.PathPrefix("/debug").Subrouter(), deps) +} diff --git a/provider/lpweb/hapi/robust_rpc.go b/curiosrc/web/hapi/robust_rpc.go similarity index 100% rename from provider/lpweb/hapi/robust_rpc.go rename to curiosrc/web/hapi/robust_rpc.go diff --git a/provider/lpweb/hapi/routes.go b/curiosrc/web/hapi/routes.go similarity index 89% rename from provider/lpweb/hapi/routes.go rename to curiosrc/web/hapi/routes.go index 2e752935d..fd2f24e94 100644 --- a/provider/lpweb/hapi/routes.go +++ b/curiosrc/web/hapi/routes.go @@ -8,7 +8,7 @@ import ( logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" ) //go:embed web/* @@ -39,4 +39,4 @@ func Routes(r *mux.Router, deps *deps.Deps) error { return nil } -var log = logging.Logger("lpweb") +var log = logging.Logger("curio/web") diff --git a/provider/lpweb/hapi/simpleinfo.go b/curiosrc/web/hapi/simpleinfo.go similarity index 99% rename from provider/lpweb/hapi/simpleinfo.go rename to curiosrc/web/hapi/simpleinfo.go index ff76ae990..e639ef427 100644 --- a/provider/lpweb/hapi/simpleinfo.go +++ b/curiosrc/web/hapi/simpleinfo.go @@ -98,7 +98,7 @@ var templateDev = os.Getenv("LOTUS_WEB_DEV") == "1" func (a *app) executeTemplate(w http.ResponseWriter, name string, data interface{}) { if templateDev { - fs := os.DirFS("./provider/lpweb/hapi/web") + fs := os.DirFS("./cmd/curio/web/hapi/web") a.t = template.Must(template.ParseFS(fs, "*")) } if err := a.t.ExecuteTemplate(w, name, data); err != nil { diff --git a/provider/lpweb/hapi/simpleinfo_pipeline_porep.go b/curiosrc/web/hapi/simpleinfo_pipeline_porep.go similarity index 100% rename from provider/lpweb/hapi/simpleinfo_pipeline_porep.go rename to curiosrc/web/hapi/simpleinfo_pipeline_porep.go diff --git a/provider/lpweb/hapi/watch_actor.go b/curiosrc/web/hapi/watch_actor.go similarity index 100% rename from provider/lpweb/hapi/watch_actor.go rename to curiosrc/web/hapi/watch_actor.go diff --git a/provider/lpweb/hapi/web/actor_summary.gohtml b/curiosrc/web/hapi/web/actor_summary.gohtml similarity index 100% rename from provider/lpweb/hapi/web/actor_summary.gohtml rename to curiosrc/web/hapi/web/actor_summary.gohtml diff --git a/provider/lpweb/hapi/web/chain_rpcs.gohtml b/curiosrc/web/hapi/web/chain_rpcs.gohtml similarity index 100% rename from provider/lpweb/hapi/web/chain_rpcs.gohtml rename to curiosrc/web/hapi/web/chain_rpcs.gohtml diff --git a/provider/lpweb/hapi/web/cluster_machines.gohtml b/curiosrc/web/hapi/web/cluster_machines.gohtml similarity index 100% rename from provider/lpweb/hapi/web/cluster_machines.gohtml rename to curiosrc/web/hapi/web/cluster_machines.gohtml diff --git a/provider/lpweb/hapi/web/cluster_task_history.gohtml b/curiosrc/web/hapi/web/cluster_task_history.gohtml similarity index 100% rename from provider/lpweb/hapi/web/cluster_task_history.gohtml rename to curiosrc/web/hapi/web/cluster_task_history.gohtml diff --git a/provider/lpweb/hapi/web/cluster_tasks.gohtml b/curiosrc/web/hapi/web/cluster_tasks.gohtml similarity index 100% rename from provider/lpweb/hapi/web/cluster_tasks.gohtml rename to curiosrc/web/hapi/web/cluster_tasks.gohtml diff --git a/provider/lpweb/hapi/web/pipeline_porep_sectors.gohtml b/curiosrc/web/hapi/web/pipeline_porep_sectors.gohtml similarity index 100% rename from provider/lpweb/hapi/web/pipeline_porep_sectors.gohtml rename to curiosrc/web/hapi/web/pipeline_porep_sectors.gohtml diff --git a/provider/lpweb/hapi/web/pipline_porep.gohtml b/curiosrc/web/hapi/web/pipline_porep.gohtml similarity index 100% rename from provider/lpweb/hapi/web/pipline_porep.gohtml rename to curiosrc/web/hapi/web/pipline_porep.gohtml diff --git a/provider/lpweb/srv.go b/curiosrc/web/srv.go similarity index 84% rename from provider/lpweb/srv.go rename to curiosrc/web/srv.go index e7640bd1a..2bc2cfa29 100644 --- a/provider/lpweb/srv.go +++ b/curiosrc/web/srv.go @@ -1,5 +1,5 @@ -// Package lpweb defines the HTTP web server for static files and endpoints. -package lpweb +// Package web defines the HTTP web server for static files and endpoints. +package web import ( "context" @@ -16,10 +16,10 @@ import ( "github.com/gorilla/mux" "go.opencensus.io/tag" - "github.com/filecoin-project/lotus/cmd/lotus-provider/deps" + "github.com/filecoin-project/lotus/cmd/curio/deps" + "github.com/filecoin-project/lotus/curiosrc/web/api" + "github.com/filecoin-project/lotus/curiosrc/web/hapi" "github.com/filecoin-project/lotus/metrics" - "github.com/filecoin-project/lotus/provider/lpweb/api" - "github.com/filecoin-project/lotus/provider/lpweb/hapi" ) //go:embed static @@ -41,7 +41,8 @@ func GetSrv(ctx context.Context, deps *deps.Deps) (*http.Server, error) { var static fs.FS = static if webDev { - static = os.DirFS("./provider/lpweb") + basePath = "cmd/curio/web/static" + static = os.DirFS(basePath) } mx.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -71,7 +72,7 @@ func GetSrv(ctx context.Context, deps *deps.Deps) (*http.Server, error) { return &http.Server{ Handler: http.HandlerFunc(mx.ServeHTTP), BaseContext: func(listener net.Listener) context.Context { - ctx, _ := tag.New(context.Background(), tag.Upsert(metrics.APIInterface, "lotus-provider")) + ctx, _ := tag.New(context.Background(), tag.Upsert(metrics.APIInterface, "curio")) return ctx }, Addr: deps.Cfg.Subsystems.GuiAddress, diff --git a/provider/lpweb/static/chain-connectivity.js b/curiosrc/web/static/chain-connectivity.js similarity index 100% rename from provider/lpweb/static/chain-connectivity.js rename to curiosrc/web/static/chain-connectivity.js diff --git a/provider/lpweb/static/index.html b/curiosrc/web/static/index.html similarity index 97% rename from provider/lpweb/static/index.html rename to curiosrc/web/static/index.html index 95e237803..4f9c21b50 100644 --- a/provider/lpweb/static/index.html +++ b/curiosrc/web/static/index.html @@ -1,6 +1,6 @@
-