From 03eee831b046d734a026f3b8d3ae072854bb5704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 14 Aug 2025 23:22:41 +0200 Subject: [PATCH 01/67] supra: file tree_r ffi --- extern/supraseal/build.sh | 6 ++- extern/supraseal/pc2/cuda/pc2.cu | 11 ++++ extern/supraseal/sealing/supra_seal.cpp | 3 ++ extern/supraseal/sealing/supra_seal.h | 5 ++ .../supraseal/sealing/supra_tree_r_file.cpp | 52 +++++++++++++++++++ 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 extern/supraseal/sealing/supra_tree_r_file.cpp diff --git a/extern/supraseal/build.sh b/extern/supraseal/build.sh index 0602ee048..b554a25ea 100755 --- a/extern/supraseal/build.sh +++ b/extern/supraseal/build.sh @@ -200,12 +200,15 @@ $NVCC $CFLAGS $CUDA_ARCH -std=c++17 -DNO_SPDK -Xcompiler -march=native \ $CXX $CXXFLAGS $INCLUDE -Iposeidon -Ideps/sppark -Ideps/sppark/util -Ideps/blst/src \ -c sealing/supra_seal.cpp -o obj/supra_seal.o -Wno-subobject-linkage & +$CXX $CXXFLAGS $INCLUDE -DSTREAMING_NODE_READER_FILES -Iposeidon -Ideps/sppark -Ideps/sppark/util -Ideps/blst/src \ + -c sealing/supra_tree_r_file.cpp -o obj/supra_tree_r_file.o -Wno-subobject-linkage & + wait # Sppark object dedupe nm obj/pc2.o | grep -E 'select_gpu|all_gpus|cuda_available|gpu_props|ngpus|drop_gpu_ptr_t|clone_gpu_ptr_t' | awk '{print $3 " supra_" $3}' > symbol_rename.txt -for obj in obj/pc1.o obj/pc2.o obj/ring_t.o obj/streaming_node_reader_nvme.o obj/supra_seal.o obj/sha_ext_mbx2.o; do +for obj in obj/pc1.o obj/pc2.o obj/ring_t.o obj/streaming_node_reader_nvme.o obj/supra_seal.o obj/supra_tree_r_file.o obj/sha_ext_mbx2.o; do objcopy --redefine-syms=symbol_rename.txt $obj done @@ -217,6 +220,7 @@ ar rvs obj/libsupraseal.a \ obj/ring_t.o \ obj/streaming_node_reader_nvme.o \ obj/supra_seal.o \ + obj/supra_tree_r_file.o \ obj/sha_ext_mbx2.o $CXX $CXXFLAGS -Ideps/sppark -Ideps/sppark/util -Ideps/blst/src \ diff --git a/extern/supraseal/pc2/cuda/pc2.cu b/extern/supraseal/pc2/cuda/pc2.cu index 12d632fd1..322d9eb6b 100644 --- a/extern/supraseal/pc2/cuda/pc2.cu +++ b/extern/supraseal/pc2/cuda/pc2.cu @@ -1515,4 +1515,15 @@ template void do_pc2_cleanup(const char* output_dir); template void do_pc2_cleanup(const char* output_dir); template void do_pc2_cleanup(const char* output_dir); +#ifndef SUPRA_PC2_NO_EXPLICIT_INSTANTIATIONS +#ifdef RUNTIME_SECTOR_SIZE + template void pc2_hash(topology_t&, bool, streaming_node_reader_t&, size_t, size_t, size_t, const char**, const char*); + template void pc2_hash(topology_t&, bool, streaming_node_reader_t&, size_t, size_t, size_t, const char**, const char*); + template void pc2_hash(topology_t&, bool, streaming_node_reader_t&, size_t, size_t, size_t, const char**, const char*); + template void pc2_hash(topology_t&, bool, streaming_node_reader_t&, size_t, size_t, size_t, const char**, const char*); + template void pc2_hash(topology_t&, bool, streaming_node_reader_t&, size_t, size_t, size_t, const char**, const char*); + #endif +#endif + +#endif // __CUDA_ARCH__ \ No newline at end of file diff --git a/extern/supraseal/sealing/supra_seal.cpp b/extern/supraseal/sealing/supra_seal.cpp index 73002a8b1..a677a5a9d 100644 --- a/extern/supraseal/sealing/supra_seal.cpp +++ b/extern/supraseal/sealing/supra_seal.cpp @@ -30,6 +30,9 @@ #include "../sealing/constants.hpp" #include "../nvme/streaming_node_reader_nvme.hpp" +#ifdef STREAMING_NODE_READER_FILES +#include "../c1/streaming_node_reader_files.hpp" +#endif #include "../c1/c1.hpp" #include "../pc1/pc1.hpp" diff --git a/extern/supraseal/sealing/supra_seal.h b/extern/supraseal/sealing/supra_seal.h index 3b9b5c4ce..e2adc2bed 100644 --- a/extern/supraseal/sealing/supra_seal.h +++ b/extern/supraseal/sealing/supra_seal.h @@ -13,6 +13,11 @@ int supra_version(); // config_file - topology config file. Defaults to supra_config.cfg void supra_seal_init(size_t sector_size, const char* config_file); +// Build tree-r from a last-layer file (optionally with a staged data file) and write outputs to output_dir. +// CUDA-only path; does not require SPDK. Returns 0 on success. +int tree_r_file(const char* last_layer_filename, const char* data_filename, const char* output_dir, + size_t sector_size); + // Perform pc1, storing the sealed layers starting at block_offset. int pc1(uint64_t block_offset, size_t num_sectors, const uint8_t* replica_ids, const char* parents_filename, diff --git a/extern/supraseal/sealing/supra_tree_r_file.cpp b/extern/supraseal/sealing/supra_tree_r_file.cpp new file mode 100644 index 000000000..6273d5943 --- /dev/null +++ b/extern/supraseal/sealing/supra_tree_r_file.cpp @@ -0,0 +1,52 @@ +// Copyright Curio Storage, Inc. + +#include +#include + +#include "constants.hpp" +#include "topology_t.hpp" +#include "../util/sector_util.hpp" +#include "../util/util.hpp" +#include "../pc2/pc2_internal.hpp" + +// CUDA-based tree-r from last-layer file(s) using the file-streaming reader +// Always uses P::PARALLEL_SECTORS == 1 +template +static int tree_r_file_impl(const char* last_layer_filename, + const char* data_filename, + const char* output_dir) { + topology_t topology("supra_seal.cfg"); + set_core_affinity(topology.pc2_hasher); + + size_t stream_count = P::GetSectorSizeLg() <= 24 ? 8 : 64; + size_t batch_size = P::GetSectorSizeLg() <= 24 ? 64 * 8 : 64 * 64; + size_t nodes_to_read = P::GetNumNodes() / P::GetNumTreeRCFiles(); + + std::vector layer_filenames; + layer_filenames.push_back(std::string(last_layer_filename)); + streaming_node_reader_t> node_reader(P::GetSectorSize(), layer_filenames); + + node_reader.alloc_slots(stream_count * 2, P::GetNumLayers() * batch_size, true); + + const char* data_filenames[1]; + if (data_filename != nullptr && data_filename[0] != '\0') { + data_filenames[0] = data_filename; + } else { + data_filenames[0] = nullptr; + } + + bool tree_r_only = true; + pc2_hash>(topology, tree_r_only, node_reader, + nodes_to_read, batch_size, stream_count, + data_filenames, output_dir); + return 0; +} + +extern "C" int tree_r_file(const char* last_layer_filename, + const char* data_filename, + const char* output_dir, + size_t sector_size) { + SECTOR_PARAMS_TABLE(return tree_r_file_impl(last_layer_filename, data_filename, output_dir)); +} + + From 282fe74b9dd20e7d95ea09bacbf5b4a0ab2ba5f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 14 Aug 2025 23:42:09 +0200 Subject: [PATCH 02/67] wire up treerfile to go --- cmd/curio/test-cli.go | 1 + lib/supraffi/no_supraseal.go | 4 ++++ lib/supraffi/seal.go | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/cmd/curio/test-cli.go b/cmd/curio/test-cli.go index cc6de66d1..63c4ae4f8 100644 --- a/cmd/curio/test-cli.go +++ b/cmd/curio/test-cli.go @@ -30,6 +30,7 @@ var testCmd = &cli.Command{ //provingInfoCmd, wdPostCmd, testDebugCmd, + testSupraCmd, }, Before: func(cctx *cli.Context) error { return nil diff --git a/lib/supraffi/no_supraseal.go b/lib/supraffi/no_supraseal.go index f87749e3e..ae1ffe6ef 100644 --- a/lib/supraffi/no_supraseal.go +++ b/lib/supraffi/no_supraseal.go @@ -17,6 +17,10 @@ func Pc1(blockOffset uint64, replicaIDs [][32]byte, parentsFilename string, sect panic("Pc1: supraseal build tag not enabled") } +func TreeRFile(lastLayerFilename, dataFilename, outputDir string, sectorSize uint64) int { + panic("TreeRFile: supraseal build tag not enabled") +} + type Path struct { Replica string Cache string diff --git a/lib/supraffi/seal.go b/lib/supraffi/seal.go index b9e55caf6..5cf5dcda8 100644 --- a/lib/supraffi/seal.go +++ b/lib/supraffi/seal.go @@ -238,6 +238,13 @@ func GetHealthInfo() ([]HealthInfo, error) { return healthInfos, nil } +func TreeRFile(lastLayerFilename, dataFilename, outputDir string, sectorSize uint64) int { + cLastLayerFilename := C.CString(lastLayerFilename) + cDataFilename := C.CString(dataFilename) + cOutputDir := C.CString(outputDir) + return int(C.tree_r_file(cLastLayerFilename, cDataFilename, cOutputDir, C.size_t(sectorSize))) +} + // Pc1 performs the pc1 operation. func Pc1(blockOffset uint64, replicaIDs [][32]byte, parentsFilename string, sectorSize uint64) int { flatReplicaIDs := make([]byte, len(replicaIDs)*32) From ce2c90bcd6b747f24f4368c6b8fe7435f3ea88de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 00:02:13 +0200 Subject: [PATCH 03/67] supra: using the correct node reader in file tree_r ffi --- extern/supraseal/build.sh | 10 +++++++++- extern/supraseal/pc2/cuda/pc2.cu | 4 ++++ extern/supraseal/sealing/supra_tree_r_file.cpp | 13 ++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/extern/supraseal/build.sh b/extern/supraseal/build.sh index b554a25ea..4f89b224d 100755 --- a/extern/supraseal/build.sh +++ b/extern/supraseal/build.sh @@ -196,6 +196,10 @@ $CXX $CXXFLAGS -o obj/ring_t.o -c nvme/ring_t.cpp & $NVCC $CFLAGS $CUDA_ARCH -std=c++17 -DNO_SPDK -Xcompiler -march=native \ -Xcompiler -Wall,-Wextra,-Wno-subobject-linkage,-Wno-unused-parameter \ -Ideps/sppark -Ideps/sppark/util -Ideps/blst/src -c pc2/cuda/pc2.cu -o obj/pc2.o & +# File-reader variant of pc2 for tree_r_file +$NVCC $CFLAGS $CUDA_ARCH -std=c++17 -DNO_SPDK -DSTREAMING_NODE_READER_FILES -DRENAME_PC2_HASH_FILES -Xcompiler -march=native \ + -Xcompiler -Wall,-Wextra,-Wno-subobject-linkage,-Wno-unused-parameter \ + -Ideps/sppark -Ideps/sppark/util -Ideps/blst/src -c pc2/cuda/pc2.cu -o obj/pc2_files.o & $CXX $CXXFLAGS $INCLUDE -Iposeidon -Ideps/sppark -Ideps/sppark/util -Ideps/blst/src \ -c sealing/supra_seal.cpp -o obj/supra_seal.o -Wno-subobject-linkage & @@ -207,8 +211,11 @@ wait # Sppark object dedupe nm obj/pc2.o | grep -E 'select_gpu|all_gpus|cuda_available|gpu_props|ngpus|drop_gpu_ptr_t|clone_gpu_ptr_t' | awk '{print $3 " supra_" $3}' > symbol_rename.txt +nm obj/pc2_files.o | grep -E 'select_gpu|all_gpus|cuda_available|gpu_props|ngpus|drop_gpu_ptr_t|clone_gpu_ptr_t' | awk '{print $3 " supra_" $3}' >> symbol_rename.txt +# Deduplicate symbol rename entries +sort -u -o symbol_rename.txt symbol_rename.txt -for obj in obj/pc1.o obj/pc2.o obj/ring_t.o obj/streaming_node_reader_nvme.o obj/supra_seal.o obj/supra_tree_r_file.o obj/sha_ext_mbx2.o; do +for obj in obj/pc1.o obj/pc2.o obj/pc2_files.o obj/ring_t.o obj/streaming_node_reader_nvme.o obj/supra_seal.o obj/supra_tree_r_file.o obj/sha_ext_mbx2.o; do objcopy --redefine-syms=symbol_rename.txt $obj done @@ -217,6 +224,7 @@ rm symbol_rename.txt ar rvs obj/libsupraseal.a \ obj/pc1.o \ obj/pc2.o \ + obj/pc2_files.o \ obj/ring_t.o \ obj/streaming_node_reader_nvme.o \ obj/supra_seal.o \ diff --git a/extern/supraseal/pc2/cuda/pc2.cu b/extern/supraseal/pc2/cuda/pc2.cu index 322d9eb6b..8959070f9 100644 --- a/extern/supraseal/pc2/cuda/pc2.cu +++ b/extern/supraseal/pc2/cuda/pc2.cu @@ -6,6 +6,10 @@ #ifndef __CUDA_ARCH__ +#ifdef RENAME_PC2_HASH_FILES +#define pc2_hash pc2_hash_files +#endif + #include #include #include diff --git a/extern/supraseal/sealing/supra_tree_r_file.cpp b/extern/supraseal/sealing/supra_tree_r_file.cpp index 6273d5943..905aa1ae1 100644 --- a/extern/supraseal/sealing/supra_tree_r_file.cpp +++ b/extern/supraseal/sealing/supra_tree_r_file.cpp @@ -9,6 +9,17 @@ #include "../util/util.hpp" #include "../pc2/pc2_internal.hpp" +// Forward declaration for renamed file-reader variant compiled from pc2.cu +template +void pc2_hash_files(topology_t& topology, + bool tree_r_only, + streaming_node_reader_t& reader, + size_t nodes_to_read, + size_t batch_size, + size_t stream_count, + const char** data_filenames, + const char* output_dir); + // CUDA-based tree-r from last-layer file(s) using the file-streaming reader // Always uses P::PARALLEL_SECTORS == 1 template @@ -36,7 +47,7 @@ static int tree_r_file_impl(const char* last_layer_filename, } bool tree_r_only = true; - pc2_hash>(topology, tree_r_only, node_reader, + pc2_hash_files>(topology, tree_r_only, node_reader, nodes_to_read, batch_size, stream_count, data_filenames, output_dir); return 0; From a674e85b4fffd4e9aa43a9464b624ae30036a17c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 00:21:24 +0200 Subject: [PATCH 04/67] tree_r links --- extern/supraseal/build.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/extern/supraseal/build.sh b/extern/supraseal/build.sh index 4f89b224d..62708d4a6 100755 --- a/extern/supraseal/build.sh +++ b/extern/supraseal/build.sh @@ -219,6 +219,16 @@ for obj in obj/pc1.o obj/pc2.o obj/pc2_files.o obj/ring_t.o obj/streaming_node_r objcopy --redefine-syms=symbol_rename.txt $obj done +# Weaken duplicate symbols between pc2.o and pc2_files.o to avoid multiple-definition at link time +nm -g --defined-only obj/pc2.o | awk '{print $3}' | sort -u > obj/syms_pc2.txt +nm -g --defined-only obj/pc2_files.o | awk '{print $3}' | sort -u > obj/syms_pc2_files.txt +comm -12 obj/syms_pc2.txt obj/syms_pc2_files.txt | grep -v '^pc2_hash_files' > obj/syms_dups.txt +if [ -s obj/syms_dups.txt ]; then + while read -r sym; do + objcopy --weaken-symbol="$sym" obj/pc2_files.o + done < obj/syms_dups.txt +fi + rm symbol_rename.txt ar rvs obj/libsupraseal.a \ From 2b6e13f14662489ed113eafc04a8aff649d3c0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 00:32:18 +0200 Subject: [PATCH 05/67] redefs, it works --- extern/supraseal/pc2/cuda/pc2.cu | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/extern/supraseal/pc2/cuda/pc2.cu b/extern/supraseal/pc2/cuda/pc2.cu index 8959070f9..7c7a92613 100644 --- a/extern/supraseal/pc2/cuda/pc2.cu +++ b/extern/supraseal/pc2/cuda/pc2.cu @@ -8,6 +8,12 @@ #ifdef RENAME_PC2_HASH_FILES #define pc2_hash pc2_hash_files +#define pc2_t pc2_files_t +#define gpu_resource_t gpu_resource_files_t +#define buf_to_disk_t buf_to_disk_files_t +#define pc2_batcher_t pc2_batcher_files_t +#define tree_address_t tree_address_files_t +#define do_pc2_cleanup do_pc2_files_cleanup #endif #include From c2649397b4af4bef8f15998214287a6d6e68ab6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 00:46:40 +0200 Subject: [PATCH 06/67] missing test-supra cmd --- cmd/curio/test-supra.go | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 cmd/curio/test-supra.go diff --git a/cmd/curio/test-supra.go b/cmd/curio/test-supra.go new file mode 100644 index 000000000..3320e5e35 --- /dev/null +++ b/cmd/curio/test-supra.go @@ -0,0 +1,52 @@ +package main + +import ( + "golang.org/x/xerrors" + + "github.com/urfave/cli/v2" + + "github.com/filecoin-project/curio/cmd/curio/internal/translations" + "github.com/filecoin-project/curio/lib/supraffi" +) + +var testSupraCmd = &cli.Command{ + Name: "supra", + Usage: translations.T("Supra consensus testing utilities"), + Subcommands: []*cli.Command{ + testSupraTreeRFileCmd, + }, +} + +var testSupraTreeRFileCmd = &cli.Command{ + Name: "tree-r-file", + Usage: "Test tree-r-file", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "last-layer-filename", + Usage: "Last layer filename", + Required: true, + }, + &cli.StringFlag{ + Name: "data-filename", + Usage: "Data filename", + Required: true, + }, + &cli.StringFlag{ + Name: "output-dir", + Usage: "Output directory", + Required: true, + }, + &cli.Uint64Flag{ + Name: "sector-size", + Usage: "Sector size", + Required: true, + }, + }, + Action: func(cctx *cli.Context) error { + res := supraffi.TreeRFile(cctx.String("last-layer-filename"), cctx.String("data-filename"), cctx.String("output-dir"), cctx.Uint64("sector-size")) + if res != 0 { + return xerrors.Errorf("tree-r-file failed: %d", res) + } + return nil + }, +} From 1676a122d1da4f688ce044751b229c2a2ea375ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 11:50:35 +0200 Subject: [PATCH 07/67] fast snap encode --- cmd/curio/test-supra.go | 27 +++++++++++++++++++++++++++ lib/ffi/cunative/nonative.go | 4 ++++ lib/ffi/snap_funcs.go | 18 ++++++++++++++---- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/cmd/curio/test-supra.go b/cmd/curio/test-supra.go index 3320e5e35..151f5bc76 100644 --- a/cmd/curio/test-supra.go +++ b/cmd/curio/test-supra.go @@ -50,3 +50,30 @@ var testSupraTreeRFileCmd = &cli.Command{ return nil }, } + + +var testSnapEncodeCmd = &cli.Command{ + Name: "snap-encode", + Usage: "Test snap-encode", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "sealed-filename", + Usage: "Sealed filename", + Required: true, + }, + &cli.StringFlag{ + Name: "unsealed-filename", + Usage: "Unsealed filename", + Required: true, + }, + &cli.StringFlag{ + Name: "update-filename", + Usage: "Update filename", + Required: true, + }, + }, + Action: func(cctx *cli.Context) error { + + return nil + }, +} diff --git a/lib/ffi/cunative/nonative.go b/lib/ffi/cunative/nonative.go index 0b6924ba1..966306bf1 100644 --- a/lib/ffi/cunative/nonative.go +++ b/lib/ffi/cunative/nonative.go @@ -17,3 +17,7 @@ func DecodeSnap(spt abi.RegisteredSealProof, commD, commK cid.Cid, key, replica func Decode(replica, key io.Reader, out io.Writer) error { panic("Decode: cunative build tag not enabled") } + +func EncodeSnap(spt abi.RegisteredSealProof, commD, commK cid.Cid, key, data io.Reader, out io.Writer) error { + panic("EncodeSnap: cunative build tag not enabled") +} diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index 46eacb46f..61a2a8038 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -64,15 +64,16 @@ func (sb *SealCalls) EncodeUpdate( return cid.Cid{}, cid.Cid{}, xerrors.Errorf("mkdir update cache: %w", err) } + //////////////////// + // Prepare sector key + //////////////////// + keyPath := filepath.Join(paths.UpdateCache, "cu-sector-key.dat") // can this be a named pipe - no, mmap in proofs keyCachePath := filepath.Join(paths.UpdateCache, "cu-sector-key-fincache") // some temp copy (finalized cache directory) stagedDataPath := paths.Unsealed var cleanupStagedFiles func() error { - // hack until we do snap encode ourselves and just call into proofs for CommR - // https://github.com/filecoin-project/curio/issues/92 - keyFile, err := os.Create(keyPath) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("creating key file: %w", err) @@ -192,7 +193,10 @@ func (sb *SealCalls) EncodeUpdate( } } - // allocate update file + //////////////////// + // Allocate update file + //////////////////// + { s, err := os.Stat(keyPath) if err != nil { @@ -217,6 +221,12 @@ func (sb *SealCalls) EncodeUpdate( if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("ffi update encode: %w", err) } + + // STEP 1: SupraEncode + + + + // STEP 2: SupraTreeR vps, err := ffi.SectorUpdate.GenerateUpdateVanillaProofs(proofType, sectorKeyCid, out.Sealed, out.Unsealed, paths.Update, paths.UpdateCache, keyPath, keyCachePath) if err != nil { From d6a260a8fbd01f0bf6b5dc744d302b44c72b53a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 13:19:56 +0200 Subject: [PATCH 08/67] encode-snap test --- cmd/curio/test-supra.go | 158 ++++++++++++++-- lib/ffi/cunative/decode_sdr.go | 2 +- lib/ffi/cunative/decode_snap.go | 3 +- lib/ffi/cunative/encode_snap.go | 263 +++++++++++++++++++++++++++ lib/ffi/cunative/encode_snap_test.go | 146 +++++++++++++++ 5 files changed, 554 insertions(+), 18 deletions(-) create mode 100644 lib/ffi/cunative/encode_snap.go create mode 100644 lib/ffi/cunative/encode_snap_test.go diff --git a/cmd/curio/test-supra.go b/cmd/curio/test-supra.go index 151f5bc76..f768b4cfb 100644 --- a/cmd/curio/test-supra.go +++ b/cmd/curio/test-supra.go @@ -1,11 +1,21 @@ package main import ( + "bytes" + "fmt" + "io" + "os" + "time" + "golang.org/x/xerrors" "github.com/urfave/cli/v2" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + "github.com/filecoin-project/curio/cmd/curio/internal/translations" + "github.com/filecoin-project/curio/lib/ffi/cunative" "github.com/filecoin-project/curio/lib/supraffi" ) @@ -14,6 +24,7 @@ var testSupraCmd = &cli.Command{ Usage: translations.T("Supra consensus testing utilities"), Subcommands: []*cli.Command{ testSupraTreeRFileCmd, + testSnapEncodeCmd, }, } @@ -22,23 +33,23 @@ var testSupraTreeRFileCmd = &cli.Command{ Usage: "Test tree-r-file", Flags: []cli.Flag{ &cli.StringFlag{ - Name: "last-layer-filename", - Usage: "Last layer filename", + Name: "last-layer-filename", + Usage: "Last layer filename", Required: true, }, &cli.StringFlag{ - Name: "data-filename", - Usage: "Data filename", + Name: "data-filename", + Usage: "Data filename", Required: true, }, &cli.StringFlag{ - Name: "output-dir", - Usage: "Output directory", + Name: "output-dir", + Usage: "Output directory", Required: true, }, &cli.Uint64Flag{ - Name: "sector-size", - Usage: "Sector size", + Name: "sector-size", + Usage: "Sector size", Required: true, }, }, @@ -51,29 +62,144 @@ var testSupraTreeRFileCmd = &cli.Command{ }, } - var testSnapEncodeCmd = &cli.Command{ Name: "snap-encode", Usage: "Test snap-encode", Flags: []cli.Flag{ &cli.StringFlag{ - Name: "sealed-filename", - Usage: "Sealed filename", + Name: "sealed-filename", + Usage: "Sealed filename", + Required: true, + }, + &cli.StringFlag{ + Name: "unsealed-filename", + Usage: "Unsealed filename", + Required: true, + }, + &cli.StringFlag{ + Name: "update-filename", + Usage: "Update filename", + Required: true, + }, + &cli.Uint64Flag{ + Name: "sector-size", + Usage: "Sector size (bytes). Supported: 2048, 8388608, 549755813888, 34359738368, 68719476736", Required: true, }, &cli.StringFlag{ - Name: "unsealed-filename", - Usage: "Unsealed filename", + Name: "commd", + Usage: "Unsealed CommD CID (v1)", Required: true, }, &cli.StringFlag{ - Name: "update-filename", - Usage: "Update filename", + Name: "commk", + Usage: "SectorKey CommR (commK) CID (v1)", Required: true, }, + &cli.BoolFlag{ + Name: "membuffer", + Usage: "Use memory buffer instead of disk (load and store)", + Value: false, + }, }, Action: func(cctx *cli.Context) error { - + sealedPath := cctx.String("sealed-filename") + unsealedPath := cctx.String("unsealed-filename") + updatePath := cctx.String("update-filename") + useMem := cctx.Bool("membuffer") + + commD, err := cid.Parse(cctx.String("commd")) + if err != nil { + return xerrors.Errorf("parse commD: %w", err) + } + commK, err := cid.Parse(cctx.String("commk")) + if err != nil { + return xerrors.Errorf("parse commK: %w", err) + } + + spt, err := proofFromSectorSize(cctx.Uint64("sector-size")) + if err != nil { + return err + } + ssize, err := spt.SectorSize() + if err != nil { + return err + } + + start := time.Now() + if useMem { + sealedBytes, err := os.ReadFile(sealedPath) + if err != nil { + return xerrors.Errorf("read sealed: %w", err) + } + unsealedBytes, err := os.ReadFile(unsealedPath) + if err != nil { + return xerrors.Errorf("read unsealed: %w", err) + } + + elapsed := time.Since(start) + mbps := float64(ssize) / elapsed.Seconds() / 1024.0 / 1024.0 + fmt.Printf("Load time: %s\n", elapsed) + fmt.Printf("Load throughput: %.2f MB/s\n", mbps) + + var outBuf bytes.Buffer + outBuf.Grow(int(ssize)) + start = time.Now() + if err := cunative.EncodeSnap(spt, commD, commK, bytes.NewReader(sealedBytes), bytes.NewReader(unsealedBytes), &outBuf); err != nil { + return xerrors.Errorf("EncodeSnap: %w", err) + } + } else { + keyF, err := os.Open(sealedPath) + if err != nil { + return xerrors.Errorf("open sealed: %w", err) + } + defer keyF.Close() + + dataF, err := os.Open(unsealedPath) + if err != nil { + return xerrors.Errorf("open unsealed: %w", err) + } + defer dataF.Close() + + outF, err := os.OpenFile(updatePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o644) + if err != nil { + return xerrors.Errorf("create update: %w", err) + } + defer outF.Close() + + if err := cunative.EncodeSnap(spt, commD, commK, keyF, dataF, outF); err != nil { + return xerrors.Errorf("EncodeSnap: %w", err) + } + + if err := outF.Sync(); err != nil { + return xerrors.Errorf("sync update: %w", err) + } + + _, _ = io.Copy(io.Discard, keyF) + _, _ = io.Copy(io.Discard, dataF) + } + elapsed := time.Since(start) + mbps := float64(ssize) / elapsed.Seconds() / 1024.0 / 1024.0 + fmt.Printf("EncodeSnap time: %s\n", elapsed) + fmt.Printf("EncodeSnap throughput: %.2f MB/s\n", mbps) + return nil }, } + +func proofFromSectorSize(size uint64) (abi.RegisteredSealProof, error) { + switch size { + case 2 << 10: + return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil + case 8 << 20: + return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil + case 512 << 20: + return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil + case 32 << 30: + return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil + case 64 << 30: + return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil + default: + return 0, xerrors.Errorf("unsupported sector size: %d", size) + } +} diff --git a/lib/ffi/cunative/decode_sdr.go b/lib/ffi/cunative/decode_sdr.go index 60b820e91..4ec6271cc 100644 --- a/lib/ffi/cunative/decode_sdr.go +++ b/lib/ffi/cunative/decode_sdr.go @@ -90,7 +90,7 @@ func Decode(replica, key io.Reader, out io.Writer) error { const ( bufSz = 4 << 20 - nWorkers = 24 + nWorkers = 64 ) func Decode(replica, key io.Reader, out io.Writer) error { diff --git a/lib/ffi/cunative/decode_snap.go b/lib/ffi/cunative/decode_snap.go index e7ad8dc0e..91b14347e 100644 --- a/lib/ffi/cunative/decode_snap.go +++ b/lib/ffi/cunative/decode_snap.go @@ -56,6 +56,7 @@ import ( type B32le = [32]byte type BytesLE = []byte +var ResultBufDepth = 16 func DecodeSnap(spt abi.RegisteredSealProof, commD, commK cid.Cid, key, replica io.Reader, out io.Writer) error { ssize, err := spt.SectorSize() @@ -103,7 +104,7 @@ func DecodeSnap(spt abi.RegisteredSealProof, commD, commK cid.Cid, key, replica var wg sync.WaitGroup errChan := make(chan error, 1) jobChan := make(chan jobSnap, workers) - resultChan := make(chan resultSnap, workers) + resultChan := make(chan resultSnap, workers*ResultBufDepth) // Start worker goroutines for i := 0; i < workers; i++ { diff --git a/lib/ffi/cunative/encode_snap.go b/lib/ffi/cunative/encode_snap.go new file mode 100644 index 000000000..3d3f47964 --- /dev/null +++ b/lib/ffi/cunative/encode_snap.go @@ -0,0 +1,263 @@ +//go:build cunative + +package cunative + +/* +#cgo CFLAGS: -I${SRCDIR}/../../../extern/supraseal/deps/blst/bindings +#cgo LDFLAGS: -L${SRCDIR}/../../../extern/supraseal/deps/blst -lblst +#include +#include +#include "blst.h" + +void snap_encode_loop(const uint8_t *key, const uint8_t *data, const uint8_t *rhos, uint8_t *out, size_t node_count, size_t node_size) { + blst_fr key_fr, data_fr, rho_fr, tmp_fr, out_fr; + + for (size_t i = 0; i < node_count; i++) { + // Load inputs + blst_fr_from_uint64(&key_fr, (const uint64_t*)(key + i * node_size)); + blst_fr_from_uint64(&data_fr, (const uint64_t*)(data + i * node_size)); + blst_fr_from_uint64(&rho_fr, (const uint64_t*)(rhos + i * 32)); + + // tmp = data * rho + blst_fr_mul(&tmp_fr, &data_fr, &rho_fr); + + // out = key + tmp + blst_fr_add(&out_fr, &key_fr, &tmp_fr); + + // Store + blst_uint64_from_fr((uint64_t*)(out + i * node_size), &out_fr); + } +} +*/ +import "C" + +import ( + "io" + "runtime" + "sync" + "fmt" + "unsafe" + + "github.com/ipfs/go-cid" + pool "github.com/libp2p/go-buffer-pool" + "golang.org/x/xerrors" + + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/curio/lib/proof" +) + +// New generates rho values (not inverted) for the whole sector +func New(phi [32]byte, h uint64, nodesCount uint64) (*Rhos, error) { + return NewRange(phi, h, nodesCount, 0, nodesCount) +} + +// NewRange generates rho values (not inverted) for the specified range +func NewRange(phi [32]byte, h uint64, nodesCount, offset, num uint64) (*Rhos, error) { + bitsShr := calcBitsShr(h, nodesCount) + highRange := calcHighRange(offset, num, bitsShr) + + rhos := make(map[uint64]B32le) + for high := highRange.Start; high <= highRange.End; high++ { + rhoVal, err := rho(phi, uint32(high)) + if err != nil { + return nil, err + } + + rhos[high] = ffElementBytesLE(rhoVal) + } + + return &Rhos{ + rhos: rhos, + bitsShr: bitsShr, + }, nil +} + +// EncodeSnap encodes deal data into an existing sector replica key according to FIP-0019 +// out[i] = key[i] + data[i] * rho(i) +func EncodeSnap(spt abi.RegisteredSealProof, commD, commK cid.Cid, key, data io.Reader, out io.Writer) error { + fmt.Printf("EncodeSnap enter\n") + + ssize, err := spt.SectorSize() + if err != nil { + return xerrors.Errorf("failed to get sector size: %w", err) + } + + nodesCount := uint64(ssize / proof.NODE_SIZE) + + commDNew, err := commcid.CIDToDataCommitmentV1(commD) + if err != nil { + return xerrors.Errorf("failed to convert commD to CID: %w", err) + } + + commROld, err := commcid.CIDToReplicaCommitmentV1(commK) + if err != nil { + return xerrors.Errorf("failed to convert commK to replica commitment: %w", err) + } + + // Calculate phi + phi, err := Phi(commDNew, commROld) + if err != nil { + return xerrors.Errorf("failed to calculate phi: %w", err) + } + + // Precompute all rho values + h := hDefault(nodesCount) + rhos, err := New(phi, h, nodesCount) + if err != nil { + return xerrors.Errorf("failed to compute rhos: %w", err) + } + + workers := nWorkers + if runtime.NumCPU() < workers { + workers = runtime.NumCPU() + } + + var wg sync.WaitGroup + errChan := make(chan error, 1) + jobChan := make(chan jobEnc, workers) + resultChan := make(chan resultEnc, workers*ResultBufDepth) + + // Start worker goroutines + for i := 0; i < workers; i++ { + wg.Add(1) + go workerEnc(&wg, jobChan, resultChan, rhos) + } + + // Start a goroutine to close the job channel when all reading is done + go func() { + defer close(jobChan) + chunkID := int64(0) + for { + kbuf := pool.Get(bufSz) + dbuf := pool.Get(bufSz) + + // Read key + kn, err := io.ReadFull(key, kbuf) + if err != nil && err != io.ErrUnexpectedEOF { + if err == io.EOF { + return + } + errChan <- err + return + } + + // Read data + dn, err := io.ReadFull(data, dbuf[:kn]) + if err != nil && err != io.ErrUnexpectedEOF { + errChan <- err + return + } + + if dn != kn { + errChan <- io.ErrUnexpectedEOF + return + } + + // worker will release kbuf and dbuf, so get len here + kblen := len(kbuf) + + jobChan <- jobEnc{kbuf[:kn], dbuf[:dn], kn, chunkID} + chunkID++ + + if kn < kblen { + return + } + } + }() + + // Start a goroutine to close the result channel when all jobs are done + go func() { + wg.Wait() + close(resultChan) + }() + + // Write results in order + var writeErr error + expectedChunkID := int64(0) + resultBuffer := make(map[int64]resultEnc) + + for r := range resultChan { + for { + if r.chunkID == expectedChunkID { + _, err := out.Write(r.data) + pool.Put(r.data) + if err != nil && writeErr == nil { + writeErr = err + } + expectedChunkID++ + + // Check if we have buffered results that can now be written + if nextResult, ok := resultBuffer[expectedChunkID]; ok { + r = nextResult + delete(resultBuffer, expectedChunkID) + continue + } + break + } else { + // Buffer this result for later + resultBuffer[r.chunkID] = r + break + } + } + } + + close(errChan) + + // Check for any errors + for err := range errChan { + if err != nil { + return err + } + } + + return writeErr +} + +type jobEnc struct { + kbuf []byte + dbuf []byte + size int + chunkID int64 +} + +type resultEnc struct { + data []byte + size int + chunkID int64 +} + +func workerEnc(wg *sync.WaitGroup, jobs <-chan jobEnc, results chan<- resultEnc, rhos *Rhos) { + defer wg.Done() + for j := range jobs { + obuf := pool.Get(j.size) + + // Calculate the starting node index for this chunk + startNode := uint64(j.chunkID) * uint64(bufSz) / proof.NODE_SIZE + nodeCount := uint64(j.size) / proof.NODE_SIZE + + // Build rhos byte slice for this chunk + rhoBytes := pool.Get(int(nodeCount * 32)) + for i := uint64(0); i < nodeCount; i++ { + rhoVal := rhos.Get(startNode + i) + copy(rhoBytes[i*32:(i+1)*32], rhoVal[:]) + } + + C.snap_encode_loop( + (*C.uint8_t)(unsafe.Pointer(&j.kbuf[0])), + (*C.uint8_t)(unsafe.Pointer(&j.dbuf[0])), + (*C.uint8_t)(unsafe.Pointer(&rhoBytes[0])), + (*C.uint8_t)(unsafe.Pointer(&obuf[0])), + (C.size_t)(nodeCount), + (C.size_t)(proof.NODE_SIZE), + ) + + pool.Put(rhoBytes) + + pool.Put(j.kbuf) + pool.Put(j.dbuf) + + results <- resultEnc{obuf, j.size, j.chunkID} + } +} diff --git a/lib/ffi/cunative/encode_snap_test.go b/lib/ffi/cunative/encode_snap_test.go new file mode 100644 index 000000000..0708dcf9b --- /dev/null +++ b/lib/ffi/cunative/encode_snap_test.go @@ -0,0 +1,146 @@ +//go:build cunative + +package cunative + +import ( + "bytes" + "crypto/rand" + "io" + "os" + "path/filepath" + "time" + "testing" + + "github.com/detailyang/go-fallocate" + "github.com/stretchr/testify/require" + + ffi "github.com/filecoin-project/filecoin-ffi" + commp2 "github.com/filecoin-project/go-commp-utils/v2" + "github.com/filecoin-project/go-commp-utils/zerocomm" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/lib/nullreader" + "github.com/filecoin-project/lotus/storage/sealer/fr32" +) + +func TestSnapEncodeMatchesFFI(t *testing.T) { + t.Run("2K", testSnapEncode(abi.RegisteredSealProof_StackedDrg2KiBV1_1)) + t.Run("8M", testSnapEncode(abi.RegisteredSealProof_StackedDrg8MiBV1_1)) +} + +func testSnapEncode(spt abi.RegisteredSealProof) func(t *testing.T) { + return func(t *testing.T) { + td := t.TempDir() + cache := filepath.Join(td, "cache") + unseal := filepath.Join(td, "unsealed") + sealKey := filepath.Join(td, "sealed") + + require.NoError(t, os.MkdirAll(cache, 0o755)) + + ssize, err := spt.SectorSize() + require.NoError(t, err) + + // write null "unsealed" for CC sealing + { + uf, err := os.Create(unseal) + require.NoError(t, err) + _, err = io.CopyN(uf, &nullreader.Reader{}, int64(ssize)) + require.NoError(t, err) + require.NoError(t, uf.Close()) + } + + // create empty sealed file (key) + { + f, err := os.Create(sealKey) + require.NoError(t, err) + require.NoError(t, f.Close()) + } + + snum := abi.SectorNumber(123) + miner := abi.ActorID(545) + ticket := abi.SealRandomness{1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + pieces := []abi.PieceInfo{{ + Size: abi.PaddedPieceSize(ssize), + PieceCID: zerocomm.ZeroPieceCommitment(abi.PaddedPieceSize(ssize).Unpadded()), + }} + + p1o, err := ffi.SealPreCommitPhase1(spt, cache, unseal, sealKey, snum, miner, ticket, pieces) + require.NoError(t, err) + commK, _, err := ffi.SealPreCommitPhase2(p1o, cache, sealKey) + require.NoError(t, err) + + // snap encode inputs + update := filepath.Join(td, "update") + updateCache := filepath.Join(td, "update-cache") + + // data to encode + unsBuf := make([]byte, abi.PaddedPieceSize(ssize).Unpadded()) + _, _ = rand.Read(unsBuf) + + padded := make([]byte, abi.PaddedPieceSize(ssize)) + fr32.Pad(unsBuf, padded) + + // write padded to the unseal file + { + f, err := os.Create(unseal) + require.NoError(t, err) + _, err = io.Copy(f, bytes.NewReader(padded)) + require.NoError(t, err) + require.NoError(t, f.Close()) + } + + // compute CommD over unpadded data + unsealedCid, err := commp2.GeneratePieceCIDFromFile(abi.RegisteredSealProof_StackedDrg2KiBV1_1, bytes.NewReader(unsBuf), abi.PaddedPieceSize(ssize).Unpadded()) + require.NoError(t, err) + + pieces = []abi.PieceInfo{{ + Size: abi.PaddedPieceSize(ssize), + PieceCID: unsealedCid, + }} + + upt, err := spt.RegisteredUpdateProof() + require.NoError(t, err) + + // prepare update file for legacy FFI encode + { + require.NoError(t, os.MkdirAll(updateCache, 0o755)) + f, err := os.Create(update) + require.NoError(t, err) + require.NoError(t, fallocate.Fallocate(f, 0, int64(ssize))) + require.NoError(t, f.Close()) + } + + // legacy FFI encode into update + _, commD, err := ffi.SectorUpdate.EncodeInto(upt, update, updateCache, sealKey, cache, unseal, pieces) + require.NoError(t, err) + _ = commD // return value used to match commD below + + // read legacy output bytes + legacyF, err := os.Open(update) + require.NoError(t, err) + var legacyBuf bytes.Buffer + _, err = io.Copy(&legacyBuf, legacyF) + require.NoError(t, err) + require.NoError(t, legacyF.Close()) + + // our EncodeSnap + keyReader, err := os.Open(sealKey) + require.NoError(t, err) + dataReader, err := os.Open(unseal) + require.NoError(t, err) + + var ourBuf bytes.Buffer + start := time.Now() + err = EncodeSnap(spt, commD, commK, keyReader, dataReader, &ourBuf) + done := time.Now() + t.Logf("EncodeSnap time: %s", done.Sub(start)) + t.Logf("EncodeSnap throughput: %f MB/s", float64(ssize)/done.Sub(start).Seconds()/1024/1024) + require.NoError(t, err) + + // compare byte-for-byte + require.Equal(t, legacyBuf.Len(), ourBuf.Len(), "output size mismatch") + require.Equal(t, legacyBuf.Bytes(), ourBuf.Bytes(), "encoded replica differs from legacy FFI output") + + t.Logf("EncodeSnap good") + } +} From 4cbf3c521e62ede8aa23483df0478c0f8424949c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 16:15:20 +0200 Subject: [PATCH 09/67] wire up fast-snap --- lib/ffi/cunative/encode_snap.go | 2 - lib/ffi/snap_funcs.go | 173 ++++++++++++++++++++------------ lib/proof/p_aux_util.go | 35 +++++++ 3 files changed, 145 insertions(+), 65 deletions(-) create mode 100644 lib/proof/p_aux_util.go diff --git a/lib/ffi/cunative/encode_snap.go b/lib/ffi/cunative/encode_snap.go index 3d3f47964..0ca759884 100644 --- a/lib/ffi/cunative/encode_snap.go +++ b/lib/ffi/cunative/encode_snap.go @@ -77,8 +77,6 @@ func NewRange(phi [32]byte, h uint64, nodesCount, offset, num uint64) (*Rhos, er // EncodeSnap encodes deal data into an existing sector replica key according to FIP-0019 // out[i] = key[i] + data[i] * rho(i) func EncodeSnap(spt abi.RegisteredSealProof, commD, commK cid.Cid, key, data io.Reader, out io.Writer) error { - fmt.Printf("EncodeSnap enter\n") - ssize, err := spt.SectorSize() if err != nil { return xerrors.Errorf("failed to get sector size: %w", err) diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index 61a2a8038..b84066503 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -10,21 +10,24 @@ import ( "github.com/detailyang/go-fallocate" "github.com/ipfs/go-cid" - pool "github.com/libp2p/go-buffer-pool" "golang.org/x/xerrors" ffi "github.com/filecoin-project/filecoin-ffi" + commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/curio/harmony/harmonytask" - "github.com/filecoin-project/curio/lib/asyncwrite" + "github.com/filecoin-project/curio/lib/ffi/cunative" "github.com/filecoin-project/curio/lib/ffiselect" paths2 "github.com/filecoin-project/curio/lib/paths" "github.com/filecoin-project/curio/lib/proof" + "github.com/filecoin-project/curio/lib/proofpaths" "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/lib/supraffi" "github.com/filecoin-project/curio/lib/tarutil" + commutil "github.com/filecoin-project/go-commp-utils/nonffi" - "github.com/filecoin-project/lotus/storage/sealer/fr32" + "github.com/filecoin-project/lotus/storage/sealer/commitment" ) func (sb *SealCalls) EncodeUpdate( @@ -36,16 +39,16 @@ func (sb *SealCalls) EncodeUpdate( data io.Reader, pieces []abi.PieceInfo, keepUnsealed bool) (sealedCID cid.Cid, unsealedCID cid.Cid, err error) { - noDecl := storiface.FTNone - if !keepUnsealed { - noDecl = storiface.FTUnsealed + ssize, err := sector.ProofType.SectorSize() + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("getting sector size: %w", err) } - paths, pathIDs, releaseSector, err := sb.Sectors.AcquireSector(ctx, &taskID, sector, storiface.FTNone, storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTUnsealed, storiface.PathSealing) + paths, pathIDs, releaseSector, err := sb.Sectors.AcquireSector(ctx, &taskID, sector, storiface.FTNone, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("acquiring sector paths: %w", err) } - defer releaseSector(noDecl) + defer releaseSector() if paths.Update == "" || paths.UpdateCache == "" { return cid.Undef, cid.Undef, xerrors.Errorf("update paths not set") @@ -70,11 +73,11 @@ func (sb *SealCalls) EncodeUpdate( keyPath := filepath.Join(paths.UpdateCache, "cu-sector-key.dat") // can this be a named pipe - no, mmap in proofs keyCachePath := filepath.Join(paths.UpdateCache, "cu-sector-key-fincache") // some temp copy (finalized cache directory) - stagedDataPath := paths.Unsealed + var keyFile *os.File var cleanupStagedFiles func() error { - keyFile, err := os.Create(keyPath) + keyFile, err = os.Create(keyPath) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("creating key file: %w", err) } @@ -84,13 +87,7 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("creating key cache dir: %w", err) } - stagedFile, err := os.Create(stagedDataPath) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("creating temp file: %w", err) - } - keyPath = keyFile.Name() - stagedDataPath = stagedFile.Name() var cleanupDone bool cleanupStagedFiles = func() error { @@ -104,11 +101,6 @@ func (sb *SealCalls) EncodeUpdate( return xerrors.Errorf("closing key file: %w", err) } } - if stagedFile != nil { - if err := stagedFile.Close(); err != nil { - return xerrors.Errorf("closing staged file: %w", err) - } - } if err := os.Remove(keyPath); err != nil { return xerrors.Errorf("removing key file: %w", err) @@ -116,11 +108,6 @@ func (sb *SealCalls) EncodeUpdate( if err := os.RemoveAll(keyCachePath); err != nil { return xerrors.Errorf("removing key cache: %w", err) } - if !keepUnsealed { - if err := os.Remove(stagedDataPath); err != nil { - return xerrors.Errorf("removing staged file: %w", err) - } - } return nil } @@ -151,31 +138,11 @@ func (sb *SealCalls) EncodeUpdate( } keyFile = nil - // wrap stagedFile into a async bg writer - stagedOut := asyncwrite.New(stagedFile, 8) - - // copy data into stagedFile and close both - upw := fr32.NewPadWriter(stagedOut) - - // also wrap upw into async bg writer, this makes all io on separate goroutines - bgUpw := asyncwrite.New(upw, 2) - - copyBuf := pool.Get(32 << 20) - _, err = io.CopyBuffer(bgUpw, data, copyBuf) - pool.Put(copyBuf) + keyFile, err = os.OpenFile(keyPath, os.O_RDONLY, 0644) if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("copying unsealed data: %w", err) - } - if err := bgUpw.Close(); err != nil { - return cid.Cid{}, cid.Cid{}, xerrors.Errorf("closing padWriter: %w", err) + return cid.Undef, cid.Undef, xerrors.Errorf("opening key file: %w", err) } - if err := stagedOut.Close(); err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("closing staged data file: %w", err) - } - stagedFile = nil - stagedOut = nil - // fetch cache var buf bytes.Buffer // usually 73.2 MiB err = sb.Sectors.storage.ReadMinCacheInto(ctx, sector, storiface.FTCache, &buf) @@ -193,47 +160,112 @@ func (sb *SealCalls) EncodeUpdate( } } + commD, err := commutil.GenerateUnsealedCID(sector.ProofType, pieces) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("generate unsealed cid: %w", err) + } + + treeDPath := filepath.Join(paths.UpdateCache, proofpaths.TreeDName) + + // STEP 0: TreeD + treeCommD, err := proof.BuildTreeD(data, true, treeDPath, abi.PaddedPieceSize(ssize)) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("build tree d: %w", err) + } + + if commD != treeCommD { + return cid.Undef, cid.Undef, xerrors.Errorf("comm d mismatch: piece: %s != tree: %s", commD, treeCommD) + } + //////////////////// // Allocate update file //////////////////// + var updateFile *os.File { - s, err := os.Stat(keyPath) + keyStat, err := os.Stat(keyPath) if err != nil { return cid.Undef, cid.Undef, err } - sealedSize := s.Size() + sealedSize := keyStat.Size() - u, err := os.OpenFile(paths.Update, os.O_RDWR|os.O_CREATE, 0644) + updateFile, err = os.OpenFile(paths.Update, os.O_RDWR|os.O_CREATE, 0644) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("ensuring updated replica file exists: %w", err) } - if err := fallocate.Fallocate(u, 0, sealedSize); err != nil { + if err := fallocate.Fallocate(updateFile, 0, sealedSize); err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("allocating space for replica update file: %w", err) } - if err := u.Close(); err != nil { - return cid.Undef, cid.Undef, err - } } - ctx = ffiselect.WithLogCtx(ctx, "sector", sector.ID, "task", taskID, "key", keyPath, "cache", keyCachePath, "staged", stagedDataPath, "update", paths.Update, "updateCache", paths.UpdateCache) - out, err := ffiselect.FFISelect.EncodeInto(ctx, proofType, paths.Update, paths.UpdateCache, keyPath, keyCachePath, stagedDataPath, pieces) + // STEP 1: SupraEncode + + treeDFile, err := os.Open(treeDPath) if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("ffi update encode: %w", err) + return cid.Undef, cid.Undef, xerrors.Errorf("open tree d file: %w", err) } - - // STEP 1: SupraEncode + defer treeDFile.Close() + + err = cunative.EncodeSnap(sector.ProofType, commD, sectorKeyCid, keyFile, treeDFile, updateFile) + + // (close early) + // here we don't care about the error, as treeDFile was read-only + _ = treeDFile.Close() + // (close early) + if cerr := updateFile.Close(); cerr != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("close update file: %w", cerr) + } + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("encode snap: %w", err) + } // STEP 2: SupraTreeR - vps, err := ffi.SectorUpdate.GenerateUpdateVanillaProofs(proofType, sectorKeyCid, out.Sealed, out.Unsealed, paths.Update, paths.UpdateCache, keyPath, keyCachePath) + res := supraffi.TreeRFile(paths.Update, treeDPath, paths.UpdateCache, uint64(ssize)) + if res != 0 { + return cid.Undef, cid.Undef, xerrors.Errorf("tree r file %s: %w", paths.Update, err) + } + + // STEP 2.5: Read PAux-es, transplant CC CommC, write back, calculate CommR + + _, updateCommRLast, err := proof.ReadPAux(paths.UpdateCache) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("read update p aux: %w", err) + } + + ccCommC, _, err := proof.ReadPAux(keyCachePath) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("read cc p aux: %w", err) + } + + if err := proof.WritePAux(paths.UpdateCache, ccCommC, updateCommRLast); err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("write p aux: %w", err) + } + + commR, err := commitment.CommR(ccCommC, updateCommRLast) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("compute comm r: %w", err) + } + + if err := proof.WritePAux(paths.UpdateCache, ccCommC, updateCommRLast); err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("write comm r p aux: %w", err) + } + + sealedCid, err := commcid.ReplicaCommitmentV1ToCID(commR[:]) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("compute sealed cid: %w", err) + } + + // STEP 3: Generate update proofs + + vps, err := ffi.SectorUpdate.GenerateUpdateVanillaProofs(proofType, sectorKeyCid, sealedCid, commD, paths.Update, paths.UpdateCache, keyPath, keyCachePath) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("generate vanilla update proofs: %w", err) } - ok, err := ffi.SectorUpdate.VerifyVanillaProofs(proofType, sectorKeyCid, out.Sealed, out.Unsealed, vps) + ok, err := ffi.SectorUpdate.VerifyVanillaProofs(proofType, sectorKeyCid, sealedCid, commD, vps) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("verify vanilla update proofs: %w", err) } @@ -252,6 +284,21 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("write vanilla proofs: %w", err) } + // Create unsealed file from tree-d prefix (same bytes) + { + var uPaths, uPathIDs storiface.SectorPaths + + uPaths.Cache = paths.UpdateCache + uPathIDs.Cache = pathIDs.UpdateCache + + if err := sb.GenerateUnsealedSector(ctx, sector, &uPaths, &uPathIDs, keepUnsealed); err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("generate unsealed sector: %w", err) + } + + paths.Unsealed = uPaths.Unsealed + pathIDs.Unsealed = uPathIDs.Unsealed + } + // cleanup if err := cleanupStagedFiles(); err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("cleanup staged files: %w", err) @@ -270,7 +317,7 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("ensure one copy: %w", err) } - return out.Sealed, out.Unsealed, nil + return sealedCid, commD, nil } func (sb *SealCalls) ProveUpdate(ctx context.Context, proofType abi.RegisteredUpdateProof, sector storiface.SectorRef, key, sealed, unsealed cid.Cid) ([]byte, error) { diff --git a/lib/proof/p_aux_util.go b/lib/proof/p_aux_util.go new file mode 100644 index 000000000..7cffd2998 --- /dev/null +++ b/lib/proof/p_aux_util.go @@ -0,0 +1,35 @@ +package proof + +import ( + "os" + "path/filepath" + + "golang.org/x/xerrors" +) + +const PauxFile = "p_aux" + +func ReadPAux(cache string) ([32]byte, [32]byte, error) { + commCcommRLast, err := os.ReadFile(filepath.Join(cache, PauxFile)) + if err != nil { + return [32]byte{}, [32]byte{}, err + } + + if len(commCcommRLast) != 64 { + return [32]byte{}, [32]byte{}, xerrors.Errorf("invalid commCcommRLast length %d", len(commCcommRLast)) + } + + var commC, commRLast [32]byte + copy(commC[:], commCcommRLast[:32]) + copy(commRLast[:], commCcommRLast[32:]) + + return commC, commRLast, nil +} + +func WritePAux(cache string, commC, commRLast [32]byte) error { + commCcommRLast := make([]byte, 64) + copy(commCcommRLast[:32], commC[:]) + copy(commCcommRLast[32:], commRLast[:]) + + return os.WriteFile(filepath.Join(cache, PauxFile), commCcommRLast, 0644) +} \ No newline at end of file From 2fd9def30b5cde457f9a44843e9362bc1548e5f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 16:19:14 +0200 Subject: [PATCH 10/67] make gen --- .../translations/locales/en/out.gotext.json | 7 +++ .../translations/locales/ko/out.gotext.json | 9 +++- .../translations/locales/zh/out.gotext.json | 9 +++- cmd/curio/test-supra.go | 5 +- documentation/en/curio-cli/curio.md | 53 +++++++++++++++++++ lib/ffi/cunative/decode_snap.go | 1 + lib/ffi/cunative/encode_snap.go | 1 - lib/ffi/cunative/encode_snap_test.go | 2 +- lib/ffi/snap_funcs.go | 2 +- lib/proof/p_aux_util.go | 2 +- 10 files changed, 82 insertions(+), 9 deletions(-) diff --git a/cmd/curio/internal/translations/locales/en/out.gotext.json b/cmd/curio/internal/translations/locales/en/out.gotext.json index 87ab31c9a..6000e5509 100644 --- a/cmd/curio/internal/translations/locales/en/out.gotext.json +++ b/cmd/curio/internal/translations/locales/en/out.gotext.json @@ -1163,6 +1163,13 @@ "translatorComment": "Copied from source.", "fuzzy": true }, + { + "id": "Supra consensus testing utilities", + "message": "Supra consensus testing utilities", + "translation": "Supra consensus testing utilities", + "translatorComment": "Copied from source.", + "fuzzy": true + }, { "id": "Tool Box for Curio", "message": "Tool Box for Curio", diff --git a/cmd/curio/internal/translations/locales/ko/out.gotext.json b/cmd/curio/internal/translations/locales/ko/out.gotext.json index 8e0014cd4..1c8273db1 100644 --- a/cmd/curio/internal/translations/locales/ko/out.gotext.json +++ b/cmd/curio/internal/translations/locales/ko/out.gotext.json @@ -1,4 +1,11 @@ { "language": "ko", - "messages": [] + "messages": [ + { + "id": "Supra consensus testing utilities", + "translation": "", + "message": "Supra consensus testing utilities", + "placeholder": null + } + ] } diff --git a/cmd/curio/internal/translations/locales/zh/out.gotext.json b/cmd/curio/internal/translations/locales/zh/out.gotext.json index bb9d25e4c..ccb099c38 100644 --- a/cmd/curio/internal/translations/locales/zh/out.gotext.json +++ b/cmd/curio/internal/translations/locales/zh/out.gotext.json @@ -1,4 +1,11 @@ { "language": "zh", - "messages": [] + "messages": [ + { + "id": "Supra consensus testing utilities", + "translation": "", + "message": "Supra consensus testing utilities", + "placeholder": null + } + ] } diff --git a/cmd/curio/test-supra.go b/cmd/curio/test-supra.go index f768b4cfb..57122d4ab 100644 --- a/cmd/curio/test-supra.go +++ b/cmd/curio/test-supra.go @@ -7,12 +7,11 @@ import ( "os" "time" - "golang.org/x/xerrors" - + "github.com/ipfs/go-cid" "github.com/urfave/cli/v2" + "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" "github.com/filecoin-project/curio/cmd/curio/internal/translations" "github.com/filecoin-project/curio/lib/ffi/cunative" diff --git a/documentation/en/curio-cli/curio.md b/documentation/en/curio-cli/curio.md index 50faa51d2..29446ed77 100644 --- a/documentation/en/curio-cli/curio.md +++ b/documentation/en/curio-cli/curio.md @@ -493,6 +493,7 @@ USAGE: COMMANDS: window-post, wd, windowpost, wdpost Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain. debug Collection of debugging utilities + supra Supra consensus testing utilities help, h Shows a list of commands or help for one command OPTIONS: @@ -946,6 +947,58 @@ OPTIONS: --help, -h show help ``` +### curio test supra +``` +NAME: + curio test supra - Supra consensus testing utilities + +USAGE: + curio test supra command [command options] + +COMMANDS: + tree-r-file Test tree-r-file + snap-encode Test snap-encode + help, h Shows a list of commands or help for one command + +OPTIONS: + --help, -h show help +``` + +#### curio test supra tree-r-file +``` +NAME: + curio test supra tree-r-file - Test tree-r-file + +USAGE: + curio test supra tree-r-file [command options] + +OPTIONS: + --last-layer-filename value Last layer filename + --data-filename value Data filename + --output-dir value Output directory + --sector-size value Sector size (default: 0) + --help, -h show help +``` + +#### curio test supra snap-encode +``` +NAME: + curio test supra snap-encode - Test snap-encode + +USAGE: + curio test supra snap-encode [command options] + +OPTIONS: + --sealed-filename value Sealed filename + --unsealed-filename value Unsealed filename + --update-filename value Update filename + --sector-size value Sector size (bytes). Supported: 2048, 8388608, 549755813888, 34359738368, 68719476736 (default: 0) + --commd value Unsealed CommD CID (v1) + --commk value SectorKey CommR (commK) CID (v1) + --membuffer Use memory buffer instead of disk (load and store) (default: false) + --help, -h show help +``` + ## curio web ``` NAME: diff --git a/lib/ffi/cunative/decode_snap.go b/lib/ffi/cunative/decode_snap.go index 91b14347e..cc0796a48 100644 --- a/lib/ffi/cunative/decode_snap.go +++ b/lib/ffi/cunative/decode_snap.go @@ -56,6 +56,7 @@ import ( type B32le = [32]byte type BytesLE = []byte + var ResultBufDepth = 16 func DecodeSnap(spt abi.RegisteredSealProof, commD, commK cid.Cid, key, replica io.Reader, out io.Writer) error { diff --git a/lib/ffi/cunative/encode_snap.go b/lib/ffi/cunative/encode_snap.go index 0ca759884..44d131b69 100644 --- a/lib/ffi/cunative/encode_snap.go +++ b/lib/ffi/cunative/encode_snap.go @@ -35,7 +35,6 @@ import ( "io" "runtime" "sync" - "fmt" "unsafe" "github.com/ipfs/go-cid" diff --git a/lib/ffi/cunative/encode_snap_test.go b/lib/ffi/cunative/encode_snap_test.go index 0708dcf9b..dd8465e2e 100644 --- a/lib/ffi/cunative/encode_snap_test.go +++ b/lib/ffi/cunative/encode_snap_test.go @@ -8,8 +8,8 @@ import ( "io" "os" "path/filepath" - "time" "testing" + "time" "github.com/detailyang/go-fallocate" "github.com/stretchr/testify/require" diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index b84066503..d8d17c836 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -13,6 +13,7 @@ import ( "golang.org/x/xerrors" ffi "github.com/filecoin-project/filecoin-ffi" + commutil "github.com/filecoin-project/go-commp-utils/nonffi" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" @@ -25,7 +26,6 @@ import ( "github.com/filecoin-project/curio/lib/storiface" "github.com/filecoin-project/curio/lib/supraffi" "github.com/filecoin-project/curio/lib/tarutil" - commutil "github.com/filecoin-project/go-commp-utils/nonffi" "github.com/filecoin-project/lotus/storage/sealer/commitment" ) diff --git a/lib/proof/p_aux_util.go b/lib/proof/p_aux_util.go index 7cffd2998..2ea35c90a 100644 --- a/lib/proof/p_aux_util.go +++ b/lib/proof/p_aux_util.go @@ -32,4 +32,4 @@ func WritePAux(cache string, commC, commRLast [32]byte) error { copy(commCcommRLast[32:], commRLast[:]) return os.WriteFile(filepath.Join(cache, PauxFile), commCcommRLast, 0644) -} \ No newline at end of file +} From da80e533d7794637f436bf58829f86178d37f4ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Aug 2025 18:48:12 +0200 Subject: [PATCH 11/67] encode works --- lib/ffi/snap_funcs.go | 52 +++++++++++++++++++++++---- lib/ffiselect/ffidirect/ffi-direct.go | 11 ++++++ lib/ffiselect/ffiselect.go | 2 ++ tasks/snap/task_encode.go | 2 +- tasks/storage-market/task_commp.go | 5 +-- 5 files changed, 63 insertions(+), 9 deletions(-) diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index d8d17c836..2cf8f863c 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -7,6 +7,7 @@ import ( "io" "os" "path/filepath" + "time" "github.com/detailyang/go-fallocate" "github.com/ipfs/go-cid" @@ -23,8 +24,7 @@ import ( paths2 "github.com/filecoin-project/curio/lib/paths" "github.com/filecoin-project/curio/lib/proof" "github.com/filecoin-project/curio/lib/proofpaths" - "github.com/filecoin-project/curio/lib/storiface" - "github.com/filecoin-project/curio/lib/supraffi" + storiface "github.com/filecoin-project/curio/lib/storiface" "github.com/filecoin-project/curio/lib/tarutil" "github.com/filecoin-project/lotus/storage/sealer/commitment" @@ -75,6 +75,8 @@ func (sb *SealCalls) EncodeUpdate( keyCachePath := filepath.Join(paths.UpdateCache, "cu-sector-key-fincache") // some temp copy (finalized cache directory) var keyFile *os.File + prepareKeyStart := time.Now() + var cleanupStagedFiles func() error { keyFile, err = os.Create(keyPath) @@ -160,6 +162,8 @@ func (sb *SealCalls) EncodeUpdate( } } + log.Infow("prepare sector key", "took", time.Since(prepareKeyStart), "sectorID", sector.ID, "taskID", taskID) + commD, err := commutil.GenerateUnsealedCID(sector.ProofType, pieces) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("generate unsealed cid: %w", err) @@ -168,6 +172,7 @@ func (sb *SealCalls) EncodeUpdate( treeDPath := filepath.Join(paths.UpdateCache, proofpaths.TreeDName) // STEP 0: TreeD + treeDStart := time.Now() treeCommD, err := proof.BuildTreeD(data, true, treeDPath, abi.PaddedPieceSize(ssize)) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("build tree d: %w", err) @@ -177,12 +182,15 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("comm d mismatch: piece: %s != tree: %s", commD, treeCommD) } + log.Infow("build tree d", "took", time.Since(treeDStart), "sectorID", sector.ID, "taskID", taskID) + //////////////////// // Allocate update file //////////////////// var updateFile *os.File { + allocUpdateStart := time.Now() keyStat, err := os.Stat(keyPath) if err != nil { return cid.Undef, cid.Undef, err @@ -196,10 +204,12 @@ func (sb *SealCalls) EncodeUpdate( if err := fallocate.Fallocate(updateFile, 0, sealedSize); err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("allocating space for replica update file: %w", err) } + + log.Infow("allocate update file", "took", time.Since(allocUpdateStart), "sectorID", sector.ID, "taskID", taskID) } // STEP 1: SupraEncode - + encodeStart := time.Now() treeDFile, err := os.Open(treeDPath) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("open tree d file: %w", err) @@ -221,15 +231,22 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("encode snap: %w", err) } + log.Infow("encode snap", "took", time.Since(encodeStart), "sectorID", sector.ID, "taskID", taskID) + // STEP 2: SupraTreeR - res := supraffi.TreeRFile(paths.Update, treeDPath, paths.UpdateCache, uint64(ssize)) - if res != 0 { + treeRStart := time.Now() + + ctx = ffiselect.WithLogCtx(ctx, "sector", sector.ID, "task", taskID, "update", paths.Update, "treeD", treeDPath, "updateCache", paths.UpdateCache, "sectorSize", ssize) + err = ffiselect.FFISelect.TreeRFile(ctx, paths.Update, treeDPath, paths.UpdateCache, uint64(ssize)) + if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("tree r file %s: %w", paths.Update, err) } - // STEP 2.5: Read PAux-es, transplant CC CommC, write back, calculate CommR + log.Infow("tree r file", "took", time.Since(treeRStart), "sectorID", sector.ID, "taskID", taskID) + // STEP 2.5: Read PAux-es, transplant CC CommC, write back, calculate CommR + commRStart := time.Now() _, updateCommRLast, err := proof.ReadPAux(paths.UpdateCache) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("read update p aux: %w", err) @@ -253,6 +270,8 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("write comm r p aux: %w", err) } + log.Infow("compute commR and write p_aux", "took", time.Since(commRStart), "sectorID", sector.ID, "taskID", taskID) + sealedCid, err := commcid.ReplicaCommitmentV1ToCID(commR[:]) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("compute sealed cid: %w", err) @@ -260,11 +279,15 @@ func (sb *SealCalls) EncodeUpdate( // STEP 3: Generate update proofs + genVpsStart := time.Now() vps, err := ffi.SectorUpdate.GenerateUpdateVanillaProofs(proofType, sectorKeyCid, sealedCid, commD, paths.Update, paths.UpdateCache, keyPath, keyCachePath) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("generate vanilla update proofs: %w", err) } + log.Infow("generate vanilla update proofs", "took", time.Since(genVpsStart), "sectorID", sector.ID, "taskID", taskID) + + verifyVpsStart := time.Now() ok, err := ffi.SectorUpdate.VerifyVanillaProofs(proofType, sectorKeyCid, sealedCid, commD, vps) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("verify vanilla update proofs: %w", err) @@ -273,7 +296,10 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("vanilla update proofs invalid") } + log.Infow("verify vanilla update proofs", "took", time.Since(verifyVpsStart), "sectorID", sector.ID, "taskID", taskID) + // persist in UpdateCache/snap-vproof.json + writeVpsStart := time.Now() jb, err := json.Marshal(vps) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("marshal vanilla proofs: %w", err) @@ -284,6 +310,8 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("write vanilla proofs: %w", err) } + log.Infow("write vanilla proofs", "took", time.Since(writeVpsStart), "sectorID", sector.ID, "taskID", taskID) + // Create unsealed file from tree-d prefix (same bytes) { var uPaths, uPathIDs storiface.SectorPaths @@ -291,32 +319,44 @@ func (sb *SealCalls) EncodeUpdate( uPaths.Cache = paths.UpdateCache uPathIDs.Cache = pathIDs.UpdateCache + genUnsealedStart := time.Now() if err := sb.GenerateUnsealedSector(ctx, sector, &uPaths, &uPathIDs, keepUnsealed); err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("generate unsealed sector: %w", err) } paths.Unsealed = uPaths.Unsealed pathIDs.Unsealed = uPathIDs.Unsealed + + log.Infow("generate unsealed sector", "took", time.Since(genUnsealedStart), "sectorID", sector.ID, "taskID", taskID) } // cleanup + cleanupStart := time.Now() if err := cleanupStagedFiles(); err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("cleanup staged files: %w", err) } + log.Infow("cleanup staged files", "took", time.Since(cleanupStart), "sectorID", sector.ID, "taskID", taskID) + + clearCacheStart := time.Now() if err := ffi.ClearCache(paths.UpdateCache); err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("clear cache: %w", err) } + log.Infow("clear cache", "took", time.Since(clearCacheStart), "sectorID", sector.ID, "taskID", taskID) + ensureTypes := storiface.FTUpdate | storiface.FTUpdateCache if keepUnsealed { ensureTypes |= storiface.FTUnsealed } + ensureOneCopyStart := time.Now() if err := sb.ensureOneCopy(ctx, sector.ID, pathIDs, ensureTypes); err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("ensure one copy: %w", err) } + log.Infow("ensure one copy", "took", time.Since(ensureOneCopyStart), "sectorID", sector.ID, "taskID", taskID) + return sealedCid, commD, nil } diff --git a/lib/ffiselect/ffidirect/ffi-direct.go b/lib/ffiselect/ffidirect/ffi-direct.go index 3dbb99e9a..d737953eb 100644 --- a/lib/ffiselect/ffidirect/ffi-direct.go +++ b/lib/ffiselect/ffidirect/ffi-direct.go @@ -6,12 +6,14 @@ import ( "errors" "github.com/ipfs/go-cid" + "golang.org/x/xerrors" ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/proof" "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/lib/supraffi" ) // This allow reflection access to the FFI functions. @@ -88,6 +90,15 @@ func (FFI) GenerateUpdateProofWithVanilla( return ffi.SectorUpdate.GenerateUpdateProofWithVanilla(proofType, key, sealed, unsealed, vproofs) } +func (FFI) TreeRFile(lastLayerFilename, dataFilename, outputDir string, sectorSize uint64) error { + r := supraffi.TreeRFile(lastLayerFilename, dataFilename, outputDir, sectorSize) + if r != 0 { + return xerrors.Errorf("tree r file: %d", r) + } + + return nil +} + func (FFI) SelfTest(val1 int, val2 cid.Cid) (cid.Cid, error) { if val1 != 12345678 { return cid.Undef, errors.New("val1 was not as expected") diff --git a/lib/ffiselect/ffiselect.go b/lib/ffiselect/ffiselect.go index d0267ab73..e1521fbcc 100644 --- a/lib/ffiselect/ffiselect.go +++ b/lib/ffiselect/ffiselect.go @@ -192,6 +192,8 @@ var FFISelect struct { vproofs [][]byte, ) ([]byte, error) + TreeRFile func(ctx context.Context, lastLayerFilename, dataFilename, outputDir string, sectorSize uint64) error + SelfTest func(ctx context.Context, val1 int, val2 cid.Cid) (cid.Cid, error) } diff --git a/tasks/snap/task_encode.go b/tasks/snap/task_encode.go index 4bf62a97a..cf57424ba 100644 --- a/tasks/snap/task_encode.go +++ b/tasks/snap/task_encode.go @@ -135,7 +135,7 @@ func (e *EncodeTask) TypeDetails() harmonytask.TaskTypeDetails { Cpu: 1, Ram: 1 << 30, // todo correct value Gpu: gpu, - Storage: e.sc.Storage(e.taskToSector, storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTUnsealed, storiface.FTNone, ssize, storiface.PathSealing, 1.0), + Storage: e.sc.Storage(e.taskToSector, storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTNone, ssize, storiface.PathSealing, 1.0), }, MaxFailures: 3, IAmBored: passcall.Every(MinSnapSchedInterval, func(taskFunc harmonytask.AddTaskFunc) error { diff --git a/tasks/storage-market/task_commp.go b/tasks/storage-market/task_commp.go index 5a518011b..1972b5912 100644 --- a/tasks/storage-market/task_commp.go +++ b/tasks/storage-market/task_commp.go @@ -24,7 +24,8 @@ import ( "github.com/filecoin-project/curio/harmony/taskhelp" "github.com/filecoin-project/curio/lib/ffi" "github.com/filecoin-project/curio/lib/storiface" - + "github.com/filecoin-project/curio/lib/proof" + "github.com/filecoin-project/lotus/chain/types" ) @@ -158,7 +159,7 @@ func (c *CommpTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done _ = closer.Close() }() - w := &writer.Writer{} + w := new(proof.DataCidWriter) written, err := io.CopyBuffer(w, pReader, make([]byte, writer.CommPBuf)) if err != nil { return false, xerrors.Errorf("copy into commp writer: %w", err) From 90e7d6b0d6c8dca1a00b049572f63a7eb4af2da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 20 Aug 2025 07:12:18 +0200 Subject: [PATCH 12/67] fix: yield in PSClientPoll correctly --- tasks/proofshare/task_client_poll.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tasks/proofshare/task_client_poll.go b/tasks/proofshare/task_client_poll.go index e719b2f34..28bd99e1a 100644 --- a/tasks/proofshare/task_client_poll.go +++ b/tasks/proofshare/task_client_poll.go @@ -167,6 +167,25 @@ func (t *TaskClientPoll) Do(taskID harmonytask.TaskID, stillOwned func() bool) ( } }() + var ownedCancel context.CancelFunc + ctx, ownedCancel = context.WithTimeout(ctx, 10*time.Minute) + go func() { + const pollInterval = 10 * time.Second + defer ownedCancel() + + for { + select { + case <-ctx.Done(): + return + default: + time.Sleep(pollInterval) + if !stillOwned() { + return + } + } + } + }() + var proof []byte for { var stateChanged bool From 2c2ba112fce20b2fee3e60ea5035ecef48524de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 20 Aug 2025 07:51:46 +0200 Subject: [PATCH 13/67] faster webui history --- web/static/cluster-task-history.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/static/cluster-task-history.mjs b/web/static/cluster-task-history.mjs index 923458537..afbfa6302 100644 --- a/web/static/cluster-task-history.mjs +++ b/web/static/cluster-task-history.mjs @@ -9,7 +9,7 @@ customElements.define('cluster-task-history', class ClusterTaskHistory extends L } async loadData() { this.data = await RPCCall('ClusterTaskHistory', [20, 0]); - setTimeout(() => this.loadData(), 2000); + setTimeout(() => this.loadData(), 300); this.requestUpdate(); } render() { From 5c98653943c7ae9388040dd7c9d1bba8bbf82bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 20 Aug 2025 19:52:26 +0200 Subject: [PATCH 14/67] pspoll: Don't timeout the context --- tasks/proofshare/task_client_poll.go | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/tasks/proofshare/task_client_poll.go b/tasks/proofshare/task_client_poll.go index 28bd99e1a..e719b2f34 100644 --- a/tasks/proofshare/task_client_poll.go +++ b/tasks/proofshare/task_client_poll.go @@ -167,25 +167,6 @@ func (t *TaskClientPoll) Do(taskID harmonytask.TaskID, stillOwned func() bool) ( } }() - var ownedCancel context.CancelFunc - ctx, ownedCancel = context.WithTimeout(ctx, 10*time.Minute) - go func() { - const pollInterval = 10 * time.Second - defer ownedCancel() - - for { - select { - case <-ctx.Done(): - return - default: - time.Sleep(pollInterval) - if !stillOwned() { - return - } - } - } - }() - var proof []byte for { var stateChanged bool From 3f2451c3b692f61fafa41be9d672f4bf8ea5137c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 22 Aug 2025 21:41:48 +0200 Subject: [PATCH 15/67] fix EpochPretty ddos --- web/static/ux/epoch.mjs | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/web/static/ux/epoch.mjs b/web/static/ux/epoch.mjs index ef4733ee0..ecea3d89b 100644 --- a/web/static/ux/epoch.mjs +++ b/web/static/ux/epoch.mjs @@ -29,37 +29,10 @@ class EpochComponent extends LitElement { } scheduleNextUpdate() { - const delay = this.getDelayUntilNextUpdate(); - this._updateTimeout = setTimeout(() => { this.loadEpochInfo(); this.scheduleNextUpdate(); - }, delay); - } - - // try to refresh ~5s into an epoch - getDelayUntilNextUpdate() { - const now = new Date(); - let nextUpdate = new Date(now); - - const seconds = now.getSeconds(); - - if (seconds < 8) { - // Next update at hh:mm:05 - nextUpdate.setSeconds(5); - nextUpdate.setMilliseconds(0); - } else if (seconds >= 8 && seconds < 38) { - // Next update at hh:mm:35 - nextUpdate.setSeconds(35); - nextUpdate.setMilliseconds(0); - } else { - // seconds >= 35 - nextUpdate.setMinutes(nextUpdate.getMinutes() + 1); - nextUpdate.setSeconds(5); - nextUpdate.setMilliseconds(0); - } - - return nextUpdate - now; + }, 15000); } async loadEpochInfo() { From d08fabc5dc541346266894af7496db2e69ba12d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 23 Aug 2025 23:01:10 +0200 Subject: [PATCH 16/67] more robust dealdata --- lib/dealdata/dealdata.go | 2 +- lib/dealdata/metrics.go | 30 +++++ lib/dealdata/urlpiecereader.go | 46 ++++---- lib/robusthttp/minratereader.go | 81 ++++++++++++++ lib/robusthttp/ratecounter.go | 120 ++++++++++++++++++++ lib/robusthttp/robusthttp.go | 193 ++++++++++++++++++++++++++++++++ tasks/piece/task_park_piece.go | 4 +- 7 files changed, 454 insertions(+), 22 deletions(-) create mode 100644 lib/dealdata/metrics.go create mode 100644 lib/robusthttp/minratereader.go create mode 100644 lib/robusthttp/ratecounter.go create mode 100644 lib/robusthttp/robusthttp.go diff --git a/lib/dealdata/dealdata.go b/lib/dealdata/dealdata.go index 6b3e8ecc1..02eeaa696 100644 --- a/lib/dealdata/dealdata.go +++ b/lib/dealdata/dealdata.go @@ -218,7 +218,7 @@ func getDealMetadata(ctx context.Context, db *harmonydb.DB, sc *ffi.SealCalls, s reader, _ := padreader.New(pr, uint64(*p.DataRawSize)) pieceReaders = append(pieceReaders, reader) } else { - reader, _ := padreader.New(NewUrlReader(nil, dataUrl, hdrs, *p.DataRawSize), uint64(*p.DataRawSize)) + reader, _ := padreader.New(NewUrlReader(nil, dataUrl, hdrs, *p.DataRawSize, "directdealdata"), uint64(*p.DataRawSize)) pieceReaders = append(pieceReaders, reader) } diff --git a/lib/dealdata/metrics.go b/lib/dealdata/metrics.go new file mode 100644 index 000000000..0a8eacf65 --- /dev/null +++ b/lib/dealdata/metrics.go @@ -0,0 +1,30 @@ +package dealdata + +import ( + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +var ( + kindKey, _ = tag.NewKey("kind") +) + +var Measures = struct { + DataRead *stats.Int64Measure +}{ + DataRead: stats.Int64("dealdata_data_read", "Number of bytes read from data URLs", stats.UnitBytes), +} + +func init() { + err := view.Register( + &view.View{ + Measure: Measures.DataRead, + Aggregation: view.LastValue(), + TagKeys: []tag.Key{kindKey}, + }, + ) + if err != nil { + panic(err) + } +} diff --git a/lib/dealdata/urlpiecereader.go b/lib/dealdata/urlpiecereader.go index 8169969c0..b1952bfed 100644 --- a/lib/dealdata/urlpiecereader.go +++ b/lib/dealdata/urlpiecereader.go @@ -2,17 +2,22 @@ package dealdata import ( "context" - "fmt" "io" "net/http" "net/url" "strings" + "go.opencensus.io/stats" + "go.opencensus.io/tag" "golang.org/x/xerrors" "github.com/filecoin-project/curio/lib/paths" + "github.com/filecoin-project/curio/lib/robusthttp" + "github.com/google/uuid" ) +var rcs = robusthttp.NewRateCounters[uuid.UUID](robusthttp.MinAvgGlobalLogPeerRate(10, 1000)) + // CustoreScheme is a special url scheme indicating that a data URL is an http url withing the curio storage system const CustoreScheme = "custore" @@ -20,6 +25,8 @@ type UrlPieceReader struct { Url string Headers http.Header RawSize int64 // the exact number of bytes read, if we read more or less that's an error + + kind string RemoteEndpointReader *paths.Remote // Only used for .ReadRemote which issues http requests for internal /remote endpoints @@ -28,11 +35,12 @@ type UrlPieceReader struct { active io.ReadCloser // auto-closed on EOF } -func NewUrlReader(rmt *paths.Remote, p string, h http.Header, rs int64) *UrlPieceReader { +func NewUrlReader(rmt *paths.Remote, p string, h http.Header, rs int64, kind string) *UrlPieceReader { return &UrlPieceReader{ Url: p, RawSize: rs, Headers: h, + kind: kind, RemoteEndpointReader: rmt, } @@ -61,22 +69,11 @@ func (u *UrlPieceReader) initiateRequest() error { return xerrors.Errorf("URL scheme %s not supported", goUrl.Scheme) } - req, err := http.NewRequest(http.MethodGet, goUrl.String(), nil) - if err != nil { - return xerrors.Errorf("error creating request: %w", err) - } - - // Add custom headers for security and authentication - req.Header = u.Headers + rd := robusthttp.RobustGet(goUrl.String(), u.Headers, u.RawSize, func() *robusthttp.RateCounter { + return rcs.Get(uuid.New()) + }) - // Create a client and make the request - client := &http.Client{} - - resp, err := client.Do(req) - if err != nil { - return xerrors.Errorf("error making GET request: %w", err) - } - if resp.StatusCode != 200 { + /* if resp.StatusCode != 200 { limitedReader := io.LimitReader(resp.Body, 1024) respBodyBytes, readErr := io.ReadAll(limitedReader) closeErr := resp.Body.Close() @@ -90,9 +87,9 @@ func (u *UrlPieceReader) initiateRequest() error { } return xerrors.New(errMsg) } - + */ // Set 'active' to the response body - u.active = resp.Body + u.active = rd return nil } @@ -154,12 +151,23 @@ func (u *UrlPieceReader) Read(p []byte) (n int, err error) { return n, err } +func (u *UrlPieceReader) ReadSoFar() int64 { + return u.readSoFar +} + func (u *UrlPieceReader) Close() error { if !u.closed { u.closed = true + + _ = stats.RecordWithTags(context.Background(), + []tag.Mutator{tag.Upsert(kindKey, u.kind)}, + Measures.DataRead.M(u.readSoFar), + ) + if u.active == nil { return nil } + return u.active.Close() } diff --git a/lib/robusthttp/minratereader.go b/lib/robusthttp/minratereader.go new file mode 100644 index 000000000..7510dcd8a --- /dev/null +++ b/lib/robusthttp/minratereader.go @@ -0,0 +1,81 @@ +package robusthttp + +import ( + "io" + "time" + + "golang.org/x/xerrors" +) + + +type RateEnforcingReader struct { + r io.Reader + + readError error + + rc *RateCounter + + bytesTransferredSnap int64 + lastSpeedCheck time.Time + windowDuration time.Duration +} + +func NewRateEnforcingReader(r io.Reader, rc *RateCounter, windowDuration time.Duration) *RateEnforcingReader { + return &RateEnforcingReader{ + r: r, + rc: rc, + windowDuration: windowDuration, + } +} + +func (rer *RateEnforcingReader) Read(p []byte) (int, error) { + if rer.readError != nil { + return 0, rer.readError + } + + now := time.Now() + + if !rer.lastSpeedCheck.IsZero() && now.Sub(rer.lastSpeedCheck) >= rer.windowDuration { + elapsedTime := now.Sub(rer.lastSpeedCheck) + + checkErr := rer.rc.Check(func() error { + ctrTransferred := rer.rc.transferred.Load() + transferredInWindow := ctrTransferred - rer.bytesTransferredSnap + + rer.bytesTransferredSnap = ctrTransferred + rer.lastSpeedCheck = now + + transferSpeedMbps := float64(transferredInWindow*8) / 1e6 / elapsedTime.Seconds() + + return rer.rc.rateFunc(transferSpeedMbps, rer.rc.transfers.Load(), rer.rc.globalTransfers.Load()) + }) + + if checkErr != nil { + rer.readError = xerrors.Errorf("read rate over past %s is too slow: %w", rer.windowDuration, checkErr) + return 0, rer.readError + } + } else if rer.lastSpeedCheck.IsZero() { + // Initialize last speed check time and transferred bytes snapshot + rer.lastSpeedCheck = now + rer.bytesTransferredSnap = rer.rc.transferred.Load() + } + + // Set read deadline + if w, ok := rer.r.(interface{ SetReadDeadline(time.Time) error }); ok { + _ = w.SetReadDeadline(now.Add(rer.windowDuration * 2)) + } + + n, err := rer.r.Read(p) + rer.rc.transferred.Add(int64(n)) + return n, err +} + +func (rer *RateEnforcingReader) ReadError() error { + return rer.readError +} + +func (rer *RateEnforcingReader) Done() { + if rer.readError == nil { + rer.rc.Release() + } +} \ No newline at end of file diff --git a/lib/robusthttp/ratecounter.go b/lib/robusthttp/ratecounter.go new file mode 100644 index 000000000..68111071b --- /dev/null +++ b/lib/robusthttp/ratecounter.go @@ -0,0 +1,120 @@ +package robusthttp + +import ( + "math" + "sync" + "sync/atomic" + + "golang.org/x/xerrors" +) + +type RateCounters[K comparable] struct { + lk sync.Mutex + counters map[K]*RateCounter + globalTransfers atomic.Int64 + + rateFunc RateFunc +} + +var TotalTransferDivFactor int64 = 4 + +type RateFunc func(transferRateMbps float64, peerTransfers, totalTransfers int64) error + +func MinAvgGlobalLogPeerRate(minTxRateMbps, linkMbps float64) RateFunc { + return func(transferRateMbps float64, peerTransfers, totalTransfers int64) error { + peerTransferFactor := math.Log2(float64(peerTransfers) + 1) + minPeerTransferRate := minTxRateMbps * peerTransferFactor + + maxAvgTransferRate := linkMbps / float64(totalTransfers*TotalTransferDivFactor) + if maxAvgTransferRate < minPeerTransferRate { + minPeerTransferRate = maxAvgTransferRate + } + + if transferRateMbps < minPeerTransferRate { + return xerrors.Errorf("transfer rate %.3fMbps less than minimum %.3fMbps (%d peer tx, %d global tx)", transferRateMbps, minPeerTransferRate, peerTransfers, totalTransfers) + } + + return nil + } +} + +func NewRateCounters[K comparable](rateFunc RateFunc) *RateCounters[K] { + return &RateCounters[K]{ + counters: make(map[K]*RateCounter), + rateFunc: rateFunc, + } +} + +func (rc *RateCounters[K]) Get(key K) *RateCounter { + rc.lk.Lock() + defer rc.lk.Unlock() + + c, ok := rc.counters[key] + if !ok { + c = &RateCounter{ + rateFunc: rc.rateFunc, + globalTransfers: &rc.globalTransfers, + + unlink: func(check func() bool) { + rc.lk.Lock() + defer rc.lk.Unlock() + + rc.globalTransfers.Add(-1) + + if check() { + delete(rc.counters, key) + } + }, + } + rc.counters[key] = c + } + + rc.globalTransfers.Add(1) + c.transfers.Add(1) + + return c +} + +type RateCounter struct { + transferred atomic.Int64 + + lk sync.Mutex + + // only write with RateCounters.lk (inside unlink check func) + transfers atomic.Int64 + + globalTransfers *atomic.Int64 + + rateFunc RateFunc + unlink func(func() bool) +} + +func (rc *RateCounter) Release() { + rc.lk.Lock() + defer rc.lk.Unlock() + + rc.release() +} + +func (rc *RateCounter) release() { + rc.unlink(func() bool { + rc.transfers.Add(-1) + return rc.transfers.Load() == 0 + }) +} + +// Check allows only single concurrent check per peer - this is to prevent +// multiple concurrent checks causing all transfers to fail at once. +// When we drop a peer, we'll reduce rc.transfers, so the next check will +// require less total bandwidth (assuming that MinAvgGlobalLogPeerRate is used). +func (rc *RateCounter) Check(cb func() error) error { + rc.lk.Lock() + defer rc.lk.Unlock() + + err := cb() + if err != nil { + rc.release() + } + + return err +} diff --git a/lib/robusthttp/robusthttp.go b/lib/robusthttp/robusthttp.go new file mode 100644 index 000000000..3a9eff220 --- /dev/null +++ b/lib/robusthttp/robusthttp.go @@ -0,0 +1,193 @@ +package robusthttp + +import ( + "context" + "fmt" + "io" + "net" + "net/http" + "time" + + logging "github.com/ipfs/go-log/v2" + "golang.org/x/xerrors" +) + +var log = logging.Logger("robusthttp") + +type robustHttpResponse struct { + getRC func() *RateCounter + + url string + headers http.Header + + cur io.Reader + curCloser io.Closer + atOff, dataSize int64 +} + +var maxRetryCount = 15 + +func (r *robustHttpResponse) Read(p []byte) (n int, err error) { + defer func() { + r.atOff += int64(n) + }() + + var lastErr error + + for i := 0; i < maxRetryCount; i++ { + if r.cur == nil { + log.Debugw("Current response is nil, starting new request") + + if err := r.startReq(); err != nil { + log.Errorw("Error in startReq", "error", err, "i", i) + time.Sleep(1 * time.Second) + lastErr = err + continue + } + } + + n, err = r.cur.Read(p) + if err == io.EOF { + r.curCloser.Close() + r.cur = nil + log.Errorw("EOF reached in Read", "bytesRead", n) + return n, err + } + if err != nil { + log.Errorw("Read error", "error", err) + r.curCloser.Close() + r.cur = nil + + if n > 0 { + return n, nil + } + + lastErr = err + log.Errorw("robust http read error, will retry", "err", err, "i", i) + continue + } + if n == 0 { + r.curCloser.Close() + r.cur = nil + log.Errorw("Read 0 bytes", "bytesRead", n) + return 0, xerrors.Errorf("read 0 bytes") + } + + return n, nil + } + + return 0, xerrors.Errorf("http read failed after %d retries: lastErr: %w", maxRetryCount, lastErr) +} + +func (r *robustHttpResponse) Close() error { + log.Debug("Entering function Close") + if r.curCloser != nil { + return r.curCloser.Close() + } + log.Warnw("Exiting Close with no current closer") + return nil +} + +func (r *robustHttpResponse) startReq() error { + log.Debugw("Entering function startReq", "url", r.url) + dialer := &net.Dialer{ + Timeout: 20 * time.Second, + } + + var nc net.Conn + + client := &http.Client{ + Transport: &http.Transport{ + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + log.Debugw("DialContext called", "network", network, "addr", addr) + conn, err := dialer.DialContext(ctx, network, addr) + if err != nil { + log.Errorw("DialContext error", "error", err) + return nil, err + } + + nc = conn + + // Set a deadline for the whole operation, including reading the response + if err := conn.SetReadDeadline(time.Now().Add(30 * time.Second)); err != nil { + log.Errorw("SetReadDeadline error", "error", err) + return nil, xerrors.Errorf("set deadline: %w", err) + } + + return conn, nil + }, + }, + } + + req, err := http.NewRequest("GET", r.url, nil) + if err != nil { + log.Errorw("failed to create request", "err", err) + return xerrors.Errorf("failed to create request") + } + + req.Header = r.headers + req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", r.atOff, r.dataSize-1)) + + log.Debugw("Before sending HTTP request", "url", r.url, "cr", fmt.Sprintf("bytes=%d-%d", r.atOff, r.dataSize)) + resp, err := client.Do(req) + if err != nil { + log.Errorw("Error in client.Do", "error", err) + return xerrors.Errorf("do request: %w", err) + } + + if resp.StatusCode != http.StatusPartialContent && resp.StatusCode != http.StatusOK { + log.Errorw("Unexpected HTTP status", "status", resp.StatusCode) + resp.Body.Close() + return xerrors.Errorf("http status: %d", resp.StatusCode) + } + + if nc == nil { + log.Errorw("Connection is nil after client.Do") + resp.Body.Close() + return xerrors.Errorf("nc was nil") + } + + var reqTxIdleTimeout = 4 * time.Second + + dlRead := &readerDeadliner{ + Reader: resp.Body, + setDeadline: nc.SetReadDeadline, + } + + rc := r.getRC() + rw := NewRateEnforcingReader(dlRead, rc, reqTxIdleTimeout) + + r.cur = rw + r.curCloser = funcCloser(func() error { + log.Debugw("Closing response body") + rc.release() + return resp.Body.Close() + }) + + log.Debugw("Exiting startReq with success") + return nil +} + +type funcCloser func() error + +func (fc funcCloser) Close() error { + return fc() +} + +func RobustGet(url string, headers http.Header, dataSize int64, rcf func() *RateCounter) io.ReadCloser { + return &robustHttpResponse{ + getRC: rcf, + url: url, + dataSize: dataSize, + headers: headers, + } +} + +type readerDeadliner struct { + io.Reader + setDeadline func(time.Time) error +} + +func (rd *readerDeadliner) SetReadDeadline(t time.Time) error { + return rd.setDeadline(t) +} \ No newline at end of file diff --git a/tasks/piece/task_park_piece.go b/tasks/piece/task_park_piece.go index d3b1e6ffe..399b9cff1 100644 --- a/tasks/piece/task_park_piece.go +++ b/tasks/piece/task_park_piece.go @@ -170,7 +170,7 @@ func (p *ParkPieceTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (d if err != nil { return false, xerrors.Errorf("unmarshaling reference data headers: %w", err) } - upr := dealdata.NewUrlReader(p.remote, refData[i].DataURL, hdrs, pieceData.PieceRawSize) + upr := dealdata.NewUrlReader(p.remote, refData[i].DataURL, hdrs, pieceData.PieceRawSize, "parkpiece") defer func() { _ = upr.Close() @@ -184,7 +184,7 @@ func (p *ParkPieceTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (d } if err := p.sc.WritePiece(ctx, &taskID, pnum, pieceData.PieceRawSize, upr, storageType); err != nil { - merr = multierror.Append(merr, xerrors.Errorf("write piece: %w", err)) + merr = multierror.Append(merr, xerrors.Errorf("write piece (read so far: %d): %w", upr.ReadSoFar(), err)) continue } From 84a7d95bd5f42bb671b6073fd86fdbf61dd01e16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 23 Aug 2025 23:13:45 +0200 Subject: [PATCH 17/67] robusthttp metrics --- lib/robusthttp/metrics.go | 65 ++++++++++++++++++++++++++++++++++++ lib/robusthttp/robusthttp.go | 30 +++++++++++++++-- 2 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 lib/robusthttp/metrics.go diff --git a/lib/robusthttp/metrics.go b/lib/robusthttp/metrics.go new file mode 100644 index 000000000..cc3b9c80c --- /dev/null +++ b/lib/robusthttp/metrics.go @@ -0,0 +1,65 @@ +package robusthttp + +import ( + "context" + "sync/atomic" + + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" +) + +var ( + // Measures + metricBytesRead = stats.Int64("robusthttp_bytes_read", "Total bytes delivered by robusthttp readers", stats.UnitBytes) + metricRequestsStarted = stats.Int64("robusthttp_requests_started", "Number of robusthttp logical requests started", stats.UnitDimensionless) + metricRetries = stats.Int64("robusthttp_retries", "Total number of robusthttp retries across requests", stats.UnitDimensionless) + metricReadErrors = stats.Int64("robusthttp_read_errors", "Total number of robusthttp read/request errors (non-EOF)", stats.UnitDimensionless) + metricReadFailures = stats.Int64("robusthttp_read_failures", "Number of robusthttp requests that failed after retries", stats.UnitDimensionless) + metricActiveTransfers = stats.Int64("robusthttp_active_transfers", "Current number of active robusthttp transfers", stats.UnitDimensionless) + + activeTransfers atomic.Int64 +) + +func init() { + _ = view.Register( + &view.View{Measure: metricBytesRead, Aggregation: view.Sum()}, + &view.View{Measure: metricRequestsStarted, Aggregation: view.Sum()}, + &view.View{Measure: metricRetries, Aggregation: view.Sum()}, + &view.View{Measure: metricReadErrors, Aggregation: view.Sum()}, + &view.View{Measure: metricReadFailures, Aggregation: view.Sum()}, + &view.View{Measure: metricActiveTransfers, Aggregation: view.LastValue()}, + ) +} + +// Lightweight helpers to record metrics with minimal overhead and no tags to avoid +// high cardinality at very high call rates. + +func recordRequestStarted() { + stats.Record(context.Background(), metricRequestsStarted.M(1)) +} + +func recordRequestClosed(bytesRead, retries, errors int64) { + if bytesRead > 0 { + stats.Record(context.Background(), metricBytesRead.M(bytesRead)) + } + if retries > 0 { + stats.Record(context.Background(), metricRetries.M(retries)) + } + if errors > 0 { + stats.Record(context.Background(), metricReadErrors.M(errors)) + } +} + +func recordReadFailure() { + stats.Record(context.Background(), metricReadFailures.M(1)) +} + +func incActiveTransfers() { + val := activeTransfers.Add(1) + stats.Record(context.Background(), metricActiveTransfers.M(val)) +} + +func decActiveTransfers() { + val := activeTransfers.Add(-1) + stats.Record(context.Background(), metricActiveTransfers.M(val)) +} diff --git a/lib/robusthttp/robusthttp.go b/lib/robusthttp/robusthttp.go index 3a9eff220..f633de816 100644 --- a/lib/robusthttp/robusthttp.go +++ b/lib/robusthttp/robusthttp.go @@ -6,6 +6,7 @@ import ( "io" "net" "net/http" + "sync/atomic" "time" logging "github.com/ipfs/go-log/v2" @@ -17,12 +18,17 @@ var log = logging.Logger("robusthttp") type robustHttpResponse struct { getRC func() *RateCounter - url string + url string headers http.Header cur io.Reader curCloser io.Closer atOff, dataSize int64 + + // metrics counters + retries int64 + errs int64 + finalized int32 } var maxRetryCount = 15 @@ -42,6 +48,8 @@ func (r *robustHttpResponse) Read(p []byte) (n int, err error) { log.Errorw("Error in startReq", "error", err, "i", i) time.Sleep(1 * time.Second) lastErr = err + r.errs++ + r.retries++ continue } } @@ -51,6 +59,7 @@ func (r *robustHttpResponse) Read(p []byte) (n int, err error) { r.curCloser.Close() r.cur = nil log.Errorw("EOF reached in Read", "bytesRead", n) + r.finalize(false) return n, err } if err != nil { @@ -64,6 +73,8 @@ func (r *robustHttpResponse) Read(p []byte) (n int, err error) { lastErr = err log.Errorw("robust http read error, will retry", "err", err, "i", i) + r.errs++ + r.retries++ continue } if n == 0 { @@ -76,11 +87,13 @@ func (r *robustHttpResponse) Read(p []byte) (n int, err error) { return n, nil } + r.finalize(true) return 0, xerrors.Errorf("http read failed after %d retries: lastErr: %w", maxRetryCount, lastErr) } func (r *robustHttpResponse) Close() error { log.Debug("Entering function Close") + r.finalize(false) if r.curCloser != nil { return r.curCloser.Close() } @@ -88,6 +101,16 @@ func (r *robustHttpResponse) Close() error { return nil } +func (r *robustHttpResponse) finalize(failed bool) { + if atomic.CompareAndSwapInt32(&r.finalized, 0, 1) { + recordRequestClosed(r.atOff, r.retries, r.errs) + if failed { + recordReadFailure() + } + decActiveTransfers() + } +} + func (r *robustHttpResponse) startReq() error { log.Debugw("Entering function startReq", "url", r.url) dialer := &net.Dialer{ @@ -175,6 +198,9 @@ func (fc funcCloser) Close() error { } func RobustGet(url string, headers http.Header, dataSize int64, rcf func() *RateCounter) io.ReadCloser { + recordRequestStarted() + incActiveTransfers() + return &robustHttpResponse{ getRC: rcf, url: url, @@ -190,4 +216,4 @@ type readerDeadliner struct { func (rd *readerDeadliner) SetReadDeadline(t time.Time) error { return rd.setDeadline(t) -} \ No newline at end of file +} From b7a026d083a428d89b40b25c638ecf72be1f190e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 25 Aug 2025 18:05:13 +0200 Subject: [PATCH 18/67] enable is done this way round --- tasks/snap/task_prove.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/snap/task_prove.go b/tasks/snap/task_prove.go index 20c7edb02..3f4468b95 100644 --- a/tasks/snap/task_prove.go +++ b/tasks/snap/task_prove.go @@ -106,7 +106,7 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done } func (p *ProveTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { - if !p.enableRemoteProofs { + if p.enableRemoteProofs { // remote proofs enabled but not local prove - we still need the task for poller return nil, nil } From bbe3948295f2f7976cad2d8fa3d0bc891264f2bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 26 Aug 2025 16:41:31 +0200 Subject: [PATCH 19/67] pshare: prio snap --- tasks/proofshare/task_client_send.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tasks/proofshare/task_client_send.go b/tasks/proofshare/task_client_send.go index 074a9b943..6e25be56f 100644 --- a/tasks/proofshare/task_client_send.go +++ b/tasks/proofshare/task_client_send.go @@ -564,6 +564,11 @@ func (t *TaskClientSend) pickCandidateRequest(ctx context.Context, requests []Ca // create a map of requests by sectorID sectorIDMap := make(map[abi.SectorID]CandidateRequest) for _, request := range requests { + if request.RequestType == "snap" { + // snap has priority + return request, nil + } + sectorIDMap[abi.SectorID{ Miner: abi.ActorID(request.SpID), Number: abi.SectorNumber(request.SectorNumber), From e95fbdbc97b8a1df10d45717918fa4526e6619ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 27 Aug 2025 14:29:39 +0200 Subject: [PATCH 20/67] encode bind to data --- cmd/curio/tasks/tasks.go | 4 +- deps/config/types.go | 10 ++ tasks/snap/task_encode.go | 146 +++++++++++++++++++++++++++-- tasks/storage-market/task_commp.go | 13 ++- 4 files changed, 160 insertions(+), 13 deletions(-) diff --git a/cmd/curio/tasks/tasks.go b/cmd/curio/tasks/tasks.go index adc06a5d9..103585a72 100644 --- a/cmd/curio/tasks/tasks.go +++ b/cmd/curio/tasks/tasks.go @@ -268,7 +268,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan } if cfg.Subsystems.EnableCommP { - commpTask := storage_market.NewCommpTask(dm, db, must.One(slrLazy.Val()), full, cfg.Subsystems.CommPMaxTasks) + commpTask := storage_market.NewCommpTask(dm, db, must.One(slrLazy.Val()), full, cfg.Subsystems.CommPMaxTasks, cfg.Subsystems.BindCommPToData) activeTasks = append(activeTasks, commpTask) } @@ -454,7 +454,7 @@ func addSealingTasks( } if cfg.Subsystems.EnableUpdateEncode { - encodeTask := snap.NewEncodeTask(slr, db, cfg.Subsystems.UpdateEncodeMaxTasks) + encodeTask := snap.NewEncodeTask(slr, db, cfg.Subsystems.UpdateEncodeMaxTasks, cfg.Subsystems.BindEncodeToData) activeTasks = append(activeTasks, encodeTask) } if cfg.Subsystems.EnableUpdateProve || cfg.Subsystems.EnableRemoteProofs { diff --git a/deps/config/types.go b/deps/config/types.go index f46d81a0a..085385e7b 100644 --- a/deps/config/types.go +++ b/deps/config/types.go @@ -346,6 +346,11 @@ type CurioSubsystemsConfig struct { // UpdateEncodeMaxTasks sets the maximum number of concurrent SnapDeal encoding tasks that can run on this instance. (Default: 0 - unlimited) UpdateEncodeMaxTasks int + // BindEncodeToData forces the Encode task to be executed on the same node where the data was parked. + // Please ensure that ParkPiece task is enabled and relevant resources are available before enabling this option. + // (Default: false) + BindEncodeToData bool + // UpdateProveMaxTasks sets the maximum number of concurrent SnapDeal proving tasks that can run on this instance. (Default: 0 - unlimited) UpdateProveMaxTasks int @@ -383,6 +388,11 @@ type CurioSubsystemsConfig struct { // also be bounded by resources available on the machine. (Default: 0 - unlimited) CommPMaxTasks int + // BindCommPToData forces the CommP task to be executed on the same node where the data was parked. + // Please ensure that ParkPiece task is enabled and relevant resources are available before enabling this option. + // (Default: false) + BindCommPToData bool + // The maximum amount of indexing and IPNI tasks that can run simultaneously. Note that the maximum number of tasks will // also be bounded by resources available on the machine. (Default: 8) IndexingMaxTasks int diff --git a/tasks/snap/task_encode.go b/tasks/snap/task_encode.go index cf57424ba..662ca4e77 100644 --- a/tasks/snap/task_encode.go +++ b/tasks/snap/task_encode.go @@ -3,6 +3,8 @@ package snap import ( "context" "math/rand/v2" + "net/url" + "strconv" "time" "github.com/ipfs/go-cid" @@ -24,17 +26,19 @@ import ( const MinSnapSchedInterval = 10 * time.Second type EncodeTask struct { - max int + max int + bindToData bool sc *ffi.SealCalls db *harmonydb.DB } -func NewEncodeTask(sc *ffi.SealCalls, db *harmonydb.DB, max int) *EncodeTask { +func NewEncodeTask(sc *ffi.SealCalls, db *harmonydb.DB, max int, bindToData bool) *EncodeTask { return &EncodeTask{ - max: max, - sc: sc, - db: db, + max: max, + sc: sc, + db: db, + bindToData: bindToData, } } @@ -114,8 +118,136 @@ func (e *EncodeTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done } func (e *EncodeTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { - id := ids[0] - return &id, nil + if !e.bindToData { + id := ids[0] + return &id, nil + } + + // debug log + log.Infow("encode task can accept", "ids", ids, "bindToData", e.bindToData) + + ctx := context.Background() + + // Build a list of candidate tasks for the provided ids + indIDs := make([]int64, len(ids)) + for i, id := range ids { + indIDs[i] = int64(id) + } + + var tasks []struct { + TaskID harmonytask.TaskID `db:"task_id_encode"` + SpID int64 `db:"sp_id"` + SectorNumber int64 `db:"sector_number"` + + StorageID string + NoPieceRefs bool + } + + _, err := e.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + if err := tx.Select(&tasks, ` + SELECT task_id_encode, sp_id, sector_number + FROM sectors_snap_pipeline + WHERE task_id_encode = ANY ($1)`, indIDs); err != nil { + return false, xerrors.Errorf("selecting snap encode tasks: %w", err) + } + + for i := range tasks { + var pieceURLs []struct { + Url *string `db:"data_url"` + } + if err := tx.Select(&pieceURLs, ` + SELECT data_url FROM sectors_snap_initial_pieces + WHERE sp_id = $1 AND sector_number = $2`, tasks[i].SpID, tasks[i].SectorNumber); err != nil { + return false, xerrors.Errorf("selecting snap piece urls: %w", err) + } + + hasPieceRef := false + for _, pu := range pieceURLs { + if pu.Url == nil || *pu.Url == "" { + continue + } + u, err := url.Parse(*pu.Url) + if err != nil { + continue + } + if u.Scheme != "pieceref" { + continue + } + hasPieceRef = true + + refNum, err := strconv.ParseInt(u.Opaque, 10, 64) + if err != nil { + continue + } + + var pieceID []struct { + PieceID storiface.PieceNumber `db:"piece_id"` + } + if err := tx.Select(&pieceID, `SELECT piece_id FROM parked_piece_refs WHERE ref_id = $1`, refNum); err != nil || len(pieceID) != 1 { + continue + } + + var sLocation string + if err := tx.QueryRow(` + SELECT storage_id FROM sector_location + WHERE miner_id = $1 AND sector_num = $2 AND sector_filetype = $3 + LIMIT 1`, 0, pieceID[0].PieceID, storiface.FTPiece).Scan(&sLocation); err != nil { + continue + } + + if sLocation != "" { + tasks[i].StorageID = sLocation + break + } + } + + if !hasPieceRef { + tasks[i].NoPieceRefs = true + } + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return nil, err + } + + // Load local storage IDs + ls, err := e.sc.LocalStorage(ctx) + if err != nil { + return nil, xerrors.Errorf("getting local storage: %w", err) + } + local := map[string]struct{}{} + for _, l := range ls { + local[string(l.ID)] = struct{}{} + } + + // debug log + log.Infow("encode task can accept", "tasks", tasks, "bindToData", e.bindToData, "local", local) + + // Prefer tasks where at least one pieceref is present on local storage + for _, t := range tasks { + if t.StorageID == "" { + continue + } + if _, ok := local[t.StorageID]; ok { + id := t.TaskID + log.Infow("encode task can accept did accept", "task", t) + return &id, nil + } + } + + // Fallback: if task has no pieceref pieces, it can run anywhere + for _, t := range tasks { + if t.NoPieceRefs { + id := t.TaskID + log.Infow("encode task can accept accepting non-pieceref task (anywhere)", "task", t) + return &id, nil + } + } + + // No acceptable tasks for this node + return nil, nil } func (e *EncodeTask) TypeDetails() harmonytask.TaskTypeDetails { diff --git a/tasks/storage-market/task_commp.go b/tasks/storage-market/task_commp.go index 1972b5912..2b005aa1d 100644 --- a/tasks/storage-market/task_commp.go +++ b/tasks/storage-market/task_commp.go @@ -35,15 +35,17 @@ type CommpTask struct { sc *ffi.SealCalls api headAPI max int + bindToData bool } -func NewCommpTask(sm *CurioStorageDealMarket, db *harmonydb.DB, sc *ffi.SealCalls, api headAPI, max int) *CommpTask { +func NewCommpTask(sm *CurioStorageDealMarket, db *harmonydb.DB, sc *ffi.SealCalls, api headAPI, max int, bindToData bool) *CommpTask { return &CommpTask{ sm: sm, db: db, sc: sc, api: api, max: max, + bindToData: bindToData, } } @@ -219,8 +221,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task // ParkPiece should be scheduled on same node which has the piece // Remote HTTP ones can be scheduled on any node - if true { - // TODO make this a setting + if !c.bindToData { id := ids[0] return &id, nil } @@ -309,6 +310,9 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task acceptables[t] = true } + // debug log + log.Infow("commp task can accept", "tasks", tasks, "acceptables", acceptables, "ls", ls, "bindToData", c.bindToData, "ids", ids, "ls", ls) + for _, t := range tasks { if _, ok := acceptables[t.TaskID]; !ok { continue @@ -316,13 +320,14 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task for _, l := range ls { if string(l.ID) == t.StorageID { + log.Infow("commp task can accept did accept", "t", t, "l", l) return &t.TaskID, nil } } } // If no local pieceRef was found then just return first TaskID - return &ids[0], nil + return nil, nil } func (c *CommpTask) TypeDetails() harmonytask.TaskTypeDetails { From a6f6db4c7b2f569d637d01352e7b0837c57a6657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 27 Aug 2025 15:58:30 +0200 Subject: [PATCH 21/67] make gen --- deps/config/doc_gen.go | 16 +++++++++++++ .../default-curio-configuration.md | 14 +++++++++++ lib/dealdata/metrics.go | 6 ++--- lib/dealdata/urlpiecereader.go | 8 +++---- lib/robusthttp/minratereader.go | 3 +-- tasks/storage-market/task_commp.go | 24 +++++++++---------- 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/deps/config/doc_gen.go b/deps/config/doc_gen.go index 67848dd3b..5998b0fe8 100644 --- a/deps/config/doc_gen.go +++ b/deps/config/doc_gen.go @@ -726,6 +726,14 @@ This step submits the generated proofs to the chain. (Default: false)`, Comment: `UpdateEncodeMaxTasks sets the maximum number of concurrent SnapDeal encoding tasks that can run on this instance. (Default: 0 - unlimited)`, }, + { + Name: "BindEncodeToData", + Type: "bool", + + Comment: `BindEncodeToData forces the Encode task to be executed on the same node where the data was parked. +Please ensure that ParkPiece task is enabled and relevant resources are available before enabling this option. +(Default: false)`, + }, { Name: "UpdateProveMaxTasks", Type: "int", @@ -792,6 +800,14 @@ Must have EnableDealMarket = True (Default: false)`, Comment: `The maximum amount of CommP tasks that can run simultaneously. Note that the maximum number of tasks will also be bounded by resources available on the machine. (Default: 0 - unlimited)`, + }, + { + Name: "BindCommPToData", + Type: "bool", + + Comment: `BindCommPToData forces the CommP task to be executed on the same node where the data was parked. +Please ensure that ParkPiece task is enabled and relevant resources are available before enabling this option. +(Default: false)`, }, { Name: "IndexingMaxTasks", diff --git a/documentation/en/configuration/default-curio-configuration.md b/documentation/en/configuration/default-curio-configuration.md index c2281dc57..71fc5467a 100644 --- a/documentation/en/configuration/default-curio-configuration.md +++ b/documentation/en/configuration/default-curio-configuration.md @@ -212,6 +212,13 @@ description: The default curio configuration # type: int #UpdateEncodeMaxTasks = 0 + # BindEncodeToData forces the Encode task to be executed on the same node where the data was parked. + # Please ensure that ParkPiece task is enabled and relevant resources are available before enabling this option. + # (Default: false) + # + # type: bool + #BindEncodeToData = false + # UpdateProveMaxTasks sets the maximum number of concurrent SnapDeal proving tasks that can run on this instance. (Default: 0 - unlimited) # # type: int @@ -269,6 +276,13 @@ description: The default curio configuration # type: int #CommPMaxTasks = 0 + # BindCommPToData forces the CommP task to be executed on the same node where the data was parked. + # Please ensure that ParkPiece task is enabled and relevant resources are available before enabling this option. + # (Default: false) + # + # type: bool + #BindCommPToData = false + # The maximum amount of indexing and IPNI tasks that can run simultaneously. Note that the maximum number of tasks will # also be bounded by resources available on the machine. (Default: 8) # diff --git a/lib/dealdata/metrics.go b/lib/dealdata/metrics.go index 0a8eacf65..b0f6fe6ce 100644 --- a/lib/dealdata/metrics.go +++ b/lib/dealdata/metrics.go @@ -7,13 +7,13 @@ import ( ) var ( - kindKey, _ = tag.NewKey("kind") + kindKey, _ = tag.NewKey("kind") ) var Measures = struct { - DataRead *stats.Int64Measure + DataRead *stats.Int64Measure }{ - DataRead: stats.Int64("dealdata_data_read", "Number of bytes read from data URLs", stats.UnitBytes), + DataRead: stats.Int64("dealdata_data_read", "Number of bytes read from data URLs", stats.UnitBytes), } func init() { diff --git a/lib/dealdata/urlpiecereader.go b/lib/dealdata/urlpiecereader.go index b1952bfed..aacaa9c7d 100644 --- a/lib/dealdata/urlpiecereader.go +++ b/lib/dealdata/urlpiecereader.go @@ -7,13 +7,13 @@ import ( "net/url" "strings" + "github.com/google/uuid" "go.opencensus.io/stats" "go.opencensus.io/tag" "golang.org/x/xerrors" "github.com/filecoin-project/curio/lib/paths" "github.com/filecoin-project/curio/lib/robusthttp" - "github.com/google/uuid" ) var rcs = robusthttp.NewRateCounters[uuid.UUID](robusthttp.MinAvgGlobalLogPeerRate(10, 1000)) @@ -25,8 +25,8 @@ type UrlPieceReader struct { Url string Headers http.Header RawSize int64 // the exact number of bytes read, if we read more or less that's an error - - kind string + + kind string RemoteEndpointReader *paths.Remote // Only used for .ReadRemote which issues http requests for internal /remote endpoints @@ -87,7 +87,7 @@ func (u *UrlPieceReader) initiateRequest() error { } return xerrors.New(errMsg) } - */ + */ // Set 'active' to the response body u.active = rd return nil diff --git a/lib/robusthttp/minratereader.go b/lib/robusthttp/minratereader.go index 7510dcd8a..b6375e955 100644 --- a/lib/robusthttp/minratereader.go +++ b/lib/robusthttp/minratereader.go @@ -7,7 +7,6 @@ import ( "golang.org/x/xerrors" ) - type RateEnforcingReader struct { r io.Reader @@ -78,4 +77,4 @@ func (rer *RateEnforcingReader) Done() { if rer.readError == nil { rer.rc.Release() } -} \ No newline at end of file +} diff --git a/tasks/storage-market/task_commp.go b/tasks/storage-market/task_commp.go index 2b005aa1d..51899c2d8 100644 --- a/tasks/storage-market/task_commp.go +++ b/tasks/storage-market/task_commp.go @@ -23,28 +23,28 @@ import ( "github.com/filecoin-project/curio/harmony/resources" "github.com/filecoin-project/curio/harmony/taskhelp" "github.com/filecoin-project/curio/lib/ffi" - "github.com/filecoin-project/curio/lib/storiface" "github.com/filecoin-project/curio/lib/proof" - + "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/lotus/chain/types" ) type CommpTask struct { - sm *CurioStorageDealMarket - db *harmonydb.DB - sc *ffi.SealCalls - api headAPI - max int + sm *CurioStorageDealMarket + db *harmonydb.DB + sc *ffi.SealCalls + api headAPI + max int bindToData bool } func NewCommpTask(sm *CurioStorageDealMarket, db *harmonydb.DB, sc *ffi.SealCalls, api headAPI, max int, bindToData bool) *CommpTask { return &CommpTask{ - sm: sm, - db: db, - sc: sc, - api: api, - max: max, + sm: sm, + db: db, + sc: sc, + api: api, + max: max, bindToData: bindToData, } } From 76dd121b1dfdc09426337481e20481e9413691fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 27 Aug 2025 16:58:38 +0200 Subject: [PATCH 22/67] piecepark node dl limit --- cmd/curio/tasks/tasks.go | 2 +- deps/config/types.go | 3 ++ tasks/piece/task_park_piece.go | 79 ++++++++++++++++++++++++++++++---- 3 files changed, 74 insertions(+), 10 deletions(-) diff --git a/cmd/curio/tasks/tasks.go b/cmd/curio/tasks/tasks.go index 103585a72..120f479ab 100644 --- a/cmd/curio/tasks/tasks.go +++ b/cmd/curio/tasks/tasks.go @@ -234,7 +234,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan { // Piece handling if cfg.Subsystems.EnableParkPiece { - parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks) + parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark) if err != nil { return nil, err } diff --git a/deps/config/types.go b/deps/config/types.go index 085385e7b..f0fc59e76 100644 --- a/deps/config/types.go +++ b/deps/config/types.go @@ -232,6 +232,9 @@ type CurioSubsystemsConfig struct { // also be bounded by resources available on the machine (Default: 0 - unlimited) ParkPieceMaxTasks int + // The maximum number of pieces that should be in storage + active tasks writing to storage on this node (Default: 0 - unlimited) + ParkPieceMaxInPark int + // EnableSealSDR enables SDR tasks to run. SDR is the long sequential computation // creating 11 layer files in sector cache directory. // diff --git a/tasks/piece/task_park_piece.go b/tasks/piece/task_park_piece.go index 399b9cff1..9d92e332a 100644 --- a/tasks/piece/task_park_piece.go +++ b/tasks/piece/task_park_piece.go @@ -38,24 +38,28 @@ type ParkPieceTask struct { max int + // maxInPark is the maximum number of pieces that should be in storage + active tasks writing to storage on this node + maxInPark int + longTerm bool // Indicates if the task is for long-term pieces } -func NewParkPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, max int) (*ParkPieceTask, error) { - return newPieceTask(db, sc, nil, max, false) +func NewParkPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, max int, maxInPark int) (*ParkPieceTask, error) { + return newPieceTask(db, sc, nil, max, maxInPark, false) } func NewStorePieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int) (*ParkPieceTask, error) { - return newPieceTask(db, sc, remote, max, true) + return newPieceTask(db, sc, remote, max, 0, true) } -func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int, longTerm bool) (*ParkPieceTask, error) { +func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int, maxInPark int, longTerm bool) (*ParkPieceTask, error) { pt := &ParkPieceTask{ - db: db, - sc: sc, - remote: remote, - max: max, - longTerm: longTerm, + db: db, + sc: sc, + remote: remote, + max: max, + maxInPark: maxInPark, + longTerm: longTerm, } ctx := context.Background() @@ -203,6 +207,63 @@ func (p *ParkPieceTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (d } func (p *ParkPieceTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + if p.maxInPark <= 0 { + id := ids[0] + return &id, nil + } + + ctx := context.Background() + + // Load local storage IDs + ls, err := p.sc.LocalStorage(ctx) + if err != nil { + return nil, xerrors.Errorf("getting local storage: %w", err) + } + local := map[string]struct{}{} + storageIDs := []string{} + for _, l := range ls { + local[string(l.ID)] = struct{}{} + storageIDs = append(storageIDs, string(l.ID)) + } + + // Count pieces in storage + // select count(1), storage_id from sector_location where sector_filetype = 32 and storage_id = ANY ($1) group by storage_id + + var count int64 + err = p.db.QueryRow(ctx, ` + SELECT count(1) FROM sector_location WHERE sector_filetype = $1 AND storage_id = ANY ($2) + `, storiface.FTPiece, storageIDs).Scan(&count) + if err != nil { + return nil, xerrors.Errorf("counting pieces in storage: %w", err) + } + + log.Infow("park piece task can accept", "ids", ids, "maxInPark", p.maxInPark, "count", count) + if count >= int64(p.maxInPark) { + log.Infow("park piece task can accept", "skip", "yes-in-storage", "ids", ids, "maxInPark", p.maxInPark, "count", count, "maxInPark", p.maxInPark) + return nil, nil + } + + // count tasks running on this node + hostAndPort := engine.Host() + + var running int64 + err = p.db.QueryRow(ctx, ` + SELECT count(1) + FROM harmony_task + WHERE name = $1 + AND owner_id = ( + SELECT id FROM harmony_machines WHERE host_and_port = $2 + ) + `, p.TypeDetails().Name, hostAndPort).Scan(&running) + if err != nil { + return nil, xerrors.Errorf("counting running piece tasks: %w", err) + } + + if count+running >= int64(p.maxInPark) { + log.Infow("park piece task can accept", "skip", "yes-in-running", "ids", ids, "running", running, "count+running", count+running, "maxInPark", p.maxInPark) + return nil, nil + } + id := ids[0] return &id, nil } From 51395171ad13440dc62c2251e2af0cb925b9e2cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 27 Aug 2025 17:51:26 +0200 Subject: [PATCH 23/67] only park pieces locally when supra P2 isn't running --- cmd/curio/tasks/tasks.go | 20 ++++++++++++-------- deps/config/types.go | 4 ++++ tasks/piece/task_park_piece.go | 16 ++++++++++++---- tasks/sealsupra/phase.go | 6 ++++++ tasks/sealsupra/task_supraseal.go | 30 +++++++++++++++++------------- tasks/snap/task_encode.go | 6 ++++-- 6 files changed, 55 insertions(+), 27 deletions(-) diff --git a/cmd/curio/tasks/tasks.go b/cmd/curio/tasks/tasks.go index 120f479ab..012975949 100644 --- a/cmd/curio/tasks/tasks.go +++ b/cmd/curio/tasks/tasks.go @@ -223,18 +223,20 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan cfg.Subsystems.EnableProofShare || cfg.Subsystems.EnableRemoteProofs + var p2Active sealsupra.P2Active if hasAnySealingTask { - sealingTasks, err := addSealingTasks(ctx, hasAnySealingTask, db, full, sender, as, cfg, slrLazy, asyncParams, si, stor, bstore, machine, prover) + sealingTasks, p2a, err := addSealingTasks(ctx, hasAnySealingTask, db, full, sender, as, cfg, slrLazy, asyncParams, si, stor, bstore, machine, prover) if err != nil { return nil, err } activeTasks = append(activeTasks, sealingTasks...) + p2Active = p2a } { // Piece handling if cfg.Subsystems.EnableParkPiece { - parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark) + parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark, p2Active) if err != nil { return nil, err } @@ -361,7 +363,7 @@ func addSealingTasks( ctx context.Context, hasAnySealingTask bool, db *harmonydb.DB, full api.Chain, sender *message.Sender, as *multictladdr.MultiAddressSelector, cfg *config.CurioConfig, slrLazy *lazy.Lazy[*ffi.SealCalls], asyncParams func() func() (bool, error), si paths.SectorIndex, stor *paths.Remote, - bstore curiochain.CurioBlockstore, machineHostPort string, prover storiface.Prover) ([]harmonytask.TaskInterface, error) { + bstore curiochain.CurioBlockstore, machineHostPort string, prover storiface.Prover) ([]harmonytask.TaskInterface, sealsupra.P2Active, error) { var activeTasks []harmonytask.TaskInterface // Sealing / Snap @@ -383,8 +385,9 @@ func addSealingTasks( activeTasks = append(activeTasks, scrubUnsealedTask) } + var p2Active sealsupra.P2Active if cfg.Subsystems.EnableBatchSeal { - batchSealTask, sm, err := sealsupra.NewSupraSeal( + batchSealTask, sm, p2a, err := sealsupra.NewSupraSeal( cfg.Seal.BatchSealSectorSize, cfg.Seal.BatchSealBatchSize, cfg.Seal.BatchSealPipelines, @@ -392,9 +395,10 @@ func addSealingTasks( cfg.Seal.LayerNVMEDevices, machineHostPort, db, full, stor, si, slr) if err != nil { - return nil, xerrors.Errorf("setting up batch sealer: %w", err) + return nil, nil, xerrors.Errorf("setting up batch sealer: %w", err) } slotMgr = sm + p2Active = p2a activeTasks = append(activeTasks, batchSealTask) addFinalize = true } @@ -433,7 +437,7 @@ func addSealingTasks( storePieceTask, err := piece2.NewStorePieceTask(db, must.One(slrLazy.Val()), stor, cfg.Subsystems.MoveStorageMaxTasks) if err != nil { - return nil, err + return nil, nil, err } activeTasks = append(activeTasks, moveStorageTask, moveStorageSnapTask, storePieceTask) @@ -454,7 +458,7 @@ func addSealingTasks( } if cfg.Subsystems.EnableUpdateEncode { - encodeTask := snap.NewEncodeTask(slr, db, cfg.Subsystems.UpdateEncodeMaxTasks, cfg.Subsystems.BindEncodeToData) + encodeTask := snap.NewEncodeTask(slr, db, cfg.Subsystems.UpdateEncodeMaxTasks, cfg.Subsystems.BindEncodeToData, cfg.Subsystems.AllowEncodeGPUOverprovision) activeTasks = append(activeTasks, encodeTask) } if cfg.Subsystems.EnableUpdateProve || cfg.Subsystems.EnableRemoteProofs { @@ -499,7 +503,7 @@ func addSealingTasks( activeTasks = append(activeTasks, storageEndpointGcTask, pipelineGcTask, storageGcMarkTask, storageGcSweepTask, sectorMetadataTask) } - return activeTasks, nil + return activeTasks, p2Active, nil } func machineDetails(deps *deps.Deps, activeTasks []harmonytask.TaskInterface, machineID int, machineName string) { diff --git a/deps/config/types.go b/deps/config/types.go index f0fc59e76..b62233eb7 100644 --- a/deps/config/types.go +++ b/deps/config/types.go @@ -354,6 +354,10 @@ type CurioSubsystemsConfig struct { // (Default: false) BindEncodeToData bool + // AllowEncodeGPUOverprovision allows the Encode task to run on regardress of declared GPU usage. (Default: false) + // NOTE: This definitely is not safe on PoSt nodes. + AllowEncodeGPUOverprovision bool + // UpdateProveMaxTasks sets the maximum number of concurrent SnapDeal proving tasks that can run on this instance. (Default: 0 - unlimited) UpdateProveMaxTasks int diff --git a/tasks/piece/task_park_piece.go b/tasks/piece/task_park_piece.go index 9d92e332a..f756f5a3b 100644 --- a/tasks/piece/task_park_piece.go +++ b/tasks/piece/task_park_piece.go @@ -42,17 +42,20 @@ type ParkPieceTask struct { maxInPark int longTerm bool // Indicates if the task is for long-term pieces + + // supraseal special interaction - during phase 2, we don't want to park pieces - gpu not available for hours + p2Active func() bool } -func NewParkPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, max int, maxInPark int) (*ParkPieceTask, error) { - return newPieceTask(db, sc, nil, max, maxInPark, false) +func NewParkPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, max int, maxInPark int, p2Active func() bool) (*ParkPieceTask, error) { + return newPieceTask(db, sc, nil, max, maxInPark, false, p2Active) } func NewStorePieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int) (*ParkPieceTask, error) { - return newPieceTask(db, sc, remote, max, 0, true) + return newPieceTask(db, sc, remote, max, 0, true, nil) } -func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int, maxInPark int, longTerm bool) (*ParkPieceTask, error) { +func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int, maxInPark int, longTerm bool, p2Active func() bool) (*ParkPieceTask, error) { pt := &ParkPieceTask{ db: db, sc: sc, @@ -60,6 +63,7 @@ func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, ma max: max, maxInPark: maxInPark, longTerm: longTerm, + p2Active: p2Active, } ctx := context.Background() @@ -207,6 +211,10 @@ func (p *ParkPieceTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (d } func (p *ParkPieceTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + if p.p2Active != nil && p.p2Active() { + return nil, nil + } + if p.maxInPark <= 0 { id := ids[0] return &id, nil diff --git a/tasks/sealsupra/phase.go b/tasks/sealsupra/phase.go index d2acbe3b9..d71eec772 100644 --- a/tasks/sealsupra/phase.go +++ b/tasks/sealsupra/phase.go @@ -61,3 +61,9 @@ func (p *pipelinePhase) Unlock() { p.phaseLock.Unlock() } + +func (p *pipelinePhase) IsInPhase() func() bool { + return func() bool { + return atomic.LoadInt64(&p.active) > 0 + } +} diff --git a/tasks/sealsupra/task_supraseal.go b/tasks/sealsupra/task_supraseal.go index dc946e157..21533560f 100644 --- a/tasks/sealsupra/task_supraseal.go +++ b/tasks/sealsupra/task_supraseal.go @@ -67,19 +67,21 @@ type SupraSeal struct { slots *slotmgr.SlotMgr } +type P2Active func() bool + func NewSupraSeal(sectorSize string, batchSize, pipelines int, dualHashers bool, nvmeDevices []string, machineHostAndPort string, - db *harmonydb.DB, api SupraSealNodeAPI, storage *paths.Remote, sindex paths.SectorIndex, sc *ffi.SealCalls) (*SupraSeal, *slotmgr.SlotMgr, error) { + db *harmonydb.DB, api SupraSealNodeAPI, storage *paths.Remote, sindex paths.SectorIndex, sc *ffi.SealCalls) (*SupraSeal, *slotmgr.SlotMgr, P2Active, error) { var spt abi.RegisteredSealProof switch sectorSize { case "32GiB": spt = abi.RegisteredSealProof_StackedDrg32GiBV1_1 default: - return nil, nil, xerrors.Errorf("unsupported sector size: %s", sectorSize) + return nil, nil, nil, xerrors.Errorf("unsupported sector size: %s", sectorSize) } ssize, err := spt.SectorSize() if err != nil { - return nil, nil, err + return nil, nil, nil, err } log.Infow("start supraseal init") @@ -90,26 +92,26 @@ func NewSupraSeal(sectorSize string, batchSize, pipelines int, dualHashers bool, var cstr string cstr, nvmeDevices, err = GenerateSupraSealConfigString(dualHashers, batchSize, nvmeDevices) if err != nil { - return nil, nil, xerrors.Errorf("generating supraseal config: %w", err) + return nil, nil, nil, xerrors.Errorf("generating supraseal config: %w", err) } log.Infow("nvme devices", "nvmeDevices", nvmeDevices) if len(nvmeDevices) == 0 { - return nil, nil, xerrors.Errorf("no nvme devices found, run spdk setup.sh") + return nil, nil, nil, xerrors.Errorf("no nvme devices found, run spdk setup.sh") } cfgFile, err := os.CreateTemp("", "supraseal-config-*.cfg") if err != nil { - return nil, nil, xerrors.Errorf("creating temp file: %w", err) + return nil, nil, nil, xerrors.Errorf("creating temp file: %w", err) } if _, err := cfgFile.WriteString(cstr); err != nil { - return nil, nil, xerrors.Errorf("writing temp file: %w", err) + return nil, nil, nil, xerrors.Errorf("writing temp file: %w", err) } configFile = cfgFile.Name() if err := cfgFile.Close(); err != nil { - return nil, nil, xerrors.Errorf("closing temp file: %w", err) + return nil, nil, nil, xerrors.Errorf("closing temp file: %w", err) } log.Infow("generated supraseal config", "config", cstr, "file", configFile) @@ -121,7 +123,7 @@ func NewSupraSeal(sectorSize string, batchSize, pipelines int, dualHashers bool, { hp, err := supraffi.GetHealthInfo() if err != nil { - return nil, nil, xerrors.Errorf("get health page: %w", err) + return nil, nil, nil, xerrors.Errorf("get health page: %w", err) } log.Infow("nvme health page", "hp", hp) @@ -197,7 +199,7 @@ func NewSupraSeal(sectorSize string, batchSize, pipelines int, dualHashers bool, maxPipelines := space / slotSize if maxPipelines < uint64(pipelines) { - return nil, nil, xerrors.Errorf("not enough space for %d pipelines (can do %d), only %d pages available, want %d (slot size %d) pages", pipelines, maxPipelines, space, slotSize*uint64(pipelines), slotSize) + return nil, nil, nil, xerrors.Errorf("not enough space for %d pipelines (can do %d), only %d pages available, want %d (slot size %d) pages", pipelines, maxPipelines, space, slotSize*uint64(pipelines), slotSize) } var slotOffs []uint64 @@ -209,10 +211,10 @@ func NewSupraSeal(sectorSize string, batchSize, pipelines int, dualHashers bool, slots, err := slotmgr.NewSlotMgr(db, machineHostAndPort, slotOffs) if err != nil { - return nil, nil, xerrors.Errorf("creating slot manager: %w", err) + return nil, nil, nil, xerrors.Errorf("creating slot manager: %w", err) } - return &SupraSeal{ + ssl := &SupraSeal{ db: db, api: api, storage: storage, @@ -227,7 +229,9 @@ func NewSupraSeal(sectorSize string, batchSize, pipelines int, dualHashers bool, outSDR: &pipelinePhase{phaseNum: 2}, slots: slots, - }, slots, nil + } + + return ssl, slots, ssl.outSDR.IsInPhase(), nil } func (s *SupraSeal) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { diff --git a/tasks/snap/task_encode.go b/tasks/snap/task_encode.go index 662ca4e77..dbfd72df5 100644 --- a/tasks/snap/task_encode.go +++ b/tasks/snap/task_encode.go @@ -28,17 +28,19 @@ const MinSnapSchedInterval = 10 * time.Second type EncodeTask struct { max int bindToData bool + allowEncodeGPUOverprovision bool sc *ffi.SealCalls db *harmonydb.DB } -func NewEncodeTask(sc *ffi.SealCalls, db *harmonydb.DB, max int, bindToData bool) *EncodeTask { +func NewEncodeTask(sc *ffi.SealCalls, db *harmonydb.DB, max int, bindToData bool, allowEncodeGPUOverprovision bool) *EncodeTask { return &EncodeTask{ max: max, sc: sc, db: db, bindToData: bindToData, + allowEncodeGPUOverprovision: allowEncodeGPUOverprovision, } } @@ -256,7 +258,7 @@ func (e *EncodeTask) TypeDetails() harmonytask.TaskTypeDetails { ssize = abi.SectorSize(2 << 20) } gpu := 1.0 - if seal.IsDevnet { + if seal.IsDevnet || e.allowEncodeGPUOverprovision { gpu = 0 } From 060f89b1e8ee8ddcafb655d7ed4a1570d0c2ea3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 28 Aug 2025 11:13:26 +0200 Subject: [PATCH 24/67] fix commp canaccept --- cmd/curio/tasks/tasks.go | 2 +- tasks/storage-market/task_commp.go | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cmd/curio/tasks/tasks.go b/cmd/curio/tasks/tasks.go index 012975949..e2143f5ed 100644 --- a/cmd/curio/tasks/tasks.go +++ b/cmd/curio/tasks/tasks.go @@ -236,7 +236,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan { // Piece handling if cfg.Subsystems.EnableParkPiece { - parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark, p2Active) + parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark) if err != nil { return nil, err } diff --git a/tasks/storage-market/task_commp.go b/tasks/storage-market/task_commp.go index 51899c2d8..59dd25157 100644 --- a/tasks/storage-market/task_commp.go +++ b/tasks/storage-market/task_commp.go @@ -230,8 +230,6 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task var tasks []struct { TaskID harmonytask.TaskID `db:"commp_task_id"` - SpID int64 `db:"sp_id"` - SectorNumber int64 `db:"sector_number"` StorageID string `db:"storage_id"` Url *string `db:"url"` } @@ -243,7 +241,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task comm, err := c.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { err = tx.Select(&tasks, ` - SELECT commp_task_id, sp_id, sector_number, url FROM market_mk12_deal_pipeline + SELECT commp_task_id, url FROM market_mk12_deal_pipeline WHERE commp_task_id = ANY ($1)`, indIDs) if err != nil { return false, xerrors.Errorf("failed to get deal details from DB: %w", err) @@ -273,12 +271,15 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task if err != nil { return false, xerrors.Errorf("getting pieceID: %w", err) } + if len(pieceID) == 0 { + return false, xerrors.Errorf("no pieceID found for ref %d", refNum) + } var sLocation string err = tx.QueryRow(` SELECT storage_id FROM sector_location - WHERE miner_id = $1 AND sector_num = $2 AND l.sector_filetype = 32`, task.SpID, pieceID[0].PieceID).Scan(&sLocation) + WHERE miner_id = 0 AND sector_num = $1 AND l.sector_filetype = $2`, pieceID[0].PieceID, storiface.FTPiece).Scan(&sLocation) if err != nil { return false, xerrors.Errorf("failed to get storage location from DB: %w", err) From d21e5e43edc0e834aa4cac4bcaf0ad76e43dd470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 28 Aug 2025 11:24:45 +0200 Subject: [PATCH 25/67] fix build --- cmd/curio/tasks/tasks.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/curio/tasks/tasks.go b/cmd/curio/tasks/tasks.go index e2143f5ed..012975949 100644 --- a/cmd/curio/tasks/tasks.go +++ b/cmd/curio/tasks/tasks.go @@ -236,7 +236,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan { // Piece handling if cfg.Subsystems.EnableParkPiece { - parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark) + parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark, p2Active) if err != nil { return nil, err } From 8c75e3bb4964034aae22dae10415f8dbebc42f25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 28 Aug 2025 11:31:32 +0200 Subject: [PATCH 26/67] fix commp canaccept storage query --- tasks/storage-market/task_commp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/storage-market/task_commp.go b/tasks/storage-market/task_commp.go index 59dd25157..6e73454a1 100644 --- a/tasks/storage-market/task_commp.go +++ b/tasks/storage-market/task_commp.go @@ -279,7 +279,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task err = tx.QueryRow(` SELECT storage_id FROM sector_location - WHERE miner_id = 0 AND sector_num = $1 AND l.sector_filetype = $2`, pieceID[0].PieceID, storiface.FTPiece).Scan(&sLocation) + WHERE miner_id = 0 AND sector_num = $1 AND sector_filetype = $2`, pieceID[0].PieceID, storiface.FTPiece).Scan(&sLocation) if err != nil { return false, xerrors.Errorf("failed to get storage location from DB: %w", err) From da5017d0cea388e6c2129d32e15cb11aa00c5c8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 28 Aug 2025 11:42:13 +0200 Subject: [PATCH 27/67] aaaargh --- tasks/storage-market/task_commp.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/storage-market/task_commp.go b/tasks/storage-market/task_commp.go index 6e73454a1..4b7829313 100644 --- a/tasks/storage-market/task_commp.go +++ b/tasks/storage-market/task_commp.go @@ -251,7 +251,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task panic("storiface.FTPiece != 32") } - for _, task := range tasks { + for i, task := range tasks { if task.Url != nil { goUrl, err := url.Parse(*task.Url) if err != nil { @@ -285,7 +285,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task return false, xerrors.Errorf("failed to get storage location from DB: %w", err) } - task.StorageID = sLocation + tasks[i].StorageID = sLocation } } } @@ -312,7 +312,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task } // debug log - log.Infow("commp task can accept", "tasks", tasks, "acceptables", acceptables, "ls", ls, "bindToData", c.bindToData, "ids", ids, "ls", ls) + log.Infow("commp task can accept", "tasks", tasks, "acceptables", acceptables, "ls", ls, "bindToData", c.bindToData, "ids", ids) for _, t := range tasks { if _, ok := acceptables[t.TaskID]; !ok { From 5088cc220a99c8c7a06cbd7f5a88f4cfdcc34d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 28 Aug 2025 13:04:46 +0200 Subject: [PATCH 28/67] prevent dupe piece park task --- tasks/piece/task_cleanup_piece.go | 2 +- tasks/piece/task_park_piece.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/piece/task_cleanup_piece.go b/tasks/piece/task_cleanup_piece.go index 4e112913b..42c421bdb 100644 --- a/tasks/piece/task_cleanup_piece.go +++ b/tasks/piece/task_cleanup_piece.go @@ -59,7 +59,7 @@ func (c *CleanupPieceTask) pollCleanupTasks(ctx context.Context) { // create a task for each piece c.TF.Val(ctx)(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, err error) { // update - n, err := tx.Exec(`UPDATE parked_pieces SET cleanup_task_id = $1 WHERE id = $2 AND (SELECT count(*) FROM parked_piece_refs WHERE piece_id = parked_pieces.id) = 0`, id, pieceID.ID) + n, err := tx.Exec(`UPDATE parked_pieces SET cleanup_task_id = $1 WHERE cleanup_task_id IS NULL AND id = $2 AND (SELECT count(*) FROM parked_piece_refs WHERE piece_id = parked_pieces.id) = 0`, id, pieceID.ID) if err != nil { return false, xerrors.Errorf("updating parked piece: %w", err) } diff --git a/tasks/piece/task_park_piece.go b/tasks/piece/task_park_piece.go index f756f5a3b..0945118c0 100644 --- a/tasks/piece/task_park_piece.go +++ b/tasks/piece/task_park_piece.go @@ -23,7 +23,7 @@ import ( ) var log = logging.Logger("cu-piece") -var PieceParkPollInterval = time.Second +var PieceParkPollInterval = time.Second * 5 const ParkMinFreeStoragePercent = 20 From aa7bef3b2d5bc722a6322058566840ac49ad7233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 28 Aug 2025 16:08:43 +0200 Subject: [PATCH 29/67] expose piecepark min free pct --- cmd/curio/tasks/tasks.go | 2 +- deps/config/types.go | 4 ++++ tasks/piece/task_park_piece.go | 14 +++++++------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/cmd/curio/tasks/tasks.go b/cmd/curio/tasks/tasks.go index 012975949..3b90eaaed 100644 --- a/cmd/curio/tasks/tasks.go +++ b/cmd/curio/tasks/tasks.go @@ -236,7 +236,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan { // Piece handling if cfg.Subsystems.EnableParkPiece { - parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark, p2Active) + parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark, p2Active, cfg.Subsystems.ParkPieceMinFreeStoragePercent) if err != nil { return nil, err } diff --git a/deps/config/types.go b/deps/config/types.go index b62233eb7..ea1f75dbd 100644 --- a/deps/config/types.go +++ b/deps/config/types.go @@ -18,6 +18,7 @@ func DefaultCurioConfig() *CurioConfig { RequireNotificationSuccess: true, IndexingMaxTasks: 8, RemoteProofMaxUploads: 15, + ParkPieceMinFreeStoragePercent: 20, }, Fees: CurioFees{ MaxPreCommitBatchGasFee: BatchFeeConfig{ @@ -235,6 +236,9 @@ type CurioSubsystemsConfig struct { // The maximum number of pieces that should be in storage + active tasks writing to storage on this node (Default: 0 - unlimited) ParkPieceMaxInPark int + // The minimum free storage percentage required for the ParkPiece task to run. (Default: 20) + ParkPieceMinFreeStoragePercent float64 + // EnableSealSDR enables SDR tasks to run. SDR is the long sequential computation // creating 11 layer files in sector cache directory. // diff --git a/tasks/piece/task_park_piece.go b/tasks/piece/task_park_piece.go index 0945118c0..090abccc5 100644 --- a/tasks/piece/task_park_piece.go +++ b/tasks/piece/task_park_piece.go @@ -25,8 +25,6 @@ import ( var log = logging.Logger("cu-piece") var PieceParkPollInterval = time.Second * 5 -const ParkMinFreeStoragePercent = 20 - // ParkPieceTask gets a piece from some origin, and parks it in storage // Pieces are always f00, piece ID is mapped to pieceCID in the DB type ParkPieceTask struct { @@ -37,6 +35,7 @@ type ParkPieceTask struct { TF promise.Promise[harmonytask.AddTaskFunc] max int + minFreeStoragePercent float64 // maxInPark is the maximum number of pieces that should be in storage + active tasks writing to storage on this node maxInPark int @@ -47,15 +46,15 @@ type ParkPieceTask struct { p2Active func() bool } -func NewParkPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, max int, maxInPark int, p2Active func() bool) (*ParkPieceTask, error) { - return newPieceTask(db, sc, nil, max, maxInPark, false, p2Active) +func NewParkPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, max int, maxInPark int, p2Active func() bool, minFreeStoragePercent float64) (*ParkPieceTask, error) { + return newPieceTask(db, sc, nil, max, maxInPark, false, p2Active, minFreeStoragePercent) } func NewStorePieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int) (*ParkPieceTask, error) { - return newPieceTask(db, sc, remote, max, 0, true, nil) + return newPieceTask(db, sc, remote, max, 0, true, nil, 10) } -func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int, maxInPark int, longTerm bool, p2Active func() bool) (*ParkPieceTask, error) { +func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int, maxInPark int, longTerm bool, p2Active func() bool, minFreeStoragePercent float64) (*ParkPieceTask, error) { pt := &ParkPieceTask{ db: db, sc: sc, @@ -64,6 +63,7 @@ func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, ma maxInPark: maxInPark, longTerm: longTerm, p2Active: p2Active, + minFreeStoragePercent: minFreeStoragePercent, } ctx := context.Background() @@ -296,7 +296,7 @@ func (p *ParkPieceTask) TypeDetails() harmonytask.TaskTypeDetails { Cpu: 1, Gpu: 0, Ram: 64 << 20, - Storage: p.sc.Storage(p.taskToRef, storiface.FTPiece, storiface.FTNone, maxSizePiece, storageType, ParkMinFreeStoragePercent), + Storage: p.sc.Storage(p.taskToRef, storiface.FTPiece, storiface.FTNone, maxSizePiece, storageType, p.minFreeStoragePercent), }, MaxFailures: 10, RetryWait: func(retries int) time.Duration { From dd83b6859bc52350c13729166bf2593fc3e7c9c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Sep 2025 19:59:30 +0200 Subject: [PATCH 30/67] Do snap falloc --- lib/ffi/piece_funcs.go | 7 +++++++ lib/ffi/snap_funcs.go | 5 +++++ lib/proof/treed_build.go | 7 +++++++ market/storageingest/deal_ingest_snap.go | 2 +- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/ffi/piece_funcs.go b/lib/ffi/piece_funcs.go index cd8b3ab20..9dcb4e151 100644 --- a/lib/ffi/piece_funcs.go +++ b/lib/ffi/piece_funcs.go @@ -6,6 +6,7 @@ import ( "os" "time" + "github.com/detailyang/go-fallocate" "golang.org/x/xerrors" "github.com/filecoin-project/curio/harmony/harmonytask" @@ -32,6 +33,12 @@ func (sb *SealCalls) WritePiece(ctx context.Context, taskID *harmonytask.TaskID, return xerrors.Errorf("creating temp piece file '%s': %w", tempDest, err) } + // Preallocate the piece file to the expected size + if err := fallocate.Fallocate(destFile, 0, size); err != nil { + _ = destFile.Close() + return xerrors.Errorf("allocating space for piece file: %w", err) + } + removeTemp := true defer func() { if removeTemp { diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index 2cf8f863c..48847ae4a 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -128,6 +128,11 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("getting sealed sector reader: %w", err) } + // Preallocate keyFile to ssize + if err := fallocate.Fallocate(keyFile, 0, int64(ssize)); err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("allocating space for sector key file: %w", err) + } + // copy r into keyFile and close both _, err = keyFile.ReadFrom(r) if err != nil { diff --git a/lib/proof/treed_build.go b/lib/proof/treed_build.go index b5997756c..0ff3cc61b 100644 --- a/lib/proof/treed_build.go +++ b/lib/proof/treed_build.go @@ -8,6 +8,7 @@ import ( "sync" "time" + "github.com/detailyang/go-fallocate" "github.com/hashicorp/go-multierror" "github.com/ipfs/go-cid" pool "github.com/libp2p/go-buffer-pool" @@ -80,6 +81,12 @@ func BuildTreeD(data io.Reader, unpaddedData bool, outPath string, size abi.Padd return cid.Undef, err } + // Fallocate the file + err = fallocate.Fallocate(out, 0, int64(outSize)) + if err != nil { + return cid.Undef, err + } + // setup buffers maxThreads := int64(size) / threadChunkSize if maxThreads > int64(runtime.NumCPU())*15/10 { diff --git a/market/storageingest/deal_ingest_snap.go b/market/storageingest/deal_ingest_snap.go index d271f8a0c..7bdd4cae5 100644 --- a/market/storageingest/deal_ingest_snap.go +++ b/market/storageingest/deal_ingest_snap.go @@ -38,7 +38,7 @@ const MaxEndEpochBufferUnverified = 180 * builtin.EpochsInDay // assuming that snap takes up to 20min to get to submitting the message we want to avoid sectors from deadlines which will // become immutable in the next 20min (40 epochs) // NOTE: Don't set this value to more than one deadline (60 epochs) -var SnapImmutableDeadlineEpochsBuffer = abi.ChainEpoch(40) +var SnapImmutableDeadlineEpochsBuffer = abi.ChainEpoch(59) type PieceIngesterSnap struct { ctx context.Context From 5f4f92dc7e3267b87eeda2d7c4c1134b27c9f868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Sep 2025 22:47:11 +0200 Subject: [PATCH 31/67] Cache storage info in localstorage.Local calls for a bit --- lib/ffi/task_storage.go | 6 +++++- lib/paths/local.go | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/ffi/task_storage.go b/lib/ffi/task_storage.go index db2957c70..2dca7dd27 100644 --- a/lib/ffi/task_storage.go +++ b/lib/ffi/task_storage.go @@ -160,10 +160,14 @@ func (t *TaskStorage) Claim(taskID int) (func() error, error) { }() for _, sectorRef := range sectorRefs { - if err := t.sc.Sectors.sindex.StorageLock(lkctx, sectorRef.ID(), storiface.FTNone, requestedTypes); err != nil { + ok, err := t.sc.Sectors.sindex.StorageTryLock(lkctx, sectorRef.ID(), storiface.FTNone, requestedTypes) + if err != nil { // timer will expire return nil, xerrors.Errorf("claim StorageLock: %w", err) } + if !ok { + return nil, xerrors.Errorf("failed to claim storage lock: %w", err) + } } if !lockAcquireTimer.Stop() { diff --git a/lib/paths/local.go b/lib/paths/local.go index fb6e8ee28..6660bdf1d 100644 --- a/lib/paths/local.go +++ b/lib/paths/local.go @@ -41,6 +41,7 @@ import ( // time abow which a warn log will be emitted for slow PoSt reads var SlowPoStCheckThreshold = 45 * time.Second +var LocalSinfoTTL = 30 * time.Second type LocalStorage interface { GetStorage() (storiface.StorageConfig, error) @@ -112,6 +113,9 @@ type path struct { Reservations map[string]int64 CanSeal bool + + lastSinfoTime time.Time + lastSinfo *storiface.StorageInfo } // statExistingSectorForReservation is optional parameter for stat method @@ -839,9 +843,17 @@ func (st *Local) Local(ctx context.Context) ([]storiface.StoragePath, error) { continue } - si, err := st.index.StorageInfo(ctx, id) - if err != nil { - return nil, xerrors.Errorf("get storage info for %s: %w", id, err) + var si storiface.StorageInfo + if p.lastSinfo == nil || time.Now().Sub(p.lastSinfoTime) > LocalSinfoTTL { + var err error + si, err = st.index.StorageInfo(ctx, id) + if err != nil { + return nil, xerrors.Errorf("get storage info for %s: %w", id, err) + } + p.lastSinfoTime = time.Now() + p.lastSinfo = &si + } else { + si = *p.lastSinfo } out = append(out, storiface.StoragePath{ From f4bfeb08b63011699d34614d3b750dc260bd334c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Sep 2025 22:56:21 +0200 Subject: [PATCH 32/67] MoveStorage / UpgradeStore param tweaks --- lib/paths/remote.go | 2 +- tasks/snap/task_movestorage.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/paths/remote.go b/lib/paths/remote.go index 38c4e919c..f4b340a48 100644 --- a/lib/paths/remote.go +++ b/lib/paths/remote.go @@ -28,7 +28,7 @@ import ( var FetchTempSubdir = "fetching" -var CopyBuf = 1 << 20 +var CopyBuf = 2 << 20 // LocalReaderTimeout is the timeout for keeping local reader files open without // any read activity. diff --git a/tasks/snap/task_movestorage.go b/tasks/snap/task_movestorage.go index b1a7d60eb..e7e5f9595 100644 --- a/tasks/snap/task_movestorage.go +++ b/tasks/snap/task_movestorage.go @@ -112,7 +112,7 @@ func (m *MoveStorageTask) TypeDetails() harmonytask.TaskTypeDetails { Name: "UpdateStore", Cost: resources.Resources{ Cpu: cpu, - Ram: 512 << 20, + Ram: 128 << 20, Storage: m.sc.Storage(m.taskToSector, storiface.FTNone, storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTUnsealed, ssize, storiface.PathStorage, paths.MinFreeStoragePercentage), }, MaxFailures: 3, From 2f3ff2e940d83a985a6317d9326d3b714f759348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Sep 2025 23:28:20 +0200 Subject: [PATCH 33/67] snap key no read --- lib/dealdata/dealdata.go | 3 +++ lib/ffi/snap_funcs.go | 45 +++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib/dealdata/dealdata.go b/lib/dealdata/dealdata.go index 02eeaa696..6d6f691d8 100644 --- a/lib/dealdata/dealdata.go +++ b/lib/dealdata/dealdata.go @@ -186,6 +186,9 @@ func getDealMetadata(ctx context.Context, db *harmonydb.DB, sc *ffi.SealCalls, s if err != nil { return nil, xerrors.Errorf("parsing data headers: %w", err) } + if hdrs == nil { + hdrs = http.Header{} + } if goUrl.Scheme == "pieceref" { // url is to a piece reference diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index 48847ae4a..ffaa9b532 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -121,35 +121,13 @@ func (sb *SealCalls) EncodeUpdate( } }() - log.Debugw("get key data", "keyPath", keyPath, "keyCachePath", keyCachePath, "sectorID", sector.ID, "taskID", taskID) - - r, err := sb.Sectors.storage.ReaderSeq(ctx, sector, storiface.FTSealed) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("getting sealed sector reader: %w", err) - } + log.Debugw("get key cache", "keyPath", keyPath, "keyCachePath", keyCachePath, "sectorID", sector.ID, "taskID", taskID) // Preallocate keyFile to ssize if err := fallocate.Fallocate(keyFile, 0, int64(ssize)); err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("allocating space for sector key file: %w", err) } - // copy r into keyFile and close both - _, err = keyFile.ReadFrom(r) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("copying sealed data: %w", err) - } - - _ = r.Close() - if err := keyFile.Close(); err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("closing sealed data file: %w", err) - } - keyFile = nil - - keyFile, err = os.OpenFile(keyPath, os.O_RDONLY, 0644) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("opening key file: %w", err) - } - // fetch cache var buf bytes.Buffer // usually 73.2 MiB err = sb.Sectors.storage.ReadMinCacheInto(ctx, sector, storiface.FTCache, &buf) @@ -214,6 +192,16 @@ func (sb *SealCalls) EncodeUpdate( } // STEP 1: SupraEncode + + sectorKeyReader, err := sb.Sectors.storage.ReaderSeq(ctx, sector, storiface.FTSealed) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("getting sealed sector reader: %w", err) + } + + // copy r into keyFile + // note: teeReader means that we avoid re-reading the sector key, saving I/O bandwidth + var keyRederForEncode io.Reader = io.TeeReader(sectorKeyReader, keyFile) + encodeStart := time.Now() treeDFile, err := os.Open(treeDPath) if err != nil { @@ -221,12 +209,21 @@ func (sb *SealCalls) EncodeUpdate( } defer treeDFile.Close() - err = cunative.EncodeSnap(sector.ProofType, commD, sectorKeyCid, keyFile, treeDFile, updateFile) + err = cunative.EncodeSnap(sector.ProofType, commD, sectorKeyCid, keyRederForEncode, treeDFile, updateFile) // (close early) // here we don't care about the error, as treeDFile was read-only _ = treeDFile.Close() + { + _ = sectorKeyReader.Close() + if err := keyFile.Close(); err != nil { + _ = updateFile.Close(); + return cid.Undef, cid.Undef, xerrors.Errorf("closing sealed data file: %w", err) + } + keyFile = nil + } + // (close early) if cerr := updateFile.Close(); cerr != nil { return cid.Undef, cid.Undef, xerrors.Errorf("close update file: %w", cerr) From db586b20f20f5e4f1a6bf0bb8e7633582270b553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 4 Sep 2025 21:18:11 +0200 Subject: [PATCH 34/67] snap: Parallel movestorage --- tasks/snap/task_movestorage.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tasks/snap/task_movestorage.go b/tasks/snap/task_movestorage.go index e7e5f9595..5797a84db 100644 --- a/tasks/snap/task_movestorage.go +++ b/tasks/snap/task_movestorage.go @@ -3,7 +3,6 @@ package snap import ( "context" "fmt" - "math/rand/v2" "golang.org/x/xerrors" @@ -133,7 +132,7 @@ func (m *MoveStorageTask) schedule(ctx context.Context, taskFunc harmonytask.Add SectorNumber int64 `db:"sector_number"` } - err := tx.Select(&tasks, `SELECT sp_id, sector_number FROM sectors_snap_pipeline WHERE after_encode = TRUE AND after_prove = TRUE AND after_move_storage = FALSE AND task_id_move_storage IS NULL`) + err := tx.Select(&tasks, `SELECT sp_id, sector_number FROM sectors_snap_pipeline WHERE after_encode = TRUE AND after_move_storage = FALSE AND task_id_move_storage IS NULL ORDER BY start_time ASC LIMIT 1`) if err != nil { return false, xerrors.Errorf("getting tasks: %w", err) } @@ -142,10 +141,9 @@ func (m *MoveStorageTask) schedule(ctx context.Context, taskFunc harmonytask.Add return false, nil } - // pick at random in case there are a bunch of schedules across the cluster - t := tasks[rand.N(len(tasks))] + t := tasks[0] - _, err = tx.Exec(`UPDATE sectors_snap_pipeline SET task_id_move_storage = $1 WHERE sp_id = $2 AND sector_number = $3`, id, t.SpID, t.SectorNumber) + _, err = tx.Exec(`UPDATE sectors_snap_pipeline SET task_id_move_storage = $1 WHERE sp_id = $2 AND sector_number = $3 AND after_encode = TRUE AND after_move_storage = FALSE AND task_id_move_storage IS NULL`, id, t.SpID, t.SectorNumber) if err != nil { return false, xerrors.Errorf("updating task id: %w", err) } From e2a0cbb2f0b0f20ba6ad2fa14fb8759234cfb028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 4 Sep 2025 23:25:04 +0200 Subject: [PATCH 35/67] snap mertics, ui fix --- lib/ffi/snap_funcs.go | 58 ++++++++++++++++++++++++++++++++++++++- web/api/webrpc/upgrade.go | 22 +++++++++------ 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index ffaa9b532..ee2e78d8d 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -67,6 +67,57 @@ func (sb *SealCalls) EncodeUpdate( return cid.Cid{}, cid.Cid{}, xerrors.Errorf("mkdir update cache: %w", err) } + // metrics: track active encode phases + currentPhase := "" + enterPhase := func(next string) { + // decrement previous phase counter + switch currentPhase { + case "start": + encActiveStart.Add(-1) + case "tree_d": + encActiveTreeD.Add(-1) + case "encode": + encActiveEncode.Add(-1) + case "tree_r": + encActiveTreeR.Add(-1) + case "tail": + encActiveTail.Add(-1) + } + + // increment next phase counter + switch next { + case "start": + encActiveStart.Add(1) + case "tree_d": + encActiveTreeD.Add(1) + case "encode": + encActiveEncode.Add(1) + case "tree_r": + encActiveTreeR.Add(1) + case "tail": + encActiveTail.Add(1) + } + currentPhase = next + } + defer func() { + // ensure final decrement on return + switch currentPhase { + case "start": + encActiveStart.Add(-1) + case "tree_d": + encActiveTreeD.Add(-1) + case "encode": + encActiveEncode.Add(-1) + case "tree_r": + encActiveTreeR.Add(-1) + case "tail": + encActiveTail.Add(-1) + } + }() + + // begin in start phase + enterPhase("start") + //////////////////// // Prepare sector key //////////////////// @@ -155,6 +206,7 @@ func (sb *SealCalls) EncodeUpdate( treeDPath := filepath.Join(paths.UpdateCache, proofpaths.TreeDName) // STEP 0: TreeD + enterPhase("tree_d") treeDStart := time.Now() treeCommD, err := proof.BuildTreeD(data, true, treeDPath, abi.PaddedPieceSize(ssize)) if err != nil { @@ -171,6 +223,8 @@ func (sb *SealCalls) EncodeUpdate( // Allocate update file //////////////////// + enterPhase("encode") + var updateFile *os.File { allocUpdateStart := time.Now() @@ -218,7 +272,7 @@ func (sb *SealCalls) EncodeUpdate( { _ = sectorKeyReader.Close() if err := keyFile.Close(); err != nil { - _ = updateFile.Close(); + _ = updateFile.Close() return cid.Undef, cid.Undef, xerrors.Errorf("closing sealed data file: %w", err) } keyFile = nil @@ -236,6 +290,7 @@ func (sb *SealCalls) EncodeUpdate( log.Infow("encode snap", "took", time.Since(encodeStart), "sectorID", sector.ID, "taskID", taskID) // STEP 2: SupraTreeR + enterPhase("tree_r") treeRStart := time.Now() @@ -248,6 +303,7 @@ func (sb *SealCalls) EncodeUpdate( log.Infow("tree r file", "took", time.Since(treeRStart), "sectorID", sector.ID, "taskID", taskID) // STEP 2.5: Read PAux-es, transplant CC CommC, write back, calculate CommR + enterPhase("tail") commRStart := time.Now() _, updateCommRLast, err := proof.ReadPAux(paths.UpdateCache) if err != nil { diff --git a/web/api/webrpc/upgrade.go b/web/api/webrpc/upgrade.go index 37b11cdc1..9933d9196 100644 --- a/web/api/webrpc/upgrade.go +++ b/web/api/webrpc/upgrade.go @@ -8,6 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/samber/lo" "github.com/filecoin-project/curio/tasks/snap" ) @@ -65,7 +66,12 @@ func (a *WebRPC) UpgradeSectors(ctx context.Context) ([]*UpgradeSector, error) { for _, mt := range smt { if mt.SpID == int64(s.SpID) && mt.SectorNumber == int64(s.SectorNum) { - s.MissingTasks = mt.MissingTaskIDs + s.MissingTasks = lo.FilterMap(mt.MissingTaskIDs, func(id *int64, _ int) (int64, bool) { + if id == nil { + return 0, false + } + return *id, true + }) s.AllTasks = mt.AllTaskIDs break } @@ -91,13 +97,13 @@ func (a *WebRPC) UpgradeDelete(ctx context.Context, spid, sectorNum uint64) erro } type SnapMissingTask struct { - SpID int64 `db:"sp_id"` - SectorNumber int64 `db:"sector_number"` - AllTaskIDs []int64 `db:"all_task_ids"` - MissingTaskIDs []int64 `db:"missing_task_ids"` - TotalTasks int `db:"total_tasks"` - MissingTasksCount int `db:"missing_tasks_count"` - RestartStatus string `db:"restart_status"` + SpID int64 `db:"sp_id"` + SectorNumber int64 `db:"sector_number"` + AllTaskIDs []int64 `db:"all_task_ids"` + MissingTaskIDs []*int64 `db:"missing_task_ids"` + TotalTasks int `db:"total_tasks"` + MissingTasksCount int `db:"missing_tasks_count"` + RestartStatus string `db:"restart_status"` } func (smt SnapMissingTask) sectorID() abi.SectorID { From 816b4d24ff1cf3e769edd1e451e671b277e4cbad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 4 Sep 2025 23:28:45 +0200 Subject: [PATCH 36/67] missing snap metrics --- lib/ffi/metrics.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 lib/ffi/metrics.go diff --git a/lib/ffi/metrics.go b/lib/ffi/metrics.go new file mode 100644 index 000000000..e825417a6 --- /dev/null +++ b/lib/ffi/metrics.go @@ -0,0 +1,51 @@ +package ffi + +import ( + "context" + "sync/atomic" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +var ( + phaseKey, _ = tag.NewKey("phase") + pre = "cuffi_" +) + +var ( + encActiveStart atomic.Int64 + encActiveTreeD atomic.Int64 + encActiveEncode atomic.Int64 + encActiveTreeR atomic.Int64 + encActiveTail atomic.Int64 +) + +var Measures = struct { + encActivePhase *stats.Int64Measure +} { + encActivePhase: stats.Int64(pre+"snap_enc_active", "Number of tasks in each phase", stats.UnitDimensionless), +} + +func init() { + err := view.Register( + &view.View{Measure: Measures.encActivePhase, Aggregation: view.LastValue(), TagKeys: []tag.Key{phaseKey}}, + ) + if err != nil { + panic(err) + } + + go func() { + for { + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{tag.Upsert(phaseKey, "start")}, Measures.encActivePhase.M(encActiveStart.Load())) + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{tag.Upsert(phaseKey, "tree_d")}, Measures.encActivePhase.M(encActiveTreeD.Load())) + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{tag.Upsert(phaseKey, "encode")}, Measures.encActivePhase.M(encActiveEncode.Load())) + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{tag.Upsert(phaseKey, "tree_r")}, Measures.encActivePhase.M(encActiveTreeR.Load())) + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{tag.Upsert(phaseKey, "tail")}, Measures.encActivePhase.M(encActiveTail.Load())) + + time.Sleep(5 * time.Second) + } + }() +} \ No newline at end of file From 05bae8dff171ccba2235678993e1a5a5083d1b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 7 Sep 2025 23:30:57 +0200 Subject: [PATCH 37/67] fix snap batch backoff --- lib/curiochain/epoch.go | 2 +- tasks/snap/task_submit.go | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/curiochain/epoch.go b/lib/curiochain/epoch.go index 8e4d1e89d..08f389328 100644 --- a/lib/curiochain/epoch.go +++ b/lib/curiochain/epoch.go @@ -10,7 +10,7 @@ import ( ) func EpochTime(curr *types.TipSet, e abi.ChainEpoch) time.Time { - diff := int64(buildconstants.BlockDelaySecs) * int64(curr.Height()-e) + diff := int64(buildconstants.BlockDelaySecs) * int64(e-curr.Height()) curTs := curr.MinTimestamp() // unix seconds return time.Unix(int64(curTs)+diff, 0) diff --git a/tasks/snap/task_submit.go b/tasks/snap/task_submit.go index 67e7c21e8..8aefe957f 100644 --- a/tasks/snap/task_submit.go +++ b/tasks/snap/task_submit.go @@ -153,7 +153,8 @@ func (s *SubmitTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done } if len(tasks) == 0 { - return false, xerrors.Errorf("expected at least 1 sector params, got 0") + log.Errorw("expected at least 1 sector params, got 0 in submit task") + return true, nil } maddr, err := address.NewIDAddress(uint64(tasks[0].SpID)) @@ -359,6 +360,10 @@ func (s *SubmitTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done params.SectorProofs = append(params.SectorProofs, update.Proof) } + if len(params.SectorUpdates) == 0 { + return false, xerrors.Errorf("no sector updates") + } + enc := new(bytes.Buffer) if err := params.MarshalCBOR(enc); err != nil { return false, xerrors.Errorf("could not serialize commit params: %w", err) @@ -662,8 +667,9 @@ func (s *SubmitTask) schedule(ctx context.Context, addTaskFunc harmonytask.AddTa //---------------------------------- // 6) Actually schedule: set task_id_submit=taskID for chosen rows //---------------------------------- + var scheduled int for _, row := range toSchedule { - _, err = tx.Exec(` + n, err := tx.Exec(` UPDATE sectors_snap_pipeline SET task_id_submit = $1, submit_after = NULL @@ -674,10 +680,11 @@ func (s *SubmitTask) schedule(ctx context.Context, addTaskFunc harmonytask.AddTa if err != nil { return false, xerrors.Errorf("failed to set task_id_submit: %w", err) } + scheduled += n } // We scheduled this group => commit & exit the transaction callback - return true, nil + return scheduled > 0, nil } } From 1af38c35655486d667aebbebda4f5460d785e773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 8 Sep 2025 10:40:58 +0200 Subject: [PATCH 38/67] somewhat handle snap msg fails on immutable deadline --- tasks/snap/task_submit.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tasks/snap/task_submit.go b/tasks/snap/task_submit.go index 8aefe957f..d0357075e 100644 --- a/tasks/snap/task_submit.go +++ b/tasks/snap/task_submit.go @@ -755,8 +755,11 @@ func (s *SubmitTask) updateLanded(ctx context.Context, tx *harmonydb.Tx, spId, s // good, noop case exitcode.SysErrInsufficientFunds, exitcode.ErrInsufficientFunds: fallthrough - case exitcode.SysErrOutOfGas: + case exitcode.SysErrOutOfGas, exitcode.ErrIllegalArgument: // just retry + + // illegal argument typically stems from immutable deadline + // err message like 'message failed with backtrace: 00: f0123 (method 35) -- invalid update 0 while requiring activation success: cannot upgrade sectors in immutable deadline 27, skipping sector 6123 (16) (RetCode=16)' n, err := tx.Exec(`UPDATE sectors_snap_pipeline SET after_prove_msg_success = FALSE, after_submit = FALSE WHERE sp_id = $2 AND sector_number = $3 AND after_prove_msg_success = FALSE AND after_submit = TRUE`, From c21052f3bffb6f3e7e159f7c5da67fd988249968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 8 Sep 2025 11:09:58 +0200 Subject: [PATCH 39/67] fix snap retry query params --- tasks/snap/task_submit.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tasks/snap/task_submit.go b/tasks/snap/task_submit.go index d0357075e..4586b6376 100644 --- a/tasks/snap/task_submit.go +++ b/tasks/snap/task_submit.go @@ -762,8 +762,7 @@ func (s *SubmitTask) updateLanded(ctx context.Context, tx *harmonydb.Tx, spId, s // err message like 'message failed with backtrace: 00: f0123 (method 35) -- invalid update 0 while requiring activation success: cannot upgrade sectors in immutable deadline 27, skipping sector 6123 (16) (RetCode=16)' n, err := tx.Exec(`UPDATE sectors_snap_pipeline SET after_prove_msg_success = FALSE, after_submit = FALSE - WHERE sp_id = $2 AND sector_number = $3 AND after_prove_msg_success = FALSE AND after_submit = TRUE`, - execResult[0].ExecutedTskCID, spId, sectorNum) + WHERE sp_id = $1 AND sector_number = $2 AND after_prove_msg_success = FALSE AND after_submit = TRUE`, spId, sectorNum) if err != nil { return xerrors.Errorf("update sectors_snap_pipeline to retry prove send: %w", err) } From 169b01fec2c823f8ac376a21a02ce5451815a24f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 8 Sep 2025 11:55:21 +0200 Subject: [PATCH 40/67] storage: Copy over snap vproof --- lib/tarutil/systar.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/tarutil/systar.go b/lib/tarutil/systar.go index c4b6d0ea0..eac98daf8 100644 --- a/lib/tarutil/systar.go +++ b/lib/tarutil/systar.go @@ -73,6 +73,8 @@ var CacheFileConstraints = map[string]int64{ "sc-02-data-tree-c-15.dat": 5 << 30, "sc-02-data-tree-d.dat": 130 << 30, // 2x sector size, ~130G accunting for small buffer on 64G sectors + + "snap-vproof.json": 20_000_000, } var FinCacheFileConstraints = map[string]int64{ @@ -98,6 +100,8 @@ var FinCacheFileConstraints = map[string]int64{ "sc-02-data-tree-r-last-13.dat": 10_000_000, "sc-02-data-tree-r-last-14.dat": 10_000_000, "sc-02-data-tree-r-last-15.dat": 10_000_000, + + "snap-vproof.json": 20_000_000, } func ExtractTar(constraints map[string]int64, body io.Reader, dir string, buf []byte) (int64, error) { From bc7486df87037ec915f48ad59a141e3c94be337c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 11 Sep 2025 20:59:47 +0200 Subject: [PATCH 41/67] treeR file deadline --- lib/ffi/snap_funcs.go | 7 ++++++- lib/ffiselect/ffiselect.go | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index ee2e78d8d..dde14861f 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -30,6 +30,8 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/commitment" ) +var TreeRTimeout = 20 * time.Minute + func (sb *SealCalls) EncodeUpdate( ctx context.Context, sectorKeyCid cid.Cid, @@ -295,7 +297,10 @@ func (sb *SealCalls) EncodeUpdate( treeRStart := time.Now() ctx = ffiselect.WithLogCtx(ctx, "sector", sector.ID, "task", taskID, "update", paths.Update, "treeD", treeDPath, "updateCache", paths.UpdateCache, "sectorSize", ssize) - err = ffiselect.FFISelect.TreeRFile(ctx, paths.Update, treeDPath, paths.UpdateCache, uint64(ssize)) + treeCtx, cancel := context.WithTimeout(ctx, TreeRTimeout) + defer cancel() + + err = ffiselect.FFISelect.TreeRFile(treeCtx, paths.Update, treeDPath, paths.UpdateCache, uint64(ssize)) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("tree r file %s: %w", paths.Update, err) } diff --git a/lib/ffiselect/ffiselect.go b/lib/ffiselect/ffiselect.go index e1521fbcc..58b951eba 100644 --- a/lib/ffiselect/ffiselect.go +++ b/lib/ffiselect/ffiselect.go @@ -87,7 +87,7 @@ func call(ctx context.Context, body []byte) (io.ReadCloser, error) { } commandAry := []string{"ffi"} - cmd := exec.Command(p, commandAry...) + cmd := exec.CommandContext(ctx, p, commandAry...) // Set Visible Devices for CUDA and OpenCL cmd.Env = append(os.Environ(), @@ -118,7 +118,7 @@ func call(ctx context.Context, body []byte) (io.ReadCloser, error) { lw := NewLogWriter(ctx.Value(logCtxKey).([]any), os.Stderr) cmd.Stderr = lw - cmd.Stdout = os.Stdout + cmd.Stdout = lw outFile, err := os.CreateTemp("", "out") if err != nil { return nil, err From 8c73ff5fc9ee8f490b1304aba11d02aa071bd744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 11 Sep 2025 21:31:52 +0200 Subject: [PATCH 42/67] slower retry movestorage --- tasks/seal/task_movestorage.go | 6 +++++- tasks/snap/task_movestorage.go | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tasks/seal/task_movestorage.go b/tasks/seal/task_movestorage.go index 5f3e57e93..05e4272fc 100644 --- a/tasks/seal/task_movestorage.go +++ b/tasks/seal/task_movestorage.go @@ -3,6 +3,7 @@ package seal import ( "context" "fmt" + "time" "golang.org/x/xerrors" @@ -171,7 +172,10 @@ func (m *MoveStorageTask) TypeDetails() harmonytask.TaskTypeDetails { Ram: 128 << 20, Storage: m.sc.Storage(m.taskToSector, storiface.FTNone, storiface.FTCache|storiface.FTSealed|storiface.FTUnsealed, ssize, storiface.PathStorage, paths.MinFreeStoragePercentage), }, - MaxFailures: 10, + MaxFailures: 6, + RetryWait: func(retries int) time.Duration { + return time.Duration(2< Date: Thu, 11 Sep 2025 23:12:57 +0200 Subject: [PATCH 43/67] ipni: Handle orphan tasks --- tasks/indexing/task_ipni.go | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tasks/indexing/task_ipni.go b/tasks/indexing/task_ipni.go index 30878edea..3dff04011 100644 --- a/tasks/indexing/task_ipni.go +++ b/tasks/indexing/task_ipni.go @@ -94,6 +94,10 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b return false, xerrors.Errorf("getting ipni task params: %w", err) } + if len(tasks) == 0 { + // orphans are normal actually + return false, nil + } if len(tasks) != 1 { return false, xerrors.Errorf("expected 1 ipni task params, got %d", len(tasks)) } @@ -272,7 +276,7 @@ func (I *IPNITask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskE TaskID harmonytask.TaskID `db:"task_id"` SpID int64 `db:"sp_id"` SectorNumber int64 `db:"sector"` - StorageID string `db:"storage_id"` + StorageID *string `db:"storage_id"` } if storiface.FTUnsealed != 1 { @@ -288,8 +292,8 @@ func (I *IPNITask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskE err := I.db.Select(ctx, &tasks, ` SELECT dp.task_id, dp.sp_id, dp.sector, l.storage_id FROM ipni_task dp - INNER JOIN sector_location l ON dp.sp_id = l.miner_id AND dp.sector = l.sector_num - WHERE dp.task_id = ANY ($1) AND l.sector_filetype = 1 + LEFT JOIN sector_location l ON dp.sp_id = l.miner_id AND dp.sector = l.sector_num + WHERE dp.task_id = ANY ($1) AND (l.sector_filetype IS NULL OR l.sector_filetype = 1) `, indIDs) if err != nil { return nil, xerrors.Errorf("getting tasks: %w", err) @@ -310,14 +314,29 @@ func (I *IPNITask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskE if _, ok := acceptables[t.TaskID]; !ok { continue } + acceptables[t.TaskID] = false // note the task was found + + if t.StorageID == nil { + // no unsealed copy + return &t.TaskID, nil + } for _, l := range ls { - if string(l.ID) == t.StorageID { + if string(l.ID) == *t.StorageID { return &t.TaskID, nil } } } + // special case for orphan tasks which are created for non-announced pieces + for taskID, notAccepted := range acceptables { + if !notAccepted { + continue + } + + return &taskID, nil + } + return nil, nil } From d7f5d8d570d9f0158fae9da9e1f3519c911f4936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 11 Sep 2025 23:18:33 +0200 Subject: [PATCH 44/67] ipni: Accept orphans --- tasks/indexing/task_ipni.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/indexing/task_ipni.go b/tasks/indexing/task_ipni.go index 3dff04011..02bc8f110 100644 --- a/tasks/indexing/task_ipni.go +++ b/tasks/indexing/task_ipni.go @@ -96,7 +96,7 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b if len(tasks) == 0 { // orphans are normal actually - return false, nil + return true, nil } if len(tasks) != 1 { return false, xerrors.Errorf("expected 1 ipni task params, got %d", len(tasks)) From be9f1b625b5fe3b22bb7fe83eeccd6265b62ba90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 12 Sep 2025 12:16:38 +0200 Subject: [PATCH 45/67] f05 bmgr --- tasks/balancemgr/handlers_f05.go | 182 ++++++++++++++++++++ tasks/balancemgr/task_balancemgr.go | 8 +- web/api/webrpc/balance_manager.go | 3 + web/static/pages/wallet/balance-manager.mjs | 13 +- 4 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 tasks/balancemgr/handlers_f05.go diff --git a/tasks/balancemgr/handlers_f05.go b/tasks/balancemgr/handlers_f05.go new file mode 100644 index 000000000..e74dc9116 --- /dev/null +++ b/tasks/balancemgr/handlers_f05.go @@ -0,0 +1,182 @@ +package balancemgr + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/lotus/chain/actors/builtin/market" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/types" +) + +func (b *BalanceMgrTask) adderF05(ctx context.Context, taskFunc harmonytask.AddTaskFunc, addr *balanceManagerAddress) error { + marketBalance, err := b.chain.StateMarketBalance(ctx, addr.SubjectAddress, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("getting market balance: %w", err) + } + + sourceBalance, err := b.chain.StateGetActor(ctx, addr.SubjectAddress, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("getting source balance: %w", err) + } + + addr.SubjectBalance = big.Sub(marketBalance.Escrow, marketBalance.Locked) + addr.SecondBalance = sourceBalance.Balance + + var shouldCreateTask bool + switch addr.ActionType { + case "requester": + shouldCreateTask = addr.SubjectBalance.LessThan(addr.LowWatermarkFilBalance) + } + + if shouldCreateTask { + taskFunc(func(taskID harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + // check that address.ID has active_task_id = null, set the task ID, set last_ to null + n, err := tx.Exec(` + UPDATE balance_manager_addresses + SET active_task_id = $1, last_msg_cid = NULL, last_msg_sent_at = NULL, last_msg_landed_at = NULL + WHERE id = $2 AND active_task_id IS NULL AND (last_msg_cid IS NULL OR last_msg_landed_at IS NOT NULL) + `, taskID, addr.ID) + if err != nil { + return false, xerrors.Errorf("updating balance manager address: %w", err) + } + + return n > 0, nil + }) + } + return nil +} + +func (b *BalanceMgrTask) doF05(ctx context.Context, taskID harmonytask.TaskID, addr *balanceManagerAddress) (bool, error) { + log.Infow("balancemgr f05 Do", + "id", addr.ID, + "subject", addr.SubjectAddress, + "low", types.FIL(addr.LowWatermarkFilBalance), + "high", types.FIL(addr.HighWatermarkFilBalance)) + + marketBalance, err := b.chain.StateMarketBalance(ctx, addr.SubjectAddress, types.EmptyTSK) + if err != nil { + return false, xerrors.Errorf("getting market balance: %w", err) + } + + sourceBalance, err := b.chain.StateGetActor(ctx, addr.SubjectAddress, types.EmptyTSK) + if err != nil { + return false, xerrors.Errorf("getting source balance: %w", err) + } + + idAddr, err := b.chain.StateLookupID(ctx, addr.SubjectAddress, types.EmptyTSK) + if err != nil { + return false, xerrors.Errorf("getting address ID: %w", err) + } + + addrID, err := address.IDFromAddress(idAddr) + if err != nil { + return false, xerrors.Errorf("getting address ID: %w", err) + } + + addr.SubjectBalance = big.Sub(marketBalance.Escrow, marketBalance.Locked) + addr.SecondBalance = types.BigInt(sourceBalance.Balance) + + // calculate amount to send (based on latest chain balance) + var amount types.BigInt + var to address.Address + var shouldSend bool + + if addr.ActionType != "requester" { + return false, xerrors.Errorf("action type is not requester: %s", addr.ActionType) + } + + if addr.SubjectBalance.LessThan(addr.LowWatermarkFilBalance) { + amount = types.BigSub(addr.HighWatermarkFilBalance, addr.SubjectBalance) + to = addr.SubjectAddress + shouldSend = true + } + + if !shouldSend { + log.Infow("balance within watermarks, no action needed", + "subject", addr.SubjectAddress, + "balance", types.FIL(addr.SubjectBalance), + "low", types.FIL(addr.LowWatermarkFilBalance), + "high", types.FIL(addr.HighWatermarkFilBalance)) + + _, err = b.db.Exec(ctx, ` + UPDATE balance_manager_addresses + SET active_task_id = NULL, last_action = NOW() + WHERE id = $1 + `, addr.ID) + if err != nil { + return false, xerrors.Errorf("clearing task id: %w", err) + } + return true, nil + } + + params, err := actors.SerializeParams(&addr.SubjectAddress) + if err != nil { + return false, xerrors.Errorf("failed to serialize miner address: %w", err) + } + + maxfee, err := types.ParseFIL("0.05 FIL") + if err != nil { + return false, xerrors.Errorf("failed to parse max fee: %w", err) + } + + msp := &api.MessageSendSpec{ + MaxFee: abi.TokenAmount(maxfee), + } + + msg := &types.Message{ + To: market.Address, + From: addr.SecondAddress, + Value: amount, + Method: market.Methods.AddBalance, + Params: params, + } + + msgCid, err := b.sender.Send(ctx, msg, msp, "add-market-collateral") + if err != nil { + return false, xerrors.Errorf("failed to send message: %w", err) + } + + _, err = b.db.Exec(ctx, `INSERT INTO message_waits (signed_message_cid) VALUES ($1)`, msgCid) + if err != nil { + return false, xerrors.Errorf("inserting into message_waits: %w", err) + } + + _, err = b.db.Exec(ctx, ` + UPDATE balance_manager_addresses + SET last_msg_cid = $2, + last_msg_sent_at = NOW(), + last_msg_landed_at = NULL, + active_task_id = NULL + WHERE id = $1 + `, addr.ID, msgCid.String()) + if err != nil { + return false, xerrors.Errorf("updating message cid: %w", err) + } + + _, err = b.db.Exec(ctx, ` + INSERT INTO proofshare_client_messages (signed_cid, wallet, action) + VALUES ($1, $2, $3) + `, msgCid, addrID, "deposit-bmgr") + if err != nil { + return false, xerrors.Errorf("addMessageTracking: failed to insert proofshare_client_messages: %w", err) + } + + log.Infow("sent balance management message", + "from", addr.SecondAddress, + "to", to, + "subjectType", "proofshare", + "amount", types.FIL(amount), + "msgCid", msgCid, + "actionType", addr.ActionType) + + return true, nil +} diff --git a/tasks/balancemgr/task_balancemgr.go b/tasks/balancemgr/task_balancemgr.go index 55c734220..d80bac26d 100644 --- a/tasks/balancemgr/task_balancemgr.go +++ b/tasks/balancemgr/task_balancemgr.go @@ -126,6 +126,8 @@ func NewBalanceMgrTask(db *harmonydb.DB, chain api.FullNode, pcs *chainsched.Cur err = t.adderWallet(ctx, taskFunc, addr) case "proofshare": err = t.adderProofshare(ctx, taskFunc, addr) + case "f05": + err = t.adderF05(ctx, taskFunc, addr) default: log.Warnw("unknown subject type", "type", addr.SubjectType) continue @@ -163,8 +165,8 @@ func (b *BalanceMgrTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask return nil, xerrors.Errorf("getting subject type: %w", err) } - if subjectType == "wallet" || - subjectType == "proofshare" { + switch subjectType { + case "wallet", "proofshare", "f05": return &id, nil } } @@ -232,6 +234,8 @@ func (b *BalanceMgrTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) ( return b.doWallet(ctx, taskID, addr) case "proofshare": return b.doProofshare(ctx, taskID, addr) + case "f05": + return b.doF05(ctx, taskID, addr) default: return false, xerrors.Errorf("unknown subject type: %s", addr.SubjectType) } diff --git a/web/api/webrpc/balance_manager.go b/web/api/webrpc/balance_manager.go index 15f9b8dee..15d445aef 100644 --- a/web/api/webrpc/balance_manager.go +++ b/web/api/webrpc/balance_manager.go @@ -128,6 +128,7 @@ func (a *WebRPC) BalanceMgrRuleAdd(ctx context.Context, subject, second, actionT switch actionType { case "requester": case "active-provider": + case "f05": default: return xerrors.Errorf("invalid action type: %s", actionType) } @@ -141,6 +142,8 @@ func (a *WebRPC) BalanceMgrRuleAdd(ctx context.Context, subject, second, actionT // For proofshare, subject == second and action is always requester actionType = "requester" second = subject + case "f05": + actionType = "requester" default: return xerrors.Errorf("invalid subject type: %s", subjectType) } diff --git a/web/static/pages/wallet/balance-manager.mjs b/web/static/pages/wallet/balance-manager.mjs index f630d73c9..33cb45fe4 100644 --- a/web/static/pages/wallet/balance-manager.mjs +++ b/web/static/pages/wallet/balance-manager.mjs @@ -92,6 +92,16 @@ class BalanceManager extends LitElement { this.newHigh = ''; } + startAddF05() { + this.adding = true; + this.newSubjectType = 'f05'; + this.newSubject = ''; + this.newSecond = ''; + this.newAction = 'requester'; + this.newLow = ''; + this.newHigh = ''; + } + cancelAdd() { this.adding = false; } @@ -149,6 +159,7 @@ class BalanceManager extends LitElement {

Balance-Manager Rules

+ ${this.adding ? html`
@@ -157,7 +168,7 @@ class BalanceManager extends LitElement { (this.newSubject = e.target.value)} />
- ${this.newSubjectType === 'wallet' ? html` + ${(this.newSubjectType === 'wallet' || this.newSubjectType === 'f05') ? html`
(this.newSecond = e.target.value)} /> From 0e5a4b04f9817cda1e043a17f5361cc8fe29244d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 12 Sep 2025 12:31:23 +0200 Subject: [PATCH 46/67] f05 bmgr fixes --- tasks/balancemgr/handlers_f05.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tasks/balancemgr/handlers_f05.go b/tasks/balancemgr/handlers_f05.go index e74dc9116..0f8a67afa 100644 --- a/tasks/balancemgr/handlers_f05.go +++ b/tasks/balancemgr/handlers_f05.go @@ -140,7 +140,7 @@ func (b *BalanceMgrTask) doF05(ctx context.Context, taskID harmonytask.TaskID, a Params: params, } - msgCid, err := b.sender.Send(ctx, msg, msp, "add-market-collateral") + msgCid, err := b.sender.Send(ctx, msg, msp, "balancemgr-f05") if err != nil { return false, xerrors.Errorf("failed to send message: %w", err) } @@ -162,18 +162,10 @@ func (b *BalanceMgrTask) doF05(ctx context.Context, taskID harmonytask.TaskID, a return false, xerrors.Errorf("updating message cid: %w", err) } - _, err = b.db.Exec(ctx, ` - INSERT INTO proofshare_client_messages (signed_cid, wallet, action) - VALUES ($1, $2, $3) - `, msgCid, addrID, "deposit-bmgr") - if err != nil { - return false, xerrors.Errorf("addMessageTracking: failed to insert proofshare_client_messages: %w", err) - } - log.Infow("sent balance management message", "from", addr.SecondAddress, "to", to, - "subjectType", "proofshare", + "subjectType", "f05", "amount", types.FIL(amount), "msgCid", msgCid, "actionType", addr.ActionType) From bf300cb93e52ff0e6be671b5a2b6f95980b14c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Sep 2025 09:45:29 +0200 Subject: [PATCH 47/67] fix f05 bm build --- tasks/balancemgr/handlers_f05.go | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/tasks/balancemgr/handlers_f05.go b/tasks/balancemgr/handlers_f05.go index 0f8a67afa..9b2721579 100644 --- a/tasks/balancemgr/handlers_f05.go +++ b/tasks/balancemgr/handlers_f05.go @@ -71,17 +71,7 @@ func (b *BalanceMgrTask) doF05(ctx context.Context, taskID harmonytask.TaskID, a if err != nil { return false, xerrors.Errorf("getting source balance: %w", err) } - - idAddr, err := b.chain.StateLookupID(ctx, addr.SubjectAddress, types.EmptyTSK) - if err != nil { - return false, xerrors.Errorf("getting address ID: %w", err) - } - - addrID, err := address.IDFromAddress(idAddr) - if err != nil { - return false, xerrors.Errorf("getting address ID: %w", err) - } - + addr.SubjectBalance = big.Sub(marketBalance.Escrow, marketBalance.Locked) addr.SecondBalance = types.BigInt(sourceBalance.Balance) From 6f52344e2dad1e6bd774b1e1f372dbfbf82c9553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Sep 2025 15:18:18 +0200 Subject: [PATCH 48/67] make gen --- cmd/curio/internal/translations/catalog.go | 656 +++++++++--------- deps/config/doc_gen.go | 19 + deps/config/types.go | 10 +- .../default-curio-configuration.md | 16 + lib/ffi/metrics.go | 16 +- tasks/balancemgr/handlers_f05.go | 9 +- tasks/piece/task_park_piece.go | 16 +- tasks/snap/task_encode.go | 12 +- tasks/storage-market/task_commp.go | 6 +- web/api/webrpc/upgrade.go | 2 +- 10 files changed, 400 insertions(+), 362 deletions(-) diff --git a/cmd/curio/internal/translations/catalog.go b/cmd/curio/internal/translations/catalog.go index a63b62910..dac8df728 100644 --- a/cmd/curio/internal/translations/catalog.go +++ b/cmd/curio/internal/translations/catalog.go @@ -47,16 +47,16 @@ var messageKeyToIndex = map[string]int{ "(for init) use path for sealing": 143, "--machine flag in cli command should point to the node where storage to redeclare is attached": 155, "1278 (3.5 years)": 127, - "2 KiB": 242, - "32 GiB": 240, - "64 GiB": 239, - "8 MiB": 241, + "2 KiB": 243, + "32 GiB": 241, + "64 GiB": 240, + "8 MiB": 242, "": 97, - "Aborting migration.": 193, - "Aborting remaining steps.": 190, + "Aborting migration.": 194, + "Aborting remaining steps.": 191, "Accept a proposed service actor": 71, "Add URL to fetch data for offline deals": 98, - "Additional info is at http://docs.curiostorage.org": 198, + "Additional info is at http://docs.curiostorage.org": 199, "Address to listen for the GUI on": 120, "Amount in FIL": 41, "Amount to deposit (FIL)": 60, @@ -66,136 +66,136 @@ var messageKeyToIndex = map[string]int{ "CSV file location to use for multiple deal input. Each line in the file should be in the format 'uuid,raw size,url,header1,header2...'": 99, "Cancel a pending client withdrawal request": 46, "Cancel a pending service withdrawal request": 58, - "Cannot reach the DB: %s": 247, - "Cannot read the config.toml file in the provided directory, Error: %s": 221, - "Check data integrity in unsealed sector files": 176, + "Cannot reach the DB: %s": 248, + "Cannot read the config.toml file in the provided directory, Error: %s": 222, + "Check data integrity in unsealed sector files": 177, "Client actor": 49, "Client actor address": 62, "Client sender address": 43, "Collection of debugging utilities": 165, "Command separated list of hostnames for yugabyte cluster": 84, - "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.": 283, + "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.": 284, "Complete a pending client withdrawal after the withdrawal window elapses": 45, "Complete a pending service withdrawal after the withdrawal window elapses": 57, "Compute WindowPoSt for performance and configuration testing.": 161, "Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.": 157, - "Configuration 'base' was created to resemble this lotus-miner's config.toml .": 284, - "Configuration 'base' was updated to include this miner's address": 259, - "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.": 282, - "Connected to Yugabyte": 215, - "Connected to Yugabyte. Schema is current.": 214, - "Continue to connect and update schema.": 274, - "Continue to verify the addresses and create a new miner actor.": 232, + "Configuration 'base' was created to resemble this lotus-miner's config.toml .": 285, + "Configuration 'base' was updated to include this miner's address": 260, + "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.": 283, + "Connected to Yugabyte": 216, + "Connected to Yugabyte. Schema is current.": 215, + "Continue to connect and update schema.": 275, + "Continue to verify the addresses and create a new miner actor.": 233, "Cordon a machine, set it to maintenance mode": 36, - "Could not create repo from directory: %s. Aborting migration": 222, - "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration": 223, - "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number": 177, + "Could not create repo from directory: %s. Aborting migration": 223, + "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration": 224, + "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number": 178, "Create a client voucher": 66, - "Create a new miner": 188, + "Create a new miner": 189, "Create a new offline verified DDO deal for Curio": 105, "Create a provider voucher": 68, "Create new configuration for a new cluster": 34, - "Ctrl+C pressed in Terminal": 185, + "Ctrl+C pressed in Terminal": 186, "Cumulative amount (FIL)": 50, "Custom `HEADER` to include in the HTTP request": 100, - "Database config error occurred, abandoning migration: %s ": 275, - "Database: %s": 273, + "Database config error occurred, abandoning migration: %s ": 276, + "Database: %s": 274, "Deposit FIL into the Router contract (client)": 39, "Deposit funds into the service pool (service role)": 59, - "Documentation: ": 208, - "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.": 184, + "Documentation: ": 209, + "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.": 185, "Enable load balancing for connecting to the Postgres database in Yugabyte cluster": 90, - "Enter %s address": 237, - "Enter the Yugabyte database %s": 278, - "Enter the Yugabyte database host(s)": 276, - "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)": 268, - "Enter the info to create a new miner": 227, - "Enter the owner address": 234, - "Enter the path to the configuration directory used by %s": 219, - "Error connecting to Yugabyte database: %s": 280, - "Error connecting to full node API: %s": 248, - "Error getting API: %s": 201, - "Error getting token: %s": 203, - "Error saving config to layer: %s. Aborting Migration": 207, - "Error writing file: %s": 194, + "Enter %s address": 238, + "Enter the Yugabyte database %s": 279, + "Enter the Yugabyte database host(s)": 277, + "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)": 269, + "Enter the info to create a new miner": 228, + "Enter the owner address": 235, + "Enter the path to the configuration directory used by %s": 220, + "Error connecting to Yugabyte database: %s": 281, + "Error connecting to full node API: %s": 249, + "Error getting API: %s": 202, + "Error getting token: %s": 204, + "Error saving config to layer: %s. Aborting Migration": 208, + "Error writing file: %s": 195, "Execute cli commands": 6, - "Failed to create auth token: %s": 254, - "Failed to create the miner actor: %s": 245, - "Failed to generate default config: %s": 255, - "Failed to generate random bytes for secret: %s": 250, - "Failed to get API info for FullNode: %s": 253, - "Failed to insert 'base' config layer in database: %s": 263, - "Failed to insert config into database: %s": 256, - "Failed to load base config from database: %s": 260, - "Failed to parse base config: %s": 261, - "Failed to parse sector size: %s": 244, - "Failed to parse the address: %s": 236, - "Failed to regenerate base config: %s": 262, + "Failed to create auth token: %s": 255, + "Failed to create the miner actor: %s": 246, + "Failed to generate default config: %s": 256, + "Failed to generate random bytes for secret: %s": 251, + "Failed to get API info for FullNode: %s": 254, + "Failed to insert 'base' config layer in database: %s": 264, + "Failed to insert config into database: %s": 257, + "Failed to load base config from database: %s": 261, + "Failed to parse base config: %s": 262, + "Failed to parse sector size: %s": 245, + "Failed to parse the address: %s": 237, + "Failed to regenerate base config: %s": 263, "Fetch proving parameters": 92, - "Filecoin %s channels: %s and %s": 211, + "Filecoin %s channels: %s and %s": 212, "Filecoin decentralized storage network provider": 81, - "Filter by storage provider ID": 172, + "Filter by storage provider ID": 173, "Filter events by actor address; lists all if not specified": 132, "Filter events by sector number; requires --actor to be specified": 133, - "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.": 196, + "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.": 197, "Generate a supra_seal configuration": 3, "Generate a supra_seal configuration for a given batch size.\n\nThis command outputs a configuration expected by SupraSeal. Main purpose of this command is for debugging and testing.\nThe config can be used directly with SupraSeal binaries to test it without involving Curio.": 4, "Get Curio node info": 74, "Get a config layer by name. You may want to pipe the output to a file, or use 'less'": 19, - "Get information about unsealed data": 170, - "Host: %s": 269, + "Get information about unsealed data": 171, + "Host: %s": 270, "How long to commit sectors for": 126, - "I want to:": 186, + "I want to:": 187, "Ignore sectors that cannot be migrated": 130, - "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'": 212, - "Initializing a new miner actor.": 226, + "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'": 213, + "Initializing a new miner actor.": 227, "Initiate a withdrawal request from the client's deposit": 42, "Initiate a withdrawal request from the service pool": 56, "Interpret stacked config layers by this version of curio, with system-generated comments.": 23, - "Layer %s created. ": 285, + "Layer %s created. ": 286, "Limit output to the last N events": 134, "List config layers present in the DB.": 21, - "List data from the sectors_unseal_pipeline and sectors_meta tables": 171, + "List data from the sectors_unseal_pipeline and sectors_meta tables": 172, "List log systems": 76, "List pipeline events": 131, - "Lotus-Miner to Curio Migration.": 191, + "Lotus-Miner to Curio Migration.": 192, "Manage logging": 75, "Manage node config by layers. The layer 'base' will always be applied at Curio start-up.": 13, "Manage the sealing pipeline": 121, - "Manage unsealed data": 169, + "Manage unsealed data": 170, "Math Utils": 0, - "Migrate from existing Lotus-Miner": 187, - "Migrating lotus-miner config.toml to Curio in-database configuration.": 200, - "Migrating metadata for %d sectors.": 281, - "Miner %s created successfully": 246, - "Miner creation error occurred: %s ": 233, + "Migrate from existing Lotus-Miner": 188, + "Migrating lotus-miner config.toml to Curio in-database configuration.": 201, + "Migrating metadata for %d sectors.": 282, + "Miner %s created successfully": 247, + "Miner creation error occurred: %s ": 234, "Moves funds from the deal collateral wallet into escrow with the storage market actor": 102, "Name of the Postgres database in Yugabyte cluster": 85, - "New Miner initialization complete.": 199, + "New Miner initialization complete.": 200, "New service actor address": 70, - "No address provided": 235, - "No host provided": 277, - "No path provided, abandoning migration ": 220, - "No value provided": 279, - "No, abort": 206, - "Non-SP cluster configuration complete": 258, - "Non-SP cluster configuration created successfully": 257, - "Non-SP cluster setup complete!": 264, + "No address provided": 236, + "No host provided": 278, + "No path provided, abandoning migration ": 221, + "No value provided": 280, + "No, abort": 207, + "Non-SP cluster configuration complete": 259, + "Non-SP cluster configuration created successfully": 258, + "Non-SP cluster setup complete!": 265, "Note: This command is intended to be used to verify PoSt compute performance.\nIt will not send any messages to the chain. Since it can compute any deadline, output may be incorrectly timed for the chain.": 162, "Number of sectors to start": 125, - "One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 213, - "Other": 218, - "Output file path (default: stdout)": 173, - "Owner Wallet: %s": 228, + "One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 214, + "Other": 219, + "Output file path (default: stdout)": 174, + "Owner Wallet: %s": 229, "Password for connecting to the Postgres database in Yugabyte cluster": 87, - "Password: %s": 272, + "Password: %s": 273, "Path to miner repo": 129, - "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster %s' to finish the configuration": 251, - "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration": 252, + "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster %s' to finish the configuration": 252, + "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration": 253, "Port for connecting to the Cassandra database in Yugabyte cluster": 89, "Port for connecting to the Postgres database in Yugabyte cluster": 88, - "Port: %s": 270, - "Pre-initialization steps complete": 249, + "Port: %s": 271, + "Pre-initialization steps complete": 250, "Print default node config": 14, "Propose a new service actor": 69, "Provider actor": 55, @@ -205,26 +205,26 @@ var messageKeyToIndex = map[string]int{ "Query the service state": 65, "Query the state of a client": 61, "Query the state of a provider": 63, - "Read Miner Config": 224, + "Read Miner Config": 225, "Redeem a client voucher (service role)": 47, "Redeem a provider voucher (provider role)": 53, "Remove a named config layer.": 22, "Remove unsealed copies of sector containing this deal": 107, "SP ID to compute WindowPoSt for": 160, - "Sector Size: %s": 231, - "Sector selection failed: %s ": 243, + "Sector Size: %s": 232, + "Sector selection failed: %s ": 244, "Sectors can be stored across many filesystem paths. These\ncommands provide ways to manage the storage a Curio node will use to store sectors\nlong term for proving (references as 'store') as well as how sectors will be\nstored while moving through the sealing pipeline (references as 'seal').": 137, - "Select the Sector Size": 238, - "Select the location of your lotus-miner config directory?": 217, - "Sender Wallet: %s": 230, + "Select the Sector Size": 239, + "Select the location of your lotus-miner config directory?": 218, + "Sender Wallet: %s": 231, "Sender address": 40, "Service sender address": 48, "Set a config layer or the base by providing a filename or stdin.": 16, "Set log level": 77, "Set the log level for logging systems:\n\n The system flag can be specified multiple times.\n\n eg) log set-level --system chain --system chainxchg debug\n\n Available Levels:\n debug\n info\n warn\n error\n\n Environment Variables:\n GOLOG_LOG_LEVEL - Default log level for all log systems\n GOLOG_LOG_FMT - Change output log format (json, nocolor)\n GOLOG_FILE - Write logs to file\n GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr\n": 79, - "Set the target unseal state for a sector": 174, - "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.\n": 175, - "Setup non-Storage Provider cluster": 189, + "Set the target unseal state for a sector": 175, + "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.\n": 176, + "Setup non-Storage Provider cluster": 190, "Specify actor address for the deal": 106, "Specify actor address to start sealing sectors for": 95, "Specify wallet address to send the funds from": 104, @@ -234,44 +234,45 @@ var messageKeyToIndex = map[string]int{ "Start new sealing operations manually": 122, "Start sealing new CC sectors": 124, "Start sealing sectors for all actors now (not on schedule)": 123, - "Step Complete: %s\n": 225, + "Step Complete: %s\n": 226, "Stop a running Curio process": 135, "Storage can be attached to a Curio node using this command. The storage volume\nlist is stored local to the Curio node in storage.json set in curio run. We do not\nrecommend manually modifying this value without further understanding of the\nstorage system.\n\nEach storage volume contains a configuration file which describes the\ncapabilities of the volume. When the '--init' flag is provided, this file will\nbe created using the additional flags.\n\nWeight\nA high weight value means data will be more likely to be stored in this path\n\nSeal\nData for the sealing process will be stored here\n\nStore\nFinalized sectors that will be moved here for long term storage and be proven\nover time\n ": 140, + "Supra consensus testing utilities": 166, "Test the windowpost scheduler by running it on the next available curio. If tasks fail all retries, you will need to ctrl+c to exit.": 158, - "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.": 209, - "This interactive tool creates a new miner actor and creates the basic configuration layer for it.": 179, - "This interactive tool migrates lotus-miner to Curio in 5 minutes.": 183, - "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.": 181, - "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.": 180, - "This setup does not create or migrate a Filecoin SP actor.": 182, - "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):": 287, - "To start the cluster, run: curio run --layers basic-cluster": 267, - "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.": 216, - "To work with the config: ": 286, - "Tool Box for Curio": 166, - "Try the web interface with %s ": 195, + "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.": 210, + "This interactive tool creates a new miner actor and creates the basic configuration layer for it.": 180, + "This interactive tool migrates lotus-miner to Curio in 5 minutes.": 184, + "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.": 182, + "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.": 181, + "This setup does not create or migrate a Filecoin SP actor.": 183, + "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):": 288, + "To start the cluster, run: curio run --layers basic-cluster": 268, + "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.": 217, + "To work with the config: ": 287, + "Tool Box for Curio": 167, + "Try the web interface with %s ": 196, "Uncordon a machine, resume scheduling": 37, - "Unmigratable sectors found. Do you want to continue?": 204, - "Update data for messages in wait queue": 168, - "Updated DB with message data missing from chain node": 167, + "Unmigratable sectors found. Do you want to continue?": 205, + "Update data for messages in wait queue": 169, + "Updated DB with message data missing from chain node": 168, "Use synthetic PoRep": 96, - "Use the arrow keys to navigate: ↓ ↑ → ← ": 178, + "Use the arrow keys to navigate: ↓ ↑ → ← ": 179, "Username for connecting to the Postgres database in Yugabyte cluster": 86, - "Username: %s": 271, + "Username: %s": 272, "Utility functions for testing": 156, "Validate a client voucher signature": 72, "Validate a provider voucher signature": 73, "Voucher nonce": 51, "Voucher signature (hex)": 52, "Wait for Curio api to come online": 8, - "Where should we save your database config file?": 192, + "Where should we save your database config file?": 193, "Withdrawal amount (in FIL)": 44, - "Worker Wallet: %s": 229, - "Yes, continue": 205, - "You can add other layers for per-machine configuration changes.": 210, - "You can now migrate your market node (%s), if applicable.": 197, - "You can now start using Curio for protocols like PDP, Snark markets, and others.": 266, - "Your non-SP cluster has been configured successfully.": 265, + "Worker Wallet: %s": 230, + "Yes, continue": 206, + "You can add other layers for per-machine configuration changes.": 211, + "You can now migrate your market node (%s), if applicable.": 198, + "You can now start using Curio for protocols like PDP, Snark markets, and others.": 267, + "Your non-SP cluster has been configured successfully.": 266, "Zen3 and later supports two sectors per thread, set to false for older CPUs": 5, "[SP actor address...]": 35, "[deadline index]": 163, @@ -286,7 +287,7 @@ var messageKeyToIndex = map[string]int{ "allow overwrite of existing layer if source is a different layer": 30, "attach local storage path": 138, "comma or space separated list of layers to be interpreted (base is always applied)": 25, - "could not get API info for FullNode: %w": 202, + "could not get API info for FullNode: %w": 203, "custom node name": 117, "deadline to compute WindowPoSt for ": 159, "depends on output being a TTY": 83, @@ -330,7 +331,7 @@ var messageKeyToIndex = map[string]int{ "use color in display output": 82, } -var enIndex = []uint32{ // 289 elements +var enIndex = []uint32{ // 290 elements // Entry 0 - 1F 0x00000000, 0x0000000b, 0x00000042, 0x00000126, 0x0000014a, 0x0000025a, 0x000002a6, 0x000002bb, @@ -378,45 +379,45 @@ var enIndex = []uint32{ // 289 elements 0x00001ebb, 0x00001ed9, 0x00001f4d, 0x00001fd2, // Entry A0 - BF 0x00001ffa, 0x0000201a, 0x00002058, 0x00002124, - 0x00002135, 0x00002159, 0x0000217b, 0x0000218e, - 0x000021c3, 0x000021ea, 0x000021ff, 0x00002223, - 0x00002266, 0x00002284, 0x000022a7, 0x000022d0, - 0x00002656, 0x00002684, 0x0000272c, 0x00002761, - 0x000027c3, 0x00002886, 0x000028f5, 0x00002930, - 0x00002972, 0x000029cb, 0x000029e6, 0x000029f1, - 0x00002a13, 0x00002a26, 0x00002a49, 0x00002a63, + 0x00002135, 0x00002159, 0x0000217b, 0x0000219d, + 0x000021b0, 0x000021e5, 0x0000220c, 0x00002221, + 0x00002245, 0x00002288, 0x000022a6, 0x000022c9, + 0x000022f2, 0x00002678, 0x000026a6, 0x0000274e, + 0x00002783, 0x000027e5, 0x000028a8, 0x00002917, + 0x00002952, 0x00002994, 0x000029ed, 0x00002a08, + 0x00002a13, 0x00002a35, 0x00002a48, 0x00002a6b, // Entry C0 - DF - 0x00002a83, 0x00002ab3, 0x00002ac7, 0x00002ae1, - 0x00002b07, 0x00002b7e, 0x00002bbb, 0x00002bee, - 0x00002c11, 0x00002c57, 0x00002c70, 0x00002c9b, - 0x00002cb6, 0x00002ceb, 0x00002cf9, 0x00002d03, - 0x00002d3b, 0x00002d4f, 0x00002dba, 0x00002dfa, - 0x00002e23, 0x00002e9a, 0x00002eeb, 0x00002f15, - 0x00002f2b, 0x00002f78, 0x00002fb2, 0x00002fb8, - 0x00002ff4, 0x00003020, 0x00003069, 0x000030a9, + 0x00002a85, 0x00002aa5, 0x00002ad5, 0x00002ae9, + 0x00002b03, 0x00002b29, 0x00002ba0, 0x00002bdd, + 0x00002c10, 0x00002c33, 0x00002c79, 0x00002c92, + 0x00002cbd, 0x00002cd8, 0x00002d0d, 0x00002d1b, + 0x00002d25, 0x00002d5d, 0x00002d71, 0x00002ddc, + 0x00002e1c, 0x00002e45, 0x00002ebc, 0x00002f0d, + 0x00002f37, 0x00002f4d, 0x00002f9a, 0x00002fd4, + 0x00002fda, 0x00003016, 0x00003042, 0x0000308b, // Entry E0 - FF - 0x000030fa, 0x0000310c, 0x00003126, 0x00003146, - 0x0000316b, 0x0000317f, 0x00003194, 0x000031a9, - 0x000031bc, 0x000031fb, 0x00003225, 0x0000323d, - 0x00003251, 0x00003274, 0x00003288, 0x0000329f, - 0x000032a6, 0x000032ad, 0x000032b3, 0x000032b9, - 0x000032dd, 0x00003300, 0x00003328, 0x00003349, - 0x00003364, 0x0000338d, 0x000033af, 0x000033e1, - 0x00003478, 0x000034ee, 0x00003519, 0x0000353c, + 0x000030cb, 0x0000311c, 0x0000312e, 0x00003148, + 0x00003168, 0x0000318d, 0x000031a1, 0x000031b6, + 0x000031cb, 0x000031de, 0x0000321d, 0x00003247, + 0x0000325f, 0x00003273, 0x00003296, 0x000032aa, + 0x000032c1, 0x000032c8, 0x000032cf, 0x000032d5, + 0x000032db, 0x000032ff, 0x00003322, 0x0000334a, + 0x0000336b, 0x00003386, 0x000033af, 0x000033d1, + 0x00003403, 0x0000349a, 0x00003510, 0x0000353b, // Entry 100 - 11F - 0x00003565, 0x00003592, 0x000035c4, 0x000035ea, - 0x0000362b, 0x0000365b, 0x0000367e, 0x000036a6, - 0x000036de, 0x000036fd, 0x00003733, 0x00003784, - 0x000037c0, 0x00003822, 0x0000382e, 0x0000383a, - 0x0000384a, 0x0000385a, 0x0000386a, 0x00003891, - 0x000038d2, 0x000038f6, 0x00003907, 0x00003929, - 0x0000393b, 0x00003968, 0x0000398e, 0x000039ed, - 0x00003a8a, 0x00003ad8, 0x00003af2, 0x00003b10, + 0x0000355e, 0x00003587, 0x000035b4, 0x000035e6, + 0x0000360c, 0x0000364d, 0x0000367d, 0x000036a0, + 0x000036c8, 0x00003700, 0x0000371f, 0x00003755, + 0x000037a6, 0x000037e2, 0x00003844, 0x00003850, + 0x0000385c, 0x0000386c, 0x0000387c, 0x0000388c, + 0x000038b3, 0x000038f4, 0x00003918, 0x00003929, + 0x0000394b, 0x0000395d, 0x0000398a, 0x000039b0, + 0x00003a0f, 0x00003aac, 0x00003afa, 0x00003b14, // Entry 120 - 13F - 0x00003b70, -} // Size: 1180 bytes + 0x00003b32, 0x00003b92, +} // Size: 1184 bytes -const enData string = "" + // Size: 15216 bytes +const enData string = "" + // Size: 15250 bytes "\x02Math Utils\x02Analyze and display the layout of batch sealer threads" + "\x02Analyze and display the layout of batch sealer threads on your CPU." + "\x0a\x0aIt provides detailed information about CPU utilization for batch" + @@ -545,109 +546,110 @@ const enData string = "" + // Size: 15216 bytes "ded to be used to verify PoSt compute performance.\x0aIt will not send a" + "ny messages to the chain. Since it can compute any deadline, output may " + "be incorrectly timed for the chain.\x02[deadline index]\x02partition to " + - "compute WindowPoSt for\x02Collection of debugging utilities\x02Tool Box " + - "for Curio\x02Updated DB with message data missing from chain node\x02Upd" + - "ate data for messages in wait queue\x02Manage unsealed data\x02Get infor" + - "mation about unsealed data\x02List data from the sectors_unseal_pipeline" + - " and sectors_meta tables\x02Filter by storage provider ID\x02Output file" + - " path (default: stdout)\x02Set the target unseal state for a sector\x04" + - "\x00\x01\x0a\x80\x07\x02Set the target unseal state for a specific secto" + - "r.\x0a : The storage provider ID\x0a : The " + - "sector number\x0a : The target state (true, false, or no" + - "ne)\x0a\x0a The unseal target state indicates to curio how an unsealed" + - " copy of the sector should be maintained.\x0a\x09 If the target state " + - "is true, curio will ensure that the sector is unsealed.\x0a\x09 If the" + - " target state is false, curio will ensure that there is no unsealed copy" + - " of the sector.\x0a\x09 If the target state is none, curio will not ch" + - "ange the current state of the sector.\x0a\x0a Currently when the curio" + - " will only start new unseal processes when the target state changes from" + - " another state to true.\x0a\x0a When the target state is false, and an" + - " unsealed sector file exists, the GC mark step will create a removal mar" + - "k\x0a for the unsealed sector file. The file will only be removed afte" + - "r the removal mark is accepted.\x02Check data integrity in unsealed sect" + - "or files\x02Create a check task for a specific sector, wait for its comp" + - "letion, and output the result.\x0a : The storage provider ID" + - "\x0a : The sector number\x04\x00\x01 0\x02Use the arrow" + - " keys to navigate: ↓ ↑ → ←\x02This interactive tool creates a new miner " + - "actor and creates the basic configuration layer for it.\x02This process " + - "is partially idempotent. Once a new miner actor has been created and sub" + - "sequent steps fail, the user need to run 'curio config new-cluster < min" + - "er ID >' to finish the configuration.\x02This interactive tool sets up a" + - " non-Storage Provider cluster for protocols like PDP, Snark market, and " + - "others.\x02This setup does not create or migrate a Filecoin SP actor." + - "\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.\x02Ctrl+C pressed in Terminal\x02I want to:\x02Migr" + - "ate from existing Lotus-Miner\x02Create a new miner\x02Setup non-Storage" + - " Provider cluster\x02Aborting remaining steps.\x02Lotus-Miner to Curio M" + - "igration.\x02Where should we save your database config file?\x02Aborting" + - " migration.\x02Error writing file: %[1]s\x04\x00\x01 !\x02Try the web in" + - "terface with %[1]s\x02For more servers, make /etc/curio.env with the cur" + - "io.env database env and add the CURIO_LAYERS env to assign purposes.\x02" + - "You can now migrate your market node (%[1]s), if applicable.\x02Addition" + - "al info is at http://docs.curiostorage.org\x02New Miner initialization c" + - "omplete.\x02Migrating lotus-miner config.toml to Curio in-database confi" + - "guration.\x02Error getting API: %[1]s\x02could not get API info for Full" + - "Node: %[1]w\x02Error getting token: %[1]s\x02Unmigratable sectors found." + - " Do you want to continue?\x02Yes, continue\x02No, abort\x02Error saving " + - "config to layer: %[1]s. Aborting Migration\x04\x00\x01 \x0f\x02Documenta" + - "tion:\x02The '%[1]s' layer stores common configuration. All curio instan" + - "ces can include it in their %[2]s argument.\x02You can add other layers " + - "for per-machine configuration changes.\x02Filecoin %[1]s channels: %[2]s" + - " and %[3]s\x02Increase reliability using redundancy: start multiple mach" + - "ines with at-least the post layer: 'curio run --layers=post'\x02One data" + - "base can serve multiple miner IDs: Run a migration for each lotus-miner." + - "\x02Connected to Yugabyte. Schema is current.\x02Connected to Yugabyte" + - "\x02To start, ensure your sealing pipeline is drained and shut-down lotu" + - "s-miner.\x02Select the location of your lotus-miner config directory?" + - "\x02Other\x02Enter the path to the configuration directory used by %[1]s" + - "\x04\x00\x01 '\x02No path provided, abandoning migration\x02Cannot read " + - "the config.toml file in the provided directory, Error: %[1]s\x02Could no" + - "t create repo from directory: %[1]s. Aborting migration\x02Could not loc" + - "k miner repo. Your miner must be stopped: %[1]s\x0a Aborting migration" + - "\x02Read Miner Config\x04\x00\x01\x0a\x15\x02Step Complete: %[1]s\x02Ini" + - "tializing a new miner actor.\x02Enter the info to create a new miner\x02" + - "Owner Wallet: %[1]s\x02Worker Wallet: %[1]s\x02Sender Wallet: %[1]s\x02S" + - "ector Size: %[1]s\x02Continue to verify the addresses and create a new m" + - "iner actor.\x04\x00\x01 %\x02Miner creation error occurred: %[1]s\x02Ent" + - "er the owner address\x02No address provided\x02Failed to parse the addre" + - "ss: %[1]s\x02Enter %[1]s address\x02Select the Sector Size\x0264 GiB\x02" + - "32 GiB\x028 MiB\x022 KiB\x04\x00\x01 \x1f\x02Sector selection failed: %[" + - "1]s\x02Failed to parse sector size: %[1]s\x02Failed to create the miner " + - "actor: %[1]s\x02Miner %[1]s created successfully\x02Cannot reach the DB:" + - " %[1]s\x02Error connecting to full node API: %[1]s\x02Pre-initialization" + - " steps complete\x02Failed to generate random bytes for secret: %[1]s\x02" + - "Please do not run guided-setup again as miner creation is not idempotent" + - ". You need to run 'curio config new-cluster %[1]s' to finish the configu" + - "ration\x02Please do not run guided-setup again. You need to run 'curio c" + - "onfig new-cluster' manually to finish the configuration\x02Failed to get" + - " API info for FullNode: %[1]s\x02Failed to create auth token: %[1]s\x02F" + - "ailed to generate default config: %[1]s\x02Failed to insert config into " + - "database: %[1]s\x02Non-SP cluster configuration created successfully\x02" + - "Non-SP cluster configuration complete\x02Configuration 'base' was update" + - "d to include this miner's address\x02Failed to load base config from dat" + - "abase: %[1]s\x02Failed to parse base config: %[1]s\x02Failed to regenera" + - "te base config: %[1]s\x02Failed to insert 'base' config layer in databas" + - "e: %[1]s\x02Non-SP cluster setup complete!\x02Your non-SP cluster has be" + - "en configured successfully.\x02You can now start using Curio for protoco" + - "ls like PDP, Snark markets, and others.\x02To start the cluster, run: cu" + - "rio run --layers basic-cluster\x02Enter the info to connect to your Yuga" + - "byte database installation (https://download.yugabyte.com/)\x02Host: %[1" + - "]s\x02Port: %[1]s\x02Username: %[1]s\x02Password: %[1]s\x02Database: %[1" + - "]s\x02Continue to connect and update schema.\x04\x00\x01 <\x02Database c" + - "onfig error occurred, abandoning migration: %[1]s\x02Enter the Yugabyte " + - "database host(s)\x02No host provided\x02Enter the Yugabyte database %[1]" + - "s\x02No value provided\x02Error connecting to Yugabyte database: %[1]s" + - "\x02Migrating metadata for %[1]d sectors.\x02Configuration 'base' was up" + - "dated to include this miner's address (%[1]s) and its wallet setup.\x02C" + - "ompare the configurations %[1]s to %[2]s. Changes between the miner IDs " + - "other than wallet addreses should be a new, minimal layer for runners th" + - "at need it.\x02Configuration 'base' was created to resemble this lotus-m" + - "iner's config.toml .\x04\x00\x01 \x15\x02Layer %[1]s created.\x04\x00" + - "\x01 \x19\x02To work with the config:\x02To run Curio: With machine or c" + - "group isolation, use the command (with example layer selection):" + "compute WindowPoSt for\x02Collection of debugging utilities\x02Supra con" + + "sensus testing utilities\x02Tool Box for Curio\x02Updated DB with messag" + + "e data missing from chain node\x02Update data for messages in wait queue" + + "\x02Manage unsealed data\x02Get information about unsealed data\x02List " + + "data from the sectors_unseal_pipeline and sectors_meta tables\x02Filter " + + "by storage provider ID\x02Output file path (default: stdout)\x02Set the " + + "target unseal state for a sector\x04\x00\x01\x0a\x80\x07\x02Set the targ" + + "et unseal state for a specific sector.\x0a : The storage pro" + + "vider ID\x0a : The sector number\x0a : " + + "The target state (true, false, or none)\x0a\x0a The unseal target stat" + + "e indicates to curio how an unsealed copy of the sector should be mainta" + + "ined.\x0a\x09 If the target state is true, curio will ensure that the " + + "sector is unsealed.\x0a\x09 If the target state is false, curio will e" + + "nsure that there is no unsealed copy of the sector.\x0a\x09 If the tar" + + "get state is none, curio will not change the current state of the sector" + + ".\x0a\x0a Currently when the curio will only start new unseal processe" + + "s when the target state changes from another state to true.\x0a\x0a Wh" + + "en the target state is false, and an unsealed sector file exists, the GC" + + " mark step will create a removal mark\x0a for the unsealed sector file" + + ". The file will only be removed after the removal mark is accepted.\x02C" + + "heck data integrity in unsealed sector files\x02Create a check task for " + + "a specific sector, wait for its completion, and output the result.\x0a " + + " : The storage provider ID\x0a : The sector n" + + "umber\x04\x00\x01 0\x02Use the arrow keys to navigate: ↓ ↑ → ←\x02This i" + + "nteractive tool creates a new miner actor and creates the basic configur" + + "ation layer for it.\x02This process is partially idempotent. Once a new " + + "miner actor has been created and subsequent steps fail, the user need to" + + " run 'curio config new-cluster < miner ID >' to finish the configuration" + + ".\x02This interactive tool sets up a non-Storage Provider cluster for pr" + + "otocols like PDP, Snark market, and others.\x02This setup does not creat" + + "e or migrate a Filecoin SP actor.\x02This interactive tool migrates lotu" + + "s-miner to Curio in 5 minutes.\x02Each step needs your confirmation and " + + "can be reversed. Press Ctrl+C to exit at any time.\x02Ctrl+C pressed in " + + "Terminal\x02I want to:\x02Migrate from existing Lotus-Miner\x02Create a " + + "new miner\x02Setup non-Storage Provider cluster\x02Aborting remaining st" + + "eps.\x02Lotus-Miner to Curio Migration.\x02Where should we save your dat" + + "abase config file?\x02Aborting migration.\x02Error writing file: %[1]s" + + "\x04\x00\x01 !\x02Try the web interface with %[1]s\x02For more servers, " + + "make /etc/curio.env with the curio.env database env and add the CURIO_LA" + + "YERS env to assign purposes.\x02You can now migrate your market node (%[" + + "1]s), if applicable.\x02Additional info is at http://docs.curiostorage.o" + + "rg\x02New Miner initialization complete.\x02Migrating lotus-miner config" + + ".toml to Curio in-database configuration.\x02Error getting API: %[1]s" + + "\x02could not get API info for FullNode: %[1]w\x02Error getting token: %" + + "[1]s\x02Unmigratable sectors found. Do you want to continue?\x02Yes, con" + + "tinue\x02No, abort\x02Error saving config to layer: %[1]s. Aborting Migr" + + "ation\x04\x00\x01 \x0f\x02Documentation:\x02The '%[1]s' layer stores com" + + "mon configuration. All curio instances can include it in their %[2]s arg" + + "ument.\x02You can add other layers for per-machine configuration changes" + + ".\x02Filecoin %[1]s channels: %[2]s and %[3]s\x02Increase reliability us" + + "ing redundancy: start multiple machines with at-least the post layer: 'c" + + "urio run --layers=post'\x02One database can serve multiple miner IDs: Ru" + + "n a migration for each lotus-miner.\x02Connected to Yugabyte. Schema is " + + "current.\x02Connected to Yugabyte\x02To start, ensure your sealing pipel" + + "ine is drained and shut-down lotus-miner.\x02Select the location of your" + + " lotus-miner config directory?\x02Other\x02Enter the path to the configu" + + "ration directory used by %[1]s\x04\x00\x01 '\x02No path provided, abando" + + "ning migration\x02Cannot read the config.toml file in the provided direc" + + "tory, Error: %[1]s\x02Could not create repo from directory: %[1]s. Abort" + + "ing migration\x02Could not lock miner repo. Your miner must be stopped: " + + "%[1]s\x0a Aborting migration\x02Read Miner Config\x04\x00\x01\x0a\x15" + + "\x02Step Complete: %[1]s\x02Initializing a new miner actor.\x02Enter the" + + " info to create a new miner\x02Owner Wallet: %[1]s\x02Worker Wallet: %[1" + + "]s\x02Sender Wallet: %[1]s\x02Sector Size: %[1]s\x02Continue to verify t" + + "he addresses and create a new miner actor.\x04\x00\x01 %\x02Miner creati" + + "on error occurred: %[1]s\x02Enter the owner address\x02No address provid" + + "ed\x02Failed to parse the address: %[1]s\x02Enter %[1]s address\x02Selec" + + "t the Sector Size\x0264 GiB\x0232 GiB\x028 MiB\x022 KiB\x04\x00\x01 \x1f" + + "\x02Sector selection failed: %[1]s\x02Failed to parse sector size: %[1]s" + + "\x02Failed to create the miner actor: %[1]s\x02Miner %[1]s created succe" + + "ssfully\x02Cannot reach the DB: %[1]s\x02Error connecting to full node A" + + "PI: %[1]s\x02Pre-initialization steps complete\x02Failed to generate ran" + + "dom bytes for secret: %[1]s\x02Please do not run guided-setup again as m" + + "iner creation is not idempotent. You need to run 'curio config new-clust" + + "er %[1]s' to finish the configuration\x02Please do not run guided-setup " + + "again. You need to run 'curio config new-cluster' manually to finish the" + + " configuration\x02Failed to get API info for FullNode: %[1]s\x02Failed t" + + "o create auth token: %[1]s\x02Failed to generate default config: %[1]s" + + "\x02Failed to insert config into database: %[1]s\x02Non-SP cluster confi" + + "guration created successfully\x02Non-SP cluster configuration complete" + + "\x02Configuration 'base' was updated to include this miner's address\x02" + + "Failed to load base config from database: %[1]s\x02Failed to parse base " + + "config: %[1]s\x02Failed to regenerate base config: %[1]s\x02Failed to in" + + "sert 'base' config layer in database: %[1]s\x02Non-SP cluster setup comp" + + "lete!\x02Your non-SP cluster has been configured successfully.\x02You ca" + + "n now start using Curio for protocols like PDP, Snark markets, and other" + + "s.\x02To start the cluster, run: curio run --layers basic-cluster\x02Ent" + + "er the info to connect to your Yugabyte database installation (https://d" + + "ownload.yugabyte.com/)\x02Host: %[1]s\x02Port: %[1]s\x02Username: %[1]s" + + "\x02Password: %[1]s\x02Database: %[1]s\x02Continue to connect and update" + + " schema.\x04\x00\x01 <\x02Database config error occurred, abandoning mig" + + "ration: %[1]s\x02Enter the Yugabyte database host(s)\x02No host provided" + + "\x02Enter the Yugabyte database %[1]s\x02No value provided\x02Error conn" + + "ecting to Yugabyte database: %[1]s\x02Migrating metadata for %[1]d secto" + + "rs.\x02Configuration 'base' was updated to include this miner's address " + + "(%[1]s) and its wallet setup.\x02Compare the configurations %[1]s to %[2" + + "]s. Changes between the miner IDs other than wallet addreses should be a" + + " new, minimal layer for runners that need it.\x02Configuration 'base' wa" + + "s created to resemble this lotus-miner's config.toml .\x04\x00\x01 \x15" + + "\x02Layer %[1]s created.\x04\x00\x01 \x19\x02To work with the config:" + + "\x02To run Curio: With machine or cgroup isolation, use the command (wit" + + "h example layer selection):" -var koIndex = []uint32{ // 289 elements +var koIndex = []uint32{ // 290 elements // Entry 0 - 1F 0x00000000, 0x00000014, 0x0000004e, 0x00000168, 0x00000181, 0x000002b1, 0x00000328, 0x0000033a, @@ -695,43 +697,43 @@ var koIndex = []uint32{ // 289 elements 0x00002455, 0x00002476, 0x000024ec, 0x00002596, // Entry A0 - BF 0x000025ba, 0x000025dc, 0x00002615, 0x00002707, - 0x0000271a, 0x0000273c, 0x0000275a, 0x0000276e, - 0x000027d6, 0x00002812, 0x00002830, 0x00002862, - 0x000028a9, 0x000028d0, 0x00002900, 0x00002929, - 0x00002d09, 0x00002d3f, 0x00002df3, 0x00002e37, - 0x00002eb4, 0x00002fb4, 0x0000302b, 0x00003086, - 0x000030d3, 0x0000314e, 0x0000316f, 0x00003181, - 0x000031aa, 0x000031c5, 0x000031e0, 0x00003205, + 0x0000271a, 0x0000273c, 0x0000275a, 0x0000275a, + 0x0000276e, 0x000027d6, 0x00002812, 0x00002830, + 0x00002862, 0x000028a9, 0x000028d0, 0x00002900, + 0x00002929, 0x00002d09, 0x00002d3f, 0x00002df3, + 0x00002e37, 0x00002eb4, 0x00002fb4, 0x0000302b, + 0x00003086, 0x000030d3, 0x0000314e, 0x0000316f, + 0x00003181, 0x000031aa, 0x000031c5, 0x000031e0, // Entry C0 - DF - 0x00003228, 0x0000326e, 0x00003289, 0x000032a5, - 0x000032e4, 0x0000339a, 0x000033ea, 0x0000342a, - 0x00003450, 0x000034a9, 0x000034c8, 0x00003504, - 0x00003534, 0x00003584, 0x00003590, 0x000035a2, - 0x000035fa, 0x00003607, 0x0000368d, 0x000036df, - 0x00003706, 0x000037a2, 0x00003834, 0x00003875, - 0x0000388b, 0x000038f6, 0x00003945, 0x0000394c, - 0x00003994, 0x000039e6, 0x00003a40, 0x00003aaa, + 0x00003205, 0x00003228, 0x0000326e, 0x00003289, + 0x000032a5, 0x000032e4, 0x0000339a, 0x000033ea, + 0x0000342a, 0x00003450, 0x000034a9, 0x000034c8, + 0x00003504, 0x00003534, 0x00003584, 0x00003590, + 0x000035a2, 0x000035fa, 0x00003607, 0x0000368d, + 0x000036df, 0x00003706, 0x000037a2, 0x00003834, + 0x00003875, 0x0000388b, 0x000038f6, 0x00003945, + 0x0000394c, 0x00003994, 0x000039e6, 0x00003a40, // Entry E0 - FF - 0x00003b3b, 0x00003b53, 0x00003b6d, 0x00003b91, - 0x00003bc4, 0x00003bdc, 0x00003bf4, 0x00003c0c, - 0x00003c21, 0x00003c78, 0x00003ca3, 0x00003cbb, - 0x00003ce2, 0x00003d05, 0x00003d19, 0x00003d2e, - 0x00003d35, 0x00003d3c, 0x00003d42, 0x00003d48, - 0x00003d69, 0x00003d93, 0x00003db9, 0x00003df2, - 0x00003e2a, 0x00003e62, 0x00003e81, 0x00003ecd, - 0x00003f8b, 0x0000401e, 0x0000405c, 0x00004091, + 0x00003aaa, 0x00003b3b, 0x00003b53, 0x00003b6d, + 0x00003b91, 0x00003bc4, 0x00003bdc, 0x00003bf4, + 0x00003c0c, 0x00003c21, 0x00003c78, 0x00003ca3, + 0x00003cbb, 0x00003ce2, 0x00003d05, 0x00003d19, + 0x00003d2e, 0x00003d35, 0x00003d3c, 0x00003d42, + 0x00003d48, 0x00003d69, 0x00003d93, 0x00003db9, + 0x00003df2, 0x00003e2a, 0x00003e62, 0x00003e81, + 0x00003ecd, 0x00003f8b, 0x0000401e, 0x0000405c, // Entry 100 - 11F - 0x000040b4, 0x000040ff, 0x00004143, 0x00004165, - 0x000041b5, 0x0000420a, 0x0000424d, 0x0000428c, - 0x000042e8, 0x0000430b, 0x00004349, 0x000043a8, - 0x000043fa, 0x00004468, 0x00004479, 0x00004487, - 0x0000449f, 0x000044b3, 0x000044cd, 0x000044f7, - 0x0000455a, 0x00004596, 0x000045c0, 0x000045f8, - 0x0000461c, 0x00004670, 0x000046a8, 0x00004721, - 0x000047db, 0x00004832, 0x00004861, 0x00004888, + 0x00004091, 0x000040b4, 0x000040ff, 0x00004143, + 0x00004165, 0x000041b5, 0x0000420a, 0x0000424d, + 0x0000428c, 0x000042e8, 0x0000430b, 0x00004349, + 0x000043a8, 0x000043fa, 0x00004468, 0x00004479, + 0x00004487, 0x0000449f, 0x000044b3, 0x000044cd, + 0x000044f7, 0x0000455a, 0x00004596, 0x000045c0, + 0x000045f8, 0x0000461c, 0x00004670, 0x000046a8, + 0x00004721, 0x000047db, 0x00004832, 0x00004861, // Entry 120 - 13F - 0x00004914, -} // Size: 1180 bytes + 0x00004888, 0x00004914, +} // Size: 1184 bytes const koData string = "" + // Size: 18708 bytes "\x02수학 유틸리티\x02배치 실러 스레드의 레이아웃 분석 및 표시\x02CPU에서 배치 실러 스레드의 레이아웃을 분석하고 표시" + @@ -879,7 +881,7 @@ const koData string = "" + // Size: 18708 bytes "1]s가 생성되었습니다.\x04\x00\x01 \x22\x02구성 파일을 사용하려면:\x02Curio를 실행하려면: 기계 또는 c" + "group 격리를 사용하여 다음 명령을 사용하세요 (예제 레이어 선택과 함께):" -var zhIndex = []uint32{ // 289 elements +var zhIndex = []uint32{ // 290 elements // Entry 0 - 1F 0x00000000, 0x0000000d, 0x00000038, 0x000000e6, 0x000000ff, 0x000001d8, 0x00000229, 0x0000023b, @@ -927,43 +929,43 @@ var zhIndex = []uint32{ // 289 elements 0x00001bcf, 0x00001be5, 0x00001c43, 0x00001cc8, // Entry A0 - BF 0x00001cef, 0x00001d1d, 0x00001d51, 0x00001dfe, - 0x00001e13, 0x00001e2f, 0x00001e42, 0x00001e52, - 0x00001e8c, 0x00001eb1, 0x00001eca, 0x00001ee9, - 0x00001f2c, 0x00001f49, 0x00001f77, 0x00001f99, - 0x0000229a, 0x000022cb, 0x00002351, 0x00002384, - 0x000023dc, 0x00002485, 0x000024d8, 0x00002524, - 0x0000256c, 0x000025bb, 0x000025d4, 0x000025e1, - 0x00002601, 0x0000261a, 0x00002639, 0x0000264f, + 0x00001e13, 0x00001e2f, 0x00001e42, 0x00001e42, + 0x00001e52, 0x00001e8c, 0x00001eb1, 0x00001eca, + 0x00001ee9, 0x00001f2c, 0x00001f49, 0x00001f77, + 0x00001f99, 0x0000229a, 0x000022cb, 0x00002351, + 0x00002384, 0x000023dc, 0x00002485, 0x000024d8, + 0x00002524, 0x0000256c, 0x000025bb, 0x000025d4, + 0x000025e1, 0x00002601, 0x0000261a, 0x00002639, // Entry C0 - DF - 0x0000266c, 0x000026a9, 0x000026b9, 0x000026d3, - 0x000026f9, 0x00002780, 0x000027c1, 0x000027f4, - 0x00002810, 0x00002855, 0x00002872, 0x0000289b, - 0x000028b9, 0x000028ed, 0x000028fd, 0x0000290a, - 0x00002943, 0x00002952, 0x000029ac, 0x000029e9, - 0x00002a11, 0x00002a70, 0x00002ac0, 0x00002aed, - 0x00002b02, 0x00002b4d, 0x00002b7d, 0x00002b84, - 0x00002bae, 0x00002bd2, 0x00002c16, 0x00002c48, + 0x0000264f, 0x0000266c, 0x000026a9, 0x000026b9, + 0x000026d3, 0x000026f9, 0x00002780, 0x000027c1, + 0x000027f4, 0x00002810, 0x00002855, 0x00002872, + 0x0000289b, 0x000028b9, 0x000028ed, 0x000028fd, + 0x0000290a, 0x00002943, 0x00002952, 0x000029ac, + 0x000029e9, 0x00002a11, 0x00002a70, 0x00002ac0, + 0x00002aed, 0x00002b02, 0x00002b4d, 0x00002b7d, + 0x00002b84, 0x00002bae, 0x00002bd2, 0x00002c16, // Entry E0 - FF - 0x00002c91, 0x00002ca4, 0x00002cbe, 0x00002cdd, - 0x00002d02, 0x00002d19, 0x00002d2d, 0x00002d44, - 0x00002d58, 0x00002d89, 0x00002dae, 0x00002dc4, - 0x00002dd4, 0x00002dee, 0x00002e02, 0x00002e15, - 0x00002e1c, 0x00002e23, 0x00002e29, 0x00002e2f, - 0x00002e4e, 0x00002e6e, 0x00002e8e, 0x00002ea8, - 0x00002ec5, 0x00002ef6, 0x00002f0f, 0x00002f38, - 0x00002fc5, 0x0000302a, 0x00003056, 0x00003076, + 0x00002c48, 0x00002c91, 0x00002ca4, 0x00002cbe, + 0x00002cdd, 0x00002d02, 0x00002d19, 0x00002d2d, + 0x00002d44, 0x00002d58, 0x00002d89, 0x00002dae, + 0x00002dc4, 0x00002dd4, 0x00002dee, 0x00002e02, + 0x00002e15, 0x00002e1c, 0x00002e23, 0x00002e29, + 0x00002e2f, 0x00002e4e, 0x00002e6e, 0x00002e8e, + 0x00002ea8, 0x00002ec5, 0x00002ef6, 0x00002f0f, + 0x00002f38, 0x00002fc5, 0x0000302a, 0x00003056, // Entry 100 - 11F - 0x00003096, 0x000030bc, 0x000030dc, 0x000030f6, - 0x00003129, 0x00003156, 0x00003177, 0x0000319d, - 0x000031ce, 0x000031eb, 0x00003211, 0x00003258, - 0x00003297, 0x000032f1, 0x00003300, 0x0000330f, - 0x00003321, 0x00003330, 0x00003342, 0x00003361, - 0x00003399, 0x000033be, 0x000033ce, 0x000033ec, - 0x000033f9, 0x00003425, 0x0000344f, 0x000034a0, - 0x00003522, 0x00003569, 0x00003583, 0x0000359b, + 0x00003076, 0x00003096, 0x000030bc, 0x000030dc, + 0x000030f6, 0x00003129, 0x00003156, 0x00003177, + 0x0000319d, 0x000031ce, 0x000031eb, 0x00003211, + 0x00003258, 0x00003297, 0x000032f1, 0x00003300, + 0x0000330f, 0x00003321, 0x00003330, 0x00003342, + 0x00003361, 0x00003399, 0x000033be, 0x000033ce, + 0x000033ec, 0x000033f9, 0x00003425, 0x0000344f, + 0x000034a0, 0x00003522, 0x00003569, 0x00003583, // Entry 120 - 13F - 0x000035f2, -} // Size: 1180 bytes + 0x0000359b, 0x000035f2, +} // Size: 1184 bytes const zhData string = "" + // Size: 13810 bytes "\x02数学工具\x02分析并显示批量封装线程的布局\x02分析并显示CPU上批量封装线程的布局。\x0a\x0a提供有关批量封装操作的CPU利" + @@ -1074,4 +1076,4 @@ const zhData string = "" + // Size: 13810 bytes "\x02层%[1]s已创建。\x04\x00\x01 \x13\x02要使用配置:\x02运行Curio:使用机器或cgroup隔离,使用命令(" + "附带示例层选择):" - // Total table size 51274 bytes (50KiB); checksum: 1074D03B + // Total table size 51320 bytes (50KiB); checksum: 3F8F66C5 diff --git a/deps/config/doc_gen.go b/deps/config/doc_gen.go index 5998b0fe8..b085b3d12 100644 --- a/deps/config/doc_gen.go +++ b/deps/config/doc_gen.go @@ -554,6 +554,18 @@ Note that future Curio implementations will have a separate task type for fetchi Comment: `The maximum amount of ParkPieceMaxTasks tasks that can run simultaneously. Note that the maximum number of tasks will also be bounded by resources available on the machine (Default: 0 - unlimited)`, }, + { + Name: "ParkPieceMaxInPark", + Type: "int", + + Comment: `The maximum number of pieces that should be in storage + active tasks writing to storage on this node (Default: 0 - unlimited)`, + }, + { + Name: "ParkPieceMinFreeStoragePercent", + Type: "float64", + + Comment: `The minimum free storage percentage required for the ParkPiece task to run. (Default: 20)`, + }, { Name: "EnableSealSDR", Type: "bool", @@ -733,6 +745,13 @@ This step submits the generated proofs to the chain. (Default: false)`, Comment: `BindEncodeToData forces the Encode task to be executed on the same node where the data was parked. Please ensure that ParkPiece task is enabled and relevant resources are available before enabling this option. (Default: false)`, + }, + { + Name: "AllowEncodeGPUOverprovision", + Type: "bool", + + Comment: `AllowEncodeGPUOverprovision allows the Encode task to run on regardress of declared GPU usage. (Default: false) +NOTE: This definitely is not safe on PoSt nodes.`, }, { Name: "UpdateProveMaxTasks", diff --git a/deps/config/types.go b/deps/config/types.go index ea1f75dbd..c11593711 100644 --- a/deps/config/types.go +++ b/deps/config/types.go @@ -13,11 +13,11 @@ import ( func DefaultCurioConfig() *CurioConfig { return &CurioConfig{ Subsystems: CurioSubsystemsConfig{ - GuiAddress: "0.0.0.0:4701", - RequireActivationSuccess: true, - RequireNotificationSuccess: true, - IndexingMaxTasks: 8, - RemoteProofMaxUploads: 15, + GuiAddress: "0.0.0.0:4701", + RequireActivationSuccess: true, + RequireNotificationSuccess: true, + IndexingMaxTasks: 8, + RemoteProofMaxUploads: 15, ParkPieceMinFreeStoragePercent: 20, }, Fees: CurioFees{ diff --git a/documentation/en/configuration/default-curio-configuration.md b/documentation/en/configuration/default-curio-configuration.md index 71fc5467a..af6c3ed04 100644 --- a/documentation/en/configuration/default-curio-configuration.md +++ b/documentation/en/configuration/default-curio-configuration.md @@ -59,6 +59,16 @@ description: The default curio configuration # type: int #ParkPieceMaxTasks = 0 + # The maximum number of pieces that should be in storage + active tasks writing to storage on this node (Default: 0 - unlimited) + # + # type: int + #ParkPieceMaxInPark = 0 + + # The minimum free storage percentage required for the ParkPiece task to run. (Default: 20) + # + # type: float64 + #ParkPieceMinFreeStoragePercent = 20.0 + # EnableSealSDR enables SDR tasks to run. SDR is the long sequential computation # creating 11 layer files in sector cache directory. # @@ -219,6 +229,12 @@ description: The default curio configuration # type: bool #BindEncodeToData = false + # AllowEncodeGPUOverprovision allows the Encode task to run on regardress of declared GPU usage. (Default: false) + # NOTE: This definitely is not safe on PoSt nodes. + # + # type: bool + #AllowEncodeGPUOverprovision = false + # UpdateProveMaxTasks sets the maximum number of concurrent SnapDeal proving tasks that can run on this instance. (Default: 0 - unlimited) # # type: int diff --git a/lib/ffi/metrics.go b/lib/ffi/metrics.go index e825417a6..f3a08b957 100644 --- a/lib/ffi/metrics.go +++ b/lib/ffi/metrics.go @@ -11,21 +11,21 @@ import ( ) var ( - phaseKey, _ = tag.NewKey("phase") - pre = "cuffi_" + phaseKey, _ = tag.NewKey("phase") + pre = "cuffi_" ) var ( - encActiveStart atomic.Int64 - encActiveTreeD atomic.Int64 + encActiveStart atomic.Int64 + encActiveTreeD atomic.Int64 encActiveEncode atomic.Int64 - encActiveTreeR atomic.Int64 - encActiveTail atomic.Int64 + encActiveTreeR atomic.Int64 + encActiveTail atomic.Int64 ) var Measures = struct { encActivePhase *stats.Int64Measure -} { +}{ encActivePhase: stats.Int64(pre+"snap_enc_active", "Number of tasks in each phase", stats.UnitDimensionless), } @@ -48,4 +48,4 @@ func init() { time.Sleep(5 * time.Second) } }() -} \ No newline at end of file +} diff --git a/tasks/balancemgr/handlers_f05.go b/tasks/balancemgr/handlers_f05.go index 9b2721579..500dfa97f 100644 --- a/tasks/balancemgr/handlers_f05.go +++ b/tasks/balancemgr/handlers_f05.go @@ -3,17 +3,18 @@ package balancemgr import ( "context" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "golang.org/x/xerrors" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/harmony/harmonytask" - "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/types" ) @@ -66,12 +67,12 @@ func (b *BalanceMgrTask) doF05(ctx context.Context, taskID harmonytask.TaskID, a if err != nil { return false, xerrors.Errorf("getting market balance: %w", err) } - + sourceBalance, err := b.chain.StateGetActor(ctx, addr.SubjectAddress, types.EmptyTSK) if err != nil { return false, xerrors.Errorf("getting source balance: %w", err) } - + addr.SubjectBalance = big.Sub(marketBalance.Escrow, marketBalance.Locked) addr.SecondBalance = types.BigInt(sourceBalance.Balance) diff --git a/tasks/piece/task_park_piece.go b/tasks/piece/task_park_piece.go index 090abccc5..81625f04f 100644 --- a/tasks/piece/task_park_piece.go +++ b/tasks/piece/task_park_piece.go @@ -34,7 +34,7 @@ type ParkPieceTask struct { TF promise.Promise[harmonytask.AddTaskFunc] - max int + max int minFreeStoragePercent float64 // maxInPark is the maximum number of pieces that should be in storage + active tasks writing to storage on this node @@ -56,13 +56,13 @@ func NewStorePieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remot func newPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int, maxInPark int, longTerm bool, p2Active func() bool, minFreeStoragePercent float64) (*ParkPieceTask, error) { pt := &ParkPieceTask{ - db: db, - sc: sc, - remote: remote, - max: max, - maxInPark: maxInPark, - longTerm: longTerm, - p2Active: p2Active, + db: db, + sc: sc, + remote: remote, + max: max, + maxInPark: maxInPark, + longTerm: longTerm, + p2Active: p2Active, minFreeStoragePercent: minFreeStoragePercent, } diff --git a/tasks/snap/task_encode.go b/tasks/snap/task_encode.go index dbfd72df5..26e2d6c4a 100644 --- a/tasks/snap/task_encode.go +++ b/tasks/snap/task_encode.go @@ -26,8 +26,8 @@ import ( const MinSnapSchedInterval = 10 * time.Second type EncodeTask struct { - max int - bindToData bool + max int + bindToData bool allowEncodeGPUOverprovision bool sc *ffi.SealCalls @@ -36,10 +36,10 @@ type EncodeTask struct { func NewEncodeTask(sc *ffi.SealCalls, db *harmonydb.DB, max int, bindToData bool, allowEncodeGPUOverprovision bool) *EncodeTask { return &EncodeTask{ - max: max, - sc: sc, - db: db, - bindToData: bindToData, + max: max, + sc: sc, + db: db, + bindToData: bindToData, allowEncodeGPUOverprovision: allowEncodeGPUOverprovision, } } diff --git a/tasks/storage-market/task_commp.go b/tasks/storage-market/task_commp.go index 4b7829313..22fb19788 100644 --- a/tasks/storage-market/task_commp.go +++ b/tasks/storage-market/task_commp.go @@ -229,9 +229,9 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task ctx := context.Background() var tasks []struct { - TaskID harmonytask.TaskID `db:"commp_task_id"` - StorageID string `db:"storage_id"` - Url *string `db:"url"` + TaskID harmonytask.TaskID `db:"commp_task_id"` + StorageID string `db:"storage_id"` + Url *string `db:"url"` } indIDs := make([]int64, len(ids)) diff --git a/web/api/webrpc/upgrade.go b/web/api/webrpc/upgrade.go index 9933d9196..0225f6dea 100644 --- a/web/api/webrpc/upgrade.go +++ b/web/api/webrpc/upgrade.go @@ -4,11 +4,11 @@ import ( "context" "time" + "github.com/samber/lo" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/samber/lo" "github.com/filecoin-project/curio/tasks/snap" ) From 9efac84ecc201f3f249bb6701496a537755e6e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Sep 2025 16:24:34 +0200 Subject: [PATCH 49/67] missing fixes postrebase --- deps/apiinfo.go | 4 ++-- tasks/message/sender.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/deps/apiinfo.go b/deps/apiinfo.go index cb6d59b15..813492f3c 100644 --- a/deps/apiinfo.go +++ b/deps/apiinfo.go @@ -93,7 +93,7 @@ func GetFullNodeAPIV1Curio(ctx *cli.Context, ainfoCfg []string) (api.Chain, json } if len(fullNodes) == 0 { - return nil, nil, xerrors.Errorf("failed to establish connection with all nodes") + return nil, nil, xerrors.Errorf("failed to establish connection with all chain nodes") } finalCloser := func() { @@ -380,7 +380,7 @@ func GetEthClient(cctx *cli.Context, ainfoCfg []string) (*ethclient.Client, erro } if len(clients) == 0 { - return nil, xerrors.Errorf("failed to establish connection with all nodes") + return nil, xerrors.Errorf("failed to establish connection with all chain nodes") } return clients[0], nil diff --git a/tasks/message/sender.go b/tasks/message/sender.go index 8d5e77611..f1ca6f547 100644 --- a/tasks/message/sender.go +++ b/tasks/message/sender.go @@ -3,6 +3,8 @@ package message import ( "bytes" "context" + "os" + "strconv" "time" "github.com/google/uuid" @@ -28,9 +30,25 @@ var log = logging.Logger("curio/message") var SendLockedWait = 100 * time.Millisecond +var NBI uint64 = 10 + +func init() { + if nval := os.Getenv("CURIO_NBI"); nval != "" { + var err error + NBI, err = strconv.ParseUint(nval, 10, 64) + if err != nil { + panic(xerrors.Errorf("parsing CURIO_NBI: %w", err)) + } + if NBI < 1 { + panic("CURIO_NBI must be at least 1") + } + } +} + type SenderAPI interface { StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error) WalletBalance(ctx context.Context, addr address.Address) (big.Int, error) MpoolGetNonce(context.Context, address.Address) (uint64, error) MpoolPush(context.Context, *types.SignedMessage) (cid.Cid, error) @@ -313,11 +331,21 @@ func (s *Sender) Send(ctx context.Context, msg *types.Message, mss *api.MessageS return cid.Undef, xerrors.Errorf("Send expects message nonce to be 0, was %d", msg.Nonce) } + premiumWasNull := msg.GasPremium == types.EmptyInt || types.BigCmp(msg.GasPremium, types.NewInt(0)) == 0 + msg, err = s.api.GasEstimateMessageGas(ctx, msg, mss, types.EmptyTSK) if err != nil { return cid.Undef, xerrors.Errorf("GasEstimateMessageGas error: %w", err) } + if premiumWasNull { + gasPremium, err := s.api.GasEstimateGasPremium(ctx, NBI, msg.From, msg.GasLimit, types.EmptyTSK) + if err != nil { + return cid.Undef, xerrors.Errorf("estimating gas price: %w", err) + } + msg.GasPremium = gasPremium + } + b, err := s.api.WalletBalance(ctx, msg.From) if err != nil { return cid.Undef, xerrors.Errorf("mpool push: getting origin balance: %w", err) From e500cadd92616c05553d18f7876167bdae70d49a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 28 Sep 2025 08:57:46 +0200 Subject: [PATCH 50/67] fix: proofshare: Fix client payment chain bootstrap --- tasks/proofshare/task_client_send.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/proofshare/task_client_send.go b/tasks/proofshare/task_client_send.go index 6e25be56f..6fc9c9bf0 100644 --- a/tasks/proofshare/task_client_send.go +++ b/tasks/proofshare/task_client_send.go @@ -134,7 +134,7 @@ func (t *TaskClientSend) Do(taskID harmonytask.TaskID, stillOwned func() bool) ( return false, xerrors.Errorf("failed to check for unconsumed payments: %w", err) } - if lastPayment.Consumed { + if lastPayment.Consumed || errors.Is(err, pgx.ErrNoRows) { // it was, create a new payment // Note: Payment Consumed == it was sent and is now being processed in the market match, err := t.doCreatePayment(ctx, taskID, walletID) From 26dbb10ca959a42879efe7ebd56c77569fcf7c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 6 Oct 2025 12:41:11 +0200 Subject: [PATCH 51/67] feat: test post cli: Vanilla Proof test command --- cmd/curio/internal/translations/catalog.go | 661 +++++++++--------- .../translations/locales/en/out.gotext.json | 7 + .../translations/locales/ko/out.gotext.json | 6 + .../translations/locales/zh/out.gotext.json | 6 + cmd/curio/test-cli.go | 248 +++++++ documentation/en/curio-cli/curio.md | 18 + lib/proof/post_vproof_verify.go | 16 +- tasks/window/compute_do.go | 4 +- 8 files changed, 630 insertions(+), 336 deletions(-) diff --git a/cmd/curio/internal/translations/catalog.go b/cmd/curio/internal/translations/catalog.go index dac8df728..e137e6503 100644 --- a/cmd/curio/internal/translations/catalog.go +++ b/cmd/curio/internal/translations/catalog.go @@ -47,16 +47,16 @@ var messageKeyToIndex = map[string]int{ "(for init) use path for sealing": 143, "--machine flag in cli command should point to the node where storage to redeclare is attached": 155, "1278 (3.5 years)": 127, - "2 KiB": 243, - "32 GiB": 241, - "64 GiB": 240, - "8 MiB": 242, + "2 KiB": 244, + "32 GiB": 242, + "64 GiB": 241, + "8 MiB": 243, "": 97, - "Aborting migration.": 194, - "Aborting remaining steps.": 191, + "Aborting migration.": 195, + "Aborting remaining steps.": 192, "Accept a proposed service actor": 71, "Add URL to fetch data for offline deals": 98, - "Additional info is at http://docs.curiostorage.org": 199, + "Additional info is at http://docs.curiostorage.org": 200, "Address to listen for the GUI on": 120, "Amount in FIL": 41, "Amount to deposit (FIL)": 60, @@ -66,136 +66,137 @@ var messageKeyToIndex = map[string]int{ "CSV file location to use for multiple deal input. Each line in the file should be in the format 'uuid,raw size,url,header1,header2...'": 99, "Cancel a pending client withdrawal request": 46, "Cancel a pending service withdrawal request": 58, - "Cannot reach the DB: %s": 248, - "Cannot read the config.toml file in the provided directory, Error: %s": 222, - "Check data integrity in unsealed sector files": 177, + "Cannot reach the DB: %s": 249, + "Cannot read the config.toml file in the provided directory, Error: %s": 223, + "Check data integrity in unsealed sector files": 178, "Client actor": 49, "Client actor address": 62, "Client sender address": 43, - "Collection of debugging utilities": 165, + "Collection of debugging utilities": 166, "Command separated list of hostnames for yugabyte cluster": 84, - "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.": 284, + "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.": 285, "Complete a pending client withdrawal after the withdrawal window elapses": 45, "Complete a pending service withdrawal after the withdrawal window elapses": 57, "Compute WindowPoSt for performance and configuration testing.": 161, + "Compute WindowPoSt vanilla proofs and verify them.": 165, "Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.": 157, - "Configuration 'base' was created to resemble this lotus-miner's config.toml .": 285, - "Configuration 'base' was updated to include this miner's address": 260, - "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.": 283, - "Connected to Yugabyte": 216, - "Connected to Yugabyte. Schema is current.": 215, - "Continue to connect and update schema.": 275, - "Continue to verify the addresses and create a new miner actor.": 233, + "Configuration 'base' was created to resemble this lotus-miner's config.toml .": 286, + "Configuration 'base' was updated to include this miner's address": 261, + "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.": 284, + "Connected to Yugabyte": 217, + "Connected to Yugabyte. Schema is current.": 216, + "Continue to connect and update schema.": 276, + "Continue to verify the addresses and create a new miner actor.": 234, "Cordon a machine, set it to maintenance mode": 36, - "Could not create repo from directory: %s. Aborting migration": 223, - "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration": 224, - "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number": 178, + "Could not create repo from directory: %s. Aborting migration": 224, + "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration": 225, + "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number": 179, "Create a client voucher": 66, - "Create a new miner": 189, + "Create a new miner": 190, "Create a new offline verified DDO deal for Curio": 105, "Create a provider voucher": 68, "Create new configuration for a new cluster": 34, - "Ctrl+C pressed in Terminal": 186, + "Ctrl+C pressed in Terminal": 187, "Cumulative amount (FIL)": 50, "Custom `HEADER` to include in the HTTP request": 100, - "Database config error occurred, abandoning migration: %s ": 276, - "Database: %s": 274, + "Database config error occurred, abandoning migration: %s ": 277, + "Database: %s": 275, "Deposit FIL into the Router contract (client)": 39, "Deposit funds into the service pool (service role)": 59, - "Documentation: ": 209, - "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.": 185, + "Documentation: ": 210, + "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.": 186, "Enable load balancing for connecting to the Postgres database in Yugabyte cluster": 90, - "Enter %s address": 238, - "Enter the Yugabyte database %s": 279, - "Enter the Yugabyte database host(s)": 277, - "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)": 269, - "Enter the info to create a new miner": 228, - "Enter the owner address": 235, - "Enter the path to the configuration directory used by %s": 220, - "Error connecting to Yugabyte database: %s": 281, - "Error connecting to full node API: %s": 249, - "Error getting API: %s": 202, - "Error getting token: %s": 204, - "Error saving config to layer: %s. Aborting Migration": 208, - "Error writing file: %s": 195, + "Enter %s address": 239, + "Enter the Yugabyte database %s": 280, + "Enter the Yugabyte database host(s)": 278, + "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)": 270, + "Enter the info to create a new miner": 229, + "Enter the owner address": 236, + "Enter the path to the configuration directory used by %s": 221, + "Error connecting to Yugabyte database: %s": 282, + "Error connecting to full node API: %s": 250, + "Error getting API: %s": 203, + "Error getting token: %s": 205, + "Error saving config to layer: %s. Aborting Migration": 209, + "Error writing file: %s": 196, "Execute cli commands": 6, - "Failed to create auth token: %s": 255, - "Failed to create the miner actor: %s": 246, - "Failed to generate default config: %s": 256, - "Failed to generate random bytes for secret: %s": 251, - "Failed to get API info for FullNode: %s": 254, - "Failed to insert 'base' config layer in database: %s": 264, - "Failed to insert config into database: %s": 257, - "Failed to load base config from database: %s": 261, - "Failed to parse base config: %s": 262, - "Failed to parse sector size: %s": 245, - "Failed to parse the address: %s": 237, - "Failed to regenerate base config: %s": 263, + "Failed to create auth token: %s": 256, + "Failed to create the miner actor: %s": 247, + "Failed to generate default config: %s": 257, + "Failed to generate random bytes for secret: %s": 252, + "Failed to get API info for FullNode: %s": 255, + "Failed to insert 'base' config layer in database: %s": 265, + "Failed to insert config into database: %s": 258, + "Failed to load base config from database: %s": 262, + "Failed to parse base config: %s": 263, + "Failed to parse sector size: %s": 246, + "Failed to parse the address: %s": 238, + "Failed to regenerate base config: %s": 264, "Fetch proving parameters": 92, - "Filecoin %s channels: %s and %s": 212, + "Filecoin %s channels: %s and %s": 213, "Filecoin decentralized storage network provider": 81, - "Filter by storage provider ID": 173, + "Filter by storage provider ID": 174, "Filter events by actor address; lists all if not specified": 132, "Filter events by sector number; requires --actor to be specified": 133, - "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.": 197, + "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.": 198, "Generate a supra_seal configuration": 3, "Generate a supra_seal configuration for a given batch size.\n\nThis command outputs a configuration expected by SupraSeal. Main purpose of this command is for debugging and testing.\nThe config can be used directly with SupraSeal binaries to test it without involving Curio.": 4, "Get Curio node info": 74, "Get a config layer by name. You may want to pipe the output to a file, or use 'less'": 19, - "Get information about unsealed data": 171, - "Host: %s": 270, + "Get information about unsealed data": 172, + "Host: %s": 271, "How long to commit sectors for": 126, - "I want to:": 187, + "I want to:": 188, "Ignore sectors that cannot be migrated": 130, - "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'": 213, - "Initializing a new miner actor.": 227, + "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'": 214, + "Initializing a new miner actor.": 228, "Initiate a withdrawal request from the client's deposit": 42, "Initiate a withdrawal request from the service pool": 56, "Interpret stacked config layers by this version of curio, with system-generated comments.": 23, - "Layer %s created. ": 286, + "Layer %s created. ": 287, "Limit output to the last N events": 134, "List config layers present in the DB.": 21, - "List data from the sectors_unseal_pipeline and sectors_meta tables": 172, + "List data from the sectors_unseal_pipeline and sectors_meta tables": 173, "List log systems": 76, "List pipeline events": 131, - "Lotus-Miner to Curio Migration.": 192, + "Lotus-Miner to Curio Migration.": 193, "Manage logging": 75, "Manage node config by layers. The layer 'base' will always be applied at Curio start-up.": 13, "Manage the sealing pipeline": 121, - "Manage unsealed data": 170, + "Manage unsealed data": 171, "Math Utils": 0, - "Migrate from existing Lotus-Miner": 188, - "Migrating lotus-miner config.toml to Curio in-database configuration.": 201, - "Migrating metadata for %d sectors.": 282, - "Miner %s created successfully": 247, - "Miner creation error occurred: %s ": 234, + "Migrate from existing Lotus-Miner": 189, + "Migrating lotus-miner config.toml to Curio in-database configuration.": 202, + "Migrating metadata for %d sectors.": 283, + "Miner %s created successfully": 248, + "Miner creation error occurred: %s ": 235, "Moves funds from the deal collateral wallet into escrow with the storage market actor": 102, "Name of the Postgres database in Yugabyte cluster": 85, - "New Miner initialization complete.": 200, + "New Miner initialization complete.": 201, "New service actor address": 70, - "No address provided": 236, - "No host provided": 278, - "No path provided, abandoning migration ": 221, - "No value provided": 280, - "No, abort": 207, - "Non-SP cluster configuration complete": 259, - "Non-SP cluster configuration created successfully": 258, - "Non-SP cluster setup complete!": 265, + "No address provided": 237, + "No host provided": 279, + "No path provided, abandoning migration ": 222, + "No value provided": 281, + "No, abort": 208, + "Non-SP cluster configuration complete": 260, + "Non-SP cluster configuration created successfully": 259, + "Non-SP cluster setup complete!": 266, "Note: This command is intended to be used to verify PoSt compute performance.\nIt will not send any messages to the chain. Since it can compute any deadline, output may be incorrectly timed for the chain.": 162, "Number of sectors to start": 125, - "One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 214, - "Other": 219, - "Output file path (default: stdout)": 174, - "Owner Wallet: %s": 229, + "One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 215, + "Other": 220, + "Output file path (default: stdout)": 175, + "Owner Wallet: %s": 230, "Password for connecting to the Postgres database in Yugabyte cluster": 87, - "Password: %s": 273, + "Password: %s": 274, "Path to miner repo": 129, - "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster %s' to finish the configuration": 252, - "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration": 253, + "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster %s' to finish the configuration": 253, + "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration": 254, "Port for connecting to the Cassandra database in Yugabyte cluster": 89, "Port for connecting to the Postgres database in Yugabyte cluster": 88, - "Port: %s": 271, - "Pre-initialization steps complete": 250, + "Port: %s": 272, + "Pre-initialization steps complete": 251, "Print default node config": 14, "Propose a new service actor": 69, "Provider actor": 55, @@ -205,26 +206,26 @@ var messageKeyToIndex = map[string]int{ "Query the service state": 65, "Query the state of a client": 61, "Query the state of a provider": 63, - "Read Miner Config": 225, + "Read Miner Config": 226, "Redeem a client voucher (service role)": 47, "Redeem a provider voucher (provider role)": 53, "Remove a named config layer.": 22, "Remove unsealed copies of sector containing this deal": 107, "SP ID to compute WindowPoSt for": 160, - "Sector Size: %s": 232, - "Sector selection failed: %s ": 244, + "Sector Size: %s": 233, + "Sector selection failed: %s ": 245, "Sectors can be stored across many filesystem paths. These\ncommands provide ways to manage the storage a Curio node will use to store sectors\nlong term for proving (references as 'store') as well as how sectors will be\nstored while moving through the sealing pipeline (references as 'seal').": 137, - "Select the Sector Size": 239, - "Select the location of your lotus-miner config directory?": 218, - "Sender Wallet: %s": 231, + "Select the Sector Size": 240, + "Select the location of your lotus-miner config directory?": 219, + "Sender Wallet: %s": 232, "Sender address": 40, "Service sender address": 48, "Set a config layer or the base by providing a filename or stdin.": 16, "Set log level": 77, "Set the log level for logging systems:\n\n The system flag can be specified multiple times.\n\n eg) log set-level --system chain --system chainxchg debug\n\n Available Levels:\n debug\n info\n warn\n error\n\n Environment Variables:\n GOLOG_LOG_LEVEL - Default log level for all log systems\n GOLOG_LOG_FMT - Change output log format (json, nocolor)\n GOLOG_FILE - Write logs to file\n GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr\n": 79, - "Set the target unseal state for a sector": 175, - "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.\n": 176, - "Setup non-Storage Provider cluster": 190, + "Set the target unseal state for a sector": 176, + "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.\n": 177, + "Setup non-Storage Provider cluster": 191, "Specify actor address for the deal": 106, "Specify actor address to start sealing sectors for": 95, "Specify wallet address to send the funds from": 104, @@ -234,45 +235,45 @@ var messageKeyToIndex = map[string]int{ "Start new sealing operations manually": 122, "Start sealing new CC sectors": 124, "Start sealing sectors for all actors now (not on schedule)": 123, - "Step Complete: %s\n": 226, + "Step Complete: %s\n": 227, "Stop a running Curio process": 135, "Storage can be attached to a Curio node using this command. The storage volume\nlist is stored local to the Curio node in storage.json set in curio run. We do not\nrecommend manually modifying this value without further understanding of the\nstorage system.\n\nEach storage volume contains a configuration file which describes the\ncapabilities of the volume. When the '--init' flag is provided, this file will\nbe created using the additional flags.\n\nWeight\nA high weight value means data will be more likely to be stored in this path\n\nSeal\nData for the sealing process will be stored here\n\nStore\nFinalized sectors that will be moved here for long term storage and be proven\nover time\n ": 140, - "Supra consensus testing utilities": 166, + "Supra consensus testing utilities": 167, "Test the windowpost scheduler by running it on the next available curio. If tasks fail all retries, you will need to ctrl+c to exit.": 158, - "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.": 210, - "This interactive tool creates a new miner actor and creates the basic configuration layer for it.": 180, - "This interactive tool migrates lotus-miner to Curio in 5 minutes.": 184, - "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.": 182, - "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.": 181, - "This setup does not create or migrate a Filecoin SP actor.": 183, - "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):": 288, - "To start the cluster, run: curio run --layers basic-cluster": 268, - "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.": 217, - "To work with the config: ": 287, - "Tool Box for Curio": 167, - "Try the web interface with %s ": 196, + "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.": 211, + "This interactive tool creates a new miner actor and creates the basic configuration layer for it.": 181, + "This interactive tool migrates lotus-miner to Curio in 5 minutes.": 185, + "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.": 183, + "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.": 182, + "This setup does not create or migrate a Filecoin SP actor.": 184, + "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):": 289, + "To start the cluster, run: curio run --layers basic-cluster": 269, + "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.": 218, + "To work with the config: ": 288, + "Tool Box for Curio": 168, + "Try the web interface with %s ": 197, "Uncordon a machine, resume scheduling": 37, - "Unmigratable sectors found. Do you want to continue?": 205, - "Update data for messages in wait queue": 169, - "Updated DB with message data missing from chain node": 168, + "Unmigratable sectors found. Do you want to continue?": 206, + "Update data for messages in wait queue": 170, + "Updated DB with message data missing from chain node": 169, "Use synthetic PoRep": 96, - "Use the arrow keys to navigate: ↓ ↑ → ← ": 179, + "Use the arrow keys to navigate: ↓ ↑ → ← ": 180, "Username for connecting to the Postgres database in Yugabyte cluster": 86, - "Username: %s": 272, + "Username: %s": 273, "Utility functions for testing": 156, "Validate a client voucher signature": 72, "Validate a provider voucher signature": 73, "Voucher nonce": 51, "Voucher signature (hex)": 52, "Wait for Curio api to come online": 8, - "Where should we save your database config file?": 193, + "Where should we save your database config file?": 194, "Withdrawal amount (in FIL)": 44, - "Worker Wallet: %s": 230, - "Yes, continue": 206, - "You can add other layers for per-machine configuration changes.": 211, - "You can now migrate your market node (%s), if applicable.": 198, - "You can now start using Curio for protocols like PDP, Snark markets, and others.": 267, - "Your non-SP cluster has been configured successfully.": 266, + "Worker Wallet: %s": 231, + "Yes, continue": 207, + "You can add other layers for per-machine configuration changes.": 212, + "You can now migrate your market node (%s), if applicable.": 199, + "You can now start using Curio for protocols like PDP, Snark markets, and others.": 268, + "Your non-SP cluster has been configured successfully.": 267, "Zen3 and later supports two sectors per thread, set to false for older CPUs": 5, "[SP actor address...]": 35, "[deadline index]": 163, @@ -287,7 +288,7 @@ var messageKeyToIndex = map[string]int{ "allow overwrite of existing layer if source is a different layer": 30, "attach local storage path": 138, "comma or space separated list of layers to be interpreted (base is always applied)": 25, - "could not get API info for FullNode: %w": 203, + "could not get API info for FullNode: %w": 204, "custom node name": 117, "deadline to compute WindowPoSt for ": 159, "depends on output being a TTY": 83, @@ -331,7 +332,7 @@ var messageKeyToIndex = map[string]int{ "use color in display output": 82, } -var enIndex = []uint32{ // 290 elements +var enIndex = []uint32{ // 291 elements // Entry 0 - 1F 0x00000000, 0x0000000b, 0x00000042, 0x00000126, 0x0000014a, 0x0000025a, 0x000002a6, 0x000002bb, @@ -379,45 +380,45 @@ var enIndex = []uint32{ // 290 elements 0x00001ebb, 0x00001ed9, 0x00001f4d, 0x00001fd2, // Entry A0 - BF 0x00001ffa, 0x0000201a, 0x00002058, 0x00002124, - 0x00002135, 0x00002159, 0x0000217b, 0x0000219d, - 0x000021b0, 0x000021e5, 0x0000220c, 0x00002221, - 0x00002245, 0x00002288, 0x000022a6, 0x000022c9, - 0x000022f2, 0x00002678, 0x000026a6, 0x0000274e, - 0x00002783, 0x000027e5, 0x000028a8, 0x00002917, - 0x00002952, 0x00002994, 0x000029ed, 0x00002a08, - 0x00002a13, 0x00002a35, 0x00002a48, 0x00002a6b, + 0x00002135, 0x00002159, 0x0000218c, 0x000021ae, + 0x000021d0, 0x000021e3, 0x00002218, 0x0000223f, + 0x00002254, 0x00002278, 0x000022bb, 0x000022d9, + 0x000022fc, 0x00002325, 0x000026ab, 0x000026d9, + 0x00002781, 0x000027b6, 0x00002818, 0x000028db, + 0x0000294a, 0x00002985, 0x000029c7, 0x00002a20, + 0x00002a3b, 0x00002a46, 0x00002a68, 0x00002a7b, // Entry C0 - DF - 0x00002a85, 0x00002aa5, 0x00002ad5, 0x00002ae9, - 0x00002b03, 0x00002b29, 0x00002ba0, 0x00002bdd, - 0x00002c10, 0x00002c33, 0x00002c79, 0x00002c92, - 0x00002cbd, 0x00002cd8, 0x00002d0d, 0x00002d1b, - 0x00002d25, 0x00002d5d, 0x00002d71, 0x00002ddc, - 0x00002e1c, 0x00002e45, 0x00002ebc, 0x00002f0d, - 0x00002f37, 0x00002f4d, 0x00002f9a, 0x00002fd4, - 0x00002fda, 0x00003016, 0x00003042, 0x0000308b, + 0x00002a9e, 0x00002ab8, 0x00002ad8, 0x00002b08, + 0x00002b1c, 0x00002b36, 0x00002b5c, 0x00002bd3, + 0x00002c10, 0x00002c43, 0x00002c66, 0x00002cac, + 0x00002cc5, 0x00002cf0, 0x00002d0b, 0x00002d40, + 0x00002d4e, 0x00002d58, 0x00002d90, 0x00002da4, + 0x00002e0f, 0x00002e4f, 0x00002e78, 0x00002eef, + 0x00002f40, 0x00002f6a, 0x00002f80, 0x00002fcd, + 0x00003007, 0x0000300d, 0x00003049, 0x00003075, // Entry E0 - FF - 0x000030cb, 0x0000311c, 0x0000312e, 0x00003148, - 0x00003168, 0x0000318d, 0x000031a1, 0x000031b6, - 0x000031cb, 0x000031de, 0x0000321d, 0x00003247, - 0x0000325f, 0x00003273, 0x00003296, 0x000032aa, - 0x000032c1, 0x000032c8, 0x000032cf, 0x000032d5, - 0x000032db, 0x000032ff, 0x00003322, 0x0000334a, - 0x0000336b, 0x00003386, 0x000033af, 0x000033d1, - 0x00003403, 0x0000349a, 0x00003510, 0x0000353b, + 0x000030be, 0x000030fe, 0x0000314f, 0x00003161, + 0x0000317b, 0x0000319b, 0x000031c0, 0x000031d4, + 0x000031e9, 0x000031fe, 0x00003211, 0x00003250, + 0x0000327a, 0x00003292, 0x000032a6, 0x000032c9, + 0x000032dd, 0x000032f4, 0x000032fb, 0x00003302, + 0x00003308, 0x0000330e, 0x00003332, 0x00003355, + 0x0000337d, 0x0000339e, 0x000033b9, 0x000033e2, + 0x00003404, 0x00003436, 0x000034cd, 0x00003543, // Entry 100 - 11F - 0x0000355e, 0x00003587, 0x000035b4, 0x000035e6, - 0x0000360c, 0x0000364d, 0x0000367d, 0x000036a0, - 0x000036c8, 0x00003700, 0x0000371f, 0x00003755, - 0x000037a6, 0x000037e2, 0x00003844, 0x00003850, - 0x0000385c, 0x0000386c, 0x0000387c, 0x0000388c, - 0x000038b3, 0x000038f4, 0x00003918, 0x00003929, - 0x0000394b, 0x0000395d, 0x0000398a, 0x000039b0, - 0x00003a0f, 0x00003aac, 0x00003afa, 0x00003b14, + 0x0000356e, 0x00003591, 0x000035ba, 0x000035e7, + 0x00003619, 0x0000363f, 0x00003680, 0x000036b0, + 0x000036d3, 0x000036fb, 0x00003733, 0x00003752, + 0x00003788, 0x000037d9, 0x00003815, 0x00003877, + 0x00003883, 0x0000388f, 0x0000389f, 0x000038af, + 0x000038bf, 0x000038e6, 0x00003927, 0x0000394b, + 0x0000395c, 0x0000397e, 0x00003990, 0x000039bd, + 0x000039e3, 0x00003a42, 0x00003adf, 0x00003b2d, // Entry 120 - 13F - 0x00003b32, 0x00003b92, -} // Size: 1184 bytes + 0x00003b47, 0x00003b65, 0x00003bc5, +} // Size: 1188 bytes -const enData string = "" + // Size: 15250 bytes +const enData string = "" + // Size: 15301 bytes "\x02Math Utils\x02Analyze and display the layout of batch sealer threads" + "\x02Analyze and display the layout of batch sealer threads on your CPU." + "\x0a\x0aIt provides detailed information about CPU utilization for batch" + @@ -546,110 +547,110 @@ const enData string = "" + // Size: 15250 bytes "ded to be used to verify PoSt compute performance.\x0aIt will not send a" + "ny messages to the chain. Since it can compute any deadline, output may " + "be incorrectly timed for the chain.\x02[deadline index]\x02partition to " + - "compute WindowPoSt for\x02Collection of debugging utilities\x02Supra con" + - "sensus testing utilities\x02Tool Box for Curio\x02Updated DB with messag" + - "e data missing from chain node\x02Update data for messages in wait queue" + - "\x02Manage unsealed data\x02Get information about unsealed data\x02List " + - "data from the sectors_unseal_pipeline and sectors_meta tables\x02Filter " + - "by storage provider ID\x02Output file path (default: stdout)\x02Set the " + - "target unseal state for a sector\x04\x00\x01\x0a\x80\x07\x02Set the targ" + - "et unseal state for a specific sector.\x0a : The storage pro" + - "vider ID\x0a : The sector number\x0a : " + - "The target state (true, false, or none)\x0a\x0a The unseal target stat" + - "e indicates to curio how an unsealed copy of the sector should be mainta" + - "ined.\x0a\x09 If the target state is true, curio will ensure that the " + - "sector is unsealed.\x0a\x09 If the target state is false, curio will e" + - "nsure that there is no unsealed copy of the sector.\x0a\x09 If the tar" + - "get state is none, curio will not change the current state of the sector" + - ".\x0a\x0a Currently when the curio will only start new unseal processe" + - "s when the target state changes from another state to true.\x0a\x0a Wh" + - "en the target state is false, and an unsealed sector file exists, the GC" + - " mark step will create a removal mark\x0a for the unsealed sector file" + - ". The file will only be removed after the removal mark is accepted.\x02C" + - "heck data integrity in unsealed sector files\x02Create a check task for " + - "a specific sector, wait for its completion, and output the result.\x0a " + - " : The storage provider ID\x0a : The sector n" + - "umber\x04\x00\x01 0\x02Use the arrow keys to navigate: ↓ ↑ → ←\x02This i" + - "nteractive tool creates a new miner actor and creates the basic configur" + - "ation layer for it.\x02This process is partially idempotent. Once a new " + - "miner actor has been created and subsequent steps fail, the user need to" + - " run 'curio config new-cluster < miner ID >' to finish the configuration" + - ".\x02This interactive tool sets up a non-Storage Provider cluster for pr" + - "otocols like PDP, Snark market, and others.\x02This setup does not creat" + - "e or migrate a Filecoin SP actor.\x02This interactive tool migrates lotu" + - "s-miner to Curio in 5 minutes.\x02Each step needs your confirmation and " + - "can be reversed. Press Ctrl+C to exit at any time.\x02Ctrl+C pressed in " + - "Terminal\x02I want to:\x02Migrate from existing Lotus-Miner\x02Create a " + - "new miner\x02Setup non-Storage Provider cluster\x02Aborting remaining st" + - "eps.\x02Lotus-Miner to Curio Migration.\x02Where should we save your dat" + - "abase config file?\x02Aborting migration.\x02Error writing file: %[1]s" + - "\x04\x00\x01 !\x02Try the web interface with %[1]s\x02For more servers, " + - "make /etc/curio.env with the curio.env database env and add the CURIO_LA" + - "YERS env to assign purposes.\x02You can now migrate your market node (%[" + - "1]s), if applicable.\x02Additional info is at http://docs.curiostorage.o" + - "rg\x02New Miner initialization complete.\x02Migrating lotus-miner config" + - ".toml to Curio in-database configuration.\x02Error getting API: %[1]s" + - "\x02could not get API info for FullNode: %[1]w\x02Error getting token: %" + - "[1]s\x02Unmigratable sectors found. Do you want to continue?\x02Yes, con" + - "tinue\x02No, abort\x02Error saving config to layer: %[1]s. Aborting Migr" + - "ation\x04\x00\x01 \x0f\x02Documentation:\x02The '%[1]s' layer stores com" + - "mon configuration. All curio instances can include it in their %[2]s arg" + - "ument.\x02You can add other layers for per-machine configuration changes" + - ".\x02Filecoin %[1]s channels: %[2]s and %[3]s\x02Increase reliability us" + - "ing redundancy: start multiple machines with at-least the post layer: 'c" + - "urio run --layers=post'\x02One database can serve multiple miner IDs: Ru" + - "n a migration for each lotus-miner.\x02Connected to Yugabyte. Schema is " + - "current.\x02Connected to Yugabyte\x02To start, ensure your sealing pipel" + - "ine is drained and shut-down lotus-miner.\x02Select the location of your" + - " lotus-miner config directory?\x02Other\x02Enter the path to the configu" + - "ration directory used by %[1]s\x04\x00\x01 '\x02No path provided, abando" + - "ning migration\x02Cannot read the config.toml file in the provided direc" + - "tory, Error: %[1]s\x02Could not create repo from directory: %[1]s. Abort" + - "ing migration\x02Could not lock miner repo. Your miner must be stopped: " + - "%[1]s\x0a Aborting migration\x02Read Miner Config\x04\x00\x01\x0a\x15" + - "\x02Step Complete: %[1]s\x02Initializing a new miner actor.\x02Enter the" + - " info to create a new miner\x02Owner Wallet: %[1]s\x02Worker Wallet: %[1" + - "]s\x02Sender Wallet: %[1]s\x02Sector Size: %[1]s\x02Continue to verify t" + - "he addresses and create a new miner actor.\x04\x00\x01 %\x02Miner creati" + - "on error occurred: %[1]s\x02Enter the owner address\x02No address provid" + - "ed\x02Failed to parse the address: %[1]s\x02Enter %[1]s address\x02Selec" + - "t the Sector Size\x0264 GiB\x0232 GiB\x028 MiB\x022 KiB\x04\x00\x01 \x1f" + - "\x02Sector selection failed: %[1]s\x02Failed to parse sector size: %[1]s" + - "\x02Failed to create the miner actor: %[1]s\x02Miner %[1]s created succe" + - "ssfully\x02Cannot reach the DB: %[1]s\x02Error connecting to full node A" + - "PI: %[1]s\x02Pre-initialization steps complete\x02Failed to generate ran" + - "dom bytes for secret: %[1]s\x02Please do not run guided-setup again as m" + - "iner creation is not idempotent. You need to run 'curio config new-clust" + - "er %[1]s' to finish the configuration\x02Please do not run guided-setup " + - "again. You need to run 'curio config new-cluster' manually to finish the" + - " configuration\x02Failed to get API info for FullNode: %[1]s\x02Failed t" + - "o create auth token: %[1]s\x02Failed to generate default config: %[1]s" + - "\x02Failed to insert config into database: %[1]s\x02Non-SP cluster confi" + - "guration created successfully\x02Non-SP cluster configuration complete" + - "\x02Configuration 'base' was updated to include this miner's address\x02" + - "Failed to load base config from database: %[1]s\x02Failed to parse base " + - "config: %[1]s\x02Failed to regenerate base config: %[1]s\x02Failed to in" + - "sert 'base' config layer in database: %[1]s\x02Non-SP cluster setup comp" + - "lete!\x02Your non-SP cluster has been configured successfully.\x02You ca" + - "n now start using Curio for protocols like PDP, Snark markets, and other" + - "s.\x02To start the cluster, run: curio run --layers basic-cluster\x02Ent" + - "er the info to connect to your Yugabyte database installation (https://d" + - "ownload.yugabyte.com/)\x02Host: %[1]s\x02Port: %[1]s\x02Username: %[1]s" + - "\x02Password: %[1]s\x02Database: %[1]s\x02Continue to connect and update" + - " schema.\x04\x00\x01 <\x02Database config error occurred, abandoning mig" + - "ration: %[1]s\x02Enter the Yugabyte database host(s)\x02No host provided" + - "\x02Enter the Yugabyte database %[1]s\x02No value provided\x02Error conn" + - "ecting to Yugabyte database: %[1]s\x02Migrating metadata for %[1]d secto" + - "rs.\x02Configuration 'base' was updated to include this miner's address " + - "(%[1]s) and its wallet setup.\x02Compare the configurations %[1]s to %[2" + - "]s. Changes between the miner IDs other than wallet addreses should be a" + - " new, minimal layer for runners that need it.\x02Configuration 'base' wa" + - "s created to resemble this lotus-miner's config.toml .\x04\x00\x01 \x15" + - "\x02Layer %[1]s created.\x04\x00\x01 \x19\x02To work with the config:" + - "\x02To run Curio: With machine or cgroup isolation, use the command (wit" + - "h example layer selection):" + "compute WindowPoSt for\x02Compute WindowPoSt vanilla proofs and verify t" + + "hem.\x02Collection of debugging utilities\x02Supra consensus testing uti" + + "lities\x02Tool Box for Curio\x02Updated DB with message data missing fro" + + "m chain node\x02Update data for messages in wait queue\x02Manage unseale" + + "d data\x02Get information about unsealed data\x02List data from the sect" + + "ors_unseal_pipeline and sectors_meta tables\x02Filter by storage provide" + + "r ID\x02Output file path (default: stdout)\x02Set the target unseal stat" + + "e for a sector\x04\x00\x01\x0a\x80\x07\x02Set the target unseal state fo" + + "r a specific sector.\x0a : The storage provider ID\x0a : The sector number\x0a : The target state (" + + "true, false, or none)\x0a\x0a The unseal target state indicates to cur" + + "io how an unsealed copy of the sector should be maintained.\x0a\x09 If" + + " the target state is true, curio will ensure that the sector is unsealed" + + ".\x0a\x09 If the target state is false, curio will ensure that there i" + + "s no unsealed copy of the sector.\x0a\x09 If the target state is none," + + " curio will not change the current state of the sector.\x0a\x0a Curren" + + "tly when the curio will only start new unseal processes when the target " + + "state changes from another state to true.\x0a\x0a When the target stat" + + "e is false, and an unsealed sector file exists, the GC mark step will cr" + + "eate a removal mark\x0a for the unsealed sector file. The file will on" + + "ly be removed after the removal mark is accepted.\x02Check data integrit" + + "y in unsealed sector files\x02Create a check task for a specific sector," + + " wait for its completion, and output the result.\x0a : The s" + + "torage provider ID\x0a : The sector number\x04\x00\x01 " + + "0\x02Use the arrow keys to navigate: ↓ ↑ → ←\x02This interactive tool cr" + + "eates a new miner actor and creates the basic configuration layer for it" + + ".\x02This process is partially idempotent. Once a new miner actor has be" + + "en created and subsequent steps fail, the user need to run 'curio config" + + " new-cluster < miner ID >' to finish the configuration.\x02This interact" + + "ive tool sets up a non-Storage Provider cluster for protocols like PDP, " + + "Snark market, and others.\x02This setup does not create or migrate a Fil" + + "ecoin SP actor.\x02This interactive tool migrates lotus-miner to Curio i" + + "n 5 minutes.\x02Each step needs your confirmation and can be reversed. P" + + "ress Ctrl+C to exit at any time.\x02Ctrl+C pressed in Terminal\x02I want" + + " to:\x02Migrate from existing Lotus-Miner\x02Create a new miner\x02Setup" + + " non-Storage Provider cluster\x02Aborting remaining steps.\x02Lotus-Mine" + + "r to Curio Migration.\x02Where should we save your database config file?" + + "\x02Aborting migration.\x02Error writing file: %[1]s\x04\x00\x01 !\x02Tr" + + "y the web interface with %[1]s\x02For more servers, make /etc/curio.env " + + "with the curio.env database env and add the CURIO_LAYERS env to assign p" + + "urposes.\x02You can now migrate your market node (%[1]s), if applicable." + + "\x02Additional info is at http://docs.curiostorage.org\x02New Miner init" + + "ialization complete.\x02Migrating lotus-miner config.toml to Curio in-da" + + "tabase configuration.\x02Error getting API: %[1]s\x02could not get API i" + + "nfo for FullNode: %[1]w\x02Error getting token: %[1]s\x02Unmigratable se" + + "ctors found. Do you want to continue?\x02Yes, continue\x02No, abort\x02E" + + "rror saving config to layer: %[1]s. Aborting Migration\x04\x00\x01 \x0f" + + "\x02Documentation:\x02The '%[1]s' layer stores common configuration. All" + + " curio instances can include it in their %[2]s argument.\x02You can add " + + "other layers for per-machine configuration changes.\x02Filecoin %[1]s ch" + + "annels: %[2]s and %[3]s\x02Increase reliability using redundancy: start " + + "multiple machines with at-least the post layer: 'curio run --layers=post" + + "'\x02One database can serve multiple miner IDs: Run a migration for each" + + " lotus-miner.\x02Connected to Yugabyte. Schema is current.\x02Connected " + + "to Yugabyte\x02To start, ensure your sealing pipeline is drained and shu" + + "t-down lotus-miner.\x02Select the location of your lotus-miner config di" + + "rectory?\x02Other\x02Enter the path to the configuration directory used " + + "by %[1]s\x04\x00\x01 '\x02No path provided, abandoning migration\x02Cann" + + "ot read the config.toml file in the provided directory, Error: %[1]s\x02" + + "Could not create repo from directory: %[1]s. Aborting migration\x02Could" + + " not lock miner repo. Your miner must be stopped: %[1]s\x0a Aborting mig" + + "ration\x02Read Miner Config\x04\x00\x01\x0a\x15\x02Step Complete: %[1]s" + + "\x02Initializing a new miner actor.\x02Enter the info to create a new mi" + + "ner\x02Owner Wallet: %[1]s\x02Worker Wallet: %[1]s\x02Sender Wallet: %[1" + + "]s\x02Sector Size: %[1]s\x02Continue to verify the addresses and create " + + "a new miner actor.\x04\x00\x01 %\x02Miner creation error occurred: %[1]s" + + "\x02Enter the owner address\x02No address provided\x02Failed to parse th" + + "e address: %[1]s\x02Enter %[1]s address\x02Select the Sector Size\x0264 " + + "GiB\x0232 GiB\x028 MiB\x022 KiB\x04\x00\x01 \x1f\x02Sector selection fai" + + "led: %[1]s\x02Failed to parse sector size: %[1]s\x02Failed to create the" + + " miner actor: %[1]s\x02Miner %[1]s created successfully\x02Cannot reach " + + "the DB: %[1]s\x02Error connecting to full node API: %[1]s\x02Pre-initial" + + "ization steps complete\x02Failed to generate random bytes for secret: %[" + + "1]s\x02Please do not run guided-setup again as miner creation is not ide" + + "mpotent. You need to run 'curio config new-cluster %[1]s' to finish the " + + "configuration\x02Please do not run guided-setup again. You need to run '" + + "curio config new-cluster' manually to finish the configuration\x02Failed" + + " to get API info for FullNode: %[1]s\x02Failed to create auth token: %[1" + + "]s\x02Failed to generate default config: %[1]s\x02Failed to insert confi" + + "g into database: %[1]s\x02Non-SP cluster configuration created successfu" + + "lly\x02Non-SP cluster configuration complete\x02Configuration 'base' was" + + " updated to include this miner's address\x02Failed to load base config f" + + "rom database: %[1]s\x02Failed to parse base config: %[1]s\x02Failed to r" + + "egenerate base config: %[1]s\x02Failed to insert 'base' config layer in " + + "database: %[1]s\x02Non-SP cluster setup complete!\x02Your non-SP cluster" + + " has been configured successfully.\x02You can now start using Curio for " + + "protocols like PDP, Snark markets, and others.\x02To start the cluster, " + + "run: curio run --layers basic-cluster\x02Enter the info to connect to yo" + + "ur Yugabyte database installation (https://download.yugabyte.com/)\x02Ho" + + "st: %[1]s\x02Port: %[1]s\x02Username: %[1]s\x02Password: %[1]s\x02Databa" + + "se: %[1]s\x02Continue to connect and update schema.\x04\x00\x01 <\x02Dat" + + "abase config error occurred, abandoning migration: %[1]s\x02Enter the Yu" + + "gabyte database host(s)\x02No host provided\x02Enter the Yugabyte databa" + + "se %[1]s\x02No value provided\x02Error connecting to Yugabyte database: " + + "%[1]s\x02Migrating metadata for %[1]d sectors.\x02Configuration 'base' w" + + "as updated to include this miner's address (%[1]s) and its wallet setup." + + "\x02Compare the configurations %[1]s to %[2]s. Changes between the miner" + + " IDs other than wallet addreses should be a new, minimal layer for runne" + + "rs that need it.\x02Configuration 'base' was created to resemble this lo" + + "tus-miner's config.toml .\x04\x00\x01 \x15\x02Layer %[1]s created.\x04" + + "\x00\x01 \x19\x02To work with the config:\x02To run Curio: With machine " + + "or cgroup isolation, use the command (with example layer selection):" -var koIndex = []uint32{ // 290 elements +var koIndex = []uint32{ // 291 elements // Entry 0 - 1F 0x00000000, 0x00000014, 0x0000004e, 0x00000168, 0x00000181, 0x000002b1, 0x00000328, 0x0000033a, @@ -697,43 +698,43 @@ var koIndex = []uint32{ // 290 elements 0x00002455, 0x00002476, 0x000024ec, 0x00002596, // Entry A0 - BF 0x000025ba, 0x000025dc, 0x00002615, 0x00002707, - 0x0000271a, 0x0000273c, 0x0000275a, 0x0000275a, - 0x0000276e, 0x000027d6, 0x00002812, 0x00002830, - 0x00002862, 0x000028a9, 0x000028d0, 0x00002900, - 0x00002929, 0x00002d09, 0x00002d3f, 0x00002df3, - 0x00002e37, 0x00002eb4, 0x00002fb4, 0x0000302b, - 0x00003086, 0x000030d3, 0x0000314e, 0x0000316f, - 0x00003181, 0x000031aa, 0x000031c5, 0x000031e0, + 0x0000271a, 0x0000273c, 0x0000273c, 0x0000275a, + 0x0000275a, 0x0000276e, 0x000027d6, 0x00002812, + 0x00002830, 0x00002862, 0x000028a9, 0x000028d0, + 0x00002900, 0x00002929, 0x00002d09, 0x00002d3f, + 0x00002df3, 0x00002e37, 0x00002eb4, 0x00002fb4, + 0x0000302b, 0x00003086, 0x000030d3, 0x0000314e, + 0x0000316f, 0x00003181, 0x000031aa, 0x000031c5, // Entry C0 - DF - 0x00003205, 0x00003228, 0x0000326e, 0x00003289, - 0x000032a5, 0x000032e4, 0x0000339a, 0x000033ea, - 0x0000342a, 0x00003450, 0x000034a9, 0x000034c8, - 0x00003504, 0x00003534, 0x00003584, 0x00003590, - 0x000035a2, 0x000035fa, 0x00003607, 0x0000368d, - 0x000036df, 0x00003706, 0x000037a2, 0x00003834, - 0x00003875, 0x0000388b, 0x000038f6, 0x00003945, - 0x0000394c, 0x00003994, 0x000039e6, 0x00003a40, + 0x000031e0, 0x00003205, 0x00003228, 0x0000326e, + 0x00003289, 0x000032a5, 0x000032e4, 0x0000339a, + 0x000033ea, 0x0000342a, 0x00003450, 0x000034a9, + 0x000034c8, 0x00003504, 0x00003534, 0x00003584, + 0x00003590, 0x000035a2, 0x000035fa, 0x00003607, + 0x0000368d, 0x000036df, 0x00003706, 0x000037a2, + 0x00003834, 0x00003875, 0x0000388b, 0x000038f6, + 0x00003945, 0x0000394c, 0x00003994, 0x000039e6, // Entry E0 - FF - 0x00003aaa, 0x00003b3b, 0x00003b53, 0x00003b6d, - 0x00003b91, 0x00003bc4, 0x00003bdc, 0x00003bf4, - 0x00003c0c, 0x00003c21, 0x00003c78, 0x00003ca3, - 0x00003cbb, 0x00003ce2, 0x00003d05, 0x00003d19, - 0x00003d2e, 0x00003d35, 0x00003d3c, 0x00003d42, - 0x00003d48, 0x00003d69, 0x00003d93, 0x00003db9, - 0x00003df2, 0x00003e2a, 0x00003e62, 0x00003e81, - 0x00003ecd, 0x00003f8b, 0x0000401e, 0x0000405c, + 0x00003a40, 0x00003aaa, 0x00003b3b, 0x00003b53, + 0x00003b6d, 0x00003b91, 0x00003bc4, 0x00003bdc, + 0x00003bf4, 0x00003c0c, 0x00003c21, 0x00003c78, + 0x00003ca3, 0x00003cbb, 0x00003ce2, 0x00003d05, + 0x00003d19, 0x00003d2e, 0x00003d35, 0x00003d3c, + 0x00003d42, 0x00003d48, 0x00003d69, 0x00003d93, + 0x00003db9, 0x00003df2, 0x00003e2a, 0x00003e62, + 0x00003e81, 0x00003ecd, 0x00003f8b, 0x0000401e, // Entry 100 - 11F - 0x00004091, 0x000040b4, 0x000040ff, 0x00004143, - 0x00004165, 0x000041b5, 0x0000420a, 0x0000424d, - 0x0000428c, 0x000042e8, 0x0000430b, 0x00004349, - 0x000043a8, 0x000043fa, 0x00004468, 0x00004479, - 0x00004487, 0x0000449f, 0x000044b3, 0x000044cd, - 0x000044f7, 0x0000455a, 0x00004596, 0x000045c0, - 0x000045f8, 0x0000461c, 0x00004670, 0x000046a8, - 0x00004721, 0x000047db, 0x00004832, 0x00004861, + 0x0000405c, 0x00004091, 0x000040b4, 0x000040ff, + 0x00004143, 0x00004165, 0x000041b5, 0x0000420a, + 0x0000424d, 0x0000428c, 0x000042e8, 0x0000430b, + 0x00004349, 0x000043a8, 0x000043fa, 0x00004468, + 0x00004479, 0x00004487, 0x0000449f, 0x000044b3, + 0x000044cd, 0x000044f7, 0x0000455a, 0x00004596, + 0x000045c0, 0x000045f8, 0x0000461c, 0x00004670, + 0x000046a8, 0x00004721, 0x000047db, 0x00004832, // Entry 120 - 13F - 0x00004888, 0x00004914, -} // Size: 1184 bytes + 0x00004861, 0x00004888, 0x00004914, +} // Size: 1188 bytes const koData string = "" + // Size: 18708 bytes "\x02수학 유틸리티\x02배치 실러 스레드의 레이아웃 분석 및 표시\x02CPU에서 배치 실러 스레드의 레이아웃을 분석하고 표시" + @@ -881,7 +882,7 @@ const koData string = "" + // Size: 18708 bytes "1]s가 생성되었습니다.\x04\x00\x01 \x22\x02구성 파일을 사용하려면:\x02Curio를 실행하려면: 기계 또는 c" + "group 격리를 사용하여 다음 명령을 사용하세요 (예제 레이어 선택과 함께):" -var zhIndex = []uint32{ // 290 elements +var zhIndex = []uint32{ // 291 elements // Entry 0 - 1F 0x00000000, 0x0000000d, 0x00000038, 0x000000e6, 0x000000ff, 0x000001d8, 0x00000229, 0x0000023b, @@ -929,43 +930,43 @@ var zhIndex = []uint32{ // 290 elements 0x00001bcf, 0x00001be5, 0x00001c43, 0x00001cc8, // Entry A0 - BF 0x00001cef, 0x00001d1d, 0x00001d51, 0x00001dfe, - 0x00001e13, 0x00001e2f, 0x00001e42, 0x00001e42, - 0x00001e52, 0x00001e8c, 0x00001eb1, 0x00001eca, - 0x00001ee9, 0x00001f2c, 0x00001f49, 0x00001f77, - 0x00001f99, 0x0000229a, 0x000022cb, 0x00002351, - 0x00002384, 0x000023dc, 0x00002485, 0x000024d8, - 0x00002524, 0x0000256c, 0x000025bb, 0x000025d4, - 0x000025e1, 0x00002601, 0x0000261a, 0x00002639, + 0x00001e13, 0x00001e2f, 0x00001e2f, 0x00001e42, + 0x00001e42, 0x00001e52, 0x00001e8c, 0x00001eb1, + 0x00001eca, 0x00001ee9, 0x00001f2c, 0x00001f49, + 0x00001f77, 0x00001f99, 0x0000229a, 0x000022cb, + 0x00002351, 0x00002384, 0x000023dc, 0x00002485, + 0x000024d8, 0x00002524, 0x0000256c, 0x000025bb, + 0x000025d4, 0x000025e1, 0x00002601, 0x0000261a, // Entry C0 - DF - 0x0000264f, 0x0000266c, 0x000026a9, 0x000026b9, - 0x000026d3, 0x000026f9, 0x00002780, 0x000027c1, - 0x000027f4, 0x00002810, 0x00002855, 0x00002872, - 0x0000289b, 0x000028b9, 0x000028ed, 0x000028fd, - 0x0000290a, 0x00002943, 0x00002952, 0x000029ac, - 0x000029e9, 0x00002a11, 0x00002a70, 0x00002ac0, - 0x00002aed, 0x00002b02, 0x00002b4d, 0x00002b7d, - 0x00002b84, 0x00002bae, 0x00002bd2, 0x00002c16, + 0x00002639, 0x0000264f, 0x0000266c, 0x000026a9, + 0x000026b9, 0x000026d3, 0x000026f9, 0x00002780, + 0x000027c1, 0x000027f4, 0x00002810, 0x00002855, + 0x00002872, 0x0000289b, 0x000028b9, 0x000028ed, + 0x000028fd, 0x0000290a, 0x00002943, 0x00002952, + 0x000029ac, 0x000029e9, 0x00002a11, 0x00002a70, + 0x00002ac0, 0x00002aed, 0x00002b02, 0x00002b4d, + 0x00002b7d, 0x00002b84, 0x00002bae, 0x00002bd2, // Entry E0 - FF - 0x00002c48, 0x00002c91, 0x00002ca4, 0x00002cbe, - 0x00002cdd, 0x00002d02, 0x00002d19, 0x00002d2d, - 0x00002d44, 0x00002d58, 0x00002d89, 0x00002dae, - 0x00002dc4, 0x00002dd4, 0x00002dee, 0x00002e02, - 0x00002e15, 0x00002e1c, 0x00002e23, 0x00002e29, - 0x00002e2f, 0x00002e4e, 0x00002e6e, 0x00002e8e, - 0x00002ea8, 0x00002ec5, 0x00002ef6, 0x00002f0f, - 0x00002f38, 0x00002fc5, 0x0000302a, 0x00003056, + 0x00002c16, 0x00002c48, 0x00002c91, 0x00002ca4, + 0x00002cbe, 0x00002cdd, 0x00002d02, 0x00002d19, + 0x00002d2d, 0x00002d44, 0x00002d58, 0x00002d89, + 0x00002dae, 0x00002dc4, 0x00002dd4, 0x00002dee, + 0x00002e02, 0x00002e15, 0x00002e1c, 0x00002e23, + 0x00002e29, 0x00002e2f, 0x00002e4e, 0x00002e6e, + 0x00002e8e, 0x00002ea8, 0x00002ec5, 0x00002ef6, + 0x00002f0f, 0x00002f38, 0x00002fc5, 0x0000302a, // Entry 100 - 11F - 0x00003076, 0x00003096, 0x000030bc, 0x000030dc, - 0x000030f6, 0x00003129, 0x00003156, 0x00003177, - 0x0000319d, 0x000031ce, 0x000031eb, 0x00003211, - 0x00003258, 0x00003297, 0x000032f1, 0x00003300, - 0x0000330f, 0x00003321, 0x00003330, 0x00003342, - 0x00003361, 0x00003399, 0x000033be, 0x000033ce, - 0x000033ec, 0x000033f9, 0x00003425, 0x0000344f, - 0x000034a0, 0x00003522, 0x00003569, 0x00003583, + 0x00003056, 0x00003076, 0x00003096, 0x000030bc, + 0x000030dc, 0x000030f6, 0x00003129, 0x00003156, + 0x00003177, 0x0000319d, 0x000031ce, 0x000031eb, + 0x00003211, 0x00003258, 0x00003297, 0x000032f1, + 0x00003300, 0x0000330f, 0x00003321, 0x00003330, + 0x00003342, 0x00003361, 0x00003399, 0x000033be, + 0x000033ce, 0x000033ec, 0x000033f9, 0x00003425, + 0x0000344f, 0x000034a0, 0x00003522, 0x00003569, // Entry 120 - 13F - 0x0000359b, 0x000035f2, -} // Size: 1184 bytes + 0x00003583, 0x0000359b, 0x000035f2, +} // Size: 1188 bytes const zhData string = "" + // Size: 13810 bytes "\x02数学工具\x02分析并显示批量封装线程的布局\x02分析并显示CPU上批量封装线程的布局。\x0a\x0a提供有关批量封装操作的CPU利" + @@ -1076,4 +1077,4 @@ const zhData string = "" + // Size: 13810 bytes "\x02层%[1]s已创建。\x04\x00\x01 \x13\x02要使用配置:\x02运行Curio:使用机器或cgroup隔离,使用命令(" + "附带示例层选择):" - // Total table size 51320 bytes (50KiB); checksum: 3F8F66C5 + // Total table size 51383 bytes (50KiB); checksum: 6D7A9409 diff --git a/cmd/curio/internal/translations/locales/en/out.gotext.json b/cmd/curio/internal/translations/locales/en/out.gotext.json index 6000e5509..4b4e43bdc 100644 --- a/cmd/curio/internal/translations/locales/en/out.gotext.json +++ b/cmd/curio/internal/translations/locales/en/out.gotext.json @@ -1156,6 +1156,13 @@ "translatorComment": "Copied from source.", "fuzzy": true }, + { + "id": "Compute WindowPoSt vanilla proofs and verify them.", + "message": "Compute WindowPoSt vanilla proofs and verify them.", + "translation": "Compute WindowPoSt vanilla proofs and verify them.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, { "id": "Collection of debugging utilities", "message": "Collection of debugging utilities", diff --git a/cmd/curio/internal/translations/locales/ko/out.gotext.json b/cmd/curio/internal/translations/locales/ko/out.gotext.json index 1c8273db1..c36f8443e 100644 --- a/cmd/curio/internal/translations/locales/ko/out.gotext.json +++ b/cmd/curio/internal/translations/locales/ko/out.gotext.json @@ -1,6 +1,12 @@ { "language": "ko", "messages": [ + { + "id": "Compute WindowPoSt vanilla proofs and verify them.", + "translation": "", + "message": "Compute WindowPoSt vanilla proofs and verify them.", + "placeholder": null + }, { "id": "Supra consensus testing utilities", "translation": "", diff --git a/cmd/curio/internal/translations/locales/zh/out.gotext.json b/cmd/curio/internal/translations/locales/zh/out.gotext.json index ccb099c38..b58d6a188 100644 --- a/cmd/curio/internal/translations/locales/zh/out.gotext.json +++ b/cmd/curio/internal/translations/locales/zh/out.gotext.json @@ -1,6 +1,12 @@ { "language": "zh", "messages": [ + { + "id": "Compute WindowPoSt vanilla proofs and verify them.", + "translation": "", + "message": "Compute WindowPoSt vanilla proofs and verify them.", + "placeholder": null + }, { "id": "Supra consensus testing utilities", "translation": "", diff --git a/cmd/curio/test-cli.go b/cmd/curio/test-cli.go index 63c4ae4f8..94401b638 100644 --- a/cmd/curio/test-cli.go +++ b/cmd/curio/test-cli.go @@ -1,26 +1,37 @@ package main import ( + "bytes" "context" "database/sql" "encoding/json" "errors" "fmt" "os" + "runtime" + "sync" "time" "github.com/samber/lo" + "github.com/snadrus/must" "github.com/urfave/cli/v2" "github.com/yugabyte/pgx/v5" "golang.org/x/xerrors" + ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/go-state-types/proof" "github.com/filecoin-project/curio/cmd/curio/internal/translations" "github.com/filecoin-project/curio/cmd/curio/tasks" "github.com/filecoin-project/curio/deps" "github.com/filecoin-project/curio/harmony/harmonydb" + cuproof "github.com/filecoin-project/curio/lib/proof" + "github.com/filecoin-project/curio/lib/storiface" ) var testCmd = &cli.Command{ @@ -44,6 +55,7 @@ var wdPostCmd = &cli.Command{ Subcommands: []*cli.Command{ wdPostHereCmd, wdPostTaskCmd, + wdPostVanillaCmd, }, } @@ -217,6 +229,10 @@ It will not send any messages to the chain. Since it can compute any deadline, o Usage: translations.T("partition to compute WindowPoSt for"), Value: 0, }, + &cli.StringFlag{ + Name: "addr", + Usage: translations.T("SP ID to compute WindowPoSt for"), + }, }, Action: func(cctx *cli.Context) error { @@ -226,6 +242,14 @@ It will not send any messages to the chain. Since it can compute any deadline, o return err } + var spAddr address.Address + if cctx.IsSet("addr") { + spAddr, err = address.NewFromString(cctx.String("addr")) + if err != nil { + return xerrors.Errorf("invalid sp address: %w", err) + } + } + wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := tasks.WindowPostScheduler( ctx, deps.Cfg.Fees, deps.Cfg.Proving, deps.Chain, deps.Verif, nil, nil, nil, deps.As, deps.Maddrs, deps.DB, deps.Stor, deps.Si, deps.Cfg.Subsystems.WindowPostMaxTasks) @@ -245,6 +269,10 @@ It will not send any messages to the chain. Since it can compute any deadline, o di := dline.NewInfo(head.Height(), cctx.Uint64("deadline"), 0, 0, 0, 10 /*challenge window*/, 0, 0) for maddr := range deps.Maddrs { + if spAddr != address.Undef && address.Address(maddr) != spAddr { + continue + } + out, err := wdPostTask.DoPartition(ctx, head, address.Address(maddr), di, cctx.Uint64("partition"), true) if err != nil { fmt.Println("Error computing WindowPoSt for miner", maddr, err) @@ -261,3 +289,223 @@ It will not send any messages to the chain. Since it can compute any deadline, o return nil }, } + +var wdPostVanillaCmd = &cli.Command{ + Name: "vanilla", + Usage: translations.T("Compute WindowPoSt vanilla proofs and verify them."), + Flags: []cli.Flag{ + &cli.Uint64Flag{ + Name: "deadline", + Usage: translations.T("deadline to compute WindowPoSt for "), + Value: 0, + }, + &cli.StringSliceFlag{ + Name: "layers", + Usage: translations.T("list of layers to be interpreted (atop defaults). Default: base"), + }, + &cli.Uint64Flag{ + Name: "partition", + Usage: translations.T("partition to compute WindowPoSt for"), + Value: 0, + }, + &cli.StringFlag{ + Name: "addr", + Usage: translations.T("SP ID to compute WindowPoSt for"), + }, + }, + Action: func(cctx *cli.Context) error { + start := time.Now() + + ctx := context.Background() + deps, err := deps.GetDeps(ctx, cctx) + if err != nil { + return err + } + + var spAddr address.Address + if cctx.IsSet("addr") { + spAddr, err = address.NewFromString(cctx.String("addr")) + if err != nil { + return xerrors.Errorf("invalid sp address: %w", err) + } + } + + wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := tasks.WindowPostScheduler( + ctx, deps.Cfg.Fees, deps.Cfg.Proving, deps.Chain, deps.Verif, nil, nil, nil, + deps.As, deps.Maddrs, deps.DB, deps.Stor, deps.Si, deps.Cfg.Subsystems.WindowPostMaxTasks) + if err != nil { + return err + } + _, _ = wdPoStSubmitTask, derlareRecoverTask + + if len(deps.Maddrs) == 0 { + return errors.New("no miners to compute WindowPoSt for") + } + head, err := deps.Chain.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("failed to get chain head: %w", err) + } + + di := dline.NewInfo(head.Height(), cctx.Uint64("deadline"), 0, 0, 0, 10 /*challenge window*/, 0, 0) + + for maddr := range deps.Maddrs { + if spAddr != address.Undef && address.Address(maddr) != spAddr { + continue + } + + maddr := address.Address(maddr) + mid, err := address.IDFromAddress(maddr) + if err != nil { + return xerrors.Errorf("failed to get miner id: %w", err) + } + + buf := new(bytes.Buffer) + if err := maddr.MarshalCBOR(buf); err != nil { + return xerrors.Errorf("failed to marshal address to cbor: %w", err) + } + + headTs, err := deps.Chain.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("getting current head: %w", err) + } + + rand, err := deps.Chain.StateGetRandomnessFromBeacon(ctx, crypto.DomainSeparationTag_WindowedPoStChallengeSeed, di.Challenge, buf.Bytes(), headTs.Key()) + if err != nil { + return xerrors.Errorf("failed to get chain randomness from beacon for window post (ts=%d; deadline=%d): %w", headTs.Height(), di, err) + } + rand[31] &= 0x3f + + parts, err := deps.Chain.StateMinerPartitions(ctx, maddr, di.Index, headTs.Key()) + if err != nil { + return xerrors.Errorf("getting partitions: %w", err) + } + + if cctx.Uint64("partition") >= uint64(len(parts)) { + return xerrors.Errorf("invalid partition: %d", cctx.Uint64("partition")) + } + + partition := parts[cctx.Uint64("partition")] + + log.Infow("Getting sectors for proof", "partition", cctx.Uint64("partition"), "liveSectors", must.One(partition.LiveSectors.Count()), "allSectors", must.One(partition.AllSectors.Count())) + + xsinfos, err := wdPostTask.SectorsForProof(ctx, maddr, partition.LiveSectors, partition.AllSectors, headTs) + if err != nil { + return xerrors.Errorf("getting sectors for proof: %w", err) + } + + if len(xsinfos) == 0 { + return xerrors.Errorf("no sectors to prove") + } + + nv, err := deps.Chain.StateNetworkVersion(ctx, headTs.Key()) + if err != nil { + return xerrors.Errorf("getting network version: %w", err) + } + + ppt, err := xsinfos[0].SealProof.RegisteredWindowPoStProofByNetworkVersion(nv) + if err != nil { + return xerrors.Errorf("failed to get window post type: %w", err) + } + + sectorNums := make([]abi.SectorNumber, len(xsinfos)) + sectorMap := make(map[abi.SectorNumber]proof.ExtendedSectorInfo) + for i, s := range xsinfos { + sectorNums[i] = s.SectorNumber + sectorMap[s.SectorNumber] = s + } + + postChallenges, err := ffi.GeneratePoStFallbackSectorChallenges(ppt, abi.ActorID(mid), abi.PoStRandomness(rand), sectorNums) + if err != nil { + return xerrors.Errorf("generating fallback challenges: %w", err) + } + + maxPartitionSize, err := builtin.PoStProofWindowPoStPartitionSectors(ppt) + if err != nil { + return xerrors.Errorf("get sectors count of partition failed:%+v", err) + } + + sectors := make([]storiface.PostSectorChallenge, 0) + for i := range postChallenges.Sectors { + snum := postChallenges.Sectors[i] + sinfo := sectorMap[snum] + + sectors = append(sectors, storiface.PostSectorChallenge{ + SealProof: sinfo.SealProof, + SectorNumber: snum, + SealedCID: sinfo.SealedCID, + Challenge: postChallenges.Challenges[snum], + Update: sinfo.SectorKey != nil, + }) + } + elapsed := time.Since(start) + log.Infow("Generated fallback challenges", "error", err, "elapsed", elapsed, "sectors", len(sectors), "maxPartitionSize", maxPartitionSize, "postChallenges", len(postChallenges.Challenges)) + + var outLk sync.Mutex + + wg := sync.WaitGroup{} + wg.Add(len(sectors)) + throttle := make(chan struct{}, runtime.NumCPU()) + + for i, s := range sectors { + go func(i int, s storiface.PostSectorChallenge) { + + throttle <- struct{}{} + defer func() { + <-throttle + }() + defer wg.Done() + + start := time.Now() + vanilla, err := deps.Stor.GenerateSingleVanillaProof(ctx, abi.ActorID(mid), s, ppt) + elapsed := time.Since(start) + + if err != nil || vanilla == nil { + outLk.Lock() + log.Errorw("Generated vanilla proof for sector", "sector", s.SectorNumber, "of", fmt.Sprintf("%d/%d", i+1, len(sectors)), "error", err, "elapsed", elapsed) + log.Errorw("reading PoSt challenge for sector", "sector", s.SectorNumber, "vlen", len(vanilla), "error", err) + outLk.Unlock() + return + } + + // verify vproofs + pvi := proof.WindowPoStVerifyInfo{ + Randomness: abi.PoStRandomness(rand), + Proofs: []proof.PoStProof{}, + ChallengedSectors: []proof.SectorInfo{}, + } + pvi.Proofs = append(pvi.Proofs, proof.PoStProof{ + PoStProof: ppt, + ProofBytes: vanilla, + }) + for _, s := range sectors { + pvi.ChallengedSectors = append(pvi.ChallengedSectors, proof.SectorInfo{ + SealProof: s.SealProof, + SectorNumber: s.SectorNumber, + SealedCID: s.SealedCID, + }) + } + + verifyStart := time.Now() + ok, err := cuproof.VerifyWindowPoStVanilla(pvi) + verifyElapsed := time.Since(verifyStart) + + outLk.Lock() + if elapsed.Seconds() > 2 { + log.Warnw("Generated vanilla proof for sector (slow)", "sector", s.SectorNumber, "of", fmt.Sprintf("%d/%d", i+1, len(sectors)), "elapsed", elapsed) + } else { + log.Debugw("Generated vanilla proof for sector", "sector", s.SectorNumber, "of", fmt.Sprintf("%d/%d", i+1, len(sectors)), "elapsed", elapsed) + } + if err != nil || !ok { + log.Errorw("Verified window post vanilla proofs", "error", err, "elapsed", verifyElapsed, "ok", ok) + } else { + log.Debugw("Verified window post vanilla proofs", "elapsed", verifyElapsed, "ok", ok) + } + outLk.Unlock() + }(i, s) + } + wg.Wait() + } + + return nil + }, +} diff --git a/documentation/en/curio-cli/curio.md b/documentation/en/curio-cli/curio.md index 29446ed77..ea4f50c46 100644 --- a/documentation/en/curio-cli/curio.md +++ b/documentation/en/curio-cli/curio.md @@ -511,6 +511,7 @@ USAGE: COMMANDS: here, cli Compute WindowPoSt for performance and configuration testing. task, scheduled, schedule, async, asynchronous Test the windowpost scheduler by running it on the next available curio. If tasks fail all retries, you will need to ctrl+c to exit. + vanilla Compute WindowPoSt vanilla proofs and verify them. help, h Shows a list of commands or help for one command OPTIONS: @@ -533,6 +534,7 @@ OPTIONS: --deadline value deadline to compute WindowPoSt for (default: 0) --layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base --partition value partition to compute WindowPoSt for (default: 0) + --addr value SP ID to compute WindowPoSt for --help, -h show help ``` @@ -551,6 +553,22 @@ OPTIONS: --help, -h show help ``` +#### curio test window-post vanilla +``` +NAME: + curio test window-post vanilla - Compute WindowPoSt vanilla proofs and verify them. + +USAGE: + curio test window-post vanilla [command options] + +OPTIONS: + --deadline value deadline to compute WindowPoSt for (default: 0) + --layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base + --partition value partition to compute WindowPoSt for (default: 0) + --addr value SP ID to compute WindowPoSt for + --help, -h show help +``` + ### curio test debug ``` NAME: diff --git a/lib/proof/post_vproof_verify.go b/lib/proof/post_vproof_verify.go index cb34fd382..c99a302de 100644 --- a/lib/proof/post_vproof_verify.go +++ b/lib/proof/post_vproof_verify.go @@ -74,16 +74,20 @@ func verifyWindowPoStVanilla( } // Partition if the number of sectors is large - partitions, err := partitionFallbackPoStSectorProofs(cfg, sectorProofs) + /* partitions, err := partitionFallbackPoStSectorProofs(cfg, sectorProofs) if err != nil { return false, xerrors.Errorf("failed partitioning: %w", err) + } */ + if len(sectorProofs) != 1 { + return false, xerrors.Errorf("expected 1 proof, multi-sector support todo, got %d", len(sectorProofs)) } + partitions := [][]FallbackPoStSectorProof{sectorProofs} for pIndex, partition := range partitions { var eg errgroup.Group - for i, sec := range partition { - i := i + for _, sec := range partition { + //i := i sec := sec eg.Go(func() error { @@ -115,7 +119,6 @@ func verifyWindowPoStVanilla( } } - fmt.Println(i) return nil }) } @@ -136,6 +139,7 @@ func partitionFallbackPoStSectorProofs(cfg *PoStConfig, all []FallbackPoStSector } out := make([][]FallbackPoStSectorProof, 0, partitionCount) + partSizes := make([]int, partitionCount) start := 0 for i := 0; i < partitionCount; i++ { end := start + cfg.SectorCount @@ -155,7 +159,11 @@ func partitionFallbackPoStSectorProofs(cfg *PoStConfig, all []FallbackPoStSector chunk = append(chunk, pad...) } out = append(out, chunk) + partSizes[i] = len(chunk) } + + log.Infow("partitioned fallback PoSt sector proofs", "partitionCount", partitionCount, "partSizes", partSizes) + return out, nil } diff --git a/tasks/window/compute_do.go b/tasks/window/compute_do.go index 9a7c304ec..3f470c55c 100644 --- a/tasks/window/compute_do.go +++ b/tasks/window/compute_do.go @@ -103,7 +103,7 @@ func (t *WdPostTask) DoPartition(ctx context.Context, ts *types.TipSet, maddr ad return nil, xerrors.Errorf("copy toProve: %w", err) } - xsinfos, err := t.sectorsForProof(ctx, maddr, good, partition.AllSectors, ts) + xsinfos, err := t.SectorsForProof(ctx, maddr, good, partition.AllSectors, ts) if err != nil { return nil, xerrors.Errorf("getting sorted sector info: %w", err) } @@ -313,7 +313,7 @@ func checkSectors(ctx context.Context, api CheckSectorsAPI, ft FaultTracker, return sbf, nil } -func (t *WdPostTask) sectorsForProof(ctx context.Context, maddr address.Address, goodSectors, allSectors bitfield.BitField, ts *types.TipSet) ([]proof7.ExtendedSectorInfo, error) { +func (t *WdPostTask) SectorsForProof(ctx context.Context, maddr address.Address, goodSectors, allSectors bitfield.BitField, ts *types.TipSet) ([]proof7.ExtendedSectorInfo, error) { sset, err := t.api.StateMinerSectors(ctx, maddr, &goodSectors, ts.Key()) if err != nil { return nil, err From 4f2ef5e3466b52ca3e4eb0871204402acc87b756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 8 Oct 2025 00:36:56 +0200 Subject: [PATCH 52/67] supra: live duration-so-far metric --- tasks/sealsupra/metrics.go | 7 +++++++ tasks/sealsupra/phase.go | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/tasks/sealsupra/metrics.go b/tasks/sealsupra/metrics.go index bf3fb93a1..e1a913f3e 100644 --- a/tasks/sealsupra/metrics.go +++ b/tasks/sealsupra/metrics.go @@ -17,6 +17,7 @@ var SupraSealMeasures = struct { PhaseLockCount *stats.Int64Measure PhaseWaitingCount *stats.Int64Measure PhaseAvgDuration *stats.Float64Measure + PhaseDurationSoFar *stats.Float64Measure // NVMe Health measures NVMeTemperature *stats.Float64Measure @@ -37,6 +38,7 @@ var SupraSealMeasures = struct { PhaseLockCount: stats.Int64(pre+"phase_lock_count", "Number of active locks in each phase", stats.UnitDimensionless), PhaseWaitingCount: stats.Int64(pre+"phase_waiting_count", "Number of goroutines waiting for a phase lock", stats.UnitDimensionless), PhaseAvgDuration: stats.Float64(pre+"phase_avg_duration", "Average duration of each phase in seconds", stats.UnitSeconds), + PhaseDurationSoFar: stats.Float64(pre+"phase_duration_so_far", "Duration of the phase so far in seconds", stats.UnitSeconds), // NVMe Health measures NVMeTemperature: stats.Float64(pre+"nvme_temperature_celsius", "NVMe Temperature in Celsius", stats.UnitDimensionless), @@ -73,6 +75,11 @@ func init() { Aggregation: view.LastValue(), TagKeys: []tag.Key{phaseKey}, }, + &view.View{ + Measure: SupraSealMeasures.PhaseDurationSoFar, + Aggregation: view.LastValue(), + TagKeys: []tag.Key{phaseKey}, + }, // NVMe Health views &view.View{ Measure: SupraSealMeasures.NVMeTemperature, diff --git a/tasks/sealsupra/phase.go b/tasks/sealsupra/phase.go index d71eec772..24d6ba034 100644 --- a/tasks/sealsupra/phase.go +++ b/tasks/sealsupra/phase.go @@ -22,6 +22,8 @@ type pipelinePhase struct { waiting int64 ema float64 // Exponential Moving Average in seconds lastLockAt time.Time + + soFarUpdateCancel context.CancelFunc } func (p *pipelinePhase) Lock() { @@ -40,9 +42,29 @@ func (p *pipelinePhase) Lock() { SupraSealMeasures.PhaseWaitingCount.M(atomic.LoadInt64(&p.waiting))) p.lastLockAt = time.Now() + + ctx, updateCancel := context.WithCancel(context.Background()) + p.soFarUpdateCancel = updateCancel + + go func() { + for { + select { + case <-ctx.Done(): + return + case <-time.After(10 * time.Second): + duration := time.Since(p.lastLockAt) + durationSeconds := duration.Seconds() + + _ = stats.RecordWithTags(ctx, + []tag.Mutator{tag.Upsert(phaseKey, fmt.Sprintf("phase_%d", p.phaseNum))}, + SupraSealMeasures.PhaseDurationSoFar.M(durationSeconds)) + } + } + }() } func (p *pipelinePhase) Unlock() { + p.soFarUpdateCancel() duration := time.Since(p.lastLockAt) durationSeconds := duration.Seconds() From 8d632ee5d2136c230cb68049b49e62d0ee703013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 21 Oct 2025 12:00:37 +0200 Subject: [PATCH 53/67] webui: Content page --- web/api/webrpc/content.go | 54 ++++++++++++ web/static/pages/content/content.mjs | 125 +++++++++++++++++++++++++++ web/static/pages/content/index.html | 26 ++++++ web/static/ux/curio-ux.mjs | 8 ++ 4 files changed, 213 insertions(+) create mode 100644 web/api/webrpc/content.go create mode 100644 web/static/pages/content/content.mjs create mode 100644 web/static/pages/content/index.html diff --git a/web/api/webrpc/content.go b/web/api/webrpc/content.go new file mode 100644 index 000000000..02fa4b166 --- /dev/null +++ b/web/api/webrpc/content.go @@ -0,0 +1,54 @@ +package webrpc + +import ( + "context" + + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" +) + +// ContentInfo represents information about content location +type ContentInfo struct { + PieceCID string `json:"piece_cid"` + Offset uint64 `json:"offset"` + Size uint64 `json:"size"` + + Err string `json:"err"` +} + +// FindContentByCID finds content by CID +// This is a dummy implementation for now to get the frontend working +func (a *WebRPC) FindContentByCID(ctx context.Context, cs string) ([]ContentInfo, error) { + cid, err := cid.Parse(cs) + if err != nil { + return nil, err + } + + mh := cid.Hash() + + offsets, err := a.deps.IndexStore.PiecesContainingMultihash(ctx, mh) + if err != nil { + return nil, xerrors.Errorf("pieces containing multihash %s: %w", mh, err) + } + + var res []ContentInfo + for _, offset := range offsets { + off, err := a.deps.IndexStore.GetOffset(ctx, offset.PieceCid, mh) + if err != nil { + res = append(res, ContentInfo{ + PieceCID: offset.PieceCid.String(), + Offset: off, + Size: uint64(offset.BlockSize), + Err: err.Error(), + }) + continue + } + res = append(res, ContentInfo{ + PieceCID: offset.PieceCid.String(), + Offset: off, + Size: uint64(offset.BlockSize), + }) + } + + return res, nil +} diff --git a/web/static/pages/content/content.mjs b/web/static/pages/content/content.mjs new file mode 100644 index 000000000..3ed3dafd4 --- /dev/null +++ b/web/static/pages/content/content.mjs @@ -0,0 +1,125 @@ +import { LitElement, html, css } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; + +class ContentPage extends LitElement { + static properties = { + searchCid: { type: String }, + results: { type: Array }, + loading: { type: Boolean }, + error: { type: String } + }; + + constructor() { + super(); + this.searchCid = ''; + this.results = []; + this.loading = false; + this.error = ''; + } + + handleInput(e) { + this.searchCid = e.target.value; + } + + async handleFind() { + if (!this.searchCid.trim()) { + this.error = 'Please enter a CID'; + return; + } + + this.loading = true; + this.error = ''; + this.results = []; + + try { + const results = await RPCCall('FindContentByCID', [this.searchCid.trim()]); + this.results = results || []; + if (this.results.length === 0) { + this.error = 'No content found for this CID'; + } + } catch (err) { + console.error('Error finding content:', err); + this.error = `Error: ${err.message || err}`; + } finally { + this.loading = false; + } + } + + render() { + return html` + + + +
+

Find CID

+
+ + +
+ + ${this.error ? html` +
${this.error}
+ ` : ''} + + ${this.results.length > 0 ? html` +

Results

+ + + + + + + + + + ${this.results.map(item => html` + + + + + + `)} + +
Piece CIDOffsetSize
${item.piece_cid}${item.err ? html`${item.err}` : item.offset}${this.formatBytes(item.size)}
+ ` : ''} +
+ `; + } + + formatBytes(bytes) { + if (!bytes) return '0 Bytes'; + const k = 1024; + const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; + } + + static styles = css` + .search-container { + display: grid; + grid-template-columns: 1fr auto; + grid-column-gap: 0.75rem; + margin-bottom: 1rem; + } + `; +} + +customElements.define('content-page', ContentPage); diff --git a/web/static/pages/content/index.html b/web/static/pages/content/index.html new file mode 100644 index 000000000..6f79ccbd3 --- /dev/null +++ b/web/static/pages/content/index.html @@ -0,0 +1,26 @@ + + + + Content + + + + + + +
+
+
+

Content

+
+
+
+ +
+
+
+
+
+ + + diff --git a/web/static/ux/curio-ux.mjs b/web/static/ux/curio-ux.mjs index 904744d49..64ec6344d 100644 --- a/web/static/ux/curio-ux.mjs +++ b/web/static/ux/curio-ux.mjs @@ -246,6 +246,14 @@ class CurioUX extends LitElement { Wallets +
  • + + + + + Content + +
  • From 2d0a67afaeb2ccb6340addd6ae360d7a77524815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 23 Oct 2025 11:38:21 +0200 Subject: [PATCH 54/67] fix: Make kubo retrievals work (#724) * fix(retrieval): handle pathed IPFS retrieval style, add basic retrieval tests (#720) * ipni: Announce addresses with port * update lotus * make gen --------- Co-authored-by: Rod Vagg --- documentation/en/curio-cli/curio.md | 28 +- documentation/en/curio-cli/sptool.md | 16 +- go.mod | 213 +++++---- go.sum | 497 ++++++++++----------- itests/curio_test.go | 2 +- market/retrieval/retrieval.go | 37 +- market/retrieval/retrieval_test.go | 639 +++++++++++++++++++++++++++ tasks/indexing/task_ipni.go | 69 ++- 8 files changed, 1115 insertions(+), 386 deletions(-) create mode 100644 market/retrieval/retrieval_test.go diff --git a/documentation/en/curio-cli/curio.md b/documentation/en/curio-cli/curio.md index ea4f50c46..8c58437e0 100644 --- a/documentation/en/curio-cli/curio.md +++ b/documentation/en/curio-cli/curio.md @@ -46,7 +46,7 @@ NAME: curio cli - Execute cli commands USAGE: - curio cli command [command options] + curio cli [command options] COMMANDS: info Get Curio node info @@ -82,7 +82,7 @@ NAME: curio cli storage - manage sector storage USAGE: - curio cli storage command [command options] + curio cli storage [command options] DESCRIPTION: Sectors can be stored across many filesystem paths. These @@ -220,7 +220,7 @@ NAME: curio cli log - Manage logging USAGE: - curio cli log command [command options] + curio cli log [command options] COMMANDS: list List log systems @@ -361,7 +361,7 @@ NAME: curio config - Manage node config by layers. The layer 'base' will always be applied at Curio start-up. USAGE: - curio config command [command options] + curio config [command options] COMMANDS: default, defaults Print default node config @@ -488,7 +488,7 @@ NAME: curio test - Utility functions for testing USAGE: - curio test command [command options] + curio test [command options] COMMANDS: window-post, wd, windowpost, wdpost Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain. @@ -506,7 +506,7 @@ NAME: curio test window-post - Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain. USAGE: - curio test window-post command [command options] + curio test window-post [command options] COMMANDS: here, cli Compute WindowPoSt for performance and configuration testing. @@ -575,7 +575,7 @@ NAME: curio test debug - Collection of debugging utilities USAGE: - curio test debug command [command options] + curio test debug [command options] COMMANDS: ipni-piece-chunks generate ipni chunks from a file @@ -605,7 +605,7 @@ NAME: curio test debug debug-snsvc USAGE: - curio test debug debug-snsvc command [command options] + curio test debug debug-snsvc [command options] COMMANDS: deposit Deposit FIL into the Router contract (client) @@ -908,7 +908,7 @@ NAME: curio test debug proofsvc-client - Interact with the remote proof service USAGE: - curio test debug proofsvc-client command [command options] + curio test debug proofsvc-client [command options] COMMANDS: create-voucher Create a client voucher @@ -1054,7 +1054,7 @@ NAME: curio seal - Manage the sealing pipeline USAGE: - curio seal command [command options] + curio seal [command options] COMMANDS: start Start new sealing operations manually @@ -1105,7 +1105,7 @@ NAME: curio unseal - Manage unsealed data USAGE: - curio unseal command [command options] + curio unseal [command options] COMMANDS: info Get information about unsealed data @@ -1196,7 +1196,7 @@ NAME: curio market USAGE: - curio market command [command options] + curio market [command options] COMMANDS: seal start sealing a deal sector early @@ -1287,7 +1287,7 @@ NAME: curio calc - Math Utils USAGE: - curio calc command [command options] + curio calc [command options] COMMANDS: batch-cpu Analyze and display the layout of batch sealer threads @@ -1344,7 +1344,7 @@ NAME: curio toolbox - Tool Box for Curio USAGE: - curio toolbox command [command options] + curio toolbox [command options] COMMANDS: fix-msg Updated DB with message data missing from chain node diff --git a/documentation/en/curio-cli/sptool.md b/documentation/en/curio-cli/sptool.md index 764fe93b9..867c34982 100644 --- a/documentation/en/curio-cli/sptool.md +++ b/documentation/en/curio-cli/sptool.md @@ -31,7 +31,7 @@ NAME: sptool actor - Manage Filecoin Miner Actor Metadata USAGE: - sptool actor command [command options] + sptool actor [command options] COMMANDS: set-addresses, set-addrs set addresses that your miner can be publicly dialed on @@ -126,7 +126,7 @@ NAME: sptool actor control - Manage control addresses USAGE: - sptool actor control command [command options] + sptool actor control [command options] COMMANDS: list Get currently set control addresses. Note: This excludes most roles as they are not known to the immediate chain state. @@ -269,7 +269,7 @@ NAME: sptool sectors - interact with sector store USAGE: - sptool sectors command [command options] + sptool sectors [command options] COMMANDS: status Get the seal status of a sector by its number @@ -428,7 +428,7 @@ NAME: sptool proving - View proving information USAGE: - sptool proving command [command options] + sptool proving [command options] COMMANDS: info View current state information @@ -498,7 +498,7 @@ NAME: sptool toolbox - some tools to fix some problems USAGE: - sptool toolbox command [command options] + sptool toolbox [command options] COMMANDS: spark Manage Smart Contract PeerID used by Spark @@ -515,7 +515,7 @@ NAME: sptool toolbox spark - Manage Smart Contract PeerID used by Spark USAGE: - sptool toolbox spark command [command options] + sptool toolbox spark [command options] COMMANDS: delete-peer Delete PeerID from Spark Smart Contract @@ -544,7 +544,7 @@ NAME: sptool toolbox mk12-client - mk12 client for Curio USAGE: - sptool toolbox mk12-client command [command options] + sptool toolbox mk12-client [command options] COMMANDS: init Initialise curio mk12 client repo @@ -759,7 +759,7 @@ NAME: sptool toolbox mk12-client wallet - Manage mk12 client wallets USAGE: - sptool toolbox mk12-client wallet command [command options] + sptool toolbox mk12-client wallet [command options] COMMANDS: new Generate a new key of the given type diff --git a/go.mod b/go.mod index 87b31bb38..c84bdb0ec 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/filecoin-project/curio -go 1.24.6 +go 1.24.7 require ( contrib.go.opencensus.io/exporter/prometheus v0.4.2 @@ -10,7 +10,7 @@ require ( github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 github.com/charmbracelet/lipgloss v0.10.0 github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe - github.com/consensys/gnark-crypto v0.14.0 + github.com/consensys/gnark-crypto v0.19.0 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/docker/go-units v0.5.0 github.com/dustin/go-humanize v1.0.1 @@ -26,13 +26,13 @@ require ( github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20240802040721-2a04ffc8ffe8 github.com/filecoin-project/go-commp-utils/v2 v2.1.0 github.com/filecoin-project/go-f3 v0.8.10 - github.com/filecoin-project/go-fil-commcid v0.2.0 + github.com/filecoin-project/go-fil-commcid v0.3.1 github.com/filecoin-project/go-fil-commp-hashhash v0.2.0 github.com/filecoin-project/go-jsonrpc v0.8.0 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-state-types v0.17.0 github.com/filecoin-project/go-statestore v0.2.0 - github.com/filecoin-project/lotus v1.34.1 + github.com/filecoin-project/lotus v1.28.2-0.20251015050924-cbed4c2bac6c github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v5 v5.0.6 github.com/filecoin-project/specs-actors/v6 v6.0.2 @@ -52,28 +52,31 @@ require ( github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru/v2 v2.0.7 - github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 - github.com/invopop/jsonschema v0.12.0 - github.com/ipfs/boxo v0.33.0 - github.com/ipfs/go-block-format v0.2.2 + github.com/icza/backscanner v0.0.0-20240328210400-b40c3a86dec5 + github.com/invopop/jsonschema v0.13.0 + github.com/ipfs/boxo v0.35.0 + github.com/ipfs/go-block-format v0.2.3 github.com/ipfs/go-cid v0.5.0 github.com/ipfs/go-cidutil v0.1.0 - github.com/ipfs/go-datastore v0.8.2 - github.com/ipfs/go-fs-lock v0.0.7 - github.com/ipfs/go-graphsync v0.17.0 + github.com/ipfs/go-datastore v0.9.0 + github.com/ipfs/go-fs-lock v0.1.1 + github.com/ipfs/go-graphsync v0.18.0 github.com/ipfs/go-ipld-cbor v0.2.1 - github.com/ipfs/go-ipld-format v0.6.2 - github.com/ipfs/go-log/v2 v2.6.0 - github.com/ipld/frisbii v0.6.1 + github.com/ipfs/go-ipld-format v0.6.3 + github.com/ipfs/go-log/v2 v2.8.2 + github.com/ipfs/go-unixfsnode v1.10.2 + github.com/ipld/frisbii v0.8.2 github.com/ipld/go-car v0.6.2 - github.com/ipld/go-car/v2 v2.15.0 + github.com/ipld/go-car/v2 v2.16.0 + github.com/ipld/go-fixtureplate v0.1.0 github.com/ipld/go-ipld-prime v0.21.0 - github.com/ipni/go-libipni v0.6.13 + github.com/ipld/go-trustless-utils v0.7.0 + github.com/ipni/go-libipni v0.7.1 github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 github.com/jellydator/ttlcache/v2 v2.11.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.42.0 + github.com/libp2p/go-libp2p v0.44.0 github.com/manifoldco/promptui v0.9.0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/minio/sha256-simd v1.0.1 @@ -83,33 +86,34 @@ require ( github.com/multiformats/go-multibase v0.2.0 github.com/multiformats/go-multicodec v0.9.2 github.com/multiformats/go-multihash v0.2.3 - github.com/multiformats/go-varint v0.0.7 + github.com/multiformats/go-varint v0.1.0 + github.com/oklog/ulid v1.3.1 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.22.0 + github.com/prometheus/client_golang v1.23.2 github.com/puzpuzpuz/xsync/v2 v2.5.1 github.com/raulk/clock v1.1.0 github.com/samber/lo v1.47.0 github.com/schollz/progressbar/v3 v3.18.0 github.com/sirupsen/logrus v1.9.3 github.com/snadrus/must v0.0.0-20240605044437-98cedd57f8eb - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 github.com/triplewz/poseidon v0.0.2 - github.com/urfave/cli/v2 v2.27.5 + github.com/urfave/cli/v2 v2.27.7 github.com/whyrusleeping/cbor-gen v0.3.2-0.20250409092040-76796969edea github.com/yugabyte/gocql v1.6.0-yb-1 github.com/yugabyte/pgx/v5 v5.5.3-yb-2 go.opencensus.io v0.24.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.41.0 - golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b - golang.org/x/net v0.42.0 - golang.org/x/sync v0.16.0 - golang.org/x/sys v0.35.0 - golang.org/x/term v0.34.0 - golang.org/x/text v0.28.0 - golang.org/x/tools v0.35.0 + golang.org/x/crypto v0.43.0 + golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b + golang.org/x/net v0.46.0 + golang.org/x/sync v0.17.0 + golang.org/x/sys v0.37.0 + golang.org/x/term v0.36.0 + golang.org/x/text v0.30.0 + golang.org/x/tools v0.38.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da ) @@ -121,27 +125,23 @@ require ( github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/StackExchange/wmi v1.2.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect - github.com/akavel/rsrc v0.8.0 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect + github.com/akavel/rsrc v0.10.2 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.17.0 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/cilium/ebpf v0.9.1 // indirect github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 // indirect - github.com/consensys/bavard v0.1.22 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect @@ -152,13 +152,13 @@ require ( github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgraph-io/ristretto v0.2.0 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/drand/drand/v2 v2.0.6 // indirect + github.com/drand/drand/v2 v2.1.3 // indirect github.com/drand/go-clients v0.2.2 // indirect github.com/drand/kyber v1.3.1 // indirect github.com/drand/kyber-bls12381 v0.3.3 // indirect - github.com/elastic/go-elasticsearch/v7 v7.14.0 // indirect + github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect github.com/elastic/go-windows v1.0.2 // indirect github.com/elastic/gosigar v0.14.3 // indirect github.com/etclabscore/go-jsonschema-walk v0.0.6 // indirect @@ -183,34 +183,32 @@ require ( github.com/filecoin-project/specs-actors/v8 v8.0.1 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/gammazero/chanqueue v1.1.0 // indirect - github.com/gammazero/deque v1.0.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/gammazero/chanqueue v1.1.1 // indirect + github.com/gammazero/deque v1.1.0 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/gdamore/tcell/v2 v2.2.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.19.3 // indirect - github.com/go-openapi/jsonreference v0.19.4 // indirect - github.com/go-openapi/spec v0.19.11 // indirect - github.com/go-openapi/swag v0.19.11 // indirect - github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/spec v0.20.6 // indirect + github.com/go-openapi/swag v0.19.15 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.4 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hannahhoward/go-pubsub v1.0.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/arc/v2 v2.0.7 // indirect github.com/holiman/uint256 v1.3.2 // indirect @@ -219,10 +217,10 @@ require ( github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-bitfield v1.1.0 // indirect github.com/ipfs/go-blockservice v0.5.2 // indirect - github.com/ipfs/go-ds-leveldb v0.5.0 // indirect - github.com/ipfs/go-ds-measure v0.2.0 // indirect + github.com/ipfs/go-ds-leveldb v0.5.2 // indirect + github.com/ipfs/go-ds-measure v0.2.2 // indirect + github.com/ipfs/go-dsqueue v0.0.5 // indirect github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect - github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect @@ -232,37 +230,36 @@ require ( github.com/ipfs/go-merkledag v0.11.0 // indirect github.com/ipfs/go-metrics-interface v0.3.0 // indirect github.com/ipfs/go-peertaskqueue v0.8.2 // indirect - github.com/ipfs/go-unixfsnode v1.10.1 // indirect github.com/ipfs/go-verifcid v0.0.3 // indirect github.com/ipld/go-codec-dagpb v1.7.0 // indirect - github.com/ipld/go-ipld-adl-hamt v0.0.0-20240322071803-376decb85801 // indirect - github.com/ipld/go-trustless-utils v0.4.1 // indirect - github.com/ipni/index-provider v0.15.4 // indirect + github.com/ipld/go-ipld-adl-hamt v0.0.0-20250821073235-1979ffd425aa // indirect + github.com/ipni/index-provider v0.16.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jessevdk/go-flags v1.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/kilic/bls12-381 v0.1.1-0.20220929213557-ca162e8a70f4 // indirect github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.10 // indirect - github.com/koron/go-ssdp v0.0.6 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/koron/go-ssdp v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.2.0 // indirect + github.com/libp2p/go-flow-metrics v0.3.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect + github.com/libp2p/go-libp2p-kad-dht v0.34.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.13.0 // indirect + github.com/libp2p/go-libp2p-pubsub v0.15.0 // indirect github.com/libp2p/go-libp2p-record v0.3.1 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect github.com/libp2p/go-maddr-filter v0.1.0 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-netroute v0.2.2 // indirect + github.com/libp2p/go-netroute v0.3.0 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect - github.com/libp2p/go-yamux/v5 v5.0.1 // indirect + github.com/libp2p/go-yamux/v5 v5.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magefile/mage v1.9.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -271,11 +268,10 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mattn/go-sqlite3 v1.14.32 // indirect - github.com/miekg/dns v1.1.66 // indirect + github.com/miekg/dns v1.1.68 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.2 // indirect @@ -285,50 +281,50 @@ require ( github.com/multiformats/go-multistream v0.6.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nikkolasg/hexjson v0.1.0 // indirect - github.com/nkovacs/streamquote v1.0.0 // indirect - github.com/onsi/ginkgo/v2 v2.23.4 // indirect + github.com/nkovacs/streamquote v1.1.0 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pion/datachannel v1.5.10 // indirect github.com/pion/dtls/v2 v2.2.12 // indirect - github.com/pion/dtls/v3 v3.0.6 // indirect + github.com/pion/dtls/v3 v3.0.7 // indirect github.com/pion/ice/v4 v4.0.10 // indirect - github.com/pion/interceptor v0.1.40 // indirect - github.com/pion/logging v0.2.3 // indirect + github.com/pion/interceptor v0.1.41 // indirect + github.com/pion/logging v0.2.4 // indirect github.com/pion/mdns/v2 v2.0.7 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.15 // indirect - github.com/pion/rtp v1.8.19 // indirect + github.com/pion/rtp v1.8.23 // indirect github.com/pion/sctp v1.8.39 // indirect - github.com/pion/sdp/v3 v3.0.13 // indirect - github.com/pion/srtp/v3 v3.0.6 // indirect + github.com/pion/sdp/v3 v3.0.16 // indirect + github.com/pion/srtp/v3 v3.0.8 // indirect github.com/pion/stun v0.6.1 // indirect github.com/pion/stun/v3 v3.0.0 // indirect github.com/pion/transport/v2 v2.2.10 // indirect - github.com/pion/transport/v3 v3.0.7 // indirect - github.com/pion/turn/v4 v4.0.2 // indirect - github.com/pion/webrtc/v4 v4.1.2 // indirect + github.com/pion/transport/v3 v3.0.8 // indirect + github.com/pion/turn/v4 v4.1.1 // indirect + github.com/pion/webrtc/v4 v4.1.5 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/polydawn/refmt v0.89.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.64.0 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/common v0.67.1 // indirect + github.com/prometheus/otlptranslator v0.0.2 // indirect + github.com/prometheus/procfs v0.17.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/quic-go/qpack v0.5.1 // indirect - github.com/quic-go/quic-go v0.52.0 // indirect - github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect + github.com/quic-go/quic-go v0.55.0 // indirect + github.com/quic-go/webtransport-go v0.9.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/supranational/blst v0.3.13 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/twmb/murmur3 v1.1.6 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/twmb/murmur3 v1.1.8 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.0.1 // indirect github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba // indirect @@ -338,45 +334,46 @@ require ( github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/wlynxg/anet v0.0.5 // indirect - github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect + github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect + github.com/zondax/golem v0.27.0 // indirect github.com/zondax/hid v0.9.2 // indirect - github.com/zondax/ledger-filecoin-go v1.1.0 // indirect - github.com/zondax/ledger-go v1.0.0 // indirect + github.com/zondax/ledger-filecoin-go v1.2.0 // indirect + github.com/zondax/ledger-go v1.0.1 // indirect github.com/zyedidia/generic v1.2.1 // indirect gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/kyber/v4 v4.0.0-pre2.0.20240924132404-4de33740016e // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect go.opentelemetry.io/otel/bridge/opencensus v1.28.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.14.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.50.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/sdk v1.35.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.60.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/dig v1.19.0 // indirect go.uber.org/fx v1.24.0 // indirect - go.uber.org/mock v0.5.2 // indirect + go.uber.org/mock v0.6.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/time v0.12.0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/telemetry v0.0.0-20251009181524-91c411e14f39 // indirect + golang.org/x/time v0.14.0 // indirect gonum.org/v1/gonum v0.16.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/grpc v1.73.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect lukechampine.com/blake3 v1.4.1 // indirect - rsc.io/tmplfunc v0.0.3 // indirect ) replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi diff --git a/go.sum b/go.sum index 687b395b1..901fbd88c 100644 --- a/go.sum +++ b/go.sum @@ -69,20 +69,17 @@ github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cq github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 h1:T3+cD5fYvuH36h7EZq+TDpm+d8a6FSD4pQsbmuGGQ8o= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -94,8 +91,8 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8V github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/ardanlabs/darwin/v2 v2.0.0 h1:XCisQMgQ5EG+ZvSEcADEo+pyfIMKyWAGnn5o2TgriYE= github.com/ardanlabs/darwin/v2 v2.0.0/go.mod h1:MubZ2e9DAYGaym0mClSOi183NYahrrfKxvSy1HMhoes= @@ -115,8 +112,8 @@ github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bits-and-blooms/bitset v1.17.0 h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI= -github.com/bits-and-blooms/bitset v1.17.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= @@ -137,8 +134,8 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -187,10 +184,8 @@ github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+Bu github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe h1:69JI97HlzP+PH5Mi1thcGlDoBr6PS2Oe+l3mNmAkbs4= github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= -github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= -github.com/consensys/bavard v0.1.22/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= -github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= -github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0= +github.com/consensys/gnark-crypto v0.19.0 h1:zXCqeY2txSaMl6G5wFpZzMWJU9HPNh8qxPnYJ1BL9vA= +github.com/consensys/gnark-crypto v0.19.0/go.mod h1:rT23F0XSZqE0mUA0+pRtnL56IbPxs6gp4CeRsBk4XS0= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= @@ -206,14 +201,15 @@ github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= -github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf h1:dwGgBWn84wUS1pVikGiruW+x5XM4amhjaZO20vCjay4= github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/daaku/go.zipexe v1.0.2 h1:Zg55YLYTr7M9wjKn8SY/WcpuuEi+kR2u4E8RhvpyXmk= @@ -237,8 +233,8 @@ github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzA github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgraph-io/ristretto v0.2.0 h1:XAfl+7cmoUDWW/2Lx8TGZQjjxIQ2Ley9DSf52dru4WE= +github.com/dgraph-io/ristretto v0.2.0/go.mod h1:8uBHCU/PBV4Ag0CJrP47b9Ofby5dqWNh4FicAdoqFNU= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= @@ -246,8 +242,8 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/drand/drand/v2 v2.0.6 h1:yUoHR9hbAF98nPcpaF3Pdk8xHKCrEhCtwvnBPmucPRI= -github.com/drand/drand/v2 v2.0.6/go.mod h1:4s65uiKkQezRUj4cIe0525y2xA3xPbh3BsRfVhNvYzY= +github.com/drand/drand/v2 v2.1.3 h1:/FDobNK5KW3onnXVOChUe8BFkGLkwIu7SNcPYrhEJH8= +github.com/drand/drand/v2 v2.1.3/go.mod h1:8TT+5oKwd+A3dJCFjE/qE0PC8VaF6xcgMpU3TxbRybg= github.com/drand/go-clients v0.2.2 h1:wnXk321iBjA2mrRM9oRSWb2hHYO/Oaexf1SlW093HYQ= github.com/drand/go-clients v0.2.2/go.mod h1:S9nhirDj6F8GaZDYNy7kI3AbuamhERQyDGLqkCZjaGs= github.com/drand/kyber v1.3.1 h1:E0p6M3II+loMVwTlAp5zu4+GGZFNiRfq02qZxzw2T+Y= @@ -257,8 +253,8 @@ github.com/drand/kyber-bls12381 v0.3.3/go.mod h1:uVRWtcZDAApOWFMwoJVcTfC4csVxXmp github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/elastic/go-elasticsearch/v7 v7.14.0 h1:extp3jos/rwJn3J+lgbaGlwAgs0TVsIHme00GyNAyX4= -github.com/elastic/go-elasticsearch/v7 v7.14.0/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo= +github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= github.com/elastic/go-sysinfo v1.15.4 h1:A3zQcunCxik14MgXu39cXFXcIw2sFXZ0zL886eyiv1Q= github.com/elastic/go-sysinfo v1.15.4/go.mod h1:ZBVXmqS368dOn/jvijV/zHLfakWTYHBZPk3G244lHrU= github.com/elastic/go-windows v1.0.2 h1:yoLLsAsV5cfg9FLhZ9EXZ2n2sQFKeDYrHenkcivY4vI= @@ -316,14 +312,14 @@ github.com/filecoin-project/go-commp-utils/v2 v2.1.0/go.mod h1:NbxJYlhxtWaNhlVCj github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.1.0 h1:Pob2MphoipMbe/ksxZOMcQvmBHAd3sI/WEqcbpIsGI0= github.com/filecoin-project/go-crypto v0.1.0/go.mod h1:K9UFXvvoyAVvB+0Le7oGlKiT9mgA5FHOJdYQXEE8IhI= -github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc7 h1:v+zJS5B6pA3ptWZS4t8tbt1Hz9qENnN4nVr1w99aSWc= -github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc7/go.mod h1:V3Y4KbttaCwyg1gwkP7iai8CbQx4mZUGjd3h9GZWLKE= +github.com/filecoin-project/go-data-transfer/v2 v2.0.0 h1:SUU6c0+K9K9WY16Ur9+cX1GOboTQ4TypR8cuLZANbDE= +github.com/filecoin-project/go-data-transfer/v2 v2.0.0/go.mod h1:VdCAN4UqvZzbtTMVUi4yA2TKdzG1CtgjGzs7mdnRPWk= github.com/filecoin-project/go-ds-versioning v0.1.2 h1:to4pTadv3IeV1wvgbCbN6Vqd+fu+7tveXgv/rCEZy6w= github.com/filecoin-project/go-ds-versioning v0.1.2/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-f3 v0.8.10 h1:Mm+daAn9EKqTTDY3ICbPTR2i3Opjb4gr6Y7bJ8oCA84= github.com/filecoin-project/go-f3 v0.8.10/go.mod h1:hFvb2CMxHDmlJAVzfiIL/V8zCtNMQqfSnhP5TyM6CHI= -github.com/filecoin-project/go-fil-commcid v0.2.0 h1:B+5UX8XGgdg/XsdUpST4pEBviKkFOw+Fvl2bLhSKGpI= -github.com/filecoin-project/go-fil-commcid v0.2.0/go.mod h1:8yigf3JDIil+/WpqR5zoKyP0jBPCOGtEqq/K1CcMy9Q= +github.com/filecoin-project/go-fil-commcid v0.3.1 h1:4EfxpHSlvtkOqa9weG2Yt5kxFmPib2xU7Uc9Lbqk7fs= +github.com/filecoin-project/go-fil-commcid v0.3.1/go.mod h1:z7Ssf8d7kspF9QRAVHDbZ+43JK4mkhbGH5lyph1TnKY= github.com/filecoin-project/go-fil-commp-hashhash v0.2.0 h1:HYIUugzjq78YvV3vC6rL95+SfC/aSTVSnZSZiDV5pCk= github.com/filecoin-project/go-fil-commp-hashhash v0.2.0/go.mod h1:VH3fAFOru4yyWar4626IoS5+VGE8SfZiBODJLUigEo4= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= @@ -356,8 +352,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/lotus v1.34.1 h1:wrqkeNlfNGBhEOdYsDiOR0XTqGkzVa3Ws0u/UIPSwX0= -github.com/filecoin-project/lotus v1.34.1/go.mod h1:2qrUwIdtAAVvduoFISqB5d+bUHRQpRWNQhLn0bmhVog= +github.com/filecoin-project/lotus v1.28.2-0.20251015050924-cbed4c2bac6c h1:Dzw0mvMprKbUYhGaBBFxZiTt6ZuDSpgq+SIyM5zJz5U= +github.com/filecoin-project/lotus v1.28.2-0.20251015050924-cbed4c2bac6c/go.mod h1:YU+SH/ZAqYyFjQHVIwf3i8fEdHwQ1QfBJ4U8DKUK+fA= github.com/filecoin-project/pubsub v1.0.0 h1:ZTmT27U07e54qV1mMiQo4HDr0buo8I1LDHBYLXlsNXM= github.com/filecoin-project/pubsub v1.0.0/go.mod h1:GkpB33CcUtUNrLPhJgfdy4FDx4OMNR9k+46DHx/Lqrg= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -387,14 +383,12 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gammazero/channelqueue v0.2.2 h1:ufNzIbeDBxNfHj0m5uwUfOwvTmHF/O40hu2ZNnvF+/8= -github.com/gammazero/channelqueue v0.2.2/go.mod h1:824o5HHE+yO1xokh36BIuSv8YWwXW0364ku91eRMFS4= -github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw= -github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc= -github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34= -github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ= +github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc= +github.com/gammazero/deque v1.1.0 h1:OyiyReBbnEG2PP0Bnv1AASLIYvyKqIFN5xfl1t8oGLo= +github.com/gammazero/deque v1.1.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -403,8 +397,8 @@ github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/georgysavva/scany/v2 v2.1.4 h1:nrzHEJ4oQVRoiKmocRqA1IyGOmM/GQOEsg9UjMR5Ip4= github.com/georgysavva/scany/v2 v2.1.4/go.mod h1:fqp9yHZzM/PFVa3/rYEC57VmDx+KDch0LoqrJzkvtos= -github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= -github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.35.0 h1:+FJNlnjJsZMG3g0/rmmP7GiKjQoUF5EXfEtBwtPtkzY= +github.com/getsentry/sentry-go v0.35.0/go.mod h1:C55omcY9ChRQIUcVcGcs+Zdy4ZpQGvNJ7JYHIoSWOtE= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= @@ -429,31 +423,33 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.11 h1:ogU5q8dtp3MMPn59a9VRrPKVxvJHEs5P7yNMR5sNnis= github.com/go-openapi/spec v0.19.11/go.mod h1:vqK/dIdLGCosfvYsQV3WfC7N3TiZSnGY2RZKoFK7X28= +github.com/go-openapi/spec v0.20.6 h1:ich1RQ3WDbfoeTqTAb+5EIxNmpKVJZWBNah9RAT0jIQ= +github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.11 h1:RFTu/dlFySpyVvJDfp/7674JY4SDglYWKztbiIGFpmc= github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -469,13 +465,12 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= -github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -544,10 +539,7 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= -github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -568,6 +560,8 @@ github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWS github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= @@ -575,8 +569,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0 h1:WcmKMm43DR7RdtlkEXQJyo5ws8iTp98CyhCCbOHMvNI= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= @@ -600,8 +594,8 @@ github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB1 github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= -github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= +github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= @@ -627,18 +621,18 @@ github.com/iancoleman/orderedmap v0.1.0 h1:2orAxZBJsvimgEBmMWfXaFlzSG2fbQil5qzP3 github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= -github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M= -github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= +github.com/icza/backscanner v0.0.0-20240328210400-b40c3a86dec5 h1:FcxwOojw6pUiPpsf7Q6Fw/pI+7cR6FlapLBEGV/902A= +github.com/icza/backscanner v0.0.0-20240328210400-b40c3a86dec5/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw= -github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM= +github.com/ipfs/boxo v0.35.0 h1:3Mku5arSbAZz0dvb4goXRsQuZkFkPrGr5yYdu0YM1pY= +github.com/ipfs/boxo v0.35.0/go.mod h1:uhaF0DGnbgEiXDTmD249jCGbxVkMm6+Ew85q6Uub7lo= github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= @@ -648,8 +642,8 @@ github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niY github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= -github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ= -github.com/ipfs/go-block-format v0.2.2/go.mod h1:vmuefuWU6b+9kIU0vZJgpiJt1yicQz9baHXE8qR+KB8= +github.com/ipfs/go-block-format v0.2.3 h1:mpCuDaNXJ4wrBJLrtEaGFGXkferrw5eqVvzaHhtFKQk= +github.com/ipfs/go-block-format v0.2.3/go.mod h1:WJaQmPAKhD3LspLixqlqNFxiZ3BZ3xgqxxoSR/76pnA= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8= github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= @@ -670,21 +664,23 @@ github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.8.2 h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U= -github.com/ipfs/go-datastore v0.8.2/go.mod h1:W+pI1NsUsz3tcsAACMtfC+IZdnQTnC/7VfPoJBQuts0= +github.com/ipfs/go-datastore v0.9.0 h1:WocriPOayqalEsueHv6SdD4nPVl4rYMfYGLD4bqCZ+w= +github.com/ipfs/go-datastore v0.9.0/go.mod h1:uT77w/XEGrvJWwHgdrMr8bqCN6ZTW9gzmi+3uK+ouHg= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= -github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= -github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= -github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= +github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp0x0= +github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo= +github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICkqGI= +github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs= +github.com/ipfs/go-dsqueue v0.0.5 h1:TUOk15TlCJ/NKV8Yk2W5wgkEjDa44Nem7a7FGIjsMNU= +github.com/ipfs/go-dsqueue v0.0.5/go.mod h1:i/jAlpZjBbQJLioN+XKbFgnd+u9eAhGZs9IrqIzTd9g= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= -github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.17.0 h1:1gh10v94G/vSGzfApVtbZSvSKkK906Y+2sRqewjDTm4= -github.com/ipfs/go-graphsync v0.17.0/go.mod h1:HXHiTRIw3wrN3InMwdV+IzpBAtreEf/KqFlEibhfVgo= +github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw= +github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0= +github.com/ipfs/go-graphsync v0.18.0 h1:b+DNJ4lWsCKKaVKYgqgt4rrqshvVcTphN7Rl0JfFiD4= +github.com/ipfs/go-graphsync v0.18.0/go.mod h1:+7SU0L6thSFFTo1pbDcwCqi+gN0L7UQP8eVm897Mg0s= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= @@ -725,8 +721,8 @@ github.com/ipfs/go-ipld-cbor v0.2.1 h1:H05yEJbK/hxg0uf2AJhyerBDbjOuHX4yi+1U/ogRa github.com/ipfs/go-ipld-cbor v0.2.1/go.mod h1:x9Zbeq8CoE5R2WicYgBMcr/9mnkQ0lHddYWJP2sMV3A= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU= -github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk= +github.com/ipfs/go-ipld-format v0.6.3 h1:9/lurLDTotJpZSuL++gh3sTdmcFhVkCwsgx2+rAh4j8= +github.com/ipfs/go-ipld-format v0.6.3/go.mod h1:74ilVN12NXVMIV+SrBAyC05UJRk0jVvGqdmrcYZvCBk= github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ= github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -738,9 +734,8 @@ github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBW github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg= -github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8= +github.com/ipfs/go-log/v2 v2.8.2 h1:nVG4nNHUwwI/sTs9Bi5iE8sXFQwXs3AjkkuWhg7+Y2I= +github.com/ipfs/go-log/v2 v2.8.2/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY= @@ -751,53 +746,53 @@ github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwH github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU= github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA= -github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8= -github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA= +github.com/ipfs/go-test v0.2.3 h1:Z/jXNAReQFtCYyn7bsv/ZqUwS6E7iIcSpJ2CuzCvnrc= +github.com/ipfs/go-test v0.2.3/go.mod h1:QW8vSKkwYvWFwIZQLGQXdkt9Ud76eQXRQ9Ao2H+cA1o= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= -github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM= -github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY= +github.com/ipfs/go-unixfsnode v1.10.2 h1:TREegX1J4X+k1w4AhoDuxxFvVcS9SegMRvrmxF6Tca8= +github.com/ipfs/go-unixfsnode v1.10.2/go.mod h1:ImDPTSiKZ+2h4UVdkSDITJHk87bUAp7kX/lgifjRicg= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs= github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw= -github.com/ipld/frisbii v0.6.1 h1:y69PFVaJsZK4pd0I7zTIjnJu56BUfaM6a5zCdolrSeI= -github.com/ipld/frisbii v0.6.1/go.mod h1:5alsRVbOyUbZ2In70AdJ4VOLh13LkmAMUomotJaoHCg= +github.com/ipld/frisbii v0.8.2 h1:LSvOHP4cHgvjs8xc7h9mgkc+3EEKCyOAxdIWE2uaiQ4= +github.com/ipld/frisbii v0.8.2/go.mod h1:C/42H9SWeX+ppNTMSNjtlh9V04jhFMPNhSHMtlkA58U= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc= github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8= -github.com/ipld/go-car/v2 v2.15.0 h1:RxtZcGXFx72zFESl+UUsCNQV2YMcy3gEMYx9M3uio24= -github.com/ipld/go-car/v2 v2.15.0/go.mod h1:ovlq/n3xlVJDmoiN3Kd/Z7kIzQbdTIFSwltfOP+qIgk= +github.com/ipld/go-car/v2 v2.16.0 h1:LWe0vmN/QcQmUU4tr34W5Nv5mNraW+G6jfN2s+ndBco= +github.com/ipld/go-car/v2 v2.16.0/go.mod h1:RqFGWN9ifcXVmCrTAVnfnxiWZk1+jIx67SYhenlmL34= github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0= github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM= -github.com/ipld/go-fixtureplate v0.0.3 h1:Qb/rBBnYP8IiK+VLq89y2NPZ3iQeQpAi9YK3oSleVGs= -github.com/ipld/go-fixtureplate v0.0.3/go.mod h1:i97D4Kbzvvk3OxGfwgKL3fpmzxXhpLEVpQ0mT4ek24s= -github.com/ipld/go-ipld-adl-hamt v0.0.0-20240322071803-376decb85801 h1:B5P5TdYpNt0ZEbbZ4Tjj7mO3dWENbT5PxOJ3xgj+lnQ= -github.com/ipld/go-ipld-adl-hamt v0.0.0-20240322071803-376decb85801/go.mod h1:xisTNW7Sm8GTyY+n3XfQKScTPcOlVyZrzU71lTb7kuE= +github.com/ipld/go-fixtureplate v0.1.0 h1:pveFwmRgGWLyqYynhS3YTh/eqxqiLWs1+69+IUTOM1s= +github.com/ipld/go-fixtureplate v0.1.0/go.mod h1:Ay5QhMt+IftFTu235vTC4PkqSED//e7UorJIKrgyDxA= +github.com/ipld/go-ipld-adl-hamt v0.0.0-20250821073235-1979ffd425aa h1:g9TJyA84+NhxJVAm+2xzPNoU8/erZ3+j12MHSOzAuqE= +github.com/ipld/go-ipld-adl-hamt v0.0.0-20250821073235-1979ffd425aa/go.mod h1:QKxpjLVrrTEvDP1HLeneDgp0hpzZMIdh72a1LWh2kHw= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= -github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw= -github.com/ipld/go-trustless-utils v0.4.1 h1:puA14381Hg2LzH724mZ5ZFKFx+FFjjT5fPFs01vwlgM= -github.com/ipld/go-trustless-utils v0.4.1/go.mod h1:DgGuyfJ33goYwYVisjnxrlra0HVmZuHWVisVIkzVo1o= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20250821084354-a425e60cd714 h1:cqNk8PEwHnK0vqWln+U/YZhQc9h2NB3KjUjDPZo5Q2s= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20250821084354-a425e60cd714/go.mod h1:ZEUdra3CoqRVRYgAX/jAJO9aZGz6SKtKEG628fHHktY= +github.com/ipld/go-trustless-utils v0.7.0 h1:iKFR4f9MdPw/cM0AMz7Ss+QGyTh5RylCAjOEd4VqPXE= +github.com/ipld/go-trustless-utils v0.7.0/go.mod h1:inKRRT3L9BT1r/u6yBbXuIq+wIGO2yf0NqiOo36bH9U= github.com/ipld/ipld/specs v0.0.0-20231012031213-54d3b21deda4 h1:0VXv637/xpI0Pb5J8K+K8iRtTw4DOcxs0MB1HMzfwNY= github.com/ipld/ipld/specs v0.0.0-20231012031213-54d3b21deda4/go.mod h1:WcT0DfRe+e2QFY0kcbsOnuT6jL5Q0JNZ83I5DHIdStg= -github.com/ipni/go-libipni v0.6.13 h1:6fQU6ZFu8fi0DZIs4VXZrIFbT9r97dNmNl7flWMVblE= -github.com/ipni/go-libipni v0.6.13/go.mod h1:+hNohg7Tx8ML2a/Ei19zUxCnSqtqXiHySlqHIwPhQyQ= -github.com/ipni/index-provider v0.15.4 h1:K64q94r6M/QFyIvRwMxC6oOv92cOixCzy/awGmsBEXI= -github.com/ipni/index-provider v0.15.4/go.mod h1:R08LoUrA12fiqtDVUwLAv+g09BPY0FsCG58JvFEyVzo= +github.com/ipni/go-libipni v0.7.1 h1:0peyJTXXgrDHqjiqpSuYlxH3JIvnUMw1Orq7nJtq/tY= +github.com/ipni/go-libipni v0.7.1/go.mod h1:RtAxDhPYVXd/So3w4kWI/NIYc1tYfpzoKu8jtNoDmLU= +github.com/ipni/index-provider v0.16.0 h1:TfU6D5C3sHg3ysQm25MEsKOeU/AsLOaLGEys+uz2U6I= +github.com/ipni/index-provider v0.16.0/go.mod h1:xso34LEpwNkSx3yxJ8fpuXlT/30Uwdxu6SALY5b7cJk= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 h1:Dj0L5fhJ9F82ZJyVOmBx6msDp/kfd1t9GRfny/mfJA0= github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= -github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -852,14 +847,14 @@ github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= -github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU= -github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI= +github.com/koron/go-ssdp v0.1.0 h1:ckl5x5H6qSNFmi+wCuROvvGUu2FQnMbQrU95IHCcv3Y= +github.com/koron/go-ssdp v0.1.0/go.mod h1:GltaDBjtK1kemZOusWYLGotV0kBeEf59Bp0wtSB0uyU= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -886,12 +881,12 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= -github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784= +github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE= -github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro= +github.com/libp2p/go-libp2p v0.44.0 h1:5Gtt8OrF8yiXmH+Mx4+/iBeFRMK1TY3a8OrEBDEqAvs= +github.com/libp2p/go-libp2p v0.44.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -902,8 +897,8 @@ github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= -github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0= -github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo= +github.com/libp2p/go-libp2p-kad-dht v0.34.0 h1:yvJ/Vrt36GVjsqPxiGcuuwOloKuZLV9Aa7awIKyNXy0= +github.com/libp2p/go-libp2p-kad-dht v0.34.0/go.mod h1:JNbkES4W5tajS6uYivw6MPs0842cPHAwhgaPw8sQG4o= github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs= github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g= github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= @@ -913,8 +908,8 @@ github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCv github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-pubsub v0.13.0 h1:RmFQ2XAy3zQtbt2iNPy7Tt0/3fwTnHpCQSSnmGnt1Ps= -github.com/libp2p/go-libp2p-pubsub v0.13.0/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo= +github.com/libp2p/go-libp2p-pubsub v0.15.0 h1:cG7Cng2BT82WttmPFMi50gDNV+58K626m/wR00vGL1o= +github.com/libp2p/go-libp2p-pubsub v0.15.0/go.mod h1:lr4oE8bFgQaifRcoc2uWhWWiK6tPdOEKpUuR408GFN4= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg= github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E= @@ -940,8 +935,8 @@ github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= -github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= -github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= +github.com/libp2p/go-netroute v0.3.0 h1:nqPCXHmeNmgTJnktosJ/sIef9hvwYCrsLxXmfNks/oc= +github.com/libp2p/go-netroute v0.3.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= @@ -953,8 +948,8 @@ github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjV github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg= -github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU= +github.com/libp2p/go-yamux/v5 v5.1.0 h1:8Qlxj4E9JGJAQVW6+uj2o7mqkqsIVlSUGmTWhlXzoHE= +github.com/libp2p/go-yamux/v5 v5.1.0/go.mod h1:tgIQ07ObtRR/I0IWsFOyQIL9/dR5UXgc2s8xKmNZv1o= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= @@ -973,6 +968,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/marcopolo/simnet v0.0.1 h1:rSMslhPz6q9IvJeFWDoMGxMIrlsbXau3NkuIXHGJxfg= +github.com/marcopolo/simnet v0.0.1/go.mod h1:WDaQkgLAjqDUEBAOXz22+1j6wXKfGlC5sD5XWt3ddOs= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -984,7 +981,6 @@ github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stg github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -997,8 +993,8 @@ github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxU github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE= -github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE= +github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= +github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -1023,9 +1019,6 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -1081,8 +1074,8 @@ github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wS github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ= github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/multiformats/go-varint v0.1.0 h1:i2wqFp4sdl3IcIxfAonHQV9qU5OsZ4Ts9IOoETFs5dI= +github.com/multiformats/go-varint v0.1.0/go.mod h1:5KVAVXegtfmNQQm/lCY+ATvDzvJJhSkUlGQV9wgObdI= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1090,12 +1083,16 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.1.0 h1:Cgi1MSZVQFoJKYeRpBNEcdF3LB+Zo4fYKsDz7h8uJYQ= github.com/nikkolasg/hexjson v0.1.0/go.mod h1:fbGbWFZ0FmJMFbpCMtJpwb0tudVxSSZ+Es2TsCg57cA= -github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= +github.com/nkovacs/streamquote v1.1.0 h1:wDY1+Hikdx4iOmZZBFLXvwLr7zj9uPIoXfijz+6ad2g= +github.com/nkovacs/streamquote v1.1.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1105,8 +1102,6 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -1129,36 +1124,36 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E= -github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU= +github.com/pion/dtls/v3 v3.0.7 h1:bItXtTYYhZwkPFk4t1n3Kkf5TDrfj6+4wG+CZR8uI9Q= +github.com/pion/dtls/v3 v3.0.7/go.mod h1:uDlH5VPrgOQIw59irKYkMudSFprY9IEFCqz/eTz16f8= github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4= github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw= -github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4= -github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic= +github.com/pion/interceptor v0.1.41 h1:NpvX3HgWIukTf2yTBVjVGFXtpSpWgXjqz7IIpu7NsOw= +github.com/pion/interceptor v0.1.41/go.mod h1:nEt4187unvRXJFyjiw00GKo+kIuXMWQI9K89fsosDLY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI= -github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90= +github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= +github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= -github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c= -github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk= +github.com/pion/rtp v1.8.23 h1:kxX3bN4nM97DPrVBGq5I/Xcl332HnTHeP1Swx3/MCnU= +github.com/pion/rtp v1.8.23/go.mod h1:rF5nS1GqbR7H/TCpKwylzeq6yDM+MM6k+On5EgeThEM= github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE= github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE= -github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4= -github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E= -github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4= -github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY= +github.com/pion/sdp/v3 v3.0.16 h1:0dKzYO6gTAvuLaAKQkC02eCPjMIi4NuAr/ibAwrGDCo= +github.com/pion/sdp/v3 v3.0.16/go.mod h1:9tyKzznud3qiweZcD86kS0ff1pGYB3VX+Bcsmkx6IXo= +github.com/pion/srtp/v3 v3.0.8 h1:RjRrjcIeQsilPzxvdaElN0CpuQZdMvcl9VZ5UY9suUM= +github.com/pion/srtp/v3 v3.0.8/go.mod h1:2Sq6YnDH7/UDCvkSoHSDNDeyBcFgWL0sAVycVbAsXFg= github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= @@ -1169,12 +1164,12 @@ github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1A github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= -github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= -github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= -github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps= -github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs= -github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54= -github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U= +github.com/pion/transport/v3 v3.0.8 h1:oI3myyYnTKUSTthu/NZZ8eu2I5sHbxbUNNFW62olaYc= +github.com/pion/transport/v3 v3.0.8/go.mod h1:+c2eewC5WJQHiAA46fkMMzoYZSuGzA/7E2FPrOYHctQ= +github.com/pion/turn/v4 v4.1.1 h1:9UnY2HB99tpDyz3cVVZguSxcqkJ1DsTSZ+8TGruh4fc= +github.com/pion/turn/v4 v4.1.1/go.mod h1:2123tHk1O++vmjI5VSD0awT50NywDAq5A2NNNU4Jjs8= +github.com/pion/webrtc/v4 v4.1.5 h1:hJqfKPdRAVcXV9rsg2xcCiuXuMJ38BLW/87GsYJUtUU= +github.com/pion/webrtc/v4 v4.1.5/go.mod h1:vzHh7egVnZRgkK83lYzciWVszdDs759y3/eyu6AvZRA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1188,8 +1183,6 @@ github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= -github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -1198,8 +1191,8 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1213,8 +1206,10 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4= -github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/common v0.67.1 h1:OTSON1P4DNxzTg4hmKCc37o4ZAZDv0cfXLkOt0oEowI= +github.com/prometheus/common v0.67.1/go.mod h1:RpmT9v35q2Y+lsieQsdOh5sXZ6ajUGC8NjZAmr8vb0Q= +github.com/prometheus/otlptranslator v0.0.2 h1:+1CdeLVrRQ6Psmhnobldo0kTp96Rj80DRXRd5OSnMEQ= +github.com/prometheus/otlptranslator v0.0.2/go.mod h1:P8AwMgdD7XEr6QRUJ2QWLpiAZTgTE2UYgjlu3svompI= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1222,18 +1217,18 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA= -github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ= -github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= -github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= +github.com/quic-go/quic-go v0.55.0 h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk= +github.com/quic-go/quic-go v0.55.0/go.mod h1:DR51ilwU1uE164KuWXhinFcKWGlEjzys2l8zUl5Ss1U= +github.com/quic-go/webtransport-go v0.9.0 h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70= +github.com/quic-go/webtransport-go v0.9.0/go.mod h1:4FUYIiUc75XSsF6HShcLeXXYZJ9AGwo/xh3L8M/P1ao= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= @@ -1243,8 +1238,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -1258,8 +1253,8 @@ github.com/schollz/progressbar/v3 v3.18.0 h1:uXdoHABRFmNIjUfte/Ex7WtuyVslrw2wVPQ github.com/schollz/progressbar/v3 v3.18.0/go.mod h1:IsO3lpbaGuzh8zIMzgY3+J8l4C8GjO0Y9S69eFvNsec= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -1333,8 +1328,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= @@ -1342,6 +1337,8 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= +github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -1349,21 +1346,21 @@ github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= github.com/triplewz/poseidon v0.0.2 h1:s5QMVYnUfqvgM1eIqp7O9hHjZLVrKnkhx0E7EQTf9Nk= github.com/triplewz/poseidon v0.0.2/go.mod h1:fmoxtMcbtMUjlSJmpuS3Wk/oKSvdJpIp9YWRbsOu3T0= -github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg= -github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= +github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= +github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= -github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= +github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= @@ -1414,8 +1411,10 @@ github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/ github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= -github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg= +github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yugabyte/gocql v1.6.0-yb-1 h1:3anNiHsJwKQ8Dn7RdmkTEuIzV1l7e9QJZ8wkOZ87ELg= github.com/yugabyte/gocql v1.6.0-yb-1/go.mod h1:LAokR6+vevDCrTxk52U7p6ki+4qELu4XU7JUGYa2O2M= github.com/yugabyte/pgx/v5 v5.5.3-yb-2 h1:SDk2waZb2o6dSLYqk+vq0Ur2jnIv+X2A+P+QPR1UThU= @@ -1426,16 +1425,20 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zondax/golem v0.27.0 h1:IbBjGIXF3SoGOZHsILJvIM/F/ylwJzMcHAcggiqniPw= +github.com/zondax/golem v0.27.0/go.mod h1:AmorCgJPt00L8xN1VrMBe13PSifoZksnQ1Ge906bu4A= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-filecoin-go v1.1.0 h1:sDHycC/e4wbniEb8i95pctR3vr0kg2tOt/K9Opvcu2Y= -github.com/zondax/ledger-filecoin-go v1.1.0/go.mod h1:IkszJ5Fp0vAACKBgZ7TbyBnSltFOkWGffvGa8ojgGMA= -github.com/zondax/ledger-go v1.0.0 h1:BvNoksIyRqyQTW78rIZP9A44WwAminKiomQa7jXp9EI= -github.com/zondax/ledger-go v1.0.0/go.mod h1:HpgkgFh3Jkwi9iYLDATdyRxc8CxqxcywsFj6QerWzvo= +github.com/zondax/ledger-filecoin-go v1.2.0 h1:e65aaVniNrQaC3Tsz1bc1vZ1RMDF6Jz4lItnfILaJp0= +github.com/zondax/ledger-filecoin-go v1.2.0/go.mod h1:Z4cxb0QtB5KVizDiJJ78wSUArm/iWIAyRI/ApY91Dls= +github.com/zondax/ledger-go v1.0.1 h1:Ks/2tz/dOF+dbRynfZ0dEhcdL1lqw43Sa0zMXHpQ3aQ= +github.com/zondax/ledger-go v1.0.1/go.mod h1:j7IgMY39f30apthJYMd1YsHZRqdyu4KbVmUp0nU78X0= github.com/zyedidia/generic v1.2.1 h1:Zv5KS/N2m0XZZiuLS82qheRG4X1o5gsWreGb0hR7XDc= github.com/zyedidia/generic v1.2.1/go.mod h1:ly2RBz4mnz1yeuVbQA/VFwGjK3mnHGRj1JuoG336Bis= gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= @@ -1448,8 +1451,8 @@ go.dedis.ch/kyber/v4 v4.0.0-pre2.0.20240924132404-4de33740016e h1:BAGc1ommHzlhqH go.dedis.ch/kyber/v4 v4.0.0-pre2.0.20240924132404-4de33740016e/go.mod h1:tg6jwKTYEjm94VxkFwiQy+ec9hoQvccIU989wNjXWVI= go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= -go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -1461,40 +1464,38 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/bridge/opencensus v1.28.0 h1:/BcyAV1bUJjSVxoeKwTQL9cS4X1iC6izZ9mheeuVSCU= go.opentelemetry.io/otel/bridge/opencensus v1.28.0/go.mod h1:FZp2xE+46yAyp3DfLFALze58nY0iIE8zs+mCgkPAzq0= go.opentelemetry.io/otel/exporters/jaeger v1.14.0 h1:CjbUNd4iN2hHmWekmOqZ+zSCU+dzZppG8XsV+A3oc8Q= go.opentelemetry.io/otel/exporters/jaeger v1.14.0/go.mod h1:4Ay9kk5vELRrbg5z4cpP9EtmQRFap2Wb0woPG4lujZA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= -go.opentelemetry.io/otel/exporters/prometheus v0.50.0 h1:2Ewsda6hejmbhGFyUvWZjUThC98Cf8Zy6g0zkIimOng= -go.opentelemetry.io/otel/exporters/prometheus v0.50.0/go.mod h1:pMm5PkUo5YwbLiuEf7t2xg4wbP0/eSJrMxIMxKosynY= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= -go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4= go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg= @@ -1502,8 +1503,8 @@ go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= -go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1516,6 +1517,8 @@ go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc= @@ -1545,8 +1548,8 @@ golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1557,8 +1560,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= -golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b h1:18qgiDvlvH7kk8Ioa8Ov+K6xCi0GMvmGfGW0sgd/SYA= +golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1584,8 +1587,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1641,8 +1644,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1667,8 +1670,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1706,7 +1709,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1740,8 +1742,6 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1750,8 +1750,10 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20251009181524-91c411e14f39 h1:jHQt1JBuPc+c/cAlupnkce8or0E04hX2Oqmnqq1XCVA= +golang.org/x/telemetry v0.0.0-20251009181524-91c411e14f39/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1761,8 +1763,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1775,14 +1777,14 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1838,8 +1840,8 @@ golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1908,10 +1910,11 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1928,8 +1931,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= -google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1944,12 +1947,13 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= @@ -1971,6 +1975,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= @@ -1991,7 +1996,5 @@ lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/itests/curio_test.go b/itests/curio_test.go index 2e09d553f..dc39650f6 100644 --- a/itests/curio_test.go +++ b/itests/curio_test.go @@ -93,7 +93,7 @@ func TestCurioHappyPath(t *testing.T) { sectorSizeInt, err := units.RAMInBytes("2KiB") require.NoError(t, err) - maddr, err := createminer.CreateStorageMiner(ctx, full, addr, addr, addr, abi.SectorSize(sectorSizeInt), 0) + maddr, err := createminer.CreateStorageMiner(ctx, full, addr, addr, addr, abi.SectorSize(sectorSizeInt), 0, 1.0) require.NoError(t, err) err = deps.CreateMinerConfig(ctx, full, db, []string{maddr.String()}, fapi) diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index 587f266e6..4e19656a8 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -8,6 +8,7 @@ import ( "github.com/ipfs/go-graphsync/storeutil" logging "github.com/ipfs/go-log/v2" "github.com/ipld/frisbii" + ipld "github.com/ipld/go-ipld-prime" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/lib/cachedreader" @@ -24,9 +25,11 @@ type Provider struct { cpr *cachedreader.CachedPieceReader } -const piecePrefix = "/piece/" -const ipfsPrefix = "/ipfs/" -const infoPage = "/info" +const ( + piecePrefix = "/piece/" + ipfsPrefix = "/ipfs/" + infoPage = "/info" +) func NewRetrievalProvider(ctx context.Context, db *harmonydb.DB, idxStore *indexstore.IndexStore, cpr *cachedreader.CachedPieceReader) *Provider { bs := remoteblockstore.NewRemoteBlockstore(idxStore, db, cpr) @@ -41,10 +44,32 @@ func NewRetrievalProvider(ctx context.Context, db *harmonydb.DB, idxStore *index } } +// NewRetrievalProviderWithLinkSystem creates a Provider with a custom LinkSystem for testing +func NewRetrievalProviderWithLinkSystem(ctx context.Context, lsys ipld.LinkSystem) *Provider { + fr := frisbii.NewHttpIpfs(ctx, lsys) + + return &Provider{ + fr: fr, + } +} + +// logRequest logs incoming HTTP requests with their headers +func logRequest(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + log.Infow("HTTP request", + "method", r.Method, + "url", r.URL.String(), + "remote_addr", r.RemoteAddr, + "headers", r.Header) + next(w, r) + } +} + func Router(mux *chi.Mux, rp *Provider) { - mux.Get(piecePrefix+"{cid}", rp.handleByPieceCid) - mux.Get(ipfsPrefix+"{cid}", rp.fr.ServeHTTP) - mux.Get(infoPage, handleInfo) + mux.Get(piecePrefix+"{cid}", logRequest(rp.handleByPieceCid)) + mux.Get(ipfsPrefix+"*", logRequest(rp.fr.ServeHTTP)) + mux.Head(ipfsPrefix+"*", logRequest(rp.fr.ServeHTTP)) + mux.Get(infoPage, logRequest(handleInfo)) } func handleInfo(rw http.ResponseWriter, r *http.Request) { diff --git a/market/retrieval/retrieval_test.go b/market/retrieval/retrieval_test.go new file mode 100644 index 000000000..8732ba728 --- /dev/null +++ b/market/retrieval/retrieval_test.go @@ -0,0 +1,639 @@ +package retrieval + +import ( + "bytes" + "context" + "io" + "math/rand" + "net/http" + "net/http/httptest" + "testing" + + "github.com/go-chi/chi/v5" + "github.com/ipfs/go-cid" + unixfstestutil "github.com/ipfs/go-unixfsnode/testutil" + carv2 "github.com/ipld/go-car/v2" + unixfsgen "github.com/ipld/go-fixtureplate/generator" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ipld/go-ipld-prime/storage/memstore" + trustlesstestutil "github.com/ipld/go-trustless-utils/testutil" + "github.com/stretchr/testify/require" +) + +// TestIPFSPathRouting verifies that the IPFS router accepts full paths including nested components +// Note that Frisbii already has a full Trustless Gateway test suite and runs against the gateway +// conformance tests so this test is primarily to verify that our routing setup works as expected. +func TestIPFSPathRouting(t *testing.T) { + ctx := context.Background() + + // Create in-memory storage and LinkSystem + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + lsys.TrustedStorage = true + + // Create a random reader for data generation + rndSeed := int64(1234) // Fixed seed for reproducibility + rndReader := io.LimitReader(rand.New(rand.NewSource(rndSeed)), int64(4<<30)) + + // Generate a simple file for testing + entity, err := unixfsgen.Parse("file:100B") + require.NoError(t, err) + rootEnt, err := entity.Generate(lsys, rndReader) + require.NoError(t, err) + + // Create a directory structure with files for path testing + dirEntity, err := unixfsgen.Parse("dir(file:50B{name:\"test.txt\"},file:75B{name:\"data.json\"})") + require.NoError(t, err) + dirRootEnt, err := dirEntity.Generate(lsys, rndReader) + require.NoError(t, err) + + // Create a Provider with the LinkSystem + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + + // Set up router + mux := chi.NewMux() + Router(mux, provider) + + testCases := []struct { + name string + method string + path string + expectMatch bool + expectStatus int + }{ + { + name: "GET simple file", + method: http.MethodGet, + path: "/ipfs/" + rootEnt.Root.String(), + expectMatch: true, + expectStatus: http.StatusOK, + }, + { + name: "GET directory", + method: http.MethodGet, + path: "/ipfs/" + dirRootEnt.Root.String(), + expectMatch: true, + expectStatus: http.StatusOK, + }, + { + name: "GET directory with file path", + method: http.MethodGet, + path: "/ipfs/" + dirRootEnt.Root.String() + "/test.txt", + expectMatch: true, + expectStatus: http.StatusOK, + }, + { + name: "HEAD simple file", + method: http.MethodHead, + path: "/ipfs/" + rootEnt.Root.String(), + expectMatch: true, + expectStatus: http.StatusOK, + }, + { + name: "HEAD directory with path", + method: http.MethodHead, + path: "/ipfs/" + dirRootEnt.Root.String() + "/data.json", + expectMatch: true, + expectStatus: http.StatusOK, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + req := httptest.NewRequest(tc.method, tc.path, nil) + // Add Accept header for trustless gateway (CAR format) + req.Header.Set("Accept", "application/vnd.ipld.car") + w := httptest.NewRecorder() + + // Execute the request + mux.ServeHTTP(w, req) + + // Verify the route was matched + if tc.expectMatch { + // Chi returns "404 page not found" for unmatched routes + if w.Code == http.StatusNotFound { + body := w.Body.String() + require.NotContains(t, body, "404 page not found", + "Chi router did not match path: %s", tc.path) + } + + // Verify expected status + if tc.expectStatus != 0 { + require.Equal(t, tc.expectStatus, w.Code, + "Unexpected status for path: %s (body: %s)", tc.path, w.Body.String()) + } + } + }) + } +} + +// TestRouterSetup verifies that all expected routes are registered +func TestRouterSetup(t *testing.T) { + ctx := context.Background() + + // Create minimal LinkSystem for router setup + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + + mux := chi.NewMux() + Router(mux, provider) + + // Test that non-IPFS routes work + req := httptest.NewRequest(http.MethodGet, "/info", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + require.Contains(t, w.Body.String(), "Version") +} + +// TestTrustlessGatewaySentinel tests the special sentinel CID (bafkqaaa - identity empty CID) +// which is used as a probe for trustless gateway conformance +func TestTrustlessGatewaySentinel(t *testing.T) { + ctx := context.Background() + + // Create minimal LinkSystem + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + lsys.TrustedStorage = true + + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + mux := chi.NewMux() + Router(mux, provider) + + testCases := []struct { + name string + method string + accept string + }{ + { + name: "GET sentinel with CAR accept", + method: http.MethodGet, + accept: "application/vnd.ipld.car", + }, + { + name: "GET sentinel with raw accept", + method: http.MethodGet, + accept: "application/vnd.ipld.raw", + }, + { + name: "HEAD sentinel with CAR accept", + method: http.MethodHead, + accept: "application/vnd.ipld.car", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + req := httptest.NewRequest(tc.method, "/ipfs/bafkqaaa", nil) + req.Header.Set("Accept", tc.accept) + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + // Sentinel should return 200 OK + require.Equal(t, http.StatusOK, w.Code, + "Sentinel bafkqaaa should return 200 OK") + }) + } +} + +// TestTrustlessGatewayHeaders validates that responses include required trustless gateway headers +func TestTrustlessGatewayHeaders(t *testing.T) { + ctx := context.Background() + + // Create in-memory storage and LinkSystem + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + lsys.TrustedStorage = true + + // Generate a simple test file + rndSeed := int64(5678) + rndReader := io.LimitReader(rand.New(rand.NewSource(rndSeed)), int64(4<<30)) + entity, err := unixfsgen.Parse("file:100B") + require.NoError(t, err) + rootEnt, err := entity.Generate(lsys, rndReader) + require.NoError(t, err) + + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + mux := chi.NewMux() + Router(mux, provider) + + t.Run("CAR response headers", func(t *testing.T) { + req := httptest.NewRequest(http.MethodGet, "/ipfs/"+rootEnt.Root.String(), nil) + req.Header.Set("Accept", "application/vnd.ipld.car") + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + + // Verify required headers + contentType := w.Header().Get("Content-Type") + require.NotEmpty(t, contentType, "Content-Type header is required") + require.Contains(t, contentType, "application/vnd.ipld.car", + "Content-Type should indicate CAR format") + + contentDisposition := w.Header().Get("Content-Disposition") + require.NotEmpty(t, contentDisposition, "Content-Disposition header is required") + require.Contains(t, contentDisposition, "attachment", + "Content-Disposition should be 'attachment'") + + etag := w.Header().Get("Etag") + require.NotEmpty(t, etag, "Etag header is required") + }) +} + +// TestTrustlessGatewayAcceptHeader tests content negotiation via Accept header +func TestTrustlessGatewayAcceptHeader(t *testing.T) { + ctx := context.Background() + + // Create minimal LinkSystem + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + lsys.TrustedStorage = true + + // Generate a simple test file + rndSeed := int64(9012) + rndReader := io.LimitReader(rand.New(rand.NewSource(rndSeed)), int64(4<<30)) + entity, err := unixfsgen.Parse("file:50B") + require.NoError(t, err) + rootEnt, err := entity.Generate(lsys, rndReader) + require.NoError(t, err) + + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + mux := chi.NewMux() + Router(mux, provider) + + t.Run("Missing Accept header returns 400", func(t *testing.T) { + // Note that Frisbii will be forgiving about a wildcard Accept header, + // so we specifically omit the header entirely to test the strict case. + + req := httptest.NewRequest(http.MethodGet, "/ipfs/"+rootEnt.Root.String(), nil) + // Intentionally omit Accept header + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + // Trustless gateways should return 400 when Accept header is missing + require.Equal(t, http.StatusBadRequest, w.Code, + "Missing Accept header should return 400 Bad Request") + }) + + t.Run("Valid Accept header returns 200", func(t *testing.T) { + req := httptest.NewRequest(http.MethodGet, "/ipfs/"+rootEnt.Root.String(), nil) + req.Header.Set("Accept", "application/vnd.ipld.car") + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code, + "Valid Accept header should return 200 OK") + }) +} + +// TestTrustlessGatewayQueryParameters tests dag-scope and other query parameters +func TestTrustlessGatewayQueryParameters(t *testing.T) { + ctx := context.Background() + + // Create in-memory storage + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + lsys.TrustedStorage = true + + // Generate a directory with files + rndSeed := int64(3456) + rndReader := io.LimitReader(rand.New(rand.NewSource(rndSeed)), int64(4<<30)) + dirEntity, err := unixfsgen.Parse("dir(file:50B{name:\"a.txt\"},file:75B{name:\"b.txt\"})") + require.NoError(t, err) + dirRootEnt, err := dirEntity.Generate(lsys, rndReader) + require.NoError(t, err) + + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + mux := chi.NewMux() + Router(mux, provider) + + testCases := []struct { + name string + queryPath string + expectCode int + }{ + { + name: "dag-scope=all", + queryPath: "/ipfs/" + dirRootEnt.Root.String() + "?dag-scope=all", + expectCode: http.StatusOK, + }, + { + name: "dag-scope=entity", + queryPath: "/ipfs/" + dirRootEnt.Root.String() + "?dag-scope=entity", + expectCode: http.StatusOK, + }, + { + name: "dag-scope=block", + queryPath: "/ipfs/" + dirRootEnt.Root.String() + "?dag-scope=block", + expectCode: http.StatusOK, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + req := httptest.NewRequest(http.MethodGet, tc.queryPath, nil) + req.Header.Set("Accept", "application/vnd.ipld.car") + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + require.Equal(t, tc.expectCode, w.Code, + "Query parameter test %s failed", tc.name) + }) + } +} + +// collectAllCIDs recursively collects all unique CIDs from a DirEntry structure in traversal order +func collectAllCIDs(entry unixfstestutil.DirEntry) []cid.Cid { + seen := make(map[cid.Cid]bool) + var cids []cid.Cid + + var collect func(e unixfstestutil.DirEntry) + collect = func(e unixfstestutil.DirEntry) { + // Add root if not seen + if !seen[e.Root] { + cids = append(cids, e.Root) + seen[e.Root] = true + } + + // Add self CIDs if not seen + for _, c := range e.SelfCids { + if !seen[c] { + cids = append(cids, c) + seen[c] = true + } + } + + // Recurse into children + for _, child := range e.Children { + collect(child) + } + } + + collect(entry) + return cids +} + +// TestRawBlockRetrieval tests retrieving individual blocks with application/vnd.ipld.raw +// This is currently the primary use case for the retrieval endpoint by the Boxo/Kubo stack +func TestRawBlockRetrieval(t *testing.T) { + ctx := context.Background() + + // Create in-memory storage + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + lsys.TrustedStorage = true + + // Generate a directory structure with multiple files to get multiple blocks + rndSeed := int64(7890) + rndReader := io.LimitReader(rand.New(rand.NewSource(rndSeed)), int64(4<<30)) + dirEntity, err := unixfsgen.Parse("dir(file:100B{name:\"a.txt\"},file:150B{name:\"b.json\"},file:200B{name:\"c.dat\"})") + require.NoError(t, err) + dirRootEnt, err := dirEntity.Generate(lsys, rndReader) + require.NoError(t, err) + + // Collect all CIDs from the generated structure + allCIDs := collectAllCIDs(dirRootEnt) + require.NotEmpty(t, allCIDs, "Should have generated multiple CIDs") + + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + mux := chi.NewMux() + Router(mux, provider) + + // Test retrieval of each individual block + for i, c := range allCIDs { + t.Run("GET raw block "+c.String()[:16], func(t *testing.T) { + req := httptest.NewRequest(http.MethodGet, "/ipfs/"+c.String(), nil) + req.Header.Set("Accept", "application/vnd.ipld.raw") + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code, + "Block %d (CID: %s) should be retrievable", i, c.String()) + + // Verify Content-Type for raw block + contentType := w.Header().Get("Content-Type") + require.Contains(t, contentType, "application/vnd.ipld.raw", + "Content-Type should indicate raw block format") + + // Verify we got data back + require.NotEmpty(t, w.Body.Bytes(), + "Response should contain block data") + }) + } + + // Test HEAD requests for raw blocks + t.Run("HEAD raw block", func(t *testing.T) { + if len(allCIDs) > 0 { + c := allCIDs[0] + req := httptest.NewRequest(http.MethodHead, "/ipfs/"+c.String(), nil) + req.Header.Set("Accept", "application/vnd.ipld.raw") + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code, + "HEAD request should succeed for raw block") + + contentType := w.Header().Get("Content-Type") + require.Contains(t, contentType, "application/vnd.ipld.raw", + "Content-Type should indicate raw block format") + } + }) +} + +// TestMissingBlockReturns404 tests that missing root blocks return 404 as per trustless gateway spec +func TestMissingBlockReturns404(t *testing.T) { + ctx := context.Background() + + // Create minimal empty LinkSystem + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + lsys.TrustedStorage = true + + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + mux := chi.NewMux() + Router(mux, provider) + + // Create a CID that doesn't exist in the store + nonExistentCID := "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi" + + testCases := []struct { + name string + method string + accept string + }{ + { + name: "GET missing block with raw accept", + method: http.MethodGet, + accept: "application/vnd.ipld.raw", + }, + { + name: "GET missing block with CAR accept", + method: http.MethodGet, + accept: "application/vnd.ipld.car", + }, + { + name: "HEAD missing block with raw accept", + method: http.MethodHead, + accept: "application/vnd.ipld.raw", + }, + { + name: "HEAD missing block with CAR accept", + method: http.MethodHead, + accept: "application/vnd.ipld.car", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + req := httptest.NewRequest(tc.method, "/ipfs/"+nonExistentCID, nil) + req.Header.Set("Accept", tc.accept) + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + // Per trustless gateway spec, missing root blocks MUST return 404 + require.Equal(t, http.StatusNotFound, w.Code, + "Missing root block should return 404 Not Found") + }) + } +} + +// TestDagScopeCAR validates that dag-scope parameter returns correct CAR contents +func TestDagScopeCAR(t *testing.T) { + ctx := context.Background() + + // Create in-memory storage + store := &trustlesstestutil.CorrectedMemStore{ + ParentStore: &memstore.Store{Bag: make(map[string][]byte)}, + } + lsys := cidlink.DefaultLinkSystem() + lsys.SetReadStorage(store) + lsys.SetWriteStorage(store) + lsys.TrustedStorage = true + + // Generate a directory structure with multiple files + rndSeed := int64(1111) + rndReader := io.LimitReader(rand.New(rand.NewSource(rndSeed)), int64(4<<30)) + dirEntity, err := unixfsgen.Parse("dir(file:100B{name:\"a.txt\"},file:150B{name:\"b.txt\"})") + require.NoError(t, err) + dirRootEnt, err := dirEntity.Generate(lsys, rndReader) + require.NoError(t, err) + + // Collect all CIDs from the structure + allCIDs := collectAllCIDs(dirRootEnt) + require.NotEmpty(t, allCIDs, "Should have generated multiple CIDs") + + provider := NewRetrievalProviderWithLinkSystem(ctx, lsys) + mux := chi.NewMux() + Router(mux, provider) + + t.Run("dag-scope=block returns single block CAR", func(t *testing.T) { + req := httptest.NewRequest(http.MethodGet, "/ipfs/"+dirRootEnt.Root.String()+"?dag-scope=block", nil) + req.Header.Set("Accept", "application/vnd.ipld.car") + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + + // Parse the CAR response + carReader, err := carv2.NewBlockReader(bytes.NewReader(w.Body.Bytes())) + require.NoError(t, err, "Should be able to parse CAR response") + + // Count blocks in CAR + blockCount := 0 + for { + block, err := carReader.Next() + if err == io.EOF { + break + } + require.NoError(t, err) + blockCount++ + + // For dag-scope=block, should only have the root block + if blockCount == 1 { + require.Equal(t, dirRootEnt.Root, block.Cid(), + "First block should be the root CID") + } + } + + require.Equal(t, 1, blockCount, + "dag-scope=block should return exactly 1 block") + }) + + t.Run("dag-scope=all returns all blocks CAR in correct order", func(t *testing.T) { + req := httptest.NewRequest(http.MethodGet, "/ipfs/"+dirRootEnt.Root.String()+"?dag-scope=all", nil) + req.Header.Set("Accept", "application/vnd.ipld.car") + w := httptest.NewRecorder() + + mux.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + + // Parse the CAR response + carReader, err := carv2.NewBlockReader(bytes.NewReader(w.Body.Bytes())) + require.NoError(t, err, "Should be able to parse CAR response") + + // Collect CIDs from CAR in order + var carCIDs []cid.Cid + for { + block, err := carReader.Next() + if err == io.EOF { + break + } + require.NoError(t, err) + carCIDs = append(carCIDs, block.Cid()) + } + + // dag-scope=all should return all blocks from the fixture + require.Len(t, carCIDs, len(allCIDs), + "CAR should contain all blocks from the fixture") + + // Verify blocks are returned in traversal order + require.Equal(t, allCIDs, carCIDs, + "CAR blocks should be in traversal order matching fixture") + }) +} diff --git a/tasks/indexing/task_ipni.go b/tasks/indexing/task_ipni.go index 02bc8f110..8f84a8805 100644 --- a/tasks/indexing/task_ipni.go +++ b/tasks/indexing/task_ipni.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "io" + "net" "net/url" "strings" "time" @@ -17,10 +18,11 @@ import ( carv2 "github.com/ipld/go-car/v2" cidlink "github.com/ipld/go-ipld-prime/linking/cid" "github.com/ipni/go-libipni/ingest/schema" - "github.com/ipni/go-libipni/maurl" "github.com/ipni/go-libipni/metadata" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/peer" + "github.com/multiformats/go-multiaddr" + manet "github.com/multiformats/go-multiaddr/net" "github.com/yugabyte/pgx/v5" "golang.org/x/xerrors" @@ -206,7 +208,7 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b } } - addr, err := maurl.FromURL(u) + addr, err := FromURLWithPort(u) if err != nil { return false, xerrors.Errorf("converting URL to multiaddr: %w", err) } @@ -525,3 +527,66 @@ func (I *IPNITask) GetSpid(db *harmonydb.DB, taskID int64) string { var _ = harmonytask.Reg(&IPNITask{}) var _ harmonytask.TaskInterface = &IPNITask{} + +func FromURLWithPort(u *url.URL) (multiaddr.Multiaddr, error) { + h := u.Hostname() + var addr *multiaddr.Multiaddr + if n := net.ParseIP(h); n != nil { + ipAddr, err := manet.FromIP(n) + if err != nil { + return nil, err + } + addr = &ipAddr + } else { + // domain name + ma, err := multiaddr.NewComponent(multiaddr.ProtocolWithCode(multiaddr.P_DNS).Name, h) + if err != nil { + return nil, err + } + mab := multiaddr.Cast(ma.Bytes()) + addr = &mab + } + pv := u.Port() + if pv != "" { + port, err := multiaddr.NewComponent(multiaddr.ProtocolWithCode(multiaddr.P_TCP).Name, pv) + if err != nil { + return nil, err + } + wport := multiaddr.Join(*addr, port) + addr = &wport + } else { + // default ports for http and https + var port *multiaddr.Component + var err error + switch u.Scheme { + case "http": + port, err = multiaddr.NewComponent(multiaddr.ProtocolWithCode(multiaddr.P_TCP).Name, "80") + if err != nil { + return nil, err + } + case "https": + port, err = multiaddr.NewComponent(multiaddr.ProtocolWithCode(multiaddr.P_TCP).Name, "443") + } + if err != nil { + return nil, err + } + wport := multiaddr.Join(*addr, port) + addr = &wport + } + + http, err := multiaddr.NewComponent(u.Scheme, "") + if err != nil { + return nil, err + } + + joint := multiaddr.Join(*addr, http) + if u.Path != "" { + httppath, err := multiaddr.NewComponent(multiaddr.ProtocolWithCode(multiaddr.P_HTTP_PATH).Name, url.PathEscape(u.Path)) + if err != nil { + return nil, err + } + joint = multiaddr.Join(joint, httppath) + } + + return joint, nil +} From f77ece860708453ed0b0b28e31e0da6f4241ce01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 23 Oct 2025 16:31:49 +0200 Subject: [PATCH 55/67] add more caches --- lib/cachedreader/cachedreader.go | 63 ++++++++++++++++++++++-- lib/cachedreader/metrics.go | 77 ++++++++++++++++++++++++++++++ lib/paths/db_index.go | 36 +++++++++++++- lib/paths/index.go | 8 +++- lib/paths/metrics.go | 15 ++++++ lib/paths/remote.go | 14 ++++++ lib/pieceprovider/sector_reader.go | 14 +----- market/retrieval/retrieval.go | 40 +++++++++++++++- 8 files changed, 248 insertions(+), 19 deletions(-) create mode 100644 lib/cachedreader/metrics.go diff --git a/lib/cachedreader/cachedreader.go b/lib/cachedreader/cachedreader.go index 1bfaa2b98..e110e3350 100644 --- a/lib/cachedreader/cachedreader.go +++ b/lib/cachedreader/cachedreader.go @@ -12,6 +12,8 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" "github.com/jellydator/ttlcache/v2" + "go.opencensus.io/stats" + "go.opencensus.io/tag" "github.com/filecoin-project/go-state-types/abi" @@ -25,7 +27,7 @@ var ErrNoDeal = errors.New("no deals found") var log = logging.Logger("cached-reader") const ( - MaxCachedReaders = 128 + MaxCachedReaders = 512 PieceReaderCacheTTL = 10 * time.Minute PieceErrorCacheTTL = 5 * time.Second ) @@ -64,6 +66,12 @@ func NewCachedPieceReader(db *harmonydb.DB, sectorReader *pieceprovider.SectorRe expireCallback := func(key string, reason ttlcache.EvictionReason, value interface{}) { log.Debugw("expire callback", "piececid", key, "reason", reason) + // Record eviction metric + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(cacheTypeKey, "piece_reader"), + tag.Upsert(reasonKey, reason.String()), + }, CachedReaderMeasures.CacheEvictions.M(1)) + r := value.(*cachedSectionReader) cpr.pieceReaderCacheMu.Lock() @@ -81,6 +89,12 @@ func NewCachedPieceReader(db *harmonydb.DB, sectorReader *pieceprovider.SectorRe errorExpireCallback := func(key string, reason ttlcache.EvictionReason, value interface{}) { log.Debugw("error cache expire callback", "piececid", key, "reason", reason) + + // Record eviction metric + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(cacheTypeKey, "piece_error"), + tag.Upsert(reasonKey, reason.String()), + }, CachedReaderMeasures.CacheEvictions.M(1)) } prCache.SetExpirationReasonCallback(expireCallback) @@ -116,6 +130,9 @@ func (r *cachedSectionReader) Close() error { r.refs-- + // Record reference count metric + stats.Record(context.Background(), CachedReaderMeasures.CacheRefs.M(int64(r.refs))) + if r.refs == 0 && r.expired { log.Debugw("canceling underlying section reader context as cache entry doesn't exist", "piececid", r.pieceCid) @@ -225,6 +242,12 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid cachedErr := errorItem.(*cachedError) cpr.pieceErrorCacheMu.Unlock() log.Debugw("returning cached error", "piececid", pieceCid, "err", cachedErr.err) + + // Record cache hit for error cache + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(cacheTypeKey, "piece_error"), + }, CachedReaderMeasures.CacheHits.M(1)) + return nil, 0, cachedErr.err } cpr.pieceErrorCacheMu.Unlock() @@ -235,8 +258,12 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid cpr.pieceReaderCacheMu.Lock() rr, err := cpr.pieceReaderCache.Get(cacheKey) if err != nil { - // There is not yet a cached piece reader, create a new one and add it - // to the cache + // Cache miss - there is not yet a cached piece reader + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(cacheTypeKey, "piece_reader"), + }, CachedReaderMeasures.CacheMisses.M(1)) + + // Create a new one and add it to the cache r = &cachedSectionReader{ cpr: cpr, pieceCid: pieceCid, @@ -244,6 +271,12 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid refs: 1, } _ = cpr.pieceReaderCache.Set(cacheKey, r) + + // Record cache size + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(cacheTypeKey, "piece_reader"), + }, CachedReaderMeasures.CacheSize.M(int64(cpr.pieceReaderCache.Count()))) + cpr.pieceReaderCacheMu.Unlock() // We just added a cached reader, so get its underlying piece reader @@ -263,14 +296,27 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid finalErr := fmt.Errorf("failed to get piece reader from sector or piece park: %w, %w", err, serr) + // Record error metric + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(reasonKey, "piece_not_found"), + }, CachedReaderMeasures.ReaderErrors.M(1)) + // Cache the error in the error cache cpr.pieceErrorCacheMu.Lock() _ = cpr.pieceErrorCache.Set(cacheKey, &cachedError{err: finalErr, pieceCid: pieceCid}) + // Record error cache size + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(cacheTypeKey, "piece_error"), + }, CachedReaderMeasures.CacheSize.M(int64(cpr.pieceErrorCache.Count()))) cpr.pieceErrorCacheMu.Unlock() // Remove the failed reader from the main cache cpr.pieceReaderCacheMu.Lock() _ = cpr.pieceReaderCache.Remove(cacheKey) + // Record updated cache size + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(cacheTypeKey, "piece_reader"), + }, CachedReaderMeasures.CacheSize.M(int64(cpr.pieceReaderCache.Count()))) cpr.pieceReaderCacheMu.Unlock() r.err = finalErr @@ -280,14 +326,25 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid } } + // Record successful reader creation + stats.Record(context.Background(), CachedReaderMeasures.ReaderSuccesses.M(1)) + r.reader = reader r.err = nil r.cancel = readerCtxCancel r.pieceSize = size } else { + // Cache hit - we already have a cached reader + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(cacheTypeKey, "piece_reader"), + }, CachedReaderMeasures.CacheHits.M(1)) + r = rr.(*cachedSectionReader) r.refs++ + // Record reference count metric + stats.Record(context.Background(), CachedReaderMeasures.CacheRefs.M(int64(r.refs))) + cpr.pieceReaderCacheMu.Unlock() // We already had a cached reader, wait for it to be ready diff --git a/lib/cachedreader/metrics.go b/lib/cachedreader/metrics.go new file mode 100644 index 000000000..fd1f05bb3 --- /dev/null +++ b/lib/cachedreader/metrics.go @@ -0,0 +1,77 @@ +package cachedreader + +import ( + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +var ( + pre = "curio_cachedreader_" + + // Tag keys + cacheTypeKey, _ = tag.NewKey("cache_type") // "piece_reader" or "piece_error" + reasonKey, _ = tag.NewKey("reason") // eviction reason or error type +) + +// CachedReaderMeasures groups all cached reader metrics. +var CachedReaderMeasures = struct { + CacheHits *stats.Int64Measure + CacheMisses *stats.Int64Measure + CacheEvictions *stats.Int64Measure + CacheSize *stats.Int64Measure + CacheRefs *stats.Int64Measure + ReaderErrors *stats.Int64Measure + ReaderSuccesses *stats.Int64Measure +}{ + CacheHits: stats.Int64(pre+"cache_hits", "Number of cache hits.", stats.UnitDimensionless), + CacheMisses: stats.Int64(pre+"cache_misses", "Number of cache misses.", stats.UnitDimensionless), + CacheEvictions: stats.Int64(pre+"cache_evictions", "Number of cache evictions.", stats.UnitDimensionless), + CacheSize: stats.Int64(pre+"cache_size", "Current number of entries in cache.", stats.UnitDimensionless), + CacheRefs: stats.Int64(pre+"cache_refs", "Number of active references to cached readers.", stats.UnitDimensionless), + ReaderErrors: stats.Int64(pre+"reader_errors", "Total number of piece reader errors.", stats.UnitDimensionless), + ReaderSuccesses: stats.Int64(pre+"reader_successes", "Total number of successful piece reader creations.", stats.UnitDimensionless), +} + +func init() { + err := view.Register( + &view.View{ + Measure: CachedReaderMeasures.CacheHits, + Aggregation: view.Sum(), + TagKeys: []tag.Key{cacheTypeKey}, + }, + &view.View{ + Measure: CachedReaderMeasures.CacheMisses, + Aggregation: view.Sum(), + TagKeys: []tag.Key{cacheTypeKey}, + }, + &view.View{ + Measure: CachedReaderMeasures.CacheEvictions, + Aggregation: view.Sum(), + TagKeys: []tag.Key{cacheTypeKey, reasonKey}, + }, + &view.View{ + Measure: CachedReaderMeasures.CacheSize, + Aggregation: view.LastValue(), + TagKeys: []tag.Key{cacheTypeKey}, + }, + &view.View{ + Measure: CachedReaderMeasures.CacheRefs, + Aggregation: view.LastValue(), + TagKeys: []tag.Key{}, + }, + &view.View{ + Measure: CachedReaderMeasures.ReaderErrors, + Aggregation: view.Sum(), + TagKeys: []tag.Key{reasonKey}, + }, + &view.View{ + Measure: CachedReaderMeasures.ReaderSuccesses, + Aggregation: view.Sum(), + TagKeys: []tag.Key{}, + }, + ) + if err != nil { + panic(err) + } +} diff --git a/lib/paths/db_index.go b/lib/paths/db_index.go index 5d778bcb5..6d47195af 100644 --- a/lib/paths/db_index.go +++ b/lib/paths/db_index.go @@ -11,6 +11,7 @@ import ( "time" "github.com/google/uuid" + "github.com/jellydator/ttlcache/v2" "github.com/yugabyte/pgx/v5" "go.opencensus.io/stats" "go.opencensus.io/tag" @@ -555,7 +556,40 @@ func (dbi *DBIndex) StorageDropSector(ctx context.Context, storageID storiface.I return nil } -func (dbi *DBIndex) StorageFindSector(ctx context.Context, s abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) { +func (dbi *DBIndex) StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) { + if ctx.Value(FindSectorCacheKey) == nil || allowFetch == true { + stats.Record(ctx, FindSectorUncached.M(1)) + return dbi.findSectorUncached(ctx, sector, ft, ssize, allowFetch) + } + + findSectorCache := ctx.Value(FindSectorCacheKey).(*ttlcache.Cache) + + cacheKey := fmt.Sprintf("%d-%d-%d", sector.Miner, sector.Number, ft) + + info, err := findSectorCache.Get(cacheKey) + if err == nil { + // Cache hit - return the cached result + if cachedInfo, ok := info.([]storiface.SectorStorageInfo); ok { + stats.Record(ctx, FindSectorCacheHits.M(1)) + return cachedInfo, nil + } + } + + // Cache miss - fetch from index and cache the result + stats.Record(ctx, FindSectorCacheMisses.M(1)) + + si, err := dbi.findSectorUncached(ctx, sector, ft, ssize, allowFetch) + if err != nil { + return nil, err + } + + // Cache the result for future use + _ = findSectorCache.Set(cacheKey, si) + + return si, nil +} + +func (dbi *DBIndex) findSectorUncached(ctx context.Context, s abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) { var result []storiface.SectorStorageInfo diff --git a/lib/paths/index.go b/lib/paths/index.go index 35e667fe1..3a82ecf4d 100644 --- a/lib/paths/index.go +++ b/lib/paths/index.go @@ -25,6 +25,10 @@ type spaceUseCtxKey struct{} var SpaceUseKey = spaceUseCtxKey{} +type findSectorCacheKey struct {} + +var FindSectorCacheKey = findSectorCacheKey{} + type SectorIndex interface { // part of storage-miner api StorageAttach(context.Context, storiface.StorageInfo, fsutil.FsStat) error StorageDetach(ctx context.Context, id storiface.ID, url string) error @@ -33,8 +37,10 @@ type SectorIndex interface { // part of storage-miner api StorageDeclareSector(ctx context.Context, storageID storiface.ID, s abi.SectorID, ft storiface.SectorFileType, primary bool) error StorageDropSector(ctx context.Context, storageID storiface.ID, s abi.SectorID, ft storiface.SectorFileType) error - StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) BatchStorageDeclareSectors(ctx context.Context, declarations []SectorDeclaration) error + + // FindSector can be cached if the ctx propagates a ttlcache instance over FindSectorCacheKey + StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) StorageBestAlloc(ctx context.Context, allocate storiface.SectorFileType, ssize abi.SectorSize, pathType storiface.PathType, miner abi.ActorID) ([]storiface.StorageInfo, error) diff --git a/lib/paths/metrics.go b/lib/paths/metrics.go index 2523263c7..e13bc182b 100644 --- a/lib/paths/metrics.go +++ b/lib/paths/metrics.go @@ -22,6 +22,9 @@ var ( GenerateSingleVanillaProofCalls = stats.Int64(pre+"generate_single_vanilla_proof_calls", "Number of calls to GenerateSingleVanillaProof", stats.UnitDimensionless) GenerateSingleVanillaProofErrors = stats.Int64(pre+"generate_single_vanilla_proof_errors", "Number of errors in GenerateSingleVanillaProof", stats.UnitDimensionless) GenerateSingleVanillaProofDuration = stats.Int64(pre+"generate_single_vanilla_proof_duration_seconds", "Duration of GenerateSingleVanillaProof in seconds", stats.UnitMilliseconds) + FindSectorUncached = stats.Int64(pre+"find_sector_uncached", "Number of findSector uncached calls", stats.UnitDimensionless) + FindSectorCacheHits = stats.Int64(pre+"find_sector_cache_hits", "Number of findSectorCache hits", stats.UnitDimensionless) + FindSectorCacheMisses = stats.Int64(pre+"find_sector_cache_misses", "Number of findSectorCache misses", stats.UnitDimensionless) ) func init() { @@ -41,6 +44,18 @@ func init() { Aggregation: view.Distribution(durationBuckets...), TagKeys: []tag.Key{updateTagKey, cacheIDTagKey, sealedIDTagKey}, }, + &view.View{ + Measure: FindSectorUncached, + Aggregation: view.Sum(), + }, + &view.View{ + Measure: FindSectorCacheHits, + Aggregation: view.Sum(), + }, + &view.View{ + Measure: FindSectorCacheMisses, + Aggregation: view.Sum(), + }, ) if err != nil { panic(err) diff --git a/lib/paths/remote.go b/lib/paths/remote.go index f4b340a48..a1cd00629 100644 --- a/lib/paths/remote.go +++ b/lib/paths/remote.go @@ -16,6 +16,7 @@ import ( "time" "github.com/hashicorp/go-multierror" + "github.com/jellydator/ttlcache/v2" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" @@ -45,6 +46,8 @@ type Remote struct { fetching map[abi.SectorID]chan struct{} pfHandler PartialFileHandler + + findSectorCache *ttlcache.Cache } func (r *Remote) RemoveCopies(ctx context.Context, s abi.SectorID, typ storiface.SectorFileType) error { @@ -80,6 +83,11 @@ func (r *Remote) RemoveCopies(ctx context.Context, s abi.SectorID, typ storiface } func NewRemote(local Store, index SectorIndex, auth http.Header, fetchLimit int, pfHandler PartialFileHandler) *Remote { + + findSectorCache := ttlcache.NewCache() + findSectorCache.SetTTL(10 * time.Minute) + findSectorCache.SetCacheSizeLimit(65_000) + return &Remote{ local: local, index: index, @@ -89,6 +97,8 @@ func NewRemote(local Store, index SectorIndex, auth http.Header, fetchLimit int, fetching: map[abi.SectorID]chan struct{}{}, pfHandler: pfHandler, + + findSectorCache: findSectorCache, } } @@ -605,6 +615,8 @@ func (r *Remote) CheckIsUnsealed(ctx context.Context, s storiface.SectorRef, off func (r *Remote) Reader(ctx context.Context, s storiface.SectorRef, offset, size abi.PaddedPieceSize) (func(startOffsetAligned, endOffsetAligned storiface.PaddedByteIndex) (io.ReadCloser, error), error) { ft := storiface.FTUnsealed + ctx = context.WithValue(ctx, FindSectorCacheKey, r.findSectorCache) + // check if we have the unsealed sector file locally paths, _, err := r.local.AcquireSector(ctx, s, ft, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove) if err != nil { @@ -912,6 +924,8 @@ func (r *Remote) ReaderPiece(ctx context.Context, s storiface.SectorRef, ft stor // ReaderSeq creates a simple sequential reader for a file. Does not work for // file types which are a directory (e.g. FTCache). func (r *Remote) ReaderSeq(ctx context.Context, s storiface.SectorRef, ft storiface.SectorFileType) (io.ReadCloser, error) { + ctx = context.WithValue(ctx, FindSectorCacheKey, r.findSectorCache) + paths, _, err := r.local.AcquireSector(ctx, s, ft, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove) if err != nil { return nil, xerrors.Errorf("acquire local: %w", err) diff --git a/lib/pieceprovider/sector_reader.go b/lib/pieceprovider/sector_reader.go index f8ef2d9bb..02a7dd406 100644 --- a/lib/pieceprovider/sector_reader.go +++ b/lib/pieceprovider/sector_reader.go @@ -45,12 +45,7 @@ func (p *SectorReader) ReadPiece(ctx context.Context, sector storiface.SectorRef return nil, xerrors.Errorf("size is not a valid piece size: %w", err) } - // acquire a lock purely for reading unsealed sectors ctx, cancel := context.WithCancel(ctx) - if err := p.index.StorageLock(ctx, sector.ID, storiface.FTUnsealed, storiface.FTNone); err != nil { - cancel() - return nil, xerrors.Errorf("acquiring read sector lock: %w", err) - } // Reader returns a reader getter for an unsealed piece at the given offset in the given sector. // The returned reader will be nil if none of the workers has an unsealed sector file containing @@ -138,14 +133,7 @@ func (p *SectorReader) IsUnsealed(ctx context.Context, sector storiface.SectorRe return false, xerrors.Errorf("size is not a valid piece size: %w", err) } - ctxLock, cancel := context.WithCancel(ctx) - defer cancel() - - if err := p.index.StorageLock(ctxLock, sector.ID, storiface.FTUnsealed, storiface.FTNone); err != nil { - return false, xerrors.Errorf("acquiring read sector lock: %w", err) - } - - return p.storage.CheckIsUnsealed(ctxLock, sector, abi.PaddedPieceSize(offset.Padded()), size.Padded()) + return p.storage.CheckIsUnsealed(ctx, sector, abi.PaddedPieceSize(offset.Padded()), size.Padded()) } type funcCloser func() error diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index 4e19656a8..6bbc80915 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -5,15 +5,19 @@ import ( "net/http" "github.com/go-chi/chi/v5" + lru "github.com/hashicorp/golang-lru/arc/v2" "github.com/ipfs/go-graphsync/storeutil" + blocks "github.com/ipfs/go-block-format" logging "github.com/ipfs/go-log/v2" "github.com/ipld/frisbii" ipld "github.com/ipld/go-ipld-prime" + "github.com/snadrus/must" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/lib/cachedreader" "github.com/filecoin-project/curio/market/indexstore" "github.com/filecoin-project/curio/market/retrieval/remoteblockstore" + "github.com/filecoin-project/lotus/blockstore" ) var log = logging.Logger("retrievals") @@ -31,9 +35,13 @@ const ( infoPage = "/info" ) +var RetrievalBlockCache = must.One(lru.NewARC[blockstore.MhString, blocks.Block](4096)) + func NewRetrievalProvider(ctx context.Context, db *harmonydb.DB, idxStore *indexstore.IndexStore, cpr *cachedreader.CachedPieceReader) *Provider { bs := remoteblockstore.NewRemoteBlockstore(idxStore, db, cpr) - lsys := storeutil.LinkSystemForBlockstore(bs) + cbs := blockstore.NewReadCachedBlockstore(blockstore.Adapt(bs), &BlockstoreCacheWrap[blockstore.MhString]{Sub: RetrievalBlockCache}) + + lsys := storeutil.LinkSystemForBlockstore(cbs) fr := frisbii.NewHttpIpfs(ctx, lsys) return &Provider{ @@ -77,3 +85,33 @@ func handleInfo(rw http.ResponseWriter, r *http.Request) { _, _ = rw.Write([]byte(infoOut)) } + + +type BlockstoreCacheWrap[T any] struct { + Sub interface { + Remove(mhString T) + Contains(mhString T) bool + Get(mhString T) (blocks.Block, bool) + Add(mhString T, block blocks.Block) + } +} + +func (b *BlockstoreCacheWrap[T]) Contains(mhString T) bool { + return b.Sub.Contains(mhString) +} + +func (b *BlockstoreCacheWrap[T]) Get(mhString T) (blocks.Block, bool) { + return b.Sub.Get(mhString) +} + +func (b *BlockstoreCacheWrap[T]) Remove(mhString T) bool { + b.Sub.Remove(mhString) + return true +} + +func (b *BlockstoreCacheWrap[T]) Add(mhString T, block blocks.Block) (evicted bool) { + b.Sub.Add(mhString, block) + return true +} + +var _ blockstore.BlockstoreCache = (*BlockstoreCacheWrap[blockstore.MhString])(nil) From 05bb2a0e812e6cd6f75df583755c54fb224b7ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 23 Oct 2025 19:22:42 +0200 Subject: [PATCH 56/67] more metrics, less log spam --- market/retrieval/remoteblockstore/metric.go | 42 ++++++++ market/retrieval/retrieval.go | 104 +++++++++++++++++--- 2 files changed, 130 insertions(+), 16 deletions(-) diff --git a/market/retrieval/remoteblockstore/metric.go b/market/retrieval/remoteblockstore/metric.go index 8c3ddba1a..0010ed6dc 100644 --- a/market/retrieval/remoteblockstore/metric.go +++ b/market/retrieval/remoteblockstore/metric.go @@ -3,10 +3,17 @@ package remoteblockstore import ( "go.opencensus.io/stats" "go.opencensus.io/stats/view" + "go.opencensus.io/tag" lotusmetrics "github.com/filecoin-project/lotus/metrics" ) +var ( + // Tag keys + HttpStatusCodeKey, _ = tag.NewKey("status_code") + HttpPathKey, _ = tag.NewKey("path") +) + // Distribution var defaultMillisecondsDistribution = view.Distribution( 1, // 1 millisecond @@ -46,6 +53,13 @@ var ( HttpRblsHasSuccessResponseCount = stats.Int64("http/rbls_has_success_response_count", "Counter of successful RemoteBlockstore Has responses", stats.UnitDimensionless) HttpRblsHasFailResponseCount = stats.Int64("http/rbls_has_fail_response_count", "Counter of failed RemoteBlockstore Has responses", stats.UnitDimensionless) HttpRblsBytesSentCount = stats.Int64("http/rbls_bytes_sent_count", "Counter of the number of bytes sent by bitswap since startup", stats.UnitBytes) + // Blockstore cache metrics + BlockstoreCacheHits = stats.Int64("http/blockstore_cache_hits", "Counter of blockstore cache hits", stats.UnitDimensionless) + BlockstoreCacheMisses = stats.Int64("http/blockstore_cache_misses", "Counter of blockstore cache misses", stats.UnitDimensionless) + // HTTP request metrics + HttpRequestCount = stats.Int64("http/request_count", "Counter of HTTP requests", stats.UnitDimensionless) + HttpResponseStatusCount = stats.Int64("http/response_status_count", "Counter of HTTP response status codes", stats.UnitDimensionless) + HttpResponseBytesCount = stats.Int64("http/response_bytes_count", "Sum of HTTP response content-length", stats.UnitBytes) ) var ( @@ -114,6 +128,29 @@ var ( Measure: HttpRblsBytesSentCount, Aggregation: view.Sum(), } + BlockstoreCacheHitsView = &view.View{ + Measure: BlockstoreCacheHits, + Aggregation: view.Sum(), + } + BlockstoreCacheMissesView = &view.View{ + Measure: BlockstoreCacheMisses, + Aggregation: view.Sum(), + } + HttpRequestCountView = &view.View{ + Measure: HttpRequestCount, + Aggregation: view.Count(), + TagKeys: []tag.Key{HttpPathKey}, + } + HttpResponseStatusCountView = &view.View{ + Measure: HttpResponseStatusCount, + Aggregation: view.Count(), + TagKeys: []tag.Key{HttpStatusCodeKey, HttpPathKey}, + } + HttpResponseBytesCountView = &view.View{ + Measure: HttpResponseBytesCount, + Aggregation: view.Sum(), + TagKeys: []tag.Key{HttpStatusCodeKey, HttpPathKey}, + } ) // CacheViews groups all cache-related default views. @@ -135,6 +172,11 @@ func init() { HttpRblsHasSuccessResponseCountView, HttpRblsHasFailResponseCountView, HttpRblsBytesSentCountView, + BlockstoreCacheHitsView, + BlockstoreCacheMissesView, + HttpRequestCountView, + HttpResponseStatusCountView, + HttpResponseBytesCountView, lotusmetrics.DagStorePRBytesDiscardedView, lotusmetrics.DagStorePRBytesRequestedView, diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index 6bbc80915..2f58c4271 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -3,15 +3,20 @@ package retrieval import ( "context" "net/http" + "path" + "strconv" + "strings" "github.com/go-chi/chi/v5" lru "github.com/hashicorp/golang-lru/arc/v2" - "github.com/ipfs/go-graphsync/storeutil" blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-graphsync/storeutil" logging "github.com/ipfs/go-log/v2" "github.com/ipld/frisbii" ipld "github.com/ipld/go-ipld-prime" "github.com/snadrus/must" + "go.opencensus.io/stats" + "go.opencensus.io/tag" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/lib/cachedreader" @@ -61,23 +66,85 @@ func NewRetrievalProviderWithLinkSystem(ctx context.Context, lsys ipld.LinkSyste } } -// logRequest logs incoming HTTP requests with their headers -func logRequest(next http.HandlerFunc) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - log.Infow("HTTP request", - "method", r.Method, - "url", r.URL.String(), - "remote_addr", r.RemoteAddr, - "headers", r.Header) - next(w, r) +// responseWriterWrapper wraps http.ResponseWriter to capture status code and bytes written +type responseWriterWrapper struct { + http.ResponseWriter + statusCode int + bytesWritten int64 +} + +func (rw *responseWriterWrapper) WriteHeader(statusCode int) { + rw.statusCode = statusCode + rw.ResponseWriter.WriteHeader(statusCode) +} + +func (rw *responseWriterWrapper) Write(b []byte) (int, error) { + n, err := rw.ResponseWriter.Write(b) + rw.bytesWritten += int64(n) + return n, err +} + +// getPathPrefix extracts the first path element to avoid cardinality explosion in metrics +// Examples: "/piece/abc123" -> "/piece/", "/ipfs/QmABC" -> "/ipfs/", "/info" -> "/info", "/" -> "/" +func getPathPrefix(urlPath string) string { + // Clean the path to remove any .. or . elements + cleaned := path.Clean(urlPath) + + if cleaned == "/" || cleaned == "" { + return "/" + } + + // Split the path and get the first element + parts := strings.Split(strings.TrimPrefix(cleaned, "/"), "/") + if len(parts) > 0 && parts[0] != "" { + return "/" + parts[0] + "/" } + + return "/" +} + +// metricsMiddleware records HTTP metrics for requests +func metricsMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Extract path prefix to avoid unbounded cardinality in Prometheus + pathPrefix := getPathPrefix(r.URL.Path) + + // Record request count + ctx, _ := tag.New(r.Context(), tag.Upsert(remoteblockstore.HttpPathKey, pathPrefix)) + stats.Record(ctx, remoteblockstore.HttpRequestCount.M(1)) + + // Wrap response writer to capture status and bytes + wrapper := &responseWriterWrapper{ + ResponseWriter: w, + statusCode: http.StatusOK, // default if WriteHeader is not called + } + + // Serve the request + next.ServeHTTP(wrapper, r.WithContext(ctx)) + + // Record response metrics + statusCodeStr := strconv.Itoa(wrapper.statusCode) + _ = stats.RecordWithTags(ctx, []tag.Mutator{ + tag.Upsert(remoteblockstore.HttpStatusCodeKey, statusCodeStr), + tag.Upsert(remoteblockstore.HttpPathKey, pathPrefix), + }, + remoteblockstore.HttpResponseStatusCount.M(1), + remoteblockstore.HttpResponseBytesCount.M(wrapper.bytesWritten), + ) + + log.Debugw("HTTP request", "method", r.Method, "path", r.URL.Path, "pathPrefix", pathPrefix, "status", wrapper.statusCode, "bytes", wrapper.bytesWritten) + }) } func Router(mux *chi.Mux, rp *Provider) { - mux.Get(piecePrefix+"{cid}", logRequest(rp.handleByPieceCid)) - mux.Get(ipfsPrefix+"*", logRequest(rp.fr.ServeHTTP)) - mux.Head(ipfsPrefix+"*", logRequest(rp.fr.ServeHTTP)) - mux.Get(infoPage, logRequest(handleInfo)) + // Group retrieval routes with metrics middleware + mux.Group(func(r chi.Router) { + r.Use(metricsMiddleware) + r.Get(piecePrefix+"{cid}", rp.handleByPieceCid) + r.Get(ipfsPrefix+"*", rp.fr.ServeHTTP) + r.Head(ipfsPrefix+"*", rp.fr.ServeHTTP) + r.Get(infoPage, handleInfo) + }) } func handleInfo(rw http.ResponseWriter, r *http.Request) { @@ -86,7 +153,6 @@ func handleInfo(rw http.ResponseWriter, r *http.Request) { _, _ = rw.Write([]byte(infoOut)) } - type BlockstoreCacheWrap[T any] struct { Sub interface { Remove(mhString T) @@ -101,7 +167,13 @@ func (b *BlockstoreCacheWrap[T]) Contains(mhString T) bool { } func (b *BlockstoreCacheWrap[T]) Get(mhString T) (blocks.Block, bool) { - return b.Sub.Get(mhString) + block, ok := b.Sub.Get(mhString) + if ok { + stats.Record(context.Background(), remoteblockstore.BlockstoreCacheHits.M(1)) + } else { + stats.Record(context.Background(), remoteblockstore.BlockstoreCacheMisses.M(1)) + } + return block, ok } func (b *BlockstoreCacheWrap[T]) Remove(mhString T) bool { From 9d8a8ec338b24c348d7f86b54bd2cf2b5c1798ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 23 Oct 2025 19:39:55 +0200 Subject: [PATCH 57/67] http method in req stats --- market/retrieval/remoteblockstore/metric.go | 5 +++-- market/retrieval/retrieval.go | 11 +++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/market/retrieval/remoteblockstore/metric.go b/market/retrieval/remoteblockstore/metric.go index 0010ed6dc..1d9d5a2b9 100644 --- a/market/retrieval/remoteblockstore/metric.go +++ b/market/retrieval/remoteblockstore/metric.go @@ -12,6 +12,7 @@ var ( // Tag keys HttpStatusCodeKey, _ = tag.NewKey("status_code") HttpPathKey, _ = tag.NewKey("path") + HttpMethodKey, _ = tag.NewKey("method") ) // Distribution @@ -139,12 +140,12 @@ var ( HttpRequestCountView = &view.View{ Measure: HttpRequestCount, Aggregation: view.Count(), - TagKeys: []tag.Key{HttpPathKey}, + TagKeys: []tag.Key{HttpPathKey, HttpMethodKey}, } HttpResponseStatusCountView = &view.View{ Measure: HttpResponseStatusCount, Aggregation: view.Count(), - TagKeys: []tag.Key{HttpStatusCodeKey, HttpPathKey}, + TagKeys: []tag.Key{HttpStatusCodeKey, HttpPathKey, HttpMethodKey}, } HttpResponseBytesCountView = &view.View{ Measure: HttpResponseBytesCount, diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index 2f58c4271..e798c0707 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -71,6 +71,7 @@ type responseWriterWrapper struct { http.ResponseWriter statusCode int bytesWritten int64 + isHead bool } func (rw *responseWriterWrapper) WriteHeader(statusCode int) { @@ -80,7 +81,11 @@ func (rw *responseWriterWrapper) WriteHeader(statusCode int) { func (rw *responseWriterWrapper) Write(b []byte) (int, error) { n, err := rw.ResponseWriter.Write(b) - rw.bytesWritten += int64(n) + + if !rw.isHead { + rw.bytesWritten += int64(n) + } + return n, err } @@ -110,13 +115,14 @@ func metricsMiddleware(next http.Handler) http.Handler { pathPrefix := getPathPrefix(r.URL.Path) // Record request count - ctx, _ := tag.New(r.Context(), tag.Upsert(remoteblockstore.HttpPathKey, pathPrefix)) + ctx, _ := tag.New(r.Context(), tag.Upsert(remoteblockstore.HttpPathKey, pathPrefix), tag.Upsert(remoteblockstore.HttpMethodKey, r.Method)) stats.Record(ctx, remoteblockstore.HttpRequestCount.M(1)) // Wrap response writer to capture status and bytes wrapper := &responseWriterWrapper{ ResponseWriter: w, statusCode: http.StatusOK, // default if WriteHeader is not called + isHead: r.Method == http.MethodHead, } // Serve the request @@ -127,6 +133,7 @@ func metricsMiddleware(next http.Handler) http.Handler { _ = stats.RecordWithTags(ctx, []tag.Mutator{ tag.Upsert(remoteblockstore.HttpStatusCodeKey, statusCodeStr), tag.Upsert(remoteblockstore.HttpPathKey, pathPrefix), + tag.Upsert(remoteblockstore.HttpMethodKey, r.Method), }, remoteblockstore.HttpResponseStatusCount.M(1), remoteblockstore.HttpResponseBytesCount.M(wrapper.bytesWritten), From 3c48a3ed8496639a074b9b0ba483cc4c818c53ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 23 Oct 2025 19:53:44 +0200 Subject: [PATCH 58/67] http metric for in-flight requests --- market/retrieval/remoteblockstore/metric.go | 7 +++ market/retrieval/retrieval.go | 58 ++++++++++++++++++++- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/market/retrieval/remoteblockstore/metric.go b/market/retrieval/remoteblockstore/metric.go index 1d9d5a2b9..5734a92a1 100644 --- a/market/retrieval/remoteblockstore/metric.go +++ b/market/retrieval/remoteblockstore/metric.go @@ -61,6 +61,7 @@ var ( HttpRequestCount = stats.Int64("http/request_count", "Counter of HTTP requests", stats.UnitDimensionless) HttpResponseStatusCount = stats.Int64("http/response_status_count", "Counter of HTTP response status codes", stats.UnitDimensionless) HttpResponseBytesCount = stats.Int64("http/response_bytes_count", "Sum of HTTP response content-length", stats.UnitBytes) + HttpActiveRequests = stats.Int64("http/active_requests", "Number of active/in-flight HTTP requests", stats.UnitDimensionless) ) var ( @@ -152,6 +153,11 @@ var ( Aggregation: view.Sum(), TagKeys: []tag.Key{HttpStatusCodeKey, HttpPathKey}, } + HttpActiveRequestsView = &view.View{ + Measure: HttpActiveRequests, + Aggregation: view.LastValue(), + TagKeys: []tag.Key{HttpPathKey, HttpMethodKey}, + } ) // CacheViews groups all cache-related default views. @@ -178,6 +184,7 @@ func init() { HttpRequestCountView, HttpResponseStatusCountView, HttpResponseBytesCountView, + HttpActiveRequestsView, lotusmetrics.DagStorePRBytesDiscardedView, lotusmetrics.DagStorePRBytesRequestedView, diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index e798c0707..48da0b633 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -6,6 +6,8 @@ import ( "path" "strconv" "strings" + "sync" + "sync/atomic" "github.com/go-chi/chi/v5" lru "github.com/hashicorp/golang-lru/arc/v2" @@ -27,6 +29,9 @@ import ( var log = logging.Logger("retrievals") +// activeRequestCounters stores atomic counters for active requests per path+method +var activeRequestCounters sync.Map // map[string]*atomic.Int64 + type Provider struct { db *harmonydb.DB bs *remoteblockstore.RemoteBlockstore @@ -81,7 +86,7 @@ func (rw *responseWriterWrapper) WriteHeader(statusCode int) { func (rw *responseWriterWrapper) Write(b []byte) (int, error) { n, err := rw.ResponseWriter.Write(b) - + if !rw.isHead { rw.bytesWritten += int64(n) } @@ -108,16 +113,65 @@ func getPathPrefix(urlPath string) string { return "/" } +// getActiveRequestCounter gets or creates an atomic counter for a specific path+method combination +func getActiveRequestCounter(pathPrefix, method string) *atomic.Int64 { + key := pathPrefix + ":" + method + + // Try to load existing counter + if counter, ok := activeRequestCounters.Load(key); ok { + return counter.(*atomic.Int64) + } + + // Create new counter + counter := &atomic.Int64{} + actual, loaded := activeRequestCounters.LoadOrStore(key, counter) + if loaded { + return actual.(*atomic.Int64) + } + return counter +} + +// incrementActiveRequests atomically increments the active request counter and records the metric +func incrementActiveRequests(ctx context.Context, pathPrefix, method string) *atomic.Int64 { + counter := getActiveRequestCounter(pathPrefix, method) + newValue := counter.Add(1) + + // Record the new active request count + _ = stats.RecordWithTags(ctx, []tag.Mutator{ + tag.Upsert(remoteblockstore.HttpPathKey, pathPrefix), + tag.Upsert(remoteblockstore.HttpMethodKey, method), + }, remoteblockstore.HttpActiveRequests.M(newValue)) + + return counter +} + +// decrementActiveRequests atomically decrements the active request counter and records the metric +func decrementActiveRequests(ctx context.Context, counter *atomic.Int64, pathPrefix, method string) { + newValue := counter.Add(-1) + + // Record the new active request count + _ = stats.RecordWithTags(ctx, []tag.Mutator{ + tag.Upsert(remoteblockstore.HttpPathKey, pathPrefix), + tag.Upsert(remoteblockstore.HttpMethodKey, method), + }, remoteblockstore.HttpActiveRequests.M(newValue)) +} + // metricsMiddleware records HTTP metrics for requests func metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Extract path prefix to avoid unbounded cardinality in Prometheus pathPrefix := getPathPrefix(r.URL.Path) - // Record request count + // Record request count and increment active requests ctx, _ := tag.New(r.Context(), tag.Upsert(remoteblockstore.HttpPathKey, pathPrefix), tag.Upsert(remoteblockstore.HttpMethodKey, r.Method)) stats.Record(ctx, remoteblockstore.HttpRequestCount.M(1)) + // Increment active requests counter + counter := incrementActiveRequests(ctx, pathPrefix, r.Method) + + // Ensure we decrement when done + defer decrementActiveRequests(ctx, counter, pathPrefix, r.Method) + // Wrap response writer to capture status and bytes wrapper := &responseWriterWrapper{ ResponseWriter: w, From c6bb323252cd451e41f72ba9d6be2998c2f855e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 23 Oct 2025 21:40:49 +0200 Subject: [PATCH 59/67] remotebs: return correct err on not-found --- market/indexstore/indexstore.go | 31 ------------------- .../remoteblockstore/remoteblockstore.go | 4 +-- 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/market/indexstore/indexstore.go b/market/indexstore/indexstore.go index 88c52a303..3a8e5a40b 100644 --- a/market/indexstore/indexstore.go +++ b/market/indexstore/indexstore.go @@ -3,7 +3,6 @@ package indexstore import ( "context" _ "embed" - "errors" "fmt" "strings" "time" @@ -45,32 +44,6 @@ type Record struct { Size uint64 `json:"size"` } -var ErrNotFound = errors.New("not found") - -func normalizeMultihashError(m multihash.Multihash, err error) error { - if err == nil { - return nil - } - if isNotFoundErr(err) { - return fmt.Errorf("multihash %s: %w", m, ErrNotFound) - } - return err -} - -func isNotFoundErr(err error) bool { - if err == nil { - return false - } - - if errors.Is(err, gocql.ErrNotFound) { - return true - } - - // Unfortunately it seems like the Cassandra driver doesn't always return - // a specific not found error type, so we need to rely on string parsing - return strings.Contains(strings.ToLower(err.Error()), "not found") -} - func NewIndexStore(hosts []string, port int, cfg *config.CurioConfig) (*IndexStore, error) { if len(hosts) == 0 { return nil, xerrors.Errorf("no hosts provided for cassandra") @@ -345,10 +318,6 @@ func (i *IndexStore) PiecesContainingMultihash(ctx context.Context, m multihash. return nil, fmt.Errorf("getting pieces containing multihash %s: %w", m, err) } - // No pieces found for multihash, return a "not found" error - if len(pieces) == 0 { - return nil, normalizeMultihashError(m, ErrNotFound) - } return pieces, nil } diff --git a/market/retrieval/remoteblockstore/remoteblockstore.go b/market/retrieval/remoteblockstore/remoteblockstore.go index e37bc4dac..82c6540fe 100644 --- a/market/retrieval/remoteblockstore/remoteblockstore.go +++ b/market/retrieval/remoteblockstore/remoteblockstore.go @@ -108,7 +108,7 @@ func (ro *RemoteBlockstore) Get(ctx context.Context, c cid.Cid) (b blocks.Block, return nil, fmt.Errorf("getting pieces containing cid %s: %w", c, err) } if len(pieces) == 0 { - return nil, fmt.Errorf("no pieces with cid %s found", c) + return nil, format.ErrNotFound{Cid: c} } // Get a reader over one of the pieces and extract the block data @@ -149,7 +149,7 @@ func (ro *RemoteBlockstore) Get(ctx context.Context, c cid.Cid) (b blocks.Block, } if merr == nil { - merr = fmt.Errorf("no block with cid %s found", c) + merr = format.ErrNotFound{Cid: c} } return nil, merr From 6bd92df5c182be38d1ba127d43ce8fcf49c97e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 23 Oct 2025 22:29:23 +0200 Subject: [PATCH 60/67] limit parallel retrievals --- market/retrieval/retrieval.go | 47 ++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index 48da0b633..129d16efd 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -32,6 +32,14 @@ var log = logging.Logger("retrievals") // activeRequestCounters stores atomic counters for active requests per path+method var activeRequestCounters sync.Map // map[string]*atomic.Int64 +// Request limiters using buffered channels as semaphores +const maxParallelRequests = 256 + +var ( + ipfsRequestLimiter = make(chan struct{}, maxParallelRequests) + pieceRequestLimiter = make(chan struct{}, maxParallelRequests) +) + type Provider struct { db *harmonydb.DB bs *remoteblockstore.RemoteBlockstore @@ -156,6 +164,27 @@ func decrementActiveRequests(ctx context.Context, counter *atomic.Int64, pathPre }, remoteblockstore.HttpActiveRequests.M(newValue)) } +// limiterMiddleware limits concurrent requests to the retrieval service +func limiterMiddleware(limiter chan struct{}) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Try to acquire semaphore (non-blocking) + select { + case limiter <- struct{}{}: + // Successfully acquired, ensure we release when done + defer func() { <-limiter }() + // Continue to next handler + next.ServeHTTP(w, r) + default: + // Limit reached, return 429 + log.Warnw("Request limit reached", "method", r.Method, "path", r.URL.Path) + w.WriteHeader(http.StatusTooManyRequests) + _, _ = w.Write([]byte("Service temporarily unavailable: too many concurrent requests")) + } + }) + } +} + // metricsMiddleware records HTTP metrics for requests func metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -201,9 +230,21 @@ func Router(mux *chi.Mux, rp *Provider) { // Group retrieval routes with metrics middleware mux.Group(func(r chi.Router) { r.Use(metricsMiddleware) - r.Get(piecePrefix+"{cid}", rp.handleByPieceCid) - r.Get(ipfsPrefix+"*", rp.fr.ServeHTTP) - r.Head(ipfsPrefix+"*", rp.fr.ServeHTTP) + + // Piece endpoint with limiter + r.Group(func(r chi.Router) { + r.Use(limiterMiddleware(pieceRequestLimiter)) + r.Get(piecePrefix+"{cid}", rp.handleByPieceCid) + }) + + // IPFS endpoints with limiter + r.Group(func(r chi.Router) { + r.Use(limiterMiddleware(ipfsRequestLimiter)) + r.Get(ipfsPrefix+"*", rp.fr.ServeHTTP) + r.Head(ipfsPrefix+"*", rp.fr.ServeHTTP) + }) + + // Info endpoint without limiter r.Get(infoPage, handleInfo) }) } From 417b48c5eab4a99630dcdde2b554a6919acdc9d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 23 Oct 2025 23:00:41 +0200 Subject: [PATCH 61/67] separate head req limiter --- market/retrieval/retrieval.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index 129d16efd..8652cc860 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -37,6 +37,7 @@ const maxParallelRequests = 256 var ( ipfsRequestLimiter = make(chan struct{}, maxParallelRequests) + ipfsHeadRequestLimiter = make(chan struct{}, maxParallelRequests/2) pieceRequestLimiter = make(chan struct{}, maxParallelRequests) ) @@ -238,10 +239,14 @@ func Router(mux *chi.Mux, rp *Provider) { }) // IPFS endpoints with limiter + r.Group(func(r chi.Router) { + r.Use(limiterMiddleware(ipfsHeadRequestLimiter)) + r.Head(ipfsPrefix+"*", rp.fr.ServeHTTP) + }) + r.Group(func(r chi.Router) { r.Use(limiterMiddleware(ipfsRequestLimiter)) r.Get(ipfsPrefix+"*", rp.fr.ServeHTTP) - r.Head(ipfsPrefix+"*", rp.fr.ServeHTTP) }) // Info endpoint without limiter From f40d85866682dbea3f2d14e630724165ae2164ab Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Thu, 23 Oct 2025 17:27:07 -0500 Subject: [PATCH 62/67] fix race condition that resulted in ignoring the last bit of cached data. --- lib/cachedreader/prefetch.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/cachedreader/prefetch.go b/lib/cachedreader/prefetch.go index 3bdb8e859..d4acf2cec 100644 --- a/lib/cachedreader/prefetch.go +++ b/lib/cachedreader/prefetch.go @@ -63,10 +63,18 @@ func (pr *PrefetchReader) Read(p []byte) (n int, err error) { // Check if worker is done select { case <-pr.workerDone: + // Worker is done, but check if there's still data in buffer if errPtr := pr.err.Load(); errPtr != nil { return 0, *errPtr } - return 0, io.EOF + // Re-check buffer state after worker completion + readPos = pr.readPtr.Load() + writePos = pr.writePtr.Load() + if readPos == writePos { + return 0, io.EOF + } + // There's still data, continue with read logic + goto readData default: // Check for errors again if errPtr := pr.err.Load(); errPtr != nil { @@ -78,6 +86,8 @@ func (pr *PrefetchReader) Read(p []byte) (n int, err error) { writePos = pr.writePtr.Load() } +readData: + // Calculate available bytes available := writePos - readPos if available > uint64(len(p)) { From c4f47e3f861fe8bec6fcf4899be17f87f9621c75 Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Fri, 14 Nov 2025 13:44:53 -0600 Subject: [PATCH 63/67] merge iffy --- .github/workflows/Dockerfile.supraseal-test | 59 + .github/workflows/README.supraseal-testing.md | 127 + .github/workflows/ci.yml | 228 + .github/workflows/test-cuda-download.sh | 87 + .github/workflows/test-supraseal-locally.sh | 83 + .gitignore | 1 + Dockerfile | 26 +- Makefile | 15 +- alertmanager/alerts.go | 26 +- alertmanager/plugin/slack_webhook.go | 66 +- build/openrpc/curio.json | 2 +- build/version.go | 2 +- cmd/curio/config_test.go | 11 +- cmd/curio/debug-ipni.go | 2 +- cmd/curio/guidedsetup/guidedsetup.go | 455 +- cmd/curio/guidedsetup/shared.go | 55 +- cmd/curio/internal/translations/catalog.go | 1263 ++-- .../internal/translations/knowns/main.go | 2 +- .../translations/locales/en/out.gotext.json | 821 ++- .../locales/ko/messages.gotext.json | 5344 +++++++++-------- .../translations/locales/ko/out.gotext.json | 15 +- .../locales/zh/messages.gotext.json | 558 +- .../translations/locales/zh/out.gotext.json | 15 +- cmd/curio/main.go | 11 +- cmd/curio/rpc/rpc.go | 9 +- cmd/curio/tasks/tasks.go | 146 +- cmd/curio/test-cli.go | 10 +- cmd/curio/toolbox.go | 151 + cmd/pdptool/main.go | 9 + cmd/sptool/main.go | 1 + cmd/sptool/toolbox_deal_client.go | 976 ++- cmd/sptool/toolbox_deal_tools.go | 7 +- cuhttp/server.go | 33 +- deps/config/cfgdocgen/gen.go | 31 +- deps/config/doc_gen.go | 122 +- deps/config/dynamic.go | 273 + deps/config/dynamic_test.go | 209 + deps/config/dynamic_toml.go | 382 ++ deps/config/dynamic_toml_test.go | 1873 ++++++ deps/config/load.go | 131 +- deps/config/old_lotus_miner.go | 27 +- deps/config/types.go | 116 +- deps/deps.go | 153 +- .../piece-server/sample/mk20-aggregate-car.sh | 93 + docker/piece-server/sample/mk20-ddo.sh | 31 + .../piece-server/sample/mk20-random-deal.sh | 53 + docker/piece-server/sample/pdp.sh | 54 + .../2024-06-04-040735_1470x522_scrot.png | Bin 56449 -> 0 bytes .../2024-06-05-150843_1298x2075_scrot.png | Bin 346698 -> 0 bytes .../2024-06-05-150919_1072x1563_scrot.png | Bin 223234 -> 0 bytes .../2024-06-05-150938_1062x1664_scrot.png | Bin 406950 -> 0 bytes .../2024-06-05-151014_855x423_scrot.png | Bin 75188 -> 0 bytes .../2024-06-05-151025_997x1175_scrot.png | Bin 206362 -> 0 bytes .../2024-06-05-151044_2494x989_scrot.png | Bin 148275 -> 0 bytes .../2024-06-05-151136_1468x746_scrot.png | Bin 110968 -> 0 bytes .../2024-06-05-151157_1467x2068_scrot.png | Bin 322014 -> 0 bytes .../2024-06-05-151234_1468x2078_scrot.png | Bin 131502 -> 0 bytes .../en/.gitbook/assets/Curio_placeholder.webp | Bin 0 -> 18328 bytes .../en/.gitbook/assets/Filecoin.svg.png | Bin 0 -> 46817 bytes .../en/.gitbook/assets/config-edit.png | Bin 347921 -> 0 bytes documentation/en/.gitbook/assets/config.png | Bin 502826 -> 0 bytes .../en/.gitbook/assets/curio-cluster.drawio | 444 -- .../en/.gitbook/assets/curio-cluster.png | Bin 211934 -> 0 bytes .../en/.gitbook/assets/curio-node.png | Bin 299649 -> 0 bytes .../en/.gitbook/assets/curio-sealing.png | Bin 310649 -> 0 bytes .../en/.gitbook/assets/curio-tasks.png | Bin 246539 -> 0 bytes .../en/.gitbook/assets/data-types.png | Bin 101545 -> 0 bytes .../en/.gitbook/assets/emptying-boxes.png | Bin 109558 -> 0 bytes .../en/.gitbook/assets/lotus-logo-big.png | Bin 0 -> 39615 bytes .../en/.gitbook/assets/remove-sector.png | Bin 106346 -> 0 bytes .../en/.gitbook/assets/sealing-tasks.png | Bin 243332 -> 0 bytes documentation/en/.gitbook/assets/shelf.png | Bin 71367 -> 0 bytes .../en/.gitbook/assets/storage-gc.png | Bin 147265 -> 0 bytes documentation/en/.gitbook/assets/yugabyte.svg | 18 + documentation/en/SUMMARY.md | 4 + documentation/en/configuration/README.md | 80 +- .../default-curio-configuration.md | 82 +- documentation/en/curio-cli/curio.md | 30 +- documentation/en/curio-cli/sptool.md | 162 +- .../en/curio-market/curio-http-server.md | 4 +- .../en/curio-market/migrating-from-boost.md | 1 - .../en/experimental-features/Enable-PDP.md | 618 +- documentation/en/market-2.0/README.md | 192 + documentation/en/market-2.0/api.md | 209 + documentation/en/market-2.0/contracts.md | 119 + documentation/en/market-2.0/products.md | 246 + documentation/en/versions.md | 1 + extern/supraseal/build.sh | 160 +- go.mod | 19 +- go.sum | 25 +- harmony/harmonydb/harmonydb.go | 91 +- .../harmonydb/sql/20230706-itest_scratch.sql | 2 +- .../harmonydb/sql/20230712-sector_index.sql | 4 +- harmony/harmonydb/sql/20230719-harmony.sql | 10 +- harmony/harmonydb/sql/20230823-wdpost.sql | 6 +- harmony/harmonydb/sql/20230919-config.sql | 2 +- .../harmonydb/sql/20231103-chain_sends.sql | 6 +- .../harmonydb/sql/20231110-mining_tasks.sql | 4 +- .../sql/20231113-harmony_taskhistory_oops.sql | 2 +- harmony/harmonydb/sql/20231120-testing1.sql | 4 +- .../harmonydb/sql/20231217-sdr-pipeline.sql | 6 +- .../harmonydb/sql/20231225-message-waits.sql | 2 +- harmony/harmonydb/sql/20240228-piece-park.sql | 6 +- .../sql/20240317-web-summary-index.sql | 4 +- .../20240402-sdr-pipeline-ddo-deal-info.sql | 9 +- .../harmonydb/sql/20240404-machine_detail.sql | 2 +- .../sql/20240416-harmony_singleton_task.sql | 2 +- .../sql/20240417-sector_index_gc.sql | 2 +- .../sql/20240420-web-task-indexes.sql | 4 +- .../harmonydb/sql/20240425-sector_meta.sql | 4 +- .../sql/20240501-harmony-indexes.sql | 2 +- .../sql/20240508-open-deal-sectors.sql | 5 +- .../harmonydb/sql/20240527-machine_name.sql | 3 +- harmony/harmonydb/sql/20240606-storage-gc.sql | 4 +- .../sql/20240610-mining-inclusion-checks.sql | 2 +- .../harmonydb/sql/20240611-snap-pipeline.sql | 68 +- .../harmonydb/sql/20240612-deal-proposal.sql | 3 +- .../sql/20240617-synthetic-proofs.sql | 6 +- .../sql/20240701-batch-sector-refs.sql | 2 +- harmony/harmonydb/sql/20240730-alerts.sql | 2 +- .../sql/20240731-market-migration.sql | 30 +- .../20240802-sdr-pipeline-user-expiration.sql | 3 +- .../harmonydb/sql/20240809-snap-failures.sql | 12 +- .../sql/20240814-pipeline-task-events.sql | 2 +- harmony/harmonydb/sql/20240823-ipni.sql | 34 +- .../sql/20240824-longterm-indexes.sql | 6 +- .../sql/20240826-sector-partition.sql | 8 +- .../sql/20240903-unseal-pipeline.sql | 15 +- .../sql/20240904-scrub-unseal-check.sql | 2 +- .../harmonydb/sql/20240906-http-server.sql | 2 +- .../harmonydb/sql/20240927-task-retrywait.sql | 2 +- .../sql/20240929-chain-sends-eth.sql | 10 +- harmony/harmonydb/sql/20240930-pdp.sql | 79 +- .../sql/20241017-market-mig-indexing.sql | 2 +- harmony/harmonydb/sql/20241021-f3.sql | 2 +- .../harmonydb/sql/20241029-mk12-filters.sql | 61 +- harmony/harmonydb/sql/20241030-deal-label.sql | 3 +- harmony/harmonydb/sql/20241104-piece-info.sql | 13 +- .../harmonydb/sql/20241105-walletnames.sql | 2 +- .../harmonydb/sql/20241106-market-fixes.sql | 9 +- .../harmonydb/sql/20241210-sdr-batching.sql | 39 +- .../sql/20250111-machine-maintenance.sql | 5 +- .../sql/20250113-pdp-never-delete.sql | 4 +- harmony/harmonydb/sql/20250115-proofshare.sql | 48 +- harmony/harmonydb/sql/20250220-mk12-ddo.sql | 28 +- .../sql/20250312-batching-functions.sql | 3 +- .../sql/20250422-msg-wait-timestamp.sql | 5 +- .../harmonydb/sql/20250505-market-mk20.sql | 1015 ++++ .../sql/20250619-proofshare-fixes.sql | 2 +- .../harmonydb/sql/20250620-proofshare-pow.sql | 2 +- .../sql/20250724-proofshare-autosettle.sql | 2 +- harmony/harmonydb/sql/20250727-balancemgr.sql | 15 +- .../sql/20250728-proofshare-payment-stats.sql | 17 +- .../sql/20250801-proofshare-pipeline.sql | 8 +- .../sql/20250803-wallet-exporter.sql | 8 +- .../harmonydb/sql/20250808-cc-scheduler.sql | 2 +- .../sql/20250817-balancemgr-pshare.sql | 2 +- .../sql/20250818-restart-request.sql | 3 +- .../sql/20250926-harmony_config_timestamp.sql | 1 + harmony/harmonydb/userfuncs.go | 30 +- harmony/harmonytask/task_type_handler.go | 18 +- itests/curio_test.go | 23 +- itests/dyncfg_test.go | 63 + itests/pdp_prove_test.go | 207 + itests/sql_idempotent_test.go | 36 + lib/cachedreader/cachedreader.go | 317 +- lib/chainsched/chain_sched.go | 28 +- lib/chainsched/chain_sched_test.go | 81 + lib/commcidv2/commcidv2.go | 60 + lib/createminer/create_miner.go | 6 +- lib/ffi/piece_funcs.go | 85 +- lib/multictladdr/address.go | 105 +- lib/multictladdr/multiaddresses.go | 11 +- lib/paths/db_index.go | 3 +- lib/paths/http_handler.go | 1 + lib/paths/index.go | 6 +- lib/paths/local.go | 19 +- lib/paths/remote.go | 11 +- lib/paths/remote_test.go | 12 +- lib/proof/merkle_sha254_memtree.go | 45 +- lib/proof/post_vproof_verify.go | 3 +- lib/proofsvc/provictl.go | 81 +- lib/savecache/savecache.go | 469 ++ lib/testutils/testutils.go | 146 +- market/http/http.go | 39 +- .../{create.cql => cql/0001_create.cql} | 0 market/indexstore/cql/0002_piece_index.cql | 23 + market/indexstore/indexstore.go | 569 +- market/indexstore/indexstore_test.go | 120 +- market/ipni/chunker/initial-chunker.go | 22 +- market/ipni/chunker/serve-chunker.go | 154 +- market/ipni/ipni-provider/ipni-provider.go | 20 +- market/ipni/ipni-provider/spark.go | 3 + market/ipni/types/types.go | 50 + market/libp2p/libp2p.go | 18 +- market/mk12/http/http.go | 12 +- market/mk12/mk12.go | 52 +- market/mk20/client/auth.go | 42 + market/mk20/client/client.go | 538 ++ market/mk20/client/http_client.go | 237 + market/mk20/ddo_v1.go | 191 + market/mk20/http/docs.go | 1480 +++++ market/mk20/http/http.go | 844 +++ market/mk20/http/swagger.json | 1453 +++++ market/mk20/http/swagger.yaml | 1081 ++++ market/mk20/mk20.go | 953 +++ market/mk20/mk20_upload.go | 1337 +++++ market/mk20/mk20_utils.go | 335 ++ market/mk20/mk20gen/gen.go | 965 +++ market/mk20/pdp_v1.go | 149 + market/mk20/retrieval_v1.go | 39 + market/mk20/types.go | 274 + market/mk20/types_test.go | 321 + market/mk20/utils.go | 1005 ++++ market/retrieval/piecehandler.go | 15 +- market/retrieval/remoteblockstore/metric.go | 35 +- .../remoteblockstore/remoteblockstore.go | 7 +- market/retrieval/retrieval.go | 6 +- market/storageingest/deal_ingest_seal.go | 14 +- market/storageingest/deal_ingest_snap.go | 14 +- pdp/contract/IPDPProvingSchedule.abi | 54 +- pdp/contract/IPDPProvingSchedule.json | 2 +- .../ListenerServiceWithViewContract.abi | 15 + .../ListenerServiceWithViewContract.go | 212 + pdp/contract/PDPVerifier.abi | 528 +- pdp/contract/PDPVerifier.json | 2 +- pdp/contract/README.md | 110 + pdp/contract/ServiceProviderRegistry.abi | 1693 ++++++ pdp/contract/ServiceProviderRegistry.go | 3319 ++++++++++ pdp/contract/ServiceProviderRegistry.json | 1 + .../ServiceProviderRegistryStorage.abi | 179 + .../ServiceProviderRegistryStorage.go | 451 ++ .../ServiceProviderRegistryStorage.json | 1 + pdp/contract/addresses.go | 21 +- pdp/contract/pdp_proving_schedule.go | 175 +- pdp/contract/pdp_verifier.go | 1615 ++--- pdp/contract/types.go | 6 + pdp/contract/utils.go | 411 ++ pdp/handlers.go | 37 +- pdp/handlers_upload.go | 7 +- scripts/generate-cli.py | 3 + tasks/f3/f3_task.go | 33 +- tasks/gc/pipeline_meta_gc.go | 52 +- tasks/gc/storage_gc_mark.go | 3 + tasks/gc/task_cleanup_piece.go | 485 ++ tasks/indexing/task_check_indexes.go | 576 +- tasks/indexing/task_indexing.go | 708 ++- tasks/indexing/task_ipni.go | 483 +- tasks/indexing/task_pdp_indexing.go | 374 ++ tasks/indexing/task_pdp_ipni.go | 808 +++ tasks/message/watch.go | 2 +- tasks/message/watch_eth.go | 4 +- tasks/pdp/data_set_create_watch.go | 223 + tasks/pdp/data_set_delete_watch.go | 177 + tasks/pdp/dataset_add_piece_watch.go | 262 + tasks/pdp/dataset_delete_root_watch.go | 152 + tasks/pdp/proofset_addroot_watch.go | 234 - tasks/pdp/proofset_create_watch.go | 194 - tasks/pdp/task_add_data_set.go | 201 + tasks/pdp/task_add_piece.go | 227 + tasks/pdp/task_aggregation.go | 395 ++ tasks/pdp/task_commp.go | 321 + tasks/pdp/task_delete_data_set.go | 199 + tasks/pdp/task_delete_piece.go | 208 + tasks/pdp/task_init_pp.go | 103 +- tasks/pdp/task_next_pp.go | 73 +- tasks/pdp/task_prove.go | 550 +- tasks/pdp/task_save_cache.go | 198 + tasks/piece/task_aggregate_chunks.go | 434 ++ tasks/piece/task_park_piece.go | 7 +- tasks/seal/finalize_pieces.go | 2 +- tasks/seal/poller_commit_msg.go | 9 +- tasks/seal/task_movestorage.go | 16 +- tasks/snap/task_movestorage.go | 16 +- tasks/snap/task_submit.go | 8 +- tasks/storage-market/market_balance.go | 201 - tasks/storage-market/mk20.go | 1254 ++++ tasks/storage-market/storage_market.go | 189 +- tasks/storage-market/task_aggregation.go | 379 ++ tasks/storage-market/task_commp.go | 115 +- tasks/window/compute_task.go | 7 +- tasks/window/recover_task.go | 7 +- tasks/winning/winning_task.go | 7 +- web/api/config/config.go | 61 +- web/api/sector/sector.go | 41 +- web/api/webrpc/actor_charts.go | 26 +- web/api/webrpc/content.go | 54 - web/api/webrpc/deals.go | 17 +- web/api/webrpc/ipfs_content.go | 117 + web/api/webrpc/ipni.go | 94 +- web/api/webrpc/market.go | 789 ++- web/api/webrpc/market_2.go | 1528 +++++ web/api/webrpc/market_filters.go | 2 +- web/api/webrpc/pdp.go | 370 +- web/api/webrpc/sector.go | 17 + web/srv.go | 86 +- web/static/config/edit.html | 60 + web/static/pages/actor/actor-detail.mjs | 23 +- web/static/pages/ipfs-content/content.mjs | 125 + web/static/pages/ipfs-content/index.html | 26 + web/static/pages/ipni/ipni_search.mjs | 2 +- .../pages/market-settings/allow-list.mjs | 1 - web/static/pages/market/index.html | 16 - web/static/pages/market/pending-deals.mjs | 2 +- web/static/pages/mk12-deal/deal.mjs | 8 +- web/static/pages/mk12-deal/index.html | 2 +- .../{market => mk12-deals}/deal-pipelines.mjs | 15 +- web/static/pages/mk12-deals/index.html | 20 +- .../{market => mk12-deals}/market-asks.mjs | 100 +- web/static/pages/mk12-deals/mk12-deals.mjs | 29 +- web/static/pages/mk12-deals/mk12ddo-list.mjs | 30 +- web/static/pages/mk20-deal/deal.mjs | 262 + web/static/pages/mk20-deal/index.html | 43 + web/static/pages/mk20/ddo-pipeline.mjs | 374 ++ web/static/pages/mk20/ddo.mjs | 190 + web/static/pages/mk20/deal-search.mjs | 68 + web/static/pages/mk20/index.html | 52 + web/static/pages/mk20/settings.mjs | 300 + web/static/pages/pdp/index.html | 59 +- web/static/pages/pdp/pdp.mjs | 107 - web/static/pages/pdp/pdp_deals.mjs | 188 + web/static/pages/pdp/pipeline.mjs | 381 ++ web/static/pages/piece/piece-info.mjs | 311 +- .../pages/proofshare/proofshare-client.mjs | 21 +- web/static/pages/sector/sector-info.mjs | 8 +- web/static/pages/upload-status/index.html | 31 + web/static/pages/upload-status/status.mjs | 94 + web/static/ux/curio-ux.mjs | 14 +- 328 files changed, 49718 insertions(+), 7820 deletions(-) create mode 100644 .github/workflows/Dockerfile.supraseal-test create mode 100644 .github/workflows/README.supraseal-testing.md create mode 100644 .github/workflows/test-cuda-download.sh create mode 100755 .github/workflows/test-supraseal-locally.sh create mode 100644 deps/config/dynamic.go create mode 100644 deps/config/dynamic_test.go create mode 100644 deps/config/dynamic_toml.go create mode 100644 deps/config/dynamic_toml_test.go create mode 100755 docker/piece-server/sample/mk20-aggregate-car.sh create mode 100755 docker/piece-server/sample/mk20-ddo.sh create mode 100755 docker/piece-server/sample/mk20-random-deal.sh create mode 100755 docker/piece-server/sample/pdp.sh delete mode 100644 documentation/en/.gitbook/assets/2024-06-04-040735_1470x522_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-150843_1298x2075_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-150919_1072x1563_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-150938_1062x1664_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-151014_855x423_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-151025_997x1175_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-151044_2494x989_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-151136_1468x746_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-151157_1467x2068_scrot.png delete mode 100644 documentation/en/.gitbook/assets/2024-06-05-151234_1468x2078_scrot.png create mode 100644 documentation/en/.gitbook/assets/Curio_placeholder.webp create mode 100644 documentation/en/.gitbook/assets/Filecoin.svg.png delete mode 100644 documentation/en/.gitbook/assets/config-edit.png delete mode 100644 documentation/en/.gitbook/assets/config.png delete mode 100644 documentation/en/.gitbook/assets/curio-cluster.drawio delete mode 100644 documentation/en/.gitbook/assets/curio-cluster.png delete mode 100644 documentation/en/.gitbook/assets/curio-node.png delete mode 100644 documentation/en/.gitbook/assets/curio-sealing.png delete mode 100644 documentation/en/.gitbook/assets/curio-tasks.png delete mode 100644 documentation/en/.gitbook/assets/data-types.png delete mode 100644 documentation/en/.gitbook/assets/emptying-boxes.png create mode 100644 documentation/en/.gitbook/assets/lotus-logo-big.png delete mode 100644 documentation/en/.gitbook/assets/remove-sector.png delete mode 100644 documentation/en/.gitbook/assets/sealing-tasks.png delete mode 100644 documentation/en/.gitbook/assets/shelf.png delete mode 100644 documentation/en/.gitbook/assets/storage-gc.png create mode 100644 documentation/en/.gitbook/assets/yugabyte.svg create mode 100644 documentation/en/market-2.0/README.md create mode 100644 documentation/en/market-2.0/api.md create mode 100644 documentation/en/market-2.0/contracts.md create mode 100644 documentation/en/market-2.0/products.md create mode 100644 harmony/harmonydb/sql/20250505-market-mk20.sql create mode 100644 harmony/harmonydb/sql/20250926-harmony_config_timestamp.sql create mode 100644 itests/dyncfg_test.go create mode 100644 itests/pdp_prove_test.go create mode 100644 itests/sql_idempotent_test.go create mode 100644 lib/commcidv2/commcidv2.go create mode 100644 lib/savecache/savecache.go rename market/indexstore/{create.cql => cql/0001_create.cql} (100%) create mode 100644 market/indexstore/cql/0002_piece_index.cql create mode 100644 market/ipni/types/types.go create mode 100644 market/mk20/client/auth.go create mode 100644 market/mk20/client/client.go create mode 100644 market/mk20/client/http_client.go create mode 100644 market/mk20/ddo_v1.go create mode 100644 market/mk20/http/docs.go create mode 100644 market/mk20/http/http.go create mode 100644 market/mk20/http/swagger.json create mode 100644 market/mk20/http/swagger.yaml create mode 100644 market/mk20/mk20.go create mode 100644 market/mk20/mk20_upload.go create mode 100644 market/mk20/mk20_utils.go create mode 100644 market/mk20/mk20gen/gen.go create mode 100644 market/mk20/pdp_v1.go create mode 100644 market/mk20/retrieval_v1.go create mode 100644 market/mk20/types.go create mode 100644 market/mk20/types_test.go create mode 100644 market/mk20/utils.go create mode 100644 pdp/contract/ListenerServiceWithViewContract.abi create mode 100644 pdp/contract/ListenerServiceWithViewContract.go create mode 100644 pdp/contract/README.md create mode 100644 pdp/contract/ServiceProviderRegistry.abi create mode 100644 pdp/contract/ServiceProviderRegistry.go create mode 100644 pdp/contract/ServiceProviderRegistry.json create mode 100644 pdp/contract/ServiceProviderRegistryStorage.abi create mode 100644 pdp/contract/ServiceProviderRegistryStorage.go create mode 100644 pdp/contract/ServiceProviderRegistryStorage.json create mode 100644 pdp/contract/types.go create mode 100644 pdp/contract/utils.go create mode 100644 tasks/gc/task_cleanup_piece.go create mode 100644 tasks/indexing/task_pdp_indexing.go create mode 100644 tasks/indexing/task_pdp_ipni.go create mode 100644 tasks/pdp/data_set_create_watch.go create mode 100644 tasks/pdp/data_set_delete_watch.go create mode 100644 tasks/pdp/dataset_add_piece_watch.go create mode 100644 tasks/pdp/dataset_delete_root_watch.go delete mode 100644 tasks/pdp/proofset_addroot_watch.go delete mode 100644 tasks/pdp/proofset_create_watch.go create mode 100644 tasks/pdp/task_add_data_set.go create mode 100644 tasks/pdp/task_add_piece.go create mode 100644 tasks/pdp/task_aggregation.go create mode 100644 tasks/pdp/task_commp.go create mode 100644 tasks/pdp/task_delete_data_set.go create mode 100644 tasks/pdp/task_delete_piece.go create mode 100644 tasks/pdp/task_save_cache.go create mode 100644 tasks/piece/task_aggregate_chunks.go delete mode 100644 tasks/storage-market/market_balance.go create mode 100644 tasks/storage-market/mk20.go create mode 100644 tasks/storage-market/task_aggregation.go delete mode 100644 web/api/webrpc/content.go create mode 100644 web/api/webrpc/ipfs_content.go create mode 100644 web/api/webrpc/market_2.go create mode 100644 web/static/pages/ipfs-content/content.mjs create mode 100644 web/static/pages/ipfs-content/index.html rename web/static/pages/{market => mk12-deals}/deal-pipelines.mjs (94%) rename web/static/pages/{market => mk12-deals}/market-asks.mjs (83%) create mode 100644 web/static/pages/mk20-deal/deal.mjs create mode 100644 web/static/pages/mk20-deal/index.html create mode 100644 web/static/pages/mk20/ddo-pipeline.mjs create mode 100644 web/static/pages/mk20/ddo.mjs create mode 100644 web/static/pages/mk20/deal-search.mjs create mode 100644 web/static/pages/mk20/index.html create mode 100644 web/static/pages/mk20/settings.mjs create mode 100644 web/static/pages/pdp/pdp_deals.mjs create mode 100644 web/static/pages/pdp/pipeline.mjs create mode 100644 web/static/pages/upload-status/index.html create mode 100644 web/static/pages/upload-status/status.mjs diff --git a/.github/workflows/Dockerfile.supraseal-test b/.github/workflows/Dockerfile.supraseal-test new file mode 100644 index 000000000..4fb1ae41c --- /dev/null +++ b/.github/workflows/Dockerfile.supraseal-test @@ -0,0 +1,59 @@ +# Dockerfile for testing Supraseal build locally +# Mimics the GitHub Actions Ubuntu 24.04 environment + +FROM ubuntu:24.04 + +ENV DEBIAN_FRONTEND=noninteractive +ENV CUDA_VERSION=13.0 +ENV GCC_VERSION=12 + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + build-essential \ + gcc-12 g++-12 \ + nasm \ + pkg-config \ + autoconf automake libtool \ + libssl-dev \ + libnuma-dev \ + uuid-dev \ + libaio-dev \ + libfuse3-dev \ + libarchive-dev \ + libkeyutils-dev \ + libncurses-dev \ + python3 python3-pip python3-dev \ + curl wget git \ + xxd \ + libconfig++-dev \ + libgmp-dev \ + python3-venv \ + && rm -rf /var/lib/apt/lists/* + +# Set up GCC 12 as default +RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 && \ + update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 && \ + update-alternatives --set gcc /usr/bin/gcc-12 && \ + update-alternatives --set g++ /usr/bin/g++-12 + +# Install CUDA Toolkit from NVIDIA Repository +# Source: https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=24.04&target_type=deb_local +RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb && \ + dpkg -i cuda-keyring_1.1-1_all.deb && \ + rm cuda-keyring_1.1-1_all.deb && \ + apt-get update && \ + apt-get -y install cuda-toolkit && \ + ln -sf /usr/local/cuda /usr/local/cuda-13.0 && \ + rm -rf /var/lib/apt/lists/* + +# Set up CUDA environment +ENV PATH=/usr/local/cuda/bin:${PATH} +ENV CUDA_HOME=/usr/local/cuda +ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64 + +# Set working directory +WORKDIR /workspace + +# Default command +CMD ["/bin/bash"] + diff --git a/.github/workflows/README.supraseal-testing.md b/.github/workflows/README.supraseal-testing.md new file mode 100644 index 000000000..d192432cb --- /dev/null +++ b/.github/workflows/README.supraseal-testing.md @@ -0,0 +1,127 @@ +# Testing Supraseal Build Locally + +This directory contains tools to test the Supraseal GitHub Actions build workflow locally before pushing to CI. + +## Quick Start + +```bash +# From the repository root +./.github/workflows/test-supraseal-locally.sh +``` + +## What It Does + +The test script: +1. Builds a Docker image based on Ubuntu 24.04 (same as GitHub Actions) +2. Installs all dependencies including CUDA from NVIDIA's official repository +3. Installs GCC 12, nasm, SPDK dependencies, etc. +4. Runs the exact same build steps as the CI workflow +5. Verifies all binaries are created successfully + +## Requirements + +- Docker installed and running +- At least 25GB of free disk space (for Docker image + CUDA + build) +- Internet connection (to download CUDA from NVIDIA repository) + +## Troubleshooting + +### CUDA Installation Issues + +CUDA is installed automatically from NVIDIA's official repository during Docker image build. +If you encounter CUDA-related errors: + +```bash +# Verify CUDA is installed in the Docker image +docker run --rm supraseal-test:ubuntu24 nvcc --version + +# Rebuild the Docker image to get latest CUDA +docker build --no-cache -t supraseal-test:ubuntu24 \ + -f .github/workflows/Dockerfile.supraseal-test \ + .github/workflows/ +``` + +### Build Fails + +If the build fails in Docker but works locally: + +```bash +# Run the container interactively for debugging +docker run --rm -it \ + -v "$PWD:/workspace" \ + -v /usr/local/cuda-13.0:/usr/local/cuda-13.0:ro \ + supraseal-test:ubuntu24 \ + bash + +# Inside the container, manually run build steps: +cd /workspace/extern/supraseal +./build.sh +``` + +### Clean Build + +To force a clean build (remove cached dependencies): + +```bash +cd extern/supraseal +rm -rf deps obj bin +./.github/workflows/test-supraseal-locally.sh +``` + +## Manual Testing Without Docker + +If you prefer to test without Docker on Ubuntu 24.04: + +```bash +# Install dependencies (requires sudo) +sudo apt-get update && sudo apt-get install -y \ + build-essential gcc-12 g++-12 nasm pkg-config \ + autoconf automake libtool libssl-dev libnuma-dev \ + uuid-dev libaio-dev libfuse3-dev libarchive-dev \ + libkeyutils-dev libncurses-dev python3 python3-pip \ + python3-dev curl wget git xxd libconfig++-dev libgmp-dev + +# Install Python tools +pip3 install --break-system-packages meson ninja pyelftools + +# Set GCC 12 as default +sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 +sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 + +# Build +cd extern/supraseal +./build.sh +``` + +## CI Workflow Details + +The actual CI workflow (`.github/workflows/ci.yml`) includes: + +- **Job Name**: `build-supraseal-ubuntu24` +- **Runner**: `ubuntu-24.04` +- **Caching**: CUDA installation and SPDK build are cached +- **Artifacts**: Binaries and library are uploaded for 30 days +- **Triggers**: Runs on all pushes and PRs + +## Differences Between Local and CI + +1. **CUDA Version**: Both CI and local Docker use the latest CUDA from NVIDIA's official repository + - The build script supports CUDA 12.x and newer + - Your host machine may have a different CUDA version (this is fine) + +2. **Caching**: CI caches CUDA and SPDK builds across runs + - Local Docker tests rebuild from scratch each time (unless you cache the image) + +3. **Build Time**: + - First CI run: ~45-60 minutes (includes CUDA installation + build) + - Subsequent CI runs: ~20-30 minutes (with cache) + - Local Docker: ~60 minutes first time (includes image build + CUDA) + - Local host: depends on your hardware and existing dependencies + +## Support + +If you encounter issues not covered here, check: +- Build script: `extern/supraseal/build.sh` +- CI workflow: `.github/workflows/ci.yml` +- Supraseal documentation: `extern/supraseal/README.md` + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6cb20ca8a..3be08478f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -179,6 +179,8 @@ jobs: target: "./itests/harmonydb_test.go" - name: test-itest-alertnow target: "./itests/alertnow_test.go" + - name: test-itest-pdp-prove + target: "./itests/pdp_prove_test.go" steps: - uses: actions/checkout@v4 @@ -289,6 +291,228 @@ jobs: run: git --no-pager diff --quiet shell: bash + build-supraseal-ubuntu24: + runs-on: ubuntu-24.04 + needs: [ci-lint] + + env: + GCC_VERSION: "12" + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Free up disk space + run: | + # Remove unnecessary packages to free up space for CUDA installation + sudo apt-get clean + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + build-essential \ + gcc-12 g++-12 \ + nasm \ + pkg-config \ + autoconf automake libtool \ + libssl-dev \ + libnuma-dev \ + uuid-dev \ + libaio-dev \ + libfuse3-dev \ + libarchive-dev \ + libkeyutils-dev \ + libncurses-dev \ + python3 python3-pip python3-dev \ + curl wget git \ + xxd + + - name: Set up Python virtual environment + run: | + # Python tools will be installed in venv by build.sh + # Just ensure python3-venv is available + python3 -m venv --help > /dev/null || sudo apt-get install -y python3-venv + + - name: Set up GCC 12 as default + run: | + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 + sudo update-alternatives --set gcc /usr/bin/gcc-12 + sudo update-alternatives --set g++ /usr/bin/g++-12 + gcc --version + g++ --version + + - name: Cache CUDA installation + id: cache-cuda + uses: actions/cache@v4 + with: + path: | + /usr/local/cuda + /usr/local/cuda-* + key: cuda-toolkit-ubuntu-24.04-${{ runner.os }}-v1 + + - name: Install CUDA Toolkit from NVIDIA Repository + if: steps.cache-cuda.outputs.cache-hit != 'true' + run: | + # Install CUDA using official NVIDIA repository for Ubuntu 24.04 + # Source: https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=24.04&target_type=deb_local + + # Download and install the CUDA keyring package + wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb + sudo dpkg -i cuda-keyring_1.1-1_all.deb + rm cuda-keyring_1.1-1_all.deb + + # Update package list and install CUDA toolkit + sudo apt-get update + sudo apt-get -y install cuda-toolkit + + # Verify installation and find CUDA location + if [ -d "/usr/local/cuda" ]; then + echo "CUDA installed at /usr/local/cuda" + ls -la /usr/local/cuda*/bin/nvcc || true + else + echo "ERROR: CUDA installation not found" + exit 1 + fi + + - name: Set up CUDA environment + run: | + # Verify CUDA installation exists + if [ ! -d "/usr/local/cuda" ]; then + echo "ERROR: /usr/local/cuda not found" + exit 1 + fi + + # Export PATH locally to verify nvcc works + export PATH="/usr/local/cuda/bin:$PATH" + export CUDA_HOME=/usr/local/cuda + export LD_LIBRARY_PATH="/usr/local/cuda/lib64:${LD_LIBRARY_PATH}" + + # Verify nvcc is available + nvcc --version + + # Set environment for subsequent steps + echo "/usr/local/cuda/bin" >> $GITHUB_PATH + echo "CUDA_HOME=/usr/local/cuda" >> $GITHUB_ENV + echo "LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV + + - name: Install libconfig++ + run: | + sudo apt-get install -y libconfig++-dev || { + # If not available in repos, build from source + wget https://hyperrealm.github.io/libconfig/dist/libconfig-1.7.3.tar.gz + tar -xzf libconfig-1.7.3.tar.gz + cd libconfig-1.7.3 + ./configure + make -j$(nproc) + sudo make install + sudo ldconfig + cd .. + rm -rf libconfig-1.7.3* + } + + - name: Install GMP library + run: | + sudo apt-get install -y libgmp-dev + + - name: Cache Python venv + id: cache-venv + uses: actions/cache@v4 + with: + path: extern/supraseal/.venv + key: supraseal-venv-ubuntu24-${{ hashFiles('extern/supraseal/build.sh') }} + restore-keys: | + supraseal-venv-ubuntu24- + + - name: Cache SPDK build + id: cache-spdk + uses: actions/cache@v4 + with: + path: extern/supraseal/deps/spdk-v24.05 + key: spdk-v24.05-gcc12-ubuntu24-${{ hashFiles('extern/supraseal/build.sh') }} + restore-keys: | + spdk-v24.05-gcc12-ubuntu24- + + - name: Build Supraseal + working-directory: extern/supraseal + run: | + # Ensure we're using GCC 12 and CUDA + export CC=gcc-12 + export CXX=g++-12 + export CUDA=/usr/local/cuda + export PATH=/usr/local/cuda/bin:$PATH + export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH + + # Verify CUDA is accessible + which nvcc + nvcc --version + + # Run the build script (creates and uses Python venv internally) + ./build.sh + + - name: Verify binaries + working-directory: extern/supraseal + run: | + echo "=== Built binaries ===" + ls -lh bin/ + + echo "" + echo "=== Verifying binaries exist ===" + test -f bin/seal && echo "✓ seal binary created" || exit 1 + test -f bin/pc2 && echo "✓ pc2 binary created" || exit 1 + test -f bin/tree_r && echo "✓ tree_r binary created" || exit 1 + test -f bin/tree_r_cpu && echo "✓ tree_r_cpu binary created" || exit 1 + test -f bin/tree_d_cpu && echo "✓ tree_d_cpu binary created" || exit 1 + + echo "" + echo "=== Binary sizes ===" + du -h bin/* + + echo "" + echo "✅ All binaries built successfully!" + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: supraseal-binaries-ubuntu24-gcc12-cuda + path: | + extern/supraseal/bin/seal + extern/supraseal/bin/pc2 + extern/supraseal/bin/tree_r + extern/supraseal/bin/tree_r_cpu + extern/supraseal/bin/tree_d_cpu + retention-days: 30 + + - name: Upload library artifact + uses: actions/upload-artifact@v4 + with: + name: supraseal-library-ubuntu24-gcc12-cuda + path: extern/supraseal/obj/libsupraseal.a + retention-days: 30 + + - name: Build summary + run: | + echo "### 🎉 Supraseal Build Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Configuration:**" >> $GITHUB_STEP_SUMMARY + echo "- OS: Ubuntu 24.04" >> $GITHUB_STEP_SUMMARY + echo "- GCC: $(gcc --version | head -1)" >> $GITHUB_STEP_SUMMARY + echo "- CUDA: $(nvcc --version | grep release)" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Built Binaries:**" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + ls -lh extern/supraseal/bin/ >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "✅ All binaries compiled successfully with GCC 12 and CUDA!" >> $GITHUB_STEP_SUMMARY + gen-check: runs-on: ubuntu-latest needs: [ci-lint] @@ -311,6 +535,10 @@ jobs: run: go install github.com/hannahhoward/cbor-gen-for shell: bash + - name: Install swag cli + run: go install github.com/swaggo/swag/cmd/swag@v1.16.4 + shell: bash + # - name: Install gotext # run: go install golang.org/x/text/cmd/gotext # shell: bash diff --git a/.github/workflows/test-cuda-download.sh b/.github/workflows/test-cuda-download.sh new file mode 100644 index 000000000..056bf28d1 --- /dev/null +++ b/.github/workflows/test-cuda-download.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# Test script to verify CUDA download URLs work before pushing to CI +# This helps iterate on the GitHub Actions workflow locally + +set -e + +echo "============================================" +echo "Testing CUDA Download for CI" +echo "============================================" +echo "" + +# Test the URL from the CI workflow +CUDA_URL="https://developer.download.nvidia.com/compute/cuda/13.0.0/local_installers/cuda_13.0.0_530.30.02_linux.run" + +echo "Testing URL: $CUDA_URL" +echo "" + +# Check if URL is accessible +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$CUDA_URL") + +if [ "$HTTP_CODE" = "200" ]; then + echo "✅ URL is accessible (HTTP $HTTP_CODE)" + echo "" + + # Get file size + SIZE=$(curl -sI "$CUDA_URL" | grep -i content-length | awk '{print $2}' | tr -d '\r') + SIZE_GB=$(echo "scale=2; $SIZE / 1024 / 1024 / 1024" | bc) + echo "File size: ${SIZE_GB}GB" + echo "" + + echo "To download manually for testing:" + echo " wget $CUDA_URL" + echo "" + +elif [ "$HTTP_CODE" = "404" ]; then + echo "❌ URL not found (HTTP $HTTP_CODE)" + echo "" + echo "CUDA 13.0 may not be publicly available yet." + echo "" + echo "Options:" + echo "" + echo "1. Use your local CUDA 13 installation:" + echo " - Package it: tar -czf cuda-13.0-local.tar.gz -C /usr/local cuda-13.0" + echo " - Upload to GitHub release or artifact storage" + echo " - Download in CI workflow" + echo "" + echo "2. Use CUDA 12.6 (latest public version):" + echo " Test URL: https://developer.download.nvidia.com/compute/cuda/12.6.0/local_installers/cuda_12.6.0_560.28.03_linux.run" + echo "" + echo "3. Use NVIDIA's runfile for CUDA 12.6:" + echo " wget https://developer.download.nvidia.com/compute/cuda/12.6.0/local_installers/cuda_12.6.0_560.28.03_linux.run" + echo "" + echo "Testing CUDA 12.6 URL..." + CUDA_12_URL="https://developer.download.nvidia.com/compute/cuda/12.6.0/local_installers/cuda_12.6.0_560.28.03_linux.run" + HTTP_CODE_12=$(curl -s -o /dev/null -w "%{http_code}" "$CUDA_12_URL") + + if [ "$HTTP_CODE_12" = "200" ]; then + echo "✅ CUDA 12.6 URL works (HTTP $HTTP_CODE_12)" + SIZE=$(curl -sI "$CUDA_12_URL" | grep -i content-length | awk '{print $2}' | tr -d '\r') + SIZE_GB=$(echo "scale=2; $SIZE / 1024 / 1024 / 1024" | bc) + echo "File size: ${SIZE_GB}GB" + echo "" + echo "Recommendation: Update ci.yml to use CUDA 12.6 temporarily" + echo "Your build script already supports CUDA 12+, so it will work fine." + else + echo "❌ CUDA 12.6 URL also failed (HTTP $HTTP_CODE_12)" + fi + +else + echo "❌ Unexpected HTTP response: $HTTP_CODE" +fi + +echo "" +echo "============================================" +echo "Local Iteration Workflow" +echo "============================================" +echo "" +echo "To test CI changes locally before pushing:" +echo "" +echo "1. Edit the Dockerfile to test CUDA installation:" +echo " .github/workflows/Dockerfile.supraseal-test" +echo "" +echo "2. Run local test:" +echo " ./.github/workflows/test-supraseal-locally.sh" + + diff --git a/.github/workflows/test-supraseal-locally.sh b/.github/workflows/test-supraseal-locally.sh new file mode 100755 index 000000000..d739edf26 --- /dev/null +++ b/.github/workflows/test-supraseal-locally.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# Local testing script for Supraseal CI workflow +# This mimics what GitHub Actions does + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" + +echo "============================================" +echo "Testing Supraseal Build Locally" +echo "============================================" +echo "" + +# Build the Docker image +echo "Step 1: Building Docker image..." +docker build -t supraseal-test:ubuntu24 -f "$SCRIPT_DIR/Dockerfile.supraseal-test" "$SCRIPT_DIR" + +echo "" +echo "Step 2: Running build in Docker container..." +echo "" + +# Run the container with: +# - Mount the repo +# - Set environment variables (CUDA is installed in the image from NVIDIA repos) +# - Python venv will be created by build.sh +docker run --rm \ + -v "$REPO_ROOT:/workspace" \ + -e CC=gcc-12 \ + -e CXX=g++-12 \ + -e CUDA=/usr/local/cuda \ + -e PATH=/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + -e LD_LIBRARY_PATH=/usr/local/cuda/lib64 \ + -w /workspace \ + supraseal-test:ubuntu24 \ + bash -c ' + set -e + + echo "=== Environment ===" + echo "GCC Version:" + gcc --version | head -1 + echo "" + echo "G++ Version:" + g++ --version | head -1 + echo "" + echo "NVCC Version:" + nvcc --version | grep release || echo "CUDA not available" + echo "" + + echo "=== Initializing submodules ===" + git config --global --add safe.directory /workspace + git submodule update --init --recursive + echo "" + + echo "=== Building Supraseal ===" + cd extern/supraseal + ./build.sh + echo "" + + echo "=== Verifying binaries ===" + ls -lh bin/ + echo "" + + test -f bin/seal && echo "✓ seal binary created" || { echo "✗ seal binary missing"; exit 1; } + test -f bin/pc2 && echo "✓ pc2 binary created" || { echo "✗ pc2 binary missing"; exit 1; } + test -f bin/tree_r && echo "✓ tree_r binary created" || { echo "✗ tree_r binary missing"; exit 1; } + test -f bin/tree_r_cpu && echo "✓ tree_r_cpu binary created" || { echo "✗ tree_r_cpu binary missing"; exit 1; } + test -f bin/tree_d_cpu && echo "✓ tree_d_cpu binary created" || { echo "✗ tree_d_cpu binary missing"; exit 1; } + + echo "" + echo "=== Binary sizes ===" + du -h bin/* + echo "" + + echo "✅ All binaries built successfully!" + ' + +echo "" +echo "============================================" +echo "✅ Local test completed successfully!" +echo "============================================" + diff --git a/.gitignore b/.gitignore index 07decfcf4..aad943968 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ build/.* .idea .vscode /venv +**/.venv scratchpad # to ensure tests build: itests/ go test -c . diff --git a/Dockerfile b/Dockerfile index 0b4a00bb5..2a42de94e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,11 @@ ENV RUSTUP_HOME=/usr/local/rustup \ PATH=/usr/local/cargo/bin:$PATH \ RUST_VERSION=1.63.0 +COPY ./ /opt/curio +WORKDIR /opt/curio +RUN git submodule update --init +RUN go mod download + RUN set -eux; \ dpkgArch="$(dpkg --print-architecture)"; \ case "${dpkgArch##*-}" in \ @@ -32,9 +37,6 @@ RUN set -eux; \ cargo --version; \ rustc --version; -COPY ./ /opt/curio -WORKDIR /opt/curio - ### make configurable filecoin-ffi build ARG FFI_BUILD_FROM_SOURCE=0 ENV FFI_BUILD_FROM_SOURCE=${FFI_BUILD_FROM_SOURCE} @@ -56,13 +58,26 @@ RUN go install github.com/ipld/go-car/cmd/car@latest \ RUN go install github.com/LexLuthr/piece-server@latest \ && cp $GOPATH/bin/piece-server /usr/local/bin/ -RUN go install github.com/ipni/storetheindex@v0.8.38 \ +RUN go install github.com/ipni/storetheindex@latest \ && cp $GOPATH/bin/storetheindex /usr/local/bin/ +RUN go install github.com/ethereum/go-ethereum/cmd/geth@latest \ + && cp $GOPATH/bin/geth /usr/local/bin/ + ##################################### FROM ubuntu:22.04 AS curio-all-in-one -RUN apt-get update && apt-get install -y dnsutils vim curl aria2 jq +RUN apt-get update && apt-get install -y dnsutils vim curl aria2 jq git wget nodejs npm + +# Install Foundry +RUN curl -L https://foundry.paradigm.xyz | bash \ + && bash -c ". ~/.foundry/bin/foundryup" + +# Make sure foundry binaries are available in PATH +ENV PATH="/root/.foundry/bin:${PATH}" + +# Verify installation +RUN forge --version && cast --version && anvil --version # Copy libraries and binaries from curio-builder COPY --from=curio-builder /etc/ssl/certs /etc/ssl/certs @@ -98,6 +113,7 @@ COPY --from=curio-builder /opt/curio/sptool /usr/local/bin/ COPY --from=piece-server-builder /usr/local/bin/piece-server /usr/local/bin/ COPY --from=piece-server-builder /usr/local/bin/car /usr/local/bin/ COPY --from=piece-server-builder /usr/local/bin/storetheindex /usr/local/bin/ +COPY --from=piece-server-builder /usr/local/bin/geth /usr/local/bin/ # Set up directories and permissions RUN mkdir /var/tmp/filecoin-proof-parameters \ diff --git a/Makefile b/Makefile index 81c041a32..9bdc2e15a 100644 --- a/Makefile +++ b/Makefile @@ -161,6 +161,9 @@ batch-build: curio calibnet-sptool: CURIO_TAGS+= calibnet calibnet-sptool: sptool +calibnet-curio: CURIO_TAGS+= calibnet +calibnet-curio: curio + install: install-curio install-sptool .PHONY: install @@ -255,7 +258,7 @@ docsgen-cli: curio sptool echo '# Default Curio Configuration' >> documentation/en/configuration/default-curio-configuration.md echo '' >> documentation/en/configuration/default-curio-configuration.md echo '```toml' >> documentation/en/configuration/default-curio-configuration.md - ./curio config default >> documentation/en/configuration/default-curio-configuration.md + LANG=en-US ./curio config default >> documentation/en/configuration/default-curio-configuration.md echo '```' >> documentation/en/configuration/default-curio-configuration.md .PHONY: docsgen-cli @@ -266,11 +269,19 @@ go-generate: gen: gensimple .PHONY: gen -gensimple: api-gen go-generate cfgdoc-gen docsgen docsgen-cli +marketgen: + swag init -dir market/mk20/http -g http.go -o market/mk20/http --parseDependencyLevel 3 --parseDependency +.PHONY: marketgen + +gensimple: api-gen go-generate cfgdoc-gen docsgen marketgen docsgen-cli $(GOCC) run ./scripts/fiximports go mod tidy .PHONY: gen +fiximports: + $(GOCC) run ./scripts/fiximports +.PHONY: fiximports + forest-test: GOFLAGS+=-tags=forest forest-test: buildall diff --git a/alertmanager/alerts.go b/alertmanager/alerts.go index fafe65408..056f7d47b 100644 --- a/alertmanager/alerts.go +++ b/alertmanager/alerts.go @@ -3,7 +3,6 @@ package alertmanager import ( "bytes" "context" - "database/sql" "fmt" "math" "strings" @@ -13,6 +12,7 @@ import ( "github.com/dustin/go-humanize" cbor "github.com/ipfs/go-ipld-cbor" "github.com/samber/lo" + "github.com/yugabyte/pgx/v5" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -346,7 +346,7 @@ func (al *alerts) getAddresses() ([]address.Address, []address.Address, error) { cfg := config.DefaultCurioConfig() err := al.db.QueryRow(al.ctx, `SELECT config FROM harmony_config WHERE title=$1`, layer).Scan(&text) if err != nil { - if strings.Contains(err.Error(), sql.ErrNoRows.Error()) { + if strings.Contains(err.Error(), pgx.ErrNoRows.Error()) { return nil, nil, xerrors.Errorf("missing layer '%s' ", layer) } return nil, nil, xerrors.Errorf("could not read layer '%s': %w", layer, err) @@ -357,16 +357,17 @@ func (al *alerts) getAddresses() ([]address.Address, []address.Address, error) { return nil, nil, err } - _, err = toml.Decode(text, cfg) + _, err = config.TransparentDecode(text, cfg) if err != nil { return nil, nil, xerrors.Errorf("could not read layer, bad toml %s: %w", layer, err) } - for i := range cfg.Addresses { - prec := cfg.Addresses[i].PreCommitControl - com := cfg.Addresses[i].CommitControl - term := cfg.Addresses[i].TerminateControl - miners := cfg.Addresses[i].MinerAddresses + addrs := cfg.Addresses.Get() + for i := range addrs { + prec := addrs[i].PreCommitControl + com := addrs[i].CommitControl + term := addrs[i].TerminateControl + miners := addrs[i].MinerAddresses for j := range prec { if prec[j] != "" { addrMap[prec[j]] = struct{}{} @@ -443,7 +444,12 @@ func wdPostCheck(al *alerts) { return } - h := head + // Start from the newest finalized tipset. + h, err := al.api.ChainGetTipSet(al.ctx, head.Parents()) + if err != nil { + al.alertMap[Name].err = err + return + } // Map[Miner Address]Map[DeadlineIdx][]Partitions msgCheck := make(map[address.Address]map[uint64][]bool) @@ -731,7 +737,7 @@ func missingSectorCheck(al *alerts) { SectorID int64 `db:"sector_num"` } - err := al.db.Select(al.ctx, §ors, `SELECT miner_id, sector_num FROM sector_location WHERE sector_filetype = 2 GROUP BY miner_id, sector_num ORDER BY miner_id, sector_num`) + err := al.db.Select(al.ctx, §ors, `SELECT miner_id, sector_num FROM sector_location WHERE sector_filetype = ANY(ARRAY[2,8]) GROUP BY miner_id, sector_num ORDER BY miner_id, sector_num`) if err != nil { al.alertMap[Name].err = xerrors.Errorf("getting sealed sectors from database: %w", err) return diff --git a/alertmanager/plugin/slack_webhook.go b/alertmanager/plugin/slack_webhook.go index 118e92d4c..b524a036f 100644 --- a/alertmanager/plugin/slack_webhook.go +++ b/alertmanager/plugin/slack_webhook.go @@ -65,29 +65,60 @@ func (s *SlackWebhook) SendAlert(data *AlertPayload) error { // Iterate through the map to construct the remaining blocks for key, value := range data.Details { - // Split value into sentences by period followed by space + // Split value into sentences by period followed by space. sentences := strings.Split(value.(string), ". ") - formattedValue := fmt.Sprintf("• *%s*\n", key) - // Add a bullet point before each trimmed sentence + // Add the key as the header for each block. + baseFormattedValue := fmt.Sprintf("• *%s*\n", key) + currentFormattedValue := baseFormattedValue + + // Keep track of the character limit (3000) when adding sentences. for _, sentence := range sentences { - trimmedSentence := strings.TrimSpace(sentence) // Trim leading and trailing spaces + trimmedSentence := strings.TrimSpace(sentence) // Trim leading and trailing spaces. if trimmedSentence != "" { - formattedValue += fmt.Sprintf("• %s.\n", trimmedSentence) // Add period back and newline + // Add a bullet point and sentence, restoring the period and newline. + newSection := fmt.Sprintf("• %s.\n", trimmedSentence) + + // Check if adding this section exceeds the 3000-character limit. + if len(currentFormattedValue)+len(newSection) > 3000 { + // If limit exceeds, add the currentFormattedValue block to payload and start a new block. + payload.Blocks = append(payload.Blocks, + Block{ + Type: "section", + Text: &TextBlock{ + Type: "mrkdwn", + Text: currentFormattedValue, + }, + }, + Block{ + Type: "divider", + }, + ) + + // Start a new formatted value with the baseFormattedValue. + currentFormattedValue = baseFormattedValue + } + + // Append the newSection to the currentFormattedValue. + currentFormattedValue += newSection } } - payload.Blocks = append(payload.Blocks, - Block{ - Type: "section", - Text: &TextBlock{ - Type: "mrkdwn", - Text: formattedValue, + + // Add the last block if it contains any content. + if currentFormattedValue != baseFormattedValue { + payload.Blocks = append(payload.Blocks, + Block{ + Type: "section", + Text: &TextBlock{ + Type: "mrkdwn", + Text: currentFormattedValue, + }, }, - }, - Block{ - Type: "divider", - }, - ) + Block{ + Type: "divider", + }, + ) + } } // Marshal the payload to JSON @@ -163,7 +194,8 @@ func (s *SlackWebhook) SendAlert(data *AlertPayload) error { } }) if err != nil { - return fmt.Errorf("after %d retries,last error: %w", iter, err) + log.Errorw("Slack Webhook payload:", string(jsonData)) + return fmt.Errorf("after %d retries,last error: %w, %s", iter, err, string(jsonData)) } return nil } diff --git a/build/openrpc/curio.json b/build/openrpc/curio.json index 0d5352000..9b2e6c76b 100644 --- a/build/openrpc/curio.json +++ b/build/openrpc/curio.json @@ -2,7 +2,7 @@ "openrpc": "1.2.6", "info": { "title": "Curio RPC API", - "version": "1.27.1" + "version": "1.27.2" }, "methods": [ { diff --git a/build/version.go b/build/version.go index 8f7f559d1..82265a5e2 100644 --- a/build/version.go +++ b/build/version.go @@ -41,7 +41,7 @@ func BuildTypeString() string { } // Intent: Major.Network.Patch -var BuildVersionArray = [3]int{1, 27, 1} +var BuildVersionArray = [3]int{1, 27, 2} // RC var BuildVersionRC = 0 diff --git a/cmd/curio/config_test.go b/cmd/curio/config_test.go index 90f2926f0..1698cdaa2 100644 --- a/cmd/curio/config_test.go +++ b/cmd/curio/config_test.go @@ -572,18 +572,19 @@ func TestConfig(t *testing.T) { _, err := deps.LoadConfigWithUpgrades(baseText, baseCfg) require.NoError(t, err) - baseCfg.Addresses = append(baseCfg.Addresses, addr1) - baseCfg.Addresses = lo.Filter(baseCfg.Addresses, func(a config.CurioAddresses, _ int) bool { + addrs := []config.CurioAddresses{addr1} + addrs = lo.Filter(addrs, func(a config.CurioAddresses, _ int) bool { return len(a.MinerAddresses) > 0 }) + baseCfg.Addresses.Set(addrs) _, err = config.ConfigUpdate(baseCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) require.NoError(t, err) - baseCfg.Addresses = append(baseCfg.Addresses, addr2) - baseCfg.Addresses = lo.Filter(baseCfg.Addresses, func(a config.CurioAddresses, _ int) bool { + baseCfg.Addresses.Set(append(baseCfg.Addresses.Get(), addr2)) + baseCfg.Addresses.Set(lo.Filter(baseCfg.Addresses.Get(), func(a config.CurioAddresses, _ int) bool { return len(a.MinerAddresses) > 0 - }) + })) _, err = config.ConfigUpdate(baseCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) require.NoError(t, err) diff --git a/cmd/curio/debug-ipni.go b/cmd/curio/debug-ipni.go index 5fc9de7d0..7147b9d47 100644 --- a/cmd/curio/debug-ipni.go +++ b/cmd/curio/debug-ipni.go @@ -48,7 +48,7 @@ var testDebugIpniChunks = &cli.Command{ return xerrors.Errorf("reading block: %w", err) } - _, err = ck.Finish(c.Context, nil, cid.Undef) + _, err = ck.Finish(c.Context, nil, cid.Undef, false) if err != nil { return xerrors.Errorf("chunking CAR multihash iterator: %w", err) } diff --git a/cmd/curio/guidedsetup/guidedsetup.go b/cmd/curio/guidedsetup/guidedsetup.go index 3874da882..6a37002af 100644 --- a/cmd/curio/guidedsetup/guidedsetup.go +++ b/cmd/curio/guidedsetup/guidedsetup.go @@ -9,16 +9,20 @@ import ( "context" "crypto/rand" "encoding/base64" + "encoding/hex" + "encoding/json" "fmt" "io" "os" "os/signal" "path" + "path/filepath" "strings" "syscall" "github.com/charmbracelet/lipgloss" "github.com/docker/go-units" + "github.com/ethereum/go-ethereum/crypto" "github.com/manifoldco/promptui" "github.com/mitchellh/go-homedir" "github.com/samber/lo" @@ -36,6 +40,7 @@ import ( "github.com/filecoin-project/curio/deps/config" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/lib/createminer" + "github.com/filecoin-project/curio/lib/storiface" lapi "github.com/filecoin-project/lotus/api" cliutil "github.com/filecoin-project/lotus/cli/util" @@ -93,6 +98,9 @@ var GuidedsetupCmd = &cli.Command{ } } + // Optional steps + optionalSteps(&migrationData) + for _, closer := range migrationData.closers { closer() } @@ -202,7 +210,7 @@ type MigrationData struct { selectTemplates *promptui.SelectTemplates MinerConfigPath string DB *harmonydb.DB - HarmonyCfg config.HarmonyDB + HarmonyCfg harmonydb.Config MinerID address.Address full api.Chain cctx *cli.Context @@ -471,7 +479,7 @@ func stepCreateActor(d *MigrationData) { Label: d.T("Select the Sector Size"), Items: []string{ d.T("64 GiB"), - d.T("32 GiB"), + d.T("32 GiB (recommended for mainnet)"), d.T("8 MiB"), d.T("2 KiB"), }, @@ -539,7 +547,7 @@ func stepNewMinerConfig(d *MigrationData) { // Only add miner address for SP setup if !d.nonSP { - curioCfg.Addresses = append(curioCfg.Addresses, config.CurioAddresses{ + curioCfg.Addresses.Set([]config.CurioAddresses{{ PreCommitControl: []string{}, CommitControl: []string{}, DealPublishControl: []string{}, @@ -548,7 +556,7 @@ func stepNewMinerConfig(d *MigrationData) { DisableWorkerFallback: false, MinerAddresses: []string{d.MinerID.String()}, BalanceManager: config.DefaultBalanceManager(), - }) + }}) } sk, err := io.ReadAll(io.LimitReader(rand.Reader, 32)) @@ -604,9 +612,9 @@ func stepNewMinerConfig(d *MigrationData) { // If 'base' layer is not present if !lo.Contains(titles, "base") { if !d.nonSP { - curioCfg.Addresses = lo.Filter(curioCfg.Addresses, func(a config.CurioAddresses, _ int) bool { + curioCfg.Addresses.Set(lo.Filter(curioCfg.Addresses.Get(), func(a config.CurioAddresses, _ int) bool { return len(a.MinerAddresses) > 0 - }) + })) } cb, err := config.ConfigUpdate(curioCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) if err != nil { @@ -661,10 +669,10 @@ func stepNewMinerConfig(d *MigrationData) { os.Exit(1) } - baseCfg.Addresses = append(baseCfg.Addresses, curioCfg.Addresses...) - baseCfg.Addresses = lo.Filter(baseCfg.Addresses, func(a config.CurioAddresses, _ int) bool { + baseCfg.Addresses.Set(append(baseCfg.Addresses.Get(), curioCfg.Addresses.Get()...)) + baseCfg.Addresses.Set(lo.Filter(baseCfg.Addresses.Get(), 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 { @@ -752,3 +760,432 @@ func getDBDetails(d *MigrationData) { } } } + +func optionalSteps(d *MigrationData) { + for { + i, _, err := (&promptui.Select{ + Label: d.T("Optional setup steps (you can skip these and configure later):"), + Items: []string{ + d.T("Skip optional steps"), + d.T("Storage"), + d.T("PDP")}, + Templates: d.selectTemplates, + }).Run() + if err != nil { + if err.Error() == "^C" { + os.Exit(1) + } + return + } + switch i { + case 0: + return + case 1: + optionalStorageStep(d) + case 2: + optionalPDPStep(d) + } + } +} + +func optionalStorageStep(d *MigrationData) { + d.say(header, "Storage Configuration") + d.say(plain, "Manage storage paths for this server.") + + // Get storage.json path + curioRepoPath := os.Getenv("CURIO_REPO_PATH") + if curioRepoPath == "" { + homeDir, err := os.UserHomeDir() + if err != nil { + d.say(notice, "Error getting home directory: %s", err.Error()) + return + } + curioRepoPath = path.Join(homeDir, ".curio") + } + storageJSONPath := path.Join(curioRepoPath, "storage.json") + + // Read existing storage paths + localPaths := []string{} + storageCfg, err := readStorageConfig(storageJSONPath) + if err == nil { + for _, p := range storageCfg.StoragePaths { + localPaths = append(localPaths, p.Path) + } + } + + for { + items := []string{d.T("Go Back")} + items = append(items, d.T("Add new storage path")) + for _, p := range localPaths { + items = append(items, d.T("Delete %s", p)) + } + + i, _, err := (&promptui.Select{ + Label: d.T("Storage paths for this server:"), + Items: items, + Templates: d.selectTemplates, + }).Run() + if err != nil { + if err.Error() == "^C" { + os.Exit(1) + } + return + } + + if i == 0 { + return + } else if i == 1 { + // Add new storage path + pathStr, err := (&promptui.Prompt{ + Label: d.T("Enter storage path to add"), + }).Run() + if err != nil { + d.say(notice, "No path provided") + continue + } + + expandedPath, err := homedir.Expand(pathStr) + if err != nil { + d.say(notice, "Error expanding path: %s", err.Error()) + continue + } + + // Check if path already exists + exists := false + for _, p := range localPaths { + if p == expandedPath { + exists = true + break + } + } + if exists { + d.say(notice, "Path already exists") + continue + } + + // Ask for storage type + storageType, _, err := (&promptui.Select{ + Label: d.T("Storage type for %s", expandedPath), + Items: []string{ + d.T("Seal (fast storage for sealing operations)"), + d.T("Store (long-term storage for sealed sectors)"), + d.T("Both (seal and store)")}, + Templates: d.selectTemplates, + }).Run() + if err != nil { + continue + } + + // Add to storage.json + if storageCfg == nil { + storageCfg = &storiface.StorageConfig{StoragePaths: []storiface.LocalPath{}} + } + storageCfg.StoragePaths = append(storageCfg.StoragePaths, storiface.LocalPath{Path: expandedPath}) + localPaths = append(localPaths, expandedPath) + + // Write storage.json + if err := writeStorageConfig(storageJSONPath, *storageCfg); err != nil { + d.say(notice, "Error writing storage.json: %s", err.Error()) + continue + } + + storageTypeStr := []string{"seal", "store", "both"}[storageType] + d.say(plain, "Storage path %s added as %s. You'll need to initialize it with: curio cli storage attach --init --%s %s", expandedPath, storageTypeStr, storageTypeStr, expandedPath) + stepCompleted(d, d.T("Storage path added")) + } else { + // Delete storage path + pathToDelete := localPaths[i-2] + i, _, err := (&promptui.Select{ + Label: d.T("Really delete %s?", pathToDelete), + Items: []string{ + d.T("Yes, delete it"), + d.T("No, keep it")}, + Templates: d.selectTemplates, + }).Run() + if err != nil || i == 1 { + continue + } + + // Remove from storage.json + newPaths := []storiface.LocalPath{} + for _, p := range storageCfg.StoragePaths { + if p.Path != pathToDelete { + newPaths = append(newPaths, p) + } + } + storageCfg.StoragePaths = newPaths + + // Update localPaths list + newLocalPaths := []string{} + for _, p := range localPaths { + if p != pathToDelete { + newLocalPaths = append(newLocalPaths, p) + } + } + localPaths = newLocalPaths + + // Write storage.json + if err := writeStorageConfig(storageJSONPath, *storageCfg); err != nil { + d.say(notice, "Error writing storage.json: %s", err.Error()) + continue + } + + d.say(plain, "Storage path %s removed from configuration", pathToDelete) + stepCompleted(d, d.T("Storage path deleted")) + } + } +} + +func optionalPDPStep(d *MigrationData) { + d.say(header, "PDP (Proof of Data Possession) Configuration") + d.say(plain, "This will configure PDP settings for your Curio cluster.") + d.say(plain, "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp") + + // Check if PDP layer already exists + var existingPDPConfig string + err := d.DB.QueryRow(d.ctx, "SELECT config FROM harmony_config WHERE title='pdp'").Scan(&existingPDPConfig) + hasPDPLayer := err == nil + + if hasPDPLayer { + i, _, err := (&promptui.Select{ + Label: d.T("PDP layer already exists. What would you like to do?"), + Items: []string{ + d.T("Reconfigure PDP"), + d.T("Skip PDP setup")}, + Templates: d.selectTemplates, + }).Run() + if err != nil || i == 1 { + return + } + } + + // Step 1: Configure PDP layer + d.say(plain, "Creating PDP configuration layer...") + + curioCfg := config.DefaultCurioConfig() + if hasPDPLayer { + _, err = deps.LoadConfigWithUpgrades(existingPDPConfig, curioCfg) + if err != nil { + d.say(notice, "Error loading existing PDP config: %s", err.Error()) + return + } + } + + // Enable PDP subsystems + curioCfg.Subsystems.EnablePDP = true + curioCfg.Subsystems.EnableParkPiece = true + curioCfg.Subsystems.EnableCommP = true + curioCfg.Subsystems.EnableMoveStorage = true + curioCfg.Subsystems.NoUnsealedDecode = true + + // Configure HTTP + d.say(plain, "Configuring HTTP settings for PDP...") + + domain, err := (&promptui.Prompt{ + Label: d.T("Enter your domain name (e.g., market.mydomain.com)"), + Default: "market.mydomain.com", + }).Run() + if err != nil { + d.say(notice, "No domain provided, skipping HTTP configuration") + return + } + + listenAddr, err := (&promptui.Prompt{ + Label: d.T("Listen address for HTTP server"), + Default: "0.0.0.0:443", + }).Run() + if err != nil { + listenAddr = "0.0.0.0:443" + } + + curioCfg.HTTP.Enable = true + curioCfg.HTTP.DomainName = domain + curioCfg.HTTP.ListenAddress = listenAddr + + // Generate PDP config TOML + cb, err := config.ConfigUpdate(curioCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) + if err != nil { + d.say(notice, "Error generating PDP config: %s", err.Error()) + return + } + + // Save to database + _, err = d.DB.Exec(d.ctx, `INSERT INTO harmony_config (title, config) VALUES ('pdp', $1) ON CONFLICT (title) DO UPDATE SET config = $1`, string(cb)) + if err != nil { + d.say(notice, "Error saving PDP config: %s", err.Error()) + return + } + + stepCompleted(d, d.T("PDP configuration layer created")) + + // Step 2: Import wallet private key + d.say(plain, "Setting up PDP wallet...") + d.say(plain, "You need a delegated Filecoin wallet address to use with PDP.") + + // Check if PDP key already exists + var existingKeyAddress string + err = d.DB.QueryRow(d.ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingKeyAddress) + hasExistingKey := err == nil + + // Build menu items + menuItems := []string{} + useExistingIndex := -1 + + if hasExistingKey { + // Show last 8 characters of address for identification + addressSuffix := existingKeyAddress + if len(addressSuffix) > 8 { + addressSuffix = "..." + addressSuffix[len(addressSuffix)-8:] + } + useExistingIndex = len(menuItems) + menuItems = append(menuItems, d.T("Use existing key, ending in %s", addressSuffix)) + } + + importKeyIndex := len(menuItems) + menuItems = append(menuItems, d.T("Import delegated wallet private key")) + skipIndex := len(menuItems) + menuItems = append(menuItems, d.T("Skip wallet setup for now")) + + i, _, err := (&promptui.Select{ + Label: d.T("How would you like to proceed?"), + Items: menuItems, + Templates: d.selectTemplates, + }).Run() + if err != nil || i == skipIndex { + d.say(plain, "You can set up the wallet later using the Curio GUI or CLI") + return + } + + switch i { + case useExistingIndex: + // Use existing key + d.say(plain, "Using existing PDP wallet key: %s", existingKeyAddress) + stepCompleted(d, d.T("PDP wallet configured")) + case importKeyIndex: + // Import or create - show instructions first + d.say(plain, "You can create a new delegated wallet using Lotus:") + d.say(code, "lotus wallet new delegated") + d.say(plain, " Then export its private key with:") + d.say(code, "lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32") + d.say(plain, "") + d.say(plain, "Enter your delegated wallet private key (hex format):") + + privateKeyHex, err := (&promptui.Prompt{ + Label: d.T("Private key"), + }).Run() + if err != nil || privateKeyHex == "" { + d.say(notice, "No private key provided") + return + } + importPDPPrivateKey(d, privateKeyHex) + case skipIndex: + d.say(plain, "You can set up the wallet later using the Curio GUI or CLI") + } + + d.say(plain, "") + d.say(plain, "PDP setup complete!") + d.say(plain, "To start Curio with PDP enabled, run:") + d.say(code, "curio run --layers=gui,pdp") + d.say(plain, "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.") + d.say(plain, "") + d.say(notice, "Next steps:") + if domain != "" { + d.say(plain, "1. Test your PDP service with: pdptool ping --service-url https://%s --service-name public", domain) + } else { + d.say(plain, "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public") + } + d.say(plain, "2. Register your FWSS node") + d.say(plain, "3. Explore FWSS & PDP tools at https://www.filecoin.services") + d.say(plain, "4. Join the community: Filecoin Slack #fil-pdp") +} + +func importPDPPrivateKey(d *MigrationData, hexPrivateKey string) { + hexPrivateKey = strings.TrimSpace(hexPrivateKey) + hexPrivateKey = strings.TrimPrefix(hexPrivateKey, "0x") + hexPrivateKey = strings.TrimPrefix(hexPrivateKey, "0X") + + if hexPrivateKey == "" { + d.say(notice, "Private key cannot be empty") + return + } + + // Decode hex private key + privateKeyBytes, err := hex.DecodeString(hexPrivateKey) + if err != nil { + d.say(notice, "Failed to decode private key: %s", err.Error()) + return + } + + // Convert to ECDSA and derive address + privateKey, err := crypto.ToECDSA(privateKeyBytes) + if err != nil { + d.say(notice, "Invalid private key: %s", err.Error()) + return + } + + address := crypto.PubkeyToAddress(privateKey.PublicKey).Hex() + + // Insert or update eth_keys table + _, err = d.DB.BeginTransaction(d.ctx, func(tx *harmonydb.Tx) (bool, error) { + // Insert the new PDP key + _, err = tx.Exec(`INSERT INTO eth_keys (address, private_key, role) VALUES ($1, $2, 'pdp')`, address, privateKeyBytes) + if err != nil { + return false, fmt.Errorf("failed to insert PDP key: %v", err) + } + return true, nil + }) + if err != nil { + d.say(notice, "Failed to import PDP key: %s", err.Error()) + return + } + + d.say(plain, "PDP wallet imported successfully!") + d.say(plain, "Ethereum address (0x): %s", address) + stepCompleted(d, d.T("PDP wallet imported")) +} + +func readStorageConfig(path string) (s *storiface.StorageConfig, errOut error) { + expandedPath, err := homedir.Expand(path) + if err != nil { + return nil, err + } + + file, err := os.Open(expandedPath) + if err != nil { + return nil, err + } + defer func() { + err := file.Close() + if err != nil { + errOut = err + } + }() + + var cfg storiface.StorageConfig + err = json.NewDecoder(file).Decode(&cfg) + if err != nil { + return nil, err + } + + return &cfg, nil +} + +func writeStorageConfig(path string, cfg storiface.StorageConfig) error { + expandedPath, err := homedir.Expand(path) + if err != nil { + return err + } + + // Ensure directory exists + dir := filepath.Dir(expandedPath) + if err := os.MkdirAll(dir, 0755); err != nil { + return err + } + + b, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return err + } + + return os.WriteFile(expandedPath, b, 0644) +} diff --git a/cmd/curio/guidedsetup/shared.go b/cmd/curio/guidedsetup/shared.go index a54bd2918..07455d4ae 100644 --- a/cmd/curio/guidedsetup/shared.go +++ b/cmd/curio/guidedsetup/shared.go @@ -10,7 +10,6 @@ import ( "path" "strings" - "github.com/BurntSushi/toml" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -150,7 +149,7 @@ func SaveConfigToLayerMigrateSectors(db *harmonydb.DB, minerRepoPath, chainApiIn minerAddress = addr - curioCfg.Addresses = []config.CurioAddresses{{ + curioCfg.Addresses.Set([]config.CurioAddresses{{ MinerAddresses: []string{addr.String()}, PreCommitControl: smCfg.Addresses.PreCommitControl, CommitControl: smCfg.Addresses.CommitControl, @@ -159,7 +158,7 @@ func SaveConfigToLayerMigrateSectors(db *harmonydb.DB, minerRepoPath, chainApiIn DisableOwnerFallback: smCfg.Addresses.DisableOwnerFallback, DisableWorkerFallback: smCfg.Addresses.DisableWorkerFallback, BalanceManager: config.DefaultBalanceManager(), - }} + }}) ks, err := lr.KeyStore() if err != nil { @@ -174,10 +173,11 @@ func SaveConfigToLayerMigrateSectors(db *harmonydb.DB, minerRepoPath, chainApiIn curioCfg.Apis.ChainApiInfo = append(curioCfg.Apis.ChainApiInfo, chainApiInfo) // Express as configTOML - configTOML := &bytes.Buffer{} - if err = toml.NewEncoder(configTOML).Encode(curioCfg); err != nil { + configTOMLBytes, err := config.TransparentMarshal(curioCfg) + if err != nil { return minerAddress, err } + configTOML := bytes.NewBuffer(configTOMLBytes) if lo.Contains(titles, "base") { // append addresses @@ -192,17 +192,20 @@ func SaveConfigToLayerMigrateSectors(db *harmonydb.DB, minerRepoPath, chainApiIn 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]) { + addrs := baseCfg.Addresses.Get() + for _, addr := range addrs { + ma := addr.MinerAddresses + if lo.Contains(ma, addrs[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 { + addrs := baseCfg.Addresses.Get() + addrs = append(addrs, addrs[0]) + baseCfg.Addresses.Set(lo.Filter(addrs, func(a config.CurioAddresses, _ int) bool { return len(a.MinerAddresses) > 0 - }) + })) if baseCfg.Apis.ChainApiInfo == nil { baseCfg.Apis.ChainApiInfo = append(baseCfg.Apis.ChainApiInfo, chainApiInfo) } @@ -223,7 +226,7 @@ func SaveConfigToLayerMigrateSectors(db *harmonydb.DB, minerRepoPath, chainApiIn } say(plain, "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.", minerAddress) } - 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]) + 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.Get()[0].MinerAddresses[0]) skipWritingToBase: } else { _, err = db.Exec(ctx, `INSERT INTO harmony_config (title, config) VALUES ('base', $1) @@ -236,7 +239,7 @@ func SaveConfigToLayerMigrateSectors(db *harmonydb.DB, minerRepoPath, chainApiIn } { // make a layer representing the migration - layerName := fmt.Sprintf("mig-%s", curioCfg.Addresses[0].MinerAddresses[0]) + layerName := fmt.Sprintf("mig-%s", curioCfg.Addresses.Get()[0].MinerAddresses[0]) _, 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) @@ -244,12 +247,12 @@ func SaveConfigToLayerMigrateSectors(db *harmonydb.DB, minerRepoPath, chainApiIn // Express as new toml to avoid adding StorageRPCSecret in more than 1 layer curioCfg.Apis.StorageRPCSecret = "" - ct := &bytes.Buffer{} - if err = toml.NewEncoder(ct).Encode(curioCfg); err != nil { + ctBytes, err := config.TransparentMarshal(curioCfg) + if err != nil { return minerAddress, err } - _, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ($1, $2)", layerName, ct.String()) + _, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ($1, $2)", layerName, string(ctBytes)) if err != nil { return minerAddress, xerrors.Errorf("Cannot insert layer after layer created message: %w", err) } @@ -287,22 +290,24 @@ func getDBSettings(smCfg config.StorageMiner) string { func ensureEmptyArrays(cfg *config.CurioConfig) { if cfg.Addresses == nil { - cfg.Addresses = []config.CurioAddresses{} + cfg.Addresses.Set([]config.CurioAddresses{}) } else { - for i := range cfg.Addresses { - if cfg.Addresses[i].PreCommitControl == nil { - cfg.Addresses[i].PreCommitControl = []string{} + addrs := cfg.Addresses.Get() + for i := range addrs { + if addrs[i].PreCommitControl == nil { + addrs[i].PreCommitControl = []string{} } - if cfg.Addresses[i].CommitControl == nil { - cfg.Addresses[i].CommitControl = []string{} + if addrs[i].CommitControl == nil { + addrs[i].CommitControl = []string{} } - if cfg.Addresses[i].DealPublishControl == nil { - cfg.Addresses[i].DealPublishControl = []string{} + if addrs[i].DealPublishControl == nil { + addrs[i].DealPublishControl = []string{} } - if cfg.Addresses[i].TerminateControl == nil { - cfg.Addresses[i].TerminateControl = []string{} + if addrs[i].TerminateControl == nil { + addrs[i].TerminateControl = []string{} } } + cfg.Addresses.Set(addrs) } 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 index e137e6503..9dcef1794 100644 --- a/cmd/curio/internal/translations/catalog.go +++ b/cmd/curio/internal/translations/catalog.go @@ -40,192 +40,254 @@ func init() { } var messageKeyToIndex = map[string]int{ - "(debug tool) Copy LM sector metadata into Curio DB": 128, - "(for init) limit storage space for sectors (expensive for very large paths!)": 145, - "(for init) path weight": 142, - "(for init) use path for long-term storage": 144, - "(for init) use path for sealing": 143, - "--machine flag in cli command should point to the node where storage to redeclare is attached": 155, - "1278 (3.5 years)": 127, - "2 KiB": 244, - "32 GiB": 242, - "64 GiB": 241, - "8 MiB": 243, + " Then export its private key with:": 348, + "(debug tool) Copy LM sector metadata into Curio DB": 128, + "(for init) limit storage space for sectors (expensive for very large paths!)": 145, + "(for init) path weight": 142, + "(for init) use path for long-term storage": 144, + "(for init) use path for sealing": 143, + "--machine flag in cli command should point to the node where storage to redeclare is attached": 155, + "1. Test your PDP service with: pdptool ping --service-url https://%s --service-name public": 358, + "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public": 359, + "1278 (3.5 years)": 127, + "2 KiB": 256, + "2. Register your FWSS node": 360, + "3. Explore FWSS & PDP tools at https://www.filecoin.services": 361, + "32 GiB (recommended for mainnet)": 254, + "4. Join the community: Filecoin Slack #fil-pdp": 362, + "64 GiB": 253, + "8 MiB": 255, "": 97, - "Aborting migration.": 195, - "Aborting remaining steps.": 192, + "Aborting migration.": 207, + "Aborting remaining steps.": 204, "Accept a proposed service actor": 71, "Add URL to fetch data for offline deals": 98, - "Additional info is at http://docs.curiostorage.org": 200, + "Add new storage path": 303, + "Additional info is at http://docs.curiostorage.org": 212, "Address to listen for the GUI on": 120, "Amount in FIL": 41, "Amount to deposit (FIL)": 60, "Amount to redeem (FIL)": 67, "Analyze and display the layout of batch sealer threads": 1, "Analyze and display the layout of batch sealer threads on your CPU.\n\nIt provides detailed information about CPU utilization for batch sealing operations, including core allocation, thread\ndistribution for different batch sizes.": 2, - "CSV file location to use for multiple deal input. Each line in the file should be in the format 'uuid,raw size,url,header1,header2...'": 99, + "Both (seal and store)": 313, + "CSV file location to use for multiple deal input. Each line in the file should be in the format 'uuid,raw size,url,header1,header2...'": 99, "Cancel a pending client withdrawal request": 46, "Cancel a pending service withdrawal request": 58, - "Cannot reach the DB: %s": 249, - "Cannot read the config.toml file in the provided directory, Error: %s": 223, - "Check data integrity in unsealed sector files": 178, + "Cannot reach the DB: %s": 261, + "Cannot read the config.toml file in the provided directory, Error: %s": 235, + "Check data integrity in unsealed sector files": 190, "Client actor": 49, "Client actor address": 62, "Client sender address": 43, "Collection of debugging utilities": 166, "Command separated list of hostnames for yugabyte cluster": 84, - "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.": 285, + "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.": 372, "Complete a pending client withdrawal after the withdrawal window elapses": 45, "Complete a pending service withdrawal after the withdrawal window elapses": 57, "Compute WindowPoSt for performance and configuration testing.": 161, "Compute WindowPoSt vanilla proofs and verify them.": 165, "Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.": 157, - "Configuration 'base' was created to resemble this lotus-miner's config.toml .": 286, - "Configuration 'base' was updated to include this miner's address": 261, - "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.": 284, - "Connected to Yugabyte": 217, - "Connected to Yugabyte. Schema is current.": 216, - "Continue to connect and update schema.": 276, - "Continue to verify the addresses and create a new miner actor.": 234, - "Cordon a machine, set it to maintenance mode": 36, - "Could not create repo from directory: %s. Aborting migration": 224, - "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration": 225, - "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number": 179, + "Configuration 'base' was created to resemble this lotus-miner's config.toml .": 373, + "Configuration 'base' was updated to include this miner's address": 273, + "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.": 371, + "Configuring HTTP settings for PDP...": 330, + "Connected to Yugabyte": 229, + "Connected to Yugabyte. Schema is current.": 228, + "Continue to connect and update schema.": 288, + "Continue to verify the addresses and create a new miner actor.": 246, + "Cordon a machine, set it to maintenance mode": 36, + "Could not create repo from directory: %s. Aborting migration": 236, + "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration": 237, + "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number": 191, "Create a client voucher": 66, - "Create a new miner": 190, + "Create a new miner": 202, "Create a new offline verified DDO deal for Curio": 105, "Create a provider voucher": 68, "Create new configuration for a new cluster": 34, - "Ctrl+C pressed in Terminal": 187, + "Creating PDP configuration layer...": 328, + "Ctrl+C pressed in Terminal": 199, "Cumulative amount (FIL)": 50, "Custom `HEADER` to include in the HTTP request": 100, - "Database config error occurred, abandoning migration: %s ": 277, - "Database: %s": 275, + "Database config error occurred, abandoning migration: %s ": 289, + "Database: %s": 287, + "Delete %s": 304, "Deposit FIL into the Router contract (client)": 39, "Deposit funds into the service pool (service role)": 59, - "Documentation: ": 210, - "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.": 186, + "Documentation: ": 222, + "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.": 198, "Enable load balancing for connecting to the Postgres database in Yugabyte cluster": 90, - "Enter %s address": 239, - "Enter the Yugabyte database %s": 280, - "Enter the Yugabyte database host(s)": 278, - "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)": 270, - "Enter the info to create a new miner": 229, - "Enter the owner address": 236, - "Enter the path to the configuration directory used by %s": 221, - "Error connecting to Yugabyte database: %s": 282, - "Error connecting to full node API: %s": 250, - "Error getting API: %s": 203, - "Error getting token: %s": 205, - "Error saving config to layer: %s. Aborting Migration": 209, - "Error writing file: %s": 196, + "Enter %s address": 251, + "Enter storage path to add": 306, + "Enter the Yugabyte database %s": 292, + "Enter the Yugabyte database host(s)": 290, + "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)": 282, + "Enter the info to create a new miner": 241, + "Enter the owner address": 248, + "Enter the path to the configuration directory used by %s": 233, + "Enter your delegated wallet private key (hex format):": 350, + "Enter your domain name (e.g., market.mydomain.com)": 331, + "Error connecting to Yugabyte database: %s": 294, + "Error connecting to full node API: %s": 262, + "Error expanding path: %s": 308, + "Error generating PDP config: %s": 334, + "Error getting API: %s": 215, + "Error getting home directory: %s": 301, + "Error getting token: %s": 217, + "Error loading existing PDP config: %s": 329, + "Error saving PDP config: %s": 335, + "Error saving config to layer: %s. Aborting Migration": 221, + "Error writing file: %s": 208, + "Error writing storage.json: %s": 314, + "Ethereum address (0x): %s": 368, "Execute cli commands": 6, - "Failed to create auth token: %s": 256, - "Failed to create the miner actor: %s": 247, - "Failed to generate default config: %s": 257, - "Failed to generate random bytes for secret: %s": 252, - "Failed to get API info for FullNode: %s": 255, - "Failed to insert 'base' config layer in database: %s": 265, - "Failed to insert config into database: %s": 258, - "Failed to load base config from database: %s": 262, - "Failed to parse base config: %s": 263, - "Failed to parse sector size: %s": 246, - "Failed to parse the address: %s": 238, - "Failed to regenerate base config: %s": 264, + "Failed to create auth token: %s": 268, + "Failed to create the miner actor: %s": 259, + "Failed to decode private key: %s": 364, + "Failed to generate default config: %s": 269, + "Failed to generate random bytes for secret: %s": 264, + "Failed to get API info for FullNode: %s": 267, + "Failed to import PDP key: %s": 366, + "Failed to insert 'base' config layer in database: %s": 277, + "Failed to insert config into database: %s": 270, + "Failed to load base config from database: %s": 274, + "Failed to parse base config: %s": 275, + "Failed to parse sector size: %s": 258, + "Failed to parse the address: %s": 250, + "Failed to regenerate base config: %s": 276, "Fetch proving parameters": 92, - "Filecoin %s channels: %s and %s": 213, + "Filecoin %s channels: %s and %s": 225, "Filecoin decentralized storage network provider": 81, - "Filter by storage provider ID": 174, + "Filter by storage provider ID": 186, "Filter events by actor address; lists all if not specified": 132, "Filter events by sector number; requires --actor to be specified": 133, - "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.": 198, + "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp": 324, + "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.": 210, "Generate a supra_seal configuration": 3, "Generate a supra_seal configuration for a given batch size.\n\nThis command outputs a configuration expected by SupraSeal. Main purpose of this command is for debugging and testing.\nThe config can be used directly with SupraSeal binaries to test it without involving Curio.": 4, "Get Curio node info": 74, "Get a config layer by name. You may want to pipe the output to a file, or use 'less'": 19, - "Get information about unsealed data": 172, - "Host: %s": 271, + "Get information about unsealed data": 184, + "Go Back": 302, + "Host: %s": 283, "How long to commit sectors for": 126, - "I want to:": 188, + "How would you like to proceed?": 342, + "I want to:": 200, "Ignore sectors that cannot be migrated": 130, - "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'": 214, - "Initializing a new miner actor.": 228, + "Import delegated wallet private key": 340, + "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'": 226, + "Initializing a new miner actor.": 240, "Initiate a withdrawal request from the client's deposit": 42, "Initiate a withdrawal request from the service pool": 56, "Interpret stacked config layers by this version of curio, with system-generated comments.": 23, - "Layer %s created. ": 287, - "Limit output to the last N events": 134, - "List config layers present in the DB.": 21, - "List data from the sectors_unseal_pipeline and sectors_meta tables": 173, - "List log systems": 76, - "List pipeline events": 131, - "Lotus-Miner to Curio Migration.": 193, - "Manage logging": 75, + "Invalid private key: %s": 365, + "Layer %s created. ": 374, + "Limit output to the last N events": 134, + "List config layers present in the DB.": 21, + "List data from the sectors_unseal_pipeline and sectors_meta tables": 185, + "List log systems": 76, + "List pipeline events": 131, + "Listen address for HTTP server": 333, + "Location of the service provider": 181, + "Lotus-Miner to Curio Migration.": 205, + "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.": 356, + "Manage logging": 75, "Manage node config by layers. The layer 'base' will always be applied at Curio start-up.": 13, - "Manage the sealing pipeline": 121, - "Manage unsealed data": 171, - "Math Utils": 0, - "Migrate from existing Lotus-Miner": 189, - "Migrating lotus-miner config.toml to Curio in-database configuration.": 202, - "Migrating metadata for %d sectors.": 283, - "Miner %s created successfully": 248, - "Miner creation error occurred: %s ": 235, + "Manage storage paths for this server.": 300, + "Manage the sealing pipeline": 121, + "Manage unsealed data": 183, + "Math Utils": 0, + "Maximum piece size": 176, + "Migrate from existing Lotus-Miner": 201, + "Migrating lotus-miner config.toml to Curio in-database configuration.": 214, + "Migrating metadata for %d sectors.": 370, + "Miner %s created successfully": 260, + "Miner creation error occurred: %s ": 247, + "Minimum piece size": 175, "Moves funds from the deal collateral wallet into escrow with the storage market actor": 102, "Name of the Postgres database in Yugabyte cluster": 85, - "New Miner initialization complete.": 201, + "New Miner initialization complete.": 213, "New service actor address": 70, - "No address provided": 237, - "No host provided": 279, - "No path provided, abandoning migration ": 222, - "No value provided": 281, - "No, abort": 208, - "Non-SP cluster configuration complete": 260, - "Non-SP cluster configuration created successfully": 259, - "Non-SP cluster setup complete!": 266, + "Next steps:": 357, + "No address provided": 249, + "No domain provided, skipping HTTP configuration": 332, + "No host provided": 291, + "No path provided": 307, + "No path provided, abandoning migration ": 234, + "No private key provided": 352, + "No value provided": 293, + "No, abort": 220, + "No, keep it": 319, + "Non-SP cluster configuration complete": 272, + "Non-SP cluster configuration created successfully": 271, + "Non-SP cluster setup complete!": 278, "Note: This command is intended to be used to verify PoSt compute performance.\nIt will not send any messages to the chain. Since it can compute any deadline, output may be incorrectly timed for the chain.": 162, "Number of sectors to start": 125, - "One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 215, - "Other": 220, - "Output file path (default: stdout)": 175, - "Owner Wallet: %s": 230, + "One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 227, + "Optional setup steps (you can skip these and configure later):": 295, + "Other": 232, + "Output file path (default: stdout)": 187, + "Owner Wallet: %s": 242, + "PDP": 298, + "PDP (Proof of Data Possession) Configuration": 322, + "PDP configuration layer created": 336, + "PDP layer already exists. What would you like to do?": 325, + "PDP setup complete!": 353, + "PDP wallet configured": 345, + "PDP wallet imported": 369, + "PDP wallet imported successfully!": 367, "Password for connecting to the Postgres database in Yugabyte cluster": 87, - "Password: %s": 274, - "Path to miner repo": 129, - "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster %s' to finish the configuration": 253, - "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration": 254, + "Password: %s": 286, + "Path already exists": 309, + "Path to miner repo": 129, + "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster %s' to finish the configuration": 265, + "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration": 266, "Port for connecting to the Cassandra database in Yugabyte cluster": 89, "Port for connecting to the Postgres database in Yugabyte cluster": 88, - "Port: %s": 272, - "Pre-initialization steps complete": 251, - "Print default node config": 14, - "Propose a new service actor": 69, - "Provider actor": 55, - "Provider actor address": 64, - "Provider sender address": 54, - "Provides a sample of CIDs from an indexed piece": 10, - "Query the service state": 65, - "Query the state of a client": 61, - "Query the state of a provider": 63, - "Read Miner Config": 226, - "Redeem a client voucher (service role)": 47, - "Redeem a provider voucher (provider role)": 53, - "Remove a named config layer.": 22, - "Remove unsealed copies of sector containing this deal": 107, - "SP ID to compute WindowPoSt for": 160, - "Sector Size: %s": 233, - "Sector selection failed: %s ": 245, + "Port: %s": 284, + "Pre-initialization steps complete": 263, + "Print default node config": 14, + "Private key": 351, + "Private key cannot be empty": 363, + "Propose a new service actor": 69, + "Provider actor": 55, + "Provider actor address": 64, + "Provider sender address": 54, + "Provides a sample of CIDs from an indexed piece": 10, + "Query the service state": 65, + "Query the state of a client": 61, + "Query the state of a provider": 63, + "Read Miner Config": 238, + "Really delete %s?": 317, + "Reconfigure PDP": 326, + "Redeem a client voucher (service role)": 47, + "Redeem a provider voucher (provider role)": 53, + "Register a PDP service provider with Filecoin Service Registry Contract": 171, + "Remove a named config layer.": 22, + "Remove unsealed copies of sector containing this deal": 107, + "SP ID to compute WindowPoSt for": 160, + "Seal (fast storage for sealing operations)": 311, + "Sector Size: %s": 245, + "Sector selection failed: %s ": 257, "Sectors can be stored across many filesystem paths. These\ncommands provide ways to manage the storage a Curio node will use to store sectors\nlong term for proving (references as 'store') as well as how sectors will be\nstored while moving through the sealing pipeline (references as 'seal').": 137, - "Select the Sector Size": 240, - "Select the location of your lotus-miner config directory?": 219, - "Sender Wallet: %s": 232, + "Select the Sector Size": 252, + "Select the location of your lotus-miner config directory?": 231, + "Sender Wallet: %s": 244, "Sender address": 40, + "Service provider description": 173, + "Service provider name": 172, "Service sender address": 48, "Set a config layer or the base by providing a filename or stdin.": 16, "Set log level": 77, "Set the log level for logging systems:\n\n The system flag can be specified multiple times.\n\n eg) log set-level --system chain --system chainxchg debug\n\n Available Levels:\n debug\n info\n warn\n error\n\n Environment Variables:\n GOLOG_LOG_LEVEL - Default log level for all log systems\n GOLOG_LOG_FMT - Change output log format (json, nocolor)\n GOLOG_FILE - Write logs to file\n GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr\n": 79, - "Set the target unseal state for a sector": 176, - "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.\n": 177, - "Setup non-Storage Provider cluster": 191, + "Set the target unseal state for a sector": 188, + "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.\n": 189, + "Setting up PDP wallet...": 337, + "Setup non-Storage Provider cluster": 203, + "Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset": 180, + "Skip PDP setup": 327, + "Skip optional steps": 296, + "Skip wallet setup for now": 341, "Specify actor address for the deal": 106, "Specify actor address to start sealing sectors for": 95, "Specify wallet address to send the funds from": 104, @@ -235,45 +297,67 @@ var messageKeyToIndex = map[string]int{ "Start new sealing operations manually": 122, "Start sealing new CC sectors": 124, "Start sealing sectors for all actors now (not on schedule)": 123, - "Step Complete: %s\n": 227, + "Step Complete: %s\n": 239, "Stop a running Curio process": 135, + "Storage": 297, + "Storage Configuration": 299, "Storage can be attached to a Curio node using this command. The storage volume\nlist is stored local to the Curio node in storage.json set in curio run. We do not\nrecommend manually modifying this value without further understanding of the\nstorage system.\n\nEach storage volume contains a configuration file which describes the\ncapabilities of the volume. When the '--init' flag is provided, this file will\nbe created using the additional flags.\n\nWeight\nA high weight value means data will be more likely to be stored in this path\n\nSeal\nData for the sealing process will be stored here\n\nStore\nFinalized sectors that will be moved here for long term storage and be proven\nover time\n ": 140, - "Supra consensus testing utilities": 167, + "Storage path %s added as %s. You'll need to initialize it with: curio cli storage attach --init --%s %s": 315, + "Storage path %s removed from configuration": 320, + "Storage path added": 316, + "Storage path deleted": 321, + "Storage paths for this server:": 305, + "Storage price per TiB per month in USDFC, Default is 1 USDFC.": 179, + "Storage type for %s": 310, + "Store (long-term storage for sealed sectors)": 312, + "Supports IPNI IPFS CID indexing": 178, + "Supports IPNI piece CID indexing": 177, + "Supra consensus testing utilities": 167, "Test the windowpost scheduler by running it on the next available curio. If tasks fail all retries, you will need to ctrl+c to exit.": 158, - "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.": 211, - "This interactive tool creates a new miner actor and creates the basic configuration layer for it.": 181, - "This interactive tool migrates lotus-miner to Curio in 5 minutes.": 185, - "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.": 183, - "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.": 182, - "This setup does not create or migrate a Filecoin SP actor.": 184, - "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):": 289, - "To start the cluster, run: curio run --layers basic-cluster": 269, - "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.": 218, - "To work with the config: ": 288, + "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.": 223, + "This interactive tool creates a new miner actor and creates the basic configuration layer for it.": 193, + "This interactive tool migrates lotus-miner to Curio in 5 minutes.": 197, + "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.": 195, + "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.": 194, + "This setup does not create or migrate a Filecoin SP actor.": 196, + "This will configure PDP settings for your Curio cluster.": 323, + "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):": 376, + "To start Curio with PDP enabled, run:": 354, + "To start the cluster, run: curio run --layers basic-cluster": 281, + "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.": 230, + "To work with the config: ": 375, + "Token contract for payment (IERC20(address(0)) for FIL)": 182, "Tool Box for Curio": 168, - "Try the web interface with %s ": 197, + "Try the web interface with %s ": 209, + "URL of the service provider": 174, "Uncordon a machine, resume scheduling": 37, - "Unmigratable sectors found. Do you want to continue?": 206, + "Unmigratable sectors found. Do you want to continue?": 218, "Update data for messages in wait queue": 170, "Updated DB with message data missing from chain node": 169, + "Use existing key, ending in %s": 339, "Use synthetic PoRep": 96, - "Use the arrow keys to navigate: ↓ ↑ → ← ": 180, + "Use the arrow keys to navigate: ↓ ↑ → ← ": 192, "Username for connecting to the Postgres database in Yugabyte cluster": 86, - "Username: %s": 273, + "Username: %s": 285, + "Using existing PDP wallet key: %s": 344, "Utility functions for testing": 156, "Validate a client voucher signature": 72, "Validate a provider voucher signature": 73, "Voucher nonce": 51, "Voucher signature (hex)": 52, "Wait for Curio api to come online": 8, - "Where should we save your database config file?": 194, + "Where should we save your database config file?": 206, "Withdrawal amount (in FIL)": 44, - "Worker Wallet: %s": 231, - "Yes, continue": 207, - "You can add other layers for per-machine configuration changes.": 212, - "You can now migrate your market node (%s), if applicable.": 199, - "You can now start using Curio for protocols like PDP, Snark markets, and others.": 268, - "Your non-SP cluster has been configured successfully.": 267, + "Worker Wallet: %s": 243, + "Yes, continue": 219, + "Yes, delete it": 318, + "You can add other layers for per-machine configuration changes.": 224, + "You can create a new delegated wallet using Lotus:": 346, + "You can now migrate your market node (%s), if applicable.": 211, + "You can now start using Curio for protocols like PDP, Snark markets, and others.": 280, + "You can set up the wallet later using the Curio GUI or CLI": 343, + "You need a delegated Filecoin wallet address to use with PDP.": 338, + "Your non-SP cluster has been configured successfully.": 279, "Zen3 and later supports two sectors per thread, set to false for older CPUs": 5, "[SP actor address...]": 35, "[deadline index]": 163, @@ -288,38 +372,41 @@ var messageKeyToIndex = map[string]int{ "allow overwrite of existing layer if source is a different layer": 30, "attach local storage path": 138, "comma or space separated list of layers to be interpreted (base is always applied)": 25, - "could not get API info for FullNode: %w": 204, - "custom node name": 117, - "deadline to compute WindowPoSt for ": 159, - "depends on output being a TTY": 83, - "detach local storage path": 148, - "do not interpret source layer": 32, - "don't check full-node sync status": 113, - "don't comment default values": 15, - "duration to wait till fail": 9, - "edit a config layer": 26, - "editor to use": 28, - "enables very verbose mode, useful for debugging the CLI": 91, - "find sector in the storage system": 151, - "generate ipni chunks from a file": 38, - "generate vanilla proof for a sector": 153, - "host address and port the gui will listen on": 112, - "host address and port the worker api will listen on": 111, - "indicates that deal index should not be announced to the IPNI": 108, - "initialize the path first": 141, - "layer name": 20, - "limit to log system": 80, - "list local storage paths": 149, - "list of layers to be interpreted (atop defaults). Default: base": 116, - "machine host:port (curio run --listen address)": 7, - "manage open file limit": 115, - "manage sector storage": 136, - "maximum fee in FIL user is willing to pay for this message": 103, - "only list local storage paths": 150, - "only run init, then return": 114, - "output in json format": 12, - "partition to compute WindowPoSt for": 164, - "path group names": 146, + "could not get API info for FullNode: %w": 216, + "curio run --layers=gui,pdp": 355, + "custom node name": 117, + "deadline to compute WindowPoSt for ": 159, + "depends on output being a TTY": 83, + "detach local storage path": 148, + "do not interpret source layer": 32, + "don't check full-node sync status": 113, + "don't comment default values": 15, + "duration to wait till fail": 9, + "edit a config layer": 26, + "editor to use": 28, + "enables very verbose mode, useful for debugging the CLI": 91, + "find sector in the storage system": 151, + "generate ipni chunks from a file": 38, + "generate vanilla proof for a sector": 153, + "host address and port the gui will listen on": 112, + "host address and port the worker api will listen on": 111, + "indicates that deal index should not be announced to the IPNI": 108, + "initialize the path first": 141, + "layer name": 20, + "limit to log system": 80, + "list local storage paths": 149, + "list of layers to be interpreted (atop defaults). Default: base": 116, + "lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32": 349, + "lotus wallet new delegated": 347, + "machine host:port (curio run --listen address)": 7, + "manage open file limit": 115, + "manage sector storage": 136, + "maximum fee in FIL user is willing to pay for this message": 103, + "only list local storage paths": 150, + "only run init, then return": 114, + "output in json format": 12, + "partition to compute WindowPoSt for": 164, + "path group names": 146, "path groups allowed to pull data from this path (allow all if not specified)": 147, "piece-cid": 11, "redeclare sectors in a local storage path": 154, @@ -332,7 +419,7 @@ var messageKeyToIndex = map[string]int{ "use color in display output": 82, } -var enIndex = []uint32{ // 291 elements +var enIndex = []uint32{ // 378 elements // Entry 0 - 1F 0x00000000, 0x0000000b, 0x00000042, 0x00000126, 0x0000014a, 0x0000025a, 0x000002a6, 0x000002bb, @@ -382,43 +469,67 @@ var enIndex = []uint32{ // 291 elements 0x00001ffa, 0x0000201a, 0x00002058, 0x00002124, 0x00002135, 0x00002159, 0x0000218c, 0x000021ae, 0x000021d0, 0x000021e3, 0x00002218, 0x0000223f, - 0x00002254, 0x00002278, 0x000022bb, 0x000022d9, - 0x000022fc, 0x00002325, 0x000026ab, 0x000026d9, - 0x00002781, 0x000027b6, 0x00002818, 0x000028db, - 0x0000294a, 0x00002985, 0x000029c7, 0x00002a20, - 0x00002a3b, 0x00002a46, 0x00002a68, 0x00002a7b, + 0x00002287, 0x0000229d, 0x000022ba, 0x000022d6, + 0x000022e9, 0x000022fc, 0x0000231d, 0x0000233d, + 0x0000237b, 0x000023e2, 0x00002403, 0x0000243b, + 0x00002450, 0x00002474, 0x000024b7, 0x000024d5, + 0x000024f8, 0x00002521, 0x000028a7, 0x000028d5, // Entry C0 - DF - 0x00002a9e, 0x00002ab8, 0x00002ad8, 0x00002b08, - 0x00002b1c, 0x00002b36, 0x00002b5c, 0x00002bd3, - 0x00002c10, 0x00002c43, 0x00002c66, 0x00002cac, - 0x00002cc5, 0x00002cf0, 0x00002d0b, 0x00002d40, - 0x00002d4e, 0x00002d58, 0x00002d90, 0x00002da4, - 0x00002e0f, 0x00002e4f, 0x00002e78, 0x00002eef, - 0x00002f40, 0x00002f6a, 0x00002f80, 0x00002fcd, - 0x00003007, 0x0000300d, 0x00003049, 0x00003075, + 0x0000297d, 0x000029b2, 0x00002a14, 0x00002ad7, + 0x00002b46, 0x00002b81, 0x00002bc3, 0x00002c1c, + 0x00002c37, 0x00002c42, 0x00002c64, 0x00002c77, + 0x00002c9a, 0x00002cb4, 0x00002cd4, 0x00002d04, + 0x00002d18, 0x00002d32, 0x00002d58, 0x00002dcf, + 0x00002e0c, 0x00002e3f, 0x00002e62, 0x00002ea8, + 0x00002ec1, 0x00002eec, 0x00002f07, 0x00002f3c, + 0x00002f4a, 0x00002f54, 0x00002f8c, 0x00002fa0, // Entry E0 - FF - 0x000030be, 0x000030fe, 0x0000314f, 0x00003161, - 0x0000317b, 0x0000319b, 0x000031c0, 0x000031d4, - 0x000031e9, 0x000031fe, 0x00003211, 0x00003250, - 0x0000327a, 0x00003292, 0x000032a6, 0x000032c9, - 0x000032dd, 0x000032f4, 0x000032fb, 0x00003302, - 0x00003308, 0x0000330e, 0x00003332, 0x00003355, - 0x0000337d, 0x0000339e, 0x000033b9, 0x000033e2, - 0x00003404, 0x00003436, 0x000034cd, 0x00003543, + 0x0000300b, 0x0000304b, 0x00003074, 0x000030eb, + 0x0000313c, 0x00003166, 0x0000317c, 0x000031c9, + 0x00003203, 0x00003209, 0x00003245, 0x00003271, + 0x000032ba, 0x000032fa, 0x0000334b, 0x0000335d, + 0x00003377, 0x00003397, 0x000033bc, 0x000033d0, + 0x000033e5, 0x000033fa, 0x0000340d, 0x0000344c, + 0x00003476, 0x0000348e, 0x000034a2, 0x000034c5, + 0x000034d9, 0x000034f0, 0x000034f7, 0x00003518, // Entry 100 - 11F - 0x0000356e, 0x00003591, 0x000035ba, 0x000035e7, - 0x00003619, 0x0000363f, 0x00003680, 0x000036b0, - 0x000036d3, 0x000036fb, 0x00003733, 0x00003752, - 0x00003788, 0x000037d9, 0x00003815, 0x00003877, - 0x00003883, 0x0000388f, 0x0000389f, 0x000038af, - 0x000038bf, 0x000038e6, 0x00003927, 0x0000394b, - 0x0000395c, 0x0000397e, 0x00003990, 0x000039bd, - 0x000039e3, 0x00003a42, 0x00003adf, 0x00003b2d, + 0x0000351e, 0x00003524, 0x00003548, 0x0000356b, + 0x00003593, 0x000035b4, 0x000035cf, 0x000035f8, + 0x0000361a, 0x0000364c, 0x000036e3, 0x00003759, + 0x00003784, 0x000037a7, 0x000037d0, 0x000037fd, + 0x0000382f, 0x00003855, 0x00003896, 0x000038c6, + 0x000038e9, 0x00003911, 0x00003949, 0x00003968, + 0x0000399e, 0x000039ef, 0x00003a2b, 0x00003a8d, + 0x00003a99, 0x00003aa5, 0x00003ab5, 0x00003ac5, // Entry 120 - 13F - 0x00003b47, 0x00003b65, 0x00003bc5, -} // Size: 1188 bytes + 0x00003ad5, 0x00003afc, 0x00003b3d, 0x00003b61, + 0x00003b72, 0x00003b94, 0x00003ba6, 0x00003bd3, + 0x00003c12, 0x00003c26, 0x00003c2e, 0x00003c32, + 0x00003c48, 0x00003c6e, 0x00003c92, 0x00003c9a, + 0x00003caf, 0x00003cbc, 0x00003cdb, 0x00003cf5, + 0x00003d06, 0x00003d22, 0x00003d36, 0x00003d4d, + 0x00003d78, 0x00003da5, 0x00003dbb, 0x00003ddd, + 0x00003e51, 0x00003e64, 0x00003e79, 0x00003e88, + // Entry 140 - 15F + 0x00003e94, 0x00003ec2, 0x00003ed7, 0x00003f04, + 0x00003f3d, 0x00003f9d, 0x00003fd2, 0x00003fe2, + 0x00003ff1, 0x00004015, 0x0000403e, 0x00004063, + 0x00004096, 0x000040c6, 0x000040e5, 0x00004108, + 0x00004127, 0x00004147, 0x00004160, 0x0000419e, + 0x000041c0, 0x000041e4, 0x000041fe, 0x0000421d, + 0x00004258, 0x0000427d, 0x00004293, 0x000042c6, + 0x000042e1, 0x0000430a, 0x00004365, 0x0000439b, + // Entry 160 - 17F + 0x000043a7, 0x000043bf, 0x000043d3, 0x000043f9, + 0x00004414, 0x0000445d, 0x00004469, 0x000044c7, + 0x0000452f, 0x0000454a, 0x00004587, 0x000045b6, + 0x000045d2, 0x000045f6, 0x00004611, 0x00004631, + 0x00004653, 0x00004670, 0x00004684, 0x000046aa, + 0x00004709, 0x000047a6, 0x000047f4, 0x0000480e, + 0x0000482c, 0x0000488c, +} // Size: 1536 bytes -const enData string = "" + // Size: 15301 bytes +const enData string = "" + // Size: 18572 bytes "\x02Math Utils\x02Analyze and display the layout of batch sealer threads" + "\x02Analyze and display the layout of batch sealer threads on your CPU." + "\x0a\x0aIt provides detailed information about CPU utilization for batch" + @@ -550,107 +661,157 @@ const enData string = "" + // Size: 15301 bytes "compute WindowPoSt for\x02Compute WindowPoSt vanilla proofs and verify t" + "hem.\x02Collection of debugging utilities\x02Supra consensus testing uti" + "lities\x02Tool Box for Curio\x02Updated DB with message data missing fro" + - "m chain node\x02Update data for messages in wait queue\x02Manage unseale" + - "d data\x02Get information about unsealed data\x02List data from the sect" + - "ors_unseal_pipeline and sectors_meta tables\x02Filter by storage provide" + - "r ID\x02Output file path (default: stdout)\x02Set the target unseal stat" + - "e for a sector\x04\x00\x01\x0a\x80\x07\x02Set the target unseal state fo" + - "r a specific sector.\x0a : The storage provider ID\x0a : The sector number\x0a : The target state (" + - "true, false, or none)\x0a\x0a The unseal target state indicates to cur" + - "io how an unsealed copy of the sector should be maintained.\x0a\x09 If" + - " the target state is true, curio will ensure that the sector is unsealed" + - ".\x0a\x09 If the target state is false, curio will ensure that there i" + - "s no unsealed copy of the sector.\x0a\x09 If the target state is none," + - " curio will not change the current state of the sector.\x0a\x0a Curren" + - "tly when the curio will only start new unseal processes when the target " + - "state changes from another state to true.\x0a\x0a When the target stat" + - "e is false, and an unsealed sector file exists, the GC mark step will cr" + - "eate a removal mark\x0a for the unsealed sector file. The file will on" + - "ly be removed after the removal mark is accepted.\x02Check data integrit" + - "y in unsealed sector files\x02Create a check task for a specific sector," + - " wait for its completion, and output the result.\x0a : The s" + - "torage provider ID\x0a : The sector number\x04\x00\x01 " + - "0\x02Use the arrow keys to navigate: ↓ ↑ → ←\x02This interactive tool cr" + - "eates a new miner actor and creates the basic configuration layer for it" + - ".\x02This process is partially idempotent. Once a new miner actor has be" + - "en created and subsequent steps fail, the user need to run 'curio config" + - " new-cluster < miner ID >' to finish the configuration.\x02This interact" + - "ive tool sets up a non-Storage Provider cluster for protocols like PDP, " + - "Snark market, and others.\x02This setup does not create or migrate a Fil" + - "ecoin SP actor.\x02This interactive tool migrates lotus-miner to Curio i" + - "n 5 minutes.\x02Each step needs your confirmation and can be reversed. P" + - "ress Ctrl+C to exit at any time.\x02Ctrl+C pressed in Terminal\x02I want" + - " to:\x02Migrate from existing Lotus-Miner\x02Create a new miner\x02Setup" + - " non-Storage Provider cluster\x02Aborting remaining steps.\x02Lotus-Mine" + - "r to Curio Migration.\x02Where should we save your database config file?" + - "\x02Aborting migration.\x02Error writing file: %[1]s\x04\x00\x01 !\x02Tr" + - "y the web interface with %[1]s\x02For more servers, make /etc/curio.env " + - "with the curio.env database env and add the CURIO_LAYERS env to assign p" + - "urposes.\x02You can now migrate your market node (%[1]s), if applicable." + - "\x02Additional info is at http://docs.curiostorage.org\x02New Miner init" + - "ialization complete.\x02Migrating lotus-miner config.toml to Curio in-da" + - "tabase configuration.\x02Error getting API: %[1]s\x02could not get API i" + - "nfo for FullNode: %[1]w\x02Error getting token: %[1]s\x02Unmigratable se" + - "ctors found. Do you want to continue?\x02Yes, continue\x02No, abort\x02E" + - "rror saving config to layer: %[1]s. Aborting Migration\x04\x00\x01 \x0f" + - "\x02Documentation:\x02The '%[1]s' layer stores common configuration. All" + - " curio instances can include it in their %[2]s argument.\x02You can add " + - "other layers for per-machine configuration changes.\x02Filecoin %[1]s ch" + - "annels: %[2]s and %[3]s\x02Increase reliability using redundancy: start " + - "multiple machines with at-least the post layer: 'curio run --layers=post" + - "'\x02One database can serve multiple miner IDs: Run a migration for each" + - " lotus-miner.\x02Connected to Yugabyte. Schema is current.\x02Connected " + - "to Yugabyte\x02To start, ensure your sealing pipeline is drained and shu" + - "t-down lotus-miner.\x02Select the location of your lotus-miner config di" + - "rectory?\x02Other\x02Enter the path to the configuration directory used " + - "by %[1]s\x04\x00\x01 '\x02No path provided, abandoning migration\x02Cann" + - "ot read the config.toml file in the provided directory, Error: %[1]s\x02" + - "Could not create repo from directory: %[1]s. Aborting migration\x02Could" + - " not lock miner repo. Your miner must be stopped: %[1]s\x0a Aborting mig" + - "ration\x02Read Miner Config\x04\x00\x01\x0a\x15\x02Step Complete: %[1]s" + - "\x02Initializing a new miner actor.\x02Enter the info to create a new mi" + - "ner\x02Owner Wallet: %[1]s\x02Worker Wallet: %[1]s\x02Sender Wallet: %[1" + - "]s\x02Sector Size: %[1]s\x02Continue to verify the addresses and create " + - "a new miner actor.\x04\x00\x01 %\x02Miner creation error occurred: %[1]s" + - "\x02Enter the owner address\x02No address provided\x02Failed to parse th" + - "e address: %[1]s\x02Enter %[1]s address\x02Select the Sector Size\x0264 " + - "GiB\x0232 GiB\x028 MiB\x022 KiB\x04\x00\x01 \x1f\x02Sector selection fai" + - "led: %[1]s\x02Failed to parse sector size: %[1]s\x02Failed to create the" + - " miner actor: %[1]s\x02Miner %[1]s created successfully\x02Cannot reach " + - "the DB: %[1]s\x02Error connecting to full node API: %[1]s\x02Pre-initial" + - "ization steps complete\x02Failed to generate random bytes for secret: %[" + - "1]s\x02Please do not run guided-setup again as miner creation is not ide" + - "mpotent. You need to run 'curio config new-cluster %[1]s' to finish the " + - "configuration\x02Please do not run guided-setup again. You need to run '" + - "curio config new-cluster' manually to finish the configuration\x02Failed" + - " to get API info for FullNode: %[1]s\x02Failed to create auth token: %[1" + - "]s\x02Failed to generate default config: %[1]s\x02Failed to insert confi" + - "g into database: %[1]s\x02Non-SP cluster configuration created successfu" + - "lly\x02Non-SP cluster configuration complete\x02Configuration 'base' was" + - " updated to include this miner's address\x02Failed to load base config f" + - "rom database: %[1]s\x02Failed to parse base config: %[1]s\x02Failed to r" + - "egenerate base config: %[1]s\x02Failed to insert 'base' config layer in " + - "database: %[1]s\x02Non-SP cluster setup complete!\x02Your non-SP cluster" + - " has been configured successfully.\x02You can now start using Curio for " + - "protocols like PDP, Snark markets, and others.\x02To start the cluster, " + - "run: curio run --layers basic-cluster\x02Enter the info to connect to yo" + - "ur Yugabyte database installation (https://download.yugabyte.com/)\x02Ho" + - "st: %[1]s\x02Port: %[1]s\x02Username: %[1]s\x02Password: %[1]s\x02Databa" + - "se: %[1]s\x02Continue to connect and update schema.\x04\x00\x01 <\x02Dat" + - "abase config error occurred, abandoning migration: %[1]s\x02Enter the Yu" + - "gabyte database host(s)\x02No host provided\x02Enter the Yugabyte databa" + - "se %[1]s\x02No value provided\x02Error connecting to Yugabyte database: " + - "%[1]s\x02Migrating metadata for %[1]d sectors.\x02Configuration 'base' w" + - "as updated to include this miner's address (%[1]s) and its wallet setup." + - "\x02Compare the configurations %[1]s to %[2]s. Changes between the miner" + - " IDs other than wallet addreses should be a new, minimal layer for runne" + - "rs that need it.\x02Configuration 'base' was created to resemble this lo" + - "tus-miner's config.toml .\x04\x00\x01 \x15\x02Layer %[1]s created.\x04" + - "\x00\x01 \x19\x02To work with the config:\x02To run Curio: With machine " + - "or cgroup isolation, use the command (with example layer selection):" + "m chain node\x02Update data for messages in wait queue\x02Register a PDP" + + " service provider with Filecoin Service Registry Contract\x02Service pro" + + "vider name\x02Service provider description\x02URL of the service provide" + + "r\x02Minimum piece size\x02Maximum piece size\x02Supports IPNI piece CID" + + " indexing\x02Supports IPNI IPFS CID indexing\x02Storage price per TiB pe" + + "r month in USDFC, Default is 1 USDFC.\x02Shortest frequency interval in " + + "epochs at which the SP is willing to prove access to the stored dataset" + + "\x02Location of the service provider\x02Token contract for payment (IERC" + + "20(address(0)) for FIL)\x02Manage unsealed data\x02Get information about" + + " unsealed data\x02List data from the sectors_unseal_pipeline and sectors" + + "_meta tables\x02Filter by storage provider ID\x02Output file path (defau" + + "lt: stdout)\x02Set the target unseal state for a sector\x04\x00\x01\x0a" + + "\x80\x07\x02Set the target unseal state for a specific sector.\x0a : The storage provider ID\x0a : The sector numbe" + + "r\x0a : The target state (true, false, or none)\x0a\x0a " + + " The unseal target state indicates to curio how an unsealed copy of the" + + " sector should be maintained.\x0a\x09 If the target state is true, cur" + + "io will ensure that the sector is unsealed.\x0a\x09 If the target stat" + + "e is false, curio will ensure that there is no unsealed copy of the sect" + + "or.\x0a\x09 If the target state is none, curio will not change the cur" + + "rent state of the sector.\x0a\x0a Currently when the curio will only s" + + "tart new unseal processes when the target state changes from another sta" + + "te to true.\x0a\x0a When the target state is false, and an unsealed se" + + "ctor file exists, the GC mark step will create a removal mark\x0a for " + + "the unsealed sector file. The file will only be removed after the remova" + + "l mark is accepted.\x02Check data integrity in unsealed sector files\x02" + + "Create a check task for a specific sector, wait for its completion, and " + + "output the result.\x0a : The storage provider ID\x0a : The sector number\x04\x00\x01 0\x02Use the arrow keys to nav" + + "igate: ↓ ↑ → ←\x02This interactive tool creates a new miner actor and cr" + + "eates the basic configuration layer for it.\x02This process is partially" + + " idempotent. Once a new miner actor has been created and subsequent step" + + "s fail, the user need to run 'curio config new-cluster < miner ID >' to " + + "finish the configuration.\x02This interactive tool sets up a non-Storage" + + " Provider cluster for protocols like PDP, Snark market, and others.\x02T" + + "his setup does not create or migrate a Filecoin SP actor.\x02This intera" + + "ctive tool migrates lotus-miner to Curio in 5 minutes.\x02Each step need" + + "s your confirmation and can be reversed. Press Ctrl+C to exit at any tim" + + "e.\x02Ctrl+C pressed in Terminal\x02I want to:\x02Migrate from existing " + + "Lotus-Miner\x02Create a new miner\x02Setup non-Storage Provider cluster" + + "\x02Aborting remaining steps.\x02Lotus-Miner to Curio Migration.\x02Wher" + + "e should we save your database config file?\x02Aborting migration.\x02Er" + + "ror writing file: %[1]s\x04\x00\x01 !\x02Try the web interface with %[1]" + + "s\x02For more servers, make /etc/curio.env with the curio.env database e" + + "nv and add the CURIO_LAYERS env to assign purposes.\x02You can now migra" + + "te your market node (%[1]s), if applicable.\x02Additional info is at htt" + + "p://docs.curiostorage.org\x02New Miner initialization complete.\x02Migra" + + "ting lotus-miner config.toml to Curio in-database configuration.\x02Erro" + + "r getting API: %[1]s\x02could not get API info for FullNode: %[1]w\x02Er" + + "ror getting token: %[1]s\x02Unmigratable sectors found. Do you want to c" + + "ontinue?\x02Yes, continue\x02No, abort\x02Error saving config to layer: " + + "%[1]s. Aborting Migration\x04\x00\x01 \x0f\x02Documentation:\x02The '%[1" + + "]s' layer stores common configuration. All curio instances can include i" + + "t in their %[2]s argument.\x02You can add other layers for per-machine c" + + "onfiguration changes.\x02Filecoin %[1]s channels: %[2]s and %[3]s\x02Inc" + + "rease reliability using redundancy: start multiple machines with at-leas" + + "t the post layer: 'curio run --layers=post'\x02One database can serve mu" + + "ltiple miner IDs: Run a migration for each lotus-miner.\x02Connected to " + + "Yugabyte. Schema is current.\x02Connected to Yugabyte\x02To start, ensur" + + "e your sealing pipeline is drained and shut-down lotus-miner.\x02Select " + + "the location of your lotus-miner config directory?\x02Other\x02Enter the" + + " path to the configuration directory used by %[1]s\x04\x00\x01 '\x02No p" + + "ath provided, abandoning migration\x02Cannot read the config.toml file i" + + "n the provided directory, Error: %[1]s\x02Could not create repo from dir" + + "ectory: %[1]s. Aborting migration\x02Could not lock miner repo. Your min" + + "er must be stopped: %[1]s\x0a Aborting migration\x02Read Miner Config" + + "\x04\x00\x01\x0a\x15\x02Step Complete: %[1]s\x02Initializing a new miner" + + " actor.\x02Enter the info to create a new miner\x02Owner Wallet: %[1]s" + + "\x02Worker Wallet: %[1]s\x02Sender Wallet: %[1]s\x02Sector Size: %[1]s" + + "\x02Continue to verify the addresses and create a new miner actor.\x04" + + "\x00\x01 %\x02Miner creation error occurred: %[1]s\x02Enter the owner ad" + + "dress\x02No address provided\x02Failed to parse the address: %[1]s\x02En" + + "ter %[1]s address\x02Select the Sector Size\x0264 GiB\x0232 GiB (recomme" + + "nded for mainnet)\x028 MiB\x022 KiB\x04\x00\x01 \x1f\x02Sector selection" + + " failed: %[1]s\x02Failed to parse sector size: %[1]s\x02Failed to create" + + " the miner actor: %[1]s\x02Miner %[1]s created successfully\x02Cannot re" + + "ach the DB: %[1]s\x02Error connecting to full node API: %[1]s\x02Pre-ini" + + "tialization steps complete\x02Failed to generate random bytes for secret" + + ": %[1]s\x02Please do not run guided-setup again as miner creation is not" + + " idempotent. You need to run 'curio config new-cluster %[1]s' to finish " + + "the configuration\x02Please do not run guided-setup again. You need to r" + + "un 'curio config new-cluster' manually to finish the configuration\x02Fa" + + "iled to get API info for FullNode: %[1]s\x02Failed to create auth token:" + + " %[1]s\x02Failed to generate default config: %[1]s\x02Failed to insert c" + + "onfig into database: %[1]s\x02Non-SP cluster configuration created succe" + + "ssfully\x02Non-SP cluster configuration complete\x02Configuration 'base'" + + " was updated to include this miner's address\x02Failed to load base conf" + + "ig from database: %[1]s\x02Failed to parse base config: %[1]s\x02Failed " + + "to regenerate base config: %[1]s\x02Failed to insert 'base' config layer" + + " in database: %[1]s\x02Non-SP cluster setup complete!\x02Your non-SP clu" + + "ster has been configured successfully.\x02You can now start using Curio " + + "for protocols like PDP, Snark markets, and others.\x02To start the clust" + + "er, run: curio run --layers basic-cluster\x02Enter the info to connect t" + + "o your Yugabyte database installation (https://download.yugabyte.com/)" + + "\x02Host: %[1]s\x02Port: %[1]s\x02Username: %[1]s\x02Password: %[1]s\x02" + + "Database: %[1]s\x02Continue to connect and update schema.\x04\x00\x01 <" + + "\x02Database config error occurred, abandoning migration: %[1]s\x02Enter" + + " the Yugabyte database host(s)\x02No host provided\x02Enter the Yugabyte" + + " database %[1]s\x02No value provided\x02Error connecting to Yugabyte dat" + + "abase: %[1]s\x02Optional setup steps (you can skip these and configure l" + + "ater):\x02Skip optional steps\x02Storage\x02PDP\x02Storage Configuration" + + "\x02Manage storage paths for this server.\x02Error getting home director" + + "y: %[1]s\x02Go Back\x02Add new storage path\x02Delete %[1]s\x02Storage p" + + "aths for this server:\x02Enter storage path to add\x02No path provided" + + "\x02Error expanding path: %[1]s\x02Path already exists\x02Storage type f" + + "or %[1]s\x02Seal (fast storage for sealing operations)\x02Store (long-te" + + "rm storage for sealed sectors)\x02Both (seal and store)\x02Error writing" + + " storage.json: %[1]s\x02Storage path %[1]s added as %[2]s. You'll need t" + + "o initialize it with: curio cli storage attach --init --%[3]s %[4]s\x02S" + + "torage path added\x02Really delete %[1]s?\x02Yes, delete it\x02No, keep " + + "it\x02Storage path %[1]s removed from configuration\x02Storage path dele" + + "ted\x02PDP (Proof of Data Possession) Configuration\x02This will configu" + + "re PDP settings for your Curio cluster.\x02For detailed documentation, s" + + "ee: https://docs.curiostorage.org/experimental-features/enable-pdp\x02PD" + + "P layer already exists. What would you like to do?\x02Reconfigure PDP" + + "\x02Skip PDP setup\x02Creating PDP configuration layer...\x02Error loadi" + + "ng existing PDP config: %[1]s\x02Configuring HTTP settings for PDP..." + + "\x02Enter your domain name (e.g., market.mydomain.com)\x02No domain prov" + + "ided, skipping HTTP configuration\x02Listen address for HTTP server\x02E" + + "rror generating PDP config: %[1]s\x02Error saving PDP config: %[1]s\x02P" + + "DP configuration layer created\x02Setting up PDP wallet...\x02You need a" + + " delegated Filecoin wallet address to use with PDP.\x02Use existing key," + + " ending in %[1]s\x02Import delegated wallet private key\x02Skip wallet s" + + "etup for now\x02How would you like to proceed?\x02You can set up the wal" + + "let later using the Curio GUI or CLI\x02Using existing PDP wallet key: %" + + "[1]s\x02PDP wallet configured\x02You can create a new delegated wallet u" + + "sing Lotus:\x02lotus wallet new delegated\x04\x03 \x00\x22\x02Then exp" + + "ort its private key with:\x02lotus wallet export
    | xxd -r -p |" + + " jq -r '.PrivateKey' | base64 -d | xxd -p -c 32\x02Enter your delegated " + + "wallet private key (hex format):\x02Private key\x02No private key provid" + + "ed\x02PDP setup complete!\x02To start Curio with PDP enabled, run:\x02cu" + + "rio run --layers=gui,pdp\x02Make sure to send FIL/tFIL to your 0x wallet" + + " address for PDP operations.\x02Next steps:\x021. Test your PDP service " + + "with: pdptool ping --service-url https://%[1]s --service-name public\x02" + + "1. Test your PDP service with: pdptool ping --service-url https://your-d" + + "omain.com --service-name public\x022. Register your FWSS node\x023. Expl" + + "ore FWSS & PDP tools at https://www.filecoin.services\x024. Join the com" + + "munity: Filecoin Slack #fil-pdp\x02Private key cannot be empty\x02Failed" + + " to decode private key: %[1]s\x02Invalid private key: %[1]s\x02Failed to" + + " import PDP key: %[1]s\x02PDP wallet imported successfully!\x02Ethereum " + + "address (0x): %[1]s\x02PDP wallet imported\x02Migrating metadata for %[1" + + "]d sectors.\x02Configuration 'base' was updated to include this miner's " + + "address (%[1]s) and its wallet setup.\x02Compare the configurations %[1]" + + "s to %[2]s. Changes between the miner IDs other than wallet addreses sho" + + "uld be a new, minimal layer for runners that need it.\x02Configuration '" + + "base' was created to resemble this lotus-miner's config.toml .\x04\x00" + + "\x01 \x15\x02Layer %[1]s created.\x04\x00\x01 \x19\x02To work with the c" + + "onfig:\x02To run Curio: With machine or cgroup isolation, use the comman" + + "d (with example layer selection):" -var koIndex = []uint32{ // 291 elements +var koIndex = []uint32{ // 378 elements // Entry 0 - 1F 0x00000000, 0x00000014, 0x0000004e, 0x00000168, 0x00000181, 0x000002b1, 0x00000328, 0x0000033a, @@ -698,45 +859,69 @@ var koIndex = []uint32{ // 291 elements 0x00002455, 0x00002476, 0x000024ec, 0x00002596, // Entry A0 - BF 0x000025ba, 0x000025dc, 0x00002615, 0x00002707, - 0x0000271a, 0x0000273c, 0x0000273c, 0x0000275a, - 0x0000275a, 0x0000276e, 0x000027d6, 0x00002812, - 0x00002830, 0x00002862, 0x000028a9, 0x000028d0, - 0x00002900, 0x00002929, 0x00002d09, 0x00002d3f, - 0x00002df3, 0x00002e37, 0x00002eb4, 0x00002fb4, - 0x0000302b, 0x00003086, 0x000030d3, 0x0000314e, - 0x0000316f, 0x00003181, 0x000031aa, 0x000031c5, + 0x0000271a, 0x0000273c, 0x00002776, 0x00002794, + 0x000027bc, 0x000027d0, 0x00002838, 0x00002874, + 0x000028b7, 0x000028d2, 0x000028ed, 0x00002905, + 0x0000291a, 0x0000292f, 0x00002950, 0x0000296f, + 0x000029bd, 0x00002a37, 0x00002a52, 0x00002a94, + 0x00002ab2, 0x00002ae4, 0x00002b2b, 0x00002b52, + 0x00002b82, 0x00002bab, 0x00002f8b, 0x00002fc1, // Entry C0 - DF - 0x000031e0, 0x00003205, 0x00003228, 0x0000326e, - 0x00003289, 0x000032a5, 0x000032e4, 0x0000339a, - 0x000033ea, 0x0000342a, 0x00003450, 0x000034a9, - 0x000034c8, 0x00003504, 0x00003534, 0x00003584, - 0x00003590, 0x000035a2, 0x000035fa, 0x00003607, - 0x0000368d, 0x000036df, 0x00003706, 0x000037a2, - 0x00003834, 0x00003875, 0x0000388b, 0x000038f6, - 0x00003945, 0x0000394c, 0x00003994, 0x000039e6, + 0x00003075, 0x000030b9, 0x00003136, 0x00003236, + 0x000032ad, 0x00003308, 0x00003355, 0x000033d0, + 0x000033f1, 0x00003403, 0x0000342c, 0x00003447, + 0x00003462, 0x00003487, 0x000034aa, 0x000034f0, + 0x0000350b, 0x00003527, 0x00003566, 0x0000361c, + 0x0000366c, 0x000036ac, 0x000036d2, 0x0000372b, + 0x0000374a, 0x00003786, 0x000037b6, 0x00003806, + 0x00003812, 0x00003824, 0x0000387c, 0x00003889, // Entry E0 - FF - 0x00003a40, 0x00003aaa, 0x00003b3b, 0x00003b53, - 0x00003b6d, 0x00003b91, 0x00003bc4, 0x00003bdc, - 0x00003bf4, 0x00003c0c, 0x00003c21, 0x00003c78, - 0x00003ca3, 0x00003cbb, 0x00003ce2, 0x00003d05, - 0x00003d19, 0x00003d2e, 0x00003d35, 0x00003d3c, - 0x00003d42, 0x00003d48, 0x00003d69, 0x00003d93, - 0x00003db9, 0x00003df2, 0x00003e2a, 0x00003e62, - 0x00003e81, 0x00003ecd, 0x00003f8b, 0x0000401e, + 0x0000390f, 0x00003961, 0x00003988, 0x00003a24, + 0x00003ab6, 0x00003af7, 0x00003b0d, 0x00003b78, + 0x00003bc7, 0x00003bce, 0x00003c16, 0x00003c68, + 0x00003cc2, 0x00003d2c, 0x00003dbd, 0x00003dd5, + 0x00003def, 0x00003e13, 0x00003e46, 0x00003e5e, + 0x00003e76, 0x00003e8e, 0x00003ea3, 0x00003efa, + 0x00003f25, 0x00003f3d, 0x00003f64, 0x00003f87, + 0x00003f9b, 0x00003fb0, 0x00003fb7, 0x00003fd1, // Entry 100 - 11F - 0x0000405c, 0x00004091, 0x000040b4, 0x000040ff, - 0x00004143, 0x00004165, 0x000041b5, 0x0000420a, - 0x0000424d, 0x0000428c, 0x000042e8, 0x0000430b, - 0x00004349, 0x000043a8, 0x000043fa, 0x00004468, - 0x00004479, 0x00004487, 0x0000449f, 0x000044b3, - 0x000044cd, 0x000044f7, 0x0000455a, 0x00004596, - 0x000045c0, 0x000045f8, 0x0000461c, 0x00004670, - 0x000046a8, 0x00004721, 0x000047db, 0x00004832, + 0x00003fd7, 0x00003fdd, 0x00003ffe, 0x00004028, + 0x0000404e, 0x00004087, 0x000040bf, 0x000040f7, + 0x00004116, 0x00004162, 0x00004220, 0x000042b3, + 0x000042f1, 0x00004326, 0x00004349, 0x00004394, + 0x000043d8, 0x000043fa, 0x0000444a, 0x0000449f, + 0x000044e2, 0x00004521, 0x0000457d, 0x000045a0, + 0x000045de, 0x0000463d, 0x0000468f, 0x000046fd, + 0x0000470e, 0x0000471c, 0x00004734, 0x00004748, // Entry 120 - 13F - 0x00004861, 0x00004888, 0x00004914, -} // Size: 1188 bytes + 0x00004762, 0x0000478c, 0x000047ef, 0x0000482b, + 0x00004855, 0x0000488d, 0x000048b1, 0x00004905, + 0x00004952, 0x00004973, 0x00004980, 0x00004984, + 0x00004998, 0x000049ce, 0x00004a08, 0x00004a16, + 0x00004a35, 0x00004a42, 0x00004a65, 0x00004a8a, + 0x00004ab1, 0x00004ae1, 0x00004b02, 0x00004b1f, + 0x00004b52, 0x00004b8c, 0x00004ba8, 0x00004bd8, + 0x00004c77, 0x00004ca4, 0x00004cd3, 0x00004ce8, + // Entry 140 - 15F + 0x00004d03, 0x00004d48, 0x00004d75, 0x00004d9a, + 0x00004dcf, 0x00004e3d, 0x00004e84, 0x00004e92, + 0x00004eaa, 0x00004ed0, 0x00004f02, 0x00004f2a, + 0x00004f69, 0x00004fa9, 0x00004fc6, 0x00004ff1, + 0x0000501c, 0x0000504a, 0x00005066, 0x000050b2, + 0x000050d6, 0x000050ff, 0x00005127, 0x0000514b, + 0x0000519f, 0x000051c7, 0x000051eb, 0x00005232, + 0x0000524d, 0x00005295, 0x000052f0, 0x00005332, + // Entry 160 - 17F + 0x0000533d, 0x00005368, 0x0000538d, 0x000053d8, + 0x000053f3, 0x0000543d, 0x0000544c, 0x000054c7, + 0x0000554c, 0x00005562, 0x000055a5, 0x000055e1, + 0x0000560b, 0x0000562e, 0x0000564a, 0x0000566d, + 0x000056a2, 0x000056c2, 0x000056e6, 0x0000571e, + 0x00005797, 0x00005851, 0x000058a8, 0x000058d7, + 0x000058fe, 0x0000598a, +} // Size: 1536 bytes -const koData string = "" + // Size: 18708 bytes +const koData string = "" + // Size: 22922 bytes "\x02수학 유틸리티\x02배치 실러 스레드의 레이아웃 분석 및 표시\x02CPU에서 배치 실러 스레드의 레이아웃을 분석하고 표시" + "합니다.\x0a\x0a이 작업은 배치 실링 작업의 CPU 사용량에 대한 자세한 정보를 제공하며, 여기에는 코어 할당 및 다양한" + " 배치 크기에 대한 스레드 분포가 포함됩니다.\x02supra_seal 구성 생성\x02주어진 배치 크기에 대한 supra_sea" + @@ -812,59 +997,64 @@ const koData string = "" + // Size: 18708 bytes " 눌러 종료해야 합니다.\x04\x00\x01 \x1f\x02WindowPoSt를 계산할 기한\x02WindowPoSt 계산을 위" + "한 SP ID\x02성능 및 구성 테스트를 위한 WindowPoSt 계산.\x02참고: 이 명령은 PoSt 계산 성능을 검증하" + "기 위해 사용됩니다.\x0a체인으로 메시지를 전송하지 않습니다. 모든 기한을 계산할 수 있으므로 출력이 체인과 부정확하게 일치" + - "할 수 있습니다.\x02[기한 인덱스]\x02WindowPoSt를 계산할 파티션\x02디버깅 유틸리티 모음\x02Curio 도" + - "구 상자\x02체인 노드에서 누락된 메시지 데이터를 사용하여 데이터베이스를 업데이트함\x02대기 큐에 있는 메시지의 데이터를 " + - "업데이트\x02미봉인 데이터를 관리\x02미봉인 데이터에 대한 정보 가져오기\x02sectors_unseal_pipeline " + - "및 sectors_meta 테이블의 데이터 나열\x02스토리지 제공자 ID로 필터링\x02출력 파일 경로 (기본값: 표준 출력" + - ")\x02섹터의 목표 미봉인 상태 설정\x04\x00\x01\x0a\xda\x07\x02특정 섹터의 목표 미봉인 상태를 설정합니다" + - ".\x0a : 스토리지 제공자 ID\x0a : 섹터 번호\x0a : 목표 상태 (true, false, none 중 하나)\x0a\x0a 미봉인 목표 상태는 Curio가 섹터" + - "의 미봉인 복사본을 어떻게 유지할지를 나타냅니다.\x0a\x09 목표 상태가 true이면 Curio는 섹터가 미봉인 상태로" + - " 유지되도록 보장합니다.\x0a\x09 목표 상태가 false이면 Curio는 섹터에 미봉인 복사본이 없도록 보장합니다." + - "\x0a\x09 목표 상태가 none이면 Curio는 섹터의 현재 상태를 변경하지 않습니다.\x0a\x0a 현재, 목표 상" + - "태가 다른 상태에서 true로 변경될 때만 Curio는 새로운 미봉인 프로세스를 시작합니다.\x0a\x0a 목표 상태가 f" + - "alse이고 미봉인 섹터 파일이 존재하는 경우, GC 마크 단계는 미봉인 섹터 파일에 대한 제거 마크를 생성합니다. 파일은 제거 " + - "마크가 승인된 후에만 제거됩니다.\x02미봉인 섹터 파일의 데이터 무결성 확인\x02특정 섹터에 대한 검사 작업을 생성하고 완" + - "료를 기다린 후 결과를 출력합니다.\x0a : 스토리지 제공자 ID\x0a : 섹터 번호\x04\x00\x01 ?\x02화살표 키를 사용하여 이동하세요: ↓ ↑ → ←\x02이 대화형 도구는 새로운 채굴" + - "자 액터를 생성하고 그에 대한 기본 구성 레이어를 생성합니다.\x02이 프로세스는 부분적으로 항등원적입니다. 새로운 채굴자 액" + - "터가 생성되었고 후속 단계가 실패하는 경우 사용자는 구성을 완료하기 위해 'curio config new-cluster < 채" + - "굴자 ID >'를 실행해야 합니다.\x02이 대화형 도구는 PDP, Snark 시장 등과 같은 프로토콜을 위한 비 SP 클러스" + - "터를 설정합니다.\x02이 설정은 Filecoin SP 액터를 생성하거나 마이그레이션하지 않습니다.\x02이 대화형 도구는 5" + - "분 안에 lotus-miner를 Curio로 이주합니다.\x02각 단계는 확인이 필요하며 되돌릴 수 있습니다. 언제든지 Ctr" + - "l+C를 눌러 종료할 수 있습니다.\x02터미널에서 Ctrl+C가 눌림\x02나는 원한다:\x02기존의 Lotus-Miner에서 " + - "이전하기\x02새로운 채굴자 생성\x02비 SP 클러스터 설정\x02나머지 단계를 중단합니다.\x02Lotus-Miner에서 " + - "Curio로 이주.\x02데이터베이스 구성 파일을 어디에 저장해야 하나요?\x02마이그레이션 중단.\x02파일 쓰기 오류: %[1" + - "]s\x04\x00\x01 :\x02%[1]s와 함께 웹 인터페이스를 시도해보세요\x02더 많은 서버를 위해 /etc/curio." + - "env 파일을 curio.env 데이터베이스 환경으로 만들고 목적을 할당하기 위해 CURIO_LAYERS 환경 변수를 추가하세요." + - "\x02해당하는 경우 이제 시장 노드를 이주할 수 있습니다 (%[1]s).\x02추가 정보는 http://docs.curiosto" + - "rage.org 에 있습니다.\x02새로운 채굴자 초기화 완료.\x02lotus-miner config.toml을 Curio의 데" + - "이터베이스 구성으로 이전 중입니다.\x02API 가져오기 오류: %[1]s\x02FullNode의 API 정보를 가져올 수 없" + - "습니다: %[1]w\x02토큰을 가져오는 중 오류 발생: %[1]s\x02이동할 수 없는 섹터가 발견되었습니다. 계속하시겠습니" + - "까?\x02예, 계속\x02아니오, 중단\x02레이어에 구성을 저장하는 중 오류 발생: %[1]s. 마이그레이션 중단\x04" + - "\x00\x01 \x08\x02문서:\x02'%[1]s' 레이어에는 공통 구성이 저장됩니다. 모든 Curio 인스턴스는 %[2]s" + - " 인수에 포함시킬 수 있습니다.\x02기계별 구성 변경을 위해 다른 레이어를 추가할 수 있습니다.\x02Filecoin %[1]s" + - " 채널: %[2]s 및 %[3]s\x02신뢰성 향상을 위한 중복성 사용: 적어도 post 레이어를 사용하여 여러 대의 기계를 시작" + - "하십시오: 'curio run --layers=post'\x02한 개의 데이터베이스는 여러 광부 ID를 제공할 수 있습니다: " + - "각 lotus-miner에 대해 마이그레이션을 실행하세요.\x02Yugabyte에 연결되었습니다. 스키마가 현재입니다.\x02" + - "Yugabyte에 연결됨\x02시작하려면 밀봉 파이프라인이 비어 있고 lotus-miner가 종료되었는지 확인하세요.\x02로터스" + - " 마이너 구성 디렉토리의 위치를 선택하시겠습니까?\x02기타\x02%[1]s에서 사용하는 구성 디렉터리 경로를 입력하세요.\x04" + - "\x00\x01 M\x02경로가 제공되지 않았으므로 마이그레이션을 포기합니다\x02제공된 디렉토리에서 config.toml 파일을" + - " 읽을 수 없습니다. 오류: %[1]s\x02디렉토리에서 저장소를 생성할 수 없습니다: %[1]s. 마이그레이션을 중단합니다." + - "\x02광부 저장소를 잠금 해제할 수 없습니다. 귀하의 광부를 중지해야 합니다: %[1]s\x0a 마이그레이션을 중단합니다." + - "\x02마이너 구성 읽기\x04\x00\x01\x0a\x15\x02단계 완료: %[1]s\x02새 채굴자 액터 초기화 중.\x02" + - "새 채굴자를 생성하기 위한 정보 입력\x02소유자 지갑: %[1]s\x02작업자 지갑: %[1]s\x02발송자 지갑: %[1]" + - "s\x02섹터 크기: %[1]s\x02주소를 확인하고 새 채굴자 액터를 생성하려면 계속 진행하세요.\x04\x00\x01 &" + - "\x02채굴자 생성 오류 발생: %[1]s\x02소유자 주소 입력\x02주소가 제공되지 않았습니다\x02주소 구문 분석 실패: %" + - "[1]s\x02%[1]s 주소 입력\x02섹터 크기 선택\x0264 GiB\x0232 GiB\x028 MiB\x022 KiB" + - "\x04\x00\x01 \x1c\x02섹터 선택 실패: %[1]s\x02섹터 크기 구문 분석 실패: %[1]s\x02채굴자 액터 " + - "생성 실패: %[1]s\x02%[1]s 채굴자가 성공적으로 생성되었습니다\x02데이터베이스에 연결할 수 없습니다: %[1]s" + - "\x02풀 노드 API에 연결하는 중 오류 발생: %[1]s\x02사전 초기화 단계 완료\x02비밀번호를 위한 랜덤 바이트 생성에" + - " 실패했습니다: %[1]s\x02마이너 생성은 idempotent하지 않으므로 가이드 설정을 다시 실행하지 마십시오. 구성을 완료" + - "하려면 'curio config new-cluster %[1]s'를 실행해야 합니다.\x02가이드 설정을 다시 실행하지 마십시" + - "오. 구성을 완료하려면 'curio config new-cluster'를 수동으로 실행해야 합니다.\x02FullNode의 A" + - "PI 정보를 가져오지 못했습니다: %[1]s\x02인증 토큰을 생성하지 못했습니다: %[1]s\x02기본 구성 생성 실패: %[1" + - "]s\x02데이터베이스에 구성 정보를 삽입하지 못했습니다: %[1]s\x02비 SP 클러스터 구성이 성공적으로 생성되었습니다" + + "할 수 있습니다.\x02[기한 인덱스]\x02WindowPoSt를 계산할 파티션\x02WindowPoSt 기본 증명을 계산하고" + + " 검증합니다.\x02디버깅 유틸리티 모음\x02수프라 합의 테스트 유틸리티\x02Curio 도구 상자\x02체인 노드에서 누락된 " + + "메시지 데이터를 사용하여 데이터베이스를 업데이트함\x02대기 큐에 있는 메시지의 데이터를 업데이트\x02Filecoin 서비스" + + " 등록 계약에 PDP 서비스 제공자 등록\x02서비스 제공자 이름\x02서비스 제공자 설명\x02서비스 제공자 URL\x02최소 " + + "조각 크기\x02최대 조각 크기\x02IPNI 조각 CID 인덱싱 지원\x02IPNI IPFS CID 인덱싱 지원\x02TiB" + + "당 월 스토리지 가격 (USDFC 단위), 기본값은 1 USDFC입니다.\x02SP가 저장된 데이터셋에 대한 접근 증명을 제공" + + "할 의사가 있는 최소 빈도 간격(에포크 단위)\x02서비스 제공자 위치\x02지불을 위한 토큰 계약 (FIL의 경우 IERC2" + + "0(address(0)))\x02미봉인 데이터를 관리\x02미봉인 데이터에 대한 정보 가져오기\x02sectors_unseal_p" + + "ipeline 및 sectors_meta 테이블의 데이터 나열\x02스토리지 제공자 ID로 필터링\x02출력 파일 경로 (기본값:" + + " 표준 출력)\x02섹터의 목표 미봉인 상태 설정\x04\x00\x01\x0a\xda\x07\x02특정 섹터의 목표 미봉인 상태를" + + " 설정합니다.\x0a : 스토리지 제공자 ID\x0a : 섹터 번호\x0a " + + " : 목표 상태 (true, false, none 중 하나)\x0a\x0a 미봉인 목표 상태는 Cur" + + "io가 섹터의 미봉인 복사본을 어떻게 유지할지를 나타냅니다.\x0a\x09 목표 상태가 true이면 Curio는 섹터가 미봉인" + + " 상태로 유지되도록 보장합니다.\x0a\x09 목표 상태가 false이면 Curio는 섹터에 미봉인 복사본이 없도록 보장합니다" + + ".\x0a\x09 목표 상태가 none이면 Curio는 섹터의 현재 상태를 변경하지 않습니다.\x0a\x0a 현재, 목표 " + + "상태가 다른 상태에서 true로 변경될 때만 Curio는 새로운 미봉인 프로세스를 시작합니다.\x0a\x0a 목표 상태가 " + + "false이고 미봉인 섹터 파일이 존재하는 경우, GC 마크 단계는 미봉인 섹터 파일에 대한 제거 마크를 생성합니다. 파일은 제거" + + " 마크가 승인된 후에만 제거됩니다.\x02미봉인 섹터 파일의 데이터 무결성 확인\x02특정 섹터에 대한 검사 작업을 생성하고 완료" + + "를 기다린 후 결과를 출력합니다.\x0a : 스토리지 제공자 ID\x0a " + + ": 섹터 번호\x04\x00\x01 ?\x02화살표 키를 사용하여 이동하세요: ↓ ↑ → ←\x02이 대화형 도구는 새로운 채굴자" + + " 액터를 생성하고 그에 대한 기본 구성 레이어를 생성합니다.\x02이 프로세스는 부분적으로 항등원적입니다. 새로운 채굴자 액터가 " + + "생성되었고 후속 단계가 실패하는 경우 사용자는 구성을 완료하기 위해 'curio config new-cluster < 채굴자 " + + "ID >'를 실행해야 합니다.\x02이 대화형 도구는 PDP, Snark 시장 등과 같은 프로토콜을 위한 비 SP 클러스터를 설정" + + "합니다.\x02이 설정은 Filecoin SP 액터를 생성하거나 마이그레이션하지 않습니다.\x02이 대화형 도구는 5분 안에 " + + "lotus-miner를 Curio로 이주합니다.\x02각 단계는 확인이 필요하며 되돌릴 수 있습니다. 언제든지 Ctrl+C를 눌러" + + " 종료할 수 있습니다.\x02터미널에서 Ctrl+C가 눌림\x02나는 원한다:\x02기존의 Lotus-Miner에서 이전하기" + + "\x02새로운 채굴자 생성\x02비 SP 클러스터 설정\x02나머지 단계를 중단합니다.\x02Lotus-Miner에서 Curio로" + + " 이주.\x02데이터베이스 구성 파일을 어디에 저장해야 하나요?\x02마이그레이션 중단.\x02파일 쓰기 오류: %[1]s\x04" + + "\x00\x01 :\x02%[1]s와 함께 웹 인터페이스를 시도해보세요\x02더 많은 서버를 위해 /etc/curio.env 파일" + + "을 curio.env 데이터베이스 환경으로 만들고 목적을 할당하기 위해 CURIO_LAYERS 환경 변수를 추가하세요.\x02" + + "해당하는 경우 이제 시장 노드를 이주할 수 있습니다 (%[1]s).\x02추가 정보는 http://docs.curiostora" + + "ge.org 에 있습니다.\x02새로운 채굴자 초기화 완료.\x02lotus-miner config.toml을 Curio의 데이터" + + "베이스 구성으로 이전 중입니다.\x02API 가져오기 오류: %[1]s\x02FullNode의 API 정보를 가져올 수 없습니" + + "다: %[1]w\x02토큰을 가져오는 중 오류 발생: %[1]s\x02이동할 수 없는 섹터가 발견되었습니다. 계속하시겠습니까?" + + "\x02예, 계속\x02아니오, 중단\x02레이어에 구성을 저장하는 중 오류 발생: %[1]s. 마이그레이션 중단\x04\x00" + + "\x01 \x08\x02문서:\x02'%[1]s' 레이어에는 공통 구성이 저장됩니다. 모든 Curio 인스턴스는 %[2]s 인수에" + + " 포함시킬 수 있습니다.\x02기계별 구성 변경을 위해 다른 레이어를 추가할 수 있습니다.\x02Filecoin %[1]s 채널:" + + " %[2]s 및 %[3]s\x02신뢰성 향상을 위한 중복성 사용: 적어도 post 레이어를 사용하여 여러 대의 기계를 시작하십시오" + + ": 'curio run --layers=post'\x02한 개의 데이터베이스는 여러 광부 ID를 제공할 수 있습니다: 각 lotu" + + "s-miner에 대해 마이그레이션을 실행하세요.\x02Yugabyte에 연결되었습니다. 스키마가 현재입니다.\x02Yugabyte" + + "에 연결됨\x02시작하려면 밀봉 파이프라인이 비어 있고 lotus-miner가 종료되었는지 확인하세요.\x02로터스 마이너 구" + + "성 디렉토리의 위치를 선택하시겠습니까?\x02기타\x02%[1]s에서 사용하는 구성 디렉터리 경로를 입력하세요.\x04\x00" + + "\x01 M\x02경로가 제공되지 않았으므로 마이그레이션을 포기합니다\x02제공된 디렉토리에서 config.toml 파일을 읽을 " + + "수 없습니다. 오류: %[1]s\x02디렉토리에서 저장소를 생성할 수 없습니다: %[1]s. 마이그레이션을 중단합니다.\x02" + + "광부 저장소를 잠금 해제할 수 없습니다. 귀하의 광부를 중지해야 합니다: %[1]s\x0a 마이그레이션을 중단합니다.\x02마" + + "이너 구성 읽기\x04\x00\x01\x0a\x15\x02단계 완료: %[1]s\x02새 채굴자 액터 초기화 중.\x02새 채" + + "굴자를 생성하기 위한 정보 입력\x02소유자 지갑: %[1]s\x02작업자 지갑: %[1]s\x02발송자 지갑: %[1]s" + + "\x02섹터 크기: %[1]s\x02주소를 확인하고 새 채굴자 액터를 생성하려면 계속 진행하세요.\x04\x00\x01 &\x02" + + "채굴자 생성 오류 발생: %[1]s\x02소유자 주소 입력\x02주소가 제공되지 않았습니다\x02주소 구문 분석 실패: %[1" + + "]s\x02%[1]s 주소 입력\x02섹터 크기 선택\x0264 GiB\x0232 GiB (메인넷 권장)\x028 MiB\x022" + + " KiB\x04\x00\x01 \x1c\x02섹터 선택 실패: %[1]s\x02섹터 크기 구문 분석 실패: %[1]s\x02채굴자" + + " 액터 생성 실패: %[1]s\x02%[1]s 채굴자가 성공적으로 생성되었습니다\x02데이터베이스에 연결할 수 없습니다: %[1]" + + "s\x02풀 노드 API에 연결하는 중 오류 발생: %[1]s\x02사전 초기화 단계 완료\x02비밀번호를 위한 랜덤 바이트 생성" + + "에 실패했습니다: %[1]s\x02마이너 생성은 idempotent하지 않으므로 가이드 설정을 다시 실행하지 마십시오. 구성을" + + " 완료하려면 'curio config new-cluster %[1]s'를 실행해야 합니다.\x02가이드 설정을 다시 실행하지 마십" + + "시오. 구성을 완료하려면 'curio config new-cluster'를 수동으로 실행해야 합니다.\x02FullNode의 " + + "API 정보를 가져오지 못했습니다: %[1]s\x02인증 토큰을 생성하지 못했습니다: %[1]s\x02기본 구성 생성 실패: %[" + + "1]s\x02데이터베이스에 구성 정보를 삽입하지 못했습니다: %[1]s\x02비 SP 클러스터 구성이 성공적으로 생성되었습니다" + "\x02비 SP 클러스터 구성 완료\x02이 마이너 주소를 포함한 구성 'base'가 업데이트되었습니다.\x02데이터베이스에서 기" + "본 구성을 로드하는 데 실패했습니다: %[1]s\x02기본 구성을 구문 분석하는 데 실패했습니다: %[1]s\x02기본 구성을" + " 재생성하는 데 실패했습니다: %[1]s\x02데이터베이스에 'base' 구성 레이어를 삽입하는 데 실패했습니다: %[1]s" + @@ -875,14 +1065,45 @@ const koData string = "" + // Size: 18708 bytes "\x02데이터베이스: %[1]s\x02계속 연결 및 스키마 업데이트.\x04\x00\x01 ^\x02데이터베이스 구성 오류가 발생" + "하여 마이그레이션을 포기합니다: %[1]s\x02Yugabyte 데이터베이스 호스트를 입력하십시오\x02호스트가 제공되지 않았" + "습니다\x02Yugabyte 데이터베이스 %[1]s을 입력하십시오\x02값이 제공되지 않았습니다\x02Yugabyte 데이터베" + - "이스에 연결하는 중 오류가 발생했습니다: %[1]s\x02%[1]d 섹터의 메타데이터를 이동 중입니다.\x02기본 설정 'ba" + - "se'가 이 마이너의 주소(%[1]s) 및 지갑 설정을 포함하도록 업데이트되었습니다.\x02구성 %[1]s를 %[2]s과 비교하세" + - "요. 지갑 주소 이외의 마이너 ID 사이의 변경 사항은 필요한 실행자를 위한 새로운 최소한의 레이어여야 합니다.\x02'bas" + - "e' 설정이 이 lotus-miner의 config.toml과 유사하게 만들어졌습니다.\x04\x00\x01 *\x02레이어 %[" + - "1]s가 생성되었습니다.\x04\x00\x01 \x22\x02구성 파일을 사용하려면:\x02Curio를 실행하려면: 기계 또는 c" + - "group 격리를 사용하여 다음 명령을 사용하세요 (예제 레이어 선택과 함께):" + "이스에 연결하는 중 오류가 발생했습니다: %[1]s\x02선택적 설정 단계 (건너뛰고 나중에 구성할 수 있습니다):\x02선택" + + "적 단계를 건너뛰기\x02스토리지\x02PDP\x02스토리지 구성\x02이 서버의 스토리지 경로를 관리합니다.\x02홈 디렉터" + + "리를 가져오는 중 오류 발생: %[1]s\x02뒤로 가기\x02새 스토리지 경로 추가\x02%[1]s 삭제\x02이 서버의 스" + + "토리지 경로:\x02추가할 스토리지 경로 입력\x02경로가 제공되지 않았습니다\x02경로를 확장하는 중 오류 발생: %[1]s" + + "\x02경로가 이미 존재합니다\x02%[1]s의 스토리지 유형\x02Seal (시일 작업을 위한 고속 스토리지)\x02Store " + + "(시일된 섹터의 장기 저장용 스토리지)\x02Both (시일 및 저장용)\x02storage.json을 쓰는 중 오류 발생: %[" + + "1]s\x02스토리지 경로 %[1]s가 %[2]s(으)로 추가되었습니다. 다음 명령으로 초기화해야 합니다: curio cli st" + + "orage attach --init --%[3]s %[4]s\x02스토리지 경로가 추가되었습니다\x02%[1]s을(를) 정말 삭제" + + "하시겠습니까?\x02예, 삭제합니다\x02아니요, 유지합니다\x02스토리지 경로 %[1]s이(가) 구성에서 제거되었습니다" + + "\x02스토리지 경로가 삭제되었습니다\x02PDP (데이터 보유 증명) 구성\x02Curio 클러스터의 PDP 설정을 구성합니다." + + "\x02자세한 문서는 다음을 참조하세요: https://docs.curiostorage.org/experimental-featur" + + "es/enable-pdp\x02PDP 레이어가 이미 존재합니다. 어떻게 하시겠습니까?\x02PDP 재구성\x02PDP 설정 건너뛰" + + "기\x02PDP 구성 레이어를 생성 중...\x02기존 PDP 구성 로드 중 오류 발생: %[1]s\x02PDP를 위한 HTT" + + "P 설정 구성 중...\x02도메인 이름을 입력하세요 (예: market.mydomain.com)\x02도메인이 제공되지 않아 H" + + "TTP 구성을 건너뜁니다\x02HTTP 서버의 수신 주소\x02PDP 구성 생성 중 오류 발생: %[1]s\x02PDP 구성 저장" + + " 중 오류 발생: %[1]s\x02PDP 구성 레이어가 생성되었습니다\x02PDP 지갑을 설정 중...\x02PDP를 사용하려면 " + + "위임된 Filecoin 지갑 주소가 필요합니다.\x02기존 키 사용 (%[1]s로 끝남)\x02위임된 지갑 개인 키 가져오기" + + "\x02지갑 설정을 지금은 건너뛰기\x02어떻게 진행하시겠습니까?\x02Curio GUI 또는 CLI를 사용하여 나중에 지갑을 설" + + "정할 수 있습니다\x02기존 PDP 지갑 키 사용 중: %[1]s\x02PDP 지갑이 구성되었습니다\x02Lotus를 사용하여" + + " 새 위임 지갑을 생성할 수 있습니다:\x02lotus wallet new delegated\x04\x03 \x00A\x02그" + + "런 다음 다음 명령으로 개인 키를 내보내세요:\x02lotus wallet export
    | xxd -r -p" + + " | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32\x02위임된 지갑 개인 키를 입력하세요 " + + "(16진수 형식):\x02개인 키\x02개인 키가 제공되지 않았습니다\x02PDP 설정이 완료되었습니다!\x02PDP를 활성화하여" + + " Curio를 시작하려면 다음을 실행하세요:\x02curio run --layers=gui,pdp\x02PDP 작업을 위해 FIL" + + "/tFIL을 0x 지갑 주소로 보내야 합니다.\x02다음 단계:\x021. 다음 명령으로 PDP 서비스를 테스트하세요: pdpto" + + "ol ping --service-url https://%[1]s --service-name public\x021. 다음 명령으로 " + + "PDP 서비스를 테스트하세요: pdptool ping --service-url https://your-domain.com --se" + + "rvice-name public\x022. FWSS 노드 등록\x023. https://www.filecoin.services 에" + + "서 FWSS 및 PDP 도구 탐색\x024. 커뮤니티에 참여하세요: Filecoin Slack #fil-pdp\x02개인 키는" + + " 비워 둘 수 없습니다\x02개인 키 디코딩 실패: %[1]s\x02잘못된 개인 키: %[1]s\x02PDP 키 가져오기 실패: " + + "%[1]s\x02PDP 지갑이 성공적으로 가져와졌습니다!\x02이더리움 주소 (0x): %[1]s\x02PDP 지갑이 가져와졌습니" + + "다\x02%[1]d 섹터의 메타데이터를 이동 중입니다.\x02기본 설정 'base'가 이 마이너의 주소(%[1]s) 및 지갑 " + + "설정을 포함하도록 업데이트되었습니다.\x02구성 %[1]s를 %[2]s과 비교하세요. 지갑 주소 이외의 마이너 ID 사이의 변" + + "경 사항은 필요한 실행자를 위한 새로운 최소한의 레이어여야 합니다.\x02'base' 설정이 이 lotus-miner의 con" + + "fig.toml과 유사하게 만들어졌습니다.\x04\x00\x01 *\x02레이어 %[1]s가 생성되었습니다.\x04\x00\x01" + + " \x22\x02구성 파일을 사용하려면:\x02Curio를 실행하려면: 기계 또는 cgroup 격리를 사용하여 다음 명령을 사용하" + + "세요 (예제 레이어 선택과 함께):" -var zhIndex = []uint32{ // 291 elements +var zhIndex = []uint32{ // 378 elements // Entry 0 - 1F 0x00000000, 0x0000000d, 0x00000038, 0x000000e6, 0x000000ff, 0x000001d8, 0x00000229, 0x0000023b, @@ -930,45 +1151,69 @@ var zhIndex = []uint32{ // 291 elements 0x00001bcf, 0x00001be5, 0x00001c43, 0x00001cc8, // Entry A0 - BF 0x00001cef, 0x00001d1d, 0x00001d51, 0x00001dfe, - 0x00001e13, 0x00001e2f, 0x00001e2f, 0x00001e42, - 0x00001e42, 0x00001e52, 0x00001e8c, 0x00001eb1, - 0x00001eca, 0x00001ee9, 0x00001f2c, 0x00001f49, - 0x00001f77, 0x00001f99, 0x0000229a, 0x000022cb, - 0x00002351, 0x00002384, 0x000023dc, 0x00002485, - 0x000024d8, 0x00002524, 0x0000256c, 0x000025bb, - 0x000025d4, 0x000025e1, 0x00002601, 0x0000261a, + 0x00001e13, 0x00001e2f, 0x00001e60, 0x00001e73, + 0x00001e8c, 0x00001e9c, 0x00001ed6, 0x00001efb, + 0x00001f38, 0x00001f4e, 0x00001f64, 0x00001f7b, + 0x00001f8e, 0x00001fa1, 0x00001fbf, 0x00001fdb, + 0x00002025, 0x0000208d, 0x000020a3, 0x000020df, + 0x000020f8, 0x00002117, 0x0000215a, 0x00002177, + 0x000021a5, 0x000021c7, 0x000024c8, 0x000024f9, // Entry C0 - DF - 0x00002639, 0x0000264f, 0x0000266c, 0x000026a9, - 0x000026b9, 0x000026d3, 0x000026f9, 0x00002780, - 0x000027c1, 0x000027f4, 0x00002810, 0x00002855, - 0x00002872, 0x0000289b, 0x000028b9, 0x000028ed, - 0x000028fd, 0x0000290a, 0x00002943, 0x00002952, - 0x000029ac, 0x000029e9, 0x00002a11, 0x00002a70, - 0x00002ac0, 0x00002aed, 0x00002b02, 0x00002b4d, - 0x00002b7d, 0x00002b84, 0x00002bae, 0x00002bd2, + 0x0000257f, 0x000025b2, 0x0000260a, 0x000026b3, + 0x00002706, 0x00002752, 0x0000279a, 0x000027e9, + 0x00002802, 0x0000280f, 0x0000282f, 0x00002848, + 0x00002867, 0x0000287d, 0x0000289a, 0x000028d7, + 0x000028e7, 0x00002901, 0x00002927, 0x000029ae, + 0x000029ef, 0x00002a22, 0x00002a3e, 0x00002a83, + 0x00002aa0, 0x00002ac9, 0x00002ae7, 0x00002b1b, + 0x00002b2b, 0x00002b38, 0x00002b71, 0x00002b80, // Entry E0 - FF - 0x00002c16, 0x00002c48, 0x00002c91, 0x00002ca4, - 0x00002cbe, 0x00002cdd, 0x00002d02, 0x00002d19, - 0x00002d2d, 0x00002d44, 0x00002d58, 0x00002d89, - 0x00002dae, 0x00002dc4, 0x00002dd4, 0x00002dee, - 0x00002e02, 0x00002e15, 0x00002e1c, 0x00002e23, - 0x00002e29, 0x00002e2f, 0x00002e4e, 0x00002e6e, - 0x00002e8e, 0x00002ea8, 0x00002ec5, 0x00002ef6, - 0x00002f0f, 0x00002f38, 0x00002fc5, 0x0000302a, + 0x00002bda, 0x00002c17, 0x00002c3f, 0x00002c9e, + 0x00002cee, 0x00002d1b, 0x00002d30, 0x00002d7b, + 0x00002dab, 0x00002db2, 0x00002ddc, 0x00002e00, + 0x00002e44, 0x00002e76, 0x00002ebf, 0x00002ed2, + 0x00002eec, 0x00002f0b, 0x00002f30, 0x00002f47, + 0x00002f5b, 0x00002f72, 0x00002f86, 0x00002fb7, + 0x00002fdc, 0x00002ff2, 0x00003002, 0x0000301c, + 0x00003030, 0x00003043, 0x0000304a, 0x00003063, // Entry 100 - 11F - 0x00003056, 0x00003076, 0x00003096, 0x000030bc, - 0x000030dc, 0x000030f6, 0x00003129, 0x00003156, - 0x00003177, 0x0000319d, 0x000031ce, 0x000031eb, - 0x00003211, 0x00003258, 0x00003297, 0x000032f1, - 0x00003300, 0x0000330f, 0x00003321, 0x00003330, - 0x00003342, 0x00003361, 0x00003399, 0x000033be, - 0x000033ce, 0x000033ec, 0x000033f9, 0x00003425, - 0x0000344f, 0x000034a0, 0x00003522, 0x00003569, + 0x00003069, 0x0000306f, 0x0000308e, 0x000030ae, + 0x000030ce, 0x000030e8, 0x00003105, 0x00003136, + 0x0000314f, 0x00003178, 0x00003205, 0x0000326a, + 0x00003296, 0x000032b6, 0x000032d6, 0x000032fc, + 0x0000331c, 0x00003336, 0x00003369, 0x00003396, + 0x000033b7, 0x000033dd, 0x0000340e, 0x0000342b, + 0x00003451, 0x00003498, 0x000034d7, 0x00003531, + 0x00003540, 0x0000354f, 0x00003561, 0x00003570, // Entry 120 - 13F - 0x00003583, 0x0000359b, 0x000035f2, -} // Size: 1188 bytes + 0x00003582, 0x000035a1, 0x000035d9, 0x000035fe, + 0x0000360e, 0x0000362c, 0x00003639, 0x00003665, + 0x0000369f, 0x000036b2, 0x000036b9, 0x000036bd, + 0x000036ca, 0x000036ef, 0x00003710, 0x00003717, + 0x00003730, 0x0000373d, 0x0000375c, 0x0000377b, + 0x0000378b, 0x000037a9, 0x000037b9, 0x000037cf, + 0x000037fb, 0x00003828, 0x00003842, 0x00003868, + 0x000038e8, 0x000038fe, 0x0000391b, 0x00003928, + // Entry 140 - 15F + 0x00003935, 0x0000395e, 0x00003974, 0x00003996, + 0x000039cd, 0x00003a24, 0x00003a50, 0x00003a61, + 0x00003a73, 0x00003a91, 0x00003aba, 0x00003ade, + 0x00003b16, 0x00003b3b, 0x00003b56, 0x00003b79, + 0x00003b9c, 0x00003bb4, 0x00003bcf, 0x00003c09, + 0x00003c32, 0x00003c4b, 0x00003c64, 0x00003c7d, + 0x00003cb2, 0x00003cdb, 0x00003cef, 0x00003d21, + 0x00003d3c, 0x00003d6e, 0x00003dc9, 0x00003e06, + // Entry 160 - 17F + 0x00003e0d, 0x00003e1d, 0x00003e31, 0x00003e5e, + 0x00003e79, 0x00003ec6, 0x00003ed3, 0x00003f41, + 0x00003fb9, 0x00003fd5, 0x00004015, 0x0000403f, + 0x00004052, 0x0000406d, 0x00004085, 0x000040a5, + 0x000040c0, 0x000040dd, 0x000040f1, 0x0000411b, + 0x0000416c, 0x000041ee, 0x00004235, 0x0000424f, + 0x00004267, 0x000042be, +} // Size: 1536 bytes -const zhData string = "" + // Size: 13810 bytes +const zhData string = "" + // Size: 17086 bytes "\x02数学工具\x02分析并显示批量封装线程的布局\x02分析并显示CPU上批量封装线程的布局。\x0a\x0a提供有关批量封装操作的CPU利" + "用率的详细信息,包括核心分配和不同批量大小的线程分布。\x02生成 supra_seal 配置\x02为指定的批量大小生成 supra_se" + "al 配置。\x0a\x0a此命令输出 SupraSeal 所需的配置,主要用于调试和测试。配置可以直接用于 SupraSeal 二进制文件进行" + @@ -1025,56 +1270,84 @@ const zhData string = "" + // Size: 13810 bytes "rio 上运行来测试窗口后调度器。如果所有重试都失败,则需要按 ctrl+c 退出。\x04\x00\x01 \x22\x02计算 Window" + "PoSt 的截止日期\x02用于计算 WindowPoSt 的存储提供者 ID\x02计算 WindowPoSt 以进行性能和配置测试。\x02" + "注意:此命令旨在用于验证 PoSt 计算性能。\x0a它不会向链发送任何消息。由于它可以计算任何截止日期,输出的时间可能与链不符。\x02[" + - "截止日期索引]\x02计算 WindowPoSt 的分区\x02调试工具集合\x02Curio 工具箱\x02已使用链节点中缺失的消息数据更" + - "新数据库\x02更新等待队列中的消息数据\x02管理未密封的数据\x02获取未密封数据的信息\x02列出来自 sectors_unseal_" + - "pipeline 和 sectors_meta 表的数据\x02按存储提供者 ID 过滤\x02输出文件路径(默认:标准输出)\x02设置扇区的" + - "目标解封状态\x04\x00\x01\x0a\xfb\x05\x02为特定扇区设置目标解封状态。\x0a : 存储提" + - "供者 ID\x0a : 扇区号\x0a : 目标状态(true、false" + - " 或 none)\x0a\x0a 解封目标状态表示 Curio 应如何维护扇区的未密封副本。\x0a\x09 如果目标状态为 true," + - "Curio 将确保扇区未密封。\x0a\x09 如果目标状态为 false,Curio 将确保扇区没有未密封副本。\x0a\x09 如果" + - "目标状态为 none,Curio 将不会更改扇区的当前状态。\x0a\x0a 当前,Curio 仅在目标状态从其他状态更改为 true " + - "时启动新的解封进程。\x0a\x0a 当目标状态为 false 且存在未密封的扇区文件时,GC 标记步骤将为未密封的扇区文件创建一个删除" + - "标记。文件将在删除标记被接受后才会被移除。\x02检查未密封扇区文件中的数据完整性\x02为特定扇区创建检查任务,等待其完成并输出结果。" + - "\x0a : 存储提供者 ID\x0a : 扇区号\x04\x00\x01 .\x02" + - "使用箭头键进行导航:↓ ↑ → ←\x02此交互式工具将创建一个新的矿工角色,并为其创建基本配置层。\x02该过程部分幂等。一旦创建了新的矿" + - "工角色,并且随后的步骤失败,用户需要运行 'curio config new-cluster < 矿工 ID >' 来完成配置。\x02此交" + - "互式工具为 PDP、Snark 市场等协议设置非存储提供者集群。\x02此设置不会创建或迁移 Filecoin 存储提供者(SP)参与者。" + - "\x02这个交互式工具可以在5分钟内将lotus-miner迁移到Curio。\x02每一步都需要您的确认,并且可以撤销。随时按Ctrl+C退出" + - "。\x02在终端中按下Ctrl+C\x02我想要:\x02从现有的 Lotus-Miner 迁移\x02创建一个新的矿工\x02设置非存储提" + - "供者集群\x02中止剩余步骤。\x02Lotus-Miner到Curio迁移。\x02我们应该把你的数据库配置文件保存在哪里?\x02中止迁" + - "移。\x02写入文件错误: %[1]s\x04\x00\x01 !\x02尝试使用%[1]s的网页界面\x02对于更多服务器,请使用 cur" + - "io.env 数据库环境创建 /etc/curio.env 并添加 CURIO_LAYERS 环境变量以分配用途。\x02如果适用,您现在可以迁" + - "移您的市场节点(%[1]s)。\x02更多信息请访问 http://docs.curiostorage.org\x02新矿工初始化完成。" + - "\x02将 lotus-miner config.toml 迁移到 Curio 的数据库配置中。\x02获取 API 时出错:%[1]s\x02" + - "无法获取FullNode的API信息:%[1]w\x02获取令牌时出错:%[1]s\x02发现无法迁移的扇区。您想要继续吗?\x02是的,继" + - "续\x02不,中止\x02保存配置到层时出错:%[1]s。正在中止迁移\x04\x00\x01 \x0a\x02文档:\x02'%[1]s'" + - "层存储通用配置。所有Curio实例都可以在其%[2]s参数中包含它。\x02您可以添加其他层进行每台机器的配置更改。\x02Filecoin" + - " %[1]s 频道:%[2]s 和 %[3]s\x02通过冗余增加可靠性:使用至少后层启动多台机器:'curio run --layers=po" + - "st'\x02一个数据库可以服务多个矿工ID:为每个lotus-miner运行迁移。\x02已连接到Yugabyte。模式是当前的。\x02已连" + - "接到Yugabyte\x02开始之前,请确保您的密封管道已排空并关闭lotus-miner。\x02选择您的lotus-miner配置目录的" + - "位置?\x02其他\x02输入%[1]s使用的配置目录的路径\x04\x00\x01 \x1f\x02未提供路径,放弃迁移\x02无法读取提" + - "供的目录中的config.toml文件,错误:%[1]s\x02无法从目录创建repo:%[1]s。 中止迁移\x02无法锁定矿工repo。" + - " 您的矿工必须停止:%[1]s\x0a 中止迁移\x02读取矿工配置\x04\x00\x01\x0a\x15\x02步骤完成:%[1]s\x02" + - "初始化新的矿工角色。\x02输入创建新矿工所需的信息\x02所有者钱包: %[1]s\x02工人钱包: %[1]s\x02发送者钱包: %[" + - "1]s\x02扇区大小: %[1]s\x02继续验证地址并创建新的矿工角色。\x04\x00\x01 \x02矿工创建错误发生: %[1]s" + - "\x02输入所有者地址\x02未提供地址\x02解析地址失败: %[1]s\x02输入 %[1]s 地址\x02选择扇区大小\x0264 GiB" + - "\x0232 GiB\x028 MiB\x022 KiB\x04\x00\x01 \x1a\x02扇区选择失败: %[1]s\x02解析扇区大小" + - "失败: %[1]s\x02创建矿工角色失败: %[1]s\x02矿工 %[1]s 创建成功\x02无法访问数据库: %[1]s\x02连接到" + - "完整节点 API 时发生错误: %[1]s\x02预初始化步骤完成\x02生成密码的随机字节失败: %[1]s\x02请不要再次运行引导设置" + - ",因为矿工创建不是幂等的。 您需要运行 'curio config new-cluster %[1]s' 来完成配置。\x02请不要再次运行" + - "引导设置。您需要手动运行 'curio config new-cluster' 来完成配置\x02无法获取 FullNode 的 API 信" + - "息: %[1]s\x02无法创建认证令牌: %[1]s\x02无法生成默认配置: %[1]s\x02无法将配置插入数据库: %[1]s" + - "\x02非 SP 集群配置创建成功\x02非 SP 集群配置完成\x02配置 'base' 已更新以包含此矿工的地址\x02从数据库加载基本配置" + - "失败:%[1]s\x02解析基本配置失败:%[1]s\x02重新生成基本配置失败: %[1]s\x02无法将 'base' 配置层插入数据库" + - ": %[1]s\x02非 SP 集群设置完成!\x02您的非 SP 集群已成功配置。\x02您现在可以开始在 PDP、Snark 市场等协议中使" + - "用 Curio。\x02要启动集群,请运行:curio run --layers basic-cluster\x02输入连接到您的Yugab" + - "yte数据库安装的信息(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正在迁移%[1]d个扇区的元数据。\x02'base'配置已更新," + - "包括该矿工的地址(%[1]s)及其钱包设置。\x02比较配置%[1]s和%[2]s。矿工ID之间除了钱包地址的变化应该是需要的运行者的一个新" + - "的、最小的层。\x02'base'配置已创建,以类似于这个lotus-miner的config.toml。\x04\x00\x01 \x15" + - "\x02层%[1]s已创建。\x04\x00\x01 \x13\x02要使用配置:\x02运行Curio:使用机器或cgroup隔离,使用命令(" + - "附带示例层选择):" + "截止日期索引]\x02计算 WindowPoSt 的分区\x02计算 WindowPoSt 基础证明并进行验证。\x02调试工具集合\x02" + + "超越共识测试工具\x02Curio 工具箱\x02已使用链节点中缺失的消息数据更新数据库\x02更新等待队列中的消息数据\x02在 File" + + "coin 服务注册合约中注册 PDP 服务提供商\x02服务提供商名称\x02服务提供商描述\x02服务提供商的 URL\x02最小分片大小" + + "\x02最大分片大小\x02支持 IPNI 分片 CID 索引\x02支持 IPNI IPFS CID 索引\x02每 TiB 每月的存储价格(" + + "USDFC 计价),默认值为 1 USDFC。\x02服务提供商愿意证明对存储数据集访问权限的最短频率间隔(以 epoch 为单位)\x02服务" + + "提供商位置\x02支付用的代币合约(FIL 使用 IERC20(address(0)))\x02管理未密封的数据\x02获取未密封数据的信息" + + "\x02列出来自 sectors_unseal_pipeline 和 sectors_meta 表的数据\x02按存储提供者 ID 过滤\x02" + + "输出文件路径(默认:标准输出)\x02设置扇区的目标解封状态\x04\x00\x01\x0a\xfb\x05\x02为特定扇区设置目标解封状" + + "态。\x0a : 存储提供者 ID\x0a : 扇区号\x0a : 目标状态(true、false 或 none)\x0a\x0a 解封目标状态表示 Curio 应如何维护扇区的未密封副本。" + + "\x0a\x09 如果目标状态为 true,Curio 将确保扇区未密封。\x0a\x09 如果目标状态为 false,Curio 将确" + + "保扇区没有未密封副本。\x0a\x09 如果目标状态为 none,Curio 将不会更改扇区的当前状态。\x0a\x0a 当前,Cu" + + "rio 仅在目标状态从其他状态更改为 true 时启动新的解封进程。\x0a\x0a 当目标状态为 false 且存在未密封的扇区文件时,G" + + "C 标记步骤将为未密封的扇区文件创建一个删除标记。文件将在删除标记被接受后才会被移除。\x02检查未密封扇区文件中的数据完整性\x02为特定扇区" + + "创建检查任务,等待其完成并输出结果。\x0a : 存储提供者 ID\x0a : 扇" + + "区号\x04\x00\x01 .\x02使用箭头键进行导航:↓ ↑ → ←\x02此交互式工具将创建一个新的矿工角色,并为其创建基本配置层。" + + "\x02该过程部分幂等。一旦创建了新的矿工角色,并且随后的步骤失败,用户需要运行 'curio config new-cluster < 矿工 " + + "ID >' 来完成配置。\x02此交互式工具为 PDP、Snark 市场等协议设置非存储提供者集群。\x02此设置不会创建或迁移 Filecoi" + + "n 存储提供者(SP)参与者。\x02这个交互式工具可以在5分钟内将lotus-miner迁移到Curio。\x02每一步都需要您的确认,并且可" + + "以撤销。随时按Ctrl+C退出。\x02在终端中按下Ctrl+C\x02我想要:\x02从现有的 Lotus-Miner 迁移\x02创建一" + + "个新的矿工\x02设置非存储提供者集群\x02中止剩余步骤。\x02Lotus-Miner到Curio迁移。\x02我们应该把你的数据库配置" + + "文件保存在哪里?\x02中止迁移。\x02写入文件错误: %[1]s\x04\x00\x01 !\x02尝试使用%[1]s的网页界面\x02" + + "对于更多服务器,请使用 curio.env 数据库环境创建 /etc/curio.env 并添加 CURIO_LAYERS 环境变量以分配用" + + "途。\x02如果适用,您现在可以迁移您的市场节点(%[1]s)。\x02更多信息请访问 http://docs.curiostorage.o" + + "rg\x02新矿工初始化完成。\x02将 lotus-miner config.toml 迁移到 Curio 的数据库配置中。\x02获取 AP" + + "I 时出错:%[1]s\x02无法获取FullNode的API信息:%[1]w\x02获取令牌时出错:%[1]s\x02发现无法迁移的扇区。您想" + + "要继续吗?\x02是的,继续\x02不,中止\x02保存配置到层时出错:%[1]s。正在中止迁移\x04\x00\x01 \x0a\x02文" + + "档:\x02'%[1]s'层存储通用配置。所有Curio实例都可以在其%[2]s参数中包含它。\x02您可以添加其他层进行每台机器的配置更改" + + "。\x02Filecoin %[1]s 频道:%[2]s 和 %[3]s\x02通过冗余增加可靠性:使用至少后层启动多台机器:'curio " + + "run --layers=post'\x02一个数据库可以服务多个矿工ID:为每个lotus-miner运行迁移。\x02已连接到Yugabyt" + + "e。模式是当前的。\x02已连接到Yugabyte\x02开始之前,请确保您的密封管道已排空并关闭lotus-miner。\x02选择您的lot" + + "us-miner配置目录的位置?\x02其他\x02输入%[1]s使用的配置目录的路径\x04\x00\x01 \x1f\x02未提供路径,放弃" + + "迁移\x02无法读取提供的目录中的config.toml文件,错误:%[1]s\x02无法从目录创建repo:%[1]s。 中止迁移\x02" + + "无法锁定矿工repo。 您的矿工必须停止:%[1]s\x0a 中止迁移\x02读取矿工配置\x04\x00\x01\x0a\x15\x02步" + + "骤完成:%[1]s\x02初始化新的矿工角色。\x02输入创建新矿工所需的信息\x02所有者钱包: %[1]s\x02工人钱包: %[1]s" + + "\x02发送者钱包: %[1]s\x02扇区大小: %[1]s\x02继续验证地址并创建新的矿工角色。\x04\x00\x01 \x02矿工创" + + "建错误发生: %[1]s\x02输入所有者地址\x02未提供地址\x02解析地址失败: %[1]s\x02输入 %[1]s 地址\x02选择" + + "扇区大小\x0264 GiB\x0232 GiB(主网推荐)\x028 MiB\x022 KiB\x04\x00\x01 \x1a\x02扇" + + "区选择失败: %[1]s\x02解析扇区大小失败: %[1]s\x02创建矿工角色失败: %[1]s\x02矿工 %[1]s 创建成功" + + "\x02无法访问数据库: %[1]s\x02连接到完整节点 API 时发生错误: %[1]s\x02预初始化步骤完成\x02生成密码的随机字节失" + + "败: %[1]s\x02请不要再次运行引导设置,因为矿工创建不是幂等的。 您需要运行 'curio config new-cluster %" + + "[1]s' 来完成配置。\x02请不要再次运行引导设置。您需要手动运行 'curio config new-cluster' 来完成配置\x02" + + "无法获取 FullNode 的 API 信息: %[1]s\x02无法创建认证令牌: %[1]s\x02无法生成默认配置: %[1]s" + + "\x02无法将配置插入数据库: %[1]s\x02非 SP 集群配置创建成功\x02非 SP 集群配置完成\x02配置 'base' 已更新以包" + + "含此矿工的地址\x02从数据库加载基本配置失败:%[1]s\x02解析基本配置失败:%[1]s\x02重新生成基本配置失败: %[1]s" + + "\x02无法将 'base' 配置层插入数据库: %[1]s\x02非 SP 集群设置完成!\x02您的非 SP 集群已成功配置。\x02您现在" + + "可以开始在 PDP、Snark 市场等协议中使用 Curio。\x02要启动集群,请运行:curio run --layers basic-" + + "cluster\x02输入连接到您的Yugabyte数据库安装的信息(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可选的设置步骤(可以" + + "跳过并稍后配置):\x02跳过可选步骤\x02存储\x02PDP\x02存储配置\x02管理此服务器的存储路径。\x02获取主目录时出错:%" + + "[1]s\x02返回\x02添加新的存储路径\x02删除 %[1]s\x02此服务器的存储路径:\x02输入要添加的存储路径\x02未提供路径" + + "\x02扩展路径时出错:%[1]s\x02路径已存在\x02%[1]s 的存储类型\x02Seal(用于封装操作的高速存储)\x02Store(" + + "用于封装扇区的长期存储)\x02Both(封装和存储)\x02写入 storage.json 时出错:%[1]s\x02存储路径 %[1]s" + + " 已添加为 %[2]s。需要使用以下命令进行初始化:curio cli storage attach --init --%[3]s %[4]s" + + "\x02已添加存储路径\x02确定要删除 %[1]s 吗?\x02是,删除\x02否,保留\x02存储路径 %[1]s 已从配置中移除\x02存" + + "储路径已删除\x02PDP(数据持有证明)配置\x02此操作将为您的 Curio 集群配置 PDP 设置。\x02详细文档请参阅:https" + + "://docs.curiostorage.org/experimental-features/enable-pdp\x02PDP 层已存在。您希" + + "望如何操作?\x02重新配置 PDP\x02跳过 PDP 设置\x02正在创建 PDP 配置层...\x02加载现有 PDP 配置时出错:%" + + "[1]s\x02正在配置 PDP 的 HTTP 设置...\x02请输入您的域名(例如:market.mydomain.com)\x02未提供域" + + "名,跳过 HTTP 配置\x02HTTP 服务器监听地址\x02生成 PDP 配置时出错:%[1]s\x02保存 PDP 配置时出错:%[1" + + "]s\x02已创建 PDP 配置层\x02正在设置 PDP 钱包...\x02使用 PDP 需要一个委托的 Filecoin 钱包地址。\x02" + + "使用现有密钥(以 %[1]s 结尾)\x02导入委托钱包私钥\x02暂时跳过钱包设置\x02您希望如何继续?\x02您可以稍后通过 Curi" + + "o GUI 或 CLI 设置钱包\x02使用现有的 PDP 钱包密钥:%[1]s\x02PDP 钱包已配置\x02您可以使用 Lotus 创建新" + + "的委托钱包:\x02lotus wallet new delegated\x04\x03 \x00+\x02然后使用以下命令导出其私钥:" + + "\x02lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | ba" + + "se64 -d | xxd -p -c 32\x02请输入您的委托钱包私钥(十六进制格式):\x02私钥\x02未提供私钥\x02PDP 设置完" + + "成!\x02要启用 PDP 并启动 Curio,请运行:\x02curio run --layers=gui,pdp\x02请确保将 FIL" + + "/tFIL 发送至您的 0x 钱包地址以进行 PDP 操作。\x02下一步:\x021. 使用以下命令测试您的 PDP 服务:pdptool p" + + "ing --service-url https://%[1]s --service-name public\x021. 使用以下命令测试您的 P" + + "DP 服务:pdptool ping --service-url https://your-domain.com --service-name " + + "public\x022. 注册您的 FWSS 节点\x023. 在 https://www.filecoin.services 浏览 FWSS " + + "和 PDP 工具\x024. 加入社区:Filecoin Slack #fil-pdp\x02私钥不能为空\x02私钥解码失败:%[1]s" + + "\x02无效的私钥:%[1]s\x02导入 PDP 密钥失败:%[1]s\x02成功导入 PDP 钱包!\x02以太坊地址 (0x):%[1]s" + + "\x02PDP 钱包已导入\x02正在迁移%[1]d个扇区的元数据。\x02'base'配置已更新,包括该矿工的地址(%[1]s)及其钱包设置。" + + "\x02比较配置%[1]s和%[2]s。矿工ID之间除了钱包地址的变化应该是需要的运行者的一个新的、最小的层。\x02'base'配置已创建,以" + + "类似于这个lotus-miner的config.toml。\x04\x00\x01 \x15\x02层%[1]s已创建。\x04\x00" + + "\x01 \x13\x02要使用配置:\x02运行Curio:使用机器或cgroup隔离,使用命令(附带示例层选择):" - // Total table size 51383 bytes (50KiB); checksum: 6D7A9409 + // Total table size 63188 bytes (61KiB); checksum: 9C81C267 diff --git a/cmd/curio/internal/translations/knowns/main.go b/cmd/curio/internal/translations/knowns/main.go index a30a94065..fd4a78b82 100644 --- a/cmd/curio/internal/translations/knowns/main.go +++ b/cmd/curio/internal/translations/knowns/main.go @@ -11,7 +11,7 @@ import ( ) func main() { - for _, arg := range os.Args { + for _, arg := range os.Args[1:] { handleKnowns(arg) } } diff --git a/cmd/curio/internal/translations/locales/en/out.gotext.json b/cmd/curio/internal/translations/locales/en/out.gotext.json index 4b4e43bdc..56a568992 100644 --- a/cmd/curio/internal/translations/locales/en/out.gotext.json +++ b/cmd/curio/internal/translations/locales/en/out.gotext.json @@ -1198,6 +1198,90 @@ "translatorComment": "Copied from source.", "fuzzy": true }, + { + "id": "Register a PDP service provider with Filecoin Service Registry Contract", + "message": "Register a PDP service provider with Filecoin Service Registry Contract", + "translation": "Register a PDP service provider with Filecoin Service Registry Contract", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Service provider name", + "message": "Service provider name", + "translation": "Service provider name", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Service provider description", + "message": "Service provider description", + "translation": "Service provider description", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "URL of the service provider", + "message": "URL of the service provider", + "translation": "URL of the service provider", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Minimum piece size", + "message": "Minimum piece size", + "translation": "Minimum piece size", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Maximum piece size", + "message": "Maximum piece size", + "translation": "Maximum piece size", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Supports IPNI piece CID indexing", + "message": "Supports IPNI piece CID indexing", + "translation": "Supports IPNI piece CID indexing", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Supports IPNI IPFS CID indexing", + "message": "Supports IPNI IPFS CID indexing", + "translation": "Supports IPNI IPFS CID indexing", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Storage price per TiB per month in USDFC, Default is 1 USDFC.", + "message": "Storage price per TiB per month in USDFC, Default is 1 USDFC.", + "translation": "Storage price per TiB per month in USDFC, Default is 1 USDFC.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset", + "message": "Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset", + "translation": "Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Location of the service provider", + "message": "Location of the service provider", + "translation": "Location of the service provider", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Token contract for payment (IERC20(address(0)) for FIL)", + "message": "Token contract for payment (IERC20(address(0)) for FIL)", + "translation": "Token contract for payment (IERC20(address(0)) for FIL)", + "translatorComment": "Copied from source.", + "fuzzy": true + }, { "id": "Manage unsealed data", "message": "Manage unsealed data", @@ -1950,9 +2034,9 @@ "fuzzy": true }, { - "id": "32 GiB", - "message": "32 GiB", - "translation": "32 GiB", + "id": "32 GiB (recommended for mainnet)", + "message": "32 GiB (recommended for mainnet)", + "translation": "32 GiB (recommended for mainnet)", "translatorComment": "Copied from source.", "fuzzy": true }, @@ -2476,6 +2560,735 @@ ], "fuzzy": true }, + { + "id": "Optional setup steps (you can skip these and configure later):", + "message": "Optional setup steps (you can skip these and configure later):", + "translation": "Optional setup steps (you can skip these and configure later):", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Skip optional steps", + "message": "Skip optional steps", + "translation": "Skip optional steps", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Storage", + "message": "Storage", + "translation": "Storage", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "PDP", + "message": "PDP", + "translation": "PDP", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Storage Configuration", + "message": "Storage Configuration", + "translation": "Storage Configuration", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Manage storage paths for this server.", + "message": "Manage storage paths for this server.", + "translation": "Manage storage paths for this server.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Error getting home directory: {Error}", + "message": "Error getting home directory: {Error}", + "translation": "Error getting home directory: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Go Back", + "message": "Go Back", + "translation": "Go Back", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Add new storage path", + "message": "Add new storage path", + "translation": "Add new storage path", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Delete {P}", + "message": "Delete {P}", + "translation": "Delete {P}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "P", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "p" + } + ], + "fuzzy": true + }, + { + "id": "Storage paths for this server:", + "message": "Storage paths for this server:", + "translation": "Storage paths for this server:", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Enter storage path to add", + "message": "Enter storage path to add", + "translation": "Enter storage path to add", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "No path provided", + "message": "No path provided", + "translation": "No path provided", + "translatorComment": "Copied from source.", + "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": "Path already exists", + "message": "Path already exists", + "translation": "Path already exists", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Storage type for {ExpandedPath}", + "message": "Storage type for {ExpandedPath}", + "translation": "Storage type for {ExpandedPath}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "ExpandedPath", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "expandedPath" + } + ], + "fuzzy": true + }, + { + "id": "Seal (fast storage for sealing operations)", + "message": "Seal (fast storage for sealing operations)", + "translation": "Seal (fast storage for sealing operations)", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Store (long-term storage for sealed sectors)", + "message": "Store (long-term storage for sealed sectors)", + "translation": "Store (long-term storage for sealed sectors)", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Both (seal and store)", + "message": "Both (seal and store)", + "translation": "Both (seal and store)", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Error writing storage.json: {Error}", + "message": "Error writing storage.json: {Error}", + "translation": "Error writing storage.json: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Storage path {ExpandedPath} added as {StorageTypeStr}. You'll need to initialize it with: curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "message": "Storage path {ExpandedPath} added as {StorageTypeStr}. You'll need to initialize it with: curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "translation": "Storage path {ExpandedPath} added as {StorageTypeStr}. You'll need to initialize it with: curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "ExpandedPath", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "expandedPath" + }, + { + "id": "StorageTypeStr", + "string": "%[2]s", + "type": "string", + "underlyingType": "string", + "argNum": 2, + "expr": "storageTypeStr" + }, + { + "id": "StorageTypeStr_1", + "string": "%[3]s", + "type": "string", + "underlyingType": "string", + "argNum": 3, + "expr": "storageTypeStr" + }, + { + "id": "ExpandedPath_1", + "string": "%[4]s", + "type": "string", + "underlyingType": "string", + "argNum": 4, + "expr": "expandedPath" + } + ], + "fuzzy": true + }, + { + "id": "Storage path added", + "message": "Storage path added", + "translation": "Storage path added", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Really delete {PathToDelete}?", + "message": "Really delete {PathToDelete}?", + "translation": "Really delete {PathToDelete}?", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "PathToDelete", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "pathToDelete" + } + ], + "fuzzy": true + }, + { + "id": "Yes, delete it", + "message": "Yes, delete it", + "translation": "Yes, delete it", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "No, keep it", + "message": "No, keep it", + "translation": "No, keep it", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Storage path {PathToDelete} removed from configuration", + "message": "Storage path {PathToDelete} removed from configuration", + "translation": "Storage path {PathToDelete} removed from configuration", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "PathToDelete", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "pathToDelete" + } + ], + "fuzzy": true + }, + { + "id": "Storage path deleted", + "message": "Storage path deleted", + "translation": "Storage path deleted", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "PDP (Proof of Data Possession) Configuration", + "message": "PDP (Proof of Data Possession) Configuration", + "translation": "PDP (Proof of Data Possession) Configuration", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "This will configure PDP settings for your Curio cluster.", + "message": "This will configure PDP settings for your Curio cluster.", + "translation": "This will configure PDP settings for your Curio cluster.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp", + "message": "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp", + "translation": "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "PDP layer already exists. What would you like to do?", + "message": "PDP layer already exists. What would you like to do?", + "translation": "PDP layer already exists. What would you like to do?", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Reconfigure PDP", + "message": "Reconfigure PDP", + "translation": "Reconfigure PDP", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Skip PDP setup", + "message": "Skip PDP setup", + "translation": "Skip PDP setup", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Creating PDP configuration layer...", + "message": "Creating PDP configuration layer...", + "translation": "Creating PDP configuration layer...", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Error loading existing PDP config: {Error}", + "message": "Error loading existing PDP config: {Error}", + "translation": "Error loading existing PDP config: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Configuring HTTP settings for PDP...", + "message": "Configuring HTTP settings for PDP...", + "translation": "Configuring HTTP settings for PDP...", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Enter your domain name (e.g., market.mydomain.com)", + "message": "Enter your domain name (e.g., market.mydomain.com)", + "translation": "Enter your domain name (e.g., market.mydomain.com)", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "No domain provided, skipping HTTP configuration", + "message": "No domain provided, skipping HTTP configuration", + "translation": "No domain provided, skipping HTTP configuration", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Listen address for HTTP server", + "message": "Listen address for HTTP server", + "translation": "Listen address for HTTP server", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Error generating PDP config: {Error}", + "message": "Error generating PDP config: {Error}", + "translation": "Error generating PDP config: {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 PDP config: {Error}", + "message": "Error saving PDP config: {Error}", + "translation": "Error saving PDP config: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "PDP configuration layer created", + "message": "PDP configuration layer created", + "translation": "PDP configuration layer created", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Setting up PDP wallet...", + "message": "Setting up PDP wallet...", + "translation": "Setting up PDP wallet...", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "You need a delegated Filecoin wallet address to use with PDP.", + "message": "You need a delegated Filecoin wallet address to use with PDP.", + "translation": "You need a delegated Filecoin wallet address to use with PDP.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Use existing key, ending in {AddressSuffix}", + "message": "Use existing key, ending in {AddressSuffix}", + "translation": "Use existing key, ending in {AddressSuffix}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "AddressSuffix", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "addressSuffix" + } + ], + "fuzzy": true + }, + { + "id": "Import delegated wallet private key", + "message": "Import delegated wallet private key", + "translation": "Import delegated wallet private key", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Skip wallet setup for now", + "message": "Skip wallet setup for now", + "translation": "Skip wallet setup for now", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "How would you like to proceed?", + "message": "How would you like to proceed?", + "translation": "How would you like to proceed?", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "You can set up the wallet later using the Curio GUI or CLI", + "message": "You can set up the wallet later using the Curio GUI or CLI", + "translation": "You can set up the wallet later using the Curio GUI or CLI", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Using existing PDP wallet key: {ExistingKeyAddress}", + "message": "Using existing PDP wallet key: {ExistingKeyAddress}", + "translation": "Using existing PDP wallet key: {ExistingKeyAddress}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "ExistingKeyAddress", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "existingKeyAddress" + } + ], + "fuzzy": true + }, + { + "id": "PDP wallet configured", + "message": "PDP wallet configured", + "translation": "PDP wallet configured", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "You can create a new delegated wallet using Lotus:", + "message": "You can create a new delegated wallet using Lotus:", + "translation": "You can create a new delegated wallet using Lotus:", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "lotus wallet new delegated", + "message": "lotus wallet new delegated", + "translation": "lotus wallet new delegated", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Then export its private key with:", + "message": "Then export its private key with:", + "translation": "Then export its private key with:", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "lotus wallet export \u003caddress\u003e | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "message": "lotus wallet export \u003caddress\u003e | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "translation": "lotus wallet export \u003caddress\u003e | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Enter your delegated wallet private key (hex format):", + "message": "Enter your delegated wallet private key (hex format):", + "translation": "Enter your delegated wallet private key (hex format):", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Private key", + "message": "Private key", + "translation": "Private key", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "No private key provided", + "message": "No private key provided", + "translation": "No private key provided", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "PDP setup complete!", + "message": "PDP setup complete!", + "translation": "PDP setup complete!", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "To start Curio with PDP enabled, run:", + "message": "To start Curio with PDP enabled, run:", + "translation": "To start Curio with PDP enabled, run:", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "curio run --layers=gui,pdp", + "message": "curio run --layers=gui,pdp", + "translation": "curio run --layers=gui,pdp", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.", + "message": "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.", + "translation": "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Next steps:", + "message": "Next steps:", + "translation": "Next steps:", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "1. Test your PDP service with: pdptool ping --service-url https://{Domain} --service-name public", + "message": "1. Test your PDP service with: pdptool ping --service-url https://{Domain} --service-name public", + "translation": "1. Test your PDP service with: pdptool ping --service-url https://{Domain} --service-name public", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Domain", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "domain" + } + ], + "fuzzy": true + }, + { + "id": "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public", + "message": "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public", + "translation": "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "2. Register your FWSS node", + "message": "2. Register your FWSS node", + "translation": "2. Register your FWSS node", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "3. Explore FWSS \u0026 PDP tools at https://www.filecoin.services", + "message": "3. Explore FWSS \u0026 PDP tools at https://www.filecoin.services", + "translation": "3. Explore FWSS \u0026 PDP tools at https://www.filecoin.services", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "4. Join the community: Filecoin Slack #fil-pdp", + "message": "4. Join the community: Filecoin Slack #fil-pdp", + "translation": "4. Join the community: Filecoin Slack #fil-pdp", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Private key cannot be empty", + "message": "Private key cannot be empty", + "translation": "Private key cannot be empty", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Failed to decode private key: {Error}", + "message": "Failed to decode private key: {Error}", + "translation": "Failed to decode private key: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Invalid private key: {Error}", + "message": "Invalid private key: {Error}", + "translation": "Invalid private key: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "Failed to import PDP key: {Error}", + "message": "Failed to import PDP key: {Error}", + "translation": "Failed to import PDP key: {Error}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Error", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "err.Error()" + } + ], + "fuzzy": true + }, + { + "id": "PDP wallet imported successfully!", + "message": "PDP wallet imported successfully!", + "translation": "PDP wallet imported successfully!", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Ethereum address (0x): {Address}", + "message": "Ethereum address (0x): {Address}", + "translation": "Ethereum address (0x): {Address}", + "translatorComment": "Copied from source.", + "placeholders": [ + { + "id": "Address", + "string": "%[1]s", + "type": "string", + "underlyingType": "string", + "argNum": 1, + "expr": "address" + } + ], + "fuzzy": true + }, + { + "id": "PDP wallet imported", + "message": "PDP wallet imported", + "translation": "PDP wallet imported", + "translatorComment": "Copied from source.", + "fuzzy": true + }, { "id": "Migrating metadata for {NSectors} sectors.", "message": "Migrating metadata for {NSectors} sectors.", @@ -2530,7 +3343,7 @@ "type": "string", "underlyingType": "string", "argNum": 2, - "expr": "\"mig-\" + curioCfg.Addresses[0].MinerAddresses[0]" + "expr": "\"mig-\" + curioCfg.Addresses.Get()[0].MinerAddresses[0]" } ], "fuzzy": true diff --git a/cmd/curio/internal/translations/locales/ko/messages.gotext.json b/cmd/curio/internal/translations/locales/ko/messages.gotext.json index 78dc608f6..696c4c585 100644 --- a/cmd/curio/internal/translations/locales/ko/messages.gotext.json +++ b/cmd/curio/internal/translations/locales/ko/messages.gotext.json @@ -1,2408 +1,2942 @@ { - "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 - }, - { - "id": "This interactive tool creates a new miner actor and creates the basic configuration layer for it.", - "translation": "이 대화형 도구는 새로운 채굴자 액터를 생성하고 그에 대한 기본 구성 레이어를 생성합니다.", - "message": "This interactive tool creates a new miner actor and creates the basic configuration layer for it.", - "placeholder": null - }, - { - "id": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster {Arg_1}' to finish the configuration.", - "translation": "이 프로세스는 부분적으로 idempotent합니다. 새로운 채굴자 액터가 생성되었고 후속 단계가 실패하면 사용자는 구성을 완료하기 위해 'curio config new-cluster {Arg_1}'를 실행해야 합니다.", - "message": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster {Arg_1}' to finish the configuration.", - "placeholder": null - }, - { - "id": "Choose if you with to create a new miner or migrate from existing Lotus-Miner", - "translation": "새 채굴자를 생성할지 기존의 Lotus-Miner에서 이전할지 선택하세요.", - "message": "Choose if you with to create a new miner or migrate from existing Lotus-Miner", - "placeholder": null - }, - { - "id": "Migrate from existing Lotus-Miner", - "translation": "기존의 Lotus-Miner에서 이전하기", - "message": "Migrate from existing Lotus-Miner", - "placeholder": null - }, - { - "id": "Create a new miner", - "translation": "새로운 채굴자 생성", - "message": "Create a new miner", - "placeholder": null - }, - { - "id": "New Miner initialization complete.", - "translation": "새로운 채굴자 초기화 완료.", - "message": "New Miner initialization complete.", - "placeholder": null - }, - { - "id": "Migrating lotus-miner config.toml to Curio in-database configuration.", - "translation": "lotus-miner config.toml을 Curio의 데이터베이스 구성으로 이전 중입니다.", - "message": "Migrating lotus-miner config.toml to Curio in-database configuration.", - "placeholder": null - }, - { - "id": "Error getting API: {Error}", - "translation": "API 가져오기 오류: {Error}", - "message": "Error getting API: {Error}", - "placeholder": null - }, - { - "id": "The Curio team wants to improve the software you use. Tell the team you're using {Curio}.", - "translation": "Curio 팀은 당신이 사용하는 소프트웨어를 개선하고자 합니다. 팀에게 {Curio}를 사용 중이라고 알려주세요.", - "message": "The Curio team wants to improve the software you use. Tell the team you're using {Curio}.", - "placeholder": null - }, - { - "id": "Individual Data: Miner ID, Curio version, chain ({Mainnet} or {Calibration}). Signed.", - "translation": "개별 데이터: 채굴자 ID, Curio 버전, 체인 ({Mainnet} 또는 {Calibration}). 서명됨.", - "message": "Individual Data: Miner ID, Curio version, chain ({Mainnet} or {Calibration}). Signed.", - "placeholder": null - }, - { - "id": "Aggregate-Anonymous: version, chain, and Miner power (bucketed).", - "translation": "집계-익명: 버전, 체인, 및 채굴자 파워 (버킷).", - "message": "Aggregate-Anonymous: version, chain, and Miner power (bucketed).", - "placeholder": null - }, - { - "id": "Hint: I am someone running Curio on whichever chain.", - "translation": "힌트: 나는 어떤 체인에서든 Curio를 실행 중인 사람입니다.", - "message": "Hint: I am someone running Curio on whichever chain.", - "placeholder": null - }, - { - "id": "Press return to update {Toml} with Yugabyte info. A Backup file will be written to that folder before changes are made.", - "translation": "{Toml}을 Yugabyte 정보로 업데이트하려면 리턴 키를 누르세요. 변경 사항을 적용하기 전에 해당 폴더에 백업 파일이 작성됩니다.", - "message": "Press return to update {Toml} with Yugabyte info. A Backup file will be written to that folder before changes are made.", - "placeholder": null - }, - { - "id": "Error creating backup file: {Error}", - "translation": "백업 파일 생성 오류: {Error}", - "message": "Error creating backup file: {Error}", - "placeholder": null - }, - { - "id": "Error reading config.toml: {Error}", - "translation": "config.toml 읽기 오류: {Error}", - "message": "Error reading config.toml: {Error}", - "placeholder": null - }, - { - "id": "Error writing backup file: {Error}", - "translation": "백업 파일 쓰기 오류: {Error}", - "message": "Error writing backup file: {Error}", - "placeholder": null - }, - { - "id": "Error closing backup file: {Error}", - "translation": "백업 파일 닫기 오류: {Error}", - "message": "Error closing backup file: {Error}", - "placeholder": null - }, - { - "id": "Initializing a new miner actor.", - "translation": "새 채굴자 액터 초기화 중.", - "message": "Initializing a new miner actor.", - "placeholder": null - }, - { - "id": "Enter the info to create a new miner", - "translation": "새 채굴자를 생성하기 위한 정보 입력", - "message": "Enter the info to create a new miner", - "placeholder": null - }, - { - "id": "Owner Address: {String}", - "translation": "소유자 주소: {String}", - "message": "Owner Address: {String}", - "placeholder": null - }, - { - "id": "Worker Address: {String}", - "translation": "작업자 주소: {String}", - "message": "Worker Address: {String}", - "placeholder": null - }, - { - "id": "Sender Address: {String}", - "translation": "송신자 주소: {String}", - "message": "Sender Address: {String}", - "placeholder": null - }, - { - "id": "Sector Size: {Ssize}", - "translation": "섹터 크기: {Ssize}", - "message": "Sector Size: {Ssize}", - "placeholder": null - }, - { - "id": "Confidence: {Confidence}", - "translation": "신뢰도: {Confidence}", - "message": "Confidence: {Confidence}", - "placeholder": null - }, - { - "id": "Continue to verify the addresses and create a new miner actor.", - "translation": "주소를 확인하고 새 채굴자 액터를 생성하려면 계속 진행하세요.", - "message": "Continue to verify the addresses and create a new miner actor.", - "placeholder": null - }, - { - "id": "Miner creation error occurred: {Error}", - "translation": "채굴자 생성 오류 발생: {Error}", - "message": "Miner creation error occurred: {Error}", - "placeholder": null - }, - { - "id": "Enter the owner address", - "translation": "소유자 주소 입력", - "message": "Enter the owner address", - "placeholder": null - }, - { - "id": "No address provided", - "translation": "주소가 제공되지 않았습니다", - "message": "No address provided", - "placeholder": null - }, - { - "id": "Failed to parse the address: {Error}", - "translation": "주소 구문 분석 실패: {Error}", - "message": "Failed to parse the address: {Error}", - "placeholder": null - }, - { - "id": "Enter {Stringworker_senderi_1} address", - "translation": "{Stringworker_senderi_1} 주소 입력", - "message": "Enter {Stringworker_senderi_1} address", - "placeholder": null - }, - { - "id": "Enter the sector size", - "translation": "섹터 크기 입력", - "message": "Enter the sector size", - "placeholder": null - }, - { - "id": "Failed to parse sector size: {Error}", - "translation": "섹터 크기 구문 분석 실패: {Error}", - "message": "Failed to parse sector size: {Error}", - "placeholder": null - }, - { - "id": "Enter the confidence", - "translation": "신뢰도 입력", - "message": "Enter the confidence", - "placeholder": null - }, - { - "id": "Failed to parse confidence: {Error}", - "translation": "신뢰도 구문 분석 실패: {Error}", - "message": "Failed to parse confidence: {Error}", - "placeholder": null - }, - { - "id": "Failed to create the miner actor: {Error}", - "translation": "채굴자 액터 생성 실패: {Error}", - "message": "Failed to create the miner actor: {Error}", - "placeholder": null - }, - { - "id": "Miner {String} created successfully", - "translation": "{String} 채굴자가 성공적으로 생성되었습니다", - "message": "Miner {String} created successfully", - "placeholder": null - }, - { - "id": "Cannot reach the DB: {Error}", - "translation": "데이터베이스에 연결할 수 없습니다: {Error}", - "message": "Cannot reach the DB: {Error}", - "placeholder": null - }, - { - "id": "Error connecting to full node API: {Error}", - "translation": "풀 노드 API에 연결하는 중 오류 발생: {Error}", - "message": "Error connecting to full node API: {Error}", - "placeholder": null - }, - { - "id": "Pre-initialization steps complete", - "translation": "사전 초기화 단계 완료", - "message": "Pre-initialization steps complete", - "placeholder": null - }, - { - "id": "Failed to random bytes for secret: {Error}", - "translation": "비밀을 위한 랜덤 바이트 생성 실패: {Error}", - "message": "Failed to random bytes for secret: {Error}", - "placeholder": null - }, - { - "id": "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster {String}' to finish the configuration", - "translation": "마이너 생성은 idempotent하지 않으므로 가이드 설정을 다시 실행하지 마십시오. 구성을 완료하려면 'curio config new-cluster {String}'를 실행해야 합니다.", - "message": "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster {String}' to finish the configuration", - "placeholder": null - }, - { - "id": "Failed to verify the auth token from daemon node: {Error}", - "translation": "데몬 노드로부터 인증 토큰을 확인하는 중 오류 발생: {Error}", - "message": "Failed to verify the auth token from daemon node: {Error}", - "placeholder": null - }, - { - "id": "Failed to encode the config: {Error}", - "translation": "구성을 인코딩하는 중 오류 발생: {Error}", - "message": "Failed to encode the config: {Error}", - "placeholder": null - }, - { - "id": "Failed to generate default config: {Error}", - "translation": "기본 구성 생성 실패: {Error}", - "message": "Failed to generate default config: {Error}", - "placeholder": null - }, - { - "id": "Failed to inset 'base' config layer in database: {Error}", - "translation": "데이터베이스에 'base' 구성 레이어 삽입 실패: {Error}", - "message": "Failed to inset 'base' config layer in database: {Error}", - "placeholder": null - }, - { - "id": "Failed to inset '{String}' config layer in database: {Error}", - "translation": "데이터베이스에 '{String}' 구성 레이어 삽입 실패: {Error}", - "message": "Failed to inset '{String}' config layer in database: {Error}", - "placeholder": null - }, - { - "id": "New Curio configuration layer '{String}' created", - "translation": "새로운 Curio 구성 레이어 '{String}'가 생성되었습니다", - "message": "New Curio configuration layer '{String}' created", - "placeholder": null - }, - { - "id": "The Curio team wants to improve the software you use. Tell the team you're using `{Curio}`.", - "translation": "Curio 팀은 당신이 사용하는 소프트웨어를 개선하고자 합니다. 팀에게 `{Curio}`를 사용 중이라고 알려주세요.", - "message": "The Curio team wants to improve the software you use. Tell the team you're using `{Curio}`.", - "placeholder": null - }, - { - "id": "Confidence epochs: {Confidence}", - "translation": "신뢰 에포크: {Confidence}", - "message": "Confidence epochs: {Confidence}", - "placeholder": null - }, - { - "id": "Failed to generate random bytes for secret: {Error}", - "translation": "비밀번호를 위한 랜덤 바이트 생성에 실패했습니다: {Error}", - "message": "Failed to generate random bytes for secret: {Error}", - "placeholder": null - }, - { - "id": "Failed to get API info for FullNode: {Err}", - "translation": "FullNode에 대한 API 정보를 가져오는 데 실패했습니다: {Err}", - "message": "Failed to get API info for FullNode: {Err}", - "placeholder": null - }, - { - "id": "Failed to insert 'base' config layer in database: {Error}", - "translation": "데이터베이스에 'base' 구성 레이어를 삽입하는 데 실패했습니다: {Error}", - "message": "Failed to insert 'base' config layer in database: {Error}", - "placeholder": null - }, - { - "id": "Failed to insert '{String}' config layer in database: {Error}", - "translation": "데이터베이스에 '{String}' 구성 레이어를 삽입하는 데 실패했습니다: {Error}", - "message": "Failed to insert '{String}' config layer in database: {Error}", - "placeholder": null - }, - { - "id": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster \u003c miner ID \u003e' to finish the configuration.", - "translation": "이 프로세스는 부분적으로 항등원적입니다. 새로운 채굴자 액터가 생성되었고 후속 단계가 실패하는 경우 사용자는 구성을 완료하기 위해 'curio config new-cluster \u003c 채굴자 ID \u003e'를 실행해야 합니다.", - "message": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster \u003c miner ID \u003e' to finish the configuration.", - "placeholder": null - }, - { - "id": "Confidence epochs", - "translation": "신뢰 에포크", - "message": "Confidence epochs", - "placeholder": null - }, - { - "id": "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'", - "translation": "신뢰성 향상을 위한 중복성 사용: 적어도 post 레이어를 사용하여 여러 대의 기계를 시작하십시오: 'curio run --layers=post'", - "message": "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'", - "placeholder": null - }, - { - "id": "I want to:", - "translation": "나는 원한다:", - "message": "I want to:", - "placeholder": null - }, - { - "id": "Configuration 'base' was updated to include this miner's address", - "translation": "이 마이너 주소를 포함한 구성 'base'가 업데이트되었습니다.", - "message": "Configuration 'base' was updated to include this miner's address", - "placeholder": null - }, - { - "id": "Cannot load base config: {Error}", - "translation": "기본 구성을 불러올 수 없습니다: {Error}", - "message": "Cannot load base config: {Error}", - "placeholder": null - }, - { - "id": "Failed to load base config: {Error}", - "translation": "기본 구성을 로드하는 데 실패했습니다: {Error}", - "message": "Failed to load base config: {Error}", - "placeholder": null - }, - { - "id": "Failed to regenerate base config: {Error}", - "translation": "기본 구성을 재생성하는 데 실패했습니다: {Error}", - "message": "Failed to regenerate base config: {Error}", - "placeholder": null - }, - { - "id": "Failed to load base config from database: {Error}", - "translation": "데이터베이스에서 기본 구성을 로드하는 데 실패했습니다: {Error}", - "message": "Failed to load base config from database: {Error}", - "placeholder": null - }, - { - "id": "Failed to parse base config: {Error}", - "translation": "기본 구성을 구문 분석하는 데 실패했습니다: {Error}", - "message": "Failed to parse base config: {Error}", - "placeholder": null - }, - { - "id": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.", - "translation": "{Rendercurio_run___layersgui}를 사용하여 웹 인터페이스를 시도하고 더 나은 안내된 개선을 진행하세요.", - "message": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.", - "placeholder": null - }, - { - "id": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.", - "translation": "이제 lotus-miner와 lotus-worker를 종료하고 {Rendercurio_run}을 실행하세요.", - "message": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.", - "placeholder": null - }, - { - "id": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.", - "translation": "기본 설정 'base'가 이 마이너의 주소({MinerAddress}) 및 지갑 설정을 포함하도록 업데이트되었습니다.", - "message": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.", - "placeholder": null - }, - { - "id": "Configuration 'base' was created to resemble this lotus-miner's config.toml .", - "translation": "'base' 설정이 이 lotus-miner의 config.toml과 유사하게 만들어졌습니다.", - "message": "Configuration 'base' was created to resemble this lotus-miner's config.toml .", - "placeholder": null - }, - { - "id": "Unmigratable sectors found. Do you want to continue?", - "translation": "이동할 수 없는 섹터가 발견되었습니다. 계속하시겠습니까?", - "message": "Unmigratable sectors found. Do you want to continue?", - "placeholder": null - }, - { - "id": "Yes, continue", - "translation": "예, 계속", - "message": "Yes, continue", - "placeholder": null - }, - { - "id": "No, abort", - "translation": "아니오, 중단", - "message": "No, abort", - "placeholder": null - }, - { - "id": "Migrating metadata for {NSectors} sectors.", - "translation": "{NSectors} 섹터의 메타데이터를 이동 중입니다.", - "message": "Migrating metadata for {NSectors} sectors.", - "placeholder": null - }, - { - "id": "Where should we save your database config file?", - "translation": "데이터베이스 구성 파일을 어디에 저장해야 하나요?", - "message": "Where should we save your database config file?", - "placeholder": null - }, - { - "id": "Error writing file: {Error}", - "translation": "파일 쓰기 오류: {Error}", - "message": "Error writing file: {Error}", - "placeholder": null - }, - { - "id": "Try the web interface with {Rendercurio_run___layersgui}", - "translation": "{Rendercurio_run___layersgui}와 함께 웹 인터페이스를 시도해보세요", - "message": "Try the web interface with {Rendercurio_run___layersgui}", - "placeholder": null - }, - { - "id": "For more servers, copy curio.env to /etc/curio.env and add the CURIO_LAYERS env to assign purposes.", - "translation": "더 많은 서버를 위해 curio.env를 /etc/curio.env로 복사하고 목적을 할당하기 위해 CURIO_LAYERS 환경 변수를 추가하세요.", - "message": "For more servers, copy curio.env to /etc/curio.env and add the CURIO_LAYERS env to assign purposes.", - "placeholder": null - }, - { - "id": "Owner Wallet: {String}", - "translation": "소유자 지갑: {String}", - "message": "Owner Wallet: {String}", - "placeholder": null - }, - { - "id": "Worker Wallet: {String}", - "translation": "작업자 지갑: {String}", - "message": "Worker Wallet: {String}", - "placeholder": null - }, - { - "id": "Sender Wallet: {String}", - "translation": "발송자 지갑: {String}", - "message": "Sender Wallet: {String}", - "placeholder": null - }, - { - "id": "Select the Sector Size", - "translation": "섹터 크기 선택", - "message": "Select the Sector Size", - "placeholder": null - }, - { - "id": "64 GiB", - "translation": "64 GiB", - "message": "64 GiB", - "placeholder": null - }, - { - "id": "32 GiB", - "translation": "32 GiB", - "message": "32 GiB", - "placeholder": null - }, - { - "id": "8 MiB", - "translation": "8 MiB", - "message": "8 MiB", - "placeholder": null - }, - { - "id": "2 KiB", - "translation": "2 KiB", - "message": "2 KiB", - "placeholder": null - }, - { - "id": "Sector selection failed: {Error}", - "translation": "섹터 선택 실패: {Error}", - "message": "Sector selection failed: {Error}", - "placeholder": null - }, - { - "id": "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.", - "translation": "더 많은 서버를 위해 /etc/curio.env 파일을 curio.env 데이터베이스 환경으로 만들고 목적을 할당하기 위해 CURIO_LAYERS 환경 변수를 추가하세요.", - "message": "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.", - "placeholder": null - }, - { - "id": "Additional info is at http://docs.curiostorage.org", - "translation": "추가 정보는 http://docs.curiostorage.org 에 있습니다.", - "message": "Additional info is at http://docs.curiostorage.org", - "placeholder": null - }, - { - "id": "Math Utils", - "translation": "수학 유틸리티", - "message": "Math Utils", - "placeholder": null - }, - { - "id": "Analyze and display the layout of batch sealer threads", - "translation": "배치 실러 스레드의 레이아웃 분석 및 표시", - "message": "Analyze and display the layout of batch sealer threads", - "placeholder": null - }, - { - "id": "Analyze and display the layout of batch sealer threads on your CPU.\n\nIt provides detailed information about CPU utilization for batch sealing operations, including core allocation, thread\ndistribution for different batch sizes.", - "translation": "CPU에서 배치 실러 스레드의 레이아웃을 분석하고 표시합니다.\n\n이 작업은 배치 실링 작업의 CPU 사용량에 대한 자세한 정보를 제공하며, 여기에는 코어 할당 및 다양한 배치 크기에 대한 스레드 분포가 포함됩니다.", - "message": "Analyze and display the layout of batch sealer threads on your CPU.\n\nIt provides detailed information about CPU utilization for batch sealing operations, including core allocation, thread\ndistribution for different batch sizes.", - "placeholder": null - }, - { - "id": "Generate a supra_seal configuration", - "translation": "supra_seal 구성 생성", - "message": "Generate a supra_seal configuration", - "placeholder": null - }, - { - "id": "Generate a supra_seal configuration for a given batch size.\n\nThis command outputs a configuration expected by SupraSeal. Main purpose of this command is for debugging and testing.\nThe config can be used directly with SupraSeal binaries to test it without involving Curio.", - "translation": "주어진 배치 크기에 대한 supra_seal 구성을 생성합니다.\n\n이 명령은 SupraSeal에서 기대하는 구성을 출력하며, 주로 디버깅 및 테스트를 목적으로 합니다.\n구성은 Curio를 사용하지 않고도 SupraSeal 바이너리에서 직접 사용할 수 있습니다.", - "message": "Generate a supra_seal configuration for a given batch size.\n\nThis command outputs a configuration expected by SupraSeal. Main purpose of this command is for debugging and testing.\nThe config can be used directly with SupraSeal binaries to test it without involving Curio.", - "placeholder": null - }, - { - "id": "Zen3 and later supports two sectors per thread, set to false for older CPUs", - "translation": "Zen3 및 이후 버전은 스레드당 두 개의 섹터를 지원하며, 이전 CPU에서는 false로 설정합니다", - "message": "Zen3 and later supports two sectors per thread, set to false for older CPUs", - "placeholder": null - }, - { - "id": "Execute cli commands", - "translation": "CLI 명령 실행", - "message": "Execute cli commands", - "placeholder": null - }, - { - "id": "machine host:port (curio run --listen address)", - "translation": "기계 호스트:포트 (curio run --listen 주소)", - "message": "machine host:port (curio run --listen address)", - "placeholder": null - }, - { - "id": "Wait for Curio api to come online", - "translation": "Curio API가 온라인 상태가 될 때까지 기다리기", - "message": "Wait for Curio api to come online", - "placeholder": null - }, - { - "id": "duration to wait till fail", - "translation": "실패할 때까지 대기할 시간", - "message": "duration to wait till fail", - "placeholder": null - }, - { - "id": "Manage node config by layers. The layer 'base' will always be applied at Curio start-up.", - "translation": "노드 구성을 레이어별로 관리합니다. 'base' 레이어는 항상 Curio 시작 시 적용됩니다.", - "message": "Manage node config by layers. The layer 'base' will always be applied at Curio start-up.", - "placeholder": null - }, - { - "id": "Print default node config", - "translation": "기본 노드 구성 출력", - "message": "Print default node config", - "placeholder": null - }, - { - "id": "don't comment default values", - "translation": "기본값에 주석을 달지 않음", - "message": "don't comment default values", - "placeholder": null - }, - { - "id": "Set a config layer or the base by providing a filename or stdin.", - "translation": "파일 이름 또는 stdin을 제공하여 구성 레이어 또는 기본값 설정.", - "message": "Set a config layer or the base by providing a filename or stdin.", - "placeholder": null - }, - { - "id": "a layer's file name", - "translation": "레이어의 파일 이름", - "message": "a layer's file name", - "placeholder": null - }, - { - "id": "title of the config layer (req'd for stdin)", - "translation": "구성 레이어의 제목 (stdin에 필요)", - "message": "title of the config layer (req'd for stdin)", - "placeholder": null - }, - { - "id": "Get a config layer by name. You may want to pipe the output to a file, or use 'less'", - "translation": "이름으로 구성 레이어를 가져옵니다. 출력을 파일로 파이핑하거나 'less'를 사용할 수 있습니다.", - "message": "Get a config layer by name. You may want to pipe the output to a file, or use 'less'", - "placeholder": null - }, - { - "id": "layer name", - "translation": "레이어 이름", - "message": "layer name", - "placeholder": null - }, - { - "id": "List config layers present in the DB.", - "translation": "DB에 있는 구성 레이어 목록.", - "message": "List config layers present in the DB.", - "placeholder": null - }, - { - "id": "Remove a named config layer.", - "translation": "이름이 지정된 구성 레이어 제거.", - "message": "Remove a named config layer.", - "placeholder": null - }, - { - "id": "Interpret stacked config layers by this version of curio, with system-generated comments.", - "translation": "시스템 생성 주석과 함께 이 버전의 Curio에서 스택된 구성 레이어 해석.", - "message": "Interpret stacked config layers by this version of curio, with system-generated comments.", - "placeholder": null - }, - { - "id": "a list of layers to be interpreted as the final config", - "translation": "최종 구성으로 해석될 레이어 목록", - "message": "a list of layers to be interpreted as the final config", - "placeholder": null - }, - { - "id": "comma or space separated list of layers to be interpreted (base is always applied)", - "translation": "쉼표 또는 공백으로 구분된 해석될 레이어 목록 (base는 항상 적용됨)", - "message": "comma or space separated list of layers to be interpreted (base is always applied)", - "placeholder": null - }, - { - "id": "edit a config layer", - "translation": "구성 레이어 편집", - "message": "edit a config layer", - "placeholder": null - }, - { - "id": "[layer name]", - "translation": "[레이어 이름]", - "message": "[layer name]", - "placeholder": null - }, - { - "id": "editor to use", - "translation": "사용할 편집기", - "message": "editor to use", - "placeholder": null - }, - { - "id": "source config layer", - "translation": "원본 구성 레이어", - "message": "source config layer", - "placeholder": null - }, - { - "id": "allow overwrite of existing layer if source is a different layer", - "translation": "원본이 다른 레이어일 경우 기존 레이어 덮어쓰기 허용", - "message": "allow overwrite of existing layer if source is a different layer", - "placeholder": null - }, - { - "id": "save the whole config into the layer, not just the diff", - "translation": "차이점만이 아니라 전체 구성을 레이어에 저장", - "message": "save the whole config into the layer, not just the diff", - "placeholder": null - }, - { - "id": "do not interpret source layer", - "translation": "원본 레이어 해석하지 않음", - "message": "do not interpret source layer", - "placeholder": null - }, - { - "id": "true if --source is set", - "translation": "--source가 설정된 경우 true", - "message": "true if --source is set", - "placeholder": null - }, - { - "id": "Create new configuration for a new cluster", - "translation": "새 클러스터에 대한 새 구성 생성", - "message": "Create new configuration for a new cluster", - "placeholder": null - }, - { - "id": "[SP actor address...]", - "translation": "[SP 액터 주소...]", - "message": "[SP actor address...]", - "placeholder": null - }, - { - "id": "Manage logging", - "translation": "로깅 관리", - "message": "Manage logging", - "placeholder": null - }, - { - "id": "List log systems", - "translation": "로그 시스템 목록", - "message": "List log systems", - "placeholder": null - }, - { - "id": "Set log level", - "translation": "로그 레벨 설정", - "message": "Set log level", - "placeholder": null - }, - { - "id": "[level]", - "translation": "[레벨]", - "message": "[level]", - "placeholder": null - }, - { - "id": "Set the log level for logging systems:\n\n The system flag can be specified multiple times.\n\n eg) log set-level --system chain --system chainxchg debug\n\n Available Levels:\n debug\n info\n warn\n error\n\n Environment Variables:\n GOLOG_LOG_LEVEL - Default log level for all log systems\n GOLOG_LOG_FMT - Change output log format (json, nocolor)\n GOLOG_FILE - Write logs to file\n GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr", - "translation": "로깅 시스템의 로그 레벨을 설정합니다:\n\n 시스템 플래그는 여러 번 지정할 수 있습니다.\n\n 예) log set-level --system chain --system chainxchg debug\n\n 사용 가능한 레벨:\n debug\n info\n warn\n error\n\n 환경 변수:\n GOLOG_LOG_LEVEL - 모든 로그 시스템의 기본 로그 레벨\n GOLOG_LOG_FMT - 출력 로그 형식 변경 (json, nocolor)\n GOLOG_FILE - 로그를 파일에 기록\n GOLOG_OUTPUT - 출력 위치 지정 (파일, stderr, stdout 또는 조합, 예: file+stderr)", - "message": "Set the log level for logging systems:\n\n The system flag can be specified multiple times.\n\n eg) log set-level --system chain --system chainxchg debug\n\n Available Levels:\n debug\n info\n warn\n error\n\n Environment Variables:\n GOLOG_LOG_LEVEL - Default log level for all log systems\n GOLOG_LOG_FMT - Change output log format (json, nocolor)\n GOLOG_FILE - Write logs to file\n GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr", - "placeholder": null - }, - { - "id": "limit to log system", - "translation": "로그 시스템으로 제한", - "message": "limit to log system", - "placeholder": null - }, - { - "id": "Filecoin decentralized storage network provider", - "translation": "Filecoin 분산 스토리지 네트워크 제공자", - "message": "Filecoin decentralized storage network provider", - "placeholder": null - }, - { - "id": "use color in display output", - "translation": "디스플레이 출력에 색상 사용", - "message": "use color in display output", - "placeholder": null - }, - { - "id": "depends on output being a TTY", - "translation": "출력이 TTY에 의존", - "message": "depends on output being a TTY", - "placeholder": null - }, - { - "id": "Command separated list of hostnames for yugabyte cluster", - "translation": "유가바이트 클러스터의 호스트 이름을 쉼표로 구분한 목록", - "message": "Command separated list of hostnames for yugabyte cluster", - "placeholder": null - }, - { - "id": "enables very verbose mode, useful for debugging the CLI", - "translation": "매우 상세한 모드를 활성화하여 CLI 디버깅에 유용", - "message": "enables very verbose mode, useful for debugging the CLI", - "placeholder": null - }, - { - "id": "Fetch proving parameters", - "translation": "증명 매개변수 가져오기", - "message": "Fetch proving parameters", - "placeholder": null - }, - { - "id": "[sectorSize]", - "translation": "[섹터 크기]", - "message": "[sectorSize]", - "placeholder": null - }, - { - "id": "list of layers to be interpreted (atop defaults). Default: base", - "translation": "해석될 레이어 목록 (기본값 위에). 기본값: base", - "message": "list of layers to be interpreted (atop defaults). Default: base", - "placeholder": null - }, - { - "id": "start sealing a deal sector early", - "translation": "거래 섹터를 조기에 실링 시작", - "message": "start sealing a deal sector early", - "placeholder": null - }, - { - "id": "Specify actor address to start sealing sectors for", - "translation": "실링할 섹터의 액터 주소 지정", - "message": "Specify actor address to start sealing sectors for", - "placeholder": null - }, - { - "id": "Use synthetic PoRep", - "translation": "합성 PoRep 사용", - "message": "Use synthetic PoRep", - "placeholder": null - }, - { - "id": "\u003csector\u003e", - "translation": "\u003c섹터\u003e", - "message": "\u003csector\u003e", - "placeholder": null - }, - { - "id": "Manage the sealing pipeline", - "translation": "실링 파이프라인 관리", - "message": "Manage the sealing pipeline", - "placeholder": null - }, - { - "id": "Start new sealing operations manually", - "translation": "새로운 실링 작업 수동 시작", - "message": "Start new sealing operations manually", - "placeholder": null - }, - { - "id": "Start sealing sectors for all actors now (not on schedule)", - "translation": "모든 액터에 대한 섹터 실링 즉시 시작 (일정에 없음)", - "message": "Start sealing sectors for all actors now (not on schedule)", - "placeholder": null - }, - { - "id": "Start sealing new CC sectors", - "translation": "새 CC 섹터 실링 시작", - "message": "Start sealing new CC sectors", - "placeholder": null - }, - { - "id": "Number of sectors to start", - "translation": "시작할 섹터 수", - "message": "Number of sectors to start", - "placeholder": null - }, - { - "id": "How long to commit sectors for", - "translation": "섹터를 커밋할 기간", - "message": "How long to commit sectors for", - "placeholder": null - }, - { - "id": "1278 (3.5 years)", - "translation": "1278 (3.5년)", - "message": "1278 (3.5 years)", - "placeholder": null - }, - { - "id": "(debug tool) Copy LM sector metadata into Curio DB", - "translation": "(디버그 도구) LM 섹터 메타데이터를 Curio DB로 복사", - "message": "(debug tool) Copy LM sector metadata into Curio DB", - "placeholder": null - }, - { - "id": "Path to miner repo", - "translation": "마이너 저장소 경로", - "message": "Path to miner repo", - "placeholder": null - }, - { - "id": "Ignore sectors that cannot be migrated", - "translation": "이동할 수 없는 섹터 무시", - "message": "Ignore sectors that cannot be migrated", - "placeholder": null - }, - { - "id": "List pipeline events", - "translation": "파이프라인 이벤트 목록", - "message": "List pipeline events", - "placeholder": null - }, - { - "id": "Filter events by actor address; lists all if not specified", - "translation": "액터 주소로 이벤트 필터링; 지정하지 않으면 모든 이벤트를 나열합니다", - "message": "Filter events by actor address; lists all if not specified", - "placeholder": null - }, - { - "id": "Filter events by sector number; requires --actor to be specified", - "translation": "섹터 번호로 이벤트 필터링; --actor 지정 필요", - "message": "Filter events by sector number; requires --actor to be specified", - "placeholder": null - }, - { - "id": "Limit output to the last N events", - "translation": "출력을 마지막 N개의 이벤트로 제한", - "message": "Limit output to the last N events", - "placeholder": null - }, - { - "id": "Start a Curio process", - "translation": "Curio 프로세스 시작", - "message": "Start a Curio process", - "placeholder": null - }, - { - "id": "host address and port the worker api will listen on", - "translation": "작업자 API가 수신 대기할 호스트 주소와 포트", - "message": "host address and port the worker api will listen on", - "placeholder": null - }, - { - "id": "host address and port the gui will listen on", - "translation": "GUI가 수신 대기할 호스트 주소와 포트", - "message": "host address and port the gui will listen on", - "placeholder": null - }, - { - "id": "don't check full-node sync status", - "translation": "풀 노드 동기화 상태 확인 안 함", - "message": "don't check full-node sync status", - "placeholder": null - }, - { - "id": "only run init, then return", - "translation": "init만 실행하고 돌아옴", - "message": "only run init, then return", - "placeholder": null - }, - { - "id": "manage open file limit", - "translation": "열린 파일 제한 관리", - "message": "manage open file limit", - "placeholder": null - }, - { - "id": "custom node name", - "translation": "사용자 지정 노드 이름", - "message": "custom node name", - "placeholder": null - }, - { - "id": "Start Curio web interface", - "translation": "Curio 웹 인터페이스 시작", - "message": "Start Curio web interface", - "placeholder": null - }, - { - "id": "Start an instance of Curio web interface. \n\tThis creates the 'web' layer if it does not exist, then calls run with that layer.", - "translation": "Curio 웹 인터페이스 인스턴스를 시작합니다.\n\t존재하지 않으면 'web' 레이어를 생성하고 해당 레이어로 실행을 호출합니다.", - "message": "Start an instance of Curio web interface. \n\tThis creates the 'web' layer if it does not exist, then calls run with that layer.", - "placeholder": null - }, - { - "id": "Address to listen for the GUI on", - "translation": "GUI가 수신 대기할 주소", - "message": "Address to listen for the GUI on", - "placeholder": null - }, - { - "id": "Stop a running Curio process", - "translation": "실행 중인 Curio 프로세스 중지", - "message": "Stop a running Curio process", - "placeholder": null - }, - { - "id": "manage sector storage", - "translation": "섹터 스토리지 관리", - "message": "manage sector storage", - "placeholder": null - }, - { - "id": "Sectors can be stored across many filesystem paths. These\ncommands provide ways to manage the storage a Curio node will use to store sectors\nlong term for proving (references as 'store') as well as how sectors will be\nstored while moving through the sealing pipeline (references as 'seal').", - "translation": "섹터는 여러 파일 시스템 경로에 걸쳐 저장될 수 있습니다.\n이 명령은 Curio 노드가 섹터를 장기 저장(증명용, 'store'로 참조)하는 스토리지를 관리하는 방법과\n실링 파이프라인을 통해 이동하는 동안 섹터가 어떻게 저장될지를 관리합니다('seal'로 참조).", - "message": "Sectors can be stored across many filesystem paths. These\ncommands provide ways to manage the storage a Curio node will use to store sectors\nlong term for proving (references as 'store') as well as how sectors will be\nstored while moving through the sealing pipeline (references as 'seal').", - "placeholder": null - }, - { - "id": "attach local storage path", - "translation": "로컬 스토리지 경로 연결", - "message": "attach local storage path", - "placeholder": null - }, - { - "id": "[path]", - "translation": "[경로]", - "message": "[path]", - "placeholder": null - }, - { - "id": "Storage can be attached to a Curio node using this command. The storage volume\nlist is stored local to the Curio node in storage.json set in curio run. We do not\nrecommend manually modifying this value without further understanding of the\nstorage system.\n\nEach storage volume contains a configuration file which describes the\ncapabilities of the volume. When the '--init' flag is provided, this file will\nbe created using the additional flags.\n\nWeight\nA high weight value means data will be more likely to be stored in this path\n\nSeal\nData for the sealing process will be stored here\n\nStore\nFinalized sectors that will be moved here for long term storage and be proven\nover time", - "translation": "이 명령을 사용하여 Curio 노드에 스토리지를 연결할 수 있습니다. 스토리지 볼륨 목록은 curio run에 설정된 storage.json에 로컬로 저장됩니다.\n스토리지 시스템에 대한 추가 이해 없이 수동으로 이 값을 수정하는 것은 권장하지 않습니다.\n\n각 스토리지 볼륨에는 볼륨의 기능을 설명하는 구성 파일이 포함되어 있습니다. '--init' 플래그가 제공되면 이 파일은 추가 플래그를 사용하여 생성됩니다.\n\nWeight\n높은 가중치 값은 데이터가 이 경로에 저장될 가능성이 더 높다는 것을 의미합니다\n\nSeal\n실링 프로세스 데이터를 여기에 저장합니다\n\nStore\n완료된 섹터는 장기 저장을 위해 여기로 이동되며 시간이 지남에 따라 증명됩니다", - "message": "Storage can be attached to a Curio node using this command. The storage volume\nlist is stored local to the Curio node in storage.json set in curio run. We do not\nrecommend manually modifying this value without further understanding of the\nstorage system.\n\nEach storage volume contains a configuration file which describes the\ncapabilities of the volume. When the '--init' flag is provided, this file will\nbe created using the additional flags.\n\nWeight\nA high weight value means data will be more likely to be stored in this path\n\nSeal\nData for the sealing process will be stored here\n\nStore\nFinalized sectors that will be moved here for long term storage and be proven\nover time", - "placeholder": null - }, - { - "id": "initialize the path first", - "translation": "경로를 먼저 초기화", - "message": "initialize the path first", - "placeholder": null - }, - { - "id": "(for init) path weight", - "translation": "(초기화용) 경로 가중치", - "message": "(for init) path weight", - "placeholder": null - }, - { - "id": "(for init) use path for sealing", - "translation": "(초기화용) 실링에 경로 사용", - "message": "(for init) use path for sealing", - "placeholder": null - }, - { - "id": "(for init) use path for long-term storage", - "translation": "(초기화용) 장기 저장에 경로 사용", - "message": "(for init) use path for long-term storage", - "placeholder": null - }, - { - "id": "(for init) limit storage space for sectors (expensive for very large paths!)", - "translation": "(초기화용) 섹터에 대한 저장 공간 제한 (매우 큰 경로에서는 비용이 많이 듦!)", - "message": "(for init) limit storage space for sectors (expensive for very large paths!)", - "placeholder": null - }, - { - "id": "path group names", - "translation": "경로 그룹 이름", - "message": "path group names", - "placeholder": null - }, - { - "id": "path groups allowed to pull data from this path (allow all if not specified)", - "translation": "이 경로에서 데이터를 가져올 수 있는 경로 그룹 (지정하지 않으면 모두 허용)", - "message": "path groups allowed to pull data from this path (allow all if not specified)", - "placeholder": null - }, - { - "id": "detach local storage path", - "translation": "로컬 스토리지 경로 분리", - "message": "detach local storage path", - "placeholder": null - }, - { - "id": "list local storage paths", - "translation": "로컬 스토리지 경로 목록", - "message": "list local storage paths", - "placeholder": null - }, - { - "id": "only list local storage paths", - "translation": "로컬 스토리지 경로만 나열", - "message": "only list local storage paths", - "placeholder": null - }, - { - "id": "find sector in the storage system", - "translation": "스토리지 시스템에서 섹터 찾기", - "message": "find sector in the storage system", - "placeholder": null - }, - { - "id": "[miner address] [sector number]", - "translation": "[마이너 주소] [섹터 번호]", - "message": "[miner address] [sector number]", - "placeholder": null - }, - { - "id": "Utility functions for testing", - "translation": "테스트용 유틸리티 기능", - "message": "Utility functions for testing", - "placeholder": null - }, - { - "id": "Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.", - "translation": "섹터에 대한 증명 계산 (섹터가 사전 실링되어야 함). 이는 체인으로 전송되지 않습니다.", - "message": "Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.", - "placeholder": null - }, - { - "id": "Test the windowpost scheduler by running it on the next available curio. If tasks fail all retries, you will need to ctrl+c to exit.", - "translation": "다음 사용 가능한 Curio에서 windowpost 스케줄러를 실행하여 테스트합니다. 모든 재시도가 실패하면 ctrl+c를 눌러 종료해야 합니다.", - "message": "Test the windowpost scheduler by running it on the next available curio. If tasks fail all retries, you will need to ctrl+c to exit.", - "placeholder": null - }, - { - "id": "deadline to compute WindowPoSt for", - "translation": "WindowPoSt를 계산할 기한", - "message": "deadline to compute WindowPoSt for", - "placeholder": null - }, - { - "id": "Compute WindowPoSt for performance and configuration testing.", - "translation": "성능 및 구성 테스트를 위한 WindowPoSt 계산.", - "message": "Compute WindowPoSt for performance and configuration testing.", - "placeholder": null - }, - { - "id": "Note: This command is intended to be used to verify PoSt compute performance.\nIt will not send any messages to the chain. Since it can compute any deadline, output may be incorrectly timed for the chain.", - "translation": "참고: 이 명령은 PoSt 계산 성능을 검증하기 위해 사용됩니다.\n체인으로 메시지를 전송하지 않습니다. 모든 기한을 계산할 수 있으므로 출력이 체인과 부정확하게 일치할 수 있습니다.", - "message": "Note: This command is intended to be used to verify PoSt compute performance.\nIt will not send any messages to the chain. Since it can compute any deadline, output may be incorrectly timed for the chain.", - "placeholder": null - }, - { - "id": "[deadline index]", - "translation": "[기한 인덱스]", - "message": "[deadline index]", - "placeholder": null - }, - { - "id": "path to json file containing storage config", - "translation": "스토리지 구성 파일이 포함된 JSON 파일의 경로", - "message": "path to json file containing storage config", - "placeholder": null - }, - { - "id": "partition to compute WindowPoSt for", - "translation": "WindowPoSt를 계산할 파티션", - "message": "partition to compute WindowPoSt for", - "placeholder": null - }, - { - "id": "Failed to generate the libp2p private key.", - "translation": "libp2p 개인 키 생성 실패.", - "message": "Failed to generate the libp2p private key.", - "placeholder": null - }, - { - "id": "Failed to generate miner ID from address.", - "translation": "주소에서 마이너 ID 생성 실패.", - "message": "Failed to generate miner ID from address.", - "placeholder": null - }, - { - "id": "Failed to insert libp2p private key into database. Please run 'curio market libp2p generate-key minerID' to complete the migration.", - "translation": "libp2p 개인 키를 데이터베이스에 삽입하지 못했습니다. 마이그레이션을 완료하려면 'curio market libp2p generate-key minerID'를 실행하십시오.", - "message": "Failed to insert libp2p private key into database. Please run 'curio market libp2p generate-key minerID' to complete the migration.", - "placeholder": null - }, - { - "id": "New libp2p key was not created", - "translation": "새 libp2p 키가 생성되지 않았습니다.", - "message": "New libp2p key was not created", - "placeholder": null - }, - { - "id": "More than 1 row was affected in the 'libp2p' table when creating new libp2p key.", - "translation": "'libp2p' 테이블에서 새 libp2p 키를 생성할 때 1개 이상의 행이 영향을 받았습니다.", - "message": "More than 1 row was affected in the 'libp2p' table when creating new libp2p key.", - "placeholder": null - }, - { - "id": "Failed to marshal libp2p private key.", - "translation": "libp2p 개인 키 마샬링에 실패했습니다.", - "message": "Failed to marshal libp2p private key.", - "placeholder": null - }, - { - "id": "generate ipni chunks from a file", - "translation": "파일에서 IPNI 청크 생성", - "message": "generate ipni chunks from a file", - "placeholder": null - }, - { - "id": "Add URL to fetch data for offline deals", - "translation": "오프라인 거래 데이터를 가져올 URL 추가", - "message": "Add URL to fetch data for offline deals", - "placeholder": null - }, - { - "id": "CSV file location to use for multiple deal input. Each line in the file should be in the format 'uuid,raw size,url,header1,header2...'", - "translation": "여러 거래 입력에 사용할 CSV 파일 위치. 파일의 각 행은 'uuid, 원시 크기, url, header1, header2...' 형식이어야 합니다.", - "message": "CSV file location to use for multiple deal input. Each line in the file should be in the format 'uuid,raw size,url,header1,header2...'", - "placeholder": null - }, - { - "id": "Custom `HEADER` to include in the HTTP request", - "translation": "HTTP 요청에 포함할 사용자 정의 `HEADER`", - "message": "Custom `HEADER` to include in the HTTP request", - "placeholder": null - }, - { - "id": "`URL` to send the request to", - "translation": "요청을 보낼 `URL`", - "message": "`URL` to send the request to", - "placeholder": null - }, - { - "id": "Moves funds from the deal collateral wallet into escrow with the storage market actor", - "translation": "거래 담보 지갑에서 자금을 스토리지 시장 액터의 에스크로로 이동", - "message": "Moves funds from the deal collateral wallet into escrow with the storage market actor", - "placeholder": null - }, - { - "id": "maximum fee in FIL user is willing to pay for this message", - "translation": "사용자가 이 메시지에 대해 지불하려는 FIL의 최대 수수료", - "message": "maximum fee in FIL user is willing to pay for this message", - "placeholder": null - }, - { - "id": "Specify wallet address to send the funds from", - "translation": "자금을 보낼 지갑 주소 지정", - "message": "Specify wallet address to send the funds from", - "placeholder": null - }, - { - "id": "Collection of debugging utilities", - "translation": "디버깅 유틸리티 모음", - "message": "Collection of debugging utilities", - "placeholder": null - }, - { - "id": "Manage unsealed data", - "translation": "미봉인 데이터를 관리", - "message": "Manage unsealed data", - "placeholder": null - }, - { - "id": "Get information about unsealed data", - "translation": "미봉인 데이터에 대한 정보 가져오기", - "message": "Get information about unsealed data", - "placeholder": null - }, - { - "id": "List data from the sectors_unseal_pipeline and sectors_meta tables", - "translation": "sectors_unseal_pipeline 및 sectors_meta 테이블의 데이터 나열", - "message": "List data from the sectors_unseal_pipeline and sectors_meta tables", - "placeholder": null - }, - { - "id": "Filter by storage provider ID", - "translation": "스토리지 제공자 ID로 필터링", - "message": "Filter by storage provider ID", - "placeholder": null - }, - { - "id": "Output file path (default: stdout)", - "translation": "출력 파일 경로 (기본값: 표준 출력)", - "message": "Output file path (default: stdout)", - "placeholder": null - }, - { - "id": "Set the target unseal state for a sector", - "translation": "섹터의 목표 미봉인 상태 설정", - "message": "Set the target unseal state for a sector", - "placeholder": null - }, - { - "id": "Set the target unseal state for a specific sector.\n \u003cminer-id\u003e: The storage provider ID\n \u003csector-number\u003e: The sector number\n \u003ctarget-state\u003e: The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.", - "translation": "특정 섹터의 목표 미봉인 상태를 설정합니다.\n \u003cminer-id\u003e: 스토리지 제공자 ID\n \u003csector-number\u003e: 섹터 번호\n \u003ctarget-state\u003e: 목표 상태 (true, false, none 중 하나)\n\n 미봉인 목표 상태는 Curio가 섹터의 미봉인 복사본을 어떻게 유지할지를 나타냅니다.\n\t 목표 상태가 true이면 Curio는 섹터가 미봉인 상태로 유지되도록 보장합니다.\n\t 목표 상태가 false이면 Curio는 섹터에 미봉인 복사본이 없도록 보장합니다.\n\t 목표 상태가 none이면 Curio는 섹터의 현재 상태를 변경하지 않습니다.\n\n 현재, 목표 상태가 다른 상태에서 true로 변경될 때만 Curio는 새로운 미봉인 프로세스를 시작합니다.\n\n 목표 상태가 false이고 미봉인 섹터 파일이 존재하는 경우, GC 마크 단계는 미봉인 섹터 파일에 대한 제거 마크를 생성합니다. 파일은 제거 마크가 승인된 후에만 제거됩니다.", - "message": "Set the target unseal state for a specific sector.\n \u003cminer-id\u003e: The storage provider ID\n \u003csector-number\u003e: The sector number\n \u003ctarget-state\u003e: The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.", - "placeholder": null - }, - { - "id": "Check data integrity in unsealed sector files", - "translation": "미봉인 섹터 파일의 데이터 무결성 확인", - "message": "Check data integrity in unsealed sector files", - "placeholder": null - }, - { - "id": "Create a check task for a specific sector, wait for its completion, and output the result.\n \u003cminer-id\u003e: The storage provider ID\n \u003csector-number\u003e: The sector number", - "translation": "특정 섹터에 대한 검사 작업을 생성하고 완료를 기다린 후 결과를 출력합니다.\n \u003cminer-id\u003e: 스토리지 제공자 ID\n \u003csector-number\u003e: 섹터 번호", - "message": "Create a check task for a specific sector, wait for its completion, and output the result.\n \u003cminer-id\u003e: The storage provider ID\n \u003csector-number\u003e: The sector number", - "placeholder": null - }, - { - "id": "Cordon a machine, set it to maintenance mode", - "translation": "노드를 격리하고 유지 보수 모드로 설정", - "message": "Cordon a machine, set it to maintenance mode", - "placeholder": null - }, - { - "id": "Uncordon a machine, resume scheduling", - "translation": "노드 격리를 해제하고 스케줄링 재개", - "message": "Uncordon a machine, resume scheduling", - "placeholder": null - }, - { - "id": "Get Curio node info", - "translation": "Curio 노드 정보 가져오기", - "message": "Get Curio node info", - "placeholder": null - }, - { - "id": "generate vanilla proof for a sector", - "translation": "섹터에 대한 바닐라 증명 생성", - "message": "generate vanilla proof for a sector", - "placeholder": null - }, - { - "id": "SP ID to compute WindowPoSt for", - "translation": "WindowPoSt 계산을 위한 SP ID", - "message": "SP ID to compute WindowPoSt for", - "placeholder": null - }, - { - "id": "redeclare sectors in a local storage path", - "translation": "로컬 스토리지 경로에서 섹터를 다시 선언", - "message": "redeclare sectors in a local storage path", - "placeholder": null - }, - { - "id": "--machine flag in cli command should point to the node where storage to redeclare is attached", - "translation": "CLI 명령의 --machine 플래그는 다시 선언할 스토리지가 연결된 노드를 가리켜야 합니다", - "message": "--machine flag in cli command should point to the node where storage to redeclare is attached", - "placeholder": null - }, - { - "id": "Create a new offline verified DDO deal for Curio", - "translation": "Curio에 대한 새로운 오프라인 검증된 DDO 거래를 생성합니다.", - "message": "Create a new offline verified DDO deal for Curio", - "placeholder": null - }, - { - "id": "Specify actor address for the deal", - "translation": "거래에 사용할 액터 주소를 지정하세요.", - "message": "Specify actor address for the deal", - "placeholder": null - }, - { - "id": "Remove unsealed copies of sector containing this deal", - "translation": "이 거래를 포함하는 섹터의 봉인되지 않은 복사본을 제거합니다.", - "message": "Remove unsealed copies of sector containing this deal", - "placeholder": null - }, - { - "id": "indicates that deal index should not be announced to the IPNI", - "translation": "거래 인덱스가 IPNI에 발표되지 않아야 함을 나타냅니다.", - "message": "indicates that deal index should not be announced to the IPNI", - "placeholder": null - }, - { - "id": "start epoch by when the deal should be proved by provider on-chain (default: 2 days from now)", - "translation": "거래가 제공업체에 의해 온체인에서 입증되어야 하는 시작 에포크입니다. (기본값: 현재로부터 2일 후)", - "message": "start epoch by when the deal should be proved by provider on-chain (default: 2 days from now)", - "placeholder": null - }, - { - "id": "Provides a sample of CIDs from an indexed piece", - "translation": "색인된 조각에서 CID 샘플을 제공합니다.", - "message": "Provides a sample of CIDs from an indexed piece", - "placeholder": null - }, - { - "id": "piece-cid", - "translation": "조각 CID", - "message": "piece-cid", - "placeholder": null - }, - { - "id": "output in json format", - "translation": "JSON 형식으로 출력", - "message": "output in json format", - "placeholder": null - }, - { - "id": "Name of the Postgres database in Yugabyte cluster", - "translation": "Yugabyte 클러스터의 Postgres 데이터베이스 이름", - "message": "Name of the Postgres database in Yugabyte cluster", - "placeholder": null - }, - { - "id": "Username for connecting to the Postgres database in Yugabyte cluster", - "translation": "Yugabyte 클러스터의 Postgres 데이터베이스에 연결하기 위한 사용자 이름", - "message": "Username for connecting to the Postgres database in Yugabyte cluster", - "placeholder": null - }, - { - "id": "Password for connecting to the Postgres database in Yugabyte cluster", - "translation": "Yugabyte 클러스터의 Postgres 데이터베이스에 연결하기 위한 비밀번호", - "message": "Password for connecting to the Postgres database in Yugabyte cluster", - "placeholder": null - }, - { - "id": "Port for connecting to the Postgres database in Yugabyte cluster", - "translation": "Yugabyte 클러스터의 Postgres 데이터베이스에 연결하기 위한 포트", - "message": "Port for connecting to the Postgres database in Yugabyte cluster", - "placeholder": null - }, - { - "id": "Port for connecting to the Cassandra database in Yugabyte cluster", - "translation": "Yugabyte 클러스터의 Cassandra 데이터베이스에 연결하기 위한 포트", - "message": "Port for connecting to the Cassandra database in Yugabyte cluster", - "placeholder": null - }, - { - "id": "Enable load balancing for connecting to the Postgres database in Yugabyte cluster", - "translation": "Yugabyte 클러스터의 Postgres 데이터베이스에 연결할 때 로드 밸런싱을 활성화하세요", - "message": "Enable load balancing for connecting to the Postgres database in Yugabyte cluster", - "placeholder": null - }, - { - "id": "Tool Box for Curio", - "translation": "Curio 도구 상자", - "message": "Tool Box for Curio", - "placeholder": null - }, - { - "id": "Updated DB with message data missing from chain node", - "translation": "체인 노드에서 누락된 메시지 데이터를 사용하여 데이터베이스를 업데이트함", - "message": "Updated DB with message data missing from chain node", - "placeholder": null - }, - { - "id": "Update data for messages in wait queue", - "translation": "대기 큐에 있는 메시지의 데이터를 업데이트", - "message": "Update data for messages in wait queue", - "placeholder": null - }, - { - "id": "Deposit FIL into the Router contract (client)", - "translation": "Router 컨트랙트(클라이언트)에 FIL 입금", - "message": "Deposit FIL into the Router contract (client)", - "placeholder": null - }, - { - "id": "Sender address", - "translation": "보낸 사람 주소", - "message": "Sender address", - "placeholder": null - }, - { - "id": "Amount in FIL", - "translation": "금액(FIL)", - "message": "Amount in FIL", - "placeholder": null - }, - { - "id": "Initiate a withdrawal request from the client's deposit", - "translation": "클라이언트 예치금에서 출금 요청 시작", - "message": "Initiate a withdrawal request from the client's deposit", - "placeholder": null - }, - { - "id": "Client sender address", - "translation": "클라이언트 송신자 주소", - "message": "Client sender address", - "placeholder": null - }, - { - "id": "Withdrawal amount (in FIL)", - "translation": "출금 금액(FIL)", - "message": "Withdrawal amount (in FIL)", - "placeholder": null - }, - { - "id": "Complete a pending client withdrawal after the withdrawal window elapses", - "translation": "출금 창이 경과한 후 대기 중인 클라이언트 출금을 완료", - "message": "Complete a pending client withdrawal after the withdrawal window elapses", - "placeholder": null - }, - { - "id": "Cancel a pending client withdrawal request", - "translation": "대기 중인 클라이언트 출금 요청 취소", - "message": "Cancel a pending client withdrawal request", - "placeholder": null - }, - { - "id": "Redeem a client voucher (service role)", - "translation": "클라이언트 바우처 상환(서비스 역할)", - "message": "Redeem a client voucher (service role)", - "placeholder": null - }, - { - "id": "Service sender address", - "translation": "서비스 송신자 주소", - "message": "Service sender address", - "placeholder": null - }, - { - "id": "Client actor", - "translation": "클라이언트 액터", - "message": "Client actor", - "placeholder": null - }, - { - "id": "Cumulative amount (FIL)", - "translation": "누적 금액(FIL)", - "message": "Cumulative amount (FIL)", - "placeholder": null - }, - { - "id": "Voucher nonce", - "translation": "바우처 논스", - "message": "Voucher nonce", - "placeholder": null - }, - { - "id": "Voucher signature (hex)", - "translation": "바우처 서명(16진수)", - "message": "Voucher signature (hex)", - "placeholder": null - }, - { - "id": "Redeem a provider voucher (provider role)", - "translation": "프로바이더 바우처 상환(프로바이더 역할)", - "message": "Redeem a provider voucher (provider role)", - "placeholder": null - }, - { - "id": "Provider sender address", - "translation": "프로바이더 송신자 주소", - "message": "Provider sender address", - "placeholder": null - }, - { - "id": "Provider actor", - "translation": "프로바이더 액터", - "message": "Provider actor", - "placeholder": null - }, - { - "id": "Initiate a withdrawal request from the service pool", - "translation": "서비스 풀에서 출금 요청 시작", - "message": "Initiate a withdrawal request from the service pool", - "placeholder": null - }, - { - "id": "Complete a pending service withdrawal after the withdrawal window elapses", - "translation": "출금 창이 경과한 후 대기 중인 서비스 출금을 완료", - "message": "Complete a pending service withdrawal after the withdrawal window elapses", - "placeholder": null - }, - { - "id": "Cancel a pending service withdrawal request", - "translation": "대기 중인 서비스 출금 요청 취소", - "message": "Cancel a pending service withdrawal request", - "placeholder": null - }, - { - "id": "Deposit funds into the service pool (service role)", - "translation": "서비스 풀에 자금 입금(서비스 역할)", - "message": "Deposit funds into the service pool (service role)", - "placeholder": null - }, - { - "id": "Amount to deposit (FIL)", - "translation": "입금 금액(FIL)", - "message": "Amount to deposit (FIL)", - "placeholder": null - }, - { - "id": "Query the state of a client", - "translation": "클라이언트 상태 조회", - "message": "Query the state of a client", - "placeholder": null - }, - { - "id": "Client actor address", - "translation": "클라이언트 액터 주소", - "message": "Client actor address", - "placeholder": null - }, - { - "id": "Query the state of a provider", - "translation": "프로바이더 상태 조회", - "message": "Query the state of a provider", - "placeholder": null - }, - { - "id": "Provider actor address", - "translation": "프로바이더 액터 주소", - "message": "Provider actor address", - "placeholder": null - }, - { - "id": "Query the service state", - "translation": "서비스 상태 조회", - "message": "Query the service state", - "placeholder": null - }, - { - "id": "Create a client voucher", - "translation": "클라이언트 바우처 생성", - "message": "Create a client voucher", - "placeholder": null - }, - { - "id": "Amount to redeem (FIL)", - "translation": "상환할 금액(FIL)", - "message": "Amount to redeem (FIL)", - "placeholder": null - }, - { - "id": "Create a provider voucher", - "translation": "프로바이더 바우처 생성", - "message": "Create a provider voucher", - "placeholder": null - }, - { - "id": "Propose a new service actor", - "translation": "새 서비스 액터 제안", - "message": "Propose a new service actor", - "placeholder": null - }, - { - "id": "New service actor address", - "translation": "새 서비스 액터 주소", - "message": "New service actor address", - "placeholder": null - }, - { - "id": "Accept a proposed service actor", - "translation": "제안된 서비스 액터 수락", - "message": "Accept a proposed service actor", - "placeholder": null - }, - { - "id": "Validate a client voucher signature", - "translation": "클라이언트 바우처 서명 검증", - "message": "Validate a client voucher signature", - "placeholder": null - }, - { - "id": "Validate a provider voucher signature", - "translation": "프로바이더 바우처 서명 검증", - "message": "Validate a provider voucher signature", - "placeholder": null - }, - { - "id": "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.", - "translation": "이 대화형 도구는 PDP, Snark 시장 등과 같은 프로토콜을 위한 비 SP 클러스터를 설정합니다.", - "message": "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.", - "placeholder": null - }, - { - "id": "This setup does not create or migrate a Filecoin SP actor.", - "translation": "이 설정은 Filecoin SP 액터를 생성하거나 마이그레이션하지 않습니다.", - "message": "This setup does not create or migrate a Filecoin SP actor.", - "placeholder": null - }, - { - "id": "Setup non-Storage Provider cluster", - "translation": "비 SP 클러스터 설정", - "message": "Setup non-Storage Provider cluster", - "placeholder": null - }, - { - "id": "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration", - "translation": "가이드 설정을 다시 실행하지 마십시오. 구성을 완료하려면 'curio config new-cluster'를 수동으로 실행해야 합니다.", - "message": "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration", - "placeholder": null - }, - { - "id": "Non-SP cluster configuration created successfully", - "translation": "비 SP 클러스터 구성이 성공적으로 생성되었습니다", - "message": "Non-SP cluster configuration created successfully", - "placeholder": null - }, - { - "id": "Non-SP cluster configuration complete", - "translation": "비 SP 클러스터 구성 완료", - "message": "Non-SP cluster configuration complete", - "placeholder": null - }, - { - "id": "Non-SP cluster setup complete!", - "translation": "비 SP 클러스터 설정 완료!", - "message": "Non-SP cluster setup complete!", - "placeholder": null - }, - { - "id": "Your non-SP cluster has been configured successfully.", - "translation": "비 SP 클러스터가 성공적으로 구성되었습니다.", - "message": "Your non-SP cluster has been configured successfully.", - "placeholder": null - }, - { - "id": "You can now start using Curio for protocols like PDP, Snark markets, and others.", - "translation": "이제 PDP, Snark 시장 등과 같은 프로토콜에서 Curio를 사용할 수 있습니다.", - "message": "You can now start using Curio for protocols like PDP, Snark markets, and others.", - "placeholder": null - }, - { - "id": "To start the cluster, run: curio run --layers basic-cluster", - "translation": "클러스터를 시작하려면 실행하세요: curio run --layers basic-cluster", - "message": "To start the cluster, run: curio run --layers basic-cluster", - "placeholder": null - }, - { - "id": "Failed to get API info for FullNode: {Error}", - "translation": "FullNode의 API 정보를 가져오지 못했습니다: {Error}", - "message": "Failed to get API info for FullNode: {Error}", - "placeholder": null - }, - { - "id": "Failed to create auth token: {Error}", - "translation": "인증 토큰을 생성하지 못했습니다: {Error}", - "message": "Failed to create auth token: {Error}", - "placeholder": null - }, - { - "id": "Failed to insert config into database: {Error}", - "translation": "데이터베이스에 구성 정보를 삽입하지 못했습니다: {Error}", - "message": "Failed to insert config into database: {Error}", - "placeholder": null + "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 + }, + { + "id": "This interactive tool creates a new miner actor and creates the basic configuration layer for it.", + "translation": "이 대화형 도구는 새로운 채굴자 액터를 생성하고 그에 대한 기본 구성 레이어를 생성합니다.", + "message": "This interactive tool creates a new miner actor and creates the basic configuration layer for it.", + "placeholder": null + }, + { + "id": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster {Arg_1}' to finish the configuration.", + "translation": "이 프로세스는 부분적으로 idempotent합니다. 새로운 채굴자 액터가 생성되었고 후속 단계가 실패하면 사용자는 구성을 완료하기 위해 'curio config new-cluster {Arg_1}'를 실행해야 합니다.", + "message": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster {Arg_1}' to finish the configuration.", + "placeholder": null + }, + { + "id": "Choose if you with to create a new miner or migrate from existing Lotus-Miner", + "translation": "새 채굴자를 생성할지 기존의 Lotus-Miner에서 이전할지 선택하세요.", + "message": "Choose if you with to create a new miner or migrate from existing Lotus-Miner", + "placeholder": null + }, + { + "id": "Migrate from existing Lotus-Miner", + "translation": "기존의 Lotus-Miner에서 이전하기", + "message": "Migrate from existing Lotus-Miner", + "placeholder": null + }, + { + "id": "Create a new miner", + "translation": "새로운 채굴자 생성", + "message": "Create a new miner", + "placeholder": null + }, + { + "id": "New Miner initialization complete.", + "translation": "새로운 채굴자 초기화 완료.", + "message": "New Miner initialization complete.", + "placeholder": null + }, + { + "id": "Migrating lotus-miner config.toml to Curio in-database configuration.", + "translation": "lotus-miner config.toml을 Curio의 데이터베이스 구성으로 이전 중입니다.", + "message": "Migrating lotus-miner config.toml to Curio in-database configuration.", + "placeholder": null + }, + { + "id": "Error getting API: {Error}", + "translation": "API 가져오기 오류: {Error}", + "message": "Error getting API: {Error}", + "placeholder": null + }, + { + "id": "The Curio team wants to improve the software you use. Tell the team you're using {Curio}.", + "translation": "Curio 팀은 당신이 사용하는 소프트웨어를 개선하고자 합니다. 팀에게 {Curio}를 사용 중이라고 알려주세요.", + "message": "The Curio team wants to improve the software you use. Tell the team you're using {Curio}.", + "placeholder": null + }, + { + "id": "Individual Data: Miner ID, Curio version, chain ({Mainnet} or {Calibration}). Signed.", + "translation": "개별 데이터: 채굴자 ID, Curio 버전, 체인 ({Mainnet} 또는 {Calibration}). 서명됨.", + "message": "Individual Data: Miner ID, Curio version, chain ({Mainnet} or {Calibration}). Signed.", + "placeholder": null + }, + { + "id": "Aggregate-Anonymous: version, chain, and Miner power (bucketed).", + "translation": "집계-익명: 버전, 체인, 및 채굴자 파워 (버킷).", + "message": "Aggregate-Anonymous: version, chain, and Miner power (bucketed).", + "placeholder": null + }, + { + "id": "Hint: I am someone running Curio on whichever chain.", + "translation": "힌트: 나는 어떤 체인에서든 Curio를 실행 중인 사람입니다.", + "message": "Hint: I am someone running Curio on whichever chain.", + "placeholder": null + }, + { + "id": "Press return to update {Toml} with Yugabyte info. A Backup file will be written to that folder before changes are made.", + "translation": "{Toml}을 Yugabyte 정보로 업데이트하려면 리턴 키를 누르세요. 변경 사항을 적용하기 전에 해당 폴더에 백업 파일이 작성됩니다.", + "message": "Press return to update {Toml} with Yugabyte info. A Backup file will be written to that folder before changes are made.", + "placeholder": null + }, + { + "id": "Error creating backup file: {Error}", + "translation": "백업 파일 생성 오류: {Error}", + "message": "Error creating backup file: {Error}", + "placeholder": null + }, + { + "id": "Error reading config.toml: {Error}", + "translation": "config.toml 읽기 오류: {Error}", + "message": "Error reading config.toml: {Error}", + "placeholder": null + }, + { + "id": "Error writing backup file: {Error}", + "translation": "백업 파일 쓰기 오류: {Error}", + "message": "Error writing backup file: {Error}", + "placeholder": null + }, + { + "id": "Error closing backup file: {Error}", + "translation": "백업 파일 닫기 오류: {Error}", + "message": "Error closing backup file: {Error}", + "placeholder": null + }, + { + "id": "Initializing a new miner actor.", + "translation": "새 채굴자 액터 초기화 중.", + "message": "Initializing a new miner actor.", + "placeholder": null + }, + { + "id": "Enter the info to create a new miner", + "translation": "새 채굴자를 생성하기 위한 정보 입력", + "message": "Enter the info to create a new miner", + "placeholder": null + }, + { + "id": "Owner Address: {String}", + "translation": "소유자 주소: {String}", + "message": "Owner Address: {String}", + "placeholder": null + }, + { + "id": "Worker Address: {String}", + "translation": "작업자 주소: {String}", + "message": "Worker Address: {String}", + "placeholder": null + }, + { + "id": "Sender Address: {String}", + "translation": "송신자 주소: {String}", + "message": "Sender Address: {String}", + "placeholder": null + }, + { + "id": "Sector Size: {Ssize}", + "translation": "섹터 크기: {Ssize}", + "message": "Sector Size: {Ssize}", + "placeholder": null + }, + { + "id": "Confidence: {Confidence}", + "translation": "신뢰도: {Confidence}", + "message": "Confidence: {Confidence}", + "placeholder": null + }, + { + "id": "Continue to verify the addresses and create a new miner actor.", + "translation": "주소를 확인하고 새 채굴자 액터를 생성하려면 계속 진행하세요.", + "message": "Continue to verify the addresses and create a new miner actor.", + "placeholder": null + }, + { + "id": "Miner creation error occurred: {Error}", + "translation": "채굴자 생성 오류 발생: {Error}", + "message": "Miner creation error occurred: {Error}", + "placeholder": null + }, + { + "id": "Enter the owner address", + "translation": "소유자 주소 입력", + "message": "Enter the owner address", + "placeholder": null + }, + { + "id": "No address provided", + "translation": "주소가 제공되지 않았습니다", + "message": "No address provided", + "placeholder": null + }, + { + "id": "Failed to parse the address: {Error}", + "translation": "주소 구문 분석 실패: {Error}", + "message": "Failed to parse the address: {Error}", + "placeholder": null + }, + { + "id": "Enter {Stringworker_senderi_1} address", + "translation": "{Stringworker_senderi_1} 주소 입력", + "message": "Enter {Stringworker_senderi_1} address", + "placeholder": null + }, + { + "id": "Enter the sector size", + "translation": "섹터 크기 입력", + "message": "Enter the sector size", + "placeholder": null + }, + { + "id": "Failed to parse sector size: {Error}", + "translation": "섹터 크기 구문 분석 실패: {Error}", + "message": "Failed to parse sector size: {Error}", + "placeholder": null + }, + { + "id": "Enter the confidence", + "translation": "신뢰도 입력", + "message": "Enter the confidence", + "placeholder": null + }, + { + "id": "Failed to parse confidence: {Error}", + "translation": "신뢰도 구문 분석 실패: {Error}", + "message": "Failed to parse confidence: {Error}", + "placeholder": null + }, + { + "id": "Failed to create the miner actor: {Error}", + "translation": "채굴자 액터 생성 실패: {Error}", + "message": "Failed to create the miner actor: {Error}", + "placeholder": null + }, + { + "id": "Miner {String} created successfully", + "translation": "{String} 채굴자가 성공적으로 생성되었습니다", + "message": "Miner {String} created successfully", + "placeholder": null + }, + { + "id": "Cannot reach the DB: {Error}", + "translation": "데이터베이스에 연결할 수 없습니다: {Error}", + "message": "Cannot reach the DB: {Error}", + "placeholder": null + }, + { + "id": "Error connecting to full node API: {Error}", + "translation": "풀 노드 API에 연결하는 중 오류 발생: {Error}", + "message": "Error connecting to full node API: {Error}", + "placeholder": null + }, + { + "id": "Pre-initialization steps complete", + "translation": "사전 초기화 단계 완료", + "message": "Pre-initialization steps complete", + "placeholder": null + }, + { + "id": "Failed to random bytes for secret: {Error}", + "translation": "비밀을 위한 랜덤 바이트 생성 실패: {Error}", + "message": "Failed to random bytes for secret: {Error}", + "placeholder": null + }, + { + "id": "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster {String}' to finish the configuration", + "translation": "마이너 생성은 idempotent하지 않으므로 가이드 설정을 다시 실행하지 마십시오. 구성을 완료하려면 'curio config new-cluster {String}'를 실행해야 합니다.", + "message": "Please do not run guided-setup again as miner creation is not idempotent. You need to run 'curio config new-cluster {String}' to finish the configuration", + "placeholder": null + }, + { + "id": "Failed to verify the auth token from daemon node: {Error}", + "translation": "데몬 노드로부터 인증 토큰을 확인하는 중 오류 발생: {Error}", + "message": "Failed to verify the auth token from daemon node: {Error}", + "placeholder": null + }, + { + "id": "Failed to encode the config: {Error}", + "translation": "구성을 인코딩하는 중 오류 발생: {Error}", + "message": "Failed to encode the config: {Error}", + "placeholder": null + }, + { + "id": "Failed to generate default config: {Error}", + "translation": "기본 구성 생성 실패: {Error}", + "message": "Failed to generate default config: {Error}", + "placeholder": null + }, + { + "id": "Failed to inset 'base' config layer in database: {Error}", + "translation": "데이터베이스에 'base' 구성 레이어 삽입 실패: {Error}", + "message": "Failed to inset 'base' config layer in database: {Error}", + "placeholder": null + }, + { + "id": "Failed to inset '{String}' config layer in database: {Error}", + "translation": "데이터베이스에 '{String}' 구성 레이어 삽입 실패: {Error}", + "message": "Failed to inset '{String}' config layer in database: {Error}", + "placeholder": null + }, + { + "id": "New Curio configuration layer '{String}' created", + "translation": "새로운 Curio 구성 레이어 '{String}'가 생성되었습니다", + "message": "New Curio configuration layer '{String}' created", + "placeholder": null + }, + { + "id": "The Curio team wants to improve the software you use. Tell the team you're using `{Curio}`.", + "translation": "Curio 팀은 당신이 사용하는 소프트웨어를 개선하고자 합니다. 팀에게 `{Curio}`를 사용 중이라고 알려주세요.", + "message": "The Curio team wants to improve the software you use. Tell the team you're using `{Curio}`.", + "placeholder": null + }, + { + "id": "Confidence epochs: {Confidence}", + "translation": "신뢰 에포크: {Confidence}", + "message": "Confidence epochs: {Confidence}", + "placeholder": null + }, + { + "id": "Failed to generate random bytes for secret: {Error}", + "translation": "비밀번호를 위한 랜덤 바이트 생성에 실패했습니다: {Error}", + "message": "Failed to generate random bytes for secret: {Error}", + "placeholder": null + }, + { + "id": "Failed to get API info for FullNode: {Err}", + "translation": "FullNode에 대한 API 정보를 가져오는 데 실패했습니다: {Err}", + "message": "Failed to get API info for FullNode: {Err}", + "placeholder": null + }, + { + "id": "Failed to insert 'base' config layer in database: {Error}", + "translation": "데이터베이스에 'base' 구성 레이어를 삽입하는 데 실패했습니다: {Error}", + "message": "Failed to insert 'base' config layer in database: {Error}", + "placeholder": null + }, + { + "id": "Failed to insert '{String}' config layer in database: {Error}", + "translation": "데이터베이스에 '{String}' 구성 레이어를 삽입하는 데 실패했습니다: {Error}", + "message": "Failed to insert '{String}' config layer in database: {Error}", + "placeholder": null + }, + { + "id": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.", + "translation": "이 프로세스는 부분적으로 항등원적입니다. 새로운 채굴자 액터가 생성되었고 후속 단계가 실패하는 경우 사용자는 구성을 완료하기 위해 'curio config new-cluster < 채굴자 ID >'를 실행해야 합니다.", + "message": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.", + "placeholder": null + }, + { + "id": "Confidence epochs", + "translation": "신뢰 에포크", + "message": "Confidence epochs", + "placeholder": null + }, + { + "id": "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'", + "translation": "신뢰성 향상을 위한 중복성 사용: 적어도 post 레이어를 사용하여 여러 대의 기계를 시작하십시오: 'curio run --layers=post'", + "message": "Increase reliability using redundancy: start multiple machines with at-least the post layer: 'curio run --layers=post'", + "placeholder": null + }, + { + "id": "I want to:", + "translation": "나는 원한다:", + "message": "I want to:", + "placeholder": null + }, + { + "id": "Configuration 'base' was updated to include this miner's address", + "translation": "이 마이너 주소를 포함한 구성 'base'가 업데이트되었습니다.", + "message": "Configuration 'base' was updated to include this miner's address", + "placeholder": null + }, + { + "id": "Cannot load base config: {Error}", + "translation": "기본 구성을 불러올 수 없습니다: {Error}", + "message": "Cannot load base config: {Error}", + "placeholder": null + }, + { + "id": "Failed to load base config: {Error}", + "translation": "기본 구성을 로드하는 데 실패했습니다: {Error}", + "message": "Failed to load base config: {Error}", + "placeholder": null + }, + { + "id": "Failed to regenerate base config: {Error}", + "translation": "기본 구성을 재생성하는 데 실패했습니다: {Error}", + "message": "Failed to regenerate base config: {Error}", + "placeholder": null + }, + { + "id": "Failed to load base config from database: {Error}", + "translation": "데이터베이스에서 기본 구성을 로드하는 데 실패했습니다: {Error}", + "message": "Failed to load base config from database: {Error}", + "placeholder": null + }, + { + "id": "Failed to parse base config: {Error}", + "translation": "기본 구성을 구문 분석하는 데 실패했습니다: {Error}", + "message": "Failed to parse base config: {Error}", + "placeholder": null + }, + { + "id": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.", + "translation": "{Rendercurio_run___layersgui}를 사용하여 웹 인터페이스를 시도하고 더 나은 안내된 개선을 진행하세요.", + "message": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.", + "placeholder": null + }, + { + "id": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.", + "translation": "이제 lotus-miner와 lotus-worker를 종료하고 {Rendercurio_run}을 실행하세요.", + "message": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.", + "placeholder": null + }, + { + "id": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.", + "translation": "기본 설정 'base'가 이 마이너의 주소({MinerAddress}) 및 지갑 설정을 포함하도록 업데이트되었습니다.", + "message": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.", + "placeholder": null + }, + { + "id": "Configuration 'base' was created to resemble this lotus-miner's config.toml .", + "translation": "'base' 설정이 이 lotus-miner의 config.toml과 유사하게 만들어졌습니다.", + "message": "Configuration 'base' was created to resemble this lotus-miner's config.toml .", + "placeholder": null + }, + { + "id": "Unmigratable sectors found. Do you want to continue?", + "translation": "이동할 수 없는 섹터가 발견되었습니다. 계속하시겠습니까?", + "message": "Unmigratable sectors found. Do you want to continue?", + "placeholder": null + }, + { + "id": "Yes, continue", + "translation": "예, 계속", + "message": "Yes, continue", + "placeholder": null + }, + { + "id": "No, abort", + "translation": "아니오, 중단", + "message": "No, abort", + "placeholder": null + }, + { + "id": "Migrating metadata for {NSectors} sectors.", + "translation": "{NSectors} 섹터의 메타데이터를 이동 중입니다.", + "message": "Migrating metadata for {NSectors} sectors.", + "placeholder": null + }, + { + "id": "Where should we save your database config file?", + "translation": "데이터베이스 구성 파일을 어디에 저장해야 하나요?", + "message": "Where should we save your database config file?", + "placeholder": null + }, + { + "id": "Error writing file: {Error}", + "translation": "파일 쓰기 오류: {Error}", + "message": "Error writing file: {Error}", + "placeholder": null + }, + { + "id": "Try the web interface with {Rendercurio_run___layersgui}", + "translation": "{Rendercurio_run___layersgui}와 함께 웹 인터페이스를 시도해보세요", + "message": "Try the web interface with {Rendercurio_run___layersgui}", + "placeholder": null + }, + { + "id": "For more servers, copy curio.env to /etc/curio.env and add the CURIO_LAYERS env to assign purposes.", + "translation": "더 많은 서버를 위해 curio.env를 /etc/curio.env로 복사하고 목적을 할당하기 위해 CURIO_LAYERS 환경 변수를 추가하세요.", + "message": "For more servers, copy curio.env to /etc/curio.env and add the CURIO_LAYERS env to assign purposes.", + "placeholder": null + }, + { + "id": "Owner Wallet: {String}", + "translation": "소유자 지갑: {String}", + "message": "Owner Wallet: {String}", + "placeholder": null + }, + { + "id": "Worker Wallet: {String}", + "translation": "작업자 지갑: {String}", + "message": "Worker Wallet: {String}", + "placeholder": null + }, + { + "id": "Sender Wallet: {String}", + "translation": "발송자 지갑: {String}", + "message": "Sender Wallet: {String}", + "placeholder": null + }, + { + "id": "Select the Sector Size", + "translation": "섹터 크기 선택", + "message": "Select the Sector Size", + "placeholder": null + }, + { + "id": "64 GiB", + "translation": "64 GiB", + "message": "64 GiB", + "placeholder": null + }, + { + "id": "32 GiB", + "translation": "32 GiB", + "message": "32 GiB", + "placeholder": null + }, + { + "id": "8 MiB", + "translation": "8 MiB", + "message": "8 MiB", + "placeholder": null + }, + { + "id": "2 KiB", + "translation": "2 KiB", + "message": "2 KiB", + "placeholder": null + }, + { + "id": "Sector selection failed: {Error}", + "translation": "섹터 선택 실패: {Error}", + "message": "Sector selection failed: {Error}", + "placeholder": null + }, + { + "id": "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.", + "translation": "더 많은 서버를 위해 /etc/curio.env 파일을 curio.env 데이터베이스 환경으로 만들고 목적을 할당하기 위해 CURIO_LAYERS 환경 변수를 추가하세요.", + "message": "For more servers, make /etc/curio.env with the curio.env database env and add the CURIO_LAYERS env to assign purposes.", + "placeholder": null + }, + { + "id": "Additional info is at http://docs.curiostorage.org", + "translation": "추가 정보는 http://docs.curiostorage.org 에 있습니다.", + "message": "Additional info is at http://docs.curiostorage.org", + "placeholder": null + }, + { + "id": "Math Utils", + "translation": "수학 유틸리티", + "message": "Math Utils", + "placeholder": null + }, + { + "id": "Analyze and display the layout of batch sealer threads", + "translation": "배치 실러 스레드의 레이아웃 분석 및 표시", + "message": "Analyze and display the layout of batch sealer threads", + "placeholder": null + }, + { + "id": "Analyze and display the layout of batch sealer threads on your CPU.\n\nIt provides detailed information about CPU utilization for batch sealing operations, including core allocation, thread\ndistribution for different batch sizes.", + "translation": "CPU에서 배치 실러 스레드의 레이아웃을 분석하고 표시합니다.\n\n이 작업은 배치 실링 작업의 CPU 사용량에 대한 자세한 정보를 제공하며, 여기에는 코어 할당 및 다양한 배치 크기에 대한 스레드 분포가 포함됩니다.", + "message": "Analyze and display the layout of batch sealer threads on your CPU.\n\nIt provides detailed information about CPU utilization for batch sealing operations, including core allocation, thread\ndistribution for different batch sizes.", + "placeholder": null + }, + { + "id": "Generate a supra_seal configuration", + "translation": "supra_seal 구성 생성", + "message": "Generate a supra_seal configuration", + "placeholder": null + }, + { + "id": "Generate a supra_seal configuration for a given batch size.\n\nThis command outputs a configuration expected by SupraSeal. Main purpose of this command is for debugging and testing.\nThe config can be used directly with SupraSeal binaries to test it without involving Curio.", + "translation": "주어진 배치 크기에 대한 supra_seal 구성을 생성합니다.\n\n이 명령은 SupraSeal에서 기대하는 구성을 출력하며, 주로 디버깅 및 테스트를 목적으로 합니다.\n구성은 Curio를 사용하지 않고도 SupraSeal 바이너리에서 직접 사용할 수 있습니다.", + "message": "Generate a supra_seal configuration for a given batch size.\n\nThis command outputs a configuration expected by SupraSeal. Main purpose of this command is for debugging and testing.\nThe config can be used directly with SupraSeal binaries to test it without involving Curio.", + "placeholder": null + }, + { + "id": "Zen3 and later supports two sectors per thread, set to false for older CPUs", + "translation": "Zen3 및 이후 버전은 스레드당 두 개의 섹터를 지원하며, 이전 CPU에서는 false로 설정합니다", + "message": "Zen3 and later supports two sectors per thread, set to false for older CPUs", + "placeholder": null + }, + { + "id": "Execute cli commands", + "translation": "CLI 명령 실행", + "message": "Execute cli commands", + "placeholder": null + }, + { + "id": "machine host:port (curio run --listen address)", + "translation": "기계 호스트:포트 (curio run --listen 주소)", + "message": "machine host:port (curio run --listen address)", + "placeholder": null + }, + { + "id": "Wait for Curio api to come online", + "translation": "Curio API가 온라인 상태가 될 때까지 기다리기", + "message": "Wait for Curio api to come online", + "placeholder": null + }, + { + "id": "duration to wait till fail", + "translation": "실패할 때까지 대기할 시간", + "message": "duration to wait till fail", + "placeholder": null + }, + { + "id": "Manage node config by layers. The layer 'base' will always be applied at Curio start-up.", + "translation": "노드 구성을 레이어별로 관리합니다. 'base' 레이어는 항상 Curio 시작 시 적용됩니다.", + "message": "Manage node config by layers. The layer 'base' will always be applied at Curio start-up.", + "placeholder": null + }, + { + "id": "Print default node config", + "translation": "기본 노드 구성 출력", + "message": "Print default node config", + "placeholder": null + }, + { + "id": "don't comment default values", + "translation": "기본값에 주석을 달지 않음", + "message": "don't comment default values", + "placeholder": null + }, + { + "id": "Set a config layer or the base by providing a filename or stdin.", + "translation": "파일 이름 또는 stdin을 제공하여 구성 레이어 또는 기본값 설정.", + "message": "Set a config layer or the base by providing a filename or stdin.", + "placeholder": null + }, + { + "id": "a layer's file name", + "translation": "레이어의 파일 이름", + "message": "a layer's file name", + "placeholder": null + }, + { + "id": "title of the config layer (req'd for stdin)", + "translation": "구성 레이어의 제목 (stdin에 필요)", + "message": "title of the config layer (req'd for stdin)", + "placeholder": null + }, + { + "id": "Get a config layer by name. You may want to pipe the output to a file, or use 'less'", + "translation": "이름으로 구성 레이어를 가져옵니다. 출력을 파일로 파이핑하거나 'less'를 사용할 수 있습니다.", + "message": "Get a config layer by name. You may want to pipe the output to a file, or use 'less'", + "placeholder": null + }, + { + "id": "layer name", + "translation": "레이어 이름", + "message": "layer name", + "placeholder": null + }, + { + "id": "List config layers present in the DB.", + "translation": "DB에 있는 구성 레이어 목록.", + "message": "List config layers present in the DB.", + "placeholder": null + }, + { + "id": "Remove a named config layer.", + "translation": "이름이 지정된 구성 레이어 제거.", + "message": "Remove a named config layer.", + "placeholder": null + }, + { + "id": "Interpret stacked config layers by this version of curio, with system-generated comments.", + "translation": "시스템 생성 주석과 함께 이 버전의 Curio에서 스택된 구성 레이어 해석.", + "message": "Interpret stacked config layers by this version of curio, with system-generated comments.", + "placeholder": null + }, + { + "id": "a list of layers to be interpreted as the final config", + "translation": "최종 구성으로 해석될 레이어 목록", + "message": "a list of layers to be interpreted as the final config", + "placeholder": null + }, + { + "id": "comma or space separated list of layers to be interpreted (base is always applied)", + "translation": "쉼표 또는 공백으로 구분된 해석될 레이어 목록 (base는 항상 적용됨)", + "message": "comma or space separated list of layers to be interpreted (base is always applied)", + "placeholder": null + }, + { + "id": "edit a config layer", + "translation": "구성 레이어 편집", + "message": "edit a config layer", + "placeholder": null + }, + { + "id": "[layer name]", + "translation": "[레이어 이름]", + "message": "[layer name]", + "placeholder": null + }, + { + "id": "editor to use", + "translation": "사용할 편집기", + "message": "editor to use", + "placeholder": null + }, + { + "id": "source config layer", + "translation": "원본 구성 레이어", + "message": "source config layer", + "placeholder": null + }, + { + "id": "allow overwrite of existing layer if source is a different layer", + "translation": "원본이 다른 레이어일 경우 기존 레이어 덮어쓰기 허용", + "message": "allow overwrite of existing layer if source is a different layer", + "placeholder": null + }, + { + "id": "save the whole config into the layer, not just the diff", + "translation": "차이점만이 아니라 전체 구성을 레이어에 저장", + "message": "save the whole config into the layer, not just the diff", + "placeholder": null + }, + { + "id": "do not interpret source layer", + "translation": "원본 레이어 해석하지 않음", + "message": "do not interpret source layer", + "placeholder": null + }, + { + "id": "true if --source is set", + "translation": "--source가 설정된 경우 true", + "message": "true if --source is set", + "placeholder": null + }, + { + "id": "Create new configuration for a new cluster", + "translation": "새 클러스터에 대한 새 구성 생성", + "message": "Create new configuration for a new cluster", + "placeholder": null + }, + { + "id": "[SP actor address...]", + "translation": "[SP 액터 주소...]", + "message": "[SP actor address...]", + "placeholder": null + }, + { + "id": "Manage logging", + "translation": "로깅 관리", + "message": "Manage logging", + "placeholder": null + }, + { + "id": "List log systems", + "translation": "로그 시스템 목록", + "message": "List log systems", + "placeholder": null + }, + { + "id": "Set log level", + "translation": "로그 레벨 설정", + "message": "Set log level", + "placeholder": null + }, + { + "id": "[level]", + "translation": "[레벨]", + "message": "[level]", + "placeholder": null + }, + { + "id": "Set the log level for logging systems:\n\n The system flag can be specified multiple times.\n\n eg) log set-level --system chain --system chainxchg debug\n\n Available Levels:\n debug\n info\n warn\n error\n\n Environment Variables:\n GOLOG_LOG_LEVEL - Default log level for all log systems\n GOLOG_LOG_FMT - Change output log format (json, nocolor)\n GOLOG_FILE - Write logs to file\n GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr", + "translation": "로깅 시스템의 로그 레벨을 설정합니다:\n\n 시스템 플래그는 여러 번 지정할 수 있습니다.\n\n 예) log set-level --system chain --system chainxchg debug\n\n 사용 가능한 레벨:\n debug\n info\n warn\n error\n\n 환경 변수:\n GOLOG_LOG_LEVEL - 모든 로그 시스템의 기본 로그 레벨\n GOLOG_LOG_FMT - 출력 로그 형식 변경 (json, nocolor)\n GOLOG_FILE - 로그를 파일에 기록\n GOLOG_OUTPUT - 출력 위치 지정 (파일, stderr, stdout 또는 조합, 예: file+stderr)", + "message": "Set the log level for logging systems:\n\n The system flag can be specified multiple times.\n\n eg) log set-level --system chain --system chainxchg debug\n\n Available Levels:\n debug\n info\n warn\n error\n\n Environment Variables:\n GOLOG_LOG_LEVEL - Default log level for all log systems\n GOLOG_LOG_FMT - Change output log format (json, nocolor)\n GOLOG_FILE - Write logs to file\n GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr", + "placeholder": null + }, + { + "id": "limit to log system", + "translation": "로그 시스템으로 제한", + "message": "limit to log system", + "placeholder": null + }, + { + "id": "Filecoin decentralized storage network provider", + "translation": "Filecoin 분산 스토리지 네트워크 제공자", + "message": "Filecoin decentralized storage network provider", + "placeholder": null + }, + { + "id": "use color in display output", + "translation": "디스플레이 출력에 색상 사용", + "message": "use color in display output", + "placeholder": null + }, + { + "id": "depends on output being a TTY", + "translation": "출력이 TTY에 의존", + "message": "depends on output being a TTY", + "placeholder": null + }, + { + "id": "Command separated list of hostnames for yugabyte cluster", + "translation": "유가바이트 클러스터의 호스트 이름을 쉼표로 구분한 목록", + "message": "Command separated list of hostnames for yugabyte cluster", + "placeholder": null + }, + { + "id": "enables very verbose mode, useful for debugging the CLI", + "translation": "매우 상세한 모드를 활성화하여 CLI 디버깅에 유용", + "message": "enables very verbose mode, useful for debugging the CLI", + "placeholder": null + }, + { + "id": "Fetch proving parameters", + "translation": "증명 매개변수 가져오기", + "message": "Fetch proving parameters", + "placeholder": null + }, + { + "id": "[sectorSize]", + "translation": "[섹터 크기]", + "message": "[sectorSize]", + "placeholder": null + }, + { + "id": "list of layers to be interpreted (atop defaults). Default: base", + "translation": "해석될 레이어 목록 (기본값 위에). 기본값: base", + "message": "list of layers to be interpreted (atop defaults). Default: base", + "placeholder": null + }, + { + "id": "start sealing a deal sector early", + "translation": "거래 섹터를 조기에 실링 시작", + "message": "start sealing a deal sector early", + "placeholder": null + }, + { + "id": "Specify actor address to start sealing sectors for", + "translation": "실링할 섹터의 액터 주소 지정", + "message": "Specify actor address to start sealing sectors for", + "placeholder": null + }, + { + "id": "Use synthetic PoRep", + "translation": "합성 PoRep 사용", + "message": "Use synthetic PoRep", + "placeholder": null + }, + { + "id": "", + "translation": "<섹터>", + "message": "", + "placeholder": null + }, + { + "id": "Manage the sealing pipeline", + "translation": "실링 파이프라인 관리", + "message": "Manage the sealing pipeline", + "placeholder": null + }, + { + "id": "Start new sealing operations manually", + "translation": "새로운 실링 작업 수동 시작", + "message": "Start new sealing operations manually", + "placeholder": null + }, + { + "id": "Start sealing sectors for all actors now (not on schedule)", + "translation": "모든 액터에 대한 섹터 실링 즉시 시작 (일정에 없음)", + "message": "Start sealing sectors for all actors now (not on schedule)", + "placeholder": null + }, + { + "id": "Start sealing new CC sectors", + "translation": "새 CC 섹터 실링 시작", + "message": "Start sealing new CC sectors", + "placeholder": null + }, + { + "id": "Number of sectors to start", + "translation": "시작할 섹터 수", + "message": "Number of sectors to start", + "placeholder": null + }, + { + "id": "How long to commit sectors for", + "translation": "섹터를 커밋할 기간", + "message": "How long to commit sectors for", + "placeholder": null + }, + { + "id": "1278 (3.5 years)", + "translation": "1278 (3.5년)", + "message": "1278 (3.5 years)", + "placeholder": null + }, + { + "id": "(debug tool) Copy LM sector metadata into Curio DB", + "translation": "(디버그 도구) LM 섹터 메타데이터를 Curio DB로 복사", + "message": "(debug tool) Copy LM sector metadata into Curio DB", + "placeholder": null + }, + { + "id": "Path to miner repo", + "translation": "마이너 저장소 경로", + "message": "Path to miner repo", + "placeholder": null + }, + { + "id": "Ignore sectors that cannot be migrated", + "translation": "이동할 수 없는 섹터 무시", + "message": "Ignore sectors that cannot be migrated", + "placeholder": null + }, + { + "id": "List pipeline events", + "translation": "파이프라인 이벤트 목록", + "message": "List pipeline events", + "placeholder": null + }, + { + "id": "Filter events by actor address; lists all if not specified", + "translation": "액터 주소로 이벤트 필터링; 지정하지 않으면 모든 이벤트를 나열합니다", + "message": "Filter events by actor address; lists all if not specified", + "placeholder": null + }, + { + "id": "Filter events by sector number; requires --actor to be specified", + "translation": "섹터 번호로 이벤트 필터링; --actor 지정 필요", + "message": "Filter events by sector number; requires --actor to be specified", + "placeholder": null + }, + { + "id": "Limit output to the last N events", + "translation": "출력을 마지막 N개의 이벤트로 제한", + "message": "Limit output to the last N events", + "placeholder": null + }, + { + "id": "Start a Curio process", + "translation": "Curio 프로세스 시작", + "message": "Start a Curio process", + "placeholder": null + }, + { + "id": "host address and port the worker api will listen on", + "translation": "작업자 API가 수신 대기할 호스트 주소와 포트", + "message": "host address and port the worker api will listen on", + "placeholder": null + }, + { + "id": "host address and port the gui will listen on", + "translation": "GUI가 수신 대기할 호스트 주소와 포트", + "message": "host address and port the gui will listen on", + "placeholder": null + }, + { + "id": "don't check full-node sync status", + "translation": "풀 노드 동기화 상태 확인 안 함", + "message": "don't check full-node sync status", + "placeholder": null + }, + { + "id": "only run init, then return", + "translation": "init만 실행하고 돌아옴", + "message": "only run init, then return", + "placeholder": null + }, + { + "id": "manage open file limit", + "translation": "열린 파일 제한 관리", + "message": "manage open file limit", + "placeholder": null + }, + { + "id": "custom node name", + "translation": "사용자 지정 노드 이름", + "message": "custom node name", + "placeholder": null + }, + { + "id": "Start Curio web interface", + "translation": "Curio 웹 인터페이스 시작", + "message": "Start Curio web interface", + "placeholder": null + }, + { + "id": "Start an instance of Curio web interface. \n\tThis creates the 'web' layer if it does not exist, then calls run with that layer.", + "translation": "Curio 웹 인터페이스 인스턴스를 시작합니다.\n\t존재하지 않으면 'web' 레이어를 생성하고 해당 레이어로 실행을 호출합니다.", + "message": "Start an instance of Curio web interface. \n\tThis creates the 'web' layer if it does not exist, then calls run with that layer.", + "placeholder": null + }, + { + "id": "Address to listen for the GUI on", + "translation": "GUI가 수신 대기할 주소", + "message": "Address to listen for the GUI on", + "placeholder": null + }, + { + "id": "Stop a running Curio process", + "translation": "실행 중인 Curio 프로세스 중지", + "message": "Stop a running Curio process", + "placeholder": null + }, + { + "id": "manage sector storage", + "translation": "섹터 스토리지 관리", + "message": "manage sector storage", + "placeholder": null + }, + { + "id": "Sectors can be stored across many filesystem paths. These\ncommands provide ways to manage the storage a Curio node will use to store sectors\nlong term for proving (references as 'store') as well as how sectors will be\nstored while moving through the sealing pipeline (references as 'seal').", + "translation": "섹터는 여러 파일 시스템 경로에 걸쳐 저장될 수 있습니다.\n이 명령은 Curio 노드가 섹터를 장기 저장(증명용, 'store'로 참조)하는 스토리지를 관리하는 방법과\n실링 파이프라인을 통해 이동하는 동안 섹터가 어떻게 저장될지를 관리합니다('seal'로 참조).", + "message": "Sectors can be stored across many filesystem paths. These\ncommands provide ways to manage the storage a Curio node will use to store sectors\nlong term for proving (references as 'store') as well as how sectors will be\nstored while moving through the sealing pipeline (references as 'seal').", + "placeholder": null + }, + { + "id": "attach local storage path", + "translation": "로컬 스토리지 경로 연결", + "message": "attach local storage path", + "placeholder": null + }, + { + "id": "[path]", + "translation": "[경로]", + "message": "[path]", + "placeholder": null + }, + { + "id": "Storage can be attached to a Curio node using this command. The storage volume\nlist is stored local to the Curio node in storage.json set in curio run. We do not\nrecommend manually modifying this value without further understanding of the\nstorage system.\n\nEach storage volume contains a configuration file which describes the\ncapabilities of the volume. When the '--init' flag is provided, this file will\nbe created using the additional flags.\n\nWeight\nA high weight value means data will be more likely to be stored in this path\n\nSeal\nData for the sealing process will be stored here\n\nStore\nFinalized sectors that will be moved here for long term storage and be proven\nover time", + "translation": "이 명령을 사용하여 Curio 노드에 스토리지를 연결할 수 있습니다. 스토리지 볼륨 목록은 curio run에 설정된 storage.json에 로컬로 저장됩니다.\n스토리지 시스템에 대한 추가 이해 없이 수동으로 이 값을 수정하는 것은 권장하지 않습니다.\n\n각 스토리지 볼륨에는 볼륨의 기능을 설명하는 구성 파일이 포함되어 있습니다. '--init' 플래그가 제공되면 이 파일은 추가 플래그를 사용하여 생성됩니다.\n\nWeight\n높은 가중치 값은 데이터가 이 경로에 저장될 가능성이 더 높다는 것을 의미합니다\n\nSeal\n실링 프로세스 데이터를 여기에 저장합니다\n\nStore\n완료된 섹터는 장기 저장을 위해 여기로 이동되며 시간이 지남에 따라 증명됩니다", + "message": "Storage can be attached to a Curio node using this command. The storage volume\nlist is stored local to the Curio node in storage.json set in curio run. We do not\nrecommend manually modifying this value without further understanding of the\nstorage system.\n\nEach storage volume contains a configuration file which describes the\ncapabilities of the volume. When the '--init' flag is provided, this file will\nbe created using the additional flags.\n\nWeight\nA high weight value means data will be more likely to be stored in this path\n\nSeal\nData for the sealing process will be stored here\n\nStore\nFinalized sectors that will be moved here for long term storage and be proven\nover time", + "placeholder": null + }, + { + "id": "initialize the path first", + "translation": "경로를 먼저 초기화", + "message": "initialize the path first", + "placeholder": null + }, + { + "id": "(for init) path weight", + "translation": "(초기화용) 경로 가중치", + "message": "(for init) path weight", + "placeholder": null + }, + { + "id": "(for init) use path for sealing", + "translation": "(초기화용) 실링에 경로 사용", + "message": "(for init) use path for sealing", + "placeholder": null + }, + { + "id": "(for init) use path for long-term storage", + "translation": "(초기화용) 장기 저장에 경로 사용", + "message": "(for init) use path for long-term storage", + "placeholder": null + }, + { + "id": "(for init) limit storage space for sectors (expensive for very large paths!)", + "translation": "(초기화용) 섹터에 대한 저장 공간 제한 (매우 큰 경로에서는 비용이 많이 듦!)", + "message": "(for init) limit storage space for sectors (expensive for very large paths!)", + "placeholder": null + }, + { + "id": "path group names", + "translation": "경로 그룹 이름", + "message": "path group names", + "placeholder": null + }, + { + "id": "path groups allowed to pull data from this path (allow all if not specified)", + "translation": "이 경로에서 데이터를 가져올 수 있는 경로 그룹 (지정하지 않으면 모두 허용)", + "message": "path groups allowed to pull data from this path (allow all if not specified)", + "placeholder": null + }, + { + "id": "detach local storage path", + "translation": "로컬 스토리지 경로 분리", + "message": "detach local storage path", + "placeholder": null + }, + { + "id": "list local storage paths", + "translation": "로컬 스토리지 경로 목록", + "message": "list local storage paths", + "placeholder": null + }, + { + "id": "only list local storage paths", + "translation": "로컬 스토리지 경로만 나열", + "message": "only list local storage paths", + "placeholder": null + }, + { + "id": "find sector in the storage system", + "translation": "스토리지 시스템에서 섹터 찾기", + "message": "find sector in the storage system", + "placeholder": null + }, + { + "id": "[miner address] [sector number]", + "translation": "[마이너 주소] [섹터 번호]", + "message": "[miner address] [sector number]", + "placeholder": null + }, + { + "id": "Utility functions for testing", + "translation": "테스트용 유틸리티 기능", + "message": "Utility functions for testing", + "placeholder": null + }, + { + "id": "Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.", + "translation": "섹터에 대한 증명 계산 (섹터가 사전 실링되어야 함). 이는 체인으로 전송되지 않습니다.", + "message": "Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.", + "placeholder": null + }, + { + "id": "Test the windowpost scheduler by running it on the next available curio. If tasks fail all retries, you will need to ctrl+c to exit.", + "translation": "다음 사용 가능한 Curio에서 windowpost 스케줄러를 실행하여 테스트합니다. 모든 재시도가 실패하면 ctrl+c를 눌러 종료해야 합니다.", + "message": "Test the windowpost scheduler by running it on the next available curio. If tasks fail all retries, you will need to ctrl+c to exit.", + "placeholder": null + }, + { + "id": "deadline to compute WindowPoSt for", + "translation": "WindowPoSt를 계산할 기한", + "message": "deadline to compute WindowPoSt for", + "placeholder": null + }, + { + "id": "Compute WindowPoSt for performance and configuration testing.", + "translation": "성능 및 구성 테스트를 위한 WindowPoSt 계산.", + "message": "Compute WindowPoSt for performance and configuration testing.", + "placeholder": null + }, + { + "id": "Note: This command is intended to be used to verify PoSt compute performance.\nIt will not send any messages to the chain. Since it can compute any deadline, output may be incorrectly timed for the chain.", + "translation": "참고: 이 명령은 PoSt 계산 성능을 검증하기 위해 사용됩니다.\n체인으로 메시지를 전송하지 않습니다. 모든 기한을 계산할 수 있으므로 출력이 체인과 부정확하게 일치할 수 있습니다.", + "message": "Note: This command is intended to be used to verify PoSt compute performance.\nIt will not send any messages to the chain. Since it can compute any deadline, output may be incorrectly timed for the chain.", + "placeholder": null + }, + { + "id": "[deadline index]", + "translation": "[기한 인덱스]", + "message": "[deadline index]", + "placeholder": null + }, + { + "id": "path to json file containing storage config", + "translation": "스토리지 구성 파일이 포함된 JSON 파일의 경로", + "message": "path to json file containing storage config", + "placeholder": null + }, + { + "id": "partition to compute WindowPoSt for", + "translation": "WindowPoSt를 계산할 파티션", + "message": "partition to compute WindowPoSt for", + "placeholder": null + }, + { + "id": "Failed to generate the libp2p private key.", + "translation": "libp2p 개인 키 생성 실패.", + "message": "Failed to generate the libp2p private key.", + "placeholder": null + }, + { + "id": "Failed to generate miner ID from address.", + "translation": "주소에서 마이너 ID 생성 실패.", + "message": "Failed to generate miner ID from address.", + "placeholder": null + }, + { + "id": "Failed to insert libp2p private key into database. Please run 'curio market libp2p generate-key minerID' to complete the migration.", + "translation": "libp2p 개인 키를 데이터베이스에 삽입하지 못했습니다. 마이그레이션을 완료하려면 'curio market libp2p generate-key minerID'를 실행하십시오.", + "message": "Failed to insert libp2p private key into database. Please run 'curio market libp2p generate-key minerID' to complete the migration.", + "placeholder": null + }, + { + "id": "New libp2p key was not created", + "translation": "새 libp2p 키가 생성되지 않았습니다.", + "message": "New libp2p key was not created", + "placeholder": null + }, + { + "id": "More than 1 row was affected in the 'libp2p' table when creating new libp2p key.", + "translation": "'libp2p' 테이블에서 새 libp2p 키를 생성할 때 1개 이상의 행이 영향을 받았습니다.", + "message": "More than 1 row was affected in the 'libp2p' table when creating new libp2p key.", + "placeholder": null + }, + { + "id": "Failed to marshal libp2p private key.", + "translation": "libp2p 개인 키 마샬링에 실패했습니다.", + "message": "Failed to marshal libp2p private key.", + "placeholder": null + }, + { + "id": "generate ipni chunks from a file", + "translation": "파일에서 IPNI 청크 생성", + "message": "generate ipni chunks from a file", + "placeholder": null + }, + { + "id": "Add URL to fetch data for offline deals", + "translation": "오프라인 거래 데이터를 가져올 URL 추가", + "message": "Add URL to fetch data for offline deals", + "placeholder": null + }, + { + "id": "CSV file location to use for multiple deal input. Each line in the file should be in the format 'uuid,raw size,url,header1,header2...'", + "translation": "여러 거래 입력에 사용할 CSV 파일 위치. 파일의 각 행은 'uuid, 원시 크기, url, header1, header2...' 형식이어야 합니다.", + "message": "CSV file location to use for multiple deal input. Each line in the file should be in the format 'uuid,raw size,url,header1,header2...'", + "placeholder": null + }, + { + "id": "Custom `HEADER` to include in the HTTP request", + "translation": "HTTP 요청에 포함할 사용자 정의 `HEADER`", + "message": "Custom `HEADER` to include in the HTTP request", + "placeholder": null + }, + { + "id": "`URL` to send the request to", + "translation": "요청을 보낼 `URL`", + "message": "`URL` to send the request to", + "placeholder": null + }, + { + "id": "Moves funds from the deal collateral wallet into escrow with the storage market actor", + "translation": "거래 담보 지갑에서 자금을 스토리지 시장 액터의 에스크로로 이동", + "message": "Moves funds from the deal collateral wallet into escrow with the storage market actor", + "placeholder": null + }, + { + "id": "maximum fee in FIL user is willing to pay for this message", + "translation": "사용자가 이 메시지에 대해 지불하려는 FIL의 최대 수수료", + "message": "maximum fee in FIL user is willing to pay for this message", + "placeholder": null + }, + { + "id": "Specify wallet address to send the funds from", + "translation": "자금을 보낼 지갑 주소 지정", + "message": "Specify wallet address to send the funds from", + "placeholder": null + }, + { + "id": "Collection of debugging utilities", + "translation": "디버깅 유틸리티 모음", + "message": "Collection of debugging utilities", + "placeholder": null + }, + { + "id": "Manage unsealed data", + "translation": "미봉인 데이터를 관리", + "message": "Manage unsealed data", + "placeholder": null + }, + { + "id": "Get information about unsealed data", + "translation": "미봉인 데이터에 대한 정보 가져오기", + "message": "Get information about unsealed data", + "placeholder": null + }, + { + "id": "List data from the sectors_unseal_pipeline and sectors_meta tables", + "translation": "sectors_unseal_pipeline 및 sectors_meta 테이블의 데이터 나열", + "message": "List data from the sectors_unseal_pipeline and sectors_meta tables", + "placeholder": null + }, + { + "id": "Filter by storage provider ID", + "translation": "스토리지 제공자 ID로 필터링", + "message": "Filter by storage provider ID", + "placeholder": null + }, + { + "id": "Output file path (default: stdout)", + "translation": "출력 파일 경로 (기본값: 표준 출력)", + "message": "Output file path (default: stdout)", + "placeholder": null + }, + { + "id": "Set the target unseal state for a sector", + "translation": "섹터의 목표 미봉인 상태 설정", + "message": "Set the target unseal state for a sector", + "placeholder": null + }, + { + "id": "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.", + "translation": "특정 섹터의 목표 미봉인 상태를 설정합니다.\n : 스토리지 제공자 ID\n : 섹터 번호\n : 목표 상태 (true, false, none 중 하나)\n\n 미봉인 목표 상태는 Curio가 섹터의 미봉인 복사본을 어떻게 유지할지를 나타냅니다.\n\t 목표 상태가 true이면 Curio는 섹터가 미봉인 상태로 유지되도록 보장합니다.\n\t 목표 상태가 false이면 Curio는 섹터에 미봉인 복사본이 없도록 보장합니다.\n\t 목표 상태가 none이면 Curio는 섹터의 현재 상태를 변경하지 않습니다.\n\n 현재, 목표 상태가 다른 상태에서 true로 변경될 때만 Curio는 새로운 미봉인 프로세스를 시작합니다.\n\n 목표 상태가 false이고 미봉인 섹터 파일이 존재하는 경우, GC 마크 단계는 미봉인 섹터 파일에 대한 제거 마크를 생성합니다. 파일은 제거 마크가 승인된 후에만 제거됩니다.", + "message": "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.", + "placeholder": null + }, + { + "id": "Check data integrity in unsealed sector files", + "translation": "미봉인 섹터 파일의 데이터 무결성 확인", + "message": "Check data integrity in unsealed sector files", + "placeholder": null + }, + { + "id": "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number", + "translation": "특정 섹터에 대한 검사 작업을 생성하고 완료를 기다린 후 결과를 출력합니다.\n : 스토리지 제공자 ID\n : 섹터 번호", + "message": "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number", + "placeholder": null + }, + { + "id": "Cordon a machine, set it to maintenance mode", + "translation": "노드를 격리하고 유지 보수 모드로 설정", + "message": "Cordon a machine, set it to maintenance mode", + "placeholder": null + }, + { + "id": "Uncordon a machine, resume scheduling", + "translation": "노드 격리를 해제하고 스케줄링 재개", + "message": "Uncordon a machine, resume scheduling", + "placeholder": null + }, + { + "id": "Get Curio node info", + "translation": "Curio 노드 정보 가져오기", + "message": "Get Curio node info", + "placeholder": null + }, + { + "id": "generate vanilla proof for a sector", + "translation": "섹터에 대한 바닐라 증명 생성", + "message": "generate vanilla proof for a sector", + "placeholder": null + }, + { + "id": "SP ID to compute WindowPoSt for", + "translation": "WindowPoSt 계산을 위한 SP ID", + "message": "SP ID to compute WindowPoSt for", + "placeholder": null + }, + { + "id": "redeclare sectors in a local storage path", + "translation": "로컬 스토리지 경로에서 섹터를 다시 선언", + "message": "redeclare sectors in a local storage path", + "placeholder": null + }, + { + "id": "--machine flag in cli command should point to the node where storage to redeclare is attached", + "translation": "CLI 명령의 --machine 플래그는 다시 선언할 스토리지가 연결된 노드를 가리켜야 합니다", + "message": "--machine flag in cli command should point to the node where storage to redeclare is attached", + "placeholder": null + }, + { + "id": "Create a new offline verified DDO deal for Curio", + "translation": "Curio에 대한 새로운 오프라인 검증된 DDO 거래를 생성합니다.", + "message": "Create a new offline verified DDO deal for Curio", + "placeholder": null + }, + { + "id": "Specify actor address for the deal", + "translation": "거래에 사용할 액터 주소를 지정하세요.", + "message": "Specify actor address for the deal", + "placeholder": null + }, + { + "id": "Remove unsealed copies of sector containing this deal", + "translation": "이 거래를 포함하는 섹터의 봉인되지 않은 복사본을 제거합니다.", + "message": "Remove unsealed copies of sector containing this deal", + "placeholder": null + }, + { + "id": "indicates that deal index should not be announced to the IPNI", + "translation": "거래 인덱스가 IPNI에 발표되지 않아야 함을 나타냅니다.", + "message": "indicates that deal index should not be announced to the IPNI", + "placeholder": null + }, + { + "id": "start epoch by when the deal should be proved by provider on-chain (default: 2 days from now)", + "translation": "거래가 제공업체에 의해 온체인에서 입증되어야 하는 시작 에포크입니다. (기본값: 현재로부터 2일 후)", + "message": "start epoch by when the deal should be proved by provider on-chain (default: 2 days from now)", + "placeholder": null + }, + { + "id": "Provides a sample of CIDs from an indexed piece", + "translation": "색인된 조각에서 CID 샘플을 제공합니다.", + "message": "Provides a sample of CIDs from an indexed piece", + "placeholder": null + }, + { + "id": "piece-cid", + "translation": "조각 CID", + "message": "piece-cid", + "placeholder": null + }, + { + "id": "output in json format", + "translation": "JSON 형식으로 출력", + "message": "output in json format", + "placeholder": null + }, + { + "id": "Name of the Postgres database in Yugabyte cluster", + "translation": "Yugabyte 클러스터의 Postgres 데이터베이스 이름", + "message": "Name of the Postgres database in Yugabyte cluster", + "placeholder": null + }, + { + "id": "Username for connecting to the Postgres database in Yugabyte cluster", + "translation": "Yugabyte 클러스터의 Postgres 데이터베이스에 연결하기 위한 사용자 이름", + "message": "Username for connecting to the Postgres database in Yugabyte cluster", + "placeholder": null + }, + { + "id": "Password for connecting to the Postgres database in Yugabyte cluster", + "translation": "Yugabyte 클러스터의 Postgres 데이터베이스에 연결하기 위한 비밀번호", + "message": "Password for connecting to the Postgres database in Yugabyte cluster", + "placeholder": null + }, + { + "id": "Port for connecting to the Postgres database in Yugabyte cluster", + "translation": "Yugabyte 클러스터의 Postgres 데이터베이스에 연결하기 위한 포트", + "message": "Port for connecting to the Postgres database in Yugabyte cluster", + "placeholder": null + }, + { + "id": "Port for connecting to the Cassandra database in Yugabyte cluster", + "translation": "Yugabyte 클러스터의 Cassandra 데이터베이스에 연결하기 위한 포트", + "message": "Port for connecting to the Cassandra database in Yugabyte cluster", + "placeholder": null + }, + { + "id": "Enable load balancing for connecting to the Postgres database in Yugabyte cluster", + "translation": "Yugabyte 클러스터의 Postgres 데이터베이스에 연결할 때 로드 밸런싱을 활성화하세요", + "message": "Enable load balancing for connecting to the Postgres database in Yugabyte cluster", + "placeholder": null + }, + { + "id": "Tool Box for Curio", + "translation": "Curio 도구 상자", + "message": "Tool Box for Curio", + "placeholder": null + }, + { + "id": "Updated DB with message data missing from chain node", + "translation": "체인 노드에서 누락된 메시지 데이터를 사용하여 데이터베이스를 업데이트함", + "message": "Updated DB with message data missing from chain node", + "placeholder": null + }, + { + "id": "Update data for messages in wait queue", + "translation": "대기 큐에 있는 메시지의 데이터를 업데이트", + "message": "Update data for messages in wait queue", + "placeholder": null + }, + { + "id": "Deposit FIL into the Router contract (client)", + "translation": "Router 컨트랙트(클라이언트)에 FIL 입금", + "message": "Deposit FIL into the Router contract (client)", + "placeholder": null + }, + { + "id": "Sender address", + "translation": "보낸 사람 주소", + "message": "Sender address", + "placeholder": null + }, + { + "id": "Amount in FIL", + "translation": "금액(FIL)", + "message": "Amount in FIL", + "placeholder": null + }, + { + "id": "Initiate a withdrawal request from the client's deposit", + "translation": "클라이언트 예치금에서 출금 요청 시작", + "message": "Initiate a withdrawal request from the client's deposit", + "placeholder": null + }, + { + "id": "Client sender address", + "translation": "클라이언트 송신자 주소", + "message": "Client sender address", + "placeholder": null + }, + { + "id": "Withdrawal amount (in FIL)", + "translation": "출금 금액(FIL)", + "message": "Withdrawal amount (in FIL)", + "placeholder": null + }, + { + "id": "Complete a pending client withdrawal after the withdrawal window elapses", + "translation": "출금 창이 경과한 후 대기 중인 클라이언트 출금을 완료", + "message": "Complete a pending client withdrawal after the withdrawal window elapses", + "placeholder": null + }, + { + "id": "Cancel a pending client withdrawal request", + "translation": "대기 중인 클라이언트 출금 요청 취소", + "message": "Cancel a pending client withdrawal request", + "placeholder": null + }, + { + "id": "Redeem a client voucher (service role)", + "translation": "클라이언트 바우처 상환(서비스 역할)", + "message": "Redeem a client voucher (service role)", + "placeholder": null + }, + { + "id": "Service sender address", + "translation": "서비스 송신자 주소", + "message": "Service sender address", + "placeholder": null + }, + { + "id": "Client actor", + "translation": "클라이언트 액터", + "message": "Client actor", + "placeholder": null + }, + { + "id": "Cumulative amount (FIL)", + "translation": "누적 금액(FIL)", + "message": "Cumulative amount (FIL)", + "placeholder": null + }, + { + "id": "Voucher nonce", + "translation": "바우처 논스", + "message": "Voucher nonce", + "placeholder": null + }, + { + "id": "Voucher signature (hex)", + "translation": "바우처 서명(16진수)", + "message": "Voucher signature (hex)", + "placeholder": null + }, + { + "id": "Redeem a provider voucher (provider role)", + "translation": "프로바이더 바우처 상환(프로바이더 역할)", + "message": "Redeem a provider voucher (provider role)", + "placeholder": null + }, + { + "id": "Provider sender address", + "translation": "프로바이더 송신자 주소", + "message": "Provider sender address", + "placeholder": null + }, + { + "id": "Provider actor", + "translation": "프로바이더 액터", + "message": "Provider actor", + "placeholder": null + }, + { + "id": "Initiate a withdrawal request from the service pool", + "translation": "서비스 풀에서 출금 요청 시작", + "message": "Initiate a withdrawal request from the service pool", + "placeholder": null + }, + { + "id": "Complete a pending service withdrawal after the withdrawal window elapses", + "translation": "출금 창이 경과한 후 대기 중인 서비스 출금을 완료", + "message": "Complete a pending service withdrawal after the withdrawal window elapses", + "placeholder": null + }, + { + "id": "Cancel a pending service withdrawal request", + "translation": "대기 중인 서비스 출금 요청 취소", + "message": "Cancel a pending service withdrawal request", + "placeholder": null + }, + { + "id": "Deposit funds into the service pool (service role)", + "translation": "서비스 풀에 자금 입금(서비스 역할)", + "message": "Deposit funds into the service pool (service role)", + "placeholder": null + }, + { + "id": "Amount to deposit (FIL)", + "translation": "입금 금액(FIL)", + "message": "Amount to deposit (FIL)", + "placeholder": null + }, + { + "id": "Query the state of a client", + "translation": "클라이언트 상태 조회", + "message": "Query the state of a client", + "placeholder": null + }, + { + "id": "Client actor address", + "translation": "클라이언트 액터 주소", + "message": "Client actor address", + "placeholder": null + }, + { + "id": "Query the state of a provider", + "translation": "프로바이더 상태 조회", + "message": "Query the state of a provider", + "placeholder": null + }, + { + "id": "Provider actor address", + "translation": "프로바이더 액터 주소", + "message": "Provider actor address", + "placeholder": null + }, + { + "id": "Query the service state", + "translation": "서비스 상태 조회", + "message": "Query the service state", + "placeholder": null + }, + { + "id": "Create a client voucher", + "translation": "클라이언트 바우처 생성", + "message": "Create a client voucher", + "placeholder": null + }, + { + "id": "Amount to redeem (FIL)", + "translation": "상환할 금액(FIL)", + "message": "Amount to redeem (FIL)", + "placeholder": null + }, + { + "id": "Create a provider voucher", + "translation": "프로바이더 바우처 생성", + "message": "Create a provider voucher", + "placeholder": null + }, + { + "id": "Propose a new service actor", + "translation": "새 서비스 액터 제안", + "message": "Propose a new service actor", + "placeholder": null + }, + { + "id": "New service actor address", + "translation": "새 서비스 액터 주소", + "message": "New service actor address", + "placeholder": null + }, + { + "id": "Accept a proposed service actor", + "translation": "제안된 서비스 액터 수락", + "message": "Accept a proposed service actor", + "placeholder": null + }, + { + "id": "Validate a client voucher signature", + "translation": "클라이언트 바우처 서명 검증", + "message": "Validate a client voucher signature", + "placeholder": null + }, + { + "id": "Validate a provider voucher signature", + "translation": "프로바이더 바우처 서명 검증", + "message": "Validate a provider voucher signature", + "placeholder": null + }, + { + "id": "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.", + "translation": "이 대화형 도구는 PDP, Snark 시장 등과 같은 프로토콜을 위한 비 SP 클러스터를 설정합니다.", + "message": "This interactive tool sets up a non-Storage Provider cluster for protocols like PDP, Snark market, and others.", + "placeholder": null + }, + { + "id": "This setup does not create or migrate a Filecoin SP actor.", + "translation": "이 설정은 Filecoin SP 액터를 생성하거나 마이그레이션하지 않습니다.", + "message": "This setup does not create or migrate a Filecoin SP actor.", + "placeholder": null + }, + { + "id": "Setup non-Storage Provider cluster", + "translation": "비 SP 클러스터 설정", + "message": "Setup non-Storage Provider cluster", + "placeholder": null + }, + { + "id": "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration", + "translation": "가이드 설정을 다시 실행하지 마십시오. 구성을 완료하려면 'curio config new-cluster'를 수동으로 실행해야 합니다.", + "message": "Please do not run guided-setup again. You need to run 'curio config new-cluster' manually to finish the configuration", + "placeholder": null + }, + { + "id": "Non-SP cluster configuration created successfully", + "translation": "비 SP 클러스터 구성이 성공적으로 생성되었습니다", + "message": "Non-SP cluster configuration created successfully", + "placeholder": null + }, + { + "id": "Non-SP cluster configuration complete", + "translation": "비 SP 클러스터 구성 완료", + "message": "Non-SP cluster configuration complete", + "placeholder": null + }, + { + "id": "Non-SP cluster setup complete!", + "translation": "비 SP 클러스터 설정 완료!", + "message": "Non-SP cluster setup complete!", + "placeholder": null + }, + { + "id": "Your non-SP cluster has been configured successfully.", + "translation": "비 SP 클러스터가 성공적으로 구성되었습니다.", + "message": "Your non-SP cluster has been configured successfully.", + "placeholder": null + }, + { + "id": "You can now start using Curio for protocols like PDP, Snark markets, and others.", + "translation": "이제 PDP, Snark 시장 등과 같은 프로토콜에서 Curio를 사용할 수 있습니다.", + "message": "You can now start using Curio for protocols like PDP, Snark markets, and others.", + "placeholder": null + }, + { + "id": "To start the cluster, run: curio run --layers basic-cluster", + "translation": "클러스터를 시작하려면 실행하세요: curio run --layers basic-cluster", + "message": "To start the cluster, run: curio run --layers basic-cluster", + "placeholder": null + }, + { + "id": "Failed to get API info for FullNode: {Error}", + "translation": "FullNode의 API 정보를 가져오지 못했습니다: {Error}", + "message": "Failed to get API info for FullNode: {Error}", + "placeholder": null + }, + { + "id": "Failed to create auth token: {Error}", + "translation": "인증 토큰을 생성하지 못했습니다: {Error}", + "message": "Failed to create auth token: {Error}", + "placeholder": null + }, + { + "id": "Failed to insert config into database: {Error}", + "translation": "데이터베이스에 구성 정보를 삽입하지 못했습니다: {Error}", + "message": "Failed to insert config into database: {Error}", + "placeholder": null + }, + { + "id": "Register a PDP service provider with Filecoin Service Registry Contract", + "translation": "Filecoin 서비스 등록 계약에 PDP 서비스 제공자 등록", + "message": "Register a PDP service provider with Filecoin Service Registry Contract", + "placeholder": null + }, + { + "id": "Service provider name", + "translation": "서비스 제공자 이름", + "message": "Service provider name", + "placeholder": null + }, + { + "id": "Service provider description", + "translation": "서비스 제공자 설명", + "message": "Service provider description", + "placeholder": null + }, + { + "id": "URL of the service provider", + "translation": "서비스 제공자 URL", + "message": "URL of the service provider", + "placeholder": null + }, + { + "id": "Minimum piece size", + "translation": "최소 조각 크기", + "message": "Minimum piece size", + "placeholder": null + }, + { + "id": "Maximum piece size", + "translation": "최대 조각 크기", + "message": "Maximum piece size", + "placeholder": null + }, + { + "id": "Supports IPNI piece CID indexing", + "translation": "IPNI 조각 CID 인덱싱 지원", + "message": "Supports IPNI piece CID indexing", + "placeholder": null + }, + { + "id": "Supports IPNI IPFS CID indexing", + "translation": "IPNI IPFS CID 인덱싱 지원", + "message": "Supports IPNI IPFS CID indexing", + "placeholder": null + }, + { + "id": "Storage price per TiB per month in USDFC, Default is 1 USDFC.", + "translation": "TiB당 월 스토리지 가격 (USDFC 단위), 기본값은 1 USDFC입니다.", + "message": "Storage price per TiB per month in USDFC, Default is 1 USDFC.", + "placeholder": null + }, + { + "id": "Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset", + "translation": "SP가 저장된 데이터셋에 대한 접근 증명을 제공할 의사가 있는 최소 빈도 간격(에포크 단위)", + "message": "Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset", + "placeholder": null + }, + { + "id": "Location of the service provider", + "translation": "서비스 제공자 위치", + "message": "Location of the service provider", + "placeholder": null + }, + { + "id": "Token contract for payment (IERC20(address(0)) for FIL)", + "translation": "지불을 위한 토큰 계약 (FIL의 경우 IERC20(address(0)))", + "message": "Token contract for payment (IERC20(address(0)) for FIL)", + "placeholder": null + }, + { + "id": "Compute WindowPoSt vanilla proofs and verify them.", + "translation": "WindowPoSt 기본 증명을 계산하고 검증합니다.", + "message": "Compute WindowPoSt vanilla proofs and verify them.", + "placeholder": null + }, + { + "id": "32 GiB (recommended for mainnet)", + "translation": "32 GiB (메인넷 권장)", + "message": "32 GiB (recommended for mainnet)", + "placeholder": null + }, + { + "id": "Optional setup steps (you can skip these and configure later):", + "translation": "선택적 설정 단계 (건너뛰고 나중에 구성할 수 있습니다):", + "message": "Optional setup steps (you can skip these and configure later):", + "placeholder": null + }, + { + "id": "Skip optional steps", + "translation": "선택적 단계를 건너뛰기", + "message": "Skip optional steps", + "placeholder": null + }, + { + "id": "Storage", + "translation": "스토리지", + "message": "Storage", + "placeholder": null + }, + { + "id": "PDP", + "translation": "PDP", + "message": "PDP", + "placeholder": null + }, + { + "id": "Storage Configuration", + "translation": "스토리지 구성", + "message": "Storage Configuration", + "placeholder": null + }, + { + "id": "Manage storage paths for this server.", + "translation": "이 서버의 스토리지 경로를 관리합니다.", + "message": "Manage storage paths for this server.", + "placeholder": null + }, + { + "id": "Error getting home directory: {Error}", + "translation": "홈 디렉터리를 가져오는 중 오류 발생: {Error}", + "message": "Error getting home directory: {Error}", + "placeholder": null + }, + { + "id": "Go Back", + "translation": "뒤로 가기", + "message": "Go Back", + "placeholder": null + }, + { + "id": "Add new storage path", + "translation": "새 스토리지 경로 추가", + "message": "Add new storage path", + "placeholder": null + }, + { + "id": "Delete {P}", + "translation": "{P} 삭제", + "message": "Delete {P}", + "placeholder": null + }, + { + "id": "Storage paths for this server:", + "translation": "이 서버의 스토리지 경로:", + "message": "Storage paths for this server:", + "placeholder": null + }, + { + "id": "Enter storage path to add", + "translation": "추가할 스토리지 경로 입력", + "message": "Enter storage path to add", + "placeholder": null + }, + { + "id": "No path provided", + "translation": "경로가 제공되지 않았습니다", + "message": "No path provided", + "placeholder": null + }, + { + "id": "Path already exists", + "translation": "경로가 이미 존재합니다", + "message": "Path already exists", + "placeholder": null + }, + { + "id": "Storage type for {ExpandedPath}", + "translation": "{ExpandedPath}의 스토리지 유형", + "message": "Storage type for {ExpandedPath}", + "placeholder": null + }, + { + "id": "Seal (fast storage for sealing operations)", + "translation": "Seal (시일 작업을 위한 고속 스토리지)", + "message": "Seal (fast storage for sealing operations)", + "placeholder": null + }, + { + "id": "Store (long-term storage for sealed sectors)", + "translation": "Store (시일된 섹터의 장기 저장용 스토리지)", + "message": "Store (long-term storage for sealed sectors)", + "placeholder": null + }, + { + "id": "Both (seal and store)", + "translation": "Both (시일 및 저장용)", + "message": "Both (seal and store)", + "placeholder": null + }, + { + "id": "Error writing storage.json: {Error}", + "translation": "storage.json을 쓰는 중 오류 발생: {Error}", + "message": "Error writing storage.json: {Error}", + "placeholder": null + }, + { + "id": "Storage path {ExpandedPath} added as {StorageTypeStr}. You'll need to initialize it with: curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "translation": "스토리지 경로 {ExpandedPath}가 {StorageTypeStr}(으)로 추가되었습니다. 다음 명령으로 초기화해야 합니다: curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "message": "Storage path {ExpandedPath} added as {StorageTypeStr}. You'll need to initialize it with: curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "placeholder": null + }, + { + "id": "Storage path added", + "translation": "스토리지 경로가 추가되었습니다", + "message": "Storage path added", + "placeholder": null + }, + { + "id": "Really delete {PathToDelete}?", + "translation": "{PathToDelete}을(를) 정말 삭제하시겠습니까?", + "message": "Really delete {PathToDelete}?", + "placeholder": null + }, + { + "id": "Yes, delete it", + "translation": "예, 삭제합니다", + "message": "Yes, delete it", + "placeholder": null + }, + { + "id": "No, keep it", + "translation": "아니요, 유지합니다", + "message": "No, keep it", + "placeholder": null + }, + { + "id": "Storage path {PathToDelete} removed from configuration", + "translation": "스토리지 경로 {PathToDelete}이(가) 구성에서 제거되었습니다", + "message": "Storage path {PathToDelete} removed from configuration", + "placeholder": null + }, + { + "id": "Storage path deleted", + "translation": "스토리지 경로가 삭제되었습니다", + "message": "Storage path deleted", + "placeholder": null + }, + { + "id": "PDP (Proof of Data Possession) Configuration", + "translation": "PDP (데이터 보유 증명) 구성", + "message": "PDP (Proof of Data Possession) Configuration", + "placeholder": null + }, + { + "id": "This will configure PDP settings for your Curio cluster.", + "translation": "Curio 클러스터의 PDP 설정을 구성합니다.", + "message": "This will configure PDP settings for your Curio cluster.", + "placeholder": null + }, + { + "id": "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp", + "translation": "자세한 문서는 다음을 참조하세요: https://docs.curiostorage.org/experimental-features/enable-pdp", + "message": "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp", + "placeholder": null + }, + { + "id": "PDP layer already exists. What would you like to do?", + "translation": "PDP 레이어가 이미 존재합니다. 어떻게 하시겠습니까?", + "message": "PDP layer already exists. What would you like to do?", + "placeholder": null + }, + { + "id": "Reconfigure PDP", + "translation": "PDP 재구성", + "message": "Reconfigure PDP", + "placeholder": null + }, + { + "id": "Skip PDP setup", + "translation": "PDP 설정 건너뛰기", + "message": "Skip PDP setup", + "placeholder": null + }, + { + "id": "Creating PDP configuration layer...", + "translation": "PDP 구성 레이어를 생성 중...", + "message": "Creating PDP configuration layer...", + "placeholder": null + }, + { + "id": "Error loading existing PDP config: {Error}", + "translation": "기존 PDP 구성 로드 중 오류 발생: {Error}", + "message": "Error loading existing PDP config: {Error}", + "placeholder": null + }, + { + "id": "Configuring HTTP settings for PDP...", + "translation": "PDP를 위한 HTTP 설정 구성 중...", + "message": "Configuring HTTP settings for PDP...", + "placeholder": null + }, + { + "id": "Enter your domain name (e.g., market.mydomain.com)", + "translation": "도메인 이름을 입력하세요 (예: market.mydomain.com)", + "message": "Enter your domain name (e.g., market.mydomain.com)", + "placeholder": null + }, + { + "id": "No domain provided, skipping HTTP configuration", + "translation": "도메인이 제공되지 않아 HTTP 구성을 건너뜁니다", + "message": "No domain provided, skipping HTTP configuration", + "placeholder": null + }, + { + "id": "Listen address for HTTP server", + "translation": "HTTP 서버의 수신 주소", + "message": "Listen address for HTTP server", + "placeholder": null + }, + { + "id": "Error generating PDP config: {Error}", + "translation": "PDP 구성 생성 중 오류 발생: {Error}", + "message": "Error generating PDP config: {Error}", + "placeholder": null + }, + { + "id": "Error saving PDP config: {Error}", + "translation": "PDP 구성 저장 중 오류 발생: {Error}", + "message": "Error saving PDP config: {Error}", + "placeholder": null + }, + { + "id": "PDP configuration layer created", + "translation": "PDP 구성 레이어가 생성되었습니다", + "message": "PDP configuration layer created", + "placeholder": null + }, + { + "id": "Setting up PDP wallet...", + "translation": "PDP 지갑을 설정 중...", + "message": "Setting up PDP wallet...", + "placeholder": null + }, + { + "id": "You need a delegated Filecoin wallet address to use with PDP.", + "translation": "PDP를 사용하려면 위임된 Filecoin 지갑 주소가 필요합니다.", + "message": "You need a delegated Filecoin wallet address to use with PDP.", + "placeholder": null + }, + { + "id": "Use existing key, ending in {AddressSuffix}", + "translation": "기존 키 사용 ({AddressSuffix}로 끝남)", + "message": "Use existing key, ending in {AddressSuffix}", + "placeholder": null + }, + { + "id": "Import delegated wallet private key", + "translation": "위임된 지갑 개인 키 가져오기", + "message": "Import delegated wallet private key", + "placeholder": null + }, + { + "id": "Skip wallet setup for now", + "translation": "지갑 설정을 지금은 건너뛰기", + "message": "Skip wallet setup for now", + "placeholder": null + }, + { + "id": "How would you like to proceed?", + "translation": "어떻게 진행하시겠습니까?", + "message": "How would you like to proceed?", + "placeholder": null + }, + { + "id": "You can set up the wallet later using the Curio GUI or CLI", + "translation": "Curio GUI 또는 CLI를 사용하여 나중에 지갑을 설정할 수 있습니다", + "message": "You can set up the wallet later using the Curio GUI or CLI", + "placeholder": null + }, + { + "id": "Using existing PDP wallet key: {ExistingKeyAddress}", + "translation": "기존 PDP 지갑 키 사용 중: {ExistingKeyAddress}", + "message": "Using existing PDP wallet key: {ExistingKeyAddress}", + "placeholder": null + }, + { + "id": "PDP wallet configured", + "translation": "PDP 지갑이 구성되었습니다", + "message": "PDP wallet configured", + "placeholder": null + }, + { + "id": "You can create a new delegated wallet using Lotus:", + "translation": "Lotus를 사용하여 새 위임 지갑을 생성할 수 있습니다:", + "message": "You can create a new delegated wallet using Lotus:", + "placeholder": null + }, + { + "id": "lotus wallet new delegated", + "translation": "lotus wallet new delegated", + "message": "lotus wallet new delegated", + "placeholder": null + }, + { + "id": "Then export its private key with:", + "translation": "그런 다음 다음 명령으로 개인 키를 내보내세요:", + "message": "Then export its private key with:", + "placeholder": null + }, + { + "id": "lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "translation": "lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "message": "lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "placeholder": null + }, + { + "id": "Enter your delegated wallet private key (hex format):", + "translation": "위임된 지갑 개인 키를 입력하세요 (16진수 형식):", + "message": "Enter your delegated wallet private key (hex format):", + "placeholder": null + }, + { + "id": "Private key", + "translation": "개인 키", + "message": "Private key", + "placeholder": null + }, + { + "id": "No private key provided", + "translation": "개인 키가 제공되지 않았습니다", + "message": "No private key provided", + "placeholder": null + }, + { + "id": "PDP setup complete!", + "translation": "PDP 설정이 완료되었습니다!", + "message": "PDP setup complete!", + "placeholder": null + }, + { + "id": "To start Curio with PDP enabled, run:", + "translation": "PDP를 활성화하여 Curio를 시작하려면 다음을 실행하세요:", + "message": "To start Curio with PDP enabled, run:", + "placeholder": null + }, + { + "id": "curio run --layers=gui,pdp", + "translation": "curio run --layers=gui,pdp", + "message": "curio run --layers=gui,pdp", + "placeholder": null + }, + { + "id": "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.", + "translation": "PDP 작업을 위해 FIL/tFIL을 0x 지갑 주소로 보내야 합니다.", + "message": "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.", + "placeholder": null + }, + { + "id": "Next steps:", + "translation": "다음 단계:", + "message": "Next steps:", + "placeholder": null + }, + { + "id": "1. Test your PDP service with: pdptool ping --service-url https://{Domain} --service-name public", + "translation": "1. 다음 명령으로 PDP 서비스를 테스트하세요: pdptool ping --service-url https://{Domain} --service-name public", + "message": "1. Test your PDP service with: pdptool ping --service-url https://{Domain} --service-name public", + "placeholder": null + }, + { + "id": "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public", + "translation": "1. 다음 명령으로 PDP 서비스를 테스트하세요: pdptool ping --service-url https://your-domain.com --service-name public", + "message": "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public", + "placeholder": null + }, + { + "id": "2. Register your FWSS node", + "translation": "2. FWSS 노드 등록", + "message": "2. Register your FWSS node", + "placeholder": null + }, + { + "id": "3. Explore FWSS & PDP tools at https://www.filecoin.services", + "translation": "3. https://www.filecoin.services 에서 FWSS 및 PDP 도구 탐색", + "message": "3. Explore FWSS & PDP tools at https://www.filecoin.services", + "placeholder": null + }, + { + "id": "4. Join the community: Filecoin Slack #fil-pdp", + "translation": "4. 커뮤니티에 참여하세요: Filecoin Slack #fil-pdp", + "message": "4. Join the community: Filecoin Slack #fil-pdp", + "placeholder": null + }, + { + "id": "Private key cannot be empty", + "translation": "개인 키는 비워 둘 수 없습니다", + "message": "Private key cannot be empty", + "placeholder": null + }, + { + "id": "Failed to decode private key: {Error}", + "translation": "개인 키 디코딩 실패: {Error}", + "message": "Failed to decode private key: {Error}", + "placeholder": null + }, + { + "id": "Invalid private key: {Error}", + "translation": "잘못된 개인 키: {Error}", + "message": "Invalid private key: {Error}", + "placeholder": null + }, + { + "id": "Failed to import PDP key: {Error}", + "translation": "PDP 키 가져오기 실패: {Error}", + "message": "Failed to import PDP key: {Error}", + "placeholder": null + }, + { + "id": "PDP wallet imported successfully!", + "translation": "PDP 지갑이 성공적으로 가져와졌습니다!", + "message": "PDP wallet imported successfully!", + "placeholder": null + }, + { + "id": "Ethereum address (0x): {Address}", + "translation": "이더리움 주소 (0x): {Address}", + "message": "Ethereum address (0x): {Address}", + "placeholder": null + }, + { + "id": "PDP wallet imported", + "translation": "PDP 지갑이 가져와졌습니다", + "message": "PDP wallet imported", + "placeholder": null + }, + { + "id": "Supra consensus testing utilities", + "translation": "수프라 합의 테스트 유틸리티", + "message": "Supra consensus testing utilities", + "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 index c36f8443e..8e0014cd4 100644 --- a/cmd/curio/internal/translations/locales/ko/out.gotext.json +++ b/cmd/curio/internal/translations/locales/ko/out.gotext.json @@ -1,17 +1,4 @@ { "language": "ko", - "messages": [ - { - "id": "Compute WindowPoSt vanilla proofs and verify them.", - "translation": "", - "message": "Compute WindowPoSt vanilla proofs and verify them.", - "placeholder": null - }, - { - "id": "Supra consensus testing utilities", - "translation": "", - "message": "Supra consensus testing utilities", - "placeholder": null - } - ] + "messages": [] } diff --git a/cmd/curio/internal/translations/locales/zh/messages.gotext.json b/cmd/curio/internal/translations/locales/zh/messages.gotext.json index bd7a71f53..e38187ace 100644 --- a/cmd/curio/internal/translations/locales/zh/messages.gotext.json +++ b/cmd/curio/internal/translations/locales/zh/messages.gotext.json @@ -989,9 +989,9 @@ "placeholder": null }, { - "id": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster \u003c miner ID \u003e' to finish the configuration.", - "translation": "该过程部分幂等。一旦创建了新的矿工角色,并且随后的步骤失败,用户需要运行 'curio config new-cluster \u003c 矿工 ID \u003e' 来完成配置。", - "message": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster \u003c miner ID \u003e' to finish the configuration.", + "id": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.", + "translation": "该过程部分幂等。一旦创建了新的矿工角色,并且随后的步骤失败,用户需要运行 'curio config new-cluster < 矿工 ID >' 来完成配置。", + "message": "This process is partially idempotent. Once a new miner actor has been created and subsequent steps fail, the user need to run 'curio config new-cluster < miner ID >' to finish the configuration.", "placeholder": null }, { @@ -1487,9 +1487,9 @@ "placeholder": null }, { - "id": "\u003csector\u003e", - "translation": "\u003c扇区\u003e", - "message": "\u003csector\u003e", + "id": "", + "translation": "<扇区>", + "message": "", "placeholder": null }, { @@ -1925,9 +1925,9 @@ "placeholder": null }, { - "id": "Set the target unseal state for a specific sector.\n \u003cminer-id\u003e: The storage provider ID\n \u003csector-number\u003e: The sector number\n \u003ctarget-state\u003e: The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.", - "translation": "为特定扇区设置目标解封状态。\n \u003cminer-id\u003e: 存储提供者 ID\n \u003csector-number\u003e: 扇区号\n \u003ctarget-state\u003e: 目标状态(true、false 或 none)\n\n 解封目标状态表示 Curio 应如何维护扇区的未密封副本。\n\t 如果目标状态为 true,Curio 将确保扇区未密封。\n\t 如果目标状态为 false,Curio 将确保扇区没有未密封副本。\n\t 如果目标状态为 none,Curio 将不会更改扇区的当前状态。\n\n 当前,Curio 仅在目标状态从其他状态更改为 true 时启动新的解封进程。\n\n 当目标状态为 false 且存在未密封的扇区文件时,GC 标记步骤将为未密封的扇区文件创建一个删除标记。文件将在删除标记被接受后才会被移除。", - "message": "Set the target unseal state for a specific sector.\n \u003cminer-id\u003e: The storage provider ID\n \u003csector-number\u003e: The sector number\n \u003ctarget-state\u003e: The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.", + "id": "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.", + "translation": "为特定扇区设置目标解封状态。\n : 存储提供者 ID\n : 扇区号\n : 目标状态(true、false 或 none)\n\n 解封目标状态表示 Curio 应如何维护扇区的未密封副本。\n\t 如果目标状态为 true,Curio 将确保扇区未密封。\n\t 如果目标状态为 false,Curio 将确保扇区没有未密封副本。\n\t 如果目标状态为 none,Curio 将不会更改扇区的当前状态。\n\n 当前,Curio 仅在目标状态从其他状态更改为 true 时启动新的解封进程。\n\n 当目标状态为 false 且存在未密封的扇区文件时,GC 标记步骤将为未密封的扇区文件创建一个删除标记。文件将在删除标记被接受后才会被移除。", + "message": "Set the target unseal state for a specific sector.\n : The storage provider ID\n : The sector number\n : The target state (true, false, or none)\n\n The unseal target state indicates to curio how an unsealed copy of the sector should be maintained.\n\t If the target state is true, curio will ensure that the sector is unsealed.\n\t If the target state is false, curio will ensure that there is no unsealed copy of the sector.\n\t If the target state is none, curio will not change the current state of the sector.\n\n Currently when the curio will only start new unseal processes when the target state changes from another state to true.\n\n When the target state is false, and an unsealed sector file exists, the GC mark step will create a removal mark\n for the unsealed sector file. The file will only be removed after the removal mark is accepted.", "placeholder": null }, { @@ -1937,9 +1937,9 @@ "placeholder": null }, { - "id": "Create a check task for a specific sector, wait for its completion, and output the result.\n \u003cminer-id\u003e: The storage provider ID\n \u003csector-number\u003e: The sector number", - "translation": "为特定扇区创建检查任务,等待其完成并输出结果。\n \u003cminer-id\u003e: 存储提供者 ID\n \u003csector-number\u003e: 扇区号", - "message": "Create a check task for a specific sector, wait for its completion, and output the result.\n \u003cminer-id\u003e: The storage provider ID\n \u003csector-number\u003e: The sector number", + "id": "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number", + "translation": "为特定扇区创建检查任务,等待其完成并输出结果。\n : 存储提供者 ID\n : 扇区号", + "message": "Create a check task for a specific sector, wait for its completion, and output the result.\n : The storage provider ID\n : The sector number", "placeholder": null }, { @@ -2373,6 +2373,540 @@ "translation": "无法将配置插入数据库: {Error}", "message": "Failed to insert config into database: {Error}", "placeholder": null + }, + { + "id": "Register a PDP service provider with Filecoin Service Registry Contract", + "translation": "在 Filecoin 服务注册合约中注册 PDP 服务提供商", + "message": "Register a PDP service provider with Filecoin Service Registry Contract", + "placeholder": null + }, + { + "id": "Service provider name", + "translation": "服务提供商名称", + "message": "Service provider name", + "placeholder": null + }, + { + "id": "Service provider description", + "translation": "服务提供商描述", + "message": "Service provider description", + "placeholder": null + }, + { + "id": "URL of the service provider", + "translation": "服务提供商的 URL", + "message": "URL of the service provider", + "placeholder": null + }, + { + "id": "Minimum piece size", + "translation": "最小分片大小", + "message": "Minimum piece size", + "placeholder": null + }, + { + "id": "Maximum piece size", + "translation": "最大分片大小", + "message": "Maximum piece size", + "placeholder": null + }, + { + "id": "Supports IPNI piece CID indexing", + "translation": "支持 IPNI 分片 CID 索引", + "message": "Supports IPNI piece CID indexing", + "placeholder": null + }, + { + "id": "Supports IPNI IPFS CID indexing", + "translation": "支持 IPNI IPFS CID 索引", + "message": "Supports IPNI IPFS CID indexing", + "placeholder": null + }, + { + "id": "Storage price per TiB per month in USDFC, Default is 1 USDFC.", + "translation": "每 TiB 每月的存储价格(USDFC 计价),默认值为 1 USDFC。", + "message": "Storage price per TiB per month in USDFC, Default is 1 USDFC.", + "placeholder": null + }, + { + "id": "Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset", + "translation": "服务提供商愿意证明对存储数据集访问权限的最短频率间隔(以 epoch 为单位)", + "message": "Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset", + "placeholder": null + }, + { + "id": "Location of the service provider", + "translation": "服务提供商位置", + "message": "Location of the service provider", + "placeholder": null + }, + { + "id": "Token contract for payment (IERC20(address(0)) for FIL)", + "translation": "支付用的代币合约(FIL 使用 IERC20(address(0)))", + "message": "Token contract for payment (IERC20(address(0)) for FIL)", + "placeholder": null + }, + { + "id": "Compute WindowPoSt vanilla proofs and verify them.", + "translation": "计算 WindowPoSt 基础证明并进行验证。", + "message": "Compute WindowPoSt vanilla proofs and verify them.", + "placeholder": null + }, + { + "id": "32 GiB (recommended for mainnet)", + "translation": "32 GiB(主网推荐)", + "message": "32 GiB (recommended for mainnet)", + "placeholder": null + }, + { + "id": "Optional setup steps (you can skip these and configure later):", + "translation": "可选的设置步骤(可以跳过并稍后配置):", + "message": "Optional setup steps (you can skip these and configure later):", + "placeholder": null + }, + { + "id": "Skip optional steps", + "translation": "跳过可选步骤", + "message": "Skip optional steps", + "placeholder": null + }, + { + "id": "Storage", + "translation": "存储", + "message": "Storage", + "placeholder": null + }, + { + "id": "PDP", + "translation": "PDP", + "message": "PDP", + "placeholder": null + }, + { + "id": "Storage Configuration", + "translation": "存储配置", + "message": "Storage Configuration", + "placeholder": null + }, + { + "id": "Manage storage paths for this server.", + "translation": "管理此服务器的存储路径。", + "message": "Manage storage paths for this server.", + "placeholder": null + }, + { + "id": "Error getting home directory: {Error}", + "translation": "获取主目录时出错:{Error}", + "message": "Error getting home directory: {Error}", + "placeholder": null + }, + { + "id": "Go Back", + "translation": "返回", + "message": "Go Back", + "placeholder": null + }, + { + "id": "Add new storage path", + "translation": "添加新的存储路径", + "message": "Add new storage path", + "placeholder": null + }, + { + "id": "Delete {P}", + "translation": "删除 {P}", + "message": "Delete {P}", + "placeholder": null + }, + { + "id": "Storage paths for this server:", + "translation": "此服务器的存储路径:", + "message": "Storage paths for this server:", + "placeholder": null + }, + { + "id": "Enter storage path to add", + "translation": "输入要添加的存储路径", + "message": "Enter storage path to add", + "placeholder": null + }, + { + "id": "No path provided", + "translation": "未提供路径", + "message": "No path provided", + "placeholder": null + }, + { + "id": "Path already exists", + "translation": "路径已存在", + "message": "Path already exists", + "placeholder": null + }, + { + "id": "Storage type for {ExpandedPath}", + "translation": "{ExpandedPath} 的存储类型", + "message": "Storage type for {ExpandedPath}", + "placeholder": null + }, + { + "id": "Seal (fast storage for sealing operations)", + "translation": "Seal(用于封装操作的高速存储)", + "message": "Seal (fast storage for sealing operations)", + "placeholder": null + }, + { + "id": "Store (long-term storage for sealed sectors)", + "translation": "Store(用于封装扇区的长期存储)", + "message": "Store (long-term storage for sealed sectors)", + "placeholder": null + }, + { + "id": "Both (seal and store)", + "translation": "Both(封装和存储)", + "message": "Both (seal and store)", + "placeholder": null + }, + { + "id": "Error writing storage.json: {Error}", + "translation": "写入 storage.json 时出错:{Error}", + "message": "Error writing storage.json: {Error}", + "placeholder": null + }, + { + "id": "Storage path {ExpandedPath} added as {StorageTypeStr}. You'll need to initialize it with: curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "translation": "存储路径 {ExpandedPath} 已添加为 {StorageTypeStr}。需要使用以下命令进行初始化:curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "message": "Storage path {ExpandedPath} added as {StorageTypeStr}. You'll need to initialize it with: curio cli storage attach --init --{StorageTypeStr_1} {ExpandedPath_1}", + "placeholder": null + }, + { + "id": "Storage path added", + "translation": "已添加存储路径", + "message": "Storage path added", + "placeholder": null + }, + { + "id": "Really delete {PathToDelete}?", + "translation": "确定要删除 {PathToDelete} 吗?", + "message": "Really delete {PathToDelete}?", + "placeholder": null + }, + { + "id": "Yes, delete it", + "translation": "是,删除", + "message": "Yes, delete it", + "placeholder": null + }, + { + "id": "No, keep it", + "translation": "否,保留", + "message": "No, keep it", + "placeholder": null + }, + { + "id": "Storage path {PathToDelete} removed from configuration", + "translation": "存储路径 {PathToDelete} 已从配置中移除", + "message": "Storage path {PathToDelete} removed from configuration", + "placeholder": null + }, + { + "id": "Storage path deleted", + "translation": "存储路径已删除", + "message": "Storage path deleted", + "placeholder": null + }, + { + "id": "PDP (Proof of Data Possession) Configuration", + "translation": "PDP(数据持有证明)配置", + "message": "PDP (Proof of Data Possession) Configuration", + "placeholder": null + }, + { + "id": "This will configure PDP settings for your Curio cluster.", + "translation": "此操作将为您的 Curio 集群配置 PDP 设置。", + "message": "This will configure PDP settings for your Curio cluster.", + "placeholder": null + }, + { + "id": "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp", + "translation": "详细文档请参阅:https://docs.curiostorage.org/experimental-features/enable-pdp", + "message": "For detailed documentation, see: https://docs.curiostorage.org/experimental-features/enable-pdp", + "placeholder": null + }, + { + "id": "PDP layer already exists. What would you like to do?", + "translation": "PDP 层已存在。您希望如何操作?", + "message": "PDP layer already exists. What would you like to do?", + "placeholder": null + }, + { + "id": "Reconfigure PDP", + "translation": "重新配置 PDP", + "message": "Reconfigure PDP", + "placeholder": null + }, + { + "id": "Skip PDP setup", + "translation": "跳过 PDP 设置", + "message": "Skip PDP setup", + "placeholder": null + }, + { + "id": "Creating PDP configuration layer...", + "translation": "正在创建 PDP 配置层...", + "message": "Creating PDP configuration layer...", + "placeholder": null + }, + { + "id": "Error loading existing PDP config: {Error}", + "translation": "加载现有 PDP 配置时出错:{Error}", + "message": "Error loading existing PDP config: {Error}", + "placeholder": null + }, + { + "id": "Configuring HTTP settings for PDP...", + "translation": "正在配置 PDP 的 HTTP 设置...", + "message": "Configuring HTTP settings for PDP...", + "placeholder": null + }, + { + "id": "Enter your domain name (e.g., market.mydomain.com)", + "translation": "请输入您的域名(例如:market.mydomain.com)", + "message": "Enter your domain name (e.g., market.mydomain.com)", + "placeholder": null + }, + { + "id": "No domain provided, skipping HTTP configuration", + "translation": "未提供域名,跳过 HTTP 配置", + "message": "No domain provided, skipping HTTP configuration", + "placeholder": null + }, + { + "id": "Listen address for HTTP server", + "translation": "HTTP 服务器监听地址", + "message": "Listen address for HTTP server", + "placeholder": null + }, + { + "id": "Error generating PDP config: {Error}", + "translation": "生成 PDP 配置时出错:{Error}", + "message": "Error generating PDP config: {Error}", + "placeholder": null + }, + { + "id": "Error saving PDP config: {Error}", + "translation": "保存 PDP 配置时出错:{Error}", + "message": "Error saving PDP config: {Error}", + "placeholder": null + }, + { + "id": "PDP configuration layer created", + "translation": "已创建 PDP 配置层", + "message": "PDP configuration layer created", + "placeholder": null + }, + { + "id": "Setting up PDP wallet...", + "translation": "正在设置 PDP 钱包...", + "message": "Setting up PDP wallet...", + "placeholder": null + }, + { + "id": "You need a delegated Filecoin wallet address to use with PDP.", + "translation": "使用 PDP 需要一个委托的 Filecoin 钱包地址。", + "message": "You need a delegated Filecoin wallet address to use with PDP.", + "placeholder": null + }, + { + "id": "Use existing key, ending in {AddressSuffix}", + "translation": "使用现有密钥(以 {AddressSuffix} 结尾)", + "message": "Use existing key, ending in {AddressSuffix}", + "placeholder": null + }, + { + "id": "Import delegated wallet private key", + "translation": "导入委托钱包私钥", + "message": "Import delegated wallet private key", + "placeholder": null + }, + { + "id": "Skip wallet setup for now", + "translation": "暂时跳过钱包设置", + "message": "Skip wallet setup for now", + "placeholder": null + }, + { + "id": "How would you like to proceed?", + "translation": "您希望如何继续?", + "message": "How would you like to proceed?", + "placeholder": null + }, + { + "id": "You can set up the wallet later using the Curio GUI or CLI", + "translation": "您可以稍后通过 Curio GUI 或 CLI 设置钱包", + "message": "You can set up the wallet later using the Curio GUI or CLI", + "placeholder": null + }, + { + "id": "Using existing PDP wallet key: {ExistingKeyAddress}", + "translation": "使用现有的 PDP 钱包密钥:{ExistingKeyAddress}", + "message": "Using existing PDP wallet key: {ExistingKeyAddress}", + "placeholder": null + }, + { + "id": "PDP wallet configured", + "translation": "PDP 钱包已配置", + "message": "PDP wallet configured", + "placeholder": null + }, + { + "id": "You can create a new delegated wallet using Lotus:", + "translation": "您可以使用 Lotus 创建新的委托钱包:", + "message": "You can create a new delegated wallet using Lotus:", + "placeholder": null + }, + { + "id": "lotus wallet new delegated", + "translation": "lotus wallet new delegated", + "message": "lotus wallet new delegated", + "placeholder": null + }, + { + "id": "Then export its private key with:", + "translation": "然后使用以下命令导出其私钥:", + "message": "Then export its private key with:", + "placeholder": null + }, + { + "id": "lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "translation": "lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "message": "lotus wallet export
    | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32", + "placeholder": null + }, + { + "id": "Enter your delegated wallet private key (hex format):", + "translation": "请输入您的委托钱包私钥(十六进制格式):", + "message": "Enter your delegated wallet private key (hex format):", + "placeholder": null + }, + { + "id": "Private key", + "translation": "私钥", + "message": "Private key", + "placeholder": null + }, + { + "id": "No private key provided", + "translation": "未提供私钥", + "message": "No private key provided", + "placeholder": null + }, + { + "id": "PDP setup complete!", + "translation": "PDP 设置完成!", + "message": "PDP setup complete!", + "placeholder": null + }, + { + "id": "To start Curio with PDP enabled, run:", + "translation": "要启用 PDP 并启动 Curio,请运行:", + "message": "To start Curio with PDP enabled, run:", + "placeholder": null + }, + { + "id": "curio run --layers=gui,pdp", + "translation": "curio run --layers=gui,pdp", + "message": "curio run --layers=gui,pdp", + "placeholder": null + }, + { + "id": "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.", + "translation": "请确保将 FIL/tFIL 发送至您的 0x 钱包地址以进行 PDP 操作。", + "message": "Make sure to send FIL/tFIL to your 0x wallet address for PDP operations.", + "placeholder": null + }, + { + "id": "Next steps:", + "translation": "下一步:", + "message": "Next steps:", + "placeholder": null + }, + { + "id": "1. Test your PDP service with: pdptool ping --service-url https://{Domain} --service-name public", + "translation": "1. 使用以下命令测试您的 PDP 服务:pdptool ping --service-url https://{Domain} --service-name public", + "message": "1. Test your PDP service with: pdptool ping --service-url https://{Domain} --service-name public", + "placeholder": null + }, + { + "id": "2. Register your FWSS node", + "translation": "2. 注册您的 FWSS 节点", + "message": "2. Register your FWSS node", + "placeholder": null + }, + { + "id": "3. Explore FWSS & PDP tools at https://www.filecoin.services", + "translation": "3. 在 https://www.filecoin.services 浏览 FWSS 和 PDP 工具", + "message": "3. Explore FWSS & PDP tools at https://www.filecoin.services", + "placeholder": null + }, + { + "id": "4. Join the community: Filecoin Slack #fil-pdp", + "translation": "4. 加入社区:Filecoin Slack #fil-pdp", + "message": "4. Join the community: Filecoin Slack #fil-pdp", + "placeholder": null + }, + { + "id": "Private key cannot be empty", + "translation": "私钥不能为空", + "message": "Private key cannot be empty", + "placeholder": null + }, + { + "id": "Failed to decode private key: {Error}", + "translation": "私钥解码失败:{Error}", + "message": "Failed to decode private key: {Error}", + "placeholder": null + }, + { + "id": "Invalid private key: {Error}", + "translation": "无效的私钥:{Error}", + "message": "Invalid private key: {Error}", + "placeholder": null + }, + { + "id": "Failed to import PDP key: {Error}", + "translation": "导入 PDP 密钥失败:{Error}", + "message": "Failed to import PDP key: {Error}", + "placeholder": null + }, + { + "id": "PDP wallet imported successfully!", + "translation": "成功导入 PDP 钱包!", + "message": "PDP wallet imported successfully!", + "placeholder": null + }, + { + "id": "Ethereum address (0x): {Address}", + "translation": "以太坊地址 (0x):{Address}", + "message": "Ethereum address (0x): {Address}", + "placeholder": null + }, + { + "id": "PDP wallet imported", + "translation": "PDP 钱包已导入", + "message": "PDP wallet imported", + "placeholder": null + }, + { + "id": "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public", + "translation": "1. 使用以下命令测试您的 PDP 服务:pdptool ping --service-url https://your-domain.com --service-name public", + "message": "1. Test your PDP service with: pdptool ping --service-url https://your-domain.com --service-name public", + "placeholder": null + }, + { + "id": "Supra consensus testing utilities", + "translation": "超越共识测试工具", + "message": "Supra consensus testing utilities", + "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 index b58d6a188..bb9d25e4c 100644 --- a/cmd/curio/internal/translations/locales/zh/out.gotext.json +++ b/cmd/curio/internal/translations/locales/zh/out.gotext.json @@ -1,17 +1,4 @@ { "language": "zh", - "messages": [ - { - "id": "Compute WindowPoSt vanilla proofs and verify them.", - "translation": "", - "message": "Compute WindowPoSt vanilla proofs and verify them.", - "placeholder": null - }, - { - "id": "Supra consensus testing utilities", - "translation": "", - "message": "Supra consensus testing utilities", - "placeholder": null - } - ] + "messages": [] } diff --git a/cmd/curio/main.go b/cmd/curio/main.go index 9c1cabc95..4413f4e94 100644 --- a/cmd/curio/main.go +++ b/cmd/curio/main.go @@ -46,11 +46,12 @@ func SetupLogLevels() { func setupCloseHandler() { c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt, syscall.SIGTERM) + // Register our handler first, before runApp's handler + signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGABRT) go func() { <-c fmt.Println("\r- Ctrl+C pressed in Terminal") - _ = pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) + _ = pprof.Lookup("goroutine").WriteTo(os.Stdout, 2) panic(1) }() } @@ -229,12 +230,6 @@ var fetchParamCmd = &cli.Command{ } func runApp(app *cli.App) { - c := make(chan os.Signal, 1) - signal.Notify(c, syscall.SIGTERM, syscall.SIGINT) - go func() { - <-c - os.Exit(1) - }() if err := app.Run(os.Args); err != nil { if os.Getenv("LOTUS_DEV") != "" { diff --git a/cmd/curio/rpc/rpc.go b/cmd/curio/rpc/rpc.go index a6647aea2..41410a61b 100644 --- a/cmd/curio/rpc/rpc.go +++ b/cmd/curio/rpc/rpc.go @@ -12,6 +12,7 @@ import ( "net/url" "os" "path/filepath" + "strings" "time" "github.com/gbrlsnchs/jwt/v3" @@ -490,9 +491,13 @@ func ListenAndServe(ctx context.Context, dependencies *deps.Deps, shutdownChan c }() uiAddress := dependencies.Cfg.Subsystems.GuiAddress - if uiAddress == "" || uiAddress[0] == ':' { - uiAddress = "localhost" + uiAddress + if uiAddress == "" || uiAddress[0] == ':' || uiAddress == "0.0.0.0:4701" { + split := strings.Split(uiAddress, ":") + if len(split) == 2 { + uiAddress = "localhost:" + split[1] + } } + log.Infof("GUI: http://%s", uiAddress) eg.Go(web.ListenAndServe) } diff --git a/cmd/curio/tasks/tasks.go b/cmd/curio/tasks/tasks.go index 3b90eaaed..1d390dc23 100644 --- a/cmd/curio/tasks/tasks.go +++ b/cmd/curio/tasks/tasks.go @@ -64,7 +64,7 @@ var log = logging.Logger("curio/deps") func WindowPostScheduler(ctx context.Context, fc config.CurioFees, pc config.CurioProvingConfig, api api.Chain, verif storiface.Verifier, paramck func() (bool, error), sender *message.Sender, chainSched *chainsched.CurioChainSched, - as *multictladdr.MultiAddressSelector, addresses map[dtypes.MinerAddress]bool, db *harmonydb.DB, + as *multictladdr.MultiAddressSelector, addresses *config.Dynamic[map[dtypes.MinerAddress]bool], db *harmonydb.DB, stor paths.Store, idx paths.SectorIndex, max int) (*window2.WdPostTask, *window2.WdPostSubmitTask, *window2.WdPostRecoverDeclareTask, error) { // todo config @@ -102,7 +102,6 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan machine := dependencies.ListenAddr prover := dependencies.Prover iStore := dependencies.IndexStore - pp := dependencies.SectorReader chainSched := chainsched.New(full) @@ -236,44 +235,48 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan { // Piece handling if cfg.Subsystems.EnableParkPiece { - parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark, p2Active, cfg.Subsystems.ParkPieceMinFreeStoragePercent) + parkPieceTask, err := piece2.NewParkPieceTask(db, must.One(slrLazy.Val()), stor, cfg.Subsystems.ParkPieceMaxTasks, cfg.Subsystems.ParkPieceMaxInPark, p2Active, cfg.Subsystems.ParkPieceMinFreeStoragePercent) if err != nil { return nil, err } cleanupPieceTask := piece2.NewCleanupPieceTask(db, must.One(slrLazy.Val()), 0) - activeTasks = append(activeTasks, parkPieceTask, cleanupPieceTask) + aggregateChunksTask := piece2.NewAggregateChunksTask(db, stor, must.One(slrLazy.Val())) + activeTasks = append(activeTasks, parkPieceTask, cleanupPieceTask, aggregateChunksTask) } } - miners := make([]address.Address, 0, len(maddrs)) - for k := range maddrs { - miners = append(miners, address.Address(k)) - } - - if cfg.Subsystems.EnableBalanceManager { - balMgrTask, err := storage_market.NewBalanceManager(full, miners, cfg, sender) - if err != nil { - return nil, err + miners := config.NewDynamic(make([]address.Address, 0, len(maddrs.Get()))) + forMiners := func() { + minersTmp := make([]address.Address, 0, len(maddrs.Get())) + for k := range maddrs.Get() { + minersTmp = append(minersTmp, address.Address(k)) } - activeTasks = append(activeTasks, balMgrTask) + miners.Set(minersTmp) } + maddrs.OnChange(forMiners) { + var sdeps cuhttp.ServiceDeps // Market tasks var dm *storage_market.CurioStorageDealMarket if cfg.Subsystems.EnableDealMarket { // Main market poller should run on all nodes - dm = storage_market.NewCurioStorageDealMarket(miners, db, cfg, si, full, as) + dm = storage_market.NewCurioStorageDealMarket(miners, db, cfg, must.One(dependencies.EthClient.Val()), si, full, as, must.One(slrLazy.Val())) err := dm.StartMarket(ctx) if err != nil { return nil, err } + sdeps.DealMarket = dm + if cfg.Subsystems.EnableCommP { commpTask := storage_market.NewCommpTask(dm, db, must.One(slrLazy.Val()), full, cfg.Subsystems.CommPMaxTasks, cfg.Subsystems.BindCommPToData) activeTasks = append(activeTasks, commpTask) } + aggTask := storage_market.NewAggregateTask(dm, db, must.One(slrLazy.Val()), lstor, full) + activeTasks = append(activeTasks, aggTask) + // PSD and Deal find task do not require many resources. They can run on all machines psdTask := storage_market.NewPSDTask(dm, db, sender, as, &cfg.Market.StorageMarketConfig.MK12, full) dealFindTask := storage_market.NewFindDealTask(dm, db, full, &cfg.Market.StorageMarketConfig.MK12) @@ -290,30 +293,48 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan if err != nil { return nil, err } - var sdeps cuhttp.ServiceDeps if cfg.Subsystems.EnablePDP { es := getSenderEth() sdeps.EthSender = es - pdp.NewWatcherCreate(db, must.One(dependencies.EthClient.Val()), chainSched) - pdp.NewWatcherRootAdd(db, must.One(dependencies.EthClient.Val()), chainSched) + ethClient := must.One(dependencies.EthClient.Val()) - pdpProveTask := pdp.NewProveTask(chainSched, db, must.One(dependencies.EthClient.Val()), dependencies.Chain, es, dependencies.CachedPieceReader) - pdpNextProvingPeriodTask := pdp.NewNextProvingPeriodTask(db, must.One(dependencies.EthClient.Val()), dependencies.Chain, chainSched, es) - pdpInitProvingPeriodTask := pdp.NewInitProvingPeriodTask(db, must.One(dependencies.EthClient.Val()), dependencies.Chain, chainSched, es) + pdp.NewWatcherDataSetCreate(db, ethClient, chainSched) + pdp.NewWatcherPieceAdd(db, chainSched, ethClient) + pdp.NewWatcherDelete(db, chainSched) + pdp.NewWatcherPieceDelete(db, chainSched) + + pdpProveTask := pdp.NewProveTask(chainSched, db, ethClient, dependencies.Chain, es, dependencies.CachedPieceReader, iStore) + pdpNextProvingPeriodTask := pdp.NewNextProvingPeriodTask(db, ethClient, dependencies.Chain, chainSched, es) + pdpInitProvingPeriodTask := pdp.NewInitProvingPeriodTask(db, ethClient, dependencies.Chain, chainSched, es) pdpNotifTask := pdp.NewPDPNotifyTask(db) - activeTasks = append(activeTasks, pdpNotifTask, pdpProveTask, pdpNextProvingPeriodTask, pdpInitProvingPeriodTask) + + addProofSetTask := pdp.NewPDPTaskAddDataSet(db, es, ethClient, full) + pdpAddRoot := pdp.NewPDPTaskAddPiece(db, es, ethClient) + pdpDelRoot := pdp.NewPDPTaskDeletePiece(db, es, ethClient) + pdpDelProofSetTask := pdp.NewPDPTaskDeleteDataSet(db, es, ethClient, full) + + pdpAggregateTask := pdp.NewAggregatePDPDealTask(db, sc) + pdpCache := pdp.NewTaskPDPSaveCache(db, dependencies.CachedPieceReader, iStore) + commPTask := pdp.NewPDPCommpTask(db, sc, cfg.Subsystems.CommPMaxTasks) + + activeTasks = append(activeTasks, pdpNotifTask, pdpProveTask, pdpNextProvingPeriodTask, pdpInitProvingPeriodTask, commPTask, pdpAddRoot, addProofSetTask, pdpAggregateTask, pdpCache, pdpDelRoot, pdpDelProofSetTask) } idxMax := taskhelp.Max(cfg.Subsystems.IndexingMaxTasks) - indexingTask := indexing.NewIndexingTask(db, sc, iStore, pp, cfg, idxMax) - ipniTask := indexing.NewIPNITask(db, sc, iStore, pp, cfg, idxMax) - activeTasks = append(activeTasks, ipniTask, indexingTask) + indexingTask := indexing.NewIndexingTask(db, sc, iStore, dependencies.SectorReader, dependencies.CachedPieceReader, cfg, idxMax) + ipniTask := indexing.NewIPNITask(db, sc, dependencies.SectorReader, dependencies.CachedPieceReader, cfg, idxMax) + pdpIdxTask := indexing.NewPDPIndexingTask(db, sc, iStore, dependencies.CachedPieceReader, cfg, idxMax) + pdpIPNITask := indexing.NewPDPIPNITask(db, sc, dependencies.CachedPieceReader, cfg, idxMax) + activeTasks = append(activeTasks, ipniTask, indexingTask, pdpIdxTask, pdpIPNITask) if cfg.HTTP.Enable { - err = cuhttp.StartHTTPServer(ctx, dependencies, &sdeps, dm) + if !cfg.Subsystems.EnableDealMarket { + return nil, xerrors.New("deal market must be enabled on HTTP server") + } + err = cuhttp.StartHTTPServer(ctx, dependencies, &sdeps) if err != nil { return nil, xerrors.Errorf("failed to start the HTTP server: %w", err) } @@ -323,6 +344,9 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps, shutdownChan chan amTask := alertmanager.NewAlertTask(full, db, cfg.Alerting, dependencies.Al) activeTasks = append(activeTasks, amTask) + pcl := gc.NewPieceCleanupTask(db, iStore) + activeTasks = append(activeTasks, pcl) + log.Infow("This Curio instance handles", "miner_addresses", miners, "tasks", lo.Map(activeTasks, func(t harmonytask.TaskInterface, _ int) string { return t.TypeDetails().Name })) @@ -511,50 +535,54 @@ func machineDetails(deps *deps.Deps, activeTasks []harmonytask.TaskInterface, ma return item.TypeDetails().Name }) - miners := lo.Map(maps.Keys(deps.Maddrs), func(item dtypes.MinerAddress, _ int) string { - return address.Address(item).String() - }) - sort.Strings(miners) + doMachineDetails := func() { + miners := lo.Map(maps.Keys(deps.Maddrs.Get()), func(item dtypes.MinerAddress, _ int) string { + return address.Address(item).String() + }) + sort.Strings(miners) - _, err := deps.DB.Exec(context.Background(), `INSERT INTO harmony_machine_details + _, err := deps.DB.Exec(context.Background(), `INSERT INTO harmony_machine_details (tasks, layers, startup_time, miners, machine_id, machine_name) VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT (machine_id) DO UPDATE SET tasks=$1, layers=$2, startup_time=$3, miners=$4, machine_id=$5, machine_name=$6`, - strings.Join(taskNames, ","), strings.Join(deps.Layers, ","), - time.Now(), strings.Join(miners, ","), machineID, machineName) - - if err != nil { - log.Errorf("failed to update machine details: %s", err) - return - } + strings.Join(taskNames, ","), strings.Join(deps.Layers, ","), + time.Now(), strings.Join(miners, ","), machineID, machineName) - // maybePostWarning - if !lo.Contains(taskNames, "WdPost") && !lo.Contains(taskNames, "WinPost") { - // Maybe we aren't running a PoSt for these miners? - var allMachines []struct { - MachineID int `db:"machine_id"` - Miners string `db:"miners"` - Tasks string `db:"tasks"` - } - err := deps.DB.Select(context.Background(), &allMachines, `SELECT machine_id, miners, tasks FROM harmony_machine_details`) if err != nil { - log.Errorf("failed to get machine details: %s", err) + log.Errorf("failed to update machine details: %s", err) return } - for _, miner := range miners { - var myPostIsHandled bool - for _, m := range allMachines { - if !lo.Contains(strings.Split(m.Miners, ","), miner) { - continue + // maybePostWarning + if !lo.Contains(taskNames, "WdPost") && !lo.Contains(taskNames, "WinPost") { + // Maybe we aren't running a PoSt for these miners? + var allMachines []struct { + MachineID int `db:"machine_id"` + Miners string `db:"miners"` + Tasks string `db:"tasks"` + } + err := deps.DB.Select(context.Background(), &allMachines, `SELECT machine_id, miners, tasks FROM harmony_machine_details`) + if err != nil { + log.Errorf("failed to get machine details: %s", err) + return + } + + for _, miner := range miners { + var myPostIsHandled bool + for _, m := range allMachines { + if !lo.Contains(strings.Split(m.Miners, ","), miner) { + continue + } + if lo.Contains(strings.Split(m.Tasks, ","), "WdPost") && lo.Contains(strings.Split(m.Tasks, ","), "WinPost") { + myPostIsHandled = true + break + } } - if lo.Contains(strings.Split(m.Tasks, ","), "WdPost") && lo.Contains(strings.Split(m.Tasks, ","), "WinPost") { - myPostIsHandled = true - break + if !myPostIsHandled { + log.Errorf("No PoSt tasks are running for miner %s. Start handling PoSts immediately with:\n\tcurio run --layers=\"post\" ", miner) } } - if !myPostIsHandled { - log.Errorf("No PoSt tasks are running for miner %s. Start handling PoSts immediately with:\n\tcurio run --layers=\"post\" ", miner) - } } } + doMachineDetails() + deps.Maddrs.OnChange(doMachineDetails) } diff --git a/cmd/curio/test-cli.go b/cmd/curio/test-cli.go index 94401b638..17a3eee4f 100644 --- a/cmd/curio/test-cli.go +++ b/cmd/curio/test-cli.go @@ -106,7 +106,7 @@ var wdPostTaskCmd = &cli.Command{ } var taskIDs []int64 - for addr := range deps.Maddrs { + for addr := range deps.Maddrs.Get() { maddr, err := address.IDFromAddress(address.Address(addr)) if err != nil { return xerrors.Errorf("cannot get miner id %w", err) @@ -258,7 +258,7 @@ It will not send any messages to the chain. Since it can compute any deadline, o } _, _ = wdPoStSubmitTask, derlareRecoverTask - if len(deps.Maddrs) == 0 { + if len(deps.Maddrs.Get()) == 0 { return errors.New("no miners to compute WindowPoSt for") } head, err := deps.Chain.ChainHead(ctx) @@ -268,7 +268,7 @@ It will not send any messages to the chain. Since it can compute any deadline, o di := dline.NewInfo(head.Height(), cctx.Uint64("deadline"), 0, 0, 0, 10 /*challenge window*/, 0, 0) - for maddr := range deps.Maddrs { + for maddr := range deps.Maddrs.Get() { if spAddr != address.Undef && address.Address(maddr) != spAddr { continue } @@ -338,7 +338,7 @@ var wdPostVanillaCmd = &cli.Command{ } _, _ = wdPoStSubmitTask, derlareRecoverTask - if len(deps.Maddrs) == 0 { + if len(deps.Maddrs.Get()) == 0 { return errors.New("no miners to compute WindowPoSt for") } head, err := deps.Chain.ChainHead(ctx) @@ -348,7 +348,7 @@ var wdPostVanillaCmd = &cli.Command{ di := dline.NewInfo(head.Height(), cctx.Uint64("deadline"), 0, 0, 0, 10 /*challenge window*/, 0, 0) - for maddr := range deps.Maddrs { + for maddr := range deps.Maddrs.Get() { if spAddr != address.Undef && address.Address(maddr) != spAddr { continue } diff --git a/cmd/curio/toolbox.go b/cmd/curio/toolbox.go index c9333a98b..945dccc08 100644 --- a/cmd/curio/toolbox.go +++ b/cmd/curio/toolbox.go @@ -4,9 +4,13 @@ import ( "encoding/json" "fmt" "io" + mbig "math/big" "net/http" + "net/url" "strconv" + "github.com/docker/go-units" + "github.com/ethereum/go-ethereum/common" "github.com/ipfs/go-cid" "github.com/urfave/cli/v2" "golang.org/x/xerrors" @@ -17,6 +21,7 @@ import ( "github.com/filecoin-project/curio/cmd/curio/internal/translations" "github.com/filecoin-project/curio/deps" "github.com/filecoin-project/curio/lib/reqcontext" + "github.com/filecoin-project/curio/pdp/contract" "github.com/filecoin-project/lotus/chain/types" ) @@ -30,6 +35,7 @@ var toolboxCmd = &cli.Command{ Usage: translations.T("Tool Box for Curio"), Subcommands: []*cli.Command{ fixMsgCmd, + registerPDPServiceProviderCmd, }, } @@ -288,3 +294,148 @@ func ffMsg2Message(ffmsg FilfoxMsg) (types.Message, error) { Params: []byte(ffmsg.Params), }, nil } + +var registerPDPServiceProviderCmd = &cli.Command{ + Name: "register-pdp-service-provider", + Usage: translations.T("Register a PDP service provider with Filecoin Service Registry Contract"), + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "name", + Usage: translations.T("Service provider name"), + Required: true, + }, + &cli.StringFlag{ + Name: "description", + Usage: translations.T("Service provider description"), + }, + &cli.StringFlag{ + Name: "service-url", + Usage: translations.T("URL of the service provider"), + Required: true, + }, + &cli.StringFlag{ + Name: "min-size", + Usage: translations.T("Minimum piece size"), + Value: "1 MiB", + }, + &cli.StringFlag{ + Name: "max-size", + Usage: translations.T("Maximum piece size"), + Value: "64 GiB", + }, + &cli.BoolFlag{ + Name: "ipni-piece", + Usage: translations.T("Supports IPNI piece CID indexing"), + }, + &cli.BoolFlag{ + Name: "ipni-ipfs", + Usage: translations.T("Supports IPNI IPFS CID indexing"), + }, + &cli.Int64Flag{ + Name: "price", + Usage: translations.T("Storage price per TiB per month in USDFC, Default is 1 USDFC."), + Value: 1000000, + }, + &cli.Int64Flag{ + Name: "proving-period", + Usage: translations.T("Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset"), + Value: 60, + }, + &cli.StringFlag{ + Name: "location", + Usage: translations.T("Location of the service provider"), + }, + &cli.StringFlag{ + Name: "token-address", + Usage: translations.T("Token contract for payment (IERC20(address(0)) for FIL)"), + }, + }, + Action: func(cctx *cli.Context) error { + ctx := reqcontext.ReqContext(cctx) + dep, err := deps.GetDepsCLI(ctx, cctx) + if err != nil { + return err + } + + serviceURL, err := url.Parse(cctx.String("service-url")) + if err != nil { + return xerrors.Errorf("failed to parse service url: %w", err) + } + + minSize, err := units.RAMInBytes(cctx.String("min-size")) + if err != nil { + return xerrors.Errorf("failed to parse min size: %w", err) + } + + maxSize, err := units.RAMInBytes(cctx.String("max-size")) + if err != nil { + return xerrors.Errorf("failed to parse max size: %w", err) + } + + if minSize > maxSize { + return xerrors.Errorf("min size must be less than max size") + } + + ipiece := cctx.Bool("ipni-piece") + ipfs := cctx.Bool("ipni-ipfs") + + price := cctx.Int64("price") + + pp := cctx.Int64("proving-period") + if pp < 0 { + return xerrors.Errorf("proving period must be greater than 0") + } + + location := cctx.String("location") + if location == "" { + location = "Unknown" + } + + if len(location) > 128 { + return xerrors.Errorf("location must be less than 128 characters") + } + + tokenAddress := cctx.String("token-address") + + if tokenAddress == "" { + tokenAddress = "0x0000000000000000000000000000000000000000" + } + + if tokenAddress[0:1] == "0x" { + tokenAddress = tokenAddress[2:] + } + + if !common.IsHexAddress(tokenAddress) { + return xerrors.Errorf("token address is not valid") + } + + offering := contract.ServiceProviderRegistryStoragePDPOffering{ + ServiceURL: serviceURL.String(), + MinPieceSizeInBytes: mbig.NewInt(minSize), + MaxPieceSizeInBytes: mbig.NewInt(maxSize), + IpniPiece: ipiece, + IpniIpfs: ipfs, + StoragePricePerTibPerMonth: mbig.NewInt(price), + MinProvingPeriodInEpochs: mbig.NewInt(pp), + Location: location, + PaymentTokenAddress: common.HexToAddress(tokenAddress), + } + + ethClient, err := dep.EthClient.Val() + if err != nil { + return xerrors.Errorf("failed to get eth client: %w", err) + } + + name := cctx.String("name") + description := cctx.String("description") + + id, err := contract.FSRegister(ctx, dep.DB, dep.Chain, ethClient, name, description, offering, nil) + if err != nil { + return xerrors.Errorf("failed to register storage provider with service contract: %w", err) + } + + fmt.Printf("Registered storage provider with ID: %d\n", id) + + return nil + }, +} diff --git a/cmd/pdptool/main.go b/cmd/pdptool/main.go index 15428bae6..c0699a3fa 100644 --- a/cmd/pdptool/main.go +++ b/cmd/pdptool/main.go @@ -192,6 +192,8 @@ var pingCmd = &cli.Command{ return err } + serviceURL = serviceURL + "/market" + // Append /pdp/ping to the service URL pingURL := serviceURL + "/pdp/ping" @@ -537,6 +539,7 @@ var pieceUploadCmd = &cli.Command{ } serviceURL := cctx.String("service-url") + serviceURL = serviceURL + "/market" jwtToken := cctx.String("jwt-token") notifyURL := cctx.String("notify-url") serviceName := cctx.String("service-name") @@ -692,6 +695,7 @@ var uploadFileCmd = &cli.Command{ } serviceURL := cctx.String("service-url") + serviceURL = serviceURL + "/market" jwtToken := cctx.String("jwt-token") serviceName := cctx.String("service-name") hashType := cctx.String("hash-type") @@ -889,6 +893,7 @@ var createProofSetCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { serviceURL := cctx.String("service-url") + serviceURL = serviceURL + "/market" serviceName := cctx.String("service-name") recordKeeper := cctx.String("pdp-service-contract") extraDataHexStr := cctx.String("extra-data") @@ -982,6 +987,7 @@ var getProofSetStatusCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { serviceURL := cctx.String("service-url") + serviceURL = serviceURL + "/market" serviceName := cctx.String("service-name") txHash := cctx.String("tx-hash") @@ -1091,6 +1097,7 @@ var getProofSetCmd = &cli.Command{ } serviceURL := cctx.String("service-url") + serviceURL = serviceURL + "/market" serviceName := cctx.String("service-name") // Create the JWT token @@ -1195,6 +1202,7 @@ var addRootsCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { serviceURL := cctx.String("service-url") + serviceURL = serviceURL + "/market" serviceName := cctx.String("service-name") proofSetID := cctx.Uint64("proof-set-id") rootInputs := cctx.StringSlice("root") @@ -1441,6 +1449,7 @@ var removeRootsCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { serviceURL := cctx.String("service-url") + serviceURL = serviceURL + "/market" serviceName := cctx.String("service-name") proofSetID := cctx.Uint64("proof-set-id") rootID := cctx.Uint64("root-id") diff --git a/cmd/sptool/main.go b/cmd/sptool/main.go index dd3d00e9e..6fccb4c09 100644 --- a/cmd/sptool/main.go +++ b/cmd/sptool/main.go @@ -101,5 +101,6 @@ var toolboxCmd = &cli.Command{ Subcommands: []*cli.Command{ sparkCmd, mk12Clientcmd, + mk20Clientcmd, }, } diff --git a/cmd/sptool/toolbox_deal_client.go b/cmd/sptool/toolbox_deal_client.go index 3a3e27790..60db154d8 100644 --- a/cmd/sptool/toolbox_deal_client.go +++ b/cmd/sptool/toolbox_deal_client.go @@ -5,10 +5,13 @@ import ( "bytes" "context" "crypto/rand" + "crypto/sha256" + "encoding/base64" "encoding/hex" "encoding/json" "errors" "fmt" + "io" "net/http" "net/url" "os" @@ -29,21 +32,28 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/mitchellh/go-homedir" "github.com/multiformats/go-multiaddr" + "github.com/oklog/ulid" "github.com/urfave/cli/v2" "golang.org/x/term" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" + commcid "github.com/filecoin-project/go-fil-commcid" + commp "github.com/filecoin-project/go-fil-commp-hashhash" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/builtin/v16/verifreg" "github.com/filecoin-project/go-state-types/builtin/v9/market" "github.com/filecoin-project/curio/lib/keystore" + "github.com/filecoin-project/curio/lib/testutils" mk12_libp2p "github.com/filecoin-project/curio/market/libp2p" "github.com/filecoin-project/curio/market/mk12" + "github.com/filecoin-project/curio/market/mk20" + "github.com/filecoin-project/curio/market/mk20/client" - "github.com/filecoin-project/lotus/api" + lapi "github.com/filecoin-project/lotus/api" chain_types "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet" lcli "github.com/filecoin-project/lotus/cli" @@ -606,7 +616,7 @@ func dealProposal(ctx context.Context, n *Node, clientAddr address.Address, root return nil, err } - sig, err := n.Wallet.WalletSign(ctx, clientAddr, buf, api.MsgMeta{Type: api.MTDealProposal}) + sig, err := n.Wallet.WalletSign(ctx, clientAddr, buf, lapi.MsgMeta{Type: lapi.MTDealProposal}) if err != nil { return nil, xerrors.Errorf("wallet sign failed: %w", err) } @@ -1300,7 +1310,7 @@ var walletSign = &cli.Command{ return err } - sig, err := n.Wallet.WalletSign(ctx, addr, msg, api.MsgMeta{Type: api.MTUnknown}) + sig, err := n.Wallet.WalletSign(ctx, addr, msg, lapi.MsgMeta{Type: lapi.MTUnknown}) if err != nil { return err } @@ -1411,7 +1421,7 @@ var dealStatusCmd = &cli.Command{ return fmt.Errorf("getting uuid bytes: %w", err) } - sig, err := n.Wallet.WalletSign(ctx, walletAddr, uuidBytes, api.MsgMeta{Type: api.MTDealProposal}) + sig, err := n.Wallet.WalletSign(ctx, walletAddr, uuidBytes, lapi.MsgMeta{Type: lapi.MTDealProposal}) if err != nil { return fmt.Errorf("signing uuid bytes: %w", err) } @@ -1573,3 +1583,961 @@ var dealStatusCmd = &cli.Command{ return nil }, } + +var mk20Clientcmd = &cli.Command{ + Name: "mk20-client", + Usage: "mk20 client for Curio", + Flags: []cli.Flag{ + mk12_client_repo, + }, + Subcommands: []*cli.Command{ + initCmd, + comm2Cmd, + mk20DealCmd, + mk20PDPDealCmd, + mk20ClientMakeAggregateCmd, + mk20ClientUploadCmd, + mk20ClientChunkUploadCmd, + mk20PDPDealStatusCmd, + }, +} + +var comm2Cmd = &cli.Command{ + Name: "commp", + Usage: "", + ArgsUsage: "", + Action: func(cctx *cli.Context) error { + if cctx.Args().Len() != 1 { + return fmt.Errorf("usage: commP ") + } + + inPath := cctx.Args().Get(0) + + rdr, err := os.Open(inPath) + if err != nil { + return err + } + defer rdr.Close() //nolint:errcheck + + stat, err := os.Stat(inPath) + if err != nil { + return err + } + + wr := new(commp.Calc) + _, err = io.CopyBuffer(wr, rdr, make([]byte, 2<<20)) + if err != nil { + return fmt.Errorf("copy into commp writer: %w", err) + } + + digest, _, err := wr.Digest() + if err != nil { + return fmt.Errorf("generating digest failed: %w", err) + } + + pcid2, err := commcid.DataCommitmentToPieceCidv2(digest, uint64(stat.Size())) + if err != nil { + return fmt.Errorf("computing commP failed: %w", err) + } + + fmt.Println("CommP CID: ", pcid2.String()) + fmt.Println("Car file size: ", stat.Size()) + return nil + }, +} + +var mk20DealCmd = &cli.Command{ + Name: "deal", + Usage: "Make a mk20 deal with Curio", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "http-url", + Usage: "http url to CAR file", + }, + &cli.StringSliceFlag{ + Name: "http-headers", + Usage: "http headers to be passed with the request (e.g key=value)", + }, + &cli.StringFlag{ + Name: "provider", + Usage: "storage provider on-chain address", + Required: true, + }, + &cli.StringFlag{ + Name: "pcidv2", + Usage: "pcidv2 of the CAR file", + Required: true, + }, + &cli.IntFlag{ + Name: "duration", + Usage: "duration of the deal in epochs", + Value: 518400, // default is 2880 * 180 == 180 days + }, + &cli.StringFlag{ + Name: "contract-address", + Usage: "contract address of the deal", + Required: true, + }, + &cli.StringFlag{ + Name: "contract-verify-method", + Usage: "contract verify method of the deal", + Required: true, + }, + &cli.Uint64Flag{ + Name: "allocation", + Usage: "allocation id of the deal", + }, + &cli.BoolFlag{ + Name: "indexing", + Usage: "indicates that an deal should be indexed", + Value: true, + }, + &cli.StringFlag{ + Name: "wallet", + Usage: "wallet address to be used to initiate the deal", + }, + &cli.BoolFlag{ + Name: "announce", + Usage: "indicates that deal should be announced to the IPNI(Network Indexer)", + Value: true, + }, + &cli.StringFlag{ + Name: "aggregate", + Usage: "aggregate file path for the deal", + }, + &cli.BoolFlag{ + Name: "put", + Usage: "used HTTP put as data source", + Value: false, + }, + }, + Action: func(cctx *cli.Context) error { + ctx := cctx.Context + n, err := Setup(cctx.String(mk12_client_repo.Name)) + if err != nil { + return err + } + + api, closer, err := lcli.GetGatewayAPIV1(cctx) + if err != nil { + return fmt.Errorf("cant setup gateway connection: %w", err) + } + defer closer() + + walletAddr, err := n.GetProvidedOrDefaultWallet(ctx, cctx.String("wallet")) + if err != nil { + return err + } + + log.Debugw("selected wallet", "wallet", walletAddr) + + maddr, err := address.NewFromString(cctx.String("provider")) + if err != nil { + return err + } + + keyType := client.KeyFromClientAddress(walletAddr) + pkey := walletAddr.Bytes() + ts := time.Now().UTC().Truncate(time.Hour) + msg := sha256.Sum256(bytes.Join([][]byte{pkey, []byte(ts.Format(time.RFC3339))}, []byte{})) + + signature, err := n.Wallet.WalletSign(ctx, walletAddr, msg[:], lapi.MsgMeta{Type: lapi.MTDealProposal}) + if err != nil { + return xerrors.Errorf("signing message: %w", err) + } + + sig, err := signature.MarshalBinary() + if err != nil { + return xerrors.Errorf("marshaling signature: %w", err) + } + + authHeader := fmt.Sprintf("CurioAuth %s:%s:%s", + keyType, + base64.StdEncoding.EncodeToString(pkey), + base64.StdEncoding.EncodeToString(sig), + ) + + minfo, err := api.StateMinerInfo(ctx, maddr, chain_types.EmptyTSK) + if err != nil { + return err + } + if minfo.PeerId == nil { + return xerrors.Errorf("storage provider %s has no peer ID set on-chain", maddr) + } + + var maddrs []multiaddr.Multiaddr + for _, mma := range minfo.Multiaddrs { + ma, err := multiaddr.NewMultiaddrBytes(mma) + if err != nil { + return xerrors.Errorf("storage provider %s had invalid multiaddrs in their info: %w", maddr, err) + } + maddrs = append(maddrs, ma) + } + if len(maddrs) == 0 { + return xerrors.Errorf("storage provider %s has no multiaddrs set on-chain", maddr) + } + + addrInfo := &peer.AddrInfo{ + ID: *minfo.PeerId, + Addrs: maddrs, + } + + log.Debugw("found storage provider", "id", addrInfo.ID, "multiaddrs", addrInfo.Addrs, "addr", maddr) + + var hurls []*url.URL + + for _, ma := range addrInfo.Addrs { + hurl, err := maurl.ToURL(ma) + if err != nil { + return xerrors.Errorf("failed to convert multiaddr %s to URL: %w", ma, err) + } + if hurl.Scheme == "ws" { + hurl.Scheme = "http" + } + if hurl.Scheme == "wss" { + hurl.Scheme = "https" + } + log.Debugw("converted multiaddr to URL", "url", hurl, "multiaddr", ma.String()) + hurls = append(hurls, hurl) + } + + commp := cctx.String("pcidv2") + pieceCid, err := cid.Parse(commp) + if err != nil { + return xerrors.Errorf("parsing pcidv2 '%s': %w", commp, err) + } + + var headers http.Header + + for _, header := range cctx.StringSlice("http-headers") { + sp := strings.Split(header, "=") + if len(sp) != 2 { + return xerrors.Errorf("malformed http header: %s", header) + } + headers.Add(sp[0], sp[1]) + } + + var d mk20.DataSource + + if cctx.IsSet("aggregate") { + d = mk20.DataSource{ + PieceCID: pieceCid, + Format: mk20.PieceDataFormat{ + Aggregate: &mk20.FormatAggregate{ + Type: mk20.AggregateTypeV1, + }, + }, + } + + var pieces []mk20.DataSource + + log.Debugw("using aggregate data source", "aggregate", cctx.String("aggregate")) + // Read file line by line + loc, err := homedir.Expand(cctx.String("aggregate")) + if err != nil { + return err + } + file, err := os.Open(loc) + if err != nil { + return err + } + defer func() { + _ = file.Close() + }() + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Split(line, "\t") + if len(parts) != 2 { + return fmt.Errorf("invalid line format. Expected pieceCidV2, url at %s", line) + } + if parts[0] == "" || parts[1] == "" { + return fmt.Errorf("empty column value in the input file at %s", line) + } + + pieceCid, err := cid.Parse(parts[0]) + if err != nil { + return fmt.Errorf("failed to parse CID: %w", err) + } + + url, err := url.Parse(parts[1]) + if err != nil { + return fmt.Errorf("failed to parse url: %w", err) + } + + pieces = append(pieces, mk20.DataSource{ + PieceCID: pieceCid, + Format: mk20.PieceDataFormat{ + Car: &mk20.FormatCar{}, + }, + SourceHTTP: &mk20.DataSourceHTTP{ + URLs: []mk20.HttpUrl{ + { + URL: url.String(), + Priority: 0, + Fallback: true, + }, + }, + }, + }) + + if err := scanner.Err(); err != nil { + return err + } + } + d.SourceAggregate = &mk20.DataSourceAggregate{ + Pieces: pieces, + } + } else { + if !cctx.IsSet("http-url") { + if cctx.Bool("put") { + d = mk20.DataSource{ + PieceCID: pieceCid, + Format: mk20.PieceDataFormat{ + Car: &mk20.FormatCar{}, + }, + SourceHttpPut: &mk20.DataSourceHttpPut{}, + } + } else { + d = mk20.DataSource{ + PieceCID: pieceCid, + Format: mk20.PieceDataFormat{ + Car: &mk20.FormatCar{}, + }, + SourceOffline: &mk20.DataSourceOffline{}, + } + } + } else { + url, err := url.Parse(cctx.String("http-url")) + if err != nil { + return xerrors.Errorf("parsing http url: %w", err) + } + d = mk20.DataSource{ + PieceCID: pieceCid, + Format: mk20.PieceDataFormat{ + Car: &mk20.FormatCar{}, + }, + SourceHTTP: &mk20.DataSourceHTTP{ + URLs: []mk20.HttpUrl{ + { + URL: url.String(), + Headers: headers, + Priority: 0, + Fallback: true, + }, + }, + }, + } + } + } + + p := mk20.Products{ + DDOV1: &mk20.DDOV1{ + Provider: maddr, + PieceManager: walletAddr, + Duration: abi.ChainEpoch(cctx.Int64("duration")), + ContractAddress: cctx.String("contract-address"), + ContractVerifyMethod: cctx.String("contract-verify-method"), + ContractVerifyMethodParams: []byte("test bytes"), + }, + RetrievalV1: &mk20.RetrievalV1{ + Indexing: cctx.Bool("indexing"), + AnnouncePayload: cctx.Bool("announce"), + }, + } + + if cctx.Uint64("allocation") != 0 { + alloc := verifreg.AllocationId(cctx.Uint64("allocation")) + p.DDOV1.AllocationId = &alloc + } + + id, err := mk20.NewULID() + if err != nil { + return err + } + log.Debugw("generated deal id", "id", id) + + deal := mk20.Deal{ + Identifier: id, + Client: walletAddr.String(), + Data: &d, + Products: p, + } + + log.Debugw("deal", "deal", deal) + + body, err := json.Marshal(deal) + if err != nil { + return err + } + + // Try to request all URLs one by one and exit after first success + for _, u := range hurls { + s := u.String() + "/market/mk20/store" + log.Debugw("trying to send request to", "url", u.String()) + req, err := http.NewRequest("POST", s, bytes.NewReader(body)) + if err != nil { + return xerrors.Errorf("failed to create request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", authHeader) + log.Debugw("Headers", "headers", req.Header) + resp, err := http.DefaultClient.Do(req) + if err != nil { + log.Warnw("failed to send request", "url", s, "error", err) + continue + } + if resp.StatusCode != http.StatusOK { + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return xerrors.Errorf("failed to read response body: %w", err) + } + log.Warnw("failed to send request", "url", s, "status", resp.StatusCode, "body", string(respBody)) + continue + } + return nil + } + return xerrors.Errorf("failed to send request to any of the URLs") + }, +} + +var mk20ClientMakeAggregateCmd = &cli.Command{ + Name: "aggregate", + Usage: "Create a new aggregate from a list of CAR files", + Flags: []cli.Flag{ + &cli.StringSliceFlag{ + Name: "files", + Usage: "list of CAR files to aggregate", + Required: true, + }, + &cli.Uint64Flag{ + Name: "piece-size", + Usage: "piece size of the aggregate", + Required: true, + }, + &cli.BoolFlag{ + Name: "out", + Usage: "output the aggregate file", + Value: true, + }, + }, + Action: func(cctx *cli.Context) error { + size := abi.PaddedPieceSize(cctx.Uint64("piece-size")) + files := cctx.StringSlice("files") + out := cctx.Bool("out") + pcid, err := testutils.CreateAggregateFromCars(files, size, out) + if err != nil { + return err + } + fmt.Println("CommP CID: ", pcid.String()) + return nil + }, +} + +var mk20ClientChunkUploadCmd = &cli.Command{ + Name: "chunk-upload", + Usage: "Upload a file in chunks to the storage provider", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "provider", + Usage: "storage provider on-chain address", + Required: true, + }, + &cli.StringFlag{ + Name: "deal", + Usage: "deal id to upload to", + Required: true, + }, + &cli.StringFlag{ + Name: "chunk-size", + Usage: "chunk size to be used for the upload", + Value: "4 MiB", + }, + &cli.StringFlag{ + Name: "wallet", + Usage: "wallet address to be used to initiate the deal", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := cctx.Context + n, err := Setup(cctx.String(mk12_client_repo.Name)) + if err != nil { + return err + } + + walletAddr, err := n.GetProvidedOrDefaultWallet(ctx, cctx.String("wallet")) + if err != nil { + return err + } + + maddr, err := url.Parse(cctx.String("provider")) + if err != nil { + return err + } + + pclient := client.NewClient(maddr.String(), walletAddr, n.Wallet) + + log.Debugw("selected wallet", "wallet", walletAddr) + + if cctx.NArg() != 1 { + return xerrors.Errorf("must provide a single file to upload") + } + + file := cctx.Args().First() + log.Debugw("uploading file", "file", file) + + chunkSizeStr := cctx.String("chunk-size") + chunkSizem, err := humanize.ParseBytes(chunkSizeStr) + if err != nil { + return xerrors.Errorf("parsing chunk size: %w", err) + } + + if chunkSizem == 0 { + return xerrors.Errorf("invalid chunk size: %s", chunkSizeStr) + } + + // Verify chunk size is power of 2 + if chunkSizem&(chunkSizem-1) != 0 { + return xerrors.Errorf("chunk size must be power of 2") + } + + chunkSize := int64(chunkSizem) + + dealid, err := ulid.Parse(cctx.String("deal")) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + + f, err := os.OpenFile(file, os.O_RDONLY, 0644) + if err != nil { + return xerrors.Errorf("opening file: %w", err) + } + + defer func() { + _ = f.Close() + }() + + stat, err := f.Stat() + if err != nil { + return xerrors.Errorf("stat file: %w", err) + } + + size := stat.Size() + if size == 0 { + return xerrors.Errorf("file size is 0") + } + + if size < chunkSize { + chunkSize = size + } + + err = pclient.DealChunkedUpload(ctx, dealid.String(), size, chunkSize, f) + if err != nil { + return xerrors.Errorf("uploading file: %w", err) + } + + return nil + }, +} + +var mk20PDPDealCmd = &cli.Command{ + Name: "pdp-deal", + Usage: "Make a mk20 PDP deal with Curio", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "http-url", + Usage: "http url to CAR file", + }, + &cli.StringSliceFlag{ + Name: "http-headers", + Usage: "http headers to be passed with the request (e.g key=value)", + }, + &cli.StringFlag{ + Name: "provider", + Usage: "PDP providers's URL", + Required: true, + }, + &cli.StringFlag{ + Name: "pcidv2", + Usage: "pcidv2 of the CAR file", + }, + &cli.StringFlag{ + Name: "wallet", + Usage: "wallet address to be used to initiate the deal", + }, + &cli.StringFlag{ + Name: "aggregate", + Usage: "aggregate file path for the deal", + }, + &cli.BoolFlag{ + Name: "put", + Usage: "used HTTP put as data source", + }, + &cli.BoolFlag{ + Name: "add-piece", + Usage: "add piece", + }, + &cli.BoolFlag{ + Name: "add-dataset", + Usage: "add dataset", + }, + &cli.BoolFlag{ + Name: "remove-piece", + Usage: "remove piece", + }, + &cli.BoolFlag{ + Name: "remove-dataset", + Usage: "remove dataset", + }, + &cli.StringFlag{ + Name: "record-keeper", + Usage: "record keeper address", + }, + &cli.Uint64SliceFlag{ + Name: "piece-id", + Usage: "root IDs", + }, + &cli.Uint64Flag{ + Name: "dataset-id", + Usage: "dataset IDs", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := cctx.Context + n, err := Setup(cctx.String(mk12_client_repo.Name)) + if err != nil { + return err + } + + walletAddr, err := n.GetProvidedOrDefaultWallet(ctx, cctx.String("wallet")) + if err != nil { + return err + } + + maddr, err := url.Parse(cctx.String("provider")) + if err != nil { + return err + } + + pclient := client.NewClient(maddr.String(), walletAddr, n.Wallet) + + log.Debugw("selected wallet", "wallet", walletAddr) + + addRoot := cctx.Bool("add-piece") + addProofset := cctx.Bool("add-dataset") + removeRoot := cctx.Bool("remove-piece") + removeProofset := cctx.Bool("remove-dataset") + recordKeeper := cctx.String("record-keeper") + rootIDSet := cctx.IsSet("piece-id") + rootIDs := cctx.Uint64Slice("piece-id") + proofSetSet := cctx.IsSet("dataset-id") + proofsetID := cctx.Uint64("dataset-id") + if !addRoot && !removeRoot && !addProofset && !removeProofset { + return xerrors.Errorf("at least one of --add-root, --remove-root, --add-proofset, --remove-proofset must be set") + } + + if btoi(addRoot)+btoi(addProofset)+btoi(removeRoot)+btoi(removeProofset) > 1 { + return xerrors.Errorf("only one of --add-root, --remove-root, --add-proofset, --remove-proofset can be set") + } + + if addRoot { + if !proofSetSet { + return xerrors.Errorf("proofset-id must be set when adding a piece") + } + commp := cctx.String("pcidv2") + pieceCid, err := cid.Parse(commp) + if err != nil { + return xerrors.Errorf("parsing pcidv2 '%s': %w", commp, err) + } + + var headers http.Header + + for _, header := range cctx.StringSlice("http-headers") { + sp := strings.Split(header, "=") + if len(sp) != 2 { + return xerrors.Errorf("malformed http header: %s", header) + } + headers.Add(sp[0], sp[1]) + } + + if cctx.IsSet("aggregate") { + var pieces []mk20.DataSource + + log.Debugw("using aggregate data source", "aggregate", cctx.String("aggregate")) + // Read file line by line + loc, err := homedir.Expand(cctx.String("aggregate")) + if err != nil { + return err + } + file, err := os.Open(loc) + if err != nil { + return err + } + defer func() { + _ = file.Close() + }() + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Split(line, "\t") + if len(parts) != 2 { + return fmt.Errorf("invalid line format. Expected pieceCidV2, url at %s", line) + } + if parts[0] == "" || parts[1] == "" { + return fmt.Errorf("empty column value in the input file at %s", line) + } + + pieceCid, err := cid.Parse(parts[0]) + if err != nil { + return fmt.Errorf("failed to parse CID: %w", err) + } + + url, err := url.Parse(parts[1]) + if err != nil { + return fmt.Errorf("failed to parse url: %w", err) + } + + pieces = append(pieces, mk20.DataSource{ + PieceCID: pieceCid, + Format: mk20.PieceDataFormat{ + Car: &mk20.FormatCar{}, + }, + SourceHTTP: &mk20.DataSourceHTTP{ + URLs: []mk20.HttpUrl{ + { + URL: url.String(), + Priority: 0, + Fallback: true, + }, + }, + }, + }) + + if err := scanner.Err(); err != nil { + return err + } + } + id, err := pclient.AddPieceWithAggregate(ctx, walletAddr.String(), recordKeeper, nil, &proofsetID, pieceCid, true, false, mk20.AggregateTypeV1, pieces) + if err != nil { + return xerrors.Errorf("failed to add piece: %w", err) + } + fmt.Println("Add piece requested with Deal:", id) + return nil + } else { + if !cctx.IsSet("http-url") { + id, err := pclient.AddPieceWithPut(ctx, walletAddr.String(), recordKeeper, nil, &proofsetID, pieceCid, true, false, true, true, mk20.AggregateTypeNone, nil) + if err != nil { + return xerrors.Errorf("failed to add piece: %w", err) + } + fmt.Println("Add piece requested with Deal:", id) + return nil + } else { + url, err := url.Parse(cctx.String("http-url")) + if err != nil { + return xerrors.Errorf("parsing http url: %w", err) + } + h := []mk20.HttpUrl{ + { + URL: url.String(), + Headers: headers, + Priority: 0, + Fallback: true, + }, + } + id, err := pclient.AddPieceWithHTTP(ctx, walletAddr.String(), recordKeeper, nil, &proofsetID, pieceCid, true, false, true, true, mk20.AggregateTypeNone, nil, h) + if err != nil { + return xerrors.Errorf("failed to add piece: %w", err) + } + fmt.Println("Add piece requested with Deal:", id) + return nil + } + } + } + + if removeRoot { + if !proofSetSet { + return xerrors.Errorf("proofset-id must be set when removing a root") + } + + if !rootIDSet { + return xerrors.Errorf("piece-id must be set when removing a root") + } + + id, err := pclient.RemovePiece(ctx, walletAddr.String(), recordKeeper, nil, &proofsetID, rootIDs) + if err != nil { + return xerrors.Errorf("failed to remove piece: %w", err) + } + fmt.Println("Piece removal requested with deal ID:", id.String()) + return nil + } + + if addProofset { + id, err := pclient.CreateDataSet(ctx, walletAddr.String(), recordKeeper, nil) + if err != nil { + return xerrors.Errorf("failed to create dataset: %w", err) + } + fmt.Println("Dataset creation requested with deal ID:", id.String()) + return nil + } + + if removeProofset { + if !proofSetSet { + return xerrors.Errorf("proofset-id must be set when deleting proof-set") + } + id, err := pclient.RemoveDataSet(ctx, walletAddr.String(), recordKeeper, nil, &proofsetID) + if err != nil { + return xerrors.Errorf("failed to remove dataset: %w", err) + } + fmt.Println("Dataset removal requested with deal ID:", id.String()) + return nil + } + + return xerrors.Errorf("failed to send a PDP deal") + }, +} + +func btoi(b bool) int { + if b { + return 1 + } + return 0 +} + +var mk20ClientUploadCmd = &cli.Command{ + Name: "upload", + Usage: "Upload a file to the storage provider", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "provider", + Usage: "PDP providers's URL", + Required: true, + }, + &cli.StringFlag{ + Name: "deal", + Usage: "deal id to upload to", + Required: true, + }, + }, + Action: func(cctx *cli.Context) error { + ctx := cctx.Context + n, err := Setup(cctx.String(mk12_client_repo.Name)) + if err != nil { + return err + } + + walletAddr, err := n.GetProvidedOrDefaultWallet(ctx, cctx.String("wallet")) + if err != nil { + return err + } + + maddr, err := url.Parse(cctx.String("provider")) + if err != nil { + return err + } + + pclient := client.NewClient(maddr.String(), walletAddr, n.Wallet) + + log.Debugw("selected wallet", "wallet", walletAddr) + + if cctx.NArg() != 1 { + return xerrors.Errorf("must provide a single file to upload") + } + file := cctx.Args().First() + log.Debugw("uploading file", "file", file) + + dealid, err := ulid.Parse(cctx.String("deal")) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + + f, err := os.OpenFile(file, os.O_RDONLY, 0644) + if err != nil { + return xerrors.Errorf("opening file: %w", err) + } + + defer func() { + _ = f.Close() + }() + + stat, err := f.Stat() + if err != nil { + return xerrors.Errorf("stat file: %w", err) + } + + size := stat.Size() + if size == 0 { + return xerrors.Errorf("file size is 0") + } + + err = pclient.DealUploadSerial(ctx, dealid.String(), f) + if err != nil { + return xerrors.Errorf("uploading file: %w", err) + } + + err = pclient.DealUploadSerialFinalize(ctx, dealid.String(), nil) + if err != nil { + return xerrors.Errorf("finalizing the upload: %w", err) + } + + return nil + }, +} + +var mk20PDPDealStatusCmd = &cli.Command{ + Name: "deal-status", + Usage: "Get status of a Mk20 deal", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "provider", + Usage: "PDP providers's URL", + Required: true, + }, + &cli.StringFlag{ + Name: "id", + Usage: "deal id", + Required: true, + }, + &cli.StringFlag{ + Name: "wallet", + Usage: "wallet address to be used to initiate the deal", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := cctx.Context + n, err := Setup(cctx.String(mk12_client_repo.Name)) + if err != nil { + return err + } + + walletAddr, err := n.GetProvidedOrDefaultWallet(ctx, cctx.String("wallet")) + if err != nil { + return err + } + + maddr, err := url.Parse(cctx.String("provider")) + if err != nil { + return err + } + + pclient := client.NewClient(maddr.String(), walletAddr, n.Wallet) + + status, err := pclient.DealStatus(ctx, cctx.String("id")) + if err != nil { + return xerrors.Errorf("getting deal status: %w", err) + } + + if status.PDPV1 != nil { + fmt.Println("PDP Status:") + fmt.Println("State:", status.PDPV1.State) + fmt.Println("Error:", status.PDPV1.ErrorMsg) + } + + if status.DDOV1 != nil { + fmt.Println("PDP Status:") + fmt.Println("State:", status.DDOV1.State) + fmt.Println("Error:", status.DDOV1.ErrorMsg) + } + + return nil + }, +} diff --git a/cmd/sptool/toolbox_deal_tools.go b/cmd/sptool/toolbox_deal_tools.go index fcaf44281..b8dcddaf6 100644 --- a/cmd/sptool/toolbox_deal_tools.go +++ b/cmd/sptool/toolbox_deal_tools.go @@ -10,7 +10,6 @@ import ( "path" "strconv" "strings" - "time" "github.com/ipfs/go-cid" "github.com/ipfs/go-cidutil/cidenc" @@ -225,7 +224,9 @@ var commpCmd = &cli.Command{ if err != nil { return err } - defer rdr.Close() //nolint:errcheck + defer func() { + _ = rdr.Close() + }() w := &writer.Writer{} _, err = io.CopyBuffer(w, rdr, make([]byte, writer.CommPBuf)) @@ -286,7 +287,7 @@ var generateRandCar = &cli.Command{ cs := cctx.Int64("chunksize") ml := cctx.Int("maxlinks") - rf, err := testutils.CreateRandomFile(outPath, time.Now().Unix(), size) + rf, err := testutils.CreateRandomTmpFile(outPath, size) if err != nil { return err } diff --git a/cuhttp/server.go b/cuhttp/server.go index ca092d3d9..83aaac2b3 100644 --- a/cuhttp/server.go +++ b/cuhttp/server.go @@ -25,7 +25,6 @@ import ( ipni_provider "github.com/filecoin-project/curio/market/ipni/ipni-provider" "github.com/filecoin-project/curio/market/libp2p" "github.com/filecoin-project/curio/market/retrieval" - "github.com/filecoin-project/curio/pdp" "github.com/filecoin-project/curio/tasks/message" storage_market "github.com/filecoin-project/curio/tasks/storage-market" ) @@ -52,11 +51,11 @@ func secureHeaders(csp string) func(http.Handler) http.Handler { case "off": // Do nothing case "self": - w.Header().Set("Content-Security-Policy", "default-src 'self'") + w.Header().Set("Content-Security-Policy", "default-src 'self'; img-src 'self' data: blob:") case "inline": fallthrough default: - w.Header().Set("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval'") + w.Header().Set("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data: blob:") } next.ServeHTTP(w, r) @@ -137,10 +136,12 @@ func isWebSocketUpgrade(r *http.Request) bool { } type ServiceDeps struct { - EthSender *message.SenderETH + EthSender *message.SenderETH + DealMarket *storage_market.CurioStorageDealMarket } -func StartHTTPServer(ctx context.Context, d *deps.Deps, sd *ServiceDeps, dm *storage_market.CurioStorageDealMarket) error { +// This starts the public-facing server for market calls. +func StartHTTPServer(ctx context.Context, d *deps.Deps, sd *ServiceDeps) error { cfg := d.Cfg.HTTP // Setup the Chi router for more complex routing (if needed in the future) @@ -152,11 +153,7 @@ func StartHTTPServer(ctx context.Context, d *deps.Deps, sd *ServiceDeps, dm *sto chiRouter.Use(middleware.Recoverer) chiRouter.Use(handlers.ProxyHeaders) // Handle reverse proxy headers like X-Forwarded-For chiRouter.Use(secureHeaders(cfg.CSP)) - chiRouter.Use(corsHeaders) - - if cfg.EnableCORS { - chiRouter.Use(handlers.CORS(handlers.AllowedOrigins([]string{"https://" + cfg.DomainName}))) - } + chiRouter.Use(corsHeaders) // allows market calls from other domains // Set up the compression middleware with custom compression levels compressionMw, err := compressionMiddleware(&cfg.CompressionLevels) @@ -182,7 +179,9 @@ func StartHTTPServer(ctx context.Context, d *deps.Deps, sd *ServiceDeps, dm *sto _, _ = fmt.Fprintf(w, "Service is up and running") }) - chiRouter, err = attachRouters(ctx, chiRouter, d, sd, dm) + // TODO: Attach a info page here with details about all the service and endpoints + + chiRouter, err = attachRouters(ctx, chiRouter, d, sd) if err != nil { return xerrors.Errorf("failed to attach routers: %w", err) } @@ -276,7 +275,7 @@ func (c cache) Delete(ctx context.Context, key string) error { var _ autocert.Cache = cache{} -func attachRouters(ctx context.Context, r *chi.Mux, d *deps.Deps, sd *ServiceDeps, dm *storage_market.CurioStorageDealMarket) (*chi.Mux, error) { +func attachRouters(ctx context.Context, r *chi.Mux, d *deps.Deps, sd *ServiceDeps) (*chi.Mux, error) { // Attach retrievals rp := retrieval.NewRetrievalProvider(ctx, d.DB, d.IndexStore, d.CachedPieceReader) retrieval.Router(r, rp) @@ -294,13 +293,13 @@ func attachRouters(ctx context.Context, r *chi.Mux, d *deps.Deps, sd *ServiceDep rd := libp2p.NewRedirector(d.DB) libp2p.Router(r, rd) - if sd.EthSender != nil { - pdsvc := pdp.NewPDPService(d.DB, d.LocalStore, must.One(d.EthClient.Get()), d.Chain, sd.EthSender) - pdp.Routes(r, pdsvc) - } + //if sd.EthSender != nil { + // pdsvc := pdp.NewPDPService(d.DB, d.LocalStore, must.One(d.EthClient.Get()), d.Chain, sd.EthSender) + // pdp.Routes(r, pdsvc) + //} // Attach the market handler - dh, err := mhttp.NewMarketHandler(d.DB, d.Cfg, dm) + dh, err := mhttp.NewMarketHandler(d.DB, d.Cfg, sd.DealMarket, must.One(d.EthClient.Get()), d.Chain, sd.EthSender, d.LocalStore) if err != nil { return nil, xerrors.Errorf("failed to create new market handler: %w", err) } diff --git a/deps/config/cfgdocgen/gen.go b/deps/config/cfgdocgen/gen.go index bb4d93414..ea26c3035 100644 --- a/deps/config/cfgdocgen/gen.go +++ b/deps/config/cfgdocgen/gen.go @@ -25,9 +25,10 @@ func run() error { state := stGlobal type field struct { - Name string - Type string - Comment string + Name string + Type string + Comment string + IsDynamic bool } var currentType string @@ -73,6 +74,23 @@ func run() error { name := f[0] typ := f[1] + isDynamic := false + if strings.HasPrefix(typ, "*Dynamic[") { + isDynamic = true + typ = strings.TrimPrefix(typ, "*Dynamic[") + typ = strings.TrimSuffix(typ, "]") + // Only add the update notice if it's not already in the comments + hasUpdateNotice := false + for _, c := range comment { + if strings.Contains(c, "Updates will affect running instances.") { + hasUpdateNotice = true + break + } + } + if !hasUpdateNotice { + comment = append(comment, "Updates will affect running instances.") + } + } if len(comment) > 0 && strings.HasPrefix(comment[0], fmt.Sprintf("%s is DEPRECATED", name)) { // don't document deprecated fields @@ -80,9 +98,10 @@ func run() error { } out[currentType] = append(out[currentType], field{ - Name: name, - Type: typ, - Comment: strings.Join(comment, "\n"), + Name: name, + Type: typ, + Comment: strings.Join(comment, "\n"), + IsDynamic: isDynamic, }) } } diff --git a/deps/config/doc_gen.go b/deps/config/doc_gen.go index b085b3d12..ea3d64d2e 100644 --- a/deps/config/doc_gen.go +++ b/deps/config/doc_gen.go @@ -208,7 +208,8 @@ Accepts a decimal string (e.g., "123.45" or "123 fil") with optional "fil" or "a Name: "Addresses", Type: "[]CurioAddresses", - Comment: `Addresses specifies the list of miner addresses and their related wallet addresses.`, + Comment: `Addresses specifies the list of miner addresses and their related wallet addresses. +Updates will affect running instances.`, }, { Name: "Proving", @@ -317,7 +318,8 @@ are much less likely to get stuck in mempool. (Default: true)`, Comment: `MaxMarketRunningPipelines is the maximum number of market pipelines that can be actively running tasks. A "running" pipeline is one that has at least one task currently assigned to a machine (owner_id is not null). If this limit is exceeded, the system will apply backpressure to delay processing of new deals. -0 means unlimited. (Default: 64)`, +0 means unlimited. (Default: 64) +Updates will affect running instances.`, }, { Name: "MaxQueueDownload", @@ -326,7 +328,8 @@ If this limit is exceeded, the system will apply backpressure to delay processin Comment: `MaxQueueDownload is the maximum number of pipelines that can be queued at the downloading stage, waiting for a machine to pick up their task (owner_id is null). If this limit is exceeded, the system will apply backpressure to slow the ingestion of new deals. -0 means unlimited. (Default: 8)`, +0 means unlimited. (Default: 8) +Updates will affect running instances.`, }, { Name: "MaxQueueCommP", @@ -335,7 +338,8 @@ If this limit is exceeded, the system will apply backpressure to slow the ingest Comment: `MaxQueueCommP is the maximum number of pipelines that can be queued at the CommP (verify) stage, waiting for a machine to pick up their verification task (owner_id is null). If this limit is exceeded, the system will apply backpressure, delaying new deal processing. -0 means unlimited. (Default: 8)`, +0 means unlimited. (Default: 8) +Updates will affect running instances.`, }, { Name: "MaxQueueDealSector", @@ -345,7 +349,8 @@ If this limit is exceeded, the system will apply backpressure, delaying new deal 0 = unlimited Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. The DealSector queue includes deals that are ready to enter the sealing pipeline but are not yet part of it. -DealSector queue is the first queue in the sealing pipeline, making it the primary backpressure mechanism. (Default: 8)`, +DealSector queue is the first queue in the sealing pipeline, making it the primary backpressure mechanism. (Default: 8) +Updates will affect running instances.`, }, { Name: "MaxQueueSDR", @@ -357,7 +362,8 @@ Note: This mechanism will delay taking deal data from markets, providing backpre The SDR queue includes deals which are in the process of entering the sealing pipeline. In case of the SDR tasks it is possible that this queue grows more than this limit(CC sectors), the backpressure is only applied to sectors entering the pipeline. -Only applies to PoRep pipeline (DoSnap = false) (Default: 8)`, +Only applies to PoRep pipeline (DoSnap = false) (Default: 8) +Updates will affect running instances.`, }, { Name: "MaxQueueTrees", @@ -368,7 +374,8 @@ Only applies to PoRep pipeline (DoSnap = false) (Default: 8)`, Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. In case of the trees tasks it is possible that this queue grows more than this limit, the backpressure is only applied to sectors entering the pipeline. -Only applies to PoRep pipeline (DoSnap = false) (Default: 0)`, +Only applies to PoRep pipeline (DoSnap = false) (Default: 0) +Updates will affect running instances.`, }, { Name: "MaxQueuePoRep", @@ -379,7 +386,8 @@ Only applies to PoRep pipeline (DoSnap = false) (Default: 0)`, Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. Like with the trees tasks, it is possible that this queue grows more than this limit, the backpressure is only applied to sectors entering the pipeline. -Only applies to PoRep pipeline (DoSnap = false) (Default: 0)`, +Only applies to PoRep pipeline (DoSnap = false) (Default: 0) +Updates will affect running instances.`, }, { Name: "MaxQueueSnapEncode", @@ -388,7 +396,8 @@ Only applies to PoRep pipeline (DoSnap = false) (Default: 0)`, Comment: `MaxQueueSnapEncode is the maximum number of sectors that can be queued waiting for UpdateEncode tasks to start. 0 means unlimited. This applies backpressure to the market subsystem by delaying the ingestion of deal data. -Only applies to the Snap Deals pipeline (DoSnap = true). (Default: 16)`, +Only applies to the Snap Deals pipeline (DoSnap = true). (Default: 16) +Updates will affect running instances.`, }, { Name: "MaxQueueSnapProve", @@ -396,7 +405,8 @@ Only applies to the Snap Deals pipeline (DoSnap = true). (Default: 16)`, Comment: `MaxQueueSnapProve is the maximum number of sectors that can be queued waiting for UpdateProve to start processing. 0 means unlimited. -This applies backpressure in the Snap Deals pipeline (DoSnap = true) by delaying new deal ingestion. (Default: 0)`, +This applies backpressure in the Snap Deals pipeline (DoSnap = true) by delaying new deal ingestion. (Default: 0) +Updates will affect running instances.`, }, { Name: "MaxDealWaitTime", @@ -404,7 +414,8 @@ This applies backpressure in the Snap Deals pipeline (DoSnap = true) by delaying Comment: `Maximum time an open deal sector should wait for more deals before it starts sealing. This ensures that sectors don't remain open indefinitely, consuming resources. -Time duration string (e.g., "1h2m3s") in TOML format. (Default: "1h0m0s")`, +Time duration string (e.g., "1h2m3s") in TOML format. (Default: "1h0m0s") +Updates will affect running instances.`, }, { Name: "DoSnap", @@ -835,12 +846,6 @@ Please ensure that ParkPiece task is enabled and relevant resources are availabl Comment: `The maximum amount of indexing and IPNI tasks that can run simultaneously. Note that the maximum number of tasks will also be bounded by resources available on the machine. (Default: 8)`, }, - { - Name: "EnableBalanceManager", - Type: "bool", - - Comment: `EnableBalanceManager enables the task to automatically manage the market balance of the miner's market actor (Default: false)`, - }, { Name: "BindSDRTreeToNode", Type: "bool", @@ -937,10 +942,13 @@ Time duration string (e.g., "1h2m3s") in TOML format. (Default: "5m0s")`, Time duration string (e.g., "1h2m3s") in TOML format. (Default: "5m0s")`, }, { - Name: "EnableCORS", - Type: "bool", + Name: "CORSOrigins", + Type: "[]string", - Comment: `EnableCORS indicates whether Cross-Origin Resource Sharing (CORS) is enabled or not.`, + Comment: `CORSOrigins specifies the allowed origins for CORS requests to the Curio admin UI. If empty, CORS is disabled. +If not empty, only the specified origins will be allowed for CORS requests. +This is required for third-party UI servers. +"*" allows everyone, it's best to specify the UI servers' hostname.`, }, { Name: "CSP", @@ -985,8 +993,7 @@ allow indexer nodes to process announcements. Default: False`, Name: "ServiceURL", Type: "[]string", - Comment: `The network indexer web UI URL for viewing published announcements -TODO: should we use this for checking published heads before publishing? Later commit`, + Comment: `The network indexer web UI URL for viewing published announcements`, }, { Name: "DirectAnnounceURLs", @@ -1130,6 +1137,71 @@ CIDGravity filters will not be applied to deals associated with that miner ID.`, Default behaviors is to reject the deals (Default: false)`, }, }, + "MK20Config": { + { + Name: "ExpectedPoRepSealDuration", + Type: "time.Duration", + + Comment: `ExpectedPoRepSealDuration is the expected time it would take to seal the deal sector +This will be used to fail the deals which cannot be sealed on time. +Time duration string (e.g., "1h2m3s") in TOML format. (Default: "8h0m0s")`, + }, + { + Name: "ExpectedSnapSealDuration", + Type: "time.Duration", + + Comment: `ExpectedSnapSealDuration is the expected time it would take to snap the deal sector +This will be used to fail the deals which cannot be sealed on time. +Time duration string (e.g., "1h2m3s") in TOML format. (Default: "2h0m0s")`, + }, + { + Name: "SkipCommP", + Type: "bool", + + Comment: `SkipCommP can be used to skip doing a commP check before PublishDealMessage is sent on chain +Warning: If this check is skipped and there is a commP mismatch, all deals in the +sector will need to be sent again (Default: false)`, + }, + { + Name: "DisabledMiners", + Type: "[]string", + + Comment: `DisabledMiners is a list of miner addresses that should be excluded from online deal making protocols`, + }, + { + Name: "MaxConcurrentDealSizeGiB", + Type: "int64", + + Comment: `MaxConcurrentDealSizeGiB is a sum of all size of all deals which are waiting to be added to a sector +When the cumulative size of all deals in process reaches this number, new deals will be rejected. +(Default: 0 = unlimited)`, + }, + { + Name: "DenyUnknownClients", + Type: "bool", + + Comment: `DenyUnknownClients determines the default behaviour for the deal of clients which are not in allow/deny list +If True then all deals coming from unknown clients will be rejected. (Default: false)`, + }, + { + Name: "MaxParallelChunkUploads", + Type: "int", + + Comment: `MaxParallelChunkUploads defines the maximum number of upload operations that can run in parallel. (Default: 512)`, + }, + { + Name: "MinimumChunkSize", + Type: "int64", + + Comment: `MinimumChunkSize defines the smallest size of a chunk allowed for processing, expressed in bytes. Must be a power of 2. (Default: 16 MiB)`, + }, + { + Name: "MaximumChunkSize", + Type: "int64", + + Comment: `MaximumChunkSize defines the maximum size of a chunk allowed for processing, expressed in bytes. Must be a power of 2. (Default: 256 MiB)`, + }, + }, "MarketConfig": { { Name: "StorageMarketConfig", @@ -1234,6 +1306,12 @@ Example: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXX Comment: `MK12 encompasses all configuration related to deal protocol mk1.2.0 and mk1.2.1 (i.e. Boost deals)`, }, + { + Name: "MK20", + Type: "MK20Config", + + Comment: `MK20 encompasses all configuration related to deal protocol mk2.0 i.e. market 2.0`, + }, { Name: "IPNI", Type: "IPNIConfig", diff --git a/deps/config/dynamic.go b/deps/config/dynamic.go new file mode 100644 index 000000000..85cd438f5 --- /dev/null +++ b/deps/config/dynamic.go @@ -0,0 +1,273 @@ +package config + +import ( + "context" + "fmt" + "math/big" + "reflect" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + logging "github.com/ipfs/go-log/v2" + + "github.com/filecoin-project/curio/harmony/harmonydb" +) + +var logger = logging.Logger("config-dynamic") + +// BigIntComparer is used to compare big.Int values properly +var BigIntComparer = cmp.Comparer(func(x, y big.Int) bool { + return x.Cmp(&y) == 0 +}) + +// Dynamic is a wrapper for configuration values that can change at runtime. +// Use Get() and Set() methods to access the value with proper synchronization +// and change detection. +type Dynamic[T any] struct { + value T +} + +func NewDynamic[T any](value T) *Dynamic[T] { + d := &Dynamic[T]{value: value} + dynamicLocker.notifier[reflect.ValueOf(d).Pointer()] = nil + return d +} + +// OnChange registers a function to be called in a goroutine when the dynamic value changes to a new final-layered value. +// The function is called in a goroutine to avoid blocking the main thread; it should not panic. +func (d *Dynamic[T]) OnChange(fn func()) { + p := reflect.ValueOf(d).Pointer() + prev := dynamicLocker.notifier[p] + if prev == nil { + dynamicLocker.notifier[p] = fn + return + } + dynamicLocker.notifier[p] = func() { + prev() + fn() + } +} + +func (d *Dynamic[T]) Set(value T) { + dynamicLocker.Lock() + defer dynamicLocker.Unlock() + dynamicLocker.inform(reflect.ValueOf(d).Pointer(), d.value, value) + d.value = value +} + +// SetWithoutLock sets the value without acquiring a lock. +// Only use this when you're already holding the top-level write lock (e.g., during ApplyLayers). +func (d *Dynamic[T]) SetWithoutLock(value T) { + dynamicLocker.inform(reflect.ValueOf(d).Pointer(), d.value, value) + d.value = value +} + +func (d *Dynamic[T]) Get() T { + dynamicLocker.RLock() + defer dynamicLocker.RUnlock() + return d.value +} + +// GetWithoutLock gets the value without acquiring a lock. +// Only use this when you're already holding the top-level write lock (e.g., during FixTOML). +func (d *Dynamic[T]) GetWithoutLock() T { + return d.value +} + +// Equal is used by cmp.Equal for custom comparison. +// If used from deps, requires a lock. +func (d *Dynamic[T]) Equal(other *Dynamic[T]) bool { + return cmp.Equal(d.value, other.value, BigIntComparer, cmpopts.EquateEmpty()) +} + +// MarshalTOML cannot be implemented for struct types because it won't be boxed correctly. + +type cfgRoot[T any] struct { + db *harmonydb.DB + layers []string + treeCopy T + fixupFn func(string, T) error +} + +func EnableChangeDetection[T any](db *harmonydb.DB, obj T, layers []string, fixupFn func(string, T) error) error { + var err error + r := &cfgRoot[T]{db: db, treeCopy: obj, layers: layers, fixupFn: fixupFn} + r.treeCopy, err = CopyWithOriginalDynamics(obj) + if err != nil { + return err + } + go r.changeMonitor() + return nil +} + +// CopyWithOriginalDynamics copies the original dynamics from the original object to the new object. +func CopyWithOriginalDynamics[T any](orig T) (T, error) { + typ := reflect.TypeOf(orig) + val := reflect.ValueOf(orig) + + // Handle pointer to struct + if typ.Kind() == reflect.Ptr { + if typ.Elem().Kind() != reflect.Struct { + var zero T + return zero, fmt.Errorf("expected pointer to struct, got pointer to %s", typ.Elem().Kind()) + } + // Create a new instance of the struct + result := reflect.New(typ.Elem()) + walker(val.Elem(), result.Elem()) + return result.Interface().(T), nil + } + + // Handle direct struct + if typ.Kind() != reflect.Struct { + var zero T + return zero, fmt.Errorf("expected struct or pointer to struct, got %s", typ.Kind()) + } + + result := reflect.New(typ).Elem() + walker(val, result) + return result.Interface().(T), nil +} + +// walker recursively walks the struct tree, copying fields and preserving Dynamic pointers +func walker(orig, result reflect.Value) { + for i := 0; i < orig.NumField(); i++ { + field := orig.Field(i) + resultField := result.Field(i) + + // Skip unexported fields - they can't be set via reflection + if !resultField.CanSet() { + continue + } + + switch field.Kind() { + case reflect.Struct: + // Check if this struct is a Dynamic[T] - if so, copy by value + if isDynamicType(field.Type()) { + resultField.Set(field) + } else { + walker(field, resultField) + } + case reflect.Ptr: + if !field.IsNil() { + // Check if the pointed-to type is Dynamic[T] + elemType := field.Type().Elem() + if isDynamicType(elemType) { + // This is *Dynamic[T] - copy the pointer to preserve sharing + resultField.Set(field) + } else if elemType.Kind() == reflect.Struct { + // Regular struct pointer - recursively copy + newPtr := reflect.New(elemType) + walker(field.Elem(), newPtr.Elem()) + resultField.Set(newPtr) + } else { + // Other pointer types - shallow copy + resultField.Set(field) + } + } + default: + resultField.Set(field) + } + } +} + +// isDynamicType checks if a type is Dynamic[T] by checking if the name starts with "Dynamic" +func isDynamicType(t reflect.Type) bool { + name := t.Name() + return strings.HasPrefix(name, "Dynamic[") +} + +func (r *cfgRoot[T]) changeMonitor() { + lastTimestamp := time.Time{} // lets do a read at startup + + for { + configCount := 0 + err := r.db.QueryRow(context.Background(), `SELECT COUNT(*) FROM harmony_config WHERE timestamp > $1 AND title IN ($2)`, lastTimestamp, strings.Join(r.layers, ",")).Scan(&configCount) + if err != nil { + logger.Errorf("error selecting configs: %s", err) + continue + } + if configCount == 0 { + continue + } + lastTimestamp = time.Now() + + // 1. get all configs + configs, err := GetConfigs(context.Background(), r.db, r.layers) + if err != nil { + logger.Errorf("error getting configs: %s", err) + continue + } + + // 2. Apply layers while holding the top-level lock to prevent readers from seeing + // inconsistent state. FixTOML uses GetWithoutLock() and TransparentDecode uses + // SetWithoutLock() to avoid deadlocks. + func() { + dynamicLocker.Lock() + defer dynamicLocker.Unlock() + err = ApplyLayers(context.Background(), r.treeCopy, configs, r.fixupFn) + if err != nil { + logger.Errorf("dynamic config failed to ApplyLayers: %s", err) + return + } + }() + time.Sleep(30 * time.Second) + } +} + +var dynamicLocker = changeNotifier{diff: diff{ + originally: make(map[uintptr]any), + latest: make(map[uintptr]any), +}, + notifier: make(map[uintptr]func()), +} + +type changeNotifier struct { + sync.RWMutex // this protects the dynamic[T] reads from getting a race with the updating + updating int32 // atomic: 1 if updating, 0 if not. determines which mode we are in: updating or querying + + diff + + notifier map[uintptr]func() +} +type diff struct { + cdmx sync.Mutex // + originally map[uintptr]any + latest map[uintptr]any +} + +func (c *changeNotifier) Lock() { + c.RWMutex.Lock() + atomic.StoreInt32(&c.updating, 1) +} +func (c *changeNotifier) Unlock() { + c.cdmx.Lock() + c.RWMutex.Unlock() + defer c.cdmx.Unlock() + + atomic.StoreInt32(&c.updating, 0) + for k, v := range c.latest { + if !cmp.Equal(v, c.originally[k], BigIntComparer) { + if notifier := c.notifier[k]; notifier != nil { + go notifier() + } + } + } + c.originally = make(map[uintptr]any) + c.latest = make(map[uintptr]any) +} + +func (c *changeNotifier) inform(ptr uintptr, oldValue any, newValue any) { + if atomic.LoadInt32(&c.updating) == 0 { + return + } + c.cdmx.Lock() + defer c.cdmx.Unlock() + if _, ok := c.originally[ptr]; !ok { + c.originally[ptr] = oldValue + } + c.latest[ptr] = newValue +} diff --git a/deps/config/dynamic_test.go b/deps/config/dynamic_test.go new file mode 100644 index 000000000..87fa3f904 --- /dev/null +++ b/deps/config/dynamic_test.go @@ -0,0 +1,209 @@ +package config + +import ( + "sync/atomic" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/lotus/chain/types" +) + +type Input struct { + Bar int + Foo struct { + *Dynamic[int] + } +} + +func TestDynamic(t *testing.T) { + input := &Input{ + Bar: 10, + Foo: struct { + *Dynamic[int] + }{ + Dynamic: NewDynamic(20), + }, + } + var notified atomic.Bool + input.Foo.OnChange(func() { + notified.Store(true) + }) + res, err := CopyWithOriginalDynamics(input) // test that copy succeeds + assert.NoError(t, err) + assert.Equal(t, res.Bar, 10) // spot-test the copy + assert.True(t, cmp.Equal(res, input)) // test the Equal() function used elsewhere. + input.Foo.Set(30) + assert.Equal(t, 30, res.Foo.Get()) // test the Set() and Get() functions + assert.Eventually(t, func() bool { // test the OnChange() function + return notified.Load() + }, 10*time.Second, 100*time.Millisecond) +} + +func TestDynamicUnmarshalTOML(t *testing.T) { + + type TestConfig struct { + Name string + Value int + } + type Wrapper struct { + Config *Dynamic[TestConfig] + } + + // Create a config and marshal it using TransparentMarshal + w1 := Wrapper{Config: NewDynamic(TestConfig{Name: "test", Value: 42})} + data, err := TransparentMarshal(w1) + assert.NoError(t, err) + t.Logf("Generated TOML (%d bytes):\n%s", len(data), string(data)) + + // Verify the config value before marshaling + assert.Equal(t, "test", w1.Config.Get().Name, "Original config should have correct name") + assert.Equal(t, 42, w1.Config.Get().Value, "Original config should have correct value") + + // Unmarshal it back using TransparentUnmarshal + var w2 Wrapper + w2.Config = NewDynamic(TestConfig{}) + err = TransparentUnmarshal(data, &w2) + assert.NoError(t, err) + + result := w2.Config.Get() + + assert.Equal(t, "test", result.Name) + assert.Equal(t, 42, result.Value) +} + +func TestDynamicWithBigInt(t *testing.T) { + type ConfigWithFIL struct { + Fee types.FIL + } + + // Test that BigInt values compare correctly + d1 := NewDynamic(ConfigWithFIL{ + Fee: types.MustParseFIL("5 FIL"), + }) + + d2 := NewDynamic(ConfigWithFIL{ + Fee: types.MustParseFIL("5 FIL"), + }) + + d3 := NewDynamic(ConfigWithFIL{ + Fee: types.MustParseFIL("10 FIL"), + }) + + // Test Equal method works with BigInt + assert.True(t, d1.Equal(d2), "Equal FIL values should be equal") + assert.False(t, d1.Equal(d3), "Different FIL values should not be equal") + + // Test that cmp.Equal works with bigIntComparer + assert.True(t, cmp.Equal(d1.Get(), d2.Get(), BigIntComparer), "cmp.Equal should work with bigIntComparer") + assert.False(t, cmp.Equal(d1.Get(), d3.Get(), BigIntComparer), "cmp.Equal should detect differences") + +} + +func TestDynamicChangeNotificationWithBigInt(t *testing.T) { + type ConfigWithFIL struct { + Fee types.FIL + } + + d := NewDynamic(ConfigWithFIL{ + Fee: types.MustParseFIL("5 FIL"), + }) + + var notified atomic.Bool + d.OnChange(func() { + notified.Store(true) + }) + + // Use public API to change value + d.Set(ConfigWithFIL{Fee: types.MustParseFIL("10 FIL")}) + + // Verify notification was triggered + assert.Eventually(t, func() bool { + return notified.Load() + }, 2*time.Second, 100*time.Millisecond, "OnChange should be called when BigInt value changes") + + // Reset and test that same value doesn't trigger notification + notified.Store(false) + d.Set(ConfigWithFIL{Fee: types.MustParseFIL("10 FIL")}) // Same value as current + + // Give it a moment to potentially trigger (it shouldn't) + time.Sleep(200 * time.Millisecond) + assert.False(t, notified.Load(), "OnChange should not be called when BigInt value stays the same") +} + +func TestDynamicMarshalSlice(t *testing.T) { + // Test that Dynamic wrapping a slice can be marshaled to TOML + type Address struct { + Name string + URL string + } + + type ConfigWithSlice struct { + Addresses *Dynamic[[]Address] + } + + cfg := ConfigWithSlice{ + Addresses: NewDynamic([]Address{ + {Name: "addr1", URL: "http://example.com"}, + {Name: "addr2", URL: "http://example.org"}, + }), + } + + // Test that the full struct can be marshaled to TOML using TransparentMarshal + data, err := TransparentMarshal(cfg) + assert.NoError(t, err, "Should be able to marshal config with Dynamic slice to TOML") + + // Test round-trip: unmarshal back using TransparentUnmarshal + var cfg2 ConfigWithSlice + cfg2.Addresses = NewDynamic([]Address{}) + err = TransparentUnmarshal(data, &cfg2) + assert.NoError(t, err, "Should be able to unmarshal config with Dynamic slice from TOML") + + // Verify the data is correct + assert.Len(t, cfg2.Addresses.Get(), 2) + assert.Equal(t, "addr1", cfg2.Addresses.Get()[0].Name) + assert.Equal(t, "http://example.com", cfg2.Addresses.Get()[0].URL) + assert.Equal(t, "addr2", cfg2.Addresses.Get()[1].Name) +} + +func TestDefaultCurioConfigMarshal(t *testing.T) { + // Test that the default config with Dynamic fields can be marshaled + cfg := DefaultCurioConfig() + + // This should not panic or error using TransparentMarshal + data, err := TransparentMarshal(cfg) + assert.NoError(t, err, "Should be able to marshal DefaultCurioConfig to TOML") + assert.NotEmpty(t, data) + t.Logf("Successfully marshaled config to %d bytes of TOML", len(data)) +} + +func TestCurioConfigRoundTrip(t *testing.T) { + // Test full marshal/unmarshal round-trip with CurioConfig + cfg1 := DefaultCurioConfig() + + // Modify some Dynamic values to test they persist + cfg1.Ingest.MaxQueueDownload.Set(16) + cfg1.Ingest.MaxMarketRunningPipelines.Set(32) + + // Marshal to TOML using TransparentMarshal + data, err := TransparentMarshal(cfg1) + assert.NoError(t, err, "Should be able to marshal config") + t.Logf("Marshaled %d bytes", len(data)) + + // Unmarshal back to a new config (starting with defaults to initialize FIL types properly) + cfg2 := DefaultCurioConfig() + err = TransparentUnmarshal(data, cfg2) + assert.NoError(t, err, "Should be able to unmarshal config back") + + // Verify Dynamic values were preserved + assert.Equal(t, 16, cfg2.Ingest.MaxQueueDownload.Get(), "MaxQueueDownload should be preserved") + assert.Equal(t, 32, cfg2.Ingest.MaxMarketRunningPipelines.Get(), "MaxMarketRunningPipelines should be preserved") + + // Verify the Addresses Dynamic slice was preserved + assert.Equal(t, len(cfg1.Addresses.Get()), len(cfg2.Addresses.Get()), "Addresses slice length should match") + + // Verify static fields were preserved + assert.Equal(t, cfg1.Subsystems.GuiAddress, cfg2.Subsystems.GuiAddress) +} diff --git a/deps/config/dynamic_toml.go b/deps/config/dynamic_toml.go new file mode 100644 index 000000000..92705dd7f --- /dev/null +++ b/deps/config/dynamic_toml.go @@ -0,0 +1,382 @@ +package config + +import ( + "reflect" + "strings" + + "github.com/BurntSushi/toml" +) + +// TransparentMarshal marshals a struct to TOML, treating Dynamic[T] fields transparently. +// Dynamic[T] fields are unwrapped and their inner values are marshaled directly. +func TransparentMarshal(v interface{}) ([]byte, error) { + // Create a shadow struct with Dynamic fields unwrapped + shadow := UnwrapDynamics(v) + return toml.Marshal(shadow) +} + +// TransparentUnmarshal unmarshals TOML into a struct, treating Dynamic[T] fields transparently. +// Values are decoded into temporary structs then wrapped in Dynamic. +// NOTE: For types like types.FIL with unexported pointer fields, the target must be pre-initialized +// with default values (e.g., types.MustParseFIL("0")) before calling this function. +func TransparentUnmarshal(data []byte, v interface{}) error { + _, err := TransparentDecode(string(data), v) + return err +} + +// TransparentDecode decodes TOML into a struct, treating Dynamic[T] fields transparently. +// Like toml.Decode, it returns MetaData for checking which fields were set. +// NOTE: For types like types.FIL with unexported pointer fields, the target must be pre-initialized +// with default values (e.g., types.MustParseFIL("0")) before calling this function. +// NOTE: FixTOML should be called BEFORE this function to ensure proper slice lengths and FIL initialization. +func TransparentDecode(data string, v interface{}) (toml.MetaData, error) { + // Create a shadow struct to decode into + shadow := createShadowStruct(v) + + // Initialize shadow with values from target (for types like FIL that need non-nil pointers) + // This copies FIL values that were initialized by FixTOML + initializeShadowFromTarget(shadow, v) + + // Decode into shadow and get metadata + // Note: TOML will overwrite slice elements, but our initialized FIL fields will be preserved + // because TOML calls UnmarshalText on FIL types, which requires non-nil pointers + md, err := toml.Decode(data, shadow) + if err != nil { + return md, err + } + + // Copy values from shadow to Dynamic fields + err = wrapDynamics(shadow, v) + return md, err +} + +// initializeShadowFromTarget copies initialized values from target to shadow +// This is needed for types like types.FIL that require non-nil internal pointers +func initializeShadowFromTarget(shadow, target interface{}) { + shadowVal := reflect.ValueOf(shadow) + targetVal := reflect.ValueOf(target) + + if shadowVal.Kind() == reflect.Ptr { + shadowVal = shadowVal.Elem() + } + if targetVal.Kind() == reflect.Ptr { + targetVal = targetVal.Elem() + } + + // Ensure we have structs to work with + if shadowVal.Kind() != reflect.Struct || targetVal.Kind() != reflect.Struct { + return + } + + for i := 0; i < targetVal.NumField(); i++ { + targetField := targetVal.Field(i) + shadowField := shadowVal.Field(i) + + if !shadowField.CanSet() || !targetField.IsValid() { + continue + } + + if isDynamicTypeForMarshal(targetField.Type()) { + // For Dynamic fields, copy the inner initialized value to the unwrapped shadow field + innerVal := extractDynamicValue(targetField) + if innerVal.IsValid() && innerVal.CanInterface() { + // Copy the value (including slices with initialized FIL elements from FixTOML) + val := innerVal.Interface() + valReflect := reflect.ValueOf(val) + if valReflect.Type().AssignableTo(shadowField.Type()) { + shadowField.Set(valReflect) + } + } + } else if targetField.Kind() == reflect.Struct && hasNestedDynamics(targetField.Type()) { + // For nested structs with Dynamic fields, recursively initialize + initializeShadowFromTarget(shadowField.Addr().Interface(), targetField.Addr().Interface()) + } else if targetField.Kind() == reflect.Ptr && !targetField.IsNil() && !shadowField.IsNil() { + // Handle pointers to structs + elemType := targetField.Type().Elem() + if elemType.Kind() == reflect.Struct && hasNestedDynamics(elemType) { + // Recursively initialize pointer to struct with Dynamic fields + initializeShadowFromTarget(shadowField.Elem().Addr().Interface(), targetField.Elem().Addr().Interface()) + } else if targetField.CanInterface() && shadowField.Type() == targetField.Type() { + // Copy regular pointer if types match + shadowField.Set(reflect.ValueOf(targetField.Interface())) + } + } else if targetField.CanInterface() && shadowField.Type() == targetField.Type() { + // Copy regular fields only if types match exactly + shadowField.Set(reflect.ValueOf(targetField.Interface())) + } + } +} + +// UnwrapDynamics recursively unwraps Dynamic[T] fields for marshaling +func UnwrapDynamics(v interface{}) interface{} { + rv := reflect.ValueOf(v) + if rv.Kind() == reflect.Ptr { + rv = rv.Elem() + } + + if rv.Kind() != reflect.Struct { + return v + } + + // Check if this struct has any Dynamic fields - if not, return as-is + if !hasNestedDynamics(rv.Type()) { + return v + } + + // Create a new struct with same fields but Dynamic unwrapped + shadowType := createShadowType(rv.Type()) + shadowVal := reflect.New(shadowType).Elem() + + for i := 0; i < rv.NumField(); i++ { + field := rv.Field(i) + shadowField := shadowVal.Field(i) + + if !shadowField.CanSet() { + continue + } + + if isDynamicTypeForMarshal(field.Type()) { + // Extract inner value from Dynamic + innerVal := extractDynamicValue(field) + if innerVal.IsValid() { + shadowField.Set(innerVal) + } + } else if field.Kind() == reflect.Struct && hasNestedDynamics(field.Type()) { + // Only recursively unwrap structs that contain Dynamic fields + shadowField.Set(reflect.ValueOf(UnwrapDynamics(field.Interface()))) + } else if field.Kind() == reflect.Ptr && !field.IsNil() { + // Handle pointers - check if the pointed-to type contains Dynamic fields + elemType := field.Type().Elem() + if elemType.Kind() == reflect.Struct && hasNestedDynamics(elemType) { + // Recursively unwrap the pointed-to struct + unwrapped := UnwrapDynamics(field.Elem().Interface()) + unwrappedPtr := reflect.New(reflect.TypeOf(unwrapped)) + unwrappedPtr.Elem().Set(reflect.ValueOf(unwrapped)) + shadowField.Set(unwrappedPtr) + } else if field.IsValid() && field.CanInterface() { + // Regular pointer - copy as-is + val := field.Interface() + shadowField.Set(reflect.ValueOf(val)) + } + } else if field.IsValid() && field.CanInterface() { + // Copy all other fields via interface (handles types with unexported fields) + val := field.Interface() + shadowField.Set(reflect.ValueOf(val)) + } + } + + return shadowVal.Interface() +} + +// createShadowStruct creates a struct for unmarshaling where Dynamic fields are their inner types +func createShadowStruct(v interface{}) interface{} { + rv := reflect.ValueOf(v) + if rv.Kind() == reflect.Ptr { + rv = rv.Elem() + } + + shadowType := createShadowType(rv.Type()) + return reflect.New(shadowType).Interface() +} + +// createShadowType creates a type with Dynamic[T] fields replaced by T +func createShadowType(t reflect.Type) reflect.Type { + if t.Kind() == reflect.Ptr { + return reflect.PointerTo(createShadowType(t.Elem())) + } + + if t.Kind() != reflect.Struct { + return t + } + + var fields []reflect.StructField + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + newField := field + + if isDynamicTypeForMarshal(field.Type) { + // Replace Dynamic[T] with T + innerType := extractDynamicInnerType(field.Type) + newField.Type = innerType + } else if field.Type.Kind() == reflect.Struct && hasNestedDynamics(field.Type) { + // Only recursively modify structs that contain Dynamic fields + newField.Type = createShadowType(field.Type) + } else if field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct { + if hasNestedDynamics(field.Type.Elem()) { + newField.Type = reflect.PointerTo(createShadowType(field.Type.Elem())) + } + } + // For all other types (including structs without Dynamic fields), keep original type + + fields = append(fields, newField) + } + + return reflect.StructOf(fields) +} + +// wrapDynamics copies values from shadow struct to Dynamic fields +func wrapDynamics(shadow, target interface{}) error { + shadowVal := reflect.ValueOf(shadow) + targetVal := reflect.ValueOf(target) + + if shadowVal.Kind() == reflect.Ptr { + shadowVal = shadowVal.Elem() + } + if targetVal.Kind() == reflect.Ptr { + targetVal = targetVal.Elem() + } + + // Ensure we have structs to work with + if shadowVal.Kind() != reflect.Struct || targetVal.Kind() != reflect.Struct { + return nil + } + + for i := 0; i < targetVal.NumField(); i++ { + targetField := targetVal.Field(i) + shadowField := shadowVal.Field(i) + + if !targetField.CanSet() { + continue + } + + if isDynamicTypeForMarshal(targetField.Type()) { + // Wrap value in Dynamic using Set method + setDynamicValue(targetField, shadowField) + } else if targetField.Kind() == reflect.Struct && hasNestedDynamics(targetField.Type()) { + // Recursively handle nested structs that have Dynamic fields + err := wrapDynamics(shadowField.Interface(), targetField.Addr().Interface()) + if err != nil { + return err + } + } else if targetField.Kind() == reflect.Ptr && !targetField.IsNil() && !shadowField.IsNil() { + // Handle pointers to structs + elemType := targetField.Type().Elem() + if elemType.Kind() == reflect.Struct && hasNestedDynamics(elemType) { + // Recursively handle pointer to struct with Dynamic fields + err := wrapDynamics(shadowField.Elem().Interface(), targetField.Elem().Addr().Interface()) + if err != nil { + return err + } + } else if shadowField.IsValid() && targetField.CanSet() { + // Regular pointer - copy as-is if types match + if shadowField.Type().AssignableTo(targetField.Type()) { + targetField.Set(shadowField) + } + } + } else { + // Copy regular fields - don't copy if types don't match (shouldn't happen) + if shadowField.IsValid() && targetField.CanSet() { + if shadowField.Type().AssignableTo(targetField.Type()) { + targetField.Set(shadowField) + } + } + } + } + + return nil +} + +// isDynamicTypeForMarshal checks if a type is Dynamic[T] +// (renamed to avoid conflict with isDynamicType in dynamic.go) +func isDynamicTypeForMarshal(t reflect.Type) bool { + // Handle pointer to Dynamic + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + name := t.Name() + return strings.HasPrefix(name, "Dynamic[") +} + +// hasNestedDynamics checks if a struct type contains any Dynamic[T] fields +func hasNestedDynamics(t reflect.Type) bool { + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + if t.Kind() != reflect.Struct { + return false + } + + for i := 0; i < t.NumField(); i++ { + fieldType := t.Field(i).Type + if isDynamicTypeForMarshal(fieldType) { + return true + } + // Check nested structs recursively + if fieldType.Kind() == reflect.Struct && hasNestedDynamics(fieldType) { + return true + } + if fieldType.Kind() == reflect.Ptr && fieldType.Elem().Kind() == reflect.Struct { + if hasNestedDynamics(fieldType.Elem()) { + return true + } + } + } + return false +} + +// extractDynamicValue gets the inner value from a Dynamic[T] using reflection. +// Always uses GetWithoutLock() because TransparentDecode is only called: +// 1. During startup (FromReader) - no concurrent readers, safe +// 2. During ApplyLayers with treeCopy (not live deps config) - lock is held, safe +func extractDynamicValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + return reflect.Value{} + } + v = v.Elem() + } + + // Always use GetWithoutLock() - TransparentDecode is never called with live deps config after startup + getMethod := v.Addr().MethodByName("GetWithoutLock") + if !getMethod.IsValid() { + // Fallback to Get() if GetWithoutLock() doesn't exist (shouldn't happen in normal usage) + getMethod = v.Addr().MethodByName("Get") + if !getMethod.IsValid() { + return reflect.Value{} + } + } + + results := getMethod.Call(nil) + if len(results) == 0 { + return reflect.Value{} + } + + return results[0] +} + +// extractDynamicInnerType gets the T from Dynamic[T] +func extractDynamicInnerType(t reflect.Type) reflect.Type { + // Handle pointer to Dynamic + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + + // For Dynamic[T], we need to look at the value field + if t.Kind() == reflect.Struct && t.NumField() > 0 { + // The first field is 'value T' + return t.Field(0).Type + } + + return t +} + +// setDynamicValue sets a Dynamic[T] field using its Set method +func setDynamicValue(dynamicField, valueField reflect.Value) { + if dynamicField.Kind() == reflect.Ptr { + if dynamicField.IsNil() { + // Create new Dynamic instance + dynamicField.Set(reflect.New(dynamicField.Type().Elem())) + } + dynamicField = dynamicField.Elem() + } + + // Call SetWithoutLock() method (we're already holding the top-level lock during ApplyLayers) + setMethod := dynamicField.Addr().MethodByName("SetWithoutLock") + if !setMethod.IsValid() { + return + } + + if valueField.IsValid() { + setMethod.Call([]reflect.Value{valueField}) + } +} diff --git a/deps/config/dynamic_toml_test.go b/deps/config/dynamic_toml_test.go new file mode 100644 index 000000000..8736ab6d8 --- /dev/null +++ b/deps/config/dynamic_toml_test.go @@ -0,0 +1,1873 @@ +package config + +import ( + "reflect" + "testing" + "time" + + "github.com/BurntSushi/toml" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/lotus/chain/types" +) + +func TestTransparentMarshalUnmarshal(t *testing.T) { + t.Run("simple types", func(t *testing.T) { + type Config struct { + Regular int + Dynamic *Dynamic[int] + After string + } + + cfg1 := Config{ + Regular: 10, + Dynamic: NewDynamic(42), + After: "test", + } + + data, err := TransparentMarshal(cfg1) + assert.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + // Check it's truly transparent (no nesting) + assert.Contains(t, string(data), "Dynamic = 42") + assert.NotContains(t, string(data), "[Dynamic]") + + // Unmarshal + var cfg2 Config + cfg2.Dynamic = NewDynamic(0) + err = TransparentUnmarshal(data, &cfg2) + assert.NoError(t, err) + + assert.Equal(t, 10, cfg2.Regular) + assert.Equal(t, 42, cfg2.Dynamic.Get()) + assert.Equal(t, "test", cfg2.After) + }) + + t.Run("struct types", func(t *testing.T) { + type Inner struct { + Name string + Count int + } + + type Config struct { + Field *Dynamic[Inner] + } + + cfg1 := Config{ + Field: NewDynamic(Inner{Name: "test", Count: 99}), + } + + data, err := TransparentMarshal(cfg1) + assert.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + // Should have Field.Name and Field.Count directly + assert.Contains(t, string(data), "[Field]") + assert.Contains(t, string(data), "Name = \"test\"") + assert.Contains(t, string(data), "Count = 99") + + var cfg2 Config + cfg2.Field = NewDynamic(Inner{}) + err = TransparentUnmarshal(data, &cfg2) + assert.NoError(t, err) + + assert.Equal(t, "test", cfg2.Field.Get().Name) + assert.Equal(t, 99, cfg2.Field.Get().Count) + }) + + t.Run("slice types", func(t *testing.T) { + type Config struct { + Items *Dynamic[[]string] + } + + cfg1 := Config{ + Items: NewDynamic([]string{"a", "b", "c"}), + } + + data, err := TransparentMarshal(cfg1) + assert.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + assert.Contains(t, string(data), "Items = [\"a\", \"b\", \"c\"]") + + var cfg2 Config + cfg2.Items = NewDynamic([]string{}) + err = TransparentUnmarshal(data, &cfg2) + assert.NoError(t, err) + + assert.Equal(t, []string{"a", "b", "c"}, cfg2.Items.Get()) + }) + + t.Run("time.Duration types", func(t *testing.T) { + type Config struct { + Timeout *Dynamic[time.Duration] + } + + cfg1 := Config{ + Timeout: NewDynamic(5 * time.Minute), + } + + data, err := TransparentMarshal(cfg1) + assert.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + assert.Contains(t, string(data), "Timeout = \"5m0s\"") + + var cfg2 Config + cfg2.Timeout = NewDynamic(time.Duration(0)) + err = TransparentUnmarshal(data, &cfg2) + assert.NoError(t, err) + + assert.Equal(t, 5*time.Minute, cfg2.Timeout.Get()) + }) +} + +func TestTransparentMarshalCurioIngest(t *testing.T) { + // Test with a subset of CurioIngestConfig + type TestIngest struct { + MaxMarketRunningPipelines *Dynamic[int] + MaxQueueDownload *Dynamic[int] + MaxDealWaitTime *Dynamic[time.Duration] + } + + cfg1 := TestIngest{ + MaxMarketRunningPipelines: NewDynamic(64), + MaxQueueDownload: NewDynamic(8), + MaxDealWaitTime: NewDynamic(time.Hour), + } + + data, err := TransparentMarshal(cfg1) + assert.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + // Verify transparency - should be flat keys + assert.Contains(t, string(data), "MaxMarketRunningPipelines = 64") + assert.Contains(t, string(data), "MaxQueueDownload = 8") + assert.NotContains(t, string(data), "[MaxMarketRunningPipelines]") + + var cfg2 TestIngest + cfg2.MaxMarketRunningPipelines = NewDynamic(0) + cfg2.MaxQueueDownload = NewDynamic(0) + cfg2.MaxDealWaitTime = NewDynamic(time.Duration(0)) + + err = TransparentUnmarshal(data, &cfg2) + assert.NoError(t, err) + + assert.Equal(t, 64, cfg2.MaxMarketRunningPipelines.Get()) + assert.Equal(t, 8, cfg2.MaxQueueDownload.Get()) + assert.Equal(t, time.Hour, cfg2.MaxDealWaitTime.Get()) +} + +func TestTransparentMarshalWithFIL(t *testing.T) { + // Test with FIL types - both marshal and unmarshal + type TestConfig struct { + Fee *Dynamic[types.FIL] + Amount types.FIL + RegularField int + } + + // Create config with properly initialized FIL values + cfg1 := TestConfig{ + Fee: NewDynamic(types.MustParseFIL("5 FIL")), + Amount: types.MustParseFIL("10 FIL"), + RegularField: 42, + } + + // Marshal + data, err := TransparentMarshal(cfg1) + assert.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + // Verify transparency - Fee should be flat + assert.Contains(t, string(data), `Fee = "5 FIL"`) + assert.Contains(t, string(data), `Amount = "10 FIL"`) + assert.Contains(t, string(data), "RegularField = 42") + + // Unmarshal - key is to pre-initialize FIL fields with proper values + cfg2 := TestConfig{ + Fee: NewDynamic(types.MustParseFIL("0")), // Initialize with zero FIL + Amount: types.MustParseFIL("0"), // Initialize with zero FIL + } + + err = TransparentUnmarshal(data, &cfg2) + assert.NoError(t, err) + + // Verify values were unmarshaled correctly + assert.Equal(t, "5 FIL", cfg2.Fee.Get().String()) + assert.Equal(t, "10 FIL", cfg2.Amount.String()) + assert.Equal(t, 42, cfg2.RegularField) +} + +func TestTransparentMarshalBatchFeeConfig(t *testing.T) { + // Test with actual BatchFeeConfig from types.go + type TestBatchConfig struct { + Base types.FIL + PerSector types.FIL + Dynamic *Dynamic[types.FIL] + } + + cfg1 := TestBatchConfig{ + Base: types.MustParseFIL("1 FIL"), + PerSector: types.MustParseFIL("0.02 FIL"), + Dynamic: NewDynamic(types.MustParseFIL("0.5 FIL")), + } + + data, err := TransparentMarshal(cfg1) + assert.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + // Verify all fields are present and transparent + assert.Contains(t, string(data), `Base = "1 FIL"`) + assert.Contains(t, string(data), `PerSector = "0.02 FIL"`) + assert.Contains(t, string(data), `Dynamic = "0.5 FIL"`) + + // Unmarshal with proper initialization + cfg2 := TestBatchConfig{ + Base: types.MustParseFIL("0"), + PerSector: types.MustParseFIL("0"), + Dynamic: NewDynamic(types.MustParseFIL("0")), + } + + err = TransparentUnmarshal(data, &cfg2) + assert.NoError(t, err) + + assert.Equal(t, "1 FIL", cfg2.Base.String()) + assert.Equal(t, "0.02 FIL", cfg2.PerSector.String()) + assert.Equal(t, "0.5 FIL", cfg2.Dynamic.Get().String()) +} + +// TestTransparentDecode tests the TransparentDecode function with MetaData +func TestTransparentDecode(t *testing.T) { + t.Run("basic decode with metadata", func(t *testing.T) { + type Config struct { + Field1 *Dynamic[int] + Field2 *Dynamic[string] + Field3 int + } + + tomlData := ` +Field1 = 42 +Field2 = "hello" +` + + cfg := Config{ + Field1: NewDynamic(0), + Field2: NewDynamic(""), + Field3: 99, + } + + md, err := TransparentDecode(tomlData, &cfg) + require.NoError(t, err) + + // Check values + assert.Equal(t, 42, cfg.Field1.Get()) + assert.Equal(t, "hello", cfg.Field2.Get()) + assert.Equal(t, 99, cfg.Field3) // Not set in TOML + + // Check metadata + assert.True(t, md.IsDefined("Field1")) + assert.True(t, md.IsDefined("Field2")) + assert.False(t, md.IsDefined("Field3")) + }) + + t.Run("decode with nested struct", func(t *testing.T) { + type Inner struct { + Name string + Age int + } + + type Config struct { + Person *Dynamic[Inner] + } + + tomlData := ` +[Person] +Name = "Alice" +Age = 30 +` + + cfg := Config{ + Person: NewDynamic(Inner{}), + } + + md, err := TransparentDecode(tomlData, &cfg) + require.NoError(t, err) + + assert.Equal(t, "Alice", cfg.Person.Get().Name) + assert.Equal(t, 30, cfg.Person.Get().Age) + assert.True(t, md.IsDefined("Person")) + }) + + t.Run("decode with partial fields", func(t *testing.T) { + type Config struct { + A *Dynamic[int] + B *Dynamic[int] + C *Dynamic[int] + } + + tomlData := ` +A = 1 +C = 3 +` + + cfg := Config{ + A: NewDynamic(0), + B: NewDynamic(99), // Should remain unchanged + C: NewDynamic(0), + } + + md, err := TransparentDecode(tomlData, &cfg) + require.NoError(t, err) + + assert.Equal(t, 1, cfg.A.Get()) + assert.Equal(t, 99, cfg.B.Get()) // Unchanged + assert.Equal(t, 3, cfg.C.Get()) + + assert.True(t, md.IsDefined("A")) + assert.False(t, md.IsDefined("B")) + assert.True(t, md.IsDefined("C")) + }) + + t.Run("decode with invalid TOML", func(t *testing.T) { + type Config struct { + Field *Dynamic[int] + } + + tomlData := ` +Field = [invalid +` + + cfg := Config{ + Field: NewDynamic(0), + } + + _, err := TransparentDecode(tomlData, &cfg) + assert.Error(t, err) + }) +} + +// TestNestedStructsWithDynamics tests nested struct handling +func TestNestedStructsWithDynamics(t *testing.T) { + t.Run("nested struct with dynamic fields", func(t *testing.T) { + type Inner struct { + Value *Dynamic[int] + } + + type Outer struct { + Inner Inner + Count *Dynamic[int] + } + + cfg1 := Outer{ + Inner: Inner{ + Value: NewDynamic(42), + }, + Count: NewDynamic(10), + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + assert.Contains(t, string(data), "Count = 10") + assert.Contains(t, string(data), "[Inner]") + assert.Contains(t, string(data), "Value = 42") + + cfg2 := Outer{ + Inner: Inner{ + Value: NewDynamic(0), + }, + Count: NewDynamic(0), + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + assert.Equal(t, 42, cfg2.Inner.Value.Get()) + assert.Equal(t, 10, cfg2.Count.Get()) + }) + + t.Run("deeply nested dynamics", func(t *testing.T) { + type Level3 struct { + Deep *Dynamic[string] + } + + type Level2 struct { + Mid *Dynamic[int] + Level Level3 + } + + type Level1 struct { + Top *Dynamic[bool] + Level Level2 + } + + cfg1 := Level1{ + Top: NewDynamic(true), + Level: Level2{ + Mid: NewDynamic(99), + Level: Level3{ + Deep: NewDynamic("deepvalue"), + }, + }, + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + cfg2 := Level1{ + Top: NewDynamic(false), + Level: Level2{ + Mid: NewDynamic(0), + Level: Level3{ + Deep: NewDynamic(""), + }, + }, + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + assert.Equal(t, true, cfg2.Top.Get()) + assert.Equal(t, 99, cfg2.Level.Mid.Get()) + assert.Equal(t, "deepvalue", cfg2.Level.Level.Deep.Get()) + }) + + t.Run("pointer to struct with dynamics", func(t *testing.T) { + // This test verifies that pointers to structs containing Dynamic fields + // are handled correctly, even though the unwrapping logic needs to be + // careful with pointer types + type Inner struct { + Value *Dynamic[int] + Name string + } + + type Outer struct { + InnerPtr *Inner + Count *Dynamic[int] + } + + cfg1 := Outer{ + InnerPtr: &Inner{ + Value: NewDynamic(42), + Name: "test", + }, + Count: NewDynamic(10), + } + + // For now, we just test that marshal works + // The pointer to struct case is a known limitation + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + + // Check the marshaled output + assert.Contains(t, string(data), "Count = 10") + assert.Contains(t, string(data), "[InnerPtr]") + + // For unmarshal with pointer to struct, we need to ensure proper setup + cfg2 := Outer{ + InnerPtr: &Inner{ + Value: NewDynamic(0), + Name: "", + }, + Count: NewDynamic(0), + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + assert.NotNil(t, cfg2.InnerPtr) + assert.Equal(t, 42, cfg2.InnerPtr.Value.Get()) + assert.Equal(t, "test", cfg2.InnerPtr.Name) + assert.Equal(t, 10, cfg2.Count.Get()) + }) +} + +// TestEdgeCases tests edge cases +func TestEdgeCases(t *testing.T) { + t.Run("struct without dynamics", func(t *testing.T) { + type Config struct { + Field1 int + Field2 string + } + + cfg1 := Config{ + Field1: 42, + Field2: "test", + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + var cfg2 Config + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + assert.Equal(t, 42, cfg2.Field1) + assert.Equal(t, "test", cfg2.Field2) + }) + + t.Run("empty struct", func(t *testing.T) { + type Config struct{} + + cfg1 := Config{} + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + var cfg2 Config + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + }) + + t.Run("all dynamic fields", func(t *testing.T) { + type Config struct { + A *Dynamic[int] + B *Dynamic[string] + C *Dynamic[bool] + } + + cfg1 := Config{ + A: NewDynamic(1), + B: NewDynamic("test"), + C: NewDynamic(true), + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + cfg2 := Config{ + A: NewDynamic(0), + B: NewDynamic(""), + C: NewDynamic(false), + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + assert.Equal(t, 1, cfg2.A.Get()) + assert.Equal(t, "test", cfg2.B.Get()) + assert.Equal(t, true, cfg2.C.Get()) + }) + + t.Run("map types in dynamic", func(t *testing.T) { + type Config struct { + Data *Dynamic[map[string]int] + } + + cfg1 := Config{ + Data: NewDynamic(map[string]int{"a": 1, "b": 2}), + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + cfg2 := Config{ + Data: NewDynamic(map[string]int{}), + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + assert.Equal(t, 1, cfg2.Data.Get()["a"]) + assert.Equal(t, 2, cfg2.Data.Get()["b"]) + }) + + t.Run("slice of structs in dynamic", func(t *testing.T) { + type Item struct { + Name string + Value int + } + + type Config struct { + Items *Dynamic[[]Item] + } + + cfg1 := Config{ + Items: NewDynamic([]Item{ + {Name: "first", Value: 1}, + {Name: "second", Value: 2}, + }), + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + cfg2 := Config{ + Items: NewDynamic([]Item{}), + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + items := cfg2.Items.Get() + assert.Len(t, items, 2) + assert.Equal(t, "first", items[0].Name) + assert.Equal(t, 1, items[0].Value) + assert.Equal(t, "second", items[1].Name) + assert.Equal(t, 2, items[1].Value) + }) + + t.Run("zero values", func(t *testing.T) { + type Config struct { + IntVal *Dynamic[int] + StringVal *Dynamic[string] + BoolVal *Dynamic[bool] + } + + cfg1 := Config{ + IntVal: NewDynamic(0), + StringVal: NewDynamic(""), + BoolVal: NewDynamic(false), + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + cfg2 := Config{ + IntVal: NewDynamic(99), + StringVal: NewDynamic("default"), + BoolVal: NewDynamic(true), + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + assert.Equal(t, 0, cfg2.IntVal.Get()) + assert.Equal(t, "", cfg2.StringVal.Get()) + assert.Equal(t, false, cfg2.BoolVal.Get()) + }) + + t.Run("pointer to dynamic value", func(t *testing.T) { + type Config struct { + Ptr *Dynamic[*int] + } + + val := 42 + cfg1 := Config{ + Ptr: NewDynamic(&val), + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + zero := 0 + cfg2 := Config{ + Ptr: NewDynamic(&zero), + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + assert.Equal(t, 42, *cfg2.Ptr.Get()) + }) +} + +// TestHelperFunctions tests helper functions +func TestHelperFunctions(t *testing.T) { + t.Run("isDynamicTypeForMarshal", func(t *testing.T) { + // Dynamic type + dynType := reflect.TypeOf((*Dynamic[int])(nil)).Elem() + assert.True(t, isDynamicTypeForMarshal(dynType)) + + // Pointer to Dynamic type + ptrDynType := reflect.TypeOf((*Dynamic[int])(nil)) + assert.True(t, isDynamicTypeForMarshal(ptrDynType)) + + // Regular types + assert.False(t, isDynamicTypeForMarshal(reflect.TypeOf(42))) + assert.False(t, isDynamicTypeForMarshal(reflect.TypeOf("string"))) + assert.False(t, isDynamicTypeForMarshal(reflect.TypeOf(struct{}{}))) + }) + + t.Run("hasNestedDynamics", func(t *testing.T) { + type WithDynamic struct { + Field *Dynamic[int] + } + + type WithoutDynamic struct { + Field int + } + + type NestedWithDynamic struct { + Inner WithDynamic + } + + type DeepNested struct { + Level1 struct { + Level2 struct { + Field *Dynamic[string] + } + } + } + + assert.True(t, hasNestedDynamics(reflect.TypeOf(WithDynamic{}))) + assert.False(t, hasNestedDynamics(reflect.TypeOf(WithoutDynamic{}))) + assert.True(t, hasNestedDynamics(reflect.TypeOf(NestedWithDynamic{}))) + assert.True(t, hasNestedDynamics(reflect.TypeOf(DeepNested{}))) + + // Pointer to struct + assert.True(t, hasNestedDynamics(reflect.TypeOf(&WithDynamic{}))) + assert.False(t, hasNestedDynamics(reflect.TypeOf(&WithoutDynamic{}))) + }) + + t.Run("extractDynamicValue", func(t *testing.T) { + d := NewDynamic(42) + val := reflect.ValueOf(d) + + extracted := extractDynamicValue(val) + assert.True(t, extracted.IsValid()) + assert.Equal(t, 42, extracted.Interface().(int)) + + // Test with nil pointer + var nilDyn *Dynamic[int] + nilVal := reflect.ValueOf(nilDyn) + extracted = extractDynamicValue(nilVal) + assert.False(t, extracted.IsValid()) + }) + + t.Run("extractDynamicInnerType", func(t *testing.T) { + dynType := reflect.TypeOf((*Dynamic[int])(nil)).Elem() + innerType := extractDynamicInnerType(dynType) + assert.Equal(t, reflect.TypeOf(0), innerType) + + // Test with string + dynStrType := reflect.TypeOf((*Dynamic[string])(nil)).Elem() + innerStrType := extractDynamicInnerType(dynStrType) + assert.Equal(t, reflect.TypeOf(""), innerStrType) + + // Test with struct + type TestStruct struct { + Field int + } + dynStructType := reflect.TypeOf((*Dynamic[TestStruct])(nil)).Elem() + innerStructType := extractDynamicInnerType(dynStructType) + assert.Equal(t, reflect.TypeOf(TestStruct{}), innerStructType) + }) + + t.Run("setDynamicValue", func(t *testing.T) { + d := NewDynamic(0) + dynField := reflect.ValueOf(d) + valueField := reflect.ValueOf(99) + + setDynamicValue(dynField, valueField) + assert.Equal(t, 99, d.Get()) + + // Test with nil Dynamic (should create new instance) + var nilDyn *Dynamic[int] + nilField := reflect.ValueOf(&nilDyn).Elem() + valueField2 := reflect.ValueOf(42) + + setDynamicValue(nilField, valueField2) + assert.NotNil(t, nilDyn) + assert.Equal(t, 42, nilDyn.Get()) + }) +} + +// TestCreateShadowType tests shadow type creation +func TestCreateShadowType(t *testing.T) { + t.Run("simple dynamic replacement", func(t *testing.T) { + type Original struct { + Field *Dynamic[int] + } + + origType := reflect.TypeOf(Original{}) + shadowType := createShadowType(origType) + + assert.Equal(t, origType.NumField(), shadowType.NumField()) + + // Check that *Dynamic[int] was replaced with int + origFieldType := origType.Field(0).Type + shadowFieldType := shadowType.Field(0).Type + + assert.True(t, isDynamicTypeForMarshal(origFieldType)) + assert.False(t, isDynamicTypeForMarshal(shadowFieldType)) + // The shadow field type should be int (the inner type of Dynamic[int]) + assert.Equal(t, reflect.TypeOf(0), shadowFieldType) + }) + + t.Run("mixed fields", func(t *testing.T) { + type Original struct { + Regular int + Dynamic *Dynamic[string] + Another bool + } + + origType := reflect.TypeOf(Original{}) + shadowType := createShadowType(origType) + + assert.Equal(t, 3, shadowType.NumField()) + + // Regular field unchanged + assert.Equal(t, reflect.TypeOf(0), shadowType.Field(0).Type) + + // Dynamic field unwrapped - should be string (the inner type) + assert.Equal(t, reflect.TypeOf(""), shadowType.Field(1).Type) + + // Another regular field unchanged + assert.Equal(t, reflect.TypeOf(false), shadowType.Field(2).Type) + }) + + t.Run("nested struct with dynamics", func(t *testing.T) { + type Inner struct { + Value *Dynamic[int] + } + + type Outer struct { + Inner Inner + } + + origType := reflect.TypeOf(Outer{}) + shadowType := createShadowType(origType) + + // Check outer struct + assert.Equal(t, 1, shadowType.NumField()) + + // Check inner struct field + innerField := shadowType.Field(0) + assert.Equal(t, "Inner", innerField.Name) + + // The inner type should also have its Dynamic unwrapped + innerType := innerField.Type + assert.Equal(t, 1, innerType.NumField()) + + innerValueField := innerType.Field(0) + assert.Equal(t, "Value", innerValueField.Name) + // The inner field should be int (unwrapped from *Dynamic[int]) + assert.Equal(t, reflect.TypeOf(0), innerValueField.Type) + }) + + t.Run("pointer type handling", func(t *testing.T) { + type Original struct { + Field *Dynamic[int] + } + + ptrType := reflect.TypeOf(&Original{}) + shadowType := createShadowType(ptrType) + + // Should handle pointer + assert.Equal(t, reflect.Ptr, shadowType.Kind()) + assert.Equal(t, reflect.Struct, shadowType.Elem().Kind()) + }) +} + +// TestInitializeShadowFromTarget tests shadow initialization +func TestInitializeShadowFromTarget(t *testing.T) { + t.Run("initialize with FIL values", func(t *testing.T) { + type TestConfig struct { + Fee *Dynamic[types.FIL] + Amount types.FIL + } + + target := TestConfig{ + Fee: NewDynamic(types.MustParseFIL("5 FIL")), + Amount: types.MustParseFIL("10 FIL"), + } + + shadow := createShadowStruct(&target) + initializeShadowFromTarget(shadow, &target) + + // Check that shadow was initialized with target values + shadowVal := reflect.ValueOf(shadow).Elem() + feeField := shadowVal.Field(0) + amountField := shadowVal.Field(1) + + assert.True(t, feeField.IsValid()) + assert.True(t, amountField.IsValid()) + + // The FIL values should have been copied + feeVal := feeField.Interface().(types.FIL) + amountVal := amountField.Interface().(types.FIL) + + assert.Equal(t, "5 FIL", feeVal.String()) + assert.Equal(t, "10 FIL", amountVal.String()) + }) + + t.Run("initialize regular fields", func(t *testing.T) { + type TestConfig struct { + IntVal *Dynamic[int] + StrVal string + } + + target := TestConfig{ + IntVal: NewDynamic(42), + StrVal: "test", + } + + shadow := createShadowStruct(&target) + initializeShadowFromTarget(shadow, &target) + + shadowVal := reflect.ValueOf(shadow).Elem() + intField := shadowVal.Field(0) + strField := shadowVal.Field(1) + + // Dynamic field should be initialized + assert.Equal(t, 42, intField.Interface().(int)) + + // Regular field should be initialized + assert.Equal(t, "test", strField.Interface().(string)) + }) +} + +// TestWrapDynamics tests wrapping values back into Dynamic fields +func TestWrapDynamics(t *testing.T) { + t.Run("wrap simple values", func(t *testing.T) { + type TestConfig struct { + IntVal *Dynamic[int] + StrVal *Dynamic[string] + } + + // Create shadow with plain values + type Shadow struct { + IntVal int + StrVal string + } + + shadow := Shadow{ + IntVal: 42, + StrVal: "test", + } + + // Create target with Dynamic fields + target := TestConfig{ + IntVal: NewDynamic(0), + StrVal: NewDynamic(""), + } + + err := wrapDynamics(shadow, &target) + require.NoError(t, err) + + assert.Equal(t, 42, target.IntVal.Get()) + assert.Equal(t, "test", target.StrVal.Get()) + }) + + t.Run("wrap nested structs", func(t *testing.T) { + type Inner struct { + Value *Dynamic[int] + } + + type Outer struct { + Inner Inner + } + + // Shadow structure + type ShadowInner struct { + Value int + } + + type ShadowOuter struct { + Inner ShadowInner + } + + shadow := ShadowOuter{ + Inner: ShadowInner{ + Value: 99, + }, + } + + target := Outer{ + Inner: Inner{ + Value: NewDynamic(0), + }, + } + + err := wrapDynamics(shadow, &target) + require.NoError(t, err) + + assert.Equal(t, 99, target.Inner.Value.Get()) + }) + + t.Run("preserve non-dynamic fields", func(t *testing.T) { + type TestConfig struct { + DynVal *Dynamic[int] + RegVal int + } + + type Shadow struct { + DynVal int + RegVal int + } + + shadow := Shadow{ + DynVal: 42, + RegVal: 99, + } + + target := TestConfig{ + DynVal: NewDynamic(0), + RegVal: 0, + } + + err := wrapDynamics(shadow, &target) + require.NoError(t, err) + + assert.Equal(t, 42, target.DynVal.Get()) + assert.Equal(t, 99, target.RegVal) + }) +} + +// TestUnwrapDynamics tests unwrapping Dynamic fields for marshaling +func TestUnwrapDynamics(t *testing.T) { + t.Run("unwrap simple dynamic", func(t *testing.T) { + type Config struct { + Field *Dynamic[int] + } + + cfg := Config{ + Field: NewDynamic(42), + } + + unwrapped := UnwrapDynamics(cfg) + + // Check that the result has the inner type + unwrappedVal := reflect.ValueOf(unwrapped) + fieldVal := unwrappedVal.Field(0) + + assert.Equal(t, 42, fieldVal.Interface().(int)) + }) + + t.Run("unwrap with regular fields", func(t *testing.T) { + type Config struct { + Regular int + Dynamic *Dynamic[string] + } + + cfg := Config{ + Regular: 99, + Dynamic: NewDynamic("test"), + } + + unwrapped := UnwrapDynamics(cfg) + + unwrappedVal := reflect.ValueOf(unwrapped) + regularField := unwrappedVal.Field(0) + dynamicField := unwrappedVal.Field(1) + + assert.Equal(t, 99, regularField.Interface().(int)) + assert.Equal(t, "test", dynamicField.Interface().(string)) + }) + + t.Run("unwrap nested dynamics", func(t *testing.T) { + type Inner struct { + Value *Dynamic[int] + } + + type Outer struct { + Inner Inner + Count *Dynamic[int] + } + + cfg := Outer{ + Inner: Inner{ + Value: NewDynamic(42), + }, + Count: NewDynamic(10), + } + + unwrapped := UnwrapDynamics(cfg) + + unwrappedVal := reflect.ValueOf(unwrapped) + innerField := unwrappedVal.Field(0) + countField := unwrappedVal.Field(1) + + assert.Equal(t, 10, countField.Interface().(int)) + + innerVal := innerField.Interface() + innerReflect := reflect.ValueOf(innerVal) + valueField := innerReflect.Field(0) + + assert.Equal(t, 42, valueField.Interface().(int)) + }) + + t.Run("unwrap struct without dynamics", func(t *testing.T) { + type Config struct { + Field1 int + Field2 string + } + + cfg := Config{ + Field1: 42, + Field2: "test", + } + + unwrapped := UnwrapDynamics(cfg) + + // Should return the same struct + unwrappedConfig := unwrapped.(Config) + assert.Equal(t, 42, unwrappedConfig.Field1) + assert.Equal(t, "test", unwrappedConfig.Field2) + }) +} + +// TestRoundTripConsistency tests that marshal/unmarshal round trips preserve values +func TestRoundTripConsistency(t *testing.T) { + t.Run("complex struct round trip", func(t *testing.T) { + type Inner struct { + Name string + Count *Dynamic[int] + } + + type Config struct { + ID int + Timeout *Dynamic[time.Duration] + Items *Dynamic[[]string] + Inner Inner + Active *Dynamic[bool] + } + + original := Config{ + ID: 123, + Timeout: NewDynamic(5 * time.Minute), + Items: NewDynamic([]string{"a", "b", "c"}), + Inner: Inner{ + Name: "test", + Count: NewDynamic(99), + }, + Active: NewDynamic(true), + } + + // Marshal + data, err := TransparentMarshal(original) + require.NoError(t, err) + + // Unmarshal + restored := Config{ + Timeout: NewDynamic(time.Duration(0)), + Items: NewDynamic([]string{}), + Inner: Inner{ + Count: NewDynamic(0), + }, + Active: NewDynamic(false), + } + + err = TransparentUnmarshal(data, &restored) + require.NoError(t, err) + + // Verify all fields match + assert.Equal(t, original.ID, restored.ID) + assert.Equal(t, original.Timeout.Get(), restored.Timeout.Get()) + assert.Equal(t, original.Items.Get(), restored.Items.Get()) + assert.Equal(t, original.Inner.Name, restored.Inner.Name) + assert.Equal(t, original.Inner.Count.Get(), restored.Inner.Count.Get()) + assert.Equal(t, original.Active.Get(), restored.Active.Get()) + }) + + t.Run("multiple round trips", func(t *testing.T) { + type Config struct { + Value *Dynamic[int] + } + + cfg := Config{ + Value: NewDynamic(42), + } + + for i := 0; i < 3; i++ { + data, err := TransparentMarshal(cfg) + require.NoError(t, err) + + cfg = Config{ + Value: NewDynamic(0), + } + + err = TransparentUnmarshal(data, &cfg) + require.NoError(t, err) + + assert.Equal(t, 42, cfg.Value.Get(), "round trip %d failed", i+1) + } + }) +} + +// TestErrorHandling tests error conditions +func TestErrorHandling(t *testing.T) { + t.Run("invalid TOML syntax", func(t *testing.T) { + type Config struct { + Field *Dynamic[int] + } + + invalidTOML := `Field = [[[invalid` + + cfg := Config{ + Field: NewDynamic(0), + } + + err := TransparentUnmarshal([]byte(invalidTOML), &cfg) + assert.Error(t, err) + }) + + t.Run("type mismatch in TOML", func(t *testing.T) { + type Config struct { + Field *Dynamic[int] + } + + tomlData := `Field = "not an int"` + + cfg := Config{ + Field: NewDynamic(0), + } + + err := TransparentUnmarshal([]byte(tomlData), &cfg) + assert.Error(t, err) + }) + + t.Run("missing required initialization", func(t *testing.T) { + type Config struct { + Field *Dynamic[types.FIL] + } + + tomlData := `Field = "5 FIL"` + + // Without proper initialization, this should fail or behave unexpectedly + cfg := Config{ + Field: NewDynamic(types.FIL{}), // Not properly initialized + } + + // This test documents the expected behavior + err := TransparentUnmarshal([]byte(tomlData), &cfg) + // The error handling depends on the FIL type implementation + _ = err + }) +} + +// TestWithActualTOMLLibrary tests integration with TOML library +func TestWithActualTOMLLibrary(t *testing.T) { + t.Run("compare with standard TOML", func(t *testing.T) { + type Config struct { + Field int + } + + cfg := Config{Field: 42} + + // Standard TOML marshal + standardData, err := toml.Marshal(cfg) + require.NoError(t, err) + + // Transparent marshal (should be identical for non-Dynamic structs) + transparentData, err := TransparentMarshal(cfg) + require.NoError(t, err) + + assert.Equal(t, string(standardData), string(transparentData)) + }) + + t.Run("decode metadata accuracy", func(t *testing.T) { + type Config struct { + A int + B string + C bool + } + + tomlData := ` +A = 1 +B = "test" +` + + var cfg Config + md, err := toml.Decode(tomlData, &cfg) + require.NoError(t, err) + + assert.True(t, md.IsDefined("A")) + assert.True(t, md.IsDefined("B")) + assert.False(t, md.IsDefined("C")) + }) +} + +// TestAdditionalEdgeCases tests additional edge cases for better coverage +func TestAdditionalEdgeCases(t *testing.T) { + t.Run("nil pointer to dynamic", func(t *testing.T) { + type Config struct { + Field *Dynamic[int] + } + + // Test with nil Dynamic field + cfg := Config{ + Field: nil, + } + + // Marshal should handle nil gracefully + data, err := TransparentMarshal(cfg) + require.NoError(t, err) + t.Logf("Marshaled:\n%s", string(data)) + }) + + t.Run("nested pointer to struct without dynamics", func(t *testing.T) { + type Inner struct { + Value int + } + + type Outer struct { + InnerPtr *Inner + } + + cfg1 := Outer{ + InnerPtr: &Inner{Value: 42}, + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + cfg2 := Outer{ + InnerPtr: &Inner{}, + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + assert.Equal(t, 42, cfg2.InnerPtr.Value) + }) + + t.Run("marshal pointer to struct", func(t *testing.T) { + type Config struct { + Field *Dynamic[int] + } + + cfg := &Config{ + Field: NewDynamic(42), + } + + data, err := TransparentMarshal(cfg) + require.NoError(t, err) + assert.Contains(t, string(data), "Field = 42") + }) + + t.Run("extractDynamicValue with struct value", func(t *testing.T) { + // Test extractDynamicValue with addressable Dynamic struct + d := Dynamic[int]{} + // We need to use a pointer to make it addressable + ptr := &d + val := reflect.ValueOf(ptr).Elem() + + // Now the value is addressable, but the method might still not work correctly + // since Dynamic is meant to be used as a pointer + extracted := extractDynamicValue(val) + // This might return invalid or zero value + _ = extracted + }) + + t.Run("extractDynamicInnerType with non-struct", func(t *testing.T) { + // Test with a non-struct type + intType := reflect.TypeOf(42) + result := extractDynamicInnerType(intType) + // Should return the same type + assert.Equal(t, intType, result) + }) + + t.Run("setDynamicValue with invalid value", func(t *testing.T) { + d := NewDynamic(0) + dynField := reflect.ValueOf(d) + invalidValue := reflect.Value{} + + // Should handle invalid value gracefully + setDynamicValue(dynField, invalidValue) + // Value should remain unchanged + assert.Equal(t, 0, d.Get()) + }) + + t.Run("hasNestedDynamics with non-struct", func(t *testing.T) { + // Test with non-struct types + assert.False(t, hasNestedDynamics(reflect.TypeOf(42))) + assert.False(t, hasNestedDynamics(reflect.TypeOf("string"))) + assert.False(t, hasNestedDynamics(reflect.TypeOf([]int{}))) + }) + + t.Run("unwrapDynamics with non-struct", func(t *testing.T) { + // Test with non-struct value + val := 42 + result := UnwrapDynamics(val) + assert.Equal(t, 42, result.(int)) + }) + + t.Run("wrapDynamics with non-struct", func(t *testing.T) { + // Test with non-struct values + shadow := 42 + target := 99 + + err := wrapDynamics(shadow, &target) + require.NoError(t, err) + // Since both are ints, wrapDynamics should just return without error + }) + + t.Run("createShadowType with non-struct", func(t *testing.T) { + // Test with non-struct type + intType := reflect.TypeOf(42) + result := createShadowType(intType) + assert.Equal(t, intType, result) + }) + + t.Run("initializeShadowFromTarget with non-struct", func(t *testing.T) { + // Test with non-struct values + shadow := 42 + target := 99 + + // Should return without error for non-structs + initializeShadowFromTarget(shadow, target) + // Nothing should happen, but shouldn't panic + }) + + t.Run("nested struct with pointer to struct without dynamics", func(t *testing.T) { + type Inner struct { + Value int + } + + type Middle struct { + InnerPtr *Inner + } + + type Outer struct { + Middle *Middle + } + + cfg1 := Outer{ + Middle: &Middle{ + InnerPtr: &Inner{Value: 42}, + }, + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + cfg2 := Outer{ + Middle: &Middle{ + InnerPtr: &Inner{}, + }, + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + assert.Equal(t, 42, cfg2.Middle.InnerPtr.Value) + }) + + t.Run("dynamic with slice of pointers", func(t *testing.T) { + type Config struct { + Items *Dynamic[[]*int] + } + + val1, val2 := 1, 2 + cfg1 := Config{ + Items: NewDynamic([]*int{&val1, &val2}), + } + + data, err := TransparentMarshal(cfg1) + require.NoError(t, err) + + zero1, zero2 := 0, 0 + cfg2 := Config{ + Items: NewDynamic([]*int{&zero1, &zero2}), + } + + err = TransparentUnmarshal(data, &cfg2) + require.NoError(t, err) + + items := cfg2.Items.Get() + assert.Len(t, items, 2) + assert.Equal(t, 1, *items[0]) + assert.Equal(t, 2, *items[1]) + }) + + t.Run("extractDynamicInnerType with pointer to dynamic", func(t *testing.T) { + // Test with pointer to Dynamic type + ptrType := reflect.TypeOf((*Dynamic[string])(nil)) + innerType := extractDynamicInnerType(ptrType) + assert.Equal(t, reflect.TypeOf(""), innerType) + }) + + t.Run("struct with unexported fields", func(t *testing.T) { + // Test that unexported fields are handled gracefully + type Config struct { + Exported *Dynamic[int] + unexported int // unexported field + } + + cfg := Config{ + Exported: NewDynamic(42), + unexported: 99, // This shouldn't be marshaled + } + + data, err := TransparentMarshal(cfg) + require.NoError(t, err) + assert.Contains(t, string(data), "Exported = 42") + }) +} + +// TestCoverageForRemainingPaths tests specific code paths to achieve 100% coverage +func TestCoverageForRemainingPaths(t *testing.T) { + t.Run("extractDynamicValue with method not found", func(t *testing.T) { + // Create a struct that looks like Dynamic but doesn't have Get method + type FakeDynamic struct { + value int + } + + fake := FakeDynamic{value: 42} + val := reflect.ValueOf(&fake).Elem() + + // extractDynamicValue should return invalid value when Get() method doesn't exist + result := extractDynamicValue(val) + assert.False(t, result.IsValid()) + }) + + t.Run("setDynamicValue with method not found", func(t *testing.T) { + // Create a struct that looks like Dynamic but doesn't have Set method + type FakeDynamic struct { + value int + } + + fake := FakeDynamic{value: 0} + fakeVal := reflect.ValueOf(&fake).Elem() + newVal := reflect.ValueOf(42) + + // setDynamicValue should handle gracefully when Set() method doesn't exist + setDynamicValue(fakeVal, newVal) + // Should not panic, just return + assert.Equal(t, 0, fake.value) // Value unchanged + }) + + t.Run("unwrapDynamics with invalid dynamic value", func(t *testing.T) { + // Test case where extractDynamicValue returns invalid value + type FakeDynamic struct { + value int + } + + type Config struct { + Field *FakeDynamic + } + + cfg := Config{ + Field: &FakeDynamic{value: 42}, + } + + // Since FakeDynamic doesn't have the Get method, unwrapDynamics won't detect it as Dynamic + // This tests the path but FakeDynamic won't be treated as Dynamic + result := UnwrapDynamics(cfg) + assert.NotNil(t, result) + }) + + t.Run("initializeShadowFromTarget with non-assignable types", func(t *testing.T) { + // Test case where types don't match and assignment fails + type ConfigA struct { + Field *Dynamic[int] + } + + type ConfigB struct { + Field string // Different type + } + + targetA := ConfigA{ + Field: NewDynamic(42), + } + + // Create shadow with different structure + targetB := ConfigB{ + Field: "test", + } + + // This should handle gracefully when types don't match + initializeShadowFromTarget(&targetB, &targetA) + // Should not panic + }) + + t.Run("wrapDynamics with non-assignable shadow fields", func(t *testing.T) { + // Test wrapDynamics when shadowField type is not assignable to targetField + type ShadowConfig struct { + Field string + } + + type TargetConfig struct { + Field int + } + + shadow := ShadowConfig{Field: "test"} + target := TargetConfig{Field: 0} + + // Should handle gracefully when types don't match + err := wrapDynamics(shadow, &target) + assert.NoError(t, err) + assert.Equal(t, 0, target.Field) // Unchanged + }) + + t.Run("initializeShadowFromTarget with pointer mismatch", func(t *testing.T) { + type Inner struct { + Value int + } + + type Config1 struct { + PtrField *Inner + } + + type Config2 struct { + PtrField *string // Different pointer type + } + + str := "test" + target := Config2{ + PtrField: &str, + } + + shadow := Config1{ + PtrField: &Inner{Value: 42}, + } + + // Should handle type mismatch gracefully + initializeShadowFromTarget(&shadow, &target) + // Should not panic + }) + + t.Run("unwrapDynamics with nil dynamic pointer", func(t *testing.T) { + type Config struct { + Field *Dynamic[int] + } + + cfg := Config{ + Field: nil, + } + + // unwrapDynamics should handle nil Dynamic fields + result := UnwrapDynamics(cfg) + assert.NotNil(t, result) + + // Verify the result has the expected structure + resultVal := reflect.ValueOf(result) + assert.Equal(t, reflect.Struct, resultVal.Kind()) + }) + + t.Run("extractDynamicValue with pointer to nil", func(t *testing.T) { + var nilDyn *Dynamic[int] + val := reflect.ValueOf(nilDyn) + + // Should return invalid value for nil pointer + result := extractDynamicValue(val) + assert.False(t, result.IsValid()) + }) + + t.Run("wrapDynamics with nil shadow pointer", func(t *testing.T) { + type Inner struct { + Value int + } + + type Config struct { + PtrField *Inner + } + + // Test when shadowField is nil + shadow := Config{ + PtrField: nil, + } + + target := Config{ + PtrField: &Inner{Value: 99}, + } + + // Should handle nil shadow pointers gracefully + err := wrapDynamics(shadow, &target) + assert.NoError(t, err) + // The target will get the nil pointer from shadow since types match + assert.Nil(t, target.PtrField) + }) + + t.Run("wrapDynamics with nil target pointer", func(t *testing.T) { + type Inner struct { + Value int + } + + type Config struct { + PtrField *Inner + } + + shadow := Config{ + PtrField: &Inner{Value: 42}, + } + + // Test when targetField is nil + target := Config{ + PtrField: nil, + } + + // Should handle nil target pointers gracefully + err := wrapDynamics(shadow, &target) + assert.NoError(t, err) + // The wrapDynamics function copies regular pointer fields when they don't contain dynamics + // So target gets the value from shadow + assert.NotNil(t, target.PtrField) + assert.Equal(t, 42, target.PtrField.Value) + }) + + t.Run("initializeShadowFromTarget with nested dynamics pointer", func(t *testing.T) { + type Inner struct { + Value *Dynamic[int] + } + + type Config struct { + InnerPtr *Inner + } + + target := Config{ + InnerPtr: &Inner{ + Value: NewDynamic(42), + }, + } + + shadow := createShadowStruct(&target) + + // Initialize shadow from target with nested pointer + initializeShadowFromTarget(shadow, &target) + + // Verify the shadow was initialized correctly + shadowVal := reflect.ValueOf(shadow).Elem() + innerPtrField := shadowVal.Field(0) + assert.True(t, innerPtrField.IsValid()) + // Test just exercises the code path for pointer to struct with dynamics + // The actual result may vary based on implementation + }) + + t.Run("unwrapDynamics with nested pointer to struct with dynamics", func(t *testing.T) { + type Inner struct { + Value *Dynamic[int] + } + + type Middle struct { + InnerPtr *Inner + } + + type Outer struct { + MiddlePtr *Middle + } + + cfg := Outer{ + MiddlePtr: &Middle{ + InnerPtr: &Inner{ + Value: NewDynamic(42), + }, + }, + } + + // Test unwrapping with nested pointers to structs containing dynamics + result := UnwrapDynamics(cfg) + assert.NotNil(t, result) + + resultVal := reflect.ValueOf(result) + assert.Equal(t, reflect.Struct, resultVal.Kind()) + }) + + t.Run("extractDynamicInnerType with empty struct", func(t *testing.T) { + type EmptyStruct struct{} + + emptyType := reflect.TypeOf(EmptyStruct{}) + result := extractDynamicInnerType(emptyType) + + // Should return the same type when struct has no fields + assert.Equal(t, emptyType, result) + }) + + t.Run("setDynamicValue creating new instance", func(t *testing.T) { + // Test the path where dynamicField is nil and needs to be created + var nilDyn *Dynamic[int] + dynField := reflect.ValueOf(&nilDyn).Elem() + valueField := reflect.ValueOf(99) + + // setDynamicValue should create a new Dynamic instance + setDynamicValue(dynField, valueField) + + assert.NotNil(t, nilDyn) + assert.Equal(t, 99, nilDyn.Get()) + }) + + t.Run("initializeShadowFromTarget with regular pointer field", func(t *testing.T) { + type Config struct { + IntPtr *int + } + + val := 42 + target := Config{ + IntPtr: &val, + } + + shadow := Config{ + IntPtr: new(int), + } + + // Test copying regular pointer fields + initializeShadowFromTarget(&shadow, &target) + + assert.NotNil(t, shadow.IntPtr) + assert.Equal(t, 42, *shadow.IntPtr) + }) + + t.Run("wrapDynamics with regular field type mismatch", func(t *testing.T) { + // Test the else branch where shadowField and targetField types don't match + type ShadowConfig struct { + Field float64 + } + + type TargetConfig struct { + Field int + } + + shadow := ShadowConfig{Field: 3.14} + target := TargetConfig{Field: 42} + + err := wrapDynamics(shadow, &target) + assert.NoError(t, err) + // Field should remain unchanged due to type mismatch + assert.Equal(t, 42, target.Field) + }) + + t.Run("createShadowStruct edge cases", func(t *testing.T) { + type Config struct { + Field *Dynamic[int] + } + + cfg := Config{ + Field: NewDynamic(42), + } + + // Test that createShadowStruct handles all cases correctly + shadow := createShadowStruct(&cfg) + assert.NotNil(t, shadow) + + // Verify shadow has correct structure + shadowVal := reflect.ValueOf(shadow) + assert.Equal(t, reflect.Ptr, shadowVal.Kind()) + assert.Equal(t, reflect.Struct, shadowVal.Elem().Kind()) + }) + + t.Run("initializeShadowFromTarget innerVal not valid case", func(t *testing.T) { + // Test the case where extractDynamicValue returns invalid value + type Config struct { + Field *Dynamic[int] + } + + target := Config{ + Field: nil, // nil Dynamic + } + + shadow := createShadowStruct(&target) + + // This should handle nil Dynamic gracefully + initializeShadowFromTarget(shadow, &target) + // Just exercises the code path + }) + + t.Run("initializeShadowFromTarget type not assignable", func(t *testing.T) { + // Test where valReflect.Type() is not assignable to shadowField.Type() + type ConfigA struct { + Field *Dynamic[int] + } + + type ConfigB struct { + Field string + } + + target := ConfigA{ + Field: NewDynamic(42), + } + + // Create a shadow with incompatible type + shadow := &ConfigB{ + Field: "test", + } + + // Should handle type mismatch gracefully + initializeShadowFromTarget(shadow, &target) + // Should not crash + }) + +} diff --git a/deps/config/load.go b/deps/config/load.go index a307c3f72..1e84ebf33 100644 --- a/deps/config/load.go +++ b/deps/config/load.go @@ -2,22 +2,25 @@ package config import ( "bytes" + "context" + "errors" "fmt" "io" "math/big" "os" "reflect" "regexp" - "sort" "strings" - "time" "unicode" "github.com/BurntSushi/toml" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/kelseyhightower/envconfig" + "github.com/samber/lo" "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" ) // FromFile loads config from a specified file overriding defaults specified in @@ -84,7 +87,8 @@ func FromReader(reader io.Reader, def interface{}, opts ...LoadCfgOpt) (interfac cfg = ccfg } - md, err := toml.Decode(buf.String(), cfg) + // Use TransparentDecode for configs with Dynamic fields + md, err := TransparentDecode(buf.String(), cfg) if err != nil { return nil, err } @@ -310,23 +314,19 @@ func ConfigUpdate(cfgCur, cfgDef interface{}, opts ...UpdateCfgOpt) ([]byte, err } var nodeStr, defStr string if cfgDef != nil { - buf := new(bytes.Buffer) - e := toml.NewEncoder(buf) - if err := e.Encode(cfgDef); err != nil { + defBytes, err := TransparentMarshal(cfgDef) + if err != nil { return nil, xerrors.Errorf("encoding default config: %w", err) } - - defStr = buf.String() + defStr = string(defBytes) } { - buf := new(bytes.Buffer) - e := toml.NewEncoder(buf) - if err := e.Encode(cfgCur); err != nil { + nodeBytes, err := TransparentMarshal(cfgCur) + if err != nil { return nil, xerrors.Errorf("encoding node config: %w", err) } - - nodeStr = buf.String() + nodeStr = string(nodeBytes) } if updateOpts.comment { @@ -446,23 +446,15 @@ func ConfigUpdate(cfgCur, cfgDef interface{}, opts ...UpdateCfgOpt) ([]byte, err opts := []cmp.Option{ // This equality function compares big.Int cmpopts.IgnoreUnexported(big.Int{}), - cmp.Comparer(func(x, y []string) bool { - tx, ty := reflect.TypeOf(x), reflect.TypeOf(y) - if tx.Kind() == reflect.Slice && ty.Kind() == reflect.Slice && tx.Elem().Kind() == reflect.String && ty.Elem().Kind() == reflect.String { - sort.Strings(x) - sort.Strings(y) - return strings.Join(x, "\n") == strings.Join(y, "\n") - } - return false - }), - cmp.Comparer(func(x, y time.Duration) bool { - tx, ty := reflect.TypeOf(x), reflect.TypeOf(y) - return tx.Kind() == ty.Kind() - }), + // Treat nil and empty slices/maps as equal for all types + cmpopts.EquateEmpty(), + // Use BigIntComparer for proper big.Int comparison + BigIntComparer, } if !cmp.Equal(cfgUpdated, cfgCur, opts...) { - return nil, xerrors.Errorf("updated config didn't match current config") + diff := cmp.Diff(cfgUpdated, cfgCur, opts...) + return nil, xerrors.Errorf("updated config didn't match current config:\n%s", diff) } } @@ -505,8 +497,9 @@ func findDocSect(root, section, name string) *DocField { found := false for _, field := range docSection { if field.Name == e { - lastField = &field // Store reference to the section field - docSection = Doc[strings.Trim(field.Type, "[]")] // Move to the next section + lastField = &field // Store reference to the section field + t := strings.Trim(field.Type, "[]") + docSection = Doc[t] // Move to the next section found = true break } @@ -547,10 +540,11 @@ func FixTOML(newText string, cfg *CurioConfig) error { } l := len(lengthDetector.Addresses) - il := len(cfg.Addresses) + addrs := cfg.Addresses.GetWithoutLock() + il := len(addrs) for l > il { - cfg.Addresses = append(cfg.Addresses, CurioAddresses{ + addrs = append(addrs, CurioAddresses{ PreCommitControl: []string{}, CommitControl: []string{}, DealPublishControl: []string{}, @@ -562,5 +556,80 @@ func FixTOML(newText string, cfg *CurioConfig) error { }) il++ } + cfg.Addresses.SetWithoutLock(addrs) + return nil +} + +func LoadConfigWithUpgrades(text string, curioConfigWithDefaults *CurioConfig) (toml.MetaData, error) { + return LoadConfigWithUpgradesGeneric(text, curioConfigWithDefaults, FixTOML) +} + +func LoadConfigWithUpgradesGeneric[T any](text string, curioConfigWithDefaults T, fixupFn func(string, T) error) (toml.MetaData, error) { + + // allow migration from old config format that was limited to 1 wallet setup. + newText := strings.Join(lo.Map(strings.Split(text, "\n"), func(line string, _ int) string { + if strings.EqualFold(line, "[addresses]") { + return "[[addresses]]" + } + return line + }), "\n") + + err := fixupFn(newText, curioConfigWithDefaults) + + if err != nil { + return toml.MetaData{}, err + } + + return TransparentDecode(newText, curioConfigWithDefaults) +} + +type ConfigText struct { + Title string + Config string +} + +// GetConfigs returns the configs in the order of the layers +func GetConfigs(ctx context.Context, db *harmonydb.DB, layers []string) ([]ConfigText, error) { + layers = append([]string{"base"}, layers...) // Always stack on top of "base" layer + inputMap := map[string]int{} + for i, layer := range layers { + inputMap[layer] = i + } + var configs []ConfigText + err := db.Select(ctx, &configs, `SELECT title, config FROM harmony_config WHERE title = ANY($1)`, layers) + if err != nil { + return nil, err + } + result := make([]ConfigText, len(layers)) + for _, config := range configs { + index, ok := inputMap[config.Title] + if !ok { + if config.Title == "base" { + 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("missing layer %s", config.Title) + } + result[index] = config + } + return result, nil +} + +func ApplyLayers[T any](ctx context.Context, configResult T, layers []ConfigText, fixupFn func(string, T) error) error { + have := []string{} + for _, layer := range layers { + meta, err := LoadConfigWithUpgradesGeneric(layer.Config, configResult, fixupFn) + if err != nil { + return fmt.Errorf("could not read layer, bad toml %s: %w", layer, err) + } + for _, k := range meta.Keys() { + have = append(have, strings.Join(k, " ")) + } + logger.Debugf("Using layer %s, config %v", layer, configResult) + } + _ = 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 nil } diff --git a/deps/config/old_lotus_miner.go b/deps/config/old_lotus_miner.go index 53bb84879..d4a8d3673 100644 --- a/deps/config/old_lotus_miner.go +++ b/deps/config/old_lotus_miner.go @@ -10,31 +10,12 @@ import ( "github.com/filecoin-project/go-state-types/network" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" ) -type HarmonyDB struct { - // HOSTS is a list of hostnames to nodes running YugabyteDB - // in a cluster. Only 1 is required - Hosts []string - - // The Yugabyte server's username with full credentials to operate on Lotus' Database. Blank for default. - Username string - - // The password for the related username. Blank for default. - Password string - - // The database (logical partition) within Yugabyte. Blank for default. - Database string - - // The port to find Yugabyte. Blank for default. - Port string - - // Load Balance the connection over multiple nodes - LoadBalance bool -} - // StorageMiner is a miner config type StorageMiner struct { Common @@ -49,7 +30,7 @@ type StorageMiner struct { Addresses MinerAddressConfig DAGStore DAGStoreConfig - HarmonyDB HarmonyDB + HarmonyDB harmonydb.Config } type DAGStoreConfig struct { @@ -683,7 +664,7 @@ func DefaultStorageMiner() *StorageMiner { MaxConcurrentUnseals: 5, GCInterval: time.Minute, }, - HarmonyDB: HarmonyDB{ + HarmonyDB: harmonydb.Config{ Hosts: []string{"127.0.0.1"}, Username: "yugabyte", Password: "yugabyte", diff --git a/deps/config/types.go b/deps/config/types.go index c11593711..f2c8c1303 100644 --- a/deps/config/types.go +++ b/deps/config/types.go @@ -39,14 +39,14 @@ func DefaultCurioConfig() *CurioConfig { DisableCollateralFallback: false, MaximizeFeeCap: true, }, - Addresses: []CurioAddresses{{ + Addresses: NewDynamic([]CurioAddresses{{ PreCommitControl: []string{}, CommitControl: []string{}, DealPublishControl: []string{}, TerminateControl: []string{}, MinerAddresses: []string{}, BalanceManager: DefaultBalanceManager(), - }}, + }}), Proving: CurioProvingConfig{ ParallelCheckLimit: 32, PartitionCheckTimeout: 20 * time.Minute, @@ -58,19 +58,19 @@ func DefaultCurioConfig() *CurioConfig { BatchSealSectorSize: "32GiB", }, Ingest: CurioIngestConfig{ - MaxMarketRunningPipelines: 64, - MaxQueueDownload: 8, - MaxQueueCommP: 8, + MaxMarketRunningPipelines: NewDynamic(64), + MaxQueueDownload: NewDynamic(8), + MaxQueueCommP: NewDynamic(8), - MaxQueueDealSector: 8, // default to 8 sectors open(or in process of opening) for deals - MaxQueueSDR: 8, // default to 8 (will cause backpressure even if deal sectors are 0) - MaxQueueTrees: 0, // default don't use this limit - MaxQueuePoRep: 0, // default don't use this limit + MaxQueueDealSector: NewDynamic(8), // default to 8 sectors open(or in process of opening) for deals + MaxQueueSDR: NewDynamic(8), // default to 8 (will cause backpressure even if deal sectors are 0) + MaxQueueTrees: NewDynamic(0), // default don't use this limit + MaxQueuePoRep: NewDynamic(0), // default don't use this limit - MaxQueueSnapEncode: 16, - MaxQueueSnapProve: 0, + MaxQueueSnapEncode: NewDynamic(16), + MaxQueueSnapProve: NewDynamic(0), - MaxDealWaitTime: time.Hour, + MaxDealWaitTime: NewDynamic(time.Hour), }, Alerting: CurioAlertingConfig{ MinimumWalletBalance: types.MustParseFIL("5"), @@ -113,6 +113,13 @@ func DefaultCurioConfig() *CurioConfig { ExpectedSnapSealDuration: 2 * time.Hour, CIDGravityTokens: []string{}, }, + MK20: MK20Config{ + ExpectedPoRepSealDuration: 8 * time.Hour, + ExpectedSnapSealDuration: 2 * time.Hour, + MaxParallelChunkUploads: 512, + MinimumChunkSize: 16 * 1024 * 1024, // 16 MiB + MaximumChunkSize: 256 * 1024 * 1024, // 256 MiB + }, IPNI: IPNIConfig{ ServiceURL: []string{"https://cid.contact"}, DirectAnnounceURLs: []string{"https://cid.contact/ingest/announce"}, @@ -123,9 +130,9 @@ func DefaultCurioConfig() *CurioConfig { DomainName: "", ListenAddress: "0.0.0.0:12310", ReadTimeout: time.Second * 10, - IdleTimeout: time.Minute * 2, + IdleTimeout: time.Hour, ReadHeaderTimeout: time.Second * 5, - EnableCORS: true, + CORSOrigins: []string{}, CSP: "inline", CompressionLevels: CompressionConfig{ GzipLevel: 6, @@ -156,7 +163,7 @@ type CurioConfig struct { Fees CurioFees // Addresses specifies the list of miner addresses and their related wallet addresses. - Addresses []CurioAddresses + Addresses *Dynamic[[]CurioAddresses] // Proving defines the configuration settings related to proving functionality within the Curio node. Proving CurioProvingConfig @@ -408,9 +415,6 @@ type CurioSubsystemsConfig struct { // also be bounded by resources available on the machine. (Default: 8) IndexingMaxTasks int - // EnableBalanceManager enables the task to automatically manage the market balance of the miner's market actor (Default: false) - EnableBalanceManager bool - // BindSDRTreeToNode forces the TreeD and TreeRC tasks to be executed on the same node where SDR task was executed // for the sector. Please ensure that TreeD and TreeRC task are enabled and relevant resources are available before // enabling this option. (Default: false) @@ -534,26 +538,27 @@ type CurioIngestConfig struct { // A "running" pipeline is one that has at least one task currently assigned to a machine (owner_id is not null). // If this limit is exceeded, the system will apply backpressure to delay processing of new deals. // 0 means unlimited. (Default: 64) - MaxMarketRunningPipelines int + MaxMarketRunningPipelines *Dynamic[int] // MaxQueueDownload is the maximum number of pipelines that can be queued at the downloading stage, // waiting for a machine to pick up their task (owner_id is null). // If this limit is exceeded, the system will apply backpressure to slow the ingestion of new deals. // 0 means unlimited. (Default: 8) - MaxQueueDownload int + MaxQueueDownload *Dynamic[int] // MaxQueueCommP is the maximum number of pipelines that can be queued at the CommP (verify) stage, // waiting for a machine to pick up their verification task (owner_id is null). // If this limit is exceeded, the system will apply backpressure, delaying new deal processing. // 0 means unlimited. (Default: 8) - MaxQueueCommP int + MaxQueueCommP *Dynamic[int] // Maximum number of sectors that can be queued waiting for deals to start processing. // 0 = unlimited // Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. // The DealSector queue includes deals that are ready to enter the sealing pipeline but are not yet part of it. // DealSector queue is the first queue in the sealing pipeline, making it the primary backpressure mechanism. (Default: 8) - MaxQueueDealSector int + // Updates will affect running instances. + MaxQueueDealSector *Dynamic[int] // Maximum number of sectors that can be queued waiting for SDR to start processing. // 0 = unlimited @@ -562,7 +567,8 @@ type CurioIngestConfig struct { // possible that this queue grows more than this limit(CC sectors), the backpressure is only applied to sectors // entering the pipeline. // Only applies to PoRep pipeline (DoSnap = false) (Default: 8) - MaxQueueSDR int + // Updates will affect running instances. + MaxQueueSDR *Dynamic[int] // Maximum number of sectors that can be queued waiting for SDRTrees to start processing. // 0 = unlimited @@ -570,7 +576,8 @@ type CurioIngestConfig struct { // In case of the trees tasks it is possible that this queue grows more than this limit, the backpressure is only // applied to sectors entering the pipeline. // Only applies to PoRep pipeline (DoSnap = false) (Default: 0) - MaxQueueTrees int + // Updates will affect running instances. + MaxQueueTrees *Dynamic[int] // Maximum number of sectors that can be queued waiting for PoRep to start processing. // 0 = unlimited @@ -578,23 +585,27 @@ type CurioIngestConfig struct { // Like with the trees tasks, it is possible that this queue grows more than this limit, the backpressure is only // applied to sectors entering the pipeline. // Only applies to PoRep pipeline (DoSnap = false) (Default: 0) - MaxQueuePoRep int + // Updates will affect running instances. + MaxQueuePoRep *Dynamic[int] // MaxQueueSnapEncode is the maximum number of sectors that can be queued waiting for UpdateEncode tasks to start. // 0 means unlimited. // This applies backpressure to the market subsystem by delaying the ingestion of deal data. // Only applies to the Snap Deals pipeline (DoSnap = true). (Default: 16) - MaxQueueSnapEncode int + // Updates will affect running instances. + MaxQueueSnapEncode *Dynamic[int] // MaxQueueSnapProve is the maximum number of sectors that can be queued waiting for UpdateProve to start processing. // 0 means unlimited. // This applies backpressure in the Snap Deals pipeline (DoSnap = true) by delaying new deal ingestion. (Default: 0) - MaxQueueSnapProve int + // Updates will affect running instances. + MaxQueueSnapProve *Dynamic[int] // Maximum time an open deal sector should wait for more deals before it starts sealing. // This ensures that sectors don't remain open indefinitely, consuming resources. // Time duration string (e.g., "1h2m3s") in TOML format. (Default: "1h0m0s") - MaxDealWaitTime time.Duration + // Updates will affect running instances. + MaxDealWaitTime *Dynamic[time.Duration] // DoSnap, when set to true, enables snap deal processing for deals ingested by this instance. // Unlike lotus-miner, there is no fallback to PoRep when no snap sectors are available. @@ -748,6 +759,9 @@ type StorageMarketConfig struct { // MK12 encompasses all configuration related to deal protocol mk1.2.0 and mk1.2.1 (i.e. Boost deals) MK12 MK12Config + // MK20 encompasses all configuration related to deal protocol mk2.0 i.e. market 2.0 + MK20 MK20Config + // IPNI configuration for ipni-provider IPNI IPNIConfig @@ -838,7 +852,6 @@ type IPNIConfig struct { Disable bool // The network indexer web UI URL for viewing published announcements - // TODO: should we use this for checking published heads before publishing? Later commit ServiceURL []string // The list of URLs of indexing nodes to announce to. This is a list of hosts we talk to tell them about new @@ -874,8 +887,11 @@ type HTTPConfig struct { // Time duration string (e.g., "1h2m3s") in TOML format. (Default: "5m0s") ReadHeaderTimeout time.Duration - // EnableCORS indicates whether Cross-Origin Resource Sharing (CORS) is enabled or not. - EnableCORS bool + // CORSOrigins specifies the allowed origins for CORS requests to the Curio admin UI. If empty, CORS is disabled. + // If not empty, only the specified origins will be allowed for CORS requests. + // This is required for third-party UI servers. + // "*" allows everyone, it's best to specify the UI servers' hostname. + CORSOrigins []string // CSP sets the Content Security Policy for content served via the /piece/ retrieval endpoint. // Valid values: "off", "self", "inline" (Default: "inline") @@ -928,3 +944,41 @@ type MK12CollateralConfig struct { // Accepts a decimal string (e.g., "123.45" or "123 fil") with optional "fil" or "attofil" suffix. (Default: "20 FIL") CollateralHighThreshold types.FIL } + +type MK20Config struct { + // ExpectedPoRepSealDuration is the expected time it would take to seal the deal sector + // This will be used to fail the deals which cannot be sealed on time. + // Time duration string (e.g., "1h2m3s") in TOML format. (Default: "8h0m0s") + ExpectedPoRepSealDuration time.Duration + + // ExpectedSnapSealDuration is the expected time it would take to snap the deal sector + // This will be used to fail the deals which cannot be sealed on time. + // Time duration string (e.g., "1h2m3s") in TOML format. (Default: "2h0m0s") + ExpectedSnapSealDuration time.Duration + + // SkipCommP can be used to skip doing a commP check before PublishDealMessage is sent on chain + // Warning: If this check is skipped and there is a commP mismatch, all deals in the + // sector will need to be sent again (Default: false) + SkipCommP bool + + // DisabledMiners is a list of miner addresses that should be excluded from online deal making protocols + DisabledMiners []string + + // MaxConcurrentDealSizeGiB is a sum of all size of all deals which are waiting to be added to a sector + // When the cumulative size of all deals in process reaches this number, new deals will be rejected. + // (Default: 0 = unlimited) + MaxConcurrentDealSizeGiB int64 + + // DenyUnknownClients determines the default behaviour for the deal of clients which are not in allow/deny list + // If True then all deals coming from unknown clients will be rejected. (Default: false) + DenyUnknownClients bool + + // MaxParallelChunkUploads defines the maximum number of upload operations that can run in parallel. (Default: 512) + MaxParallelChunkUploads int + + // MinimumChunkSize defines the smallest size of a chunk allowed for processing, expressed in bytes. Must be a power of 2. (Default: 16 MiB) + MinimumChunkSize int64 + + // MaximumChunkSize defines the maximum size of a chunk allowed for processing, expressed in bytes. Must be a power of 2. (Default: 256 MiB) + MaximumChunkSize int64 +} diff --git a/deps/deps.go b/deps/deps.go index f23917927..07a58ec4a 100644 --- a/deps/deps.go +++ b/deps/deps.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "crypto/rand" - "database/sql" "encoding/base64" "errors" "fmt" @@ -21,8 +20,10 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/gbrlsnchs/jwt/v3" logging "github.com/ipfs/go-log/v2" + "github.com/kr/pretty" "github.com/samber/lo" "github.com/urfave/cli/v2" + "github.com/yugabyte/pgx/v5" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -62,7 +63,7 @@ var log = logging.Logger("curio/deps") func MakeDB(cctx *cli.Context) (*harmonydb.DB, error) { // #1 CLI opts fromCLI := func() (*harmonydb.DB, error) { - dbConfig := config.HarmonyDB{ + dbConfig := harmonydb.Config{ Username: cctx.String("db-user"), Password: cctx.String("db-password"), Hosts: strings.Split(cctx.String("db-host"), ","), @@ -158,7 +159,7 @@ type Deps struct { Bstore curiochain.CurioBlockstore Verif storiface.Verifier As *multictladdr.MultiAddressSelector - Maddrs map[dtypes.MinerAddress]bool + Maddrs *config.Dynamic[map[dtypes.MinerAddress]bool] ProofTypes map[abi.RegisteredSealProof]bool Stor *paths.Remote Al *curioalerting.AlertingSystem @@ -261,7 +262,7 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context, } if deps.EthClient == nil { - deps.EthClient = lazy.MakeLazy[*ethclient.Client](func() (*ethclient.Client, error) { + deps.EthClient = lazy.MakeLazy(func() (*ethclient.Client, error) { cfgApiInfo := deps.Cfg.Apis.ChainApiInfo if v := os.Getenv("FULLNODE_API_INFO"); v != "" { cfgApiInfo = []string{v} @@ -311,35 +312,50 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context, sa, err := StorageAuth(deps.Cfg.Apis.StorageRPCSecret) if err != nil { + log.Errorf("error creating storage auth: %s, %v", err, pretty.Sprint(deps.Cfg)) return xerrors.Errorf(`'%w' while parsing the config toml's [Apis] StorageRPCSecret=%v Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`, err, deps.Cfg.Apis.StorageRPCSecret) } if deps.Stor == nil { - deps.Stor = paths.NewRemote(deps.LocalStore, deps.Si, http.Header(sa), 1000, &paths.DefaultPartialFileHandler{}) + deps.Stor, err = paths.NewRemote(deps.LocalStore, deps.Si, http.Header(sa), 1000, &paths.DefaultPartialFileHandler{}) + if err != nil { + return xerrors.Errorf("creating remote store: %w", err) + } } if deps.Maddrs == nil { - deps.Maddrs = map[dtypes.MinerAddress]bool{} + deps.Maddrs = config.NewDynamic(map[dtypes.MinerAddress]bool{}) } - if len(deps.Maddrs) == 0 { - for _, s := range deps.Cfg.Addresses { + setMaddrs := func() error { + tmp := map[dtypes.MinerAddress]bool{} + for _, s := range deps.Cfg.Addresses.Get() { for _, s := range s.MinerAddresses { addr, err := address.NewFromString(s) if err != nil { return err } - deps.Maddrs[dtypes.MinerAddress(addr)] = true + tmp[dtypes.MinerAddress(addr)] = true } } + deps.Maddrs.Set(tmp) + return nil + } + if err := setMaddrs(); err != nil { + return err } + deps.Cfg.Addresses.OnChange(func() { + if err := setMaddrs(); err != nil { + log.Errorf("error setting maddrs: %s", err) + } + }) if deps.ProofTypes == nil { deps.ProofTypes = map[abi.RegisteredSealProof]bool{} } if len(deps.ProofTypes) == 0 { - for maddr := range deps.Maddrs { + for maddr := range deps.Maddrs.Get() { spt, err := sealProofType(maddr, deps.Chain) if err != nil { return err @@ -355,7 +371,7 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`, if deps.Cfg.Subsystems.EnableWalletExporter { spIDs := []address.Address{} - for maddr := range deps.Maddrs { + for maddr := range deps.Maddrs.Get() { spIDs = append(spIDs, address.Address(maddr)) } @@ -378,6 +394,10 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`, } deps.IndexStore, err = indexstore.NewIndexStore(strings.Split(dbHost, ","), cctx.Int("db-cassandra-port"), deps.Cfg) + if err != nil { + return xerrors.Errorf("failed to create index store: %w", err) + } + err = deps.IndexStore.Start(cctx.Context, false) if err != nil { return xerrors.Errorf("failed to start index store: %w", err) } @@ -389,7 +409,7 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`, if deps.CachedPieceReader == nil { ppr := pieceprovider.NewPieceParkReader(deps.Stor, deps.Si) - deps.CachedPieceReader = cachedreader.NewCachedPieceReader(deps.DB, deps.SectorReader, ppr) + deps.CachedPieceReader = cachedreader.NewCachedPieceReader(deps.DB, deps.SectorReader, ppr, deps.IndexStore) } if deps.ServeChunker == nil { @@ -418,20 +438,7 @@ func sealProofType(maddr dtypes.MinerAddress, fnapi api.Chain) (abi.RegisteredSe } func LoadConfigWithUpgrades(text string, curioConfigWithDefaults *config.CurioConfig) (toml.MetaData, error) { - // allow migration from old config format that was limited to 1 wallet setup. - newText := strings.Join(lo.Map(strings.Split(text, "\n"), func(line string, _ int) string { - if strings.EqualFold(line, "[addresses]") { - return "[[addresses]]" - } - return line - }), "\n") - - err := config.FixTOML(newText, curioConfigWithDefaults) - if err != nil { - return toml.MetaData{}, err - } - - return toml.Decode(newText, &curioConfigWithDefaults) + return config.LoadConfigWithUpgrades(text, curioConfigWithDefaults) } func GetConfig(ctx context.Context, layers []string, db *harmonydb.DB) (*config.CurioConfig, error) { @@ -441,45 +448,32 @@ func GetConfig(ctx context.Context, layers []string, db *harmonydb.DB) (*config. } curioConfig := config.DefaultCurioConfig() - have := []string{} - layers = append([]string{"base"}, layers...) // Always stack on top of "base" layer - for _, layer := range layers { - text := "" - err := db.QueryRow(ctx, `SELECT config FROM harmony_config WHERE title=$1`, layer).Scan(&text) - if err != nil { - if strings.Contains(err.Error(), sql.ErrNoRows.Error()) { - return nil, fmt.Errorf("missing layer '%s' ", layer) - } - if layer == "base" { - 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, curioConfig) - if err != nil { - 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.Debugw("Using layer", "layer", layer, "config", curioConfig) + err = ApplyLayers(ctx, db, curioConfig, layers) + if err != nil { + return nil, err + } + err = config.EnableChangeDetection(db, curioConfig, layers, config.FixTOML) + if err != nil { + return nil, err } - _ = 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 curioConfig, nil } +func ApplyLayers(ctx context.Context, db *harmonydb.DB, curioConfig *config.CurioConfig, layers []string) error { + configs, err := config.GetConfigs(ctx, db, layers) + if err != nil { + return err + } + return config.ApplyLayers(ctx, curioConfig, configs, config.FixTOML) +} + func updateBaseLayer(ctx context.Context, db *harmonydb.DB) error { _, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { // Get existing base from DB text := "" err = tx.QueryRow(`SELECT config FROM harmony_config WHERE title=$1`, "base").Scan(&text) if err != nil { - if strings.Contains(err.Error(), sql.ErrNoRows.Error()) { + if strings.Contains(err.Error(), pgx.ErrNoRows.Error()) { return false, fmt.Errorf("missing layer 'base' ") } return false, fmt.Errorf("could not read layer 'base': %w", err) @@ -607,27 +601,37 @@ func GetDefaultConfig(comment bool) (string, error) { return string(cb), nil } -func GetAPI(ctx context.Context, cctx *cli.Context) (*harmonydb.DB, *config.CurioConfig, api.Chain, jsonrpc.ClientCloser, error) { +func GetAPI(ctx context.Context, cctx *cli.Context) (*harmonydb.DB, *config.CurioConfig, api.Chain, jsonrpc.ClientCloser, *lazy.Lazy[*ethclient.Client], error) { db, err := MakeDB(cctx) if err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, err } layers := cctx.StringSlice("layers") cfg, err := GetConfig(cctx.Context, layers, db) if err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, err } - full, fullCloser, err := GetFullNodeAPIV1Curio(cctx, cfg.Apis.ChainApiInfo) + cfgApiInfo := cfg.Apis.ChainApiInfo + if v := os.Getenv("FULLNODE_API_INFO"); v != "" { + cfgApiInfo = []string{v} + } + + full, fullCloser, err := GetFullNodeAPIV1Curio(cctx, cfgApiInfo) if err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, err } - return db, cfg, full, fullCloser, nil + + ethClient := lazy.MakeLazy(func() (*ethclient.Client, error) { + return GetEthClient(cctx, cfgApiInfo) + }) + + return db, cfg, full, fullCloser, ethClient, nil } func GetDepsCLI(ctx context.Context, cctx *cli.Context) (*Deps, error) { - db, cfg, full, fullCloser, err := GetAPI(ctx, cctx) + db, cfg, full, fullCloser, ethClient, err := GetAPI(ctx, cctx) if err != nil { return nil, err } @@ -638,7 +642,7 @@ func GetDepsCLI(ctx context.Context, cctx *cli.Context) (*Deps, error) { maddrs := map[dtypes.MinerAddress]bool{} if len(maddrs) == 0 { - for _, s := range cfg.Addresses { + for _, s := range cfg.Addresses.Get() { for _, s := range s.MinerAddresses { addr, err := address.NewFromString(s) if err != nil { @@ -650,10 +654,11 @@ func GetDepsCLI(ctx context.Context, cctx *cli.Context) (*Deps, error) { } return &Deps{ - Cfg: cfg, - DB: db, - Chain: full, - Maddrs: maddrs, + Cfg: cfg, + DB: db, + Chain: full, + Maddrs: config.NewDynamic(maddrs), // ignoring dynamic for a single CLI run + EthClient: ethClient, }, nil } @@ -683,7 +688,7 @@ func CreateMinerConfig(ctx context.Context, full CreateMinerConfigChainAPI, db * return xerrors.Errorf("Failed to get miner info: %w", err) } - curioConfig.Addresses = append(curioConfig.Addresses, config.CurioAddresses{ + curioConfig.Addresses.Set(append(curioConfig.Addresses.Get(), config.CurioAddresses{ PreCommitControl: []string{}, CommitControl: []string{}, DealPublishControl: []string{}, @@ -692,7 +697,7 @@ func CreateMinerConfig(ctx context.Context, full CreateMinerConfigChainAPI, db * DisableWorkerFallback: false, MinerAddresses: []string{addr}, BalanceManager: config.DefaultBalanceManager(), - }) + })) } { @@ -708,9 +713,9 @@ func CreateMinerConfig(ctx context.Context, full CreateMinerConfigChainAPI, db * curioConfig.Apis.ChainApiInfo = append(curioConfig.Apis.ChainApiInfo, info) } - curioConfig.Addresses = lo.Filter(curioConfig.Addresses, func(a config.CurioAddresses, _ int) bool { + curioConfig.Addresses.Set(lo.Filter(curioConfig.Addresses.Get(), func(a config.CurioAddresses, _ int) bool { return len(a.MinerAddresses) > 0 - }) + })) // If no base layer is present if !lo.Contains(titles, "base") { @@ -739,10 +744,10 @@ func CreateMinerConfig(ctx context.Context, full CreateMinerConfigChainAPI, db * return xerrors.Errorf("Cannot parse base config: %w", err) } - baseCfg.Addresses = append(baseCfg.Addresses, curioConfig.Addresses...) - baseCfg.Addresses = lo.Filter(baseCfg.Addresses, func(a config.CurioAddresses, _ int) bool { + baseCfg.Addresses.Set(append(baseCfg.Addresses.Get(), curioConfig.Addresses.Get()...)) + baseCfg.Addresses.Set(lo.Filter(baseCfg.Addresses.Get(), 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 { diff --git a/docker/piece-server/sample/mk20-aggregate-car.sh b/docker/piece-server/sample/mk20-aggregate-car.sh new file mode 100755 index 000000000..ae2935415 --- /dev/null +++ b/docker/piece-server/sample/mk20-aggregate-car.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +set -e + +# ANSI escape codes for styling +ci="\e[3m" +cn="\e[0m" + +# Parameters for file generation +chunks=512 +links=8 +output_dir="/var/lib/curio-client/data/" +size=99700 +num_files=63 +piece_size=$((8 * 1024 * 1024)) # 8 MiB + +# Array to store generated CAR files +declare -a car_files + +# Step 1: Generate all files +echo "Generating $num_files random CAR files (size: $size bytes):" +for i in $(seq 1 "$num_files"); do + echo "Generating file $i..." + output=$(sptool --actor t01000 toolbox mk12-client generate-rand-car -c=$chunks -l=$links -s=$size "$output_dir" 2>&1) + car_file=$(echo "$output" | awk '{print $NF}') + new_car_file="${car_file%.car}" + mv "$car_file" "$new_car_file" + car_file="$new_car_file" + + if [[ -n "$car_file" ]]; then + car_files+=("$car_file") + echo "File $i generated: $car_file" + else + echo "Error: Failed to generate file $i" >&2 + exit 1 + fi +done + +if [[ ${#car_files[@]} -eq 0 ]]; then + echo "Error: No files were generated. Exiting." >&2 + exit 1 +fi + + +# Declare the base command and arguments +base_command="sptool --actor t01000 toolbox mk20-client aggregate --piece-size=$piece_size" + +# Append --file arguments for each file in the car_files array +for car_file in "${car_files[@]}"; do + base_command+=" --files=$car_file" +done + +# Debugging: Print the full constructed command +printf "${ci}%s\n\n${cn}" "$base_command" + +# Execute the constructed command +aggregate_output=$($base_command 2>&1) + +echo "$aggregate_output" + +# Step 3: Extract `CommP CID` and `Piece size` from the aggregate output +commp_cid=$(echo "$aggregate_output" | awk -F': ' '/CommP CID/ {print $2}' | xargs) + +# Validate that we got proper output +if [[ -z "$commp_cid" ]]; then + echo "Error: Failed to extract CommP CID from aggregation output" >&2 + exit 1 +fi + +# Step 4: Check and display the aggregate file +aggregate_file="aggregate_${commp_cid}" +if [[ -f "$aggregate_file" ]]; then + echo "Aggregate file stored at: $aggregate_file" + echo "Content of $aggregate_file:" + cat "$aggregate_file" +else + echo "Error: Aggregate file $aggregate_file not found!" >&2 +fi + +# Step 5: Print Results +echo -e "\n${ci}Aggregation Results:${cn}" +echo "CommP CID: $commp_cid" + + +miner_actor=$(lotus state list-miners | grep -v t01000) + +################################################################################### +printf "${ci}sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor \ +--pcidv2=$commp_cid --contract-address 0xtest --contract-verify-method test \ +--aggregate "$aggregate_file"\n\n${cn}" + +sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor --pcidv2=$commp_cid --contract-address 0xtest --contract-verify-method test --aggregate "$aggregate_file" + +echo -e "\nDone!" \ No newline at end of file diff --git a/docker/piece-server/sample/mk20-ddo.sh b/docker/piece-server/sample/mk20-ddo.sh new file mode 100755 index 000000000..406aaf78c --- /dev/null +++ b/docker/piece-server/sample/mk20-ddo.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -e + +ci="\e[3m" +cn="\e[0m" + +chunks="${1:-51200}" +links="${2:-100}" + +printf "${ci}sptool --actor t01000 toolbox mk12-client generate-rand-car -c=$chunks -l=$links -s=5120000 /var/lib/curio-client/data/ | awk '{print $NF}'\n\n${cn}" + +FILE=`sptool --actor t01000 toolbox mk12-client generate-rand-car -c=$chunks -l=$links -s=5120000 /var/lib/curio-client/data/ | awk '{print $NF}'` +PAYLOAD_CID=$(find "$FILE" | xargs -I{} basename {} | sed 's/\.car//') + +read COMMP_CID PIECE CAR < <(sptool --actor t01000 toolbox mk12-client commp $FILE 2>/dev/null | awk -F': ' '/CID/ {cid=$2} /Piece/ {piece=$2} /Car/ {car=$2} END {print cid, piece, car}') +miner_actor=$(lotus state list-miners | grep -v t01000) + +mv /var/lib/curio-client/data/$PAYLOAD_CID.car /var/lib/curio-client/data/$COMMP_CID + +sptool --actor t01000 toolbox mk12-client allocate -y -p $miner_actor --piece-cid $COMMP_CID --piece-size $PIECE --confidence 0 + +CLIENT=$(sptool --actor t01000 toolbox mk12-client wallet default) + +ALLOC=$(sptool --actor t01000 toolbox mk12-client list-allocations -j | jq -r --arg cid "$COMMP_CID" '.allocations | to_entries[] | select(.value.Data["/"] == $cid) | .key') + +printf "${ci}sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor \ +--http-url=http://piece-server:12320/pieces?id=$PAYLOAD_CID \ +--commp=$COMMP_CID --car-size=$CAR --piece-size=$PIECE \ +--contract-address 0xtest --contract-verify-method test --allocation=$ALLOC\n\n${cn}" + +sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor --http-url=http://piece-server:12320/pieces?id=$PAYLOAD_CID --commp=$COMMP_CID --car-size=$CAR --piece-size=$PIECE --contract-address 0xtest --contract-verify-method test --allocation $ALLOC \ No newline at end of file diff --git a/docker/piece-server/sample/mk20-random-deal.sh b/docker/piece-server/sample/mk20-random-deal.sh new file mode 100755 index 000000000..51a43f4ce --- /dev/null +++ b/docker/piece-server/sample/mk20-random-deal.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +set -e + +ci="\e[3m" +cn="\e[0m" + + +put="${1:-false}" +offline="${2:-false}" +chunks="${3:-51200}" +links="${4:-100}" + +printf "${ci}sptool --actor t01000 toolbox mk12-client generate-rand-car -c=$chunks -l=$links -s=5120000 /var/lib/curio-client/data/ | awk '{print $NF}'\n\n${cn}" +FILE=`sptool --actor t01000 toolbox mk12-client generate-rand-car -c=$chunks -l=$links -s=5120000 /var/lib/curio-client/data/ | awk '{print $NF}'` +read COMMP_CID PIECE CAR < <(sptool --actor t01000 toolbox mk20-client commp $FILE 2>/dev/null | awk -F': ' '/CID/ {cid=$2} /Piece/ {piece=$2} /Car/ {car=$2} END {print cid, piece, car}') + +mv $FILE /var/lib/curio-client/data/$COMMP_CID + +miner_actor=$(lotus state list-miners | grep -v t01000) + +if [ "$put" == "true" ]; then + ################################################################################### + printf "${ci}sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor \ + --pcidv2=$COMMP_CID \ + --contract-address 0xtest --contract-verify-method test --put\n\n${cn}" + + sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor --pcidv2=$COMMP_CID --contract-address 0xtest --contract-verify-method test --put + +else + + if [ "$offline" == "true" ]; then + + ################################################################################### + printf "${ci}sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor \ + --pcidv2=$COMMP_CID \ + --contract-address 0xtest --contract-verify-method test\n\n${cn}" + + sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor --pcidv2=$COMMP_CID --contract-address 0xtest --contract-verify-method test + + else + ################################################################################### + printf "${ci}sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor \ + --http-url=http://piece-server:12320/pieces?id=$COMMP_CID \ + --pcidv2=$COMMP_CID \ + --contract-address 0xtest --contract-verify-method test\n\n${cn}" + + sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor --http-url=http://piece-server:12320/pieces?id=$COMMP_CID --pcidv2=$COMMP_CID --contract-address 0xtest --contract-verify-method test + + fi + +fi + + diff --git a/docker/piece-server/sample/pdp.sh b/docker/piece-server/sample/pdp.sh new file mode 100755 index 000000000..aee058635 --- /dev/null +++ b/docker/piece-server/sample/pdp.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -e + +ci="\e[3m" +cn="\e[0m" + + +put="${1:-false}" +offline="${2:-false}" +chunks="${3:-51200}" +links="${4:-100}" + +printf "${ci}sptool --actor t01000 toolbox mk12-client generate-rand-car -c=$chunks -l=$links -s=5120000 /var/lib/curio-client/data/ | awk '{print $NF}'\n\n${cn}" +FILE=`sptool --actor t01000 toolbox mk12-client generate-rand-car -c=$chunks -l=$links -s=5120000 /var/lib/curio-client/data/ | awk '{print $NF}'` +read COMMP_CID PIECE CAR < <(sptool --actor t01000 toolbox mk20-client commp $FILE 2>/dev/null | awk -F': ' '/CID/ {cid=$2} /Piece/ {piece=$2} /Car/ {car=$2} END {print cid, piece, car}') + +mv $FILE /var/lib/curio-client/data/$COMMP_CID + +miner_actor=$(lotus state list-miners | grep -v t01000) +printf "$COMMP_CID\n" +printf "$PIECE\n" +printf "$CAR\n" + +#if [ "$put" == "true" ]; then +# ################################################################################### +# printf "${ci}sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor \ +# --pcidv2=$COMMP_CID \ +# --contract-address 0xtest --contract-verify-method test --put\n\n${cn}" +# +# sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor --pcidv2=$COMMP_CID --contract-address 0xtest --contract-verify-method test --put +# +#else +# +# if [ "$offline" == "true" ]; then +# +# ################################################################################### +# printf "${ci}sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor \ +# --pcidv2=$COMMP_CID \ +# --contract-address 0xtest --contract-verify-method test\n\n${cn}" +# +# sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor --pcidv2=$COMMP_CID --contract-address 0xtest --contract-verify-method test +# +# else +# ################################################################################### +# printf "${ci}sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor \ +# --http-url=http://piece-server:12320/pieces?id=$COMMP_CID \ +# --pcidv2=$COMMP_CID \ +# --contract-address 0xtest --contract-verify-method test\n\n${cn}" +# +# sptool --actor t01000 toolbox mk20-client deal --provider=$miner_actor --http-url=http://piece-server:12320/pieces?id=$COMMP_CID --pcidv2=$COMMP_CID --contract-address 0xtest --contract-verify-method test +# +# fi +# +#fi diff --git a/documentation/en/.gitbook/assets/2024-06-04-040735_1470x522_scrot.png b/documentation/en/.gitbook/assets/2024-06-04-040735_1470x522_scrot.png deleted file mode 100644 index 9d3145890a930eb5c7cc392f27ebb27c093d32ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56449 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

    qs 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

    UNM$p1h( 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%0DE|BAilp+7Vm)moC%*|)a2U!Y;Q%@`7$ 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�a&$YvG2%fHpiN8~vIr;1EcNPxk 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 z�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�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

    LMJcAlvb8(qYD?UhdoA`%0V+@ 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�<=E1~N<+=t)u^TdaPahq$?31-6$q^ZiWj{%1O# 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 z

    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%0AUs0fv$I9Y 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 diff --git a/documentation/en/.gitbook/assets/2024-06-05-150938_1062x1664_scrot.png b/documentation/en/.gitbook/assets/2024-06-05-150938_1062x1664_scrot.png deleted file mode 100644 index ec71ba303088e6f16ee8ed743035323751ce0c4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406950 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 z 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 z

    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 z%0A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%0Df9gK#IscaW)qNTJb8qYGZBmplzj{Oy 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Ν_-EQMx}X#xDFyz$p$--3E(gU8QoU!TL1K| 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

      aC)9=KNM*(%A6+i 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 diff --git a/documentation/en/.gitbook/assets/2024-06-05-151025_997x1175_scrot.png b/documentation/en/.gitbook/assets/2024-06-05-151025_997x1175_scrot.png deleted file mode 100644 index d47eb2b33081a4490f39061aa36245f16ee51743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206362 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
        o1`>Z+U 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¸GE(Zexq&QB#he8@u#=y znI!&UAR>=~3KkUAS@;sU>$q-CRStCF1{&1~qc&jsK;tiEOC@yQG#$7zmoS)gb zP8u-3Y}qbLr|SK;H2y*H%BJHn-urFg{8ePc|3u(N?PjU|SUijVRz-OA@QWfyKfhw2 zvqC*!tvkdB8iX}BwR6GF$~Vx#E#?-8aj>kc$=MVJS~Ut!-2CO)hZ~s1C_oRNDfhUmf>bJ2eUh8UJlj8>ZKvf-m^i-&bffx+Y|? z7Q&pO$%E*xaa3)HDoSu7n;71eKoL2f>&M2Ge=Yg_BttwgK9(}`ZNbR0<@H}$0Oz^P z^J1$c1w8p7h(bWqBIwfdFz#SFSHBYn`wmM)y0)z%-&w#V)twV&rjm$OxewBZl2y0# z)ZUc@lWaeJIIzT``RJ&5T>0alJ}`FnkTpHqfcvX}(ZkT$SyktM_i{UNPtc!{ot;UQ z{q$>%I&Hv&b0;+3Wbmi=D!<9ju5^rjukU3-Ps&XJ{}GUG^xnFYECwK&+{+9+4mpQM z@WywteXt%>ihqAwbCl^05{Uaea-&&I@UYr~015pOWoT%&2~)RJJ28pgU~4#bYyq(w zW4=+Hw6(Nz%{k#cA<^M*a>fUW$FzL8LTTeHr=DFQI~B9R16@lghP)=Z=ga{1_KQ?1 z2vT;PT{cxmA?sLX4yv%)6cr2xc%%_&DZQ@@tJA0el@3GzFG@?gxpsPp{xH9A63?df z#arkz`L;`yhLqR?gK{Cs?hAAGZ6oR_;@YnHeKT)7xH{yb7y8PUmq7*+q!$wtFfO`c z0GeG|8II3mg2J1B_5b|CfK)3y}`>{=3m>OdZUV59R^v~iBK-}F}^0d>!?T72prg~3kv4f1- z7msvkX!();cHA!WAHX!>5R~wL2z$$@IQ}o&yMbWA-6d#n3r>Il!6mpm1b2552*C*u z+=9D1jk~+Md*iN8A4_slwUcd9uGEt zJ||ZCvtYn(L+AapkbnAmqpmY;ZJMm%Ec~l2<8< z;L^z!4GYcgzQoIhJr4{>7(!Am@Vd8AS}qxL+n>LdwDJ7;Ex;i-N>Jx=p1SN}@q?J1 zKJ{0>;_f@T3wLWQ=|A5Pq4~DEnxXc|+AnX!NMg`}4Do-SI}YW!HL72tgfUH^I!|wbf zTN=tR(;AkHfB=X(+<>@s+GfE-7yy7e|7TN~xKsW+<<`Iz6)?H-?_C?u*C)+JVq#`# z4?_pLb~rP$pNHBf_Wh}KL%2lTT%#;e6WGrGtp^QdP$5yUn1Omy=|ucxtbv!EQfji$ z2?m6oBzEZd_|C(u3v&o95Q7^H6dstU1qSEYX3ix@V#zpG{U(ish7GDz&}+5+{^&Sa z?pnWMpYbV6=~mj=X3Ootl9q@*Gt8^{XwA;kSXR=ovJ~<-6rgpmOi+3ZQyA0QAvf!h zcOvC8X7!Lh=N}hv>J;VTA|4?gJU{_}|J^Px!C-|DbGiUwM zmz0@s+V3Lq?{?IddT}#*F=zBjtq>oTrRfT1f*&Z1O>N}ab=7OIsh{S&eVxxMKK*N; zfZGKh!}>X)=>aN{RqxAn+Ua7i8atGi!tn-x)*5EkWeMWwbmNu-cxR(mf-V|Wt{H(PRt9mW{)hvAZ>&56R4YJdW0 zyi969&AL)H%L4@}uyB8IM|?IWg9TasH-LfdcbytdY5 zxA!2Mr?FX>b6W9ZD^I8-F#%2~)n$E!xFw+_c#8>@T%P%Bum0lfY4XT|{%<_u>jQW- zP86&DqDd3~%*Q-0Ru)dh_$-v@7#doo(J zm%7A)pP@Q&V~i1=CX``^gv4OmJ>ZW|;Z^?aUnSToVCv;t?Z`0;Q~K7Vu-k!Mo@j)@LQ z=r`YWB;)!)*%R&waKPoca} z_lYjW5>YA&NmF?rkK6GyZ}FfHmm1%)x8fiwTeKHf9G$tZmya*C4l(`TxpfiDeAzts z7r3HjsF;19g%PD;KXuOn^vI=P?9z<*E(Ag{KIr#;;5k#fCmAHA+LZ-hHu zGTFY6zajCwSX*U!Tq}RxTl|X}%6`1gcus%nul$v(#5g$Z=3P>7l#tLoP$qEBq~Ny+ z^?ciQapCH;&)@KF)9-BJ=j60Ziw)HTo}g#P9XL$8P_@ltdSUW}@5#QSFn~?5h)C^M z4iXls#r#8k2qSe&_!#6%s#qGfc_F=x9ou9e*1-6*XKr(LRaHxtj1Rejl;nDl2$rmK z1CMn#E@|K@PvS3o!@-6VKJroI3*QMwkm8hsjfJMy!cKg8@OF*r4Em1LslXv`>fx3=v=fVN#AQX$5AgGPPs1|QQkKjan!_+w&xcsAL!sM zzvo$&)rSohZ_0KX{WE)3-vjXL1gj`i!_(N)cJ+b{&Y<7Jc4k~p-~_|#b9IoWXEl>8 zA^6mX#ryGCLvx8==mp>jSr$Gny#9^|6W%-WyGuR0!_sGrN2H)e=G1?@=VtL7;wTDj zd)kT$oK^jW=6y3=^xjL~=ftnJOfJX)o?C2B>yU=@aoudK5S}0_j1}GK z!u|c0JwGw2R7u->tAK5YmiWl(F1}@kgM;szT|?UUr~+sE`5f^8iAcJjwDx|+jsU_y zYsB@ygtw|war5?&)aq`mZh$DgL~|rtQQ6Pt!eJ&ivdq$byQJxKCeEUps?>Tpu}4H<_nH!!vdPOo*ED{@Z{=*I&}$(;9P(sgWak=~Q|Os{57 zh>&-~85*}HUhTo_-SOUQgKt&-jy76Gn+H1g{AM1akB~>-LB_H(>Se9I?`?7v_py4q z@7bV@ZLjWmgqbbpSfsT%V(rTgk&uR-!%%s~QUqxX!-V_paFb`XAo=q$)XrUy57i*T z4=*iHPzHWcIpGZmk^gtb@`8>~qZ6&op#wO#hau+aMpM}uQ~QSkafs5thxM`iVc*IuTsIwpMnA2xsETWGaaESfk^}4chmBty zF}N@Q#94D4wKUDe!dBYtaC+~=`<{&7u5v2E?@@7!Nu7$&@8Y3|S*>$F>XqFyK=ZyA z^YnAe2LEbUP5!ftkZs$>J2IPx3G*pb2(!p7gSRA9Q#Dn`0OG|?6hU-lMWrd}D0+Ev$uEqv|GMf6X~`0o^$KYo7!*N=BkerQyYZ(sRnFfuxXtkKGj zrE2YtFNli^(bZA$T@5gEl+PID_2IicKHv9WVpyaf7!YWJQ5bFH&61Sl_u{&pK1iK1 zyLij-!~@LKZ2P?PI%MBIu&p)A2tm={wV<1lr(IkMBH`ARO+7rl91_fmW+eM8W!@kT zIZAx{z0ZpS$g^6A=D!G33>^1C%UBIRVO+IT&CB2wbw~TsDOs3X*(=qdkCCFHf?an< zE*fIiP}VZ`X>M6C^m0U97mXB+TQ%9W$(Mq2#_Bn07bhR^49U|(avp+L1d-(CwPYTv zkZv}L~``ph>b0O*b;4EP=WJDlAL#~4*T(U%<)DSR#27j|qBm)Mh zDPpCFhz7eODwqUVtjlJrqHBgB@g0-9cb(OZ({xH8wb4Xv?Q(@F6uHBrv!Fv%PpV>` zo-JG`gf3oMLLzQb&&=X3*BkFuLHIcO`NkxR64WsCCK7k@xBEB8V7A#R|r znIRW2hKU`u_ejsPPh=I>l!RtWXt!LXXP4LI+CiRLk>uQWYjMDfu?U$1HZ6ySbHU^kK7v7M%IPX7zTX>W}(NQ z8joJl95z@2f)@%FU~uU1=rIVlF5#AgJ)W8Inmx0w(t=3x!~Fq)1(f3;3fC>_u(Fhx zkzu;f8AU~^Sx$c460>xSe8xNGPfP@4C6i%~vk(Ny4?nA%U|iCTH@>91(*8%|ax-%(e1#{mzqPq0wEI zjbHIub>y)L_(^yHt2)pn23#Di>tLLuf~-iK&-AIyT^-fQ88{(7iicn5G!nl!o5gt~@p$t0Vm^#yK;akZG%_r(bqJ)bji|kaS8BkD1}rVMUEU;s z`2?eH^)W<&?D%Q^_4d-x?h%{F_iE*|1)U`q1lp8+%+PxXdkIo_rabJ*a6e!0KNY&m zO^zE4uCIst+!>(I`Y6dGLx*m3dOsERx@4`%iG`(ehIZ;D6DpF^j_#0kqRtY(JYi-| z9(bbISs@yq{Z;nTYK)!g#(rD&vrOqNQH=EKQG2dbr7`tZGYFW+S`|f1f zIF?vA%0?&ny*H||yokS4t{)P$tDtnPr+Vjq<(`q>`@U0z`qGWn5txDhm{^YGvb!XB zqd*t5*7BsK(L4E}Et~9R?x|_7^`cr610+o7@-)&Hj5JdSs zT-rSkB)oobJgvov{LH=RQ)#hp~$y6Jo^!=7R5CbUY^RL7#}^jyuM$W3A>aT>a7{<;bqeHw%FS86cdWQ%O0P{7PLbC$y~t^4dy7piukjM)_sk zO|q=2{3`W$qb1wBVEo@JZIbj2+-j)OX5mm919$)`R+b>-y5K*0IMWX#m3m~Rqyr<3 ziz`;@dDz{sU>zSfaz{*i0scZoe&EAUSeb2ll+TKpPJBT4LCbCryZeqr2xC!$H#l1n z<1fBVc}`^oN&l(qH~#BO?)Ovc2O$AK^;1v&nlM^yYYaSdxi!*50CJ+4m+x6blHbGp zVE2+13?koa`t;zbFWAe1^|x8ogOJ|x?TlM4SKBxf5Oo^W*7LH7S1cDcM`$_sx_f^( z_MG8_Gp4spi9KRz3n<8R7-r_{+x2681dsi9e#ZHA4(<)jOy}+nk^6b= zRh#bWBLxTyJE#ZyK_pOPDkH^6=Sk=ACP*+5S{wF7_V5&IbW~rkOo&*u-1t!e?hV4F z%X)seGN?jHHDyEqYx-fyFoTKRdi3>vwqtVarN-`DmwDqn3R3QKqD?6>aoA{UhGJx} z(eWe3PIFF2QlO>0PVi=wu@00YN?>Xj)Ri$q0vH zF9JgWG5hvo?)gzL^pQ2lAdo#2Tl6S!^9e-w*j?bKEX~y;Ye)?0Ypeg5{RU$?YWo*|ti<=mqoa8)Q%Nk{RFdQ7MP)G5_+m<)XLvlbd!4iVWylQYdA~%X2uU5IMZ_zJ?FBb}N zYy!fQIXL57ftw`JW;Z6xC{J2uWYr8rlOZdWI7!3>9ukYz#^=*;^y!8XHd%<$9ha?t zEcvAPQS^JkeVh^&T6@n2=e8VwdoZQ936 z*~NjH#^m$$&cK>&1L)qHVq>quEABo`T47StBl`4C_psN7QFkScKjKlA^8w8J~7Aa^?Cx}B+*No`0Ql(LU^Ln zI$ZXfz*-dTYNbT^!W8ULaHuVMe5W7Lc2lKM%lDIH1|%~M8Z=JxKr!8-WK16tAU7MI z5gQ)f~4 zw|C{d{2_Jx$AE-HUpEChX97df@_r(#phpykwDX4>K`(a_^AKl;(=%ihiO0pIHlk;e zX!=iLW-rER3zU1WO**9`7Y~;_SR^>e3OU-|uf*_H;wl^{uOe$)!dZ z!ing(t*a~3?`RqB5luw~t)F|(N5T(<9j=_E!s?CEspv144flG)v(|SHWooJ^Bqt+V zgev#^nB|d#vlRAB9ZS=Mx1Egr7}&yuKj4j$kuW~{w7}!fRBlpTn~&jwp&NVUbfoc< z*uJsLHI7?U7u`3Q&^b3PP@#~N`~j^Kb547tL^t-wN_0IGjR4h|wOPcw;g6b{;1>P& zi!P)xQ`AE@>eYmb)cJUjSU!^GF1ZgF%lQ5_JGxw)ogSr*2Vb>oINd_~j1zfLxLtkj zX_DSjutHVRM*U<*t?$~1?tTb^yit4T__ZEhfgZ_Qd6mnEM}ogD#7e?s&Vc7-el7~9 zn`c=c#Vlfu*5T~~bGY4Q!lduDad@?Ppw2qu^P2Fp)%{)biCgTDoCDQp6tJK}$B3h!#VK_Q5!XHf{0foSdnbf_k z&jux-;;#0_iXm`w(bBy#=_GW+}g*zx@fpjMv1QM337RgEm;pEda-y^4` z5~r{-olMtgV^+|REMm9XCG(?;=cN+PJQbuVd1d^nj5<0-oC=Nw!a!L!9xvZ^2EzVa zqNc|bEpaheojt``c}*Pe8mJ4Ep#(tZG)XdRXM2a)wSnzTPADn9JSG)6J?qck?Z5HY zxcbh0|Gc)aP_yeAEw={Il|X=){{0l1p}o)SY%~svA$#3igp@!9w)*C=>RxzWCI_ayF?}<3JFN6)R?kaP9Q`0w&xzz$ zPCi?U`st6z2-1Kge$rglNPdt%($L5i5d#j2=x{(|(YYEJ0VI}Qr_ZiP-5!)PK4qtv z9==*;b}_FYd<9AT$vd>h(LO=QY8~Tp8eH$+WRF zv92^t`uVUGyd%tD3^>ttR@Yyxio)*?vPZ}*b~VxF7K=>x(EQfcCS!Z*@CB5Zh(1NR zGfIwshz%9Y$GhgYt`wsB29!lbOHo%{>NR@;q~g6{-rZL8QoSCwt&nq_QMZ!XmSM7Q;TFtQQ9cm5 zKkFNRC9gS=`Dj*)B#ZMaiaj0qRn}4BHCoP_CMf?fnSNxhgp*B0AhwMSc;C9~xxEBk z7|*U{7>xN$3kQzBK#Ekv|4nJvlk_~i%vf)GmMy)_awoC^@o7($JnUup$1@c3P1_Gd zktQ}@gaYg}NZdgmsoc|+f;tK>^|$;{hUAwaPlcLt{s?t1C56%Wlxv47&}vG<=f$%p7P!}%nm98HFsV(lb;5w`G3d_A z&Y2y!N2y0E2{dOhdPD;1vk7Xi!aQhWf3!McfC>=4SKRR%KN(jU_2j97#lO8vd4&!d z;=MR=@B5Vojow+o?$FfgXwqwjc1NTJFXENNv%(kcbfRC=&}DmGWrz?1>Gl3p0lNUV?TR0n#|f%flalNTWWQg`Z@D zYuxkdxkLr~GE96#C$7o{xyR0as_>`BkVD>7mzVH9IbKAeCEm~soWSw7!*f0rsxO9j zM6VC_d-bnehj1X~tTReGr{)LMAxMUxofXRT#RH3H+r@c3iqPXvy;Dlz&Pcy2shy10 z1;_}SK$HG!QQaM+?mxlV+jFAd8SVD#>czCSrZoLJE@WaNoXIK~j`l+=lxK>>Jm z*$oVL>G!`xFIFdWPYHT|QrXcZGGDIhG9tU4d!VH|@P?>JrRJThemsYr3fCX~0l(*Y zc;%CFD9Ez-NT}v%$%a9IM*2n9w(43LE%rM-YdA-4~s{%3SBF1$a9 zH<~#rpYOY*9S`{&rN(*vg$1kpcG%riNo4pa2_QtmrRC)&G-VCD_HYp>(RK3bvQ6*x z&t&UdtlfvP(jb$1Ct4p(&n}LR%p6_o+a_D?s*M}K&h9IG%akZgM+%7u@7{nC%O7_S zybc!TRv$C{ywo;o_{BzN9v{tKz$+#B-p6>5&{WdS70wfW; z_~7-PZ^<~B(AaY?uZ6tj-Je2OaEIPRV+JLcKR>15op$`BZc$wDqA$Pq4q!%hNkA>l z*x!-|Zdsk7vU=%y0b>^&U@Zi2$x0tWapwgr3l6WIgIt<-FYX=+BMbKNlQ#sbFX~XG)sSG*wZ@jPoQx=uxf|X`O>YhEU(X>P@kt37aJCvB%^u)+-bG z-pX*;Y$6m*VaMn7NEc2ovhlb-iNhq*LX3BN$|RV>U??<#zIM~6iOd=$;r#7VG{gg_ zu53XO1RKBR=)S5lCF1tx4F5yP>yZA=tJW_;YCaETa2!sWASTG_fanTrTf zw*_Rq-)Qmpa1!Z9rL5m8YQm4UV&H21Sarni7%Z^-JB2%pLO@t79*=cJ4;Y*uvHxuk z-9KJ>uMbM5Z%brmz6G=2>P+f{%&x;_-Kf$!udu>O|A3edf%TIuu==I|IdA}t^MkB1 zz_XA0)h{>YkpYvua6P1C#ggI3V^lJ$O`RZ#jTzMyu>!cjZz%zNaFIl|TRT12_Q@j5 zfx5#WcFmQq@4PS0;2=&ls^xlIel0XiEfz!ihw9yRk(Dhp0D&MywW zp{6O?z0qj>1bKk{92rws5411e&^FQTW_2~%W&;jK#*wud2!pcg70Nz9b)@GLvtdnk zb^ldEb@ZiQSaT^6AY#J>ir>ZFuM|5Tf+hEh@|Bey%||r!43l@H>&y8v$x+?3u;fqI z`jEsrhh3aq?cBWg{(0_CX6*VGvS#hvrjOx@K=j{z|6>Sh3- znQSp=QIs3hl(P06slRXcE<^jexLz38Q6fC3{HlT3k0G=TwPRWuM z+8#r?MOb2Z;(IC%zBxoX!wv!&eqq2stgYP3MNDv9*q3BjZMUgf%E0-Bf zGU;AZnoGH6YO1jGoO4AYdYp6S+rEg~(dLvL*DRu`|0t1_WhEE?-$ZkOn3}n=buvNs zwt5E(B99q^&TUq(8=D3450j5Ui%%G1z6mu@fsZV3Nl2yzEW}yzLOKF#uD3=xqogSU zD^VYYKbgGcP&_4d?FiBM+D<;GtU79&f&jYA%hLjQo03lQ)Iq3jV<6BMaAtj_Oi|g? z&GGRFtV>-DIFyXpUS8JqC_)?z_*mO}MFKxoRIchXj4&aSFg60oq2yJ^eaz;0_4;!T zDd4T-dc!z1z)8;?1mIl2l8J=GW3m(WErZq;b|ameFmm_jP=dElQZi%cZ2 zlfsX>smJ)q;Vmg_la0*z^s3@zLpKhy;@k+LQ`_$EjT7Y%H@%kLgCvcW!m8use-3SY zAIFbNX&?3QJSpGowT6&@Co9?ups5XRU2XP6U;+}sgcNCHx@S>}Kc%Rqo|!>siM>h4 z5lRGuQEtJY@YfB-$_J%lU>q*Qh<)0Pfq5)dQ{8SBJ|~0!4`aREdofAqD7%td+BLVK zi*H^NAFtlE{S<-q4-MUO<9`!~-c(Dpdz846wd8zQs0?nn4&7sL{pb%V6|OVh*dc@x1|!YB=euyEiG^bM1LdTJ z=gX%pLf+fXUE<(?fmCSoIRig@U|=D?Ezj!OY7@`n>I?qS1wy;MQ}zt>&Qgj@C+ET= z*2mt7(4*z^0xGdty|-e6%;Cr> zr#-u_z+Gzh{x2qrzk8qvWz1NIUWi@I#l!mAS$?odHd~GcL>}E|dbvpAd$&^>P;2gY zRjpcnzp?gW?|uO5a&@GCqz@Jj1El?}UndHp{G^errALgq`q1O*??m*kUkXMvd?p&O z4ADPZ9}ZYkpW^b4+Q4lBErRbH>}Zw0jHsf`lTw2soM{(*j=>1-8yL zN4^#tzTZ-c${!N=C-V5v?wE7l^@=(0&F<;mqIO=-Spn6Y*sH6wSyhJvEh;QlJqQ~C z5E8G`rug~i)tXp@jEY=Ly3e@9WYsj0Pzq@O7s=@=D_p$SAV~|de6xW zp#;OWV&5bL2M?TvEsS~IFTv3_=r7YRNPp^AIxP?7-_J2-makTW!frV_t+IFkNB-`| z<8ATRl*Wh|>#HCp)8nfD(05T)|E2F

        Pso1Cr8w`!Dk)u{M|DBg5~QVq5&8?oB!(8dZ>4lkLJetaY?=H^EOO$8=n-fupMpQ#`* z(pa6uLTvZ9#7FxOOI98_BHgDOeB0igOw2g5sukkjgm9!G;RF+LF3fjnJkFmwwS)VM zsCFaSxTr-AGTDD9YfpaM{CcU7hx#EgCbB2*hg6|S)%_wanQs`nh!_0dBBe$d;f_&A z^x#6}Eq43X@|TgXR@>2`_Ztyu`rcfZx6sjJ5znRFjL;K0Jbumb-H$m?<^;DlqTDRL#o!Vz)wW_%|=+?WIm=4 zqBh1({Dnj&N#+JQj5pSrjRaQ&)Lf-)isxEFvo$mr?4UDQo zV@{*nM1b{s$RCpO>nb0x3-U)ejs$|-v)1)aM~-I=bQDop+cHZwLJEZ?mL&YMXg1FW zror#{JDU?!N+y&Q%r@j6v9y7fJ0-yEI;ixF|A!;CI_z9F(KDZz0%&0! zH=GuuB5rqxKHMTLgj&C$pNnJ;G8dTu;ih|n+vSq22TZ7Mh#$h%D{{zzYHNTu`4$M z3Xu(|xh33#xXHctv|=#%|44Uikm2PV)XXl|z1bytIe4JEljc zFWT~}=4UX_Wa(0bmVB?&VIryuZhvF(7VSrs?I$Y6G~$A(5xd5sejCH-r2NUP;H54} zu`rl+U~K7qOjI82fB>m9mB}aVIiVA(fzR-<8ugN56mj!cfOIc_ZXx?gJgBW7sl8(K z<)Jn62Z>DnO)pzcWc0}ppI~YuG^mUkC=|R9nBwB zr-cNUKYr*=9a4>`U;M0Lxm%7YTn8CJ6t0_CJOPX-LhdxKFN6I?BMKBz5wUXnBpYaf z()4-27%JDMeM7OCN}!F9i%gDlpUi8le~q7~j_Z9Nq?gF|cZdKlyYn~?J@osm3#`)8 zrnJX-%D~lzzwgG-M?noUk=$@uGAML=2o|D~o{3Zb}>71VbcSPJ;|hK%uj zxJ_C5yHC?k(uE=L>zfzyxe@WM_aq;S4!v7OWTE^EoT`vIYfv3W#-LukRZl{s?69t|&b zje9|b(`Z#hPH}==W06?johyOw^V@cNgV{rg5+@v=0ou@P0Rd{_Bf?|r#Jr)XhZT0q z6pe9W@AuP_nhPAqi%G_E6qnc#RU`4YR>zGS7N2nm2)V3@aiEBMaaX>oMFB-+O`La{ zocHVN<6vt@Yn-dN!^;CptDgfp{LLStUsP#=qB`HT*abCmQ`Bus1V;WZ(P7nGHv`4J z_XvzRN>$YNP^Y2g>4NN;|J8WvFI1}(fNC9&A{ZN(@Xw6xB(FEVxY~s=|I?FD`jrE> zSZ0v`Celup*gyaBHHc86`TC`u!}gLmy1JwC{2j6vg_nb>&OZ%`8VKAgk>Rw(TbU^% zW|>lwfPg+I$uC9S8bXa%eJ80U8KZ+=VhDz=61mY2lkM3$0z)Jb702>$EdT;ncx+!) z_D6olmHOb83HRcng+!w0qPgLD;tQD2&J}DlTPC|iH4&w1j%e3l)Jsd)v zN{-{$=24?O3N|kuLLw(xt0rn=1J8>NbIHS-=(m&vYDt*>qPIZ8=B3l++Bv2UgU7XP zv#0ytb}6cI!k!c9h-JiY8-rmCKiX)bEM_|mZVy$@l(#I$hY^GVHCa0^~k^nA3r|0 zQzuO?X}Z8>1COPAGu*J#PoHXnfDVL}nqBvyiSzTp&0&lnJP1VO!$>)j16fQePY2fa z#lYmP65__Gb-AWa_X21cNdrA(0&9$S?$4<6 z5~YTP=aa4hL;!Cump$PTl_ou_bSXN9%+fqD51^AWyo*kOtNXh=%CC_BAia-X&@M_{DEG~66&qZ~_0p)r6 znD}*UaH@yS39X08ME{asD&jCnkFxA*=8}-YfNVMF=qe=2uCD-lL1#7Iy_rYC8DK9s zG#B^o`SUmZHzoTL)m1cmYR`A^S8?>G&*2&jY^sq;_ z@T)w)tf5*jP1BoD2O2%n31y!MxpOp?>m>K@Z6hlyE>AUv>&dUg_U^!ez-1=QUVH5d z!5HrG;LR(kvDWYG(lDjM(ze>_LI1fg0Kjxf%MTyX-*5MzT7uo^IW4<1E}{6Lem)n! z<=h=8Tw>VK8rIA74r1*1c;bb>$-~71xU``!*NM`&; zq}EYmXF&-2Rvlc5r}|ew9R5(2(yxH3CR>(fa#Uog>Ff2Ub7^IsZRQJKEk|3(5}yi} z?)~+(@vfMJpRV@nqR(NuZhBaxx>d_%lFMQYKgars9$ygnC*qi&UFJDnxon9yiS&0e zZ++=885Fmij7eN6qp&FcL594RcWmz#$h^Dnt23^dUhbu~!lFhKRJCSbH>xx58@;W< zaJHidGGl$R-EJ_cq!irro;<*Y2cwY_c^LzW`(;F>-yT22+$aLl9l8iz@Mcichpf_( z96qIA{e)g66z%;~PJ(m>4Qu?8Kb0jrHhS$!Fhsa(fv@+`l&*C5&3Up{=X3Rh-I+)E z)~!qZ4DSQ0wu4n)ihxxFZ`E|J|K{*)zmp*4>u@Kd9<>i|X>0jvVn!(9!};9g-Cc1= z2(+y@jXi!?#51h$d_Z1dSpI6d{qkoZkKoiSzJT5M``$5_WQMPKqCZa}=D@*DAx~wL zHB(wq7!1@#RV?jO{Ks1g@`<(WiBF{bHK~Z7>`}f2d{&@l$G1k=C`N9CB;2uTS^5vWLyRS=0E6Ruhs0W+qeiY@`$* z$JY$*!+~htvpCnSY{P@vVfQjZk**NhSv%eRFpUMW^02rn*)I9%PWwpjCBa{q^wqD5FJ4PL-L3I#JJS zqDCOhfV7a201A*jborJ1d@^$#HkJiZ#p~A^@qmRx3O&K;Dnl2_?99xO~ zJRu&$3JJhMY;M>EKbLpHk(r03f0C>Aj=F$Vz*2^V$BC6a7zSiu1hd?d*8_()F}on> z1r7zMeX%zDXvT=JY*9+!kvl%k zSb3>rAz^Cc=A*mTPJDACj?hwR-718F1s#m?WL$LIAnzW_hIqFc|ho@d4Vp!(9_ddP_6+yom$*$`w z6jKtO=vfaN4P+Swc{RRM*A`5(dRA?k>P%6T$;faluy`!xki7iHLS&R z8Vx<9qHPQMz5|ch6sBu^w{Vr_D>6Vu0>~(tOYgMGW=nkKuq){#ZlzY3G4N;E3ib-Y z;1UZyUO^VJ;gyGC>xUO`dPUTTmD09cX_#iCIcW?D-M-Z=WA7SwV!GE!O{`h2V{`^< z>9WU{rS9*$>!O+Qql4*&bGY1*z><48GMxK!KVDX_+{dKS?G=i?#*u$;U-sg=pHMbn z4X6w(CtPF^W0sdCMEi*|DHx)Y;iXf|1cX(jEc#+{nkA@^lO~R|BebQ+g8z$&&Yy~+ zl68#C9YbT3V^Vp^CjaotsYk3vMl4#DHNMzX6c;0rTy7)t%PdoHU~VjoOOr>*ukaJ5 zEGcyhE$#@yB0eY(T$41MngT5*9p~+B$|Ds1OowRtw>0<3j;~+#YBTh7u=dwpzG`^v zoRr&WXoaq&KGP;H`zNK&ycNqV#lAhyHxkqY4tUr?|TbD~T; zYn(rQLtlgg;8$rB|GPO1uu6-idkFH^X4(8wbjr({l;;K^(k-{?b1n^27))k(<+_vn%Vn5C8Z$#!(+=`q}cgS z9ejKzEx#ug==2Ccll#H%YoE*&f4hm(2m~UXvWMHT2mG@7zW0FFrjTD&R#&O`kAD-0zt+L&&Y#;Lp{6IFN`u|hBQ z7Bsy>IESXr&CB*l0$~MOmv<`oHzo)gTY&^2Gp**w!x6#?YE;LtsW@FTOGCx7tPrkP z7kX?;vDVWxhR34sK(~LC$e(oIuqtx#MxH<6k~lG?(|-05noqGGVtQP10QL9H9cgh9 zxmIP(ZhJF6`+oNHhuSEuE~Ty93hY9aNSycMA439($429hU9s&Lzjt)+(!60z+gGuW zx(GqE){#K4fvE##A9^gB7h^p)y_rwpO!35nMgXh%fAiuVMhr36sNtjG z?eu_w$ZP`sIVH~RZV6=aK-+*m6;(2?V_D`cT)Lr{gKyFwUG;$D0;IP6$jtvmZ@9+w zu~)cCkhA88PN{sza##`jYZ`TgQ2kq%9tNitU^gaOz6V5aO|F>T={%%3?X*=@~?ehZ$x>;Yj3r`jj zrg0o{u#>J!*By^d;5gCW{@Xj}H89ZEbbaF@U$3IT(nf4OiE`p92|Sy$D+G~&zJ`Kp z+XpP*n=21a18lhg-1h%*od5a4h80xM%92)@?#JutLS5uPoA;sI?x0)K0xzn?7WA%F z#4SN27q&$pP|6j%p2Vi-^8RP!i7PgMRH^LoP7C9?x~V5aOt*I5VVR>@2Df1SJ;x?) zwr|lE`Iwx9Nml(l%X}XM4s*aHm?B;y@fR*MC%R;OtB)B%zH%6aMlG>ainOcG+e!F{ zINw-LHW-BNKd%IuS@?e5yr*5e&GSihaqOjghn1k`U1+GK;Tij8Tj1s!cRm9Y0;u-( z36j9V?X_kqirRcB8b$WjMJ{Fc)1l?-Oq4#vg%RFiipduDe8}?%KAnevNh|N`Mn_dBfHxW~wRgvX1^h{K|~_&21J z8h7ij1fThFO@8ptm+3f(v8R@n-2})g__1AcCW~2PmYs7Fr?8)i ztjM$)<(zZ6?99Po)vQ0)u2^2X<-!i(VKzU)ja$ zl-b20Qd1G@Dp~VF&BK{A@j|IB(0iH(!GWqy^8zsf?%gFTrP}e509?n+qQ&E0M%lG4;27%ryuRZT5r1{(&<$m=H1IADh z1+NDb$ZVfC_A&@vV1Rb%+S3An(|TxpCBcC5zazOnqeaqgyN%ON0eqK5;eA5S_w_H^ zLwr9601|BuS3SMGA<^91FNiNerAg4ep=zcv} zKQV@EsnBUx0zBo<%xv7_HgynJja$6F>*8`>H+yOV+R2KkA9gP~&i8I*3Qf(iftBja z&$<5}V|V#h)w}f#e-ToGv~)-#DcvB_DcvI7-3~T#kc9s^cFCm`Jdl|gU3{o-$P|OK3S!ek3RI-`9OP%^~}CJ9F#AX z1lxQy8+uzVF-D+J#@QW-?Dc3qhU~e}x5g7>VP(7>Z-1%xT-OKb`SMuY6})R=jr4Ne z?1lK?U*G#@UeEUgRwy=N#8KsjJD!)=vE3>qTP;^L`xJ1bpDp# znWuP9-}3w?ETLEg8u5g1W8bCSXsWpQ*C=jm8V83%6ZN>|W+V!ZPmZ3}&gY5)&_??F z&TP9^`zaf+cD9|Wf3jrK5wtD!Hlplg$twT_V6UTPD!)oLZIov4stZ-E-lr*laPZrG z_QMr;lZ?BPZzDa9^3=3to+YtTyLw>_g!R5R9A}R0y^Bb1uMwk~sB!4Xj*|M z>scU3`!?D3lv~$xyLUz3RleE5hkKcO9p66lko=amaQjjm-ZK*BGTa!m-d@8wNBhV4 z>CkvkO==#siKycIqsm #}f7zh5GKB0k1JQPD9*DUsEm1p&BZnid_G6q&c%s+q}( zAsTqgiHOkJ$H!gco>wZvqChNn&8A4D=W zPo-nz!z^>umtmF{B(w=ekjzY7=LbK>>CD?%e}qaKz-Zf*q_I5eX3nJL9(8U8= zbQ7|e4%wFXE*~t<_0isr;I;9^TVSLR%o1D<^*SC|@Zn=EhsOTvCN#KE zxkmW;WrY=}ljh0Z{gdOXl;ODW@ZKJESQ=pKtC1Rvz+Wa(%dImp$!0a&<4)k{B zcr?EX(lohr!-9c6!OSazA3Wh?D1*Z_)a2&CTxOx&f!f4i!LLne%9^?~A4fVm_EWvp z<|LyNncv*?e&{^{h^dxke|ieJ_4$##oo5FqxG_ z&l!f%Uc7EjcrrpSrLgZVM?>hzPVj8>PKL1Y`e593`ec%>7V8%5r`ULJ4;`2CcJrji zR*u>B6CIZr6O{baF%7KU{r1B8FFL=BT#ph-N6u#(jE*Pwzq)EW~`Q4~(9M=6@ z6cNF|IoD*5CZEu93}Tvdz7?}TS4LmJ&{>q$B?m!*iao(Ut+*R5uw;x(i;C&jYTiMd z(~Rnx6~9Nb_iS-tEGLdFJXrZ{B+7D={xa#!^3iZ?y#>7XzQ`I|<2k=_%^NBVRo&q5 zo~w32+&jpJbq=O?Eq#7A1Xs5!_~kzENyY1|i_hvssGgg{dGB6UbDH5%Cy3di{rS9& zq1{6EUKXsps!KDucAwa{ciOIIkcqdv@k@Mz@b1cgrrcwf^Hj`bf(`ch`S8-9Fle1p zIlW)(&+4tmbH{nQdvnjyp7amNbmzI{OKsEZPyNAxT+i#b@BNv8)gEofJw)wHHTOv3 zcB{|(?D;NUksI@V>5n@HgN6^ReJNbW-LgHP5|hsFkK5gz$x#jzjCl=IDVxH?h?@z< z=8U6}0nDeXo3n0KU*U!>zJ&5Fsv$^?pF3@TLZ2c5fg<}G6T`xKKY9LKQph8aQXYbc znJD~>{^W|a%wAkTC ze?-Q}6DNfO0qUOkVC!0Lo3lU<393MN!=V|2u+h06gETyhILp4g9^qo)&&y?KFQs~r zO?~hy5quf5SqgL-0(d;iyH!a+zXjq|>-aI3v$32r(mt6vtN*Cc+JylT+ZGOQum0Lf z1xO@b6v1Uk5Tm@V>B&(-i=VPKNif6U;8#~?1PpA$)%khjAK)taWG)R$=TTzR0k_Itx$L^DPQa5)~>7C4h_C{ zMTL3ptY;8CZ5I(*b)l%&UAt>xAEOfuME%rp_*T>}hVh`SZWDAV>9reu`u2Ir$#cG9 zT4kA;ZJvOq`T(DN4|exU7Pji(+(H29%hfnK{E4-6wTheSqZ0|CZy7cmZp<)4>lxblfR!>J**w3x3%Qz6Tu!LgV2nWGg?fN;tpwVbgT4N{lX$|E z{Ia&*H`bo)sc9p_6poGt-ro{BMM_i0(7+zo%*1HnD~47K(4MnZ$mLl-=79y8yGIEdW?*W?BL~xM|Dr~Tz}WNpBH2x5qB2Ki5gz+ zd|zl%u^mQa0}|K$za0Ext9Ws z1$Hg$1}1R-In~bXrle$5pox6fz27CBoFUJ{f@o~HJ9sTwB^I&GkIpiI_Pk@vlkENi z`MK0ocY9$qyOHs_zf0Wfc{?aFgKTf!M0iRz4q*)D_~m#0nmKr7u6?aKYbj^^yw!=f z#ujQ)Pu3&pWp*mQJQ~Bw^~;=Hs~(?vrnIwL+T%hTroTkwi}mtvA}iU$cRH9M71K3z zs`x-p~wrDu!n zS9dNZ6)P4?TrPU0@o5{Q{g!jfMkkz`vlUK&BPS*&HS?;SoSp_3JEP8k+YSp>Z(Q@^ zWpv&r;*TVu42yUa=zh7vWIk%J)0t?>B(dI^?eff`y44c;ysS+Dq{t%G?;-<;V>z2? z-2B-+c$?o$mUQ`rg~iv)ho<*4%fRhEuSqV>*hCd{vZn@q_hh!AQNbXI7t?%P^g)Y3 z_z_Tg2v=G|@Uw~lsl6%YrhBsy;_V7&LPqPU7fJ1oN~jF5fNap^7VCwxaECw5MY`UR zn0oD^eT4Jnu}rb2^G64m@2=zbL3>C5kd-0=Ph%0Wylkv_&9ZbxNPiW}8XOUvNn@~f{(Gr>aT?Ja>@&SQOU-QUV{&Uz9{Oq zWV>&ZwA2=t71uRw>bgi8S?liDX5+wLRI_UtH#=7zYnDbR?|Chm=7|Z06M8Kz9mg^t zTIHgX1&*%h9TKWL&E%qMb)mXY2Wh-Dke$#-|G0`?yFqp5hsF0ktGxS17+h%;-HfTQ z!u{>@WxpHW^R_>Z52TLo`2msp?qm)eNNRd1{eFMVjeeT{?wof z=P2!#|D`ngA=u*dVLEz9p)mJkj=!CQ9x}D~<^0xHl<37aQ3{1xr{Mm;>!nZ4%0sXj9q-_F{h{fyp5OGsFC<`b2sAGuCWWf$t`#0;U691C4}g7wD=DE6@L*tS zaYcpE4S(7QZHHvz|zn{fpO!$%fjnKvd_yRzTk)&106^Fa2Zx7)wZEAd@aPu70Q z>u7T)G1ObN-5K#KF3+&^=n7w?D08baoIw_qZJXTMERrPPtvwqTpZQ%pG!@|0xjx2| z&}wSAJ07e=kTk@AqkG$WIj!*%`=h)BJf#Ctn{$~3{#YyU$1HSDZNDOtElofa5g7p4PU&vs9ItOk|f)t;N8*bUn$2-=ZPHTfI}}YUlL5x6s3L^YA9} zPWa=p0wiOLO+%YuHx${Uz-I{~yQl7()SAM+<8L7bs&lH$P1CG}Fx~}|vsg(HhD`oh zI4cB1Fuzb1KV-Q?jRY7<>(N{)QgDbfIVpkOQ_&jEnH52C_&dL_;Fzebb+_>V>yIjM zgfqWv({T}k1enGMRCy0KmSZgE3ddINH~8&W_4DywZl-#Z%fwh7H?A?YN_;DKpRJC# zsxLyfSA$)<>RYi)WWg$FX6+{*h|C`LRj1fq6{nA{ic>4u2kO9!+`o!b8=yF)dv$x| z7#MUAak-SPDMVDR`){uxm>%zD2a#a?{Ey zf?rXJ{~&8s%)2Y3`R77>h~ddOs@0;~rmLr0{Mg%T^mDELK9xi#$@E95;(2ILZ(b-xHU+D?@v?bLC>~-avHUTfiQTQO9NAq=u&2hziGt*LIG`>}Hmq_!HY>-b%R4XObX(kBq z%Wzk`sMA9P$rc{ELj|#3QFfL=W(X-dcIG>>*-}L6WfAjk4>$8#%vO5fIWF%H!(?ap zF)#=TABXWY>$E~>=&P`uAfQ+sU{Hf-jD|}~=koTND6UzZwJczH6SU$EY=S|)>nXjx zz1RNV_Vz1Mc~aZ^KIbAhI=Uhhcaiv7z5#j$Z0LDSTr^FyQY@+9QowN<%Khs&{aG-b zXPKB(vQR@6P0w?@=k5Ew9p^K138rURPn=Rb7Aj@+WecD}x0_!LR^OFBp;4F420)rZ zVH>%B9H)k&SI4P|k(=`CtK$@QA_;}=8%*ENEnM(hB4?)~XvYLOviH5AAxuCE2=Q=w z78!BOitf}%pEgzd$UxBIff`S2`VCIvz7OCyvECw&%8BdCi+h6pI!-mGw&hweWJLU* zHGfDj@hMKxov2ll63Y?w54=Uwgd~MXM$&H@l;Jh!v<-J@ICy**n0Cyy+t>eHZ?E|c z+-BC$=HNUcL==pe>g93GGh2oW0&Q;RvdT*yJ6_!Y8+3pfGg09A1WL}ZM?$>EeKtC@ z+B<;-5&H;px)kk?&ZlT<>^4%czX1tiXV7jkuxis;IYC8?N42`e&W`#Xh3t=BP_TnQ zShfwS7Da@1=2RK1cN05-EzHQ>Qb^%Ww~3{M2)_?C+?t?B@rq$xKv@CYa=*2?<_z;e z0)jVKaowzQ*opl@`#rl$QW&7`BVjfExkd}kW8WO)0oB86iwIKmV<3rLGb!*}68zmf zyn^mtPl9f6wN5IBKzV9?R>Gy4Wwb%+B0ZuzU?w39QmzQ2yDbmmXLZS7~Bs)Jqra`np)IJE~+pqzOk z2~-R*!Hc1*)=1s_mjpyEMrHE)TL=s8V?@t~^>eh%1;Lbp#_^~k_*I&idPy1{S;RKN za#Kol@c<=dj^IZ0W`ndAEB-L@YlZ*;bMLHrs3lmIE6YM~jU`iM3kyFWr693k|8e^G zV*KzZV1-T`k<4RtxA0TY8RNjRMab*70cQAwVy|yx+t`(E+Zo#4rvc(p%!1cT_fksx z%VIuEDhPDp>(2+C)*EGbG_-bjizMo*{ZMZew^m`fKeD%VtVJ z@^OGQQ_J{{7!8QFfl!1cS~fZE`HHJpMC8hxfUWnR?<@5SgrR4GGGc~pj>J5tEri94&x>-!(J zNq^;1`*|uS;mpVH$LX}|eWO*F6kXbSYFGJF)^VY~!oseba@rNV=x@6&IVrM+tMpZi zml+ieB4?7tUGSU+6#Pdwjf6xMi4vw06zH8RgkBJ$zek?xXXn-ch-^D$$9EaE7)ZEy@=ZtX^ z{D^?zt%GyCh+-W%X8d-LB?2u?*sUfmx=!Qr2Lg?H(m#nU zR|oEb%AI@*kKeOJs3g!Wzich}K^OkC_z80;(+4=2csgzG9&>sc^?q&*;4Mg(c_u3zl-$KhTh0IMaj}qlHFFu&XO|h(ul>=EfPBiHk zQbuK(27GZer3Fiao7tx2W|nQO3X1}dj53e!D~eMy zz3udEe<*(y&0a;U!xp~}&I>qn^0k)NC9*svfFT}i;OSi!g%DVl-y$Q+qhc1LSkGaa zom^ctSDhjp72Yx0_J?4QS0)Kzv%giR2Ej{>@x}aZa2}M{yPFxM*ASS6a47JN6(j$? zS3W)eW0DzxNmmO$d&b@&!PwgM#)o5LhkAWa$V@g~4MY;koshhFYNPPWZWyA2{uVA1 za6Hyfis9t)c^skh-G3Lc|-z>~T$c3-5Gj1EQPVPz|AfIDAD zFVQo&qT&H%N<;0ZF_Xj?nZ)m^6lunyjE1crTl?JzQKHcbmDFS4l_kFQCB1)A z8=C&pZiFUS-LD?fm*>!4MqOzMC3{0k8Z%Y0mfA3>F^04<8WYp-lo_NDmPaAuc*vH- zfG+$^eE#cwtsFA2laI$%gm>no8brs-`_cH#$VE53%5J>mL zCM#fPnlM_>Wjo4-H86KIg09o<58f&a?Q>eqg!-IvC;sRZ%_Vw+(q0 z!@idXOqg{cNNxZNBHn~K>>c7svB7aZ)FBpne8W)1G&8}wkqkEA4UytnaBAz3fT||s z>T0AD`fk8oU+d00_=z_UQXi*O>L?mylT z7NNJZpE1AbszC#UCQU-%>@t|8C;lhY1o$I&bq@v^zHM$u+umGS3?M`kr1_w1|y9 zyeBjTql47LRs9(7pl;rvMhoU8*@RktP>K;=;E&`|hPh$Ddg6cd$!SYZPet?Y#vdEo zQ0MmPH@fzsVGkCVHj*L2Epjeg1%3f*wJOsRt7t7B%}ok=))WA>U|6wgn=({7Kc|-8 zv#%a7)98)#}=kVgs1S zH~R?-r#iTog$M@rAigX8d0XuD1~?<8 zxE@r8%XseBf1znl-%9p8o5<_IvO{_SAGaxJKX&gAy*w<2=&t$mAHDRIPcI)8{+QE- zN^QMpHR?uozcMoln4&`|WOTggYu6zhs#v+E^Z83THN8?!)gCI`4APc#$yswW)=rx! z)UN{=Ep9n=Ccz$xVyYrLsD2=jFC&wms9WI@L?Ito;Jz(7)9x2MFl%Iw4VJzHe9P%i zn}$zt!$DJ16!}hrHD%g-G>{-?3TH7xf%^5+$v|yYPZJrQH^jfi^wFy82H{{8JVy43 z@V*~4*4-T=TkTEdp1|u!-2|GPQcmlo>|Z9o2Lby9M8xD#Gd6N2lE=ma;aewaDijnf z#s3u98-Ka;p|;fKNVG4CwbOHyIEE73AuOwA(4>=51e5}yqY(x~tQ`W&_yRG6+F2hL z$#z-$Q@ze0d2^-R7HtP6YR%pzeifop3h3Dsv-yy$@yv_&skd)CT~2-<+-qINos5p= zDb)v?_sX1d2^zC^xj*gPod>rQJPv#443CE{4((sXDzA419;scf@!N1Y_rEA;x2%C- z(B&$$w_kF3x^lJKz8bXnv9`<}K%6DuroGJl%Dol)^Q8~}XY*F$MtyHKvt7>wLRSM6 zsNt-I*2}}M0MGDbOd$*yZ37WsT(zR{$)8N%QEx{ibukZ@RXh)6`lKPfE1DFOC&z z&Xc=$bz&OgpV)r&oBUqlO##2j(@vqCfs22pY1zx;LxE0G1dzl}2K=VQSHGzV@SA8H z^(Bc+MAuSE7>R$A*WYqdfv`h$MPin55W7-IKytYl(1>X?^+6zkM=_Hv9y!z#ZsjCCbse7nct}|ktRa1{iD!e_4d&v>8c@jfztz${@J4R8Nmsv9(3f@93 z9kk?X!+ik#_;bF>jBa8o6Qkeo76eU<2$39uc(Bfs97={9wD9>!Lh?mRMii~e1V*! z$Gw0=NQb+k&zb7&NB_GaVuABQuAU6LAw!7RI{y6|z7=i+$~qyTp-gFe^ujs?JD1~# zyd%$o{3njagbv_HMw_iyjk<3W74|xN5iBKb9eNwUZ9{K!kZ-U6i+PE(`fNI#g?SmC z2L}bHW?xaEb=IAFp}P(H0;Pu}zZ2;Mi0L z`N=bx_dk2N$Iy5!+7Iz6Th_p^?cZsTHb0kp{s3O&5H6=+uTQaSF6So_a}Wi3HMfsR zO&G-LP0b&hRHQdNrt?7ca&8mOQ_{<{kja@hM~kL7e5POLT}{>FR=<^qt|yomB(xCp z_2eFw!2G+=@D-Y41rPk?3Ik@|1tw7OjxTCaG8DsvApc z>bcSAB>lMfkZ}I%t;+=8c*U|paNux@SNer}^vc{?>*;~OsK&~q@{zkq9@2M3wLYee zz<nqEiUML4bA+ z`MyeyczLcp#`UE?R7qe^F`|u)ueDug8z$GMZL09`ysQ|}&mV=3c{%M2uX$Y*GKR?` zgeYP^AKrS}TAUcFJZotDWK>*h*{vM&q7KQ7kr!c9e%bSnce9=&elBjHzzcR?fV=Qg(8QH{;h>Ypb<@@-|MYFoI_O zZZwApua(U1S`76m16fmrQZdTCB?MD|d|g;%aJa^-?4W+u#h?$MbU^Sl63Ek<+-88u zRIxYh7V}GD4Jzp~&YtD{+Ko71GC3WzF;DJ-XQigj$(pa!vFhBveg&1YXSj5hu`}57+N$BB3^1|$?Km*RsC@uB4nAf$ zEi_yQ05jeT*bFFw^+D&7)PsgQAP^jloOfg8;OGuHmbadiKD4_S?J(pqAv zIYwa!vG0z$Xzaqf?(d8Z=YY}MCwEi1oad@~Yph5rGD3g6<}N@k7k>3Vm=pTzc?hTO zhTeDC{^-bSd2*IN_6y=(XmUXps^w>}s%RbEKnm<`-|xussb;vQpDw!OkBDEH`(~wu zSD`CwJGu2W9ura_OaJFDIzF7)zK*vc)bt3u|Cmg;cp>Zr+#7DZf9p_5rL2b9`C`W7 zolEv@n^o6};x*@49sAWXRE#v9~O|SBn_h0KB0M#tU58{@a=2FmeW@kV)Bp0^9)x%&g%%|hEEFJ={w2zo) zLG9Nl73D!}f2Nzfs?kBsNXz6stmbq?(dQI7jwzd;b5kk#@EB!3zk42$fXR?;`FjQC>U<}dWO_|1(?3rsj6 z0%__+>J48@CfZLy`=5ZuDfza9Ki5t+gtr)aaFxO%4+&$5URGNN2N8-}4aW}~S8u&k z1tE#0j~aEHZ`ugC_}Pj>ZYf)p5y+U5W}L1>^ZKfPeTE1~=Niwf4-$AJMY!yI0$iNU zBabAQ)MUDTYTP5!x2p;_@HlnPv@vWV<~8=>i#v zWe=^ODE!9C6>&lIO(Ta|cUu;a^{0W0%)!A#zi+4^wrii2<{Ec^!*IghCUV?J?Mfqd zVf7fr*cl~KHA?It_TdUCJyob4j6)WW^!`z8Ac)b(w8>SuE*M(f?%l4cIFGwivvLEMq zdiIdZ(#A>Cu8!OO)(==tUFHiU#kj>1@Nvf^l={b{}$n=UCxup!U;51S!b*bU45F^S)ZZL|lN8=9P*2{q+dh=qp z?>GtQ{oi)###%y7X{;WE{;xi#m5i230HdiyRokjIGCEVS#jPVpW?34W$8s3EncLOe z2{57#Od&LnIb2?+q#UJ&StOgVq-toxtCt@v6ag`Njm}#q=P;tN%)Ao`i1(7;8yp;@ zyQ;jWTV1Slud#4XcW9Vl86Hz;m>Df+Xb(%?ThGLdEzAUaOrx6nS5i~akjy`QPx&OVgNB4a_INtt>lSIt*J*&~e>#R}w6{&QvRL6aJo6CRT@W2;-$63BvWlr$L2YWnG#Z z=TeDE1*Oh~fMwQp3r&)DbkT0fE2{Ijo5MHU)4#YFGqBD8Q3&W`4!ahX{uw?g2oM!! zw_h2z`FBIZiZ&e=IRt@z$39Ycak(+%{gl;EG@Q3Bd&MZ3<*r`zt>nbQbQ2-xfM^z% zudHdd8kQhtY*W`HH|3d}Hd|dybfKYgZ9Y?}CwpX%QI8Ll*ktj!>!#$Ei;Rkk9Jzpf z%3&SPjBv*+;WzSQgLB>d2jf20v)icN>xO-%ZwBkx<3$VXZYW$3^_1osHuksymuVj} zipX)63yYL61)dj2-7f8~%al34nSXKg>M{)(YsrN~$b<&KjvWQhAS=~MS!obiteRdA zaoGGgBh2uPl$YEj|36$NY8o*Iz-1Z@4@)@h{V$h^xjQh)0dSdU`LoJ7%e6UEqpRqr zRHNZRVv3dKGSwrcU0`v*bG|V0zCS5kJ^7yvlA`;dkT)7?e!! z^5M{Ma83&s8`U?B6L}u2f3+T%mq$a2kq|uy#XXZ)2XgvvEzW&B0*2!L&+;Fz14X^c zsoXX%QA2wqPoustL@O@AL(rmxDqVf=D>=MWNDOMS9XCITeO@lGa2g3Av=XOwcBIT7 zUWThy+qlHImX^m#k`S+4H@{>lsiGNHT?8o1{m|>8gzc@kc=x*4{*`khOg)}yS#6$@ z%b0mB9aVE2d9&9#^}Kv5b>iw}@A(TVX%$#iT${Ev|akFC`|F+D(*}{rKW*;3V^eK5QKK}C)oyeM0~_bC`l;bT!emj{6G?e!}CnR!rlmfm*h$YspkvCCL9W_jDV zA?oL-IBhh3bxueSvCLt44K%uj(J{pd4G0+5h103>(n=eH&Wp(%iAyK4h5}VgkiQYG zGeepZB2O9`ss%m>lhDgaVDl}OIf=CiW%WigcV3`<-K}Y38YH^w&KI07?M<4eFcehT z=H>1sk+2}^M2$lcsAzD}>9k!B@KUI2s&-gM5iDl3SrC;!i2_`v8)K8Rx;fW{rc|z9 zgsF)`LCVhB*6S{6&$IzeIus1DjVMTw`KPhiupas$grz;@jI&nj#%P6tRr^qfG){(S zXx%q;N+XYQz=#Eh$rYb(u#D7RD8*|%NUD+C2effjGXRuNx$+#IW`UJ1znMF_>XebS zi0ID86tNGbPWJJ))k8f8OuQ5xSFP|E2*M(_X-fF*_ngm!T+V)0^SC**?XQE`ELTgaP>o3bh zv!TY`++ZtPNB7DyDFMyyB}v?9dn&CSP@qI;)h*r*$T_>L%*}EWV3|_bi6oPl7yhzL zn%YiN0pR!a{bVFG+}u&1^R;S!W3UnRS34)CW}8jz5Spo%69UgTRAdlHN1w^bOFDeE zZ6?K=DqAwVTTF{Eg2|3KMhX%nMiMP?0p*S5v(1z35$|@a7;94$^6%9g+Zz?a|1;RP zoL3yQj3yH6Kuem|z#Ae|!vQ)1fkH^Ozlu~1Z)OS!?yx#6+E9vfR`Dk~1PhVL2bMOs zdM3bSUlbPz?AgLnBJ8xaI(t(m{4WRC$GrSahFQk@Cq;YTSOZV@nyT)q$MXx{ zyt+(mpKI8VyHk0vT{AmcI96GRKXmf)45tkKEncab@06no)NQ}IOyhvdWKp~3MPhl< zxhMGQG6l!uG!vlS`iU3iIRjG~RaBib>=d1G=}qMFO~<(};@=RSR9CK`~JI%NL7ylMhq7 zz~p^Qz(_57Ip8vB;VNK((CMA$hgg&Qr{YyuXJ*tq94c27a9uWxQ`+3S8}Bh8QT|s8 zMFzu$65&pAw}ls5tpB+)s$pl*1Wjs$K_vm0VCH*KeNYt+f64qZ_^%1(kL>x3f>Ym{ zJQn^h7e(Soe_ImRq#;UZ5XePwq0)E3j+9J{O~a*DCk!(3ls^%dYmqlSGWFAn+Uo0W zE5Ucb3Z5Cgu;ai(dahsfsgiSQ;!_fXy33XbAlg1;)|+!SqLD}aq5GzS^c_N4o>rr* zLc{5nz@)4!U^f_N=9WI8LlB1d`tOo`!rD<~q@0*IVK-+9j#<{}1xDd`!s}*}X~Pti zQ!nD-NwpRBjm0!Q>8uOPV^&?mk7j$#CxFX@`JPV~8yy1wS6o?W3E>CdGBbsHF8E=W zB{0!KF$NC^-^|Qof7k0IsWF(rd9N<|zj7w5yY+1sELbrbNf;1>;bN+u7wWAYO>B5) zA#=B6X=3vGuxx7Tt_FxJGS?4zYuBGj)PB0zcBkTu{@znAN*|i}P`&t9X1cD~-=q@z zo34;t38fp!uHgtt%=;y0)yjVsvcvk4N-gcXoYJmWqwu3-|W)8PW!s_qyhBZBM zJvES7uwv;F3r^Dbotflj+Q;7n7LXtlghgHwN^s~Bnx`Oerxd=6R~U%6IS{*wB-zY8 znb)J%!%A)`JtAwMV#uw}p5ni^&Pxa2HbzGatEq}Z%V!Xf$MTlmIy66U<9}fTR$VTs zTmd~=lcT5f=Z(!YhUco&8_!SSC#F*RSyvmE78D3lf6^Rc^T8SavuaUdhK6p@b>fQ+ z!{4g6L;E?y%WI~dn@9>W#hJDzx?q}(J5F`2eiPjWJjdf z(|w!{@I>rFlS?Q)ypgn=t~q-fuVSNaggB2b+=PhX4L_iyhP!e=igUAg0r9Fe*>Nzh zY-wkt81rTmUgwLRB@Ty1_~2vAPp;YV3f zY4MH66u}$RQ!(cp@Mk#ZuTvFwi}K^GtX*x zK=|MkS%LFwfO3#QrU1hGnm`pt>Bsa!-F@+*{HsAD{`KwwJH|wTcZF4DMd0y5hI}l} z%s!cVy^;dqbt^$m3GocDm4KU{OBdKmKpJZy-eb_1l?*u)w8UQP%mD4D`BP78~~0|FG}6%y!w%b=^ymLGU91Vola+&wkv<>sP0pZ^8oTKiiuUJW=O-+iz2%?_3q zqfaQ*UYv8y`}XWg&s~vSY7k1{k4=JEPrh0zd9MX9HIT~$c&B6>y9r?&bE`{7dzPDp zt3#S!x#WB9eFlexQO29XU2*^LPQb;aB(Yx>QAxTaP5-daM9tN$V(^uBTKM{@k+(fi zgG;flY|zZCZ#eLsg;uiTHJ=Fs!-#O78SCo(uvXH=62LoIa{c1=52SL|4qRtvz>5ce zjEVrSr7zwV|5}=qHHjv(G3W^!ETXm&lQJF^CA58hn1g!j=xi7j@1bYdt4<-*F@h!xrlDV%ORi?Y8G($qnLPv4Ph&ktzNLj~ju6vr?yJ7KtFnw^i576mhjalrY-@lZc zq{DKxF~)AvXc+O7bNfk|l-HWBmNguNlvsOeuV{7#1C@*_oY&jRn>fjlDwkN~?FbB3 z>&s^3dv*7vr!dY;LV^VJJ1W zn-BJ+$^CP&VE(JXtkra$n}}6-5OFx~#j0$p_WcT$`i_&U(KtPcy-K;UnwIGzG$=hb zU-+N2sM&antz301O7}og5+;L6&!6J`IZ;H98I^d?yvx>7Om1s3)I}E4v>FZ98o5H`uKi{Zg{NCwMCnI8KtKSW6JrT za{9{xKIf7O^Yrx+$VZU^u*knDL<4{FVtC(C=56&1amK|CqZoA>aHmpw zqBj6`poBL%m)H+GTH*Cz80uM=wxl}3@NM+rD49h4#hD%JlL!zSMYb|c9~ngc^sUzW zqbQxd!-$a~2#Aut!#6J0Jo+MyVRK8aO5eh_4g(UYeL4RUH5IE?)!S6ZN!TD~CVfo+X<;Q4giG(sB)TuNoo=~U=T-GRS%q5qB8 zKiJdsh=S8;PhMe+?;|ARt)sRM^UdnHuNHs4Oe}jXz5aHVi>hOVb;e3H%FFMsBCCa) zGHJ1c!mGyWZI>Brn=P&{P&#p=2W_Zx6tCD*^K#yW0}$hu>&_(@Ip6&Mu_rOZSx?q~ zu&4cl1Pn447i9k^H9=uz5>{ko7FjoMs^}?XN=cV+F>I!ll@-%@sRx0WiCj_LoLAVt z5k~^J>5@f?lix%9rE@3RhFTqq204^Ogqnpg)ZXYd+S<$m>k~`pIZ=B5u20mhC^LIU zLzdkfYcf$V%XE}_Lz#Q7)+tc=flF#$8 zRnxYLIf_9O8$KL}j9ZNuCUq^JCS@=fzCPIksDv=6TVU|q@A{lbo3UMt; zrP`3eIEx>xbs>dY&{jp8)8v-^QFyei5UrEGmR^0sCqOs(~=8YfT;$kREW>|P91=ab94C03V(1-I4xAG!J z6fW%o5xqhp#asSiLT*O-B!Z0rge!M2%y5ld`pV5`9$XIped9n?O%gS+!Dg05%3gJY z`X3jL6DcwM4DIZF8Fo%!=HhGp$sp^BjHpd~R^6x8SL{iI9ZPUN!#cCouF{>i_STqy zTuyV1imj5=mkj`T>?u(}+SCkM^r#X(kpD{FSlFO2U$<5!`-%PMEG;874uFZD7_-9U0gZ35x+Ej^e@~R<< zANvq6_R53=gY7QJxCwgjf-{&aT>^uJ!vmRk)htTN-AI|!>3PCfyn7ji14rPRM>G~dDH?xTEJqb35zcT*{!>x zb5a;|D_WQ<#T4fRS}O0o-aoLcW+7W<-(=Ygq0S@L8X=icT%dnZLNBIV_}la+ENKGv zjD`*T3K~e|`vqswIT~;1N{U*u5|8DTx2eUt8W=aR7&IYWj{d<{8Cb>)v@)r=za_x~ z1kuf3Ug?CK8`vSEf#Nd13MKap-JN(|Oc0jPnZv;k)4h<^go@6Wi~ZpW<|j~PgkoJpnVPYvX=#seQop^3{C|vn1yEdFw`Jol!QBb& z?gS?|BxrCC?k*w0Ex5b8y9Eyr+}+)^apvax|Cu*6Z{C}!qN=OtzJ2exea=05ueJ8t z64};8#^Qhft8G@>`j-`O1vLUZ?0<9YUoWY@@1FvlhX30Sx^?hmKA&I;{M(PIR>|)n zB?A>AhuHrwQ1}1!75{Or{Oamzb7#*N!gt?lGon!b9&V8`bhLDcj=lu3@P8ZQe;oV& zxX%Ch;EE!g|Cue5Mir6Q)&eT5GC-dY3i^Ao&*);D+J+c{e>g-3wxXZb(75u4=|nXi zEe1dZyYeIcm>63y=^T?JaUT>w4U*?dj4^X)7e2mE%>GLNP5aZW%ML-%n3PO0x>F+6apFZca+M-iF*57@Fr zBKNO6r<>)N(~1aenO>V3C~7@hX;iG>7_<()UNnD@ve)|h>wdr4d7Je?r<>2sB$Qz# z-87Mm?rE3L*{tuNDmu@~mejkqlP2GT%RIJRQ^x^HY`C|pX6(sg1`{{V^V>w10x{u%+9^wbgusPoEhZ*>yP*1&tx`9fWG9o}o(NqBMg zttSQ>?xRXN5!V7f2k1)*+zC~6mo=4pBJzAItek*@&yOtctgd=XGOs zZv1*t0W3hEi6VyPMQD+*+0#-T%5@o!{f+T?vXDMgi=q8;bxr}->P7Mh``TL|VDR*K zS{2a@7(88~`JD|7>Oaow-);Ogc*0CB{tkn$MvVP0gD0tCs3F^b44xFDrf%?XR3(|| zSbhTrPtKZPoWTYLz~IS(4={MT*rv97HImaFr|_Ccx1j7-vddDDyYYQal)c)jxz?gb<>dbW^i$^ zE$Ij%n|dfU&w9OnGe7TyS{@$$u_>~T;{vvA0iW?Irptc87#yOCGo`Kjby8hjubb$T z6qv(!uDqw?dg$Z73u9*JA83k$7sTExk0DU$U?dP#7M5n+@;la4u90zwUIUzYj@F_> z#~hkr@9Rf3H_Id~J=HNT#J|r+$&iHTTX`51@0>SF;sT45%-@fogR-*^D0d$|(}aH|5qg#hgNF#KqNit} z6ZGQekPJFA)T%L84zIhWel=F!ED61<3Efqr#?I8aI7sO^I_gQ4MncN7FxV^^AQnjF$*SfWExGf2Yo9+MX@xer5PWRW^;^SkIUsbWMK1LhvlX&-Hf9$uY@C=TY z;P_=9xa4BmF@u!_&7Cw(`SCb|3^MKo+lU}sfwz4mz?{x=`OWuLr1SoK{kbj*ZfKI; z;o5XNNPp_b;k*tNO>_tZ^hox=Z@Y#5DT+ZEbdd7!QGCgKJw%$z>UQd6q%P-0ZbsZk z^k2kL%{IbuX1`l6gMUd9(j-EHCIZd#T3w9)hhpat7A>(4wqx4JFmj)nPBs-iLUzwSKJkOshkWTN`Wa4t$ z(Z$A2Jg>AQrz%{LF0wPp4Hpfw>d`Z)yqL@xd>h!qlF$DtxV5?8Ryh3g=tUta;OQ1 z4w}>`-{NlgdVJmv5$MNunLyW=CS?dGy~2#8qOx<^`3EX{LcT?^ZdWR68WoXd+Tvj8 z>Y6;wNzi!<@DmN*dIrB5Zo@SAgN2`+_>e(pPNSZgw8XZ_IH zhu-)7ockSjLMnca=I>HfW)W0{SgI+t$L8`>$du(>2M;p#4`-4a7h|YVp67CeMQ)m> z0$OA#nIAvaM{-?lnE*?YPwT+Sff*On2G`mg#`(2*UQaVWd+7u{0mF6@9BB4lTG`pO z`zkZ}A{kvPcu_Xh>^#V=T#Z*>)J1=Fm0B%dFx}$dJ`x0yWAZsGx)#@Nv+mKg8`IJ5 zDiXThY}y|^n!Wwro9Z!MS+xOusl4RV9)*S2-rT?>UA_DvXQ9f){Q@XP&Ev{q&Pe8%FlEWFh?>0ozX6x)g0 zSq}}0r+`1XtDy0#5;xe@S*G3zUVBnJnjKeyAK`M^fjY;0dt97rI~Z>&gIYZ#*4EgU zp$MkFo*RX3Bc$j9QR&fyz!8gVV&Kx#I{kX@dZNvGTVH&0oRt^Aa21#+CxnU&qKz8< z3^It?J`+AzA~v+OE+y-FKP)h@(Nn!591gkaYB1RMgOet7Qq`lpbCxMYXnH9$Q88A* zMEc%?<)Zb_q(v4?t&p_szeTU&gI3457>+@4^mXDm&DO&K{x{+Mn`rW157H-#yMgOwk zR%1XDezrIi5)aq;g<#`9IYe`ydB3dmPXQ;?49Z)IA-jUDE{DJxvB2~;6 zi?BAtKxD8U&qU9lHB$rz-VT*Hxjg%Dp%_f_nFK{zj|4>fj@_-~$^1Nb7B@6*_{wod z7!?XOOq<=sIe9Y%XxZ)pwi(B#Jh7!}4sOz@ zB6fd`RlGXmoZR@$%|f$a#crX;ZJ`It&wjfzNQ(9{F0#VdfpFbM|CHe@jbJv2$(mRCGH9~kLK9Ja+l9aN=*@d) zr!TteVwr86JGxnyHh*tRu}sR$e|GkQmz8psS~<3dJp)4 zsPugL@t@aub|A)z?W|HYJFUrN*YfyE3SVn%bfuv8CvIQKLG&@D(v+L%uD+Ib_d*%r zjTblSo*xj%6$|U^?EL%`AXI2`W42I-p%VnuFeKjJls2xUPZ!Zup;^59b6Z>w1f%8@AeLKBf|1g&xDH|D_+-5kTN1bPt7F-~f=r;g$dg*$rv5G?&_$(}0b}@qcB}#(S ze!Iu|2TMQM@0o!ue=8m->t0m**iCqyx9-*YTunE{>*{i5{mpq*Mj6ZVD82p~t}N7C zJi7hd*v|R+XuV6Qx^kIn{jH)2@Wh3XC=$MAJG0Wa?2uG$--cQpt~m0pRZM!8h}mg5 zbNNio%#_z>n%PH)3HheB*-9K>T}uRMTA_Dk3y5fE)MpJmmG0vltTEAz%qqb zGL7o5fH;I{*+66ejkCgwb6Jn4Em+d1_Tx?|1O4$)sHXkbs))~@X=JP9CumS-{Wszb zzP(eKhPtI6JZkwCCO=YLRw-ZM^003-4~Yg_k<#`JL!8YJ{Q!h1CF^1 zQ(gR|3NJ=`ww1I%;Sh=KwJ1V_haOqQF?7wE9`dkj!`sQ%x#@E{WWBSo4}m0}=hG>p zBFBJ$icGRwK=>tR2KcI5u9v-U`Cq_xt%$-mck+ig(IK7yh2`kUQ3*4y3nTML^eVCrP)dpnp7ej5o5N%+KATi)c8|8*lN z={ZA@s>IH7&p6tm>*>6!GY#+2_3lcvsm#f6t3ZEw{ciJmI02$M_Xm=aNXONhYvgeVESbBQruD0C!B-*dn(=zG!;f1*1gZfA;%bdBr)=pbW#S;18u}lV( z7X<~MNT{&he)br|`M#KPCdC0iHGk7wF>_=pL70#!G2^I*NN zn{^+*pJ|O@ac`O2>SWq;x3hMpDgLCbWbMr%UUr=A=SaOg$aOwk#iq_X8O@>_57E^? zsx6*!3nCvV8Y2V$f49hMIwz`}1096^t3O@22i4FwCHr~4w6Sva8O<<2*z*AlRx z4&@$91g&+;CEyr%pfpZf^{^8CN`0kG`S_%ip{+5zsnG=h1LkS{3vE!VIb+>va9_`L$mr9cv)`{f-W%Lb6?&#dorh;HiqP+n(p0 z__vdOC7nQHcIe|egpFTm5q2v-0)E8p#>9^tJ3cJ*8RXcxtY9=MYCVs#E%2Qi2B0q( zvdFkVvjDCsWFT3I51-IPuI{_`D#z?T)-6m<-yS7Jjx}Ji5x*5)+cB=X!`u=qz16wx zCDK@FKe(@)Fl0bfwk~i@K-%%<;d!{&;3Iw%zPvX+ey9D}U0`$nyQWCehoR+CKgVS*MjqdXQ9_7Jdp(c6Nd`9$JiBe&F2^F5yB$%t zN~d4psY#jB?e%a8Zu8Z4lew047UGU$B#8=k9+5IQl(%D-q7H?Zje7{B*~NL(hewr- zDIEfq##!@is)-Ih($_m*=kv`#`M;M^EyUvGh@=52W%k1DgVHjGxGx2bP zS`KPis7+1~BUh&vTR2qWtf`f!h$Xu~jaotsyB1Tg`XiHxM=WXg76R>%#p*!aADziu zUitTrUyX#+(QSIOI?!VfY_ONUEIt)~!eJh!_!(C{i@EYQiV+9|C}Am3XH0+dENnCK zX5iJjPQ{vP6!Ck}d}&&hPo9m0#wJp$Eo=BKCB=aK?I?cV=QRz2YM3!(H4a}2A;A40 zW-%?)E4*&egs(`6atsbng~Ix@`Dg&0Q9-_}G)z15_s?5}FUN!qnjTM zjG_~E{@l*HuoOAui{&Pe|87hp5A+I&@}=sXROLAUM5TzP67Z%?2Hf1_CPsaZ{=U6{ z0@+1(2-`fYTIUz2{zvW2%}RQ&PU;NL<_*)!y{4~1;Wz`(U(+FtpTALENMz!i*Qt`X zH&9a5)4?~&B$yh0%l4;xM)Tl3Uu3Idon_9$)LSxCd0Qd@AQh;N)UysC#w<^Lf86Sb zT%tXf=@eP-8g2bW#6A}xOLw-Jv}F$7DD9_Ufj>$4e2a#$ez#dBG%yVrzy zwQr^%7B6||_ZilEd>1=I#qei-hGN6xDY zL|4ypEd~>7Px4>%(KuLvS0tH6-J77A&JQ;Jx=AbM_;&5>E^Mw}G^#R@o6lb7M#sGd zmOTe}n2@W77Ix=(DvhT(p+L#n8sLx$Ca=lmIN$*V8#<2=Kt=-TT)V=-j$?73W!$VQ zfDG~%8%7Mnx<2|5AQt?nT7(M)62me`Ma0muow@UXP?qS=5qC`E=Myp4(_KCUT9o%F z#WRd5s8!lvTVUGOS`{8V8(%tYPcM;&j|M~VijVtqQx)b}#zTot^-WW+%*u5r0vRVz zJ1l9WQ5PB}`)*cb-D&_(1?b7>o497Gd0hq(LXk;M#rYAkPx|M#cT^_}&g52DO|Y}K|tP3;4o%LqEb zD6f_~jqT`I3GmzViPG*y!8uB}VVipK>16OmT`}%}vC={^=K1SF7m14B&f7D%Z{UuO ze>3#_<)kOl&2OU!b`w>HEja7pQiNWLX6_2@sxDIG)nR);i}Ij)tLx!6&Fk>ptecNc zgEvA>kKEf{huv^IA|5SOa^=f7QUlmI7a90rgr9%NeJRfVa~Ek&AFqicu)eT*1PRKX zK9pw72IX{ACq_djdfW0b?~3#pfouy;7_)=e!Pxy5gh zECTAtFq2bo^$s-f+zjqJmWcuPNxw3yy`|}Q;Uu&@$f^vi`_Q&s-@aSdwdv39P7;3G zUD7dUPs$g*>qbjle7)Hs<&3U8qdQm-@oUfB7kGPR;6MY(WIoMw`R;k~r)iDGN8Z)R7RWp7;xBo36ICPRW3?DB>+#<<=V zZ>{GUJsDz*F`PgGiIQU(yq7g}M9vVP$~tfa@bmglh|Keqin5=atxL_Nn$oL?Y8dZ% zLBQtyyv^G}p4QH;r)_0#2olZdN3bZ@0rj_v+4zz-rm4*kh9Op=p$eF$6v%FpjQT6&aZ$C1)Hy*_{3cZ5SK%zi(pTE%W#`H8-Us(+f}tJFLE64#8eCwrfM zXk#xlqOr0P96>=4Sy0w_D>LKWpDaNgjIO>q)w$E!1!#M;;@N^0^D+;#Xw4X}Vwb*p zQ~gc^mo$p1LIOcSvY^X|ugka3wxx2(4SCyvMUs%w5VWba5sjLx{yI%qmkY+-QVpfX zM!7jW4ef=>7e?8ZhMpTo@gS>1)XSMfT*%Hvz_EyWpPCehCDOI{zLxQoB;LC!TiG<( zc*bJ++z}o6l8oY#-@a}@3$&2_nJ_T@zR2y-_i|Cu{L5x*|J0SaFyTv`xu4xqE4I-) zdk7XJ=S{dS@BA}05#k!f@n1pZ2F{y{#g+PzwiYklNGM4wS*3_AH$`xQ2GUb~<#90V zV+^bj^N_#SQ*krX+$2JINoaBYtfszdWiruw3PLhbFqZEDZ8()igk#=sc|+z-w5u;0 zuMBY($&hGhVY6J_i%KlwvZlg-7E-@MGB}RSk#!FtLNXPU&mRv~{HL64nFS(qx;V|Y zT>gP6jL(OCQd!`e+LaQ6f=h$b2(jJb&v-mG$7V2ibwF+}O=Fg!177(crgzY&t&%UE z3p=)R>1;PWH6&6_J;d;JZ8XSh-kYD&MG!|p(HN91mQcP%5K9*z%mQd-Nl(+%;fj?F zYrU|5N~w~Ilg4jC z-!mxZAEg=@xz-Qvw}+u@&B`6r(C}^R9jGnCs&50yq<*At`+VO9*1M*JRuC%)zKxy_ zF`8ur1-mXnMqcOXu{9!XsW&Bgt9?sm16scB*`&>NA_ziR#`X2mWVqKbwSSsthCteW zO~n*iu8smHq8Ei;+QL;)Rxuzr2k3g&g&%CXPpTlHhe`=MeuHemC`hKVRnrqdmW8Vp zF@k!K^B9;w7NSdW>1jZF^hcVM=e5h6>rCNWd)X~RR?DmuG9;Fccj2?Wdi#p-+@gDp z&D8qRAo%Sf?gau3GnKB%VvlDKJKa^8H$_T(UeRacS+xj=mwj2@Y-0&BAZ8LQz3 z%lgvQ_O_5E0fEiYNTYxRd^rV;y}2HzvBIo?UvBKw1xf=(bxCj~3w*q1icx6qplc#X zZIz>WRm>DTn71{rzG;p{-z^%~1;j)rsyJyJ)8M!+AHyvNB`r8hm4qahp6kl_NAuV# z6|NOU>AjE|p_osTmmrrLWjqVJ}#d0;^w9d>G-`@-qPB@|6}W~`E4 z)&(Tg@SxN7QoE>$`#<6Au)m~se>=moueT^<%T8|J&e^V-Uwql`?om6Oj1&(~Y2mwm z!Ch|0^H&gh+(eXn@zr4YfDQ*2IuDhD`TBTxb$0$bc+jZ$x?raCxa@}WdZGuKHOz(3m$KObd#zm{h->p-? z^$T(}$8Ehh;1`+As!nVGObF z32)l0%cZ*y*~h5lhQ3%V^WUVzl2(Rhm7U(1|1sXa8cS?p0W7iW7SzkM(fvn-FFR*) zNcGdVA^J6N_t}KLipEOzW?3;olI=b?4GtdZeZ7XD7Ey^SOeR<|)F2zLPZ^33yEgl2 zI+8epnie4U5%=4YToK)+CM7Hg9RHfyg`W~Ci@V-z{fc-v;k?z=&XaB%^amm`D!uiv zQSbe?p^mFa7QCj#vjG?1{VaYBl7(fz>)V{Vtk;W{xi|OIxm9iGVB&y)M%XV zKzQ|Y1rj^d={1fU`+{xyCIkpN$#S86rw8P(i=?L=WT29q#nbj8w|Cnc3zRMV;_3ZB z0P|?`mKbFc)1Lq%iwA<}57P>-oP-`^hpNDjN4F+uZkbB@!GU_n!O=rk=VZ3F$@1OO zP=AUW!>_!DJwqS2nx>CYxD=dt?mshVO$2Bo(x zY#vFNDk6shBuIHOI7}|@o;qosQbvu^dj3~!892`UUM0r#Fls>VHA||*`MvqbJeR0A zVt~Rv0e=yrQF)`z`P(<3inZ0jXFT?EnYx>8vu?iA-BST3w8PIBcOMQc&sXE~5Pj>{ zU*;rQdg!tG1X&M$aptXlw^_K-P48egAC85dMe--AZdYnkNd67P3pH(;jPIGK_0E%C ztc44A1ky#v5fteHCQsPAF!)E%FTA%FG2X3%0KXAyLTaQiDrk*>=)+%jViIsNwSxf* zqKait4_|gYIAPQLKAlkhH4I8Lx16Hj#%!L+QTd165|%)bwTjkIu5bq~U}-2}6z%rZ zEs#k#!M(n)Ae)+c2~D>v(^R7Jpzg+Q<+s@o;f0sC`=;S!VXW!pD1DBrmwK#q+|~J| z*daZgIjCCzuuT$j^k>gz>i>XOKvt;f)aOpY2$*V-i-x}UZQX0R>@_MW+uCRAyMPdgiX$l+H#XM-$R-)7;Ux{;U z4a=*XX8Tprc{nf=v@tGxX|LtX2d9eMB8kEK135egFNP^jU+p#lXahn89%Q`#OLeA( zR;9z^;fBIc&{k1IA;CN(qE`=O5UYCC!{qX$i3BVGR$vJrv$S6+?dxeZ`78RI4>B9}}vJb9Vh5Z<1jb!^8Dr{m}0>f!f1KWT$okt&k z3{q6q>!=T;!O}>34Gxyn>71L~wG5#st=7+dD$+WZGS{F;ZZ-*Yas0~0FA#H@wFA`J zCjT)Rzwxgo-N$G$)Jyl1Z=LA`$c*aGG+0^k`_cr^pkI&|&%;D;-3Sk%V*5*pcu;|j zZ&1i;?k5>Tl@2tpq9M8cJzsRDcf5a{-!s)gy@N|(oj0Zz^y2moHP1Jy8rfL6-!n=o z>}uj|DkSjo$d>H6aT&!zGnmsu85eQlpFD+B;?$4N%osZre(eN^&AIvcprqPx-}hc`kAod<_K zAHcodHlGE)m8NL|b`t#0zeR-mXMFp;pIFz69%f0cG9QvK*B{rokkCM6Bc99BrLcPU zE1iw3rzj_>MD6W#EHLou6@`jzhVO96cwpQWT0N(U(Hx2}cq5o_dCW)Pe}3;_n^@_1 zy!j}MIB)H>deTvh8?CqMUq}CSt3wYN#Muk*mkv>FZE-DK)lNslxA#}m{T{X?P-L)+ zaBvC%O=Xjs+FI#n+b|L}nJI~P{S{p*E4V8^g|>=Knr(O8f({+-6bhVfU)#b9Y9K1_ zC#OkxFou3E3wBh}2-{_%(F?vEY)x>T{%&j?M;eQ{Ysl38B!89{yqhGD@vU?BTOHJD zQp&`g2-h^Xa#*_>pX~4BJk9PSNPDpjh*87c{b|c6V`#=$c)<0$8WRdrTQh|KML5gf z!uHN=d6k-{i^+QWrlXOrMc&E}eAKm(c6hqZK8mS_r>sk&*=2Hab)2T*h<4W@*!q5uJkUV^n)idnOOY=>M)o(H|0_s+Z?BMelQhgX<4n1M>2B#=ZR>sA19D>* zDxLk}+B=#$i>(8A5;ihJfUKvvU3>2ged_oxFdGlcl8Sg(Tt;2y#%;b}H6t^y7#_z) zvV0A$zLr|OJ|;nWBwU}b624M!SxH}N?ly=U=+a&9Z|qzpCImrWM{v+YK+<$j%O31u z{tyvBhY9-0-^Ix2=5dv<6Z5xKF0g@=H&bZBO(R$3(0t|KKA`vEQ0eJ+ z1KjKGrN2_d%Z-(BS@f6r&c_p`#-6*J`M2YdD!8SSxov9H3&4=7(8HLmmdTI<&u6*2{|w~O8M&2R zj^g&z2@e#wQk0V5wkQhvTm{|@{#nJnEL;3)&Or$uO zr-P<*yJ&Tw0rXwbFPFbz_v7k|^=dm*KCkL0&Ly|eBNmL0k7Y=vl(_l?U&cP;I@i=55STi)@-S4Gn)sYD0`4!?wYC~(|~em=jEl_hC1`al|vt}DQvFK z2hP3gvVKNlZS@V9qJL8zx29gGaX{OKgWw^AP~S>%I$p|3+at|GO9# z1RC0=#PZDZh#pj`dyuA-I`%>l1c8V#@G&D!o{~UZ_OTN#b!tZYGoQsBBpYvs4YCDu z$mEM{=w^f2c}Z$!jJiDSo3;hOe;+vTs0zKKquWtX$QGGht}ea}VmgG0 z!^j9+?JL}b2xD_C=`spHdU6gu3(bx%;#cvl=2IE&JJUZ7uRQ*o}$||UM1U>-E0O_w} z=w+LDN`?WEs!*6GOh#6FrpeyY0rab{NOpjL04LE)Qu(TP5Gz$qmqQSw>@bV_^`rw_ z6|o?+^K%C}=T0(YG+*9k4FT=bd(}M853$s4X#CKi>NEkJQGnB;7fc}FW8*~w`DZ+C zMnS}ErGB-rvtzDqYa3T{%9*iA#h)RFR3rfv|Evgw4>qvs>>~N{=^dZCm(vuSe;3xsr&4@t9R+p|pj!l7(E67g2C%vl>zSuVDniUnh*SWJQ(dOPqy5(rvc zFzihu+gG9{0W0AKzVp%@LSy-D_w+^qy>*C4Xu*75M?p*}IvDQ;#%gq~Ur>}c!&`;@ zf-z6<54fn#yy_aq?XQK`{N4c@2wJAjz%dNW!;@~KP@!sxTNkEL*}y)*TMtq-!-{=Z zRck9KtpP=_Jpb3lQI$(n_;(I8>=$gC=BZAJA#pAH$F@d}m>k0yA0~=MC1C#0=4!es z?n8jGJW_{051YiSICp_WVUl){n36n+@IcB$31!XtyH`xwoHjT%GGmLqwXpk%5)kl4S4!&2_*vQngZ_O_dZWoo-JOW?8L(Ax~`K z0$e_w4__3|?cN((B<}N#Zz+34cTkAn&+sS&j|**Con@GBsiD$LhwnW-5d;>HCq3Vj zTif2PvtP7YmbS9bO!GuRfLQkecPj;)Wo&Jeb9`*nko_n0l7dl`G?*g~S6{zVu%V=* z)4nsz_Vy$B&c&-cR9eUjq8bLe&)B)1N~S1Fcy!i^&$>mM9WSn5cX=SzmlCo!f(H_{caEg~l*Q!eC_~>( z5@(~!E+)uBP9)&R+s!(+Ak<~~!! z#yl6@>rVegYgcV#Emd`osD(kpU!p1`x`WkgHAQaZwDmja)AK?!5`zUE@~x}+WBI*t z^wB|-ENFP>-_1Sik6Jp2tr>=CLsL#uzF-X&N{<1>ipy*OaRK{xoKR>(s!qddv`IQ3 z^@u_^0x-)wZ;jM{4Y|<(>D!Qi#?RRW0Vz5>C-aOYB!3EeRN`0`XEvR>MT=X3u!VlQ zhoXeS)}@wR)X&y3A0zPiR=ghGbtA2=0*x3gB-(rP>rS0TK4~5;QhH14M!R@)0?|Wk zKxW;k<*zg1Lx8%YLX`_iB~GD8af1(V#{-B#GE~8K-eON5`!2Z;)_wUB_N57iaOo{d zad?QI9BU`$Yhz`J|0N#%2iJKLXxt9eQpADGy=Pjq&V{>~UXHFQ*@%rOC}eQ5+T=5z zR{HSE%oppwg3?rfm(z`#63Gdpk338Yds(ZqUQM!pJ^T972PyGMJ!I*z#F%=R2u<>E zpz7|NYQXHTG{*=cy!?M^0shK#3KxX9&R|7jf82x#;*SHs-u#7V+gjw|eQMKt)@u?{ zv)#@VVL458tb0v1u96ZB7MRZ@LgS9=R1=PKQ+C-L#wNmyiLIX-zQ^gc?wHJ3wDFxv z7`ev7*Kz3bxbi+Q0oz&khkxj{jsP-)NBjtlB%@y-VQ``~w*X~m!V*oRt1rUB9}#4k zT8n$93Q17Dpx@cO=Bk_x07=n&ox)P1jE7X3y>n(Vq#ALb7sv-}k*u)&N9ikNQmvCg zAoM+y`L^Dl;;Xgap8#@)o+34icnxD;jr@>HE4(2|x*hm2zeviaY@0m^s=_BOX|G~P z)lMC`LA$lv_mhL-T;8+DE{jA*Mo(Vpq}y} z5d_@K6t?6)KuyR->UAwSsOPzTF%kmQ1|U0)|3Y@UGtJOewY9P08Mt&gypl+-2JY}3 z)X`zwea#G81m9m@l*@rY8|Ev#5wIIJ@9X@kuY3Mnv@ZfKw+px(7!M?g04KGzL3Vl! z>?Z=7+0hctF)1=6S_{0Fl8T57(Kx7``wp z*7aZjkip*v*Igp5@U44e03=o#{xK2v5(IDDYwBF*%a8ZY-GoX7OQWbDAaFJ%opM!l zKi>+7$i2S0Hb&3RjzG>Q)B{@6Y1?F3K8Zw()V)1cupj>bOh8nOYTTMVME6&0`#|Jr0a^0c;9=;j=gTAozIxZRe+5k~Gy5rkNhceKo#?KHJi>IXlKGEDCQ!6V5-?qQyuC_MDTowo+6`@KI8_n-*><%d)!IY`16|Gi> z9M6Bze@G)$Z2*b>0u}+;LaP+UI8k`>l&u!N9YH$LDKTl$*uUho<($_%*JNwAo9?1* z7B*m%J6=+u42v%Imh@{(S&X>8_Z19}F*1z~QBa_4NCw%4TZ_9hVQt@`fAUzZJzB>8K(Na87u6OW!3IQ; zCY9-*HyD6K!+HXyEIzkAtVu%A)-no6xLoJrLuLQ0tvin;Bn0&nv4r3smSzChCshqs zQ7kTtLbmdyQE#NH04x=s<9iMx)wcLJpgf}T^aki_ut_tVuvbVozZQQCQQGS@mZ!n9 zQ684+UIoYyM(vG>#nUN8IYgFR+L`h8QjiMv+0FRVXqW_k)6r`V9<|0YjA0oz`9sjc zGSZ*s+tfHvb=1Be8#L^j$YgVQBGSt^avQAft&x z_i6V(^iQsVBhTVE_3(wHZdR8ht{1E)N+{mKKbnNEZpK#gRLs%&do>PIS?6fp)2Qog z2*jDmL?0#-U`E>hMH1}k^4zZ@7W_`s7DzJIvOXpyWPlSj)GDvBF{9RY7_T4Q-5;K4 zcNyDYfxk-@{KT7U#7>EYr1g1t7h61zD)eS%A~WLE%m3)Y_m|xEcbBxdmFL> z6TR0oKvv59Mu*H}1p=jVm8CUu+Aa0fw)fc-`z?anHtQmI^w!!ZxVThB8XVqlFsCJt%~VIb$>soqjhFVMytS~vbiOXX>w8JI_7xZeI-{tp zkR*HI2s{(~)8uf$n6iji16O%BV~WbsKhB@i?CE_7yvXKZJ}JwVBz_xV(Rch3m(IKdhWj#vV&UY@bDk<{zF{!Z8 z`j4NMpSr1&@Ynlde__nCnYtj^^$rBSa?`LL8-EgU>IchYOC&<>D;OH@RSUa za(*fjR2edyV#aD$E)RyTz@=JAdX*mMCR`~0iuF=nk`G*e5OSN*(<;48pTGYy_OH<0 z>wxN=8DbpZJ&4<(HLPAw@{}*JC#nd$5Q!Aa+X*O>SrlZz+YrgIa9ih)0^QL}97oGNgzP__B7Qj7lUNA^`gj7hmTOdR9|uE~is zZ9O$wceaUoRv~+?4S#|5nQ05gGJ3_kM^85)}RN_REaUr;ONPlSQGOYo{39}L(=nC zteCzwm+5=De_zwezz{U~6XkS^YQX4t;5jqu>6ip8l+|V5_A{PTWu7{8w87n;iU)jdo#BAW?Wja4Sb%R47UuWa6a{EXv(A(hPKOpSG~X z`CNQ7XuyT!oXXQxG@|%(y5coXN2NK<6w98bKao)=NwD<78Sj)Asd44>wQ1V-0+tBmxk}YI3mI+Q{V!K0K`vbw@!H<-YmShsTnC>84y7W2;kWbM|a#8WOZJW3O@ysMUTKCo1S|d z9#;v!+U`Sqts=i8t+LUcuWenbM*u-^C?QqG%$>zVdMS6PRxK&K`?0vU=Yqx)Pp&*| z=g*GJwW|3-$bxb=b1JTY(HCW?^A?fMsy<^4L;=|9L@g8Ms6aVGkDMZP;G=sst*^G5 z%P%^G(UReJUV@OLh#VyJ#YJ5%o5KA+g;$Y%7;zK`*_3M;OY$0|ojJb;`l9+PhGR>? zv4Vj6!16Jcm6HjlEjTskCjDyXvS1I@`QU$LJo0y5pA4)?JH2hDDcqDYU_rkuTlLy5 zt<6Y$ccWjs%+l1GwnnQu4D@sZo8-A?6(NE2Xmv?NSo(zMaoZ{Db^FM;^&+ce5?2;i z8A$TK2XcU!_OOG~Y&AcqWbbgL7OW6~vf~oSDLYUYe2QZ@FJnxO6Xwm^L85d~?fbmT z(|&J=hxj#Y(%)kyVLyCa-1^bWxO=rN!MbT`9N#0K2S^PoNiAogK>k#_GdUZfif@UD znO1S+mf{MlJCG6p@@tLjG+Pl%%!iw6`TmdyKpIff`+f6@S@n8;;09}XnJ4+d?a~wy z@f8$B_XV+mK%b04+!ope%_QuLpZ3nq&kN2D`M8C{#6B!yJpF{*4t%F?0gEKBnx75E z4V0y25b`U$F!8vfEKot%M4Wny{R?C)+v!VpORp*0+BNeYWHALqio9)J53GATME&@i zpTMEn9j369mrI4~`dH-^v^Q9TuXJ9YaiNN7F8@ z-pDC-q|zLGf(Mf4C#TWfiR#@R#RC=pF8BW6Q!)mmQh_SFQ=*}m!0<@4m!sz|jlf*f zaisS%%LR}F{y)X9ubOz%g>AuYOXUAkfarkJr%!P5Nr5kbS}3vM zW`k4CI10RI#!q-MSQh_h;(Y7*~enPA$fNs)jF(Q8KYGVdV=uIila_>S@y?0HhE*6V70 zWs7}pMlz1>Aq1&hZzVrscy8dc|HaeM0YMYCVg4{(94ut;KRA1A~2%>47r{O97FOE%rr-Bq=B?e*H?T8K}I z8B5xf6y%J19Lx>`ULg5hE>8ir!oJOBOgVR;= zxxw5S-qh^nv$wclbO91qZ6lSIfo&)>BfSn&Y>@Z=P$5^6?pY$Cr=&b`)74EeEeMieuM{iJ6F))xvP3zQ-= z*0P$UimcWtzhMN5sLPfZC5;y+;iq~0C}7J%6g(g7?)O(^MEiEnu`%M2+@p{g6YJlW z5FfyMOtim6JGIZU#>sKg9=G`)aMZtAqf{?ZS{~nEq6v8$Hs2`fZXBoK_5y={v_?=V zSceT+nhZX*7U+rMidPHV2kl&-^_p(5%$Go_f1S`nq41IL(N4e4z_DbXSEv?>+dY-q z*YjM2^!sNnC3KG2U6X7@0>v&o4&$$H7CvP*E5xtHipUTFpB&M)dCNRc|2I&BtD*UAOSY+V|3iA z5D}F`ILj~xTtuHG(KM0@2t^%fWq9_r=}d^E@auogSz-q8*L9J;AXUN&jpmB zJDZRKfW5mn5DdPJMDcS-5Z~bwvnr`tv-2nRdW9yBw+y8dXPZ|czp1TrNQ=r!=BJ30 zx|!K``9d^P;<+geTOhzNy-UW1h2h`7SYOq*KQ zNJ{gRV?bBp|J|c~_{-(9bI!N<0HNj{?Ux)P@Knu0BtRI^!ff+y%p26G zaEm;!aE1RvRbD78-p$AWt4z-ta9#hdaE5P6Y$x#K!F-PFoNzuB%pN)GSbE9H)Hy=x z1Pz?}l+~CR&=)uX01F9hlvxIyQU5(e&`-qp zgal-nF&ht39+8%HBeH+S)eY)gZ=2zuD^Vn#fUEEypZ|Z}^_J0kg&cPD`|_=^Tt@Az z_0Cv>v2vDvI6|0&-08{fh?4jGzBHrG~^envZ`Yq3ohdt);6< zd8P`(A5GbFc-WF3hhAP-as-^|%`688U!L_XPFwCyUBSku{C6!5?clpF&rXm&LL{hg z(2)B7zy9btu7U7NNvR9PiQuz0gheWJ&Hux1-O;?Zp<~2WxzqaX7a)u%xeV_Fa@sP6V{8(dz~w4Nt?yLOfIbQ{QH5{4bc z&Fl5{oC0-gL{_G`ZT#8u6WHVO_0rVN+RZ01NVr_^E@Y`@MPH#)^zFGL&CDJR%D<=R zs@>~iq|jh7Vn60d(8;82$UL=js-*FCo+&+TgHv12X+xSxfbhIp>n+EpIpo7~xoJ{y zeWTu=RTPf~5)d<}E5A-n*R9ni`Z^N2tC=7-NSw;KzdoPm=OtlAUGC4}8WfH#ywK!UzN_3zwRDQ+cklW*ea8-XQko42c%Kv*k)GT4vqCwj?!5KN!91%awk z1KaFno~jGpOgA7v`x~ub!m;U=Me72CGnePhU%!b3UN37vpiGIk1tmR!+iUP|;|t!I z1~Y~8XmMiRiPumn;v`!Lki?e2eGdjPr^n6sHYtdt{bz-N5&;Q8_@f9uEcO@dWC%g600x3e7E;6<(@}*x|f-LLM}LDvLm1H*i@X1`!HGzq0q^4 zO$$n!5GX@w>9ja!Pbw1;q@)y+!5&>A6YVjt2z-ztz z$4T)WA&<-1{Ok6h4d3G{CZ15++v`-PiRWzF#sNyt!*Kf#=fdY#C{~aVy4EP$`rFY) zj2_L%jKDmut2+cxg!g*vGad}L7jn`&VRUI9>8)ATLxH3%^j_z#MyI7&fa;LgtKPPP z6%(RGI6NgF0eAg=Gx9fOLLbEZeF~F#m0a!wa0~qL0Bh>~$Y0xMf!5++5>(2#V(N!N z1H}XZNo1w#;9q>s-;|aSZKNWIRZGma2A11hO5WN%xdwDrL#)(lEmYb3IzqLZ^W9mK*1HW^TPy_tc*WSAQhO6MLT(9G#vXEIAbW9_;$P z%Th$Kw-g2o%N461L7FWNGv<$)aUhedKon_F6*nr2k1G%efaSWo`yh@Y4zm(PgiM3s zaL}e%YOu)vCqJ+_z&8Y)CU>aiW~{`Z|1y$@;m2F0-v;54U8Tk2O5^tcEASi^n)W;SskTA8V_bJ+-+$$)`F&>LaC`uv9!uowZ-BCNimLBZl~}NXF>K6Q`lJbR z_=PQ$*ee#h294l02+dd6pOxj`R+eCWj4`O+llc%51 z5CSvxOmMyOmqIdR;?lS(cy`Wt?)vvFHnnv}H#E=Z1A>|$3&h6gPXsvLAeha?rQc%? zdrNXRu&1M$^{W1n$#qX(ib(~zY@e)reQo45pZhbFe%bJsQ*+l0epdgLhB7jQOqGM; zbB=5&DDkB~PpR8xaUN%xo$NZ8yGh^nXU6Z9_DI#YWLOa8r;sBqlhv1al)YjRA{Kjg zk6VA7u~G*aeuc@r;QV1XJ46m^Y)r+NGjm=BP-X}FuH|?@ut329#&E2e=_<2vWl|ty z|Es=^8_lTe#`@OU^DA+_Xq0yAkd^8+atWYjz}uY(E43lj7ujy23iqkhc`Hd0BC(7v zhNh=5L;Fg*m{mo6Cr!)e2Y;59J4Ne&h1@)S>NlaDhuBHLUE@)`Qme9u;dih(cwB>P zEEG-m!L;HtAa_n7YH;~#b+dw!ZUHpf%=*4vm_z!tXjZeRLi^#`RcoV?+h2Hq#(~&B z_u@0;G^gWBc)Jvv!AnEI&HbS0Yvy|&C)k{UvQ6nNt43w5?%Mzv$&oc~o#6}-P{k~m zhiDMq)RH53{znt@^1WWN0m^zTKmU|RnN6n2TH^^?s*sCXm4_E$k@AA&;`tFK1GYjD zClR6Y<>GR9IUh$LgwXF8a$?tK4;#U&)dELGP$nee>D$tF{mc0>71B{Tm1Of-*01D@ zmxy&oVA+Xy>@Y##)q5^O0#U~ktG5^uHerjZHnK2gtz32V7jm`pQ@UvyuNM%wNerS%VK_TQ(^UKF2I1$NA%bX#unuNEtMFOkxna6f8u@ z*Oz-YL09_{(yRAXKXt*vBUpXMQ+!xP+H7Ac;X6&WBR_u6gFEqcMA2XK|E>Xo@Q!GF zxwqnyQEG{+sAx;RHOFfoz$OV-6W)^C;p33aLCqs3tm>tiaiXyMvu#OuZ2IzZaJA#;-{4@=e5pEbYF@FLgZg8 z?BIZ&SXPAP&s%5RTICWk?stg-zfNCCdV{OqUY0|PyRVOy2zW~*va&&Q{>;>ZAF6Z< ze10JWF$$pe*^-ikRN-qT7tm8b*G1+xIiA8JWSdzxZmvB`W6Tu8B!Nm(KG}cQF@Rw)GA5>>4_PJCgb)zOl5iIAdz?nJY=}T1XwEpxxc7>B_lUd6d6> zj;=i^7&d@S7tD+IAk~=SY8c#vZq9e)FF$b8h2mi^dY9a?u2{8pXgJ<7?!V zhRpONs7FowvID?Ayj5feN;-;ZSEa2xnO?P#Krg9qvh*>iNSucg6K zKvP~nb&cMp)x*Ia&r@2*fq1fcKVSE|7^C&%B=%X3mLh$Tnp?g7L)c7T7?%9(LG|2QwC=xBW8fdPpOpUX^Z zq@d^&_>>vVrcc+G8XP??m~H*Waz@T-|tnDOmw zWXxj^&QB*01^aI?|#JbJjA@F;X(BKj4cpn%rN>bF+c|Hk#f(pRR-Y`HY|G1VhMe_}+hvY` z*)iO50bYkQLP;+VvsozxOqU(M=P55H#PN5h?&s3P+RxowUQ5liIA8Z42l&tLlJxO=tA_NBCoM*E9v;K6&t>1JB9%9p;pTkqcZ>~tQ*M22bfKh-e&GN#n; zW;N-Y(ydn4D8#eW)QTX4QnH;OMjC%08T(SOrwZLzkzrZZTwtXcua=C7%*RBUoYJ>(SW6cgeX-?d*BogJ=SK*&EcWzUY(Am37$2~0 zapduH)!s6c{$V&-it%)ML1I&7pRtnA-)x>m0xm~`DBAw z;Azp2fCe+DJ~vqEb?Q?|5=7o4M^e&<6IyjL+HNi3we!m7C4cXY06dJy%$(Y-?Eux7 z%Bgt!V`Fa9nZV23z@vYz_Hu@%gCJNwdBx%T#9AN`LZOF;3^a)6Z~&*>?diC@?Mko| z-z~0qzTrU(Zs~1;OMvp_s@|(@P6HOS;r@Eg)gCC|#cfDqrx^Vj%@lX@dK$-jAd=v? zx2@MCdR1-HX3rpSJ$r5>s%GI}cRZ^`PwaYM_bU&kB4%NkxY2zxvOH2RL*bosjS~;b zims!fo@Lx+$YQ|)r%|F`sTaQFH0fmSqWJ1f9k#|fbPQkL7Gj6H~zfSJ|yt^P`>^d9v78DW=`NKC%_CSGzXe9 zJWn$os%7iFUW1p_#wx(C7bZ4H2qbc^FYfKFN7Z^yUMsX60yrBY`^0k&*{U~HeH^}>9dWetFS$B3-MS(?zr1D zZdaDa8X^G`oN;a|SLdD~FEs~&}E~<+Zh#f-To1iP;p_E*gCMkiy z!os?V7`ORB#`ld*@sHmfo)r!gf$Poy2XO=>Yotj;TI0T&CM4a%5lA9QTZ7r5ESN|8 za9x?V4+>#f?-%RboS{pB++W;?4p#`qB(ZEruVC5%g~@qd{=1M*uaPH1?RK$JY!q!P zpF_!QjDeF!Ov$q_w$sThhJTr52jgx&n~U0_481FpdNc26nQMN&?ORq_-S<6~Z28K5YnP9kC#GSrAaI*cxmHC ztt|-R>QplN2kbr){IXi3%mu$1-eFs#(Y5{Z`Gxwg#Ct=~`0N4xkbZ*}M0 z9Tzr}6)(bvJToXKE433!g>Rcg`PEhd*A&o@o5>`vJe!YQNircLIpS#jP-1b=HQ3Be|89z+y_cv4g* zJlR{J8`fxFK*e6vQT`@zy%jfCGd-vC;moSp7RhAGzpl=LI}EtpR#3gtY}3$;-I|Ks z=CJVOU)J__)$OvfoQ+B_WQD0L>UAr*=aqQthazUDu-E*^DmUR1osHw&8qEwLK}A!@J)%+{#JZRrayUvI2uM^E`!?C(0V!Da;_WF>j|kQuVsZ6M zjlp9Dl_Nf&(?_Zuw?@|mDUkFaHhr37WtFSAkuWb{pAbxw>H8fStIv>!Mv8Z7!U)|c zOO(Ry6*AH%>!c~)c$<_ulrCnJ0D}^jk?SCB65c&Fj$T+gZ%e`e+zz7zQMuc@8TS)5 zz2(D^%{XaKIM&fmKC!&S_)FAi)n2Na+l+7PmCGjEHRVw6ti^;jAJ zQ~=3c$~75=w_8baI3NU?#cJ`!iJ{!MUO6?DQF|cTQOZ?wtH!tomWVgKEmvBg>CDf_ zxdQxsVILi$$92`ej$}vI;R{VDZH~!UjgCFQkbPb3N8y&MgOkywzHuA<1nwH?8F+vP zfxeLrqxd6nYTgkj-=vyz02zCtDl58X2bqvR%-`aduoak-Uxq(G!FKfE5Dfk*oPvwE z`NL3z4J$P|i<82D8)dm(Src`Uu0bj(N`lJyFShK0v(0e^Lz9D?C^|%#x;i$=^0@?= zd=o+GXd>n;1O|<|ll{-44la|7LkJ)>5*H~l3>?Z{f&IGqQO4ygh$)V*Vs+sfg^WU_ z&p4NWmxPVI7F@E#i~P|0D1W1?i_qcl_!?a^^UYj)=I9;Y;)(Kox^Fgfr!n}GsH~uvpJmIBn0K)6>LnMVf#_fauw4T_z1rJ6arvA<^rpI<^}h8*>oD#$(?Aw%aTW z;-kge5z}j%m%3F zD-Nr0XTUD%-`0D=QYNU;Gc1bB3_4@J(>u0aI2?;V3)-)Va5C?k>BJJpSp2<72b;|Q zE{JjM1e;7nD(h{ch>a2r6a^VC=51OK=R>c)Dkp$}hb!{18WgA02G+g?6oHGLKv}()D{kbqr;fcdWGk-+6pk|# zb%zN01CO`YGguj$mS?x|QfVW4{@Xun>o2hvhXxRYZ&~F61Fxq~>j%~Pz}+U*ejo3Z z(|)xg3eI2}{jm|;95()PF4&g}0!`iX61hLW0y%$*XWFN* zsp!G^a?(Vc7;Dl&`E#8O2C%|ooa2n8!PoL|dqSAd^7LuJ!@qzPp)@8GP)WSbzaC`m%xOf1@sfbhLiw zMp5;opc?2s!?WKRtk|DX`J&N=1UaeXTF7x31t1C=n$M72 zZVqtz6RwTY47}bh^xChz&O%=1GAM&`Trsjo?h8=p{`9TTbjB$k;uRjvYF;Ez+?EMa zAJmb#>#zYPMAY7@IJ=6b)gCAkz^JQ5svZFg63Kb6mQC@zD+xEKqOHa*Zsu#gR`lG> z5cu{ox+v{D-rN|URJ}Lzc!MOVNCD|d)HB4^UJ7{)175Yf{xmBx}suIe>1ZJ zy9H6XP1@CGY6#x2x_#mJ%3l~PVqrZTD>LH|B&&Q5?vugF-FZzHb9f$K%|0VA1qFRi z3wSiHh8v2fTL^G(^wo;wA(Y4#Lf*~=`pfcYjr;ZQoJwxpU~nWRZBef;pVeBm{s?XP zB@WE16rcMe&|fff3Eh&@PVp0{?!z^xSSxt!>F(^L*ljDXvr!VNBRMcJNZ;oUuQ&_i zZC8u<(BrTm@e`(c)wuH?cZ(ap2Olorno|Xy9`#iAPxr0ePcOBtti9d^FGut$wi7ik z5;&7bN;8eC*fK`zYgc;%lSkQB^|lSS2VSW1o8{3#GWNprGw+wE5Bihyte6rXR5Y;} z>@G>N=n-*cfnL&Rk`yqn9l=6u&n{jD8Cb=vk!qxqLm^vL=}-!vSty=_%@RpS@$du2 z?$qmQ=#j>+9p`nm?cvGM#D}*XP5RCm6BfETw|4_h(Z=hMU{06anX7J|zsnc}mt4uD zh-+h1eubx{897T1mv$*l=fMo_qXKNdJ}k!r+Cs_DJgY|-Io%I~)=c4a5%oxb z$L{!>YHGVdcI&NU8ddpM+=rJ~K_Hi#heG9;zgd7fc+c&RN|H~Z0}IDc(FZNPa^`Hi z)!4p{1=&Bc1KG$Xnig`mpO``T7e0a2PJ7;xBmCskZ7N2+Ku5wwD*I^*o&XvwgBIo4 z6N?WB#q$>iw#!bB@X^SLkI@X1}##@u4yBf*sJ)#;fxSFiWcjIWFL8i zF!K=fGn?EeLZ)a#tAB~&qbTMv&zJ?v+==s*W*Xy-g)`h6y9LTZadP?xfAyD1JyQSL z)t~BV2!sUT#J6r-q8Le)aDL5Hxz_G4B;`-|LsMkf^yZiX4{PYP!P&(h4S8&T-cq9qiPJF+D*bc*T|pFOyitkZgi4wN0*SX<>b-v0%&TE*_^ z4_hw0+!4PX9Z`9C4P{F)ybZ*zvphd8Gu@R&Bq&LV)mV>w>@a4#Rr=UN*J-@6&lrRa z>n8zW&FGaT`F?Z8JW_h-1F!oQq>q#YD(_LE>dtp@8#=WZ85G3);K3sj;g6y4oEE&R zawN{T&ih-;6$d_{IJ3jpBefCRTMFhxNB#5rpC&r(;6GyOBsV*GoOj+2tlkz6E0^BYPtsGuRAK7C&QCX{c3K`8Fz*g)8kVQ&5L7fhTj( zTOySSw9q6L%%Y4t7fF)FT_jsIY38qGIRd;gx7uJ>Dc1&84UWn7Qa_Tt+-ONe;VUr( zLu$*_P)aPE3{oF!oHT-;ffmf5lKGk93>Xk9P7}UZmv+EXpOsgepAIzVUD5jKvKbvf z>UUD1dU-Hdt~|9}7yYXDyl%0c{>qtkm&f$O`M|&ED%|8<0ny8lV6W%VT`~H&D89UZ z73fIYdFM=C1DnNJJ^G6%L`i6ck|(QSYh&sSolgs0=H?NpuunO4y|W4i09_S0D6*+~ znLWYNQnRxa%K!@2FLBCa7WnMW5?9WPbTY;jqBf`?kjT@F_oQ(@$omA5QPZb`erz0{ z@HFNj8X`#p8nl5#K(54G)tfdJOgOFL6#tfopLZS$}fCD?zv6{%Orh3`GKWY?n^9&<^n72{H79CD3 zBTz>T4KU#x8?A8a!c0gf@u85WsA51U-AvMz)k$kAlhe^!c6~IAbVg$u>?jqymWoY^ zZ$A%dBkCKtdW-oP$x_nN$YHQbwQRg}H0$Ja*re$sJG;wfg_vqe)C)l~1r~66cneR+ zL=yWLrnVY^;%R^D8OlDoE~sOCQf~m_sQV^Zv#k@oS4aEp>h&@fO9r4Nq~@LjfEFJg_j0Ip zBO;X!$;ZRgr0K*<4d$*?&fDH{K!E!G3*L)&BVlSFvpyf^%HjzV_R11$y%rJJgACY3 zT4jR-31(Xl4e`0f*e;Sq}cSMjkYs%Qz6Y)+7dYXjrQA+n$B zT+6CRUCYc(mtqaa#3%~?^tJvzKG81Nni!RKKpwIhJ%#5=pALc9rRn-s3wM@T6v(1r zDm`vcMh{T~L0hqv{$q%l3CO@w?W1>es+C!BWV8D#sadfNYDWesPrL$U8Oz;~&0EWQ z+pI;!2V(b2s02a2H?j6!e!M56^*fsj9Ix9;O=6Vs)|X`;8_$c=%7Qo6jkVw8CHI?w znB`ve<7qg|w}*5IHhe!)E|Ow->al+upG2;-p7+~CuKzgY0o6s`rRg$#{y1jl_M6=z zq@nDHLf8lA=7ws%Sk5+J6R&$ITa?KS`CEo{S#q14?6%6g2(6a7!4Wy{QVbI&5gcNM z0cSW|5X->SJQqb%OVKgRS!$AYJB4ApWv2N-QuhwEyUFCpr#pge+GIChyEUe>I<3){ zJ&vC#a@lvl^Gc;MaypWIHo`TZPa?s?!gxw~{=9B(QI~iA_q<=r0L254bAL6l>HqN5 zB~l<%`RqIV@+~5!fM7@_;gU~`zN%>4f{Ktj&r*-|1U)*4{5U(m8iu z%+{kY{^;dodXDVQ^Rk#Y8uFbGJ#I0O5seo{3YrLhyPQc&w&7nMg79X3Tmrw{_59Rx zyA%L$KGXh*6hXJs7$Y-sJ9FJ&9OqT4z-qUuzmzaR-JubSr*QHS1^>bRN zz*ZUKrP=Uw!Cs%H^j)ac@3#1W?;wSp!>U5%TtcV*j!PyMseo!e(e3NvmG$6MxFx-Y zyTvl37L#gg#bGVC{RIx$aCwWw>&@(K!}t;3;>-aeA|JXCri=t9?OqAn91AlH?8{`u zr*Ey&;#6wNQ;>z~a=GL)UkVej;*^wS9+_m`F1X{sa<=Asn|D%kCkgu`RkOfq?>HrK;*?7MkHWeD}MW zf~CT)pu*8>6ae?*1T>R^C?UW;>>8(oQFXF!*ARtnC; z*XH5C%D`86InHB221!;&n&ioVt(6F0mu`~Z_00`aNX7$R<|TG&+7IvWEl)Fpx%sDx zLSZoD#tu^wVzCJW@{>~OVUjaaCL7P7cneaMnX^f!z9=Ie7_p>7L2Vn^U5m7rD=xMC zMAE4{=A&pb_4oEW?`7dY;6W>}h5KZbjvvzp3oo-=q1m6Xp3Fa2q;izjV@8DvHxK;} z{-clY5)HDy&vREAOZrZRAvOFA1L~Pj{9tf!Iu-P}-pcV{W-H9iWhKY%@OT!E!Y)qr z=qa}WEVn3*`y+3@2Ii^)=PF8#?tIA27!3;2Qty{}xmx7Pg2)$3yp&sMByqgd;?$Fh zkY6m35j8X6Oo9YsxQ#C!fDR$h5RXZdV>O;aT|FR)oBduj@A|TJq7@rGypI4sW4DL1FsRUUMi+|8nxvA zhjz}X+aT!-TJdCfocNIMEc&y^#aa7H$Ht)ADq;9CM48oriU*bupHx6L&CL^GCZQEtZ6@`)z_L_DD;w zxvMeTZjAd^;i=?lz$k5LsrW=pTR5`A{XR^2rq=XPq%|%f_5+AP z_`kvh!XCq~Mn=Q=P5iFC$_k1xQ!R9NeO;>Ivgrkx$t9#9g-*#b8V5)2=>j03M3U_} z&13C{;nRi!kW0qN%K7cs?cvCB>@_OOfsh9RTJJFhL}eTRy3nFieo5%Sf`LN}O*Cms_?&olwHO z#!=8<<@#0cy(hYF%YGUk&H^80a1}%_OONn^27(H1gds^pWxRDv&>zr7=Dw_}K}_09RWRwOFptVWf?Q%ruJbPfOIP^u zU3h!b;&sf#CR<{^D~Now^{(#MhxL6P>$8Z|gkF4}4`lbC$))*;$@*zkR5(B&)1ya) z>Wr=L=EBO$5b!}^N9rA(Wjc~<JPwjhPCx^`4GrfV zPuzi`qek-3FHLQdu(3>_h%@}i5QM+q0jw;tQ=s6f9@%l?HrAm*l{8@c&eX&ccRq^Ez#t(=31YYsb1}`{jFo z{v6j>35b=RuDy!F;TQcYW_I3u*K{8eqHQ^&j40%ephLFD6fX5LeY?}1F_&gl_jO1J zyX17nnUbA3Xvxh(>zx**r7l#&6k2%>h>IOhs9XOA1v{5})JMu!yC(^Yc0$*F4wTpQ>A9t`s4Xmf?o% zcDWX(#?w?5HmX+TvnnDIt@+Lich!`XC~cU;oNf%2R2+ z`<2D2SlUX3S-JFVmf->Pm`FLgpDz0=LDQ$VI9yf!P6!f7ppJRAFOD4f^0D_53&Y{q zQ9)U2_4>1H<#zit*k{r35AdxMKRz%+cQJa;b6%HuhCh>{oS@{SwSX`U(hG5z=NH{5 z`6$8i=;axOjU$-iCqZd0S@IHX-CxhttK3aL?x;(wn!N{+FxLGyWd+T&6bU|WO$u)}DZrl8LJj{1GJ0Jx%J=2U01|M zyu-t}#EaEKAYe>q)ok_9UhE5RI7VU^$eT1Y5Bny3wb5>I=hKZtyT(m2{?j&7UxMzp zX4R`X%{+cnr3_dQXuCI|U56>hFDd=>H`0*D8aZ66*)zl8k^G^DA$&}KUg91tcj5qZ znTF75KPn&&mGlv`C7pOLxVFAv())X4J6@uuDqCW>s1b2bY)=H>rlf8Irx-truyejo zJFB!5??rnM$5}`3vUDG}&bx*h9A;gluJV?>Lctlaav0Rn6XCYazI zNTk`AF+JnDl%5I;wVg_N{r4`EB59tm8(C7y-!&5E?;6PkB@rE`kt(rBNLr!DzNl4Q z{kR2P{=YFWAapGP+a9Tarv$iV&)c$N8s;8dG5t*RidpSJGCw+_!-9Y7whITwt=fP` zzJr8*x2$B_I$f#qOXY@?(nmX`o3S zumC#Tl*L-sm$3I3DT#YtUpu0}Ku(YqMVIUaVv)EZ+-~%vPlA+*_|yKrh(AbiFuSSM zEY$=t^fbIjED>a1RBJO6jY>!oqUg`8u*z?W!pIPvYExm7KyI81O*R46ov?Bhrq7ib z$$J_zBOJy-mF)u*8?@YX?t1UHpflB(>uwxn5!I@J+=KrYKracZN@^RHF)0Scuunom z0r|Q<(&nua^cP6;3Tl@FaBE(8z^R`$CONA9LJ^3vB0eOD#=!n*4#z$6Iwg9f^s9UW8V}BE2VL}@%du+&_Oi}b1>c=DqzJ`ZtDxU zTjJNSLUZeC+CFrigRM(W{W$p_q8PLF-}Wi=KxBT3?lj8}tYW;8I0X4rGn-odT#1)^ z@m-s?1r{pE6kP>$L0t<-kR{;<(}VcJvEnDmA89}ZOn>YL=skqgeL{w5q#KJogJdjS z%_eTp-4{7|7t)^x=wk^f!0q3m7#i~Q7AC|cCC$C*~#Wbu}OEs*I@C7E?wGFCz&KR z;8_6Z;Hqm2#&8|!DjJ0GvB6*=?`K7&Xy=YFh;eiFG^La~kGKzS*ZRFHxIiKwbF~Kck zDPhn&F166|bT7sQr7GS2GGn5T(E=htit3^D^%K9t9S+v;? zQjXli(tV*k>*nNJw!a02^P3x>fUqdf9Sv5opRePkNB`kq(A%O!2pA%#(>^#@ zzW9Pb-a8KzS=}a#kyjvzWcM>G7Pd6rY*PCZ>_DOcI0ZccGa%k%qvIly?q=5eKTB^D z$^lZkNb+Cu;aNgOjgQ}}VW478coVQ$%PNij7>>imLOYhGhBUH&73WwBCB0$C`Am;J4*?_&(S6mSt;>yNvnwjMk02A|4LB z$D?H>sA&M~CHBjv)%yX)NlEq3WKLWttR^JeiFr8Gf)&^J$S;@ky4K33&E&cVt7{ZT zdt|3Jon)NgL&|cOZ8}Z%;Sip`1*ZmJ5~@ZE6uijmzjgB3e0x6oCGJMou%AKPz$VN1 zJu`~i>Gh5&{ljXRlCTR-C#4#JsNCmXIpp~pbOr!{-7VIZ(uXx{6pAD64 zwkFBrt&15u&GFeIeubm0hjW%R`&zh-#AAtd-gD-S8?kg6TNUu02dA|XHgUI*(UQ); z&l`#w*SQ=)s3@{>ZJY!2p2L;s8hYsp+xN!o3PQ5vbtgQr6IQKX?YOg?`71QyfoMjFink}XKU^bnR=u1;)#l5d%?}KP~G39t& zW!ScMHjK1pLa@Wf%5z2R^+^ipUCy=ZpNfOCr7piPIw6VM?4tuKkv>Pt&3rWN(<#%l z#nM2At}7kAMbXIFh6yo)nb&QK7c&CLJ5J+{|8_^G-R4BE-fj-^TvvP*MlvEigH(s$4cZOpT}?xJPD1ET5V!;`Bq zezLz@k$RI;hR)4PD@Bx^p>vS+7yyt=@nT7PMB4P8-uk5rqArC$s=lDb7u6Rpr_&x9zdq1t_*e(wLYCS z_I4hfb>@&xecFNq39$yx95kJdH8(7n$kV+iG)wOUQIk-y1Sdi8t&bOA`pa`RdSIB{ z`$Y9ha}u;|?p)|Qevh;-nWY8#p4)#~I1xx2a<`DTOkxf+>8aGQmQM|qkhYb(4Y_`F zs5JAI=0(l2Ut1bU5KtYC1x_|T#IvS-o?jJLI}{O!gCO56 zL{UbT>hLUfnksWayt;l=b)rg3Xls*xe@2)@uJ;9)%OSFR-L}(@W+3$sxBD&I`lVjD znryFI{)b8tR6~$*t)Bs_51=zjj0Jn)xCA!7eFt}6|F(IDK!1zAy|SVC^*3~Ijsd;} zM55(6_JydAKE9Pg{`j@|A!8GW<}#8hWxPCH9$L z$bd0@dgB7IZrdGqgGh^(D@8Z?PWqsjs|2Tn)I^!Q4Mw&=lxMfq!U+B6&+m% z4d^@WUR1uT$hlGfMk)X2n!36DP$@)3m(L=YN9;3PDWY&oE>)G1Ctih_tg+k7%!*&< zvk$HY3uIi>$OcEo-gCkmosO_`lG4$&6}et7%~kL`QJqJtKjcy{bn2hYAgs|!)^YxdiT zg%X_y8$#QSPtB_ymtKEr9)lKsj0d}}d)?^4>uU94UPi>(gBO)a<(_U8UG}?i=aMt} zLhpP2tVdOb_UzFuttdc%c+2Fat&4<$)ZHk~wtzMoM@LCfk^^2^4JFyZj?*p|B^v`L zZ{MCGeh+9m0d3?-?*v@|8{4@GE3Y)g2cO=mN*g!L3UpO2f8Z{uQy_}2V= zvNf(;JdRT5ajABR8{6aTy&9^aiL@%UY(HPGH3uj-;J9#ALBUQ0~yTF=xC43)Ujw|DVpjGAxc@+jej#SaA2?1b2eF6ChY{x4;bU?hxGF-Q9yb z!9BRU>zkZ&?!E8Y`|*Bte>2}yO;=ZS*Is+=wYHqrj{5zr{!ac|Ls9S3{@t#cimDDv zxNkp&FBlhRO=5P%WsYvZRZV_~A~?K}UI2j9PZv@e@t$zuX^^OD9R!VOqKQm~LaeE{ zf83STxn+9~PgJgJcSj1TQW;^v2udNS zu*ksl`&R^_QLi=N*+Tn;-BN*I;iFb+DFXn2gb6I7`PxdkZ)m-(Ml z+;ruQmlH)(wAN4Qek^r8W_&CgmI=)h7Ywc}+Sm^$ID)=h%=Ysr?GC^T2sD<<0RYsz zTAVt%9h*xvQpC>e24^QLus8svQqOx5!<9DM<_Z@#pGkR>oN%Kp(Mzc$8<}D3M^#u% z=wCx}6d+_kIMg^;QXhb2Ps*jwu>lM4sh}vU*8=Cf{}cu--+gqsT}sL2`#H~mD&{Mx zFvL8UCiOQcK?9NOF?CQfe;a_tfgT6SF;ju;<3x3iLa%mQgzy2y&42};>9}MvCXn;Q ziIf)~r^1ziGDh~+*2MugY_RQDd`vmAE~n6zg;0o?&!rEZfrE5E!tJD)Ly!yj*s%9 zhZS~!Bj2}LE-jsl1iK8MvT=FXL4pUn`OTV-1Qt+TaEK#>e%AJWoS^dMS4eLi&ij2E z&9JF-fO>Y!R(divaDU>IK)Qc7UWy&Kyhh{uh4cilSemJMlhiO-IRkHI{uPb8sHLlA zP30%1(27uMT@!oW^Hwr$V#?24`;(YeoJ@QS$C2DXgGuVfD6g_|?u^g3?(wK%UoJEU ze(j3E)mNSb9f_v}{-vHvG#*tUd6ZSH)5 zp?8m0+kw-Zz6o`x&*c^-GEv}ZySyh29SV*=e?5?QDv-Ls3~$ejI(|%-HO5_FAO&-` zKc**iFvB`PDly=$xV09-a0R;DX()2x8S#Hb11pv-d^c zbKPmx&|SMwVN{gU&it@E>us6lK`+iu{`s0yFN=mAi6Xl1&S1<8(c1=?UQ}&USb+v7 z`M3bx?UiTsw(2~FR4!l3GUgzaMm(P%$@HzgtEuwL)}Q+6K6##)yB^Mtq!nHsH4Q9e zW|w5ZX_k%uSTmrYmr)XJSbs%}m7ZjFD6yh`xt59R_1za2bNro@c0-N+XktthmZOWy z8edUmV87bJ7AXV14b!09|5(0vu*{ezfDxaHn z%THrBO%{2%RwES`gH%;$A4*|Mba#196&?vm78Je|Xae&gR12k8Gd0@0cy z)PI4NY^k})g{KWyOAg3=t1-VX3Lhuo#sDCH=$DU;00s_lQvNJs?rw=yH97vS59s^mPf$|+#Vf0SzDoU@I3Oqkk+)Evz$G z0t;xQz7MN}Mik4TtqXu3G+_QnQN<#mwX*9T>L(dJzDn>GlZ}dBTX3Z=1R@Q#c?b$! zwvWMZ7XwL}PD%Rw0^d%g;5QL(x5H462^i#2f>twVfS1@> ze1hu@?e3OuVz*q|w`~Bkt^a@HkviJU1FX;ag|t<)lK0SJ0vaQu#|^vhYL24vw?_D< z1APnohu4D;(A5Yg8yXf4KE!{dY<5A8kLPTfi{uUIh6X=M=~geGJKtmK_v$ghOFnJ( zEf|rGjR!0O_z}pMDmcwt$NmYDJIRM~X!WaN<{vP+YUT5A9B>T#4?+gb3Ses$Y)0R? zz13XV@0-O}hXOi;R2IjC7sC|k$B>6tD{meOGa7XD3N7 z$q)l&Zs#sKBoIlHYNkTdIcYA>tT1JmJWs4{kT94SsG~`h?_9r18aA%hIUDSaWw=k$ z9{s@LOdFd6zoXwLIp(n-0X`*)DJxBz@B{8h(YF)J=3g5|)Em5S$)P9mK;$oEDE$cPRLUJMQdiYvW+^0buJR<%-JBHxqAJy zw{>NjW)`8gpP->1cP0wI#?7KH379@4|^M|_#PLAI1mzporRyltb5r{r? zGeo;zfX*V)88)!m+FKa3`@!-Z9&Am}(M0E@XInMxbp`l{Vzo^4y=AI7;bEcpmE(eD zkN`9nTLo05edog}%jO8DxxED62@ywGc`DRYiU4e!y<>PXr@poqH+gxYx>2gof^g+3 zi}etFTy~s8>cpgrR~z*;Utxaozz(X?;b|-XQe#r;3mQihybwwJ0dyV!^-oAjxlVFgTaVg2poW?YO(OC(fDv)oNy1C6)=lemTe zhDw#A&;=2?*eky(x4JMAE�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 z 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≪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%0Dykk?~pPJ0v+!%#l z)~#zNTAGhs`irFo1bCHIoZxKR7D7=P*4NL#)1 zDYC|c$Y^kudu8jv?PSAHEmau%y@jE@d7|qLtw&goUp;!<8HS<WH?!9x`B)Y~C6+dIc&|6Us}56_HYd&Qw{ z5a-93xqER?*3X-FXOq@q1O+2N4sHVo69pZ*)z5iq4052i}sPY7d^i*|0K}AWLlFUZ17ubw6S0KMJYml3zy88aGTPJ zuc@hdav0)Gl2|-swL4oOy1OL)=`5q!Z2{|Z)}Uc6H1D5bKC8cTsjO-oJb}e4qxjiI zHpJYef%3|YrtDqc;%FDUz@^9+thYI%RFam0 z0dkH~dVA3LF73qqS+yetX`{VJDB91)in>G^mm1?V*V+i0+h-2nhaWJQ0I?u{?PB!_ zaF~7Sx5AFnFT6(Q;E=ZDt~}wfDsZWyD=x~;0H;clsWVhnuTkfbK&d8e98b^kCttrV zY9lZh4>HP$cjrDB9a0EHk7ZoAufZtKHNAzPZmxA$L9$oRIK?J+ZG!j0FzU1o8_Q16 zr-IkHdGkSUk8Dgy8PM&HjvH%A`xipbIJ=RMh%bL#t81D0ENx~5ecxu^9-nejm z7rLozjnexP{H~-41!LhPFZF5Z=DLycedoYn;w9SPmv5Wy0n6gJtk1-B7i|e-tB6c^{qHix98Lo6`9tWjM;va*wyp4hp83mq zv*pw?gPJZH8ZgKrg;~Pja6FjcoIi@7Sv~ECKrV+O92IT6y!o?z=rT#M_f!o2Fei&m z-@wI-<|6oA z?asklS__wS(alejY|E_^Vsy11t9Pu4zek(*&&t90z8sH3r|3Cwp{kg_i)S9VJ)IMK z(cS1htg^Olh^s0ZMKP45XWS|iNb%R?p$Nm|eW2;iLVTTjY+(m~fq5nLYKK0#cT!Y2 zVlF*wmq6z05c!?uS%xNPd2Ct1W7BrOG=5r}vS?f*;kM{ZGZppAdOru)*O2IKBf^I! z8IJ-dWrAFeg!v$-0Py7{K%vPCO*Y?@BtjLkikU> z4`=xDk5uim%niP$OFS0{<^XlnQr^Wu z&0DF+5tbA*e0##SwJJ%bQiv}iN5J6WEE^Ii69^!Y@>Vyw$kpjwNvx$}peytI2}ifu zSjzS$BCi&JDw+G$acHta!AgF>l5Z?QsP`P+&c^cw95n zPCz?gf+(N|!`uWb_Rv)!iirTUXgs$>jmFhmILXL$nV z4h-w%Oie}+@3%wRR{;Ofw!?G|@2A{k%zme6!_B7xRrCbhNpMvxQ+`8E3eM7->%pB= z2}0WERUVx~uMoctBSH{F``PI#;c@axkCQ}25VBBk2>kJ}TCYAPGHKnT2#S7-qMVq# zB}cX8h_?U`J>o+HtqOFP;qZJ8A?1&&v$+s6^#@R^w`~q%nAIph;#4mgUE0dKbsX=h zIEnNAOz)$wUekQw?VbR&w_+VG#okW4<4;@#Dl;hEd|sHkBh#hu+f>&rE_A&n#(eWw zdE{`#ULG;(0J1kxxMBr|T)3+8BfB_An!L0hCs{XALUrsIAQg5;7}R`76rBEvs~xNp zB4vZ~Vg4&Xu=XXFARhNJ^EuI=a9^8_-$k^;@Y4OIu^}+fGD3<+p00@uj1v4Q)!HL*8bSn3(B^7LZwkBma^1Eny3EGQ1z)!ZCC@WyNOz5#fYIq*+$Xvv@?gwK zdebXs_2f2>cTfrK0H4)yCp=2JL6O*yN?z%4StZU0@a^^unE*vTv%`!{3>*wX3`2Ci z14Dy>cIN4%aCnT$lN8xW7DpB&BYs2oZyvvh>!$O;OUVF z`}wW^G0l&QjK1RiQD4|+y6xDM{sqU^A4%tK=jf~F>z={$$RAo66l?jBeLVuI{ZXjs z{TLnYXIst`Nq7Uu4gyXaF+cuav?zsFZ$2qbm{K@RSEk>FQq#tVDH&IfG7v-|<#U!q4FsfQXBxmm5nuEl2}Iksu)t2wRa4t92=f;9+U2@l zC`E$90|)SzNwKZk>}sqn5QJg#H)i_)BDpPQ$qa$<{zWofEFFB%AXO_Y_c?EES&HlG ztGtIG=zB$yo>eCl;Z5A}I#xLqjQe{rAH?)x0eaF16iY`KxiAkJ{P|!(v!_h%XO9>h zanKtm&+LB}_w&XMy1s#f3$B2fCdq-^_w=rv6Re!8wpv{9ud3MW!@v=o&7tT|e~bLE zarZ(JKJxN9BkYmhnn}tKR@&vo)ucqzYjaFU>M{QCAF@RNJ@>advmx-k#KAa1EIvUS zd~F$xmU1XjSMIpUrn~6+0uRWKvB@h-bOHaKMX_xATamx7{k@PvZe$1jPj`P+-2eC~ zxUdI=FaGN$79*8a=)Z1I;sa-wz=(q1X{@WN!X5}m@=Ax0AlQ`9(z|xwiAag_pCh7P za*OOB377tra)%rug&sWZ#@z7H^Zw?gsin>8N>utYJTe^8|3oUm>>0|bL=HM0U%-_z z>=yYwge*?7TGxriYW{g?nI)CuU%AiFz5n_gHY}gfIPk>K)I!OMSoxA*9TrJ8oAZP) ziwO*X6vpDQLm3F(>E runZW)8_wLkw-pOsdjp89Lna3vHAOvssFcjqwN{xe}5#L z2EkF#>)&thLI1tC{+IqKMV-E`?!E*{n|BRk+i11FX;*IT%2;0{6!6%Q zO-HRm9a;Ta_EWGdTeR*AK~P^=l|3;anK)R(p7+$cGf8ssOL;u;VR+D=*|1Q+yFmKa z!;(0%>7dR%FO5%e#h9HFh2Wjv$_IczJh2oYoXTyo|wK3Q!J^y z1|2s-_L<(`9~}+DGF}TizR#q9L~-3EY};D*^r|{azQ+xl?#D`H<=KwQkvvyVUP@2j z6H(>yhy0OT4zdIElo;#&H%;c=W`Z?_>mM046W$a-Clq|-FZ-Q5F$D?rGMZvO5nUwW z&g@$Oq$f9%fb1e~OK;_B#nHmmt&J5}{+NRJTT$vN&*;zR-|_(f*=?)KRb=4=cne69 z_Fj^#m8&$AeLHIOe zOaGs_z5mbJu^_@wjp9Lgc32KI(2#4!!eX-z&Eacc0RpvGqs*=HmBJZs5;Gf z&TaHCCYRw$u*rS6UDZPi@_N&aQ_h@lI6XZ#)}LE^)NAY_LjBh6vYn7!W!}W?BK!;> z@4xJuV6Fc-?yJ>olDJWU>!y#z;d=U3!bo`0+6l_)S;B0(w^Xwq@v`AT3;5-MtS-+* zobJj_Nxt)Ep}M2v2Gfa@Da=pzuHnrUm~tI(c%U;n9=lHb80xyqo&}8Yz;yK0J+93G zhJ{PL^&0aGuHVX<1N^0Y9*G(^O9|kfE-F9XPsc7YPXwE42olq>mc;^Be5R(JA6U^v zl{N?&uw3S8P$dp1FkBxLems!l2M6>ponKh5>*`4fML!o>2hN=^S3X zYo&55s^)T1le?;OFCQ=O+bKg~og-pU1(q!4`8ZXFI#}_Eg(uE7H!@L6PGNjXz#>qe zX)38=$A%HxwRP3DGw_LJ1@&AQ<0$Zg{NeMO$QOUh?X~Ww`t}%jO@HAWtL&;n>(933 z196Lu8O#gO@F3XJ>cQf-RG!oJ-J!L-I6CNz4Rq6~Aa8G$)>ieDX|Hwc zF~PlfVacoXvZWRZN85*qUQ zc}x*uY~QL2D0NTk-v^BU>cPOo*c;O2N>${t5*iN-b363rxNG-n7Gdr?(Ag{j0KOYi zU2g0K#)&x1GJAxEo-}#}j!I6<*p?VPwMPTAJi|x5J-vZ(FEuifNO8CnGv~tql#}QJ z{H9Fc@64r_-k^?v({p!cM@w<3D?*Yic{P*cx!;G5ASyh503Pk1fc!xFtBlwXi{flk zi0{oO@rtIvrS=9l^+BxWaA{D{03Ep&9a(*nj|>5TvYgV1b%KJXc#3ynwmP?41`Lxw>z;n3A5Z6&(~wS zH}LTDK}lNUud4Vc*1U8%D^rTwdPtbE9IW+yhKX1kR8{o5F#~@FR&MrSwN&M}m7MQa zw69R15;rfOPo{KN?=Thv54w2`;MO9bZJKsIl~oszna^Af^qU^cAF$V^MXmowrXS(< zRT#qL6$fBO45GnKe3FFQ=o&BYhzMo=Ra+=x_hj1G#I*ehK$-5sNCVe#nxi}R381G; z8cR112IygP#amz>yp?*A!w>|${xjGROmw;S`WWHssyFIP&x$tN#h`bvDTWg=48*1G=|N2p7~Ptw0TdXe#+PIQc-}*Fo-b|AL!l;9S52z)$`Lr(zZNq zFNHr->lzOE4VMuGtiq_!6X8OPpafHK9(h5>u+R(=7(aLMwVntc=f)l20fehAKbQQT z#f=WxX8{mRPLA|Lv;IRKZ>w9f=)sD+-)4A$HD0Rke!^Y5b1wZ^nZ`9)8}E??`Bs+s zm8xkyL@w4Vw*=75IHsx&UCNdMj_F(PK8tT)!r|j8w)?COqF!uT-D=fIvx*t1PBni| z9BY4H-&o_Uo6jh*oL*7XiHl>3lKpa*#vRal>f+dp+rLfqeK{)iWEyX(coY2XWHJkR zJ%#&9plhJ<__CCBcOxM_&lov#RJ+qK{M^n+uHxM_*&B46+m!8K+PZ1QBB$2=$QPbF zE3=#9aE|z+tmp~1l#d+6FJ904lb96*^jStu$rZ*2-)f4K8g)ioaOS(ul&2rJi$OGS z9+&gfa)*JR&dQ-Etb~$M`^(KPPbe9TrsdWba zTPmeL`|A-#$D|+u>#e^Xi-1>#e z+91IwQvU6GOpRu#T?uwqA^;%xpru}Ex2rgqrrP!zwg$JI;9s4NShfarKyZ*a?|7ti z350jq^x~9i`LLgW;q1{Ms;!W(FFi>ah-FG_t4n{bm zjQfB7$$y7+|9c?#Qv&(F_WZjje*;0We>DVMB;o!dxPQ70bdd@Gq2K?y`AWqZg%1!u z>NbiEvM~OBDcojjI!( z>s@uAR;O_$U~yW#LtjSSEyYk*vN4OX3IFh8nV?QQa7;;jRy~@f++0BEqT8%C$y%>? z$z@GZ5iJHP8oK2p@84I2psVo7D@_g68@vH)v#-)NtiMkj0o6LiER^~O!#ar{(c zCcD!)b_0VrKf3JOvB9h>>%VpsTl~jqF5qi0buHx7)Z2B(>qqcI3uaK?JLgNf?O7?x zGoJHIVir*N6RJV3ylRFe#!4VxagG3+CyE-Xrd zVvaW7fG+#RFz>nZDjVlqcq(eh(dYS?=@hQ+iC~J{59sFi97Kb(quX^_Ul$n!!l`n> z{0lZsS5%>W!t*dN_K$z}$e3StV9nXCK?T;-Uslvk4E#${1`;g?PFrDLbkRSV#DEDKkDS!j0P!MH09TQo6PYV= z5k&!oobedlRvaDZGMdL~B-U6Ati1bXAY}8DMc|Nt zA!($Zc|1__dC$4(}!;R08X*}gsXcNlevG%(?Pd|9E{F&36 z)|l7=HrqSneV7H=s% zWt8h3RGkp`d|zxdQSuO4KV-4uYThfB^|GIfE4IO@cbSG-4A>ip8`tT}Cl+3T0|y=3vhFLvU{Oa;*csy@ln zXT~&FE~u=E62e8}iDiaBWLqwSfxeWlF3^+5aaV_S*f*L0B8;d?ZAt(JpzO54EUq?X zd?R7MKp1jY2>u|()y1JIDXom*ksF>u)f&6X=?BlRT_b6+=ITvGDGs3e#B>XOan$bS zawnG(0-#6DZdE;s6yU!F{Ji`YW1~~OHv=fN95(Hqq(_OfbSaI%I9KGY{Ib)Uw>3LN7YYEHR9-KKcs~)XbFdS8 z2%BM8tt@=o`ndo z55a2!;_cW>{~(BX?4&jLKk6M+*CD?czs%o=#<0q+fzkp0=ZpaF+YJ)#lkPj|JWM+C zcjm&YzC60xL0W*KC4LG0I^*{1K{q;xIj_ZAAann7(9J>yaHK1KYjRXEyog9>_mxWk z*vpYy>+&D=hhCqJ%x5<3Gb{k*^@61BZ2ft4{&l6DCU4npf2OI69#`IM767qn zIaD5k)iFZ@03==yxb*Kf6T(zc1ciVWK%O1K;$H&?HrzEKQ#t0+H&vBu1ha&XtLrUo zKIUzXU+Xd6lF2jn@eC{m8IuIM_f&^of$Mxu3ILGL_z8X!a{-jYQp3csUrIVTtkkN) z6Yh7ghPO+B-v@1u`xaqTo%O?#r=_z&mU-EF&;aw*L`qLzeptQm!i&ABZ%TQp;zsuAqM!y-_kvIVom~NLVELEXwBZv z4?U4=OpFk4pnH#CAqNPSTdI7KO1eeU6uKEda>fzd@Xfcmd!G$ROL_{O0RoXxzj&I2DYADkwQ>wGkjxzE=7cu~TE)E*OKe*_5q-jxIdn|Gd8>5r_fN8{=z+`qy2 zcEmR{q}}B$!gU%gDk`Z}b(3#vK(An-T7%l__Ss^`XG_|9FrW`ZJX_#KyrdvJF_yC! z9SSRp6Hk+k4YWt#dQ+c@RnZJR4BZ^4UqwrB^g7MLV|N@)I3EcC$W0*BeW*Et-d?3~ zla8vprqJs@i3zgzkMDc*e(_R4NK+!~BNU zZqnsTI>)3WTE7_G3YE8az+aa;p(aa3&tH%GucW$a@;qDf%yV27C;Q<-=>6}miYe@o zdnejFa;Z#i%lU*QQ76U|G@s}?pA{NOyTzuq(GM8(f7uT$<*n<$z{BdfpaGWfx=S4S z+G#Yb#nU*`{jQ=hIW#4nT@>9nG)!axg7I6ZW^H>ZO6n`~=+L?>UQbsNU)b!}seQgk zHPt_ob}MRJxnRkkxc-s5ai{Clsi1^)^H!L&I@h}lgQLYaMbo+knG-&$>^_8`D~jbF|4?$x(_iC!D|rJdlB`n#dQ(o}8X zhq1*(m%F;LK6b{-++k57?j9vLPZh*wa}GHcXL0n(pJsza&jQxF3+P#W5bOHOL+go< zM>sx-ASL_l+MJw6Cx47#DrE0qPtA*jhK`@^aCgdCJvnx&W{Hc-(&i=d(cwLi?6z3; z^S25O>bONZ1yW`Yi{p6(s-$+B`QixW7IVw{2a_3a?;R$kznniC&R>7V90UrSw(4km zor1nOGxKp%Iw^)ap-Airj86nv3^J*vffw@w0SV$sHQiKkL$@!^dACCD6;LoHA~)MOj+1 z7aBc~IJMSw^>&--kmWLxaV*_r6JkiPlb^^r_!CQ2k@Qb>g7Dd9j%=7wkt=SV=%0{A z+`7tAN$FLz6H8gw=tNtRhR66wg@m8Zo^7H!3Bd^d>2&>LZ6dYS6IfL%(N^3R{i=u` zdcT`v|1rvKUz&qn{~FfeP2CQ&I3 zq}+uhV`Yu7vB|Qmm67oxZc7z57OL=*^l(#vU`YvSsHdF(8jVeydZ{}(6OE))l!HLy zp?)5%2rBoXh~-{}fEyGH?porUD*^Rk+rFsD)7%^K^;bePcXgT5RATQPQ2sPO4_;vddNYxu;t)#g61Q&xBJ4|UEUZQASp&aoDA%j=tMI4kDD@>--m2vktdrXC%0M>`LwI`uv6ioE@~v}RVz}$F%bb1 zUU4IYE8*xe&f63lzf+j71xqlfSB_$*DlUZ+ePz&}nsdYxa}=5ub8`z_H-abVw=_#p zW7TeXsQC1#X`VCK{UD3<`y)GDZGdz+gNg6ttZ!MRaxA;g0t0(V_7keGBV|}*Wz|LU zCU1nqqM%`mrTs_Tst_Ro8BP}rx(}#+Dqb#2P`!GbNBof$|K@q?Yg4}2DOl=yzAS_U z@SpI-DcD~s3xNDe%J3F`4vjO{JSW*GR87R0YJW6;Wr+ePY-=MW>3n{So3mYzt?erO zSsX~zIK(37K9PRxZ4G^$0ez{1Xe~vx0#t^*0VQ4=RUZzmH5Cg^$EwlJQoFlX6L@MQ zlJ)aFTjIIR_9T6qq-eZHVfk{&8%N-s6~gi*z+z|;tFf(70=l(r+&p~8?y|dLZnk)X z&6vN+?S8|QIh*`5=PKpGNpf<3WxdaisV6zRPWoBvM|y68UKKOHI^t5tr|fL`MoO;d ziLuM&=MM5JR1cq3pC^JFE{S~ERhfJPn3WZ)l_eBZRAIn3W&=_SS9Xg(S|rC}$(5~e z+#4)|o*hv$!)@r^?Om>8`3fZYD#DK1T%Y~Yc@jIWCoOsA8q`&2G?6Wnw^APbB-3N5 z(?xBy@1;0{m03ihpdQqo=j+jMOK?iam7A^XoYIiF|JoZqR{z!yY~YqmO!~yj^5`$e z$lrgCZ+6S8|CsX%bbglW?tJ&>un8#e9qf_J+uthU`&#Xt21Y)6uKc{EX1qeJf%JFFNZ;QdZLQ=Sc#1cJh^^Mot%#yy3t^`ow7^OkK^ z?k>b{k_4zTnzl^}eK$Jc`)F(Hx`fphNbiRR@A4`rmQ;%)V8~|UDoPyf^rNa?hH%K* znVg=RD{=bAzhso}6~UcWuRwP<+m!I&syo+vkD~^id+ZawSCUtK@!;z+LVn65Q7S$c zV-O*0Qh6R3gi5I~=qrRaJBqL*5P!PzvbnV2CoZ)nK_t{j+o${Q~OpmO2n&c@pi`-CXhr5v=N6#@}yp3DStX>bs*ueW@P}go-}0yxx4P=;1?IB#`7R- z_39+olxB|!p{^}Gfy*ac0$LNjgU#O!Qs|?Q!8!dH-6JCx-g$hUs&prFG z{e@f=`2OTDfm@7R0o58CemEJFuaBtbTr>-abTrh|Sl8|$@558akyYlI1BL6)w+nk( z863h&4z>PC#v5xq?q2>j_jGjx0*jp7BEQ_U8waIL%Z^}FU!2@* za9{xO)N=L$ew`2}M06lq)I35M>6Jd6*KfXtmr2Ba~ zlD1fjK5f@)M>t=WMVKE7We2O-b;5F0nSH;vceeMF!_LIH-+el}`4dsR8El{khJ@~_ z)2o`#X=<}R5yOds)Cq(-!>N>1^^>`C z*2!t*a9Vn<$Y*+A%9>brpEoduyohM80b*zj_SZFN#-?Ba``+ey>-9(T#}KKi-D-D=j}rHN{)v_BiD-)}UZF;w@He+WG4;3v0ZYJ9l1 z%U#e9NrX*xnEu*XsD1Z^hdM(@QSF%b$+)zwuTL1p_mgot z-QmMadDL>>00NYMRBM~(Pr?|$R%-MnYx{hC5YL6rH-M&)V}9Z5>oDoYO6L?$JGE5b z9w>O*^jThNZqq6TIz`=wEbFQ6glCj{QpG zuo8=41HNBOO^Oqab1~!ZmXleGFFUwQfL~;T`N?``chMAuj6F>C&5IbxiKAE(AE<8+ zYp)lJBXu+4vTM0Gl6nGXTn$r zIMlgayAgE0uHWv9zAI~W+iX$^SaYvuer`PT-5<@}*sTCl%?PMJD8Jw%;j>Uyc$vEw za`4rb<_9R=K<0}J5LB?)`s#zJBpM8O`zRq&PsmA4LIR@o<0{v$a#T0SLN*Iz{(>us zf6g2b$7cZXd{DQwyY0#0`~k9vQeHYW&yzIx(c%gv++Uu3M={%GfI?j{`IaASQwKvY zPXpipd+D|s!@EsLFR#Tmzz9Z%$H9Kq4W!@h%yMl^r%yy-x7Nc~-YY2##H%H~^cE+x zxl-GgH-co4r}g`LA^Yed#j7)^HU!`zyVm}8prN(Xw&v~=fc$cvrmw?^;(b2RdnPv_ z>%Ag1)vT)94qB?l%Ho&+o*iuV1B=(ZFskzdy@qX_als+_0mB$f(L{ za#6oyM&pXGPx-ozDv$gH4PgCafVXuCZdgc8a~|$gS!J&$p3ya)abuy+)P=cSmQr>( zp#n<{j3JOu@qK}xcr()xiaERe>Hh_%y`643TY-GxC={FPPTNVAo7>Up1B)pOCO~u|cAy%PA3Zuy#syReX?f z_@1dXp73bHM;#x<`kS{wC?9NxoA=?Kt26+Ri8O8}-o|jM*oXkWXu0265~IFq5AdJM zcE7P0TQ|xe^;xMq=P=ekg5>2cIgPIuoGZ@Wk39 zym>q+lSAjWP^t@o>zQ^uAZgBQzb9rT+WV8nH(NPRZ6#Hz9jV>*Hlqie{?(Hb;8sJZ zx%FN1x^r!^!rK69Pz-WV?D@=*^{jO-cX-yn6lF?=MQ2=xzU{E{?$NG-TY(CAEWbkQ0KU8U(;djUF-hwMefz66l zGv|x;ANM9WZD8qdVC1z!C0#vUu$F^6F&c%b-(WQ6#Tub_ZYL(nG-a%RB49;U&5iR9Z3zSjm0gDOk*cb7hk+!o2JC{D_2A zyIO}R$U&&(bQP%J|1nMk^zy4BSga=Q@QemRrTalG43polZn&o*C( zv?epqGL>r|r9uAip<#TqP#r0d!1l{AHgIrvz~PTNx=(#NeQGDjGXxXLHrG13 zsl?_OC@WIN6MU}e57*gHctHL$EYOK6e3S$A7j@vkXJKH(H+{2zVaHoMyXk)6g7d~q z8Y?5BC84Il8e_i<-lHljy`rfhsBe%YLK$zU(%fWzwh_~}di=E+^4y#){ zhC~2`1gXi`N@;qZ3{R6@?x0)vj$?6~kOIC+bUh%GC%ZLnL0UOC{zmM0?KR1l-Rxuf z;&XKt{&1XK0yK!8AYs+f&VYq9Mf8mv?P~fS8{rpsW>RxR{C%hJ*DKfDn{(`W}kCD!xa0ZkuEa%~j4wvI;&I)Is zmtN#qe|o0Tz}vlOA~OqrOuyyT`G`)!fbAtq6qa)RorKlz&Ek4oF3g;e(Pz8PyKHLB zr=G%)~ZEFUgum2*m`oi_# zH$b4ha=GiP#qSyDC)wwMQ?Of(80YD$Hk~fAvf1@N<#Tp&g8dr6eOfF$9_Fd5iKy9^ z=uWzAi;R^o;o&sg@9?{ZWKzgTX9(MMh421R8PJ6U`X0Qx2!e@4odsZmx(a@AZ9(kW znu}kr``*Piq#~83(lQp7k773vA22eq;z-Pk^Cayjs#X(WC26c|nC124q9(@6Wz%DM z#rO@1cJ#5Mg{xR2t%tG8EJ|sH&5A&|+9S3oub!w0!BLa2QrPU7zukyTzBj#dmmPO_ zjz9Lz-XcLqfcZ}-pnRHJi*x`-DH17#n2YIA{T6&?f+IT~8J?GGZLWT}F;z6!U#cFRo_{=4 z`vv<>yz4SBUAb$$Q~2^^W$KV`R?hB`og&pA_q&EBOQG4WN2YUGeQyrRf1? zLrD2TebZZ)se=CNk}(q+K>c@uv61bo$G)D~*9uF1`vc~bD9D0jeJNwW311Wnj(j)4 z`ttU~v2n&jCyg4rOKPXdA#Bp1v1^EGMyBe{VI47TMKqxG1d4m?gc!fb@7DAah+1^( z`@6~P4pxw7dH@ivKH7p{Tg<$K4eyJ(Ka^J)bK5mbEnFd-d zbom!C>}-beXC=HkN`LigXlNJDAr?Bkl zp9FI=n*c{@F_>#fr^y zVYJqvMe}#o$4e~@7F=sSVWs=?vSpohM@|1}%3>R!4-(&R&J7_W0E)Q53Z`DGp^0d< z(q{dGp7Ugfys#C&9VO}}?g9H-&-AEUPy+=ECSbbC^eWv~U;p{si#3JXTG zdH?!W)+xS};Y7fTUjMYQ=%ap)%RI96{)7SLKX)$82?~fnP zF%01)rMaS%xZ242{IlGfPHzP<5jlXGVVs&0t8!lqPrIYGM?>)D$sf$dfh+-YEHp-G z9nD{b^4M-e|0%Xg=w<7<*Po8fhqSyXx=@%|%O?+$Qqg{ox>Kc>lHVZT!^~gZ^A<9} zlSjQsUfzCMJ2=jjv=hG_{K4-o1)?Z1r|&vlxQeO{AN5f|P3(PbIEnxsLP?@sUM}lA ziHMrStEcc3oas0U8}lY0AL!y1mvvV_kg|K zFNx+heSNoxm-v~SmHYQ3pa#UaX+4L$jJb>-AC@5qP9_wj1W~+MT9t?l6*Bi=@$)qT zE%sdvw|89SdAytzTjJF}DQ;SjR-F%+g2O9B>Nv3qeF9uD6Gs~#v|2k)35cu-Tqs!U z8_DYH2_-#Rf9AUuTz+wDp+x{i-Oc{BL*~B2#FGL(HyITUUuHgHo9n?=zKAcn6|67et+8@cJNhFZi>vQv{RJ8krO!Q!v|<`(>%V`c?{>M zy{hRgVv09eI{XgIHCH+fd*hT2!F6Pm9mpY*uIRAb9*cz6y(n5-r% zT9_M;g&O#3H&%!2y(J9W9ZVj5pX^LuzS{TT9$T$pR+qALgsP}i_P9<`to_VvGkHXy zPM+>fAg1gHx2Iz|xN@$JwYQz5S6?S^8@ z7PXyvL{XsChD_X1x~sgcG3>kBm7*#W=Tp1!G_iI|LU1PyqZBP0?sX7CyVNtzsqQ$! zASwKWQ%|PIg~-jGg)vjuDefH87dPKk=clZL zEtd=^?9K@3s!}4IR0DuFn;Kd!wJN=VS{&UY=S%RYCu;2D?UWB$%wiba(gt&gF!ilk zE~kLOLSoq5H3vx1lUcE#jE#*E$&b=JaYh@$Il+I)4iDFTs?2-F)k`%vFQD!Jm2^xx z=Dt(yH0}Z(L!e*(<{}>VS#}7Y%LFJ@{c~b!gzBYGQRvA&!BiUZ6Bawyr9_~0vUpK?FHgSfZMjevV&I6DmQo5C z`UW%ryQs4ngefboVA;E`c2BUaEezv+Bz;BgH!(k`_-@r?WB1HX%zPr3`D#7B&?+69 zkT9ND6F!t|+Tn?+dOuT`LCGo}Bqp@$C6_@~5cs@744tGV%`_d&Q#^ zT8I}u)UopNLeis=hAgmoAe?$)#$1obna)}^2|f)i`X|76oveigm5$T;KEqnhX-)V+ z?q>9PgU9{iyNy@A3jDaB&s7cfkXol6n*A&b@F@1{gxyDy^-{CKIPju-IEf>g*FY`c zCttny`g)}$Q=PMr^aNC_YX^rv6%~D%z8x0zBops=8b!1M@p{ae-k11Tx>&_?tn7_K zovP~-?x?HzN5!pn(~F?V(BavS0kN`E{5e>b zoj#F*R1L2)JfsPOnOVOqJ1}@6DS258nnsHPg(nKN*SrZPCOaw2U{c=>EQJyX2yzCd zDR_4!%F`k>aYfZn(%$^oTeE+#;1x*}`arX!u!&t{Jd@i99v)t+x-FC$3=^6Eld_sh z5{4<}C@X$$b+}UKTWAAz3!Q<_j@FZ4bivoSwl>;+Z*Ik>)KA|8Cf7i$H8y67kPM;= z+6^_oSZP^BoVAovEdre^MN4bQ)U#pB`8ANc^Zdr=AapD~!$>9^GPh47E;;$J&Akgk zM_CymnA#vDc&r0fLnvEjWLisBU7Wq7F(j*v@>yQ{IO7Lr0zsB>Vh9%(Gk;q9Mx7J7 zaK8vC6A%4E2dCGcUtu(Mg&(uo+vR6TCd#i^M_Gc-Gk>`E|_l)J2>MD7sU*# zIj16}uJ{W&@7KkM&=*OYCL(D0IP++s>#bR=j!WNWotn>|n|!_eM1;jKW#HkYVd1m4 zTy(wPEQl?Jy@H~M?oH*}-@)Zns%6)_$=Y6NTFDV=o|Uv0ErRJrXduMI*l*RW$@!~6 z%lzHx-2)smc)B~N#>q?;?3p$(gQPlS6#)5r6#+DN90TD|Ffxtw) zRl7KULh#TmM1i2YlHESf7%8&(jPX)9{WrMevxu{Gp6;;z`eRP?AFY7g;4Q0TRsOC( ztBu;A@Jh%bkeTkB8 zuK!*h&9hUe*C0SHPrl3jKiWIfb~X?#j+=J6X;l|=A?K`AOKiKMDTTEv#EAsKV;7q}nbzB(_?d2`Nl zUY+y&|3ClIl)O+0fcr~Z0*Wyjk2qMDvrR)&%d^r@=9|DCh_ws2{=0q7LvdGXOKr5B z9M_wE;BvL#udNIIGa;m{3ER?s$h=&<-~Xz_^jaIW`}BvIS#(w@8nG*KJjK(qP~+SR4QYQk_;63;6{{lL?d{ov7x!4=$wq^A0Z9I* zPnv1RtOcwmG=Fs?t5;c=b;XxM<^$(5kcDj>c3OYA(jXyb@e$T8DM1_4w4*bJAi6OrS@PC}7=g!!6$fXfr(y1sN~VH7b#0{CbmgWMh|Lz3{Qm=Y{ z){{LOUIk>iM+E8ve0SG8ytOma?fjKS;Pw6p-_XDVFY~RhohI4u5j0kx%41dkjeg+M zdlbb6t6K4oxL4c)mnr84<@B{;36_iD^5u%8j-Z};RrA_KWx$BzFHTuvsSc{E7Qz@O z!JO(5Hs^uQ=B%DxcuzfTVPS!pXn&rgW>#7>diN7Zw+vdmyvi2;YZ5Z?qA=LQ8V}Oz6uyvMK*()CVJ<~OhCVN3!n`qzn{ZPl zsgMT@MQ^D%WsdvTf1I@BH>p!AkldnmM&57Q`#W5P8%%icSOt0EO%J4L zn6^PtTlfQ81Q3Q7{@h#yzCuFih!bXTvD*3h zwjr#KBAVg5I?PBJVH}QM`7r2D!2+(hY4k8d%|oD+4Div|hzYOOsxKBhRI2nxzO_s{ z^tmN5)PcP{5fd(5*wo)#Dl=7ffD4}-$c^`EnSKgrk6xM6*Kbktj$3xecFM>n1-N-r z08u`Nq@&N_yP4sfHAZi0i;*{|Hi8uWWng*5x|wU-=E#eY^0zykP&%;&4@=XUgQpDb z;o*wAsV9t)Jc|evMA07|B9O}iI0Y*b<{mkaTx?+!C|yVQVdG#@!KcQ&DbVOI&5N58 z$M@`@HAntk+TK`wA^mx^-{h;ogX3ShQ&{JQS0L>hgGqX*Wwdf(WeS;Jf0F9=^UUu9 z2C*k>nou4aB2-C~jyQU&eZ=TyCIiE?ir2z<&LxMLmRH|?v#bT^BO5B>Mjnd=1ff&g zmzAJlTV341=N(=l<%pXJ-QTAYcQxZ00*A9Q32Xhf2B&Z%%SpP2PXwg*TcFU7YzlDOD17oQmqU(UcOPNi}-Ip6gE8-a> z?tYfyF4n98$5%b3-Xyf6x)3*9CMj72dIhe?^Vr$RcH=X^vq|H%nLTbAnq)<=%gQ3I ze+teFzTP}>gTb`u3uwX@mrf$D()f0U>Cb;mSK1R!m9uoHJ(3J;o`9l7VSHY@oxh7( zVGGpPkHii2d4aTWjiRI3!*0Mwhw63CVdmeYR(g*!3S(ebH2^o)TaYzo?Z#7U(=Ybd zAmUtF%Ofar9W^%_gXCZHohnVH;H5{XQbr%jxryL7sCd22$Yqyv$nh)0J5lSQ?-Qqg z>ooU2sguK@*z?XCKj)w`s~%?P?xqur_c$T z$VIE_uwMn-Vzn?XF06Cnbe|*voIc8#bPZ%K=1xX`=TS3&NF}|I3ahlbJ*$0MfAxv4yBad0Xp^PP%IQB=_8NPwjkZi-y1Mpe zCnoHyDn?Al*T;(P9qS6qiWrSxy3+PRFWw~@ZJ*Hrt1UZmTQ?3vnSRiyYC-`9fHWhs_m&YGs(mP*m?_kdvvXu#K@w~!Y>~%B zZ`zgzFTNa)@K+-3saJC^{Fr%6f;i1Gbv7@0HJe{p`{u!$yQ@^Q zIIKck*zQVy1yo9fhg6_;BmY`!e)pYtg1ZIh*rMcJyYO$^ec(S>kZlhC5?1c1{I}@h f|5N|lG(O@HV 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

        %wG%QkW(GTbJ;jwl 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

        ?)?8DQJ=`UY=1F9MSXncKeKA$#@7y`(Qe7~ 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\X@7^de6^Cy*C#N;v>MggnV;x(aWp} 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

        ({n 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

        5LK+{lTU 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 bevz!!1)Zhbyqb7}dak9e3#z#P^yPm8wxE23 diff --git a/documentation/en/.gitbook/assets/Curio_placeholder.webp b/documentation/en/.gitbook/assets/Curio_placeholder.webp new file mode 100644 index 0000000000000000000000000000000000000000..a0cd37b6fded633ebec09c478d5e2b4360cbd0ff GIT binary patch literal 18328 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 literal 0 HcmV?d00001 diff --git a/documentation/en/.gitbook/assets/Filecoin.svg.png b/documentation/en/.gitbook/assets/Filecoin.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..556b1da4242b6018067b30ecb463cc7166a08180 GIT binary patch literal 46817 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 MTG*N2G4;IkKgEHbh5!Hn literal 0 HcmV?d00001 diff --git a/documentation/en/.gitbook/assets/config-edit.png b/documentation/en/.gitbook/assets/config-edit.png deleted file mode 100644 index 461be2a1fab1be5392e8544ecbf7b63a8a624840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347921 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

      1. 9b;-tsag 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 z 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�b26gnV!_1BfEmhz8{tS=G; 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 diff --git a/documentation/en/.gitbook/assets/config.png b/documentation/en/.gitbook/assets/config.png deleted file mode 100644 index 41196aa4af1cd01530b1dff9169aecbcd70206b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502826 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 z 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

        66t@6eBw(mTsE$=uTHYNFr-84YN}j#H90B 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�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⁢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 W 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/documentation/en/.gitbook/assets/curio-cluster.png b/documentation/en/.gitbook/assets/curio-cluster.png deleted file mode 100644 index 7aec65de8406541d0d72cd1197181fc2fb5176b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211934 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

        F(|zpu1~?=87$eJy!J~~u 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

        |)G&+W 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≧8U^?)jppC)q1C3xaqc$$2TT*W+m#sm^lP<@(>F< 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 m>n~h3Zek7%R%iG3i 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

        lYLzwtY{T|Oc_DMLb}su5Uf1SycwfV_ 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

        O1FnfRRoIYhUC@^r?E{!}zS(?X_7yxPT{W%g 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⁢BplFVj9`58uL3u+MsV#dmUNEhynMrjb*AY)<+UfzEG>v{c@2vHv9S**@dbP+RGD`jc}7B9C>?QI|>4wMR`0 zvgDp3tkEGPhIjo#NsYIE2i4a;&J~3eW)oQu1zwBo*}>zh{|N<`Mb3O}l6M5jo(=9v z>DT&0c!=;7s(sOw)8CtYg{8p9lw16ZwGP9M(#JaB6iU{2pN94|O(aY27m&e!^slEV zERg&29!V+gBfeP7Hhs6{gaaE0{M^3hG1dalI$S*V`!TLueO=$J$dVN>q!1Uk6aE-i zN?}rqC1WR@laf7m`Sl;FG1AW9CEr|dQ85exG}(UPXjHI^1i#O{tn?1P++0d8n7r>l zf0&?Sg&zA{%xNPa@h+&|>@?92tS9h|aXpT&EAqhR-D)NMSmeyhrSbqI1Ga?!X#sQw zoz4!j0ZZ~Gfsl(attjy6F&@qtpQ???ioYHm|BWb+fP9jlfN4+QBH7AyWqW zQr%~ZKt8qIredPV8*`S0YE7p7d-TS)yprsADihD3Pqb|q(LUF?#RGAZ*sylS3S)dm z2(6~w*Yy?PJ=>{tVu|V$4s~W|=#NH8lN_ zWHGtB4W*g6Vs@yl$k&vG9QCHeq<-?+1YFxMH>Z~-?^z?yyxTs0W?>ZzkJ)_kJ5T!J zA9Ll*x&bb_>uA@)$pK?7&}+AJ$p&t>6MSy_%>9Po$;ek@6hXFfAl2^|G|y~{7}+YO zXuKd0zA-Dq+QEQs(5(H#1Oh|((w|KX(_V{m>#{i3Hc`UM-%g6%?X`*l9XqdJP~Ziz zNAmo~FI!RKj5*xHz3X3vpxVd8K9xVx8Cz@#Mvc6Ge{Ga^GqQm#Z2rd-dD#qc5D8A5 zf`e^G;aT004CW;C4S%|tf&jhw@!Ufjqz7^}yE$e|RIOP2O^Rzy{wo8U_Y-_w#;xcZ z0mt+gZQ&fFmnn2H8g)m*<{+fge&*k1g!=c_TzxPM=o>?Y?9EnxRYDZ#deWbBrz6Yf z>OA2N!nbUkQxRrhI&Gsmfr1=E#hqFZquSOp=<;apKj_0XvD}=>dU^IVYGv1qyh9eG zxUs~0CZme^?lKQQ_4}1~Q47*OnJholetWg0aqp9NKJ(4Gz#woY56 z`~z+d1pssjKK!HV|7kF|TRq&iv)L%al|gPIF9I?_4naU<1bzvQQKUtcv6=YKprI6n z8BN0~CiPNd*4RnGGsR7TDnfY<1J}+yndnUpGz79W#mr>H3V0GbVV+G(!WTFUh~hIW zpI0e0FIo;8EyaD-oH@Q%iPIn_g~!|gPHJ7ElwGQU38ZL6!S8M5Q8Qp0G-U-2e@uSG zbKh7}d+ivL-E0@;Yy6mqYmzuu4Vf9zK=v#_Y@G5G;*l0EPJQ8+b)1cmC=5kXm$&A}+m0sjm=f?^L7Si{kwoFM| zqZuqIWGziZ$n;oHj-}-U;pBqm4Us&>k`yy~He|Yo+F(JS9Hwt}xw3e$aYfOpWMalK z>$O-Y^iI9{zs!~Ix;!=EDRj>l4ECiV6j25-@;^b@Wo)0{Nz1~B?y^BiO%2HClW>-Y z#zp?C-8T?8X`WI0wyssDMmH7EYUMW+w@GF4q!jwV7DQ_e8Xeo_J`jLY3g zhAW>oo*q9p3C|DjR4)A5M6^d)NyIvo-~7eQ7(}GQczZ`;X3fYv{AaUINRsn%##Xie z4f@PgAyyAek3q-u`^MrFTQc;D5P^09gKsA>wHR$8iC6!Y!0Q_?bSv=@IP-^9z&Hn< zs#E}d@=hGk7vEw}&T=g67axRzAi}q0xSas<4f-x4gf$zPF9g;xb2ntkZ$bh#hB7XD zpXTfI1t#Wsjkl>2)O{gTJ>M}!?th*qxFrJj1Rushs!X%zX$AWpYOrYA<=w`Uu+pLC zM;<)o2k5Pq?sWF$lH&#oHtjXbn8h!Rkh42Yz0u$1aAhlA?XP%GS<%e zU|J7GmUO}f`aH+&O)Uc^HF+@R;Ssj2-n=dR9|E9J-scGsyyeT!PT<18Sfkan=OQ@? z(~&YEvs#4mTI?`M~6LAOQ)py=H2t0?+Bmtx$&@| zxrE!q@6@!H1V$}R1V(dh&rTNAW7#U@FmeK%t9pXalSq;q!Aw_<3c*nIK*$0wDRJ;C zIqfyUkV#;Y$%Y8F=2D81*W;8{+rDni>34me2lNL0*r_u2igbFj%f3!FHwPs)@#MAv zDUFe&o9Fx5M%W{s=*2QMct(k~&yh^A9Ot{Pj2H{Z#0EL@O*atK`De8bye>{YPnP4; zeO!;2-yTE_%~9lr5pD7;-FJT^s?<7L>0+WFIGkOhPMu2gf)DQ1#D-z-&TcO_o-)l# zflx>z8}X};+_qQU=ZJM;OOppb>HPVUGRojGywkZGl8}PX-k~{9>lF^5t{S9a7l_l;P`N~1OA1~9Vh$}avAA_esNTklW zQ5s;$G8ic0EI}G|J`-IOLy&F(zwaL|IvfPgB~C%l-Yk`R>b4r_nP&Kf?M%mb$a+9B z@vdv;YP+#ep-u$)Q zK|}a5IflDVYbpMWklLbW9}Z+$Wb?&MbxKzi!Jrk5Rsr23e;w&+~ukq2XTC z4Uj{%%Ain`Zoilj0VaWG^ zx+u3|uxFPs3U5VHg`Tm`VGBe;-h$YP_MKz}xM3#S-}i9e+HBtAk>5&w0={p7lY4gU zU9kayi&^!z$y$mI`=3MF=~IG3>lM>qzK~790^2JG*k$JpUNk66eh6=g{vcZ9o;1-YVM z;jijr2|j<4NbPt7$6a`0es>WJZ3067V(`E3#$g+~eU9%1x(rFjtg z^HCO}IB|YB3?f$|f9iKWUPn~lMND?JTMKY)BXc(S+ zU%&&Lu{bjOj>kB(h(JV`#dx|jlN*Olz9o`lHXyGElW5-|4%hf=$E>!7iJ~`o`F+FF zW4??jh&$zX#~NTtc>qed#$UI`>TI8DtSajKby)|}RZw**{$$Mjg|WvDf^f`Huo+V*1U7BE@YIc6Z^HNQbyZfcw6X_qL_I(8C!qAaG7RwY}j(5f4*FZc|I@lEuR)!n?yRf=&2A> z&h{;os*jaqs(fOydsn{>p?`|eYxRa<0j4=xA3fosnY(v!RX(8SxANly(PYRP23Kj+?4`z3pEeRX{(+w)KWUW+mlcX@(EIh=LFlhnIZ#lwE;8@=ffp+HV_RHBs zN=KmfjrCir)w9yNfn46K@SZbBOB|PJA$Vm5$D^2b`mxd%=p)a6UvX zLwh8Hn?EdWy@TqBH}?Qg4nNbwM_O@OiR=DxZ0R|5M_~{7Z0DNi3SSVF^PVRQ4g)Q0 z2)Z*Sm^s7PI(H!HE{W@kg7gsw<22l@s6-v<^?XEx`x;9kzrEz?7wcvB&kAJlWUXr5q69Iogkd@Ixoe%>czH!wyWR79q= zertNfICRbjpcgi{GQhqfMEO_hXInF>L0dW_Y)9T%Y1YP;BXB@I_~j%)i+xGT^G< zNj5E;>qUeTo%#WM+zsGHd2`$5w~8W4JtHd(c}>QSr~6mR!M4Get^RJh6rZw`yL&(X zdn9|%v#no^j(PUikG{GW2POZGzelYLN2o^I_zlxclZR|mA=KY(q3XKd9#%EFytgSM zHmN5S(9)vE4mk2WrUhCi%o)Ea5})WWP{$$#mWStRMfFjxMX-ygs0)`nNvhBU3;8V1 zvVLg({6dR+x7|&f+wyyyI0?^f%dNiZl$94PLI$r6td=J#-BOLNNbqZZq3r0#`@joP zRtkfdVqxF2ah_42m{jwg8=5OG#K?l!ZJ8A9Q!JPIZVok(!$oErdudVP!%qm*0|}BO zzFmG$C0e?{Q724KH$?VyEwfRNLC852#e7JpjL9odS#JC;3(m6g(1lm^Ma9oQQq4vp zRB-GWn)TRX$|UB(Y#wT{0$1-Ork(#Pn6XqNt^ueqW!#(Y0R;sPa?x392En_dc8*^@ zRg(icE42441iY#N{`(|U?pSh*flfe=v3<7ZwMOINmn#4`3Fd>TzLJAtruL4wJ22~7 zMkV;vC`3c&jOLVY@?P8|ne}$rT|8a|TIx%o^V$pNIHJP!JJV*3`(z5^c9aNCgh`fZ z#zlStJ`dR)E-6h>4`DO^K7JXlV%HkwrKWe|uEZ2?v$`Gy?|wCrlp(G;7w))mZGFxU zzo0vA2449EZ+F0Rm-4Mw#y8yNCkw&Z12vgNjUrzAuT|l)+yjh&%t@rbboaM3|+pyHViM-v!{5VoeHv&o{_yU-P6Vs`ICpl=I+2aowCPm>V^Ds}B!{_2wq%XXN+| znY`SQSBUjP0ONNoo@>YI4U#?7E~o2(%H4+fDTm#WG-ZF=fUX4I7iT%Y=VKDkp^rCt z+HuX-*$3Y|&(D~1GhUvnsdxU)=d?+7J1xEa1D51IiuD2RE7anHw>wU^7) z7SR%X$NCx%vnHbFZ1joA57T<^j6`td}0tJtq;IcR^y^x@wbTy}Qoswv{1qcFt*ndH#>P!|jO#Pa2L zI`Hy{&mVlX{RcbLp2oPNF4$H^XG_^44R^EYEr^I{*snc)s)bpLm`1YO+PsN~5?=Z0 z>qS>BO$(#Wgl>CVfRTlP!0|JQ-0*tM!xm-uxND~Mw{Jrko+ub2bK_$5B@}c)?=&nK zGlpI*m`XXlb#q*5wwd03yb?^X^*Uu{;gDokF8=K@BAX1E`8Op~rgeAOHU2E4e?NEI zdtEf?%f##>IsnvxoJ5J{8+*yPz7yXQH$#EF+ZelAoy)drVr{??gGvX0#3<)h-Umi_ zL*!c>)XVXr4+5nKrKT zHz0?<42YDw`j1O9d4QG=3`Uq6=Pt7BVo)y^gWjNFF4nHw^TX{GM1|;f&avYyx$Vyd z%4#h?)_hf92zte`>4`Q)u7O#xo}=3Svs7ThA<;~t)h|}TaxA+SEGWg7Wuspf zH;XdE5+e7z)&&Ey)Wh9q2f^k5a1)ax{Z;ImtR{N>|rF0+YBmYa~A^tXi zBHJLA=}a(azyoSITxlTRqvA-mLl9-)Ik9V#U311;4iO2l&B73j zf7b+AsoI%1nsn|HM0_<|d6?-L83H?0>WO-J5DC3ETCcy{2=(zqd87}Ms~p?@fPZNw z^llu8Td?-g4C$UDt<_Nn>DLea=x{1p*V?1ni>Z7}E*Dmx2afHT$arA$PR-cB<7&{s zDi0`i{8waqkPNrx3Wk%+l6Li84(vr0zFkNJwFQd^vW}W!fHOvIKR*Y&xCM?5{41HB z-@aZqLv|L+#gl%=XPx9)Yz+^r7A5YKN4pN0jV=MD52kqwO*EIGHtGzex}P2MobhG8 zYhi4c5Kf4{sXm^ou^Iz?Q;03N9&WzNHWhqODh-8fNMCsY`Um6hNtKytu0AuX?n4X_ z3MZ_anwW|kE?tw0?Iibk8NELV7pi_}vk z;L2PgoWKajP@(L$x6ypSAF%;jUOej` zou6lq7N>afl%s6|HvB1xct#pc`%3-(g4)$MwyzpT1+Mb+Qk(QT8m-Ni1%8wHj2h(4g!QxHFi01O{88ETb>c8& zU!Xcc9}N>b8*{*MYkRt1AoJ|Hz${D;0s$?vhX*f3ju25FIQbH_b2d~s6{ z=lA(z;lMT_^%$xIq8Zv9>xw&WkeO6rain=WrNmv5SzD9nbEFoLQ%xPzrU{J)tT}cI zl1LN<(3qW*4oYWNBAYG^NgCn{`82~KO6zLmQq0b+1IV6rDm6xQh4m_Ur*(LJapxwH!!wt272V^#siG?4`oA&g&AVj1zR;l+< zXJms^{Hg`;RRJ}C8c+qu4)6!dvY#agD05E~6fl+?qVo)KM}PM&@6A9bpcF|UE09;K zEX7~LjzR2x|44zsPRmTdi-WNw86Qs+$CY#W9hzXewoqiRZE9Rih@?-SuG<6z!6=wP zW{Wd>L@m4)_!-C&`XRZ&;3p|qoJH9$?T-{M_)m8K)e@Kg(-B@Bx4e+#fRsyr3y?%t z6uTe#N4dHb3EZj*W4u5ow1+m#fc7cga{iml+e8p$2E;nFfH^r2`;lxm_G1-@u&U^t z9iz>7C)uRc6n|U^IONFX+;1l4xHmO?g@Gx;xD#dqB z{O78B_juR%So6_hyEm+{{mbgN$^m78m*0yTqPv688(tE_lMl|G&Q|^Wfy|%NAek9V z#IZsi^FgX`2&-r579{OrNX0@s!zDIe(&hfF~?4oSB@!!#K~!168R?R>Payw1fn z6mGl;ORU-st;$x89!^saO!_+A+D?J}V-k_^pD+zLt=iImV}?}T=;UV1SzlepVXbnZ zF-X&eJJ(-AV14ng(El$MrB1NW`ZGuERlr} zokArOY3L?)~wsw{(95a?s)1sU-l=G^T(3pjoFkH)AgwS-KE+mk%WHWjEsD zKSPFUU)ks!f7(-rq3bS*7dfQwa~BkOGXJLqAh#PNc2m@QGwWYWi=I$a!ODSZsg@eF%Z5L;IsqzAgAAV6brTjX0Zh_*~c)O$Kmm z2KXx?o=nqA<>ef?FL5V}E8@d9QuOc0e`AdGQPOx#pv_YLqnM+^{Cpc*Mi#^nS5Z(g zT7}GfuDpR?>J|1E+=(VH%bZIPVFmc=IixdA<$HZ$M-8_%xe{yls$A>o*`#HX=OX@R zgOL{@w)!R3ohP!vfH4@uL?S&n)O$!#NvG8|d_8OUv=0PD*Y{^}q4=}zFi>#LYw??l z-nZe>z4}g=r_6GlBH}&e(q0Utr2FlPkyqaA@w$-4Q(nO1zDQMbzhv~^yT{{WIztLo zZ3My3<^`g3hl(b9W~Z?n88S4wAV5oIiPtM;8CMH!BCp8kUCt1tYA|wYZ$5XFY1B5F z(pRzSH|4E|cxgAn-7|SAu3R!Qn$c4vj%^k_-n8*2KqMEOU1itNhmz4P`KksK!RKy; zjrvn&R+U$O!?J;DIt@ckw48cC=Mjs+zcy)otMTl#TVRvB56=w9+Ql390*m}PubH!) z7ATL?F)wg0H>2tI=hh5y~u;VF5v&%)_ z@NYgxpr06Mcmpn53Sud9jjTR=kE)3&tVI}rPj?Ie153;hIQogvL`&X;(VfBKg#veP z)7$-W)5mNO33cYn4wzyUtvtvX5G?s<^k$7_&4i52isV5`kSHm6Nv+nz-l>i3DMEG; z?8;(39M9yU&fThsD`}$y-J^N7Hyb1u0UOvA$?xu`E>2J`w@4GYzPeV47}VaPQivxz z4RREn82S8z{#0g1K}sHl575PKEKB!@(rj32nIZtku8a{R%>|^dyF|G;jWFqJ+p-!9 z9BvS$XyGhz~q>)>-))O zS3avk>dE$OUSC;bzLfc;8k&Qy-vpmpxqZ*^|Dk&cYh(Xe%WSEoQ%$lBJhLPslNdE) zEwv#G?+$_9fbC;fwyip(F|(dS9i=pL@kN2uKw)GpGzR0X*O6s7&7gg5r`Eh6H(Od> zivk5f27&?Mfix#0b@n!Xl6f1}T%5!`dDS)V#gZUyP$?FDi;#nc!B#EyHkRqE=b`eS zcFMAAQz&?Vg|gGDzr6A=xHvb!I?mXa2uDi_c)0Cn%(ia#fyl|exsNwlF!aj%3HeEw zaYH{E%KiXX=6`o7ZXvzE%&^A;0pG_MQCbdXKk)m%{T*V~>J|v{O44nyWl4ctS&no@ zjd=K$kBnP+0XjuCp204tjk)jV#Y zMZfAE@Rj5eDn{CxM&eq$2N^Izk8gRo&-^{mX>cNm0;CPc0xQiuj%J6m@Hlj*cMm;S zbQ*dnZVIUfzT)l&-&>*-*8l|W7b4OExiWAkEfsY!`xFwSLCjGIXG>%-gU|>DK!L-y z+<;TwVJB8Ob58jmY}J<@H(i(ve(qmbW?vsERa41bGAvkF0|SPdEA*};B{-h{h~CQZ z*b3-#Vhy}^)2aq(=R_X77?5Y^K+XY0Rt-0h_861FrTS^~O9=fS*agdEvXeu=NMmW{ z{ZD(lPq1+bD@e_mJldCF%(*RtR8mCy$?$`OX0p;PY%O0BDL$=~-XX$(XaW!`L@)02 zhk0~v3JXK{Wd_)Xr*>V;)ZzlYz|2fN$Q7l081E@p)la<(zg4mLYM+uz)}La6SVmxi zc|)DwX~D?W>nQbm;!bI-A8?`j-PJMwpf2;utNE8KlW}3}3gMD;Wp9cBQ3;bEX(Gi?GXkjsIrz!wbO# zpxVE*+qQ7eQ*rko++XTdQ4hoxNXml^%cJi-XRs&PKkP`n74Sy%O11H;IIC z)6HqILCkZ>63;yRP13UmTk)yi-*HqFeeL z)-HUC&ZI*HsrF#xK~biv4~v2vms@T`ZpYa1HdIo}5J#MEP_bIOBuC){sd@!Wm9$__ zU4c|ym6iwv5ui0+gvqOTQQHPA8}GXQfTi+2yqE^8l_jnz<%_cHF8dFq`;V)!;Vg5M ziOhi1O<~S&5YCT3Or(f%uVneR7((M22|N_a=$67>ya{(@|WfzSBhf-i{L z9J>al%Wzvn=qc3LS&6QHXSzy6U$wT21Cp*Xi?A0n%PCy>!%#=>z;*zw1Ao zB86`pKtt#Ca;2CxpViJ6_SnO-7WwF@yq><)42E&w$)8DWZ(^C*19`fN@=Kx`0ium z?@hcIzYv5=z3oVII>5fbtx1MW2eZfxU6ep1jEdLWq%Dy0T5_ow_CPa&2j$E5@VD4V z4L&=$)Uxce?3N=CnMN%xYR{zZmUq%U&7XF9wtuR3gooE=c5k?l7$v*AqoKRwzC4qQ zUNX?46(N3KSkb~F9hba(cS^Jvq6z#?Os|Kh|Gy|l?FRSanC|%9gyKWz=7;COC~}EO z5nt+Wsup19$mMFS@%Gc8+Qr;@V4zJ=qGa%Ljfk=HR#f9==WjJKo~~aUHqOg71TkV& z2>rNo|D>YX8CL#hmK)%Hx}R2PR7|OCDb1{OQs6i&k#rq@S0`(?UHOB0X7s1p{6}N9 z&eM(>_Duu;+Yq<*v(KK823&78*8;Htl2Q&`0Z`U9m*H2{G}dDFeGv$gkM;&3CPEpr z=Ll8>(s6_co;3h32jS^}=dummn4%X>P7tuNNgJAZkUpUY0B7bi(#ea)0M)kAspjcd zcQr-Uyjv=-)pzvP@F?ROL+*ia(0UN@%|QIuCQH!U^=M-?rcgEPE7-t#`Lb^P=?ZJ? z#7gn^IJ!jSvg8;DDMzpWZs)bX#Ys|jc!4ohxdUb;>N*>_bQxXvWvIUkhpAX0siBl2 zUH<{KkjIx`=Lt#ht=S-@WgL2Qiyb#sE$od8!3A_FU@6v>Q57PMQ%bSQt+mri0N@*> zs>^}G-~)m4S~1<24sfCJ$Q20d!?olvV=y2lqgxP(l*H8%8Jau9Bor3_g2W~OyaVN& zgDv#F2>RJloXpZX!}mp{4cqYo{2adBcWb|MD|=)~vUOIamTXoIP^1cfa93sZ3=OnT zy)sP>96t}?-lOp_#VeCuYez~(gL-NzL_;KY@?iFHx3+45XYCiX;72C~nJV#-{8qzJ zT31Un$~zI?|La$>iW=HRPFUbgOs#gY{oLuQuAW6ABaI5!Z^Q*O?Sx%RXMy^0RtAV_ zCA65_wB{UIljeas1~`wdo;n=YnPVmd)#v>my&084-cF_t;2Gzp(=n)xRRg1Dn*6Ne zti5VWlpU(ic_RALgA=1K3~%hB+^oxpVVp=-U`=Wv^WX7K1vw7`-e(q%e+PY!9NpKw zr{AP}zbsc$&Ie)$-+$l}TK!D>`DSaZ$R{S+R2giLn{b<8o&J|5a!K@@l`&CIOK!wb z4-Bm*zIF;Kh|e`U@?R+gLHcsTi*Zr(pfAKeh_R1ZxyW>@!ZI?MlO})`rUT({vp9xz zWN{AU$nl)0S%5^9={6U072yfAr|UtH@-!)uM9LaQ`S5_(0ia>_UxmoS@L8sJehgJh z7f2H3y?ZwYI>Y!A)IU^Vs2jTvzEFt1LFWTHMgdfdf{$2Wb<3_+8!C5i? z0}%MV+`*XGQB9q&;C0!aR0p2%+%&7(HCLvRN1@9_iPnt(U*HYqzZT{A{1v2yc}uQ-A6 z1?fN$JyM?*rxfn(YASW2%YM6>v*$1mL%ID3MAvWKJAZTK(kU>-M>t1y)-oM~fD*{5 zGe=%*mVql3WM{<9T47n?5(j>uwsU{r{IK@T7mX87I^QR!N&s{8#%i z5DCLkr*^4%dPXb1dEnS6b-!_mjPT9ff#lphEq%Yl6WhAxOl_jH2puwa-oZE z)o%27?Ey)BFds@_N#RGd6V<$R9p#MuJ2PMwGj}KsmM+AX zW2ff^g^b@qn08*FO^4h1)hEk>v$Zo9<-z}nR{Mo~p%&apAqY4-{z#;05lmb)*DA#_ z39*Q{qwxd9gzv_)2kIpZBrW^7z}#1(49`H_w)-aI1Sn(kn}CqC2}pvQ->v{wZM1d8 zF{g&2aTk{X{3}VBsIA*0e!K{S@r2W$t8#Ii^X9aDW5FN=w)O`k!BEu`1t9F_H`RBF zrRo13FelGgLerl*>x^q`bv|yJO4@+GEv{$WAj43iI{hkdan1TiIY@65$O*7(mnuxe zbFxxu8KHBw6<>CUKuhuo_jZKELKwunht^0S*|^SWs+m{hmC9cn zQSR<4do!JO>CboF)$eOA?@b1#mkVcbfa4Poa7d#I!r1eDyfV4R58a6M9~RA(jWucl zkE*7vd!AJ-7Y3dE-D|PiUGUmS(*)S0>EYhW=`dYcIW0}suit?g1!kIqv&hWfx zt`L7K4Q0jFe{j$^wRkr^-95l zeZjR14Kg?!cF-!BUs?188wl_1xjK}h`a@Ggql)*q;0+nY}`3dr(rC#17m=x{&W^1ZD3 zoZ>H33YlBf?i^w9Bi;WZikUCVhh?N1WDWWYuvvr6oE?7xY&;7HV9rlgc(g=3b`jDb z5<#y40I~lyDrJzSMz7eG`234E%83DatQwlo&(1!tA+F#7P&+F1N8crG=#jN*>46!I z0g)^*5ES85xn9?w<)NBik5`r7Hdy$)W6b&VAKPuOLPJDrxc``!+L3fNVehd5i zfe#rLn)TNm7Rq7_?~VZhZhTd$W`M{&{>$ioj~hyi{PVlnc&upAgwj&1HunTu8ULUr zJm^F%mf|qZF6l=Y(Tbr&lVYBvbwWZ4QqVSU%G__{T?L&YCx z!K@jwgZRO$Bhw`JCt*RF`9p|P0WQFuQ50Tb0+w0)KPDaVhVrr=?k7G&az^06-yfH=y)M2NsM3 zas>%t<;mF2iT*XVU_ttoF?>vTwNQz={fE>7v{J_Bx(pChS(GXQ{i3?ni?)!<;;1T(MeEaU{?+d7l^+y=z&n9=0 zkd2F#J?aBxnQw=lu zIk_)p>!I&kj-~=v)fAE7%L#SP8-wQd#fsNk9oLpqXfPPUU6&Tc8`+b7skVr%4NN9e z_a7)TTjhI~e{_R>nWC>V2;=9Gl3IFY%0Z=tU5c;Q4EBAC!#Qo#_*bTNmydS}O)HLP zH1(8dw z3ap3_$NkoayNxp2wT?#Mte(DI0oAlsofmL)8KwA)MrXg8V4+FD;e*~rAb$^@E?cui zreYcxsOS&O=;Wup-)P5&d=khIm7XcX!0WW7W?|JikJ0L`*7eHsIjX7}3 zPvH_JGaLmL^70F9X(@b>MHHaR>1>Cm!3rib{XY8{sJ&F2-@i1+B5Wro74~~y%D>te z6)xxA`bJrvH@wiDu%G<0kY0VRP}W+Gy_%6X&_rFc;kX|?1nW!Kia+|dci~H-pHfJA= zx|Gia0IP)1kHCERFC2}4G6AG9RKLuERIf>be&7V>)-u?G#p9G;@~)0B6c1v4AIpau zsJI5sj1tcpHSBU`B)BrgA}8du{;7YtH=aYHMiol4P@H=_a9577ueQ%!BTo>koeF`? z5_K##u!?unaok;SOh#dml%O^6pCBopYpMJ1^|c!qG^Y@~1ost)Wu8bw$BQO5;Ph6xD3?$`NcEiNvgNIS#uw8Zoby|`rzoZvz4Kh855Pj<$jnC}{ zgxiqP9GYH@G2i4Wt%ncON}~zfF%rd;g~WXW*c?9rWkynr67k%=*F!@7x4hEu2Tq{Y znY>){GB%%ybUp(Ox$oRDiVf`%*JQtz2ZK|Dr5PMaRZjxKVe-*EH{w52kGEb{*#BlL~(!4VY@8UPxacW;V%w1>8Z0Z2KbB(UE^tyG# z6IuV}?N_v5c_(Mr&a0~R>NI!V{ zn}K+#f2MsF<8G5>`4Ki$C?Y^|!J1Y9h}jWOf@0sg96t4Qz%He-8K16v4Yw*_xvwJt zGV@grZN|0B6k5J&@vwKa5v?Sx@<@1k`WKfL0$v?wbWbcGi8wmrP%Xmx{!|LlrhUvL z5P!fqTAFXN1qAyK0mDG%trzH@z*ye!JB#xJM*E59JGHt^p_4jxpH9UQ5=}6m_WjYX zl~ct>Xk_8>2qdMpIjsNB1J5B~?;Ke=TEYel@Q~s<7qNjL@<0pnZ$GPTa>%pGj#jI=`!)|20|{|p?Ct>bVnh(g?gnpoQ(Gd zjDL+BK-eTkYx4q&$jJMp<|PV~4CxgM6*15u8H48yMDBk~Qh&rnt|>^(1CxJojGpn}lu(_c`{K2xGsv9?e-b|9C+ns72i zbzA2LP&EZg2hc}_Tlr9XrgX&XA$lE{6rDzR*Z&`@cIiK4$&bS@z@IoM^X1206%Y^k z{Mz5|eLI2R(TG?8C_K?@Uf}i>LIHUeIL|s^6>$wp%2$;;pN*%-&$^f#LWg_%I^u-qY=l|e$FD+lwtgJN94%||T_ zS5xBcDtVgGgfy3mwN9V1F&BP-$-qWz#wa7({akc;Gw2uXV2luH33gU_QlKJbHP|n6 zKI71h=4e8{mxFp$2ks(QUxlCSCo&+MgyHIN0oC9Si1;Japgxh+*jy_G+mmrAfSKy4 z{=(h@tIbPW0=hzLqSV=^C{VfZ5wf}IU@u3tu)ic2{J>RYf+KQGuriqk@jk8KPU@`-Z?(yc+wcYcTmX45BT-D3Ht&Wgwnpj7{FPpJ!xmW}DL|!-&292*;OzhmI z&2THgzQ;-3lhgO5(~glT{oqf_)3xf&q}a?`NF{)(+m7-y#I;lw5Co@f^pWmyyDgC?TOtB zka7CK_UHAqSNnCUP4&mNSrLwurvh6-24_;-VkoGyVCgsz1cpPYzu1DkljQ#Vco!$u zhL1OT$q0hp48bGWL1SXYORv}eRNsxPsTJU=Xe-_gt(FO!Pu;!G^ zUu+iiU1Dc$K#G8;AdT`k0KE3ND-MA%8(5wj!LKWT6}~$rf_+|;Xp|Qy^11cS$xbKh z{b(PVk?6wC<;8_g?0YJ~NJJNq0fM@DU2uD~)Xkp%t{7cqPtBo8qb8zS&`eie1Ij1D zR|ERQ&%5+q6#M5HqjNs=2NdOauozq!T3%kQ!uKKCtYF_kaZT?us9;R~?OzP3V2&92 zRq(K$vI2BQ5oZ+RXt7`(zV1yvHT~VBZ_*9D6DOQ};kMTkut&vqnHs>tNsWcVRJVhQu3v+tv#xQ6 z06K>?A}nylSzl}obC6H%=j##qV9Y*|SK+zh-Tx}3>;saDadW775|oc)*v1pOfjyyW zqs?5)_f)$sQ9fZrn6|zztHDXd0?pzXLkUYrpw$$9O9pl3HH-Ak&Ux_!EBL~Av1x}q zcV86_Mjnup2t%h zETW>ANCjJPhiHQ~7duE)^3Tr)p=8uyZ4#jXh7x8)>xAj5)5-Qz#Y^6#_P@C1klgo8aYI8(8hf2 zrIp{pV*P^KN3xp;Vi>9vd!z~fDS%g8IvKI-S@d>ZclXR(st{abw8gk5?AI$U6YRp= zIQcv-rL({_<5&l@Ie3}bk6jbLpusBpx>M_nVjP_|nzX*nX*ZCS{eo2F*K9jE*9SpX zG(~l}I{qE}V6R%n$ygp7{Y1 z&SWvu)#A0fF31s}D*MW5S>5K20a){-K zmj%2prK910Q4_Ulr)yO6#?*ft)LG%U*9C-QvwG#Pe}qF`Aszr{qUdKZ&FDb{Hv7O! zq<|iF`w#98K02ep0Phrv_51Dg)Knf=DBQ;q_4lQygxG7J`j88`>U}53 z`aaRhm@mmoHozCLh_j$zK#ZaJE(oISQ4qg~E9VOMGy(D`Cot|X(pi?bpV{@}vd{41 zlg*c-vS-BcmofW14V`Gxr)}Y}g%XmeVD`VAR#C!R#3`@u|w{ROIjMX&sdF8`jGis&q0HS))V-XF^mf=a>76z5joE?F2{Istfxr^yaH=MChwkYT0(; zSV5y>+HLQs{Td`8#PQA_IYzHzm%1KK4!Qj*5#BlwuaX&jh`y+YXk!FLuU^AM57QD* zX?0&aH_1#A&vZJgt0G-x2h*JM*zX7u45~cY#c^hhA6}kjM|QmXT>HENICBb&Irm?h zKI~s!d+_LpBmQ?aKu01nw)A}YId0WK0kEn{^m1^N9{<3*A8VzpOUDok@Q&e3DnQ(4 zcAp1M*ZRN7V_Mwi&ikDtF`|m1Jad?Yl>g=O0%R5ZS1y?+Ezf{b%@?%#<8l5IT&Qep z7Pe?A zr!v6Q4Dx$X?vOUv$zPST>>n^Y_;){y{O{Nx-UG}DR!qu%jAOnYG7xWK{Dx4EgD5sT zE&6lcrytS+MCZig3$31G)+JdIJ1{nP4KUWBcs&$gKoKnQMKacRG%ykQf$?L|kYt_= zy}Xb1P<trXzOilO_Sj!FMLkK`kF3Yg}4O*dGaRk5~4Ee)y;J5^hx{zUDCx zo;;O;x3nMFu4#+k5Dgdm07KORoSt-AolDg6v+^5`TGh!}eUxsBM31qoBbBv5io254 zRiDIl2LLqWqembaK&?l0qx?R4Ff8B0lt1jBx6G-A? zMelX;vpE5n<{~hDOA0hU5hCS3ay&O8t$Tx7%mM)V$>0CUGU5w}BVvPzK3#2Z#(>2p zkFf=VUD6-+Z+hSWyduchgza~S%QfS!W9*vTp-X1PfKJnE_-JxeDP!;_k|r+!NY7_8 z3{eg3vpg0--@(y)i9xtB1D9z(GHb5t4fM z7s3esjtBp443W*GOBcCCY5b|nbB2L4masoR@Tv4D5;$)r{L|k5hgyp8Gtj*WunDfn zjxo->*UvxpQ8~JEX=Ma-AJYK7sP9ihzWekP45B(Mk}53l%We^Dz+F0^I5M=K1!E2x zj_{8jvZA2)Fvl>-y+!bcv4P-z6Ce)ZWE-kj1@7M_CZDEjp$1GUfYF`x9gsLGYI287 z8LrC4Vq&}%&tCkGYp{hIq|f;1JazfM^-~jfw5~*mKB?Vk1EdW`hIU(PaItEb8pGVL z^0_(5i&iR9FZ^!GYS14C^+uc&kzijw{@svZJmRZoTh<5`h!+h1Mv++T{Lu4sCoCBm zPRG%dd}6z2&5cO+EYJWRY^mlKAk|E*0Z)ZH6mr>WwBETM%u;E|HhS_0ry`Xi@2><8 zJ}Agbn~>I58gYQOzfE#>9MqDD$S`YG@`W>fj@gLd6rwMk!<>!(f2o#z1wG%m*btgO z(n|DDJPsRG;sGvS1`3O1Yjj!^*b%`y@eD0MjHCoxDcU&6-NMw+9fquM#$|eXXqbNY zaJ4Ei)v61)gJJHz%$!sOv))YN@rm2f&pZM5z-%Y?g2zDS_rzbk*HFQQUO7DK?Se($;KeQ7Hhn_bv&yN4h=#BV)##A$`};Q7M$J~JIs>pDS`aa=G%3vrdFb-!R&VJLgdqo#E3^ z0-1I38goe90}KeOK9 z&*i-9Em!pgQq=F@h>9nf)t&8__cT;sh1mVRPQISN*AF`To4A66^7I2LIad7L!F~Ro>F* zGqfgB0u`M1mEfmDg_J>g$=UC3F{q1^_RLGb*F6Nu*jQ?Rr;%J9>%Y@X0`O)uclhf+ z_&!H~5x306nwMPzNO!^b@wVblZU25Cx?HF(LzwmuEyI62Q)b9c^+!Q77R1yR+E1_o z#(EPa4Hp2B*^XNik|uiE^Ga|fV0xNEhvZy4E_ab$m!$X2IQd6 zLJLmWfvo-`%>JIBE9W7N^T4G{1JoZKfaz`ViPH)PfI*cN+_<}_LP=m|=LyIeJ1eWy z-8Jp7z5y=jL}j**q56ZKgz!!<;YeTb;||!Y#$E4qyZ!x^d`>%KQMPS}A3yaFH=Yi} z67cz{`#HLrqE5}RnMf_QemaqPA&UT)o?|q;7 z8dTYmjgSSC51x!Fu3E|O&34<&l>>kWAR!gqmEpoS^LeRTzI?z@qN~%((4QV>*J5nMMn1wi@XHO|)xyIfQxKR*}l6g<7rY!$1 z=mM0>bXnBi`_gQOkrv6F@imTnDIpEL@5Vt=+R)AvH)GUdzEDZcC-q=IyZ>?98KoK6 z*sw_w&oD36+{4jR$$u*O=wFO-Kk^erB=dXQm=kS$Pb#DapH(W3(u z2dFM;sp~(`c1wUG&PZ}vWG2Zs0O^+rTB%Z=hcU(iZO?>HMi61t z<|(3@PZ{1IiXo>DWnuA1?L@~aH&s%&$gcUt;T{M~24Lw7Gu8+IMKHcP zpedtL=`g1sc$0GNE&boyQ=pCx9GRz5Rk#~Ae$2+kY@3Q+GHmV7_0bj?f|OmR6xA3- zq`$(-0x=hT{($MH*!dNGC=gx`_eDuudM<+AYXHyc7KP^XJLX<^hC;(NY6D`o@7>}Y z{f%bv0`v7R931LG3=635uSW3(V&Tn2rUoMJJ*OmayuQxLu<*9NX2nb-4M7q`@-jdq zr+uAjl@Fo#{=fHHIRm1@Hi?V2Pn9UZMc4jMry)_|cs3~(XCrUHMWE4A*9~2=6mY1X zm+#bgA?5$6#;#FV{&F!wOYhX9xYQ{KLF$$zVYn_3RxZr`-~ert{Yycp`} zl1i^(s-;hBzPCt3dmfWefv(y^6C~tYb+$ha2i=)bFuG0X03u(nsrRyd7Axi5ODwrh zgy%B=*VK3+<1!JAk`=a2AB`=T(3}=ib?D{!^u>Et7b3N2Jq6Bmz@C1<+p+UXbGOxo z`>9;Dk%8CAS2Z(xwy$WqL8tUvd0+Wg);2apOx0g^yZNVNzj_3HcQUPfzpNH9P6Abf zk`LL>o+fptON#!$CHv-8OBv=MN1HR6PcmL;=gfznjULTxd;mAS3O>c}JhIcZrYgko z!5-8@^H?Zb(Pspw4;jEMdGIPkCpkD;(ew5q|Ahh6i0%+QV6!GbJ_aHBs@Sn2L%CJh z6oKuK8w`qZxgW5sCbnKu2?=6w*-Dg>?F&N|i+7yf4z2OD-4aL9Uvh~9IY!AEH2nn! zU%PB!&4dy7hvc6CO6(2$<@@e?aaCsxgH?AlnVC~UvhwO{uYK|!eVr&P_YywSCaeFw z5YZ4?7uOHar${3Ny*y966k|1lpcok}quFikvg;yZ!DUYp*eW$Ie?w%xfGxOP)0)@a zc#n4a6wIf+a3ndka<|WDZmS#yW9=Dd@H5x?yd+^2-Lunsp1Pq?ssw+3?4h1wjp)`O zgWNjC)~$Ez1N$Dvl)k`>hsbDDm5r}#+e#c$U*w!e?eCv?5GBUx&qrW zZ4kDSfFGEe;PdUK^caORgZ#%79ep@*5Wh4Kn+)<&7_K6GrL`JCPP3VxH@i+Q3$pc_ z^B5cPW_ysWv?ozUtia7cX9)x;)4;++N#J{r%IvVYbeHIg$}td}or}|RCYt_kc4XqF zLw8%$wWcT_`STmu$2z|GI2Wuy(I<&??ZgLEiL95Iz_mcC1;1ze<2z-rexnomE!nq3XzeiO7sBDFNJN}4K>vRBW}*ljKCVVm}=v{}DZC z{kGN&_82^Zk~aUALAxP)y4D$u7bb20%}&rdu_rQf@k!xN+@Eg&PqusQ!5MQ)cByDV zkT6+zs9pRUQEhp`0@EOxFR{i$AIUQ*B!WkV+-kSs5eZl>Z^2pVMN1Ua zktK}stN>(q&wgZE7)O~)Kw+uFtG=GrXRk1P3tW|vEApJ!AWyBnAgw4{(P3&%=aGI! zXGS_1ATT}^TV;9PUwv=?hF1h!Y<^2NzpPVG0f2mNwr)WfRsY^+!g~duKIziJ+u)-t zTL`5UMCYRBL6r!>({)S@9$_Fa%@{(HH1uFG`)Lq=Y~g8PX;p8`&JnfwDxDin~Sv7kCz zbllXyerrE2ihvkz7y^3qFzR@}{wRpLp)Uu1@4}QYC*@HS+uPf5`AGSPy}t1Nn3(F# z87$Mw4guM6*6j91fHVzhHsJl*j@u4ve)wsC*&{d5@xUMwpcF_yGgR3j=T}|9)`(z_ zRA>=$giB(C8FxPcIH7=x24q_auU^_Cpu3dGXOcq{k;0S8ZwWJhcLU0+DOr zP$~8ihhZFX}mVQUNNGl0b;M6U6uG znFs`)OpH*8sd55$0|+;*jQctUL=fS?kbhpqa48IuRRqT8(^+ZeUMX&%p&J!?K8sgI z`>tgK_=Ggoil7_tm_0-IN(uPC1q3EHBO+J-a@gQfysLBoE2*a8%l~?32AIDPN8V4| zOX`sJf*IyoemW+R3I(>Ck5j^l+<5)?F(%vJ!~V4TBE*MfF4zdwpZETb!e0z@|7j5R zO_0r8y=h~BcTbV&fzL|QZ3LN?2oUG&fB0|S^k8SbD7XQh3=B^@7tygfwB4BrABY!2UC6z?JFHzT-@$nr7J3 zK6t@jBgbOBTONa8=F5rB^`Vo=fmG@5l_Cpn0ps;0;z0mexoGedQa z?)!uHR!qMP6*S&+SnPp_%X*p`u)P@{Ve6!Du$b)zFz^ug?5Q!V3f!DVilZSA9;#;p zQpo=qY6yfE!!A+9Jlz3`E8uLAr>bj2{Ut1f4C$uoC9}-imDWIp&j55Uu~{FO_6=yz z*BobaZ|l?aV2_pz9L^d`{_DJge94SuSnfoB&zqss`oSJ$7JJ1+|II19TvuG~(0+zP-duLQha|0{jpNL;vJRVR9Pd+mW0sfrdO%B z&?iyaA)jv0&0%lb0Qp`{lT7lsTf+_2n;^+&{K4w9AgOOA4TR+!!EZSmfsXq1wfj=E z+Y7W#t!b!y7P|~^0XFPil4u66y2htBy+D0I0o)NhO~3FtrN!8X{~s4%Lp9PLYzA98(2vutYwIpmWK`w6pZY;;UmDVKwK! zxuGI;NQ7sBA@3zp7Zxre$H8&GeNnQF7w~H@YcKP$^uC+D__vo^!|Qh7V&m;y;Yc*b zYc}?0gUjXP;-|wm$RP2XgSFD8&8LikRRoqw285!>V7DVBuPIO~INs}Poev345GSZi6ND2iFpOOVNfhMbf`+zot0xixmUaR=SCG6;zsw6%Y z^p1N9d#C+Axj!e=*-pwfJ|vYgD+}KX^rrkQd(>?UhCbC~#lxl|n92R+Y $|^B6 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 diff --git a/documentation/en/.gitbook/assets/curio-tasks.png b/documentation/en/.gitbook/assets/curio-tasks.png deleted file mode 100644 index a288b5c219ae9699d1e0f76d9353783625573c6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246539 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�$w*RPnL?ouqNs9?kG_2rYYA zcfzZm#lj*k!0p@xkh9#ILdRUFEYZAtg-xmV>vPJZnP6!(RmtoxYSXY0ecEjAyv@Ac zO+9e}#vVQX3_vU^hvvOgcBEAdm?sTom6(r@(f1Ohu#_$5wpj0@9_A zDlKq1J2g{1qq>wO+bYd>kc^mky*LB)fbjeI^zC5&!xXvv3TQ*@!exzSSD(JIj}d00 z74o)nTslP3Q6~V8cLBXC-zEnNG1JK_!4*hQ4ZtAa3pGIjBecnPGt9mwOh~@gcz0-36>YmYY_+ezD=Mas>IY=_b9RG;bVijB`VtW3-AOM<#%U z!V`rx7Bk#X4%FJFN}0;qh>-BBe25FzE}2_()vBnRIB!vM)+2fJS8=;D60ofv-rh=sC!@Y46>HxtTTxB=PweNPV&7EWo|7XwIeDESSD9#A ze)99a&D_Y}glz|8A9n>DPDd^nAeCe{BM^N~x)Q$ZYHc#IAdrG$n(S5XEQ6-R)*7eZ zLdxBbVC96O>aq>wyz$SJWC~r8UVXaQxGx7^sq62mLwB6JG9;beivKv8b(3oj9}$@> zxZ!1+AKj5-Bs+SR_WOfqwt@OQ^3?rb=7!wZx7cm+g^ESoj%PwMU&Qj-cL%BecG82K zFccU~nYv&8L3z4ckHP9amwy&O!9TI?d3#Lt+waxZldU5TbC6c<7H z9og9xfYTy!Aw+k>qiF=R6NEXXTIJ{v(Dg{C(eH}~&vD=tr0_>J>gD;SI54cK{b5&C zsaXuZO*ZD>ToSvUI-&VT@g5`0&>_@~&p}LCu*8 zL1G#>M71DW~UgdaD$_-#F(TE+Kn3)hBERV2^>H{C_wNiy|zBFmll0X*(u5rWP*ZFA^{qR)Ue(-$YE0edq=~I1P zE;|_~Twe-f`wDa(+j}qle!per5f{^Zk=H+j2+H1Vz!7PDop<}=(MCyv>?{y7zV?2R zt&e*>g{i4N6Mm7{;$0 zw;jMdEDQdNU?O6nw04GgRZTAf7_6j;lKV)N^$g*VAwG+)yHJV_fw<(heFfTgY2KX> zL@tHU@<1F=%nM5I;@2Bf^JT}aK<68ow=e4XumTjxp?tlz5wjgpr?)^Kaon2U1R93@ zk%r@jQ29)dxEg4!UDg&uUNnaHYr6dM`Wc3gTZW^%2pGq;tcTnZgHQ@ALn#-2^d$lJ z5toZy3gTl5)&u<#W4P#bSSD9CpGgz))}O|(jyo^z`DSSrJY4=<__PMoWUREo`I@lb z(cJ^>Cbq!KLG`~E_kW-{z_Aj?UR_8$3eKp|vYHzy!XsAl!N!Qe6XctVv0nCL>9jZs zNjd_L0gI$~9d0ftwUw%MTLNUg5#_hx3&$6qfZhRgGjk>IiRlop>q0st?+EM)D4Cn)SAiq%ofJKe;=bB_Rn^52= zAb#TJiO$Bl$E~5+>t3ws=~m>ibk3AB1ctDN~qQTInG={?XYsQ>vI%u{xO7}$6x zk(C^4%mqk=sR<{BX|c1#cr*PU_7GVHU?zx)--jg4wwJoWZ`WA90-8qZCZG*spc<=o zaXEryV`WwIu}d$+`e79A8PH)ycM>Vv^&93Wl+IrIqU}It84u2cKm6nRU%d_e9zvJb zloueNh=#Y9skI_)Zu)3Rp&(1Oc(D0&dbyvJawv5N@P<$o*&NME$E>SM?2V1rPV3oB z2bRZTle%8%h3*a|ed)0{`#p5bAY52SO8N+#Fe=$P@cwyZ|1jl=tn42p01BA#Ql9N^ zQN7EO?V};YaGr~`Z;aIkFvp(kJJL#21y7ApKL4@ZT77@qKzbx4>dh)AbII;}ivWD1 z=PzEfX+t=k^r2hB1pK12P>8H$1cmYK`0?GKx|Jgb{EDOD@zdEpJi6;kN8TCVLFoOo@Lrs_4`+re50N)a2FY$Da|7+y6;SRMx~_=7dlp2LNC z1(FA8)R&%VErn&VY46Ju4cQlFDOa?Lg)$g=*}R$^i^x_+fR^HVUsVwB9 zH`}*e?3Da1FzEUTZ1^o;-f0P~0Tsx6!1Gme$?e;z`xCiChZFe}=@N9_Ntv)NuOr2) zVYjs8yRV;S2-TfOEStzl7K=;F14-{KiF`h41eBGD|c1 zStqQ}(#BfPO)uKgW#7$&j92%iHCYc*DXu6S;<@nku4EE}8I{>)r_1p)DdNi`61~Vr zDII5m*xK~1muyU!9@A7bSH%e2a%QNDlZ$3?cge|LH#nfb%bjxHj;x^E43B$`B z%RCz~|MAfIty|H11 zLwWL{2=MlDf}LpTAILFvspJIkH^C)PM3IKS5#(lFR26cyB>mYpZzky&nNDTvEmyw3 z2`jR!cc734aWWP^+5{f*0JtBSEf!EvOVZ`lo`PDubkv!()I0-|?@`^@oZ8;b*RaD& z6VGcwFS7!PT8ezf)M8(bra6M0W*~Xah}>S9x8PiRBu;;re`pa;;qkR-wqBX zmxe6oNG3PKmA=S#vSkkIy7)zzjaT!xH(rg@rNz%`?RDV%vX1#tKV_Yl<;`#GIhlQo zTdB(X@!Dbb37DJ;tY~V%hBT#F6Gh$8-|10D^Q7jTg88l#HtRYy)nYA=jz}!YbkxcTV; z_!zS%y77c}a)@WZ){e=4F%HPqg|UmFjSYbx`}t6^(sWp zc)b|dt%4;wN=PQ4raLE+urzkeRV|kHLdgE4%lq=y&TN0y3v=r<#{7fYE~u&!=d$y< zH2S^>Ib{&e&ke>`{(2B<;tyXg;&3weNcqtL)g;|9?cdGR;RJwLjptyFruKd~j%u5AslWfG`E)*`ewXg&8^@OB`8 zG|;~OiHj%jUZUl)z6UV%e~;tq^>LfeTaej2@_b};0@6&oqz-QT)tK?LImb)5Uuv?i zgfxvcPjR-HbPx{{-1Fz7h4~-%!*RR z&Ip^*3i()tK#tT_PWS8-q-FyE`YcC-)ch?@Kw8lS6N%NCmd*4i1pe zN?J_CL|qlX-M@==8@q=8Sen*3&u1fE@z}`uTAzz%$yjR9mPS!~l~;ckmHM3rXz+8t ze|>a9pLs)mG$crV^Bi`wHd+em4Y?P#p570a1Iti_4`;{qIWE+VE)QKY&&WP!sw#|h z%YW4vd=aEH{yF_?RlObN5&N#ET8_ywzRceHB1hJKZy-WLkPE6Kj$ZfaPZnX88xny??#faTbcUNl>x*&i{kn6=T@e__cz z>yd-YEV-_-Wi*!SlZv4W4X<}hGp%?C7NcY^P2q$8{`H;Wu8@O?ybl#}!6>hq#dsH% zC6}}M<8M|)CwTJKA+1#1B?DGlSF5v%bK5#f2IwM8Y%Uj+UA`V>=G2CziW{Q)Y4008eOl`GZLS~L~ncG)fs%_c}!4`^}{qLEk!pO@`50~2H zY~=}%&;84ns~pA0@NlIGH8&s~utE{^2#)s4;eea507yoI3c@$H+mzL);0cYo^g)1= zQfACC_fR@DBMm^%8BD*Go$sc8}5{Qk&QqeiUH1 zOoyU1aD=U(9>)Z3n$x-{lcZ;G`TXsXgxolXix}dI?;k;LynY9=@aAmFwr`@r6tm4_ zfvnJW&20l#GKFtgk+xijfoabdEx4^^&k`!ATdni_Ta6-P6D#HtI`xWt(!>Auzy;rYK13aWx)*#DZ1x`ORcx48ul-rp;S%_jcH{-II*Fs=%J4g-Pod!$q2|2J8`?SKQ z_*j6ROw~1*+IHY3E*rNc`339u^(4@Fvj)ov>Lo?()i7s0#K8=279uutv{_UvgG>t5 zo~pzWvI=Ab(d0r1uoJFzMZCjB-A?Lp{rlQzkkEqruMb=X{q~55`p5el+KUo5-t?&$ zL_#5qoZ^&Mx;*iyTMItp$zQ;};mZ6}z-N=WCxlb!6P{)c>my?&7Vf^UpRDziT!jSC z1^@ch%HXu*o0bK?Qn4zu@AhDIE{W{Nj4U>sZrf%BP2>-`V9RB{u z|NSP0+;T-aRy<%Atv^}kF$oy@LeC@Xe&qnO7}-7Q)}D7MU;cjk|NWhYrwLF$ z>H{1%>(4&M1me?76)^E#fP$ZM(jDiD*$c7fuw^BOTE&0A&wsh?cU=XbC~Jr5AMIci z@d_a-fbdME0P3RX&riK5zSFi`m7G-xvI#AQZB|B>(8ANE9&DiC@d(VDA9-Ps{ry-z z=ZYW<#9$w)4-NL+d8BJ`3}zheN9$9;7N#LAkgnDDYRXLrpno}h|N1SJC>mv~O%RMx@Eio0WCu*S@af1` z^VtkCd6Yu`w*~O;ky<7b{TlDK%odz*USX()$pZMTm!|j0DgO6wb)(CK@q>nijmR+! z;cN@F%K2>GpX{mq_bu@E*F^9CFjGbVwSubIDC72A?RsVg&;NFq{rj&I1q*=pP6t$Q zroI-n7z7dEwxuf{!~B`*4Dh&i5Ir)Z$^3i|7U0Is)vS6DiS%K=rbMP}-gNc5G=oA# zB6Du&)W5MNP1}C_uTKJ3cmh&aN{yi)t za9sLzb^upC0h#cmt^s_JyxdGIjrBdPPsf$H_h%UJ!th7mFMnn;5G}==UKc`wT73&F7fHx?Oh&+VCSufX zxT6Aaf>bcnL$VAz&4_2ZdXQ=;ib`3)#a%rOM-nk2-|3Az0e;{o69ejGyF1}H&C7!Y zD^`FP%mU!V1}EF2o;2waRKkw|;ZL{b29S6ppY@_QwTX1~)t5GCdg#_4A2x~x&ho>( zZ3hHZOFALeZm5N3Npv|#oB@-c4cB87R3#k%JL|XELz80YIt~o9$)eu_QpbuFK-8Z} zjc@&k%a#gRiO>niYwGE{bo7|DbrfA}HE3xiPl>MC+ygi!lh(YZ!`v;fQL3wk7ODGY9M z8xX2;TRVYP^ye?P7-U!*)=S(3GevnK&dm~V#(p}~4A#2KmcS=`)Z#djur0WraSBKF z@HiO2o7Jxm`e{i9gfhFKjj0Sba`usI_me7)bEGxBh_<>1oee#=?zmjHR_`G@;d0+JsEqR;``r{!Qyuny;9~ju0VmxR8mcZ1;(GV{w2@)7 zQgK3t<{4<+Wkz*wPK@)mg zh|`QCM)ewv_x-m>B#9U#195tu`c%(t{(;jj>agmASt26J!?}<`Dbdy4VA57YO_|-P zZVYlZ=lYG$lJCENvI#Kl%Z!BN;rnd82i7LEDTei8wio+z%++%&{_rt5PST9Hvnr#KQS&HuL`z9oO!=OfZ!w`d8csi=q{@ z0*Rl6__rRF+XF#u7X#k{8t9X!5RPx1dEF$?V-uUyoeJ=mG7}vEny;tV#B3r^eif

        Vj%CmEd$iL*N~xGvLq*00GA4*& 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%0A!^s5?pL?J2-{*$B0h?0BVuFUaA7WX__)l;5 zx{M%|Q9oN0iYbqtg@+OyyjN;#N4A01Dw$=+-GNrzpg||jl>*ot%ln`<)%)~g4Kjga zu#`_WiEdV5g&k4q50r+=fLPYWl@vYX1gDcUO=74OUb+70otreQrrcKRRFB+Ag55b4 zyHh*T;xW=7_IpWj0(P2PNaG7OTsORRT{UzK=1yg0(W4`@1rb_i-vgeP15I$43wrfjVo5dcp znepT@8lo;c|eTv%1$XE1({EMa~mmx(=Zw9<}XEWW6>o@+5@PA) z7EmYvDn%4)zG$pDNqijm4xKA>R=A|;D`DPb6khNU`+36N%IHst9=xC|t$ZdtTIy^={9K=B-y%=qm6D0pp_WZ}3<3r~z&*v4 zvr9E{9Q%vOaZ_zj^zT7Q!H?OWz#+s$u*`M$kVAdGcfz^<$1brr5fjd%^+W}^fKphc zQ;QvE6gL8&;fF=-)TLk4if#n$4Mjn=_J!uXu`_8P3ph-X%F@Zzm zU;8jX%7JWtbm%x|I!+&7Ux-_=s^3{Y`my^r5UncnFZhI2wz0&;ixF~v9AhNn%4X7* z7-vjKWZu%wZDUf7_Ll`vwLo^O~-6>+F%gCR%;@=_h{R>-jEA@AyW;qp&pIArLBnEi&j=e+&DPAt1NHIeV2c8ov_SrtnvJfVn-t;a@5 za&*!mQp#wMYy+9L+qF0=R?PcX+m-wg3)c_EiKLt4xHYJwZt~U9r~NeRT01fL zoeZNE2%R!f418cTYZZ^e0sEO{LRh=h1Dh1KGR006)+0O4c(rJa4^z*6Hb8f=N|S1= z2D%pl$Ro&9KAE{1RIQB@2Dr}e&M<~EexBVN`I=aY%7ywu4vTK}hG4Y4{T2KgXQ%Y) z&B83w;aSKRN!3So13SXfzr#yOB3O__T+4@7n?SrbxL$)*Jpy}{p^_|JGVU#NqD+l+ z_fAhZx$v>!S3v8dn}{fiInIR<<6BnN%}efd;i#}6lbr58B+5U7gqeHZnEdB*Qh}w z{*xZG>YAF?Is0Q+JwNzvuS-7)zvnYkqGgbPVQMx-PzZge53Z5z8!I)bDepwW6j5F2T$ybs+5hsh0fc(IVUF9;gzWd%+SR@* zLEaRfJ7lJ^s28+Vf&t4sZQwzxiF`AWM+bi~g1{#!L7w6#`~~+9rMKE%xx`h2bLg zPRcC;D<#k<^wZ=c`HM}xTXoo1uzPvM{K4<9P)ShhSu!LiQ{65$tzSq4;-;VLvK?KB zJDIIR2?2#xi)O3;y(WsY&+`}WvvCq>DKmo6s73J#pGLB>&~J&3%G1jUhox{PO8Aw> zBg?TL<;~9aVe@>ojzy#&$#dx&f^?AocYqB`dHiSQt7mic%7Xtf)9wlZ85>ZzVWV$? z2Y}0I98^AbReLhgcfD*ulM7!-4o&c-6Xf}cY(`@hKz9*xK;%RU=8@1fiApOrecKA~ zwJewslf~Y0KvfQTa9iDi$5QA#Q;$9M*US|AV+f8i3qn8oJ$48CrCBx<0t`Ck<7e08 zzRe=d!a8`S9|y|Ng2?3XSs&$|;oL!)KLDIt0#IPn$z z<(tlB&PIF7>s=Z^1qREQ3>y&`N^SQV?DLHE!2V=uKHzXz;R%dkJ!TH_bNCNh^k~p^ z`~kmLKDjN7?}yn@v@qYxDw3yZ_DaavjOl9Yp^gO0kN3EBUH#KJogLZe1arr2@I9~T zo7dMy-WfHYrl$7W$ACnw?|il{XPx}$O52=uzSP-F$tt~xdeQ@9Zh7;SP6z05Oq3%b zI8pfLPGm7pxjl~`J%`~(&3{~~@TLxxo7I!0K}x)S@NXae>P2uF)|vF%LY;uDG@-7L zP`T`yB&O*~PqLZ57r=D-qa#! zWOosz{pAfSyG#aGXS{E+>jrt|&yzM_t!!3)1bs(@!e>;Q;mvYQJc73e71Pdyo<7P& zA>c>Q&&I2etepaUPRCBm<6cHT>OLi+#p|6WrjO*CkL1B#M$V&M?52cye~&8=EFOGJ zQ$|Y@^M*aziWds76E8x$Db!qIXv+4|BtQk`W{^Ao?n-DeOofC(i+lSt@uRToQ;W~i zmd;i-xMR9$Hu&JFB~;vcFqMBtqd5;VPRXz8{0)_P63`@*LK2xR zA4`Vq1srxh3-=7(l}YA!>Sv04R$8ROtNse)p@{P>mB__gvT@)G9PTZDNu~mq229!C zu;INv45%*y4f*o1gyG$k3{ElUm&Sc8KBv+K>y)Q|~{1_Fz2%h(-xh*{z`#$9%3zg38z!Pi2h76${! zMWbAKzx0czJeBq5SsL9Mcclu)Rk_~i{A<>I3Cu8DN0rkq%J!u&j0N|cZkji@p0@*Z zpc_sMI5NtG{ocJz!}c>?!Lo9Bry#h;kH-3(SJ?lqcX%8Q%sH~qzoT1`3T_oVEaffQ z=tTMj&hQrY8jj zq8=V}HPhvfqZR)H+rwqbSfTSHG1cv`&#pAdE4*Rw4m^2lS7zMkw)Q%C&y&)Sy2x#h z3>tC%AGTG0szB4r&_1GDk)k{8-f7S?DQB)-^{vymzE%u(nQrFjp7)>UUN8#kb`LiY zY@XhZ?^w@KktxwzHT^m7J#M4!RTcP~5MuPVj=XQ5oEX994g36|dt9Y@d>D71wp>p3 zuf&+_!)YszUxaj4zOO}}LE$D*SNB7cZU(2#+%EK>sGGqtf&EsWO$bMCTzw*44nG>C z-(OH}aG=0ImjiCm$Q=lL+-k)N04_-XQYqu|`==Xzr3k(6HqMt5dt*5-pIRIJf8r( zO_W#z&%eJ70dd9ib3x#scg3@IHzJ_Y68BeU-Emr;^Z))%tR7gFGF1|1{&%yP8+8o3 zTR7YJ|KJEhAcClOij0}7?e=!S220|7u~wUwK2BofEyT$o)s5E~#e2T7Bw3#AA$Aew zA3g&M1vU($W!e3mOg=@s4P%p$0y`~oRpYl*`xd+Ycnq>`GHKU)QtF~7(Mh~SlZwlY zV%f#O(aiR2a{e`q9ioP<7k?tS+8)3`uIDuvwx+rOr zzDrcIhL{Jc*=jc1O&JAUMB8S;rHUgmstrW9G3$tUAuNqB>+;*=Rz zFF=2c(MfmGsRR&hXjCtik9d`b$1f?ZOGb#l$l-dXpTf+$3#8~1T7x-2)h#98r%$y67r7aiSO}!{U9o5x+WfFadyo05J?Yfh|p9e?q&v z7P=kO;ftsGmrsQXJTJ10JkitJ;578dA7XVT^{>;Wc<|nr*pa7XQ72DM~PT z+t_G?sN4=uez&Ptkmy1c2r!YCuTYZd&uT}($+lF?LuAy_#=z+7Wf*z4>~}2iit0hJ zOJ=^>)R|ut=J?t)b|D`;?DZT&QcjhOt#zQMSeZEZMi-ab@3tzlHvV77>A`iHh3^$_ z!VeGa(dB}NJ0HPe6GA8RpToRqd!|M`G$PK2umwJESX$B#g0g!n0oO?g98$DO*!lo{ zAtiBA!)^?#H2+nWx{nn`A*TahiAoKKCF3%yqo+9IUk^jwNO+6(Yau#`D#W+3Lg&K7 zuqKjkqtM8kGw!sfFunIkz8rZhQK3*MVd^ipWWkJTppvA=kb7!!C67%sGQ29883!Pg!ICW5lkv^b9N7!{Vk`Uk!{0m)wyn2t)ZOQ*+S z(0RG^h_8eJTLt}XHRBSt5-$c~YH=&1Ww)CxP9!T=Fc&xMn$dFr%=+6^>SPp0SD4&s z?^lT8W*LFAPdJ6YXg(!IAMS?xAyaH{1^fT*Z}}vit<|HZQ6@@OXp_Kt@I0q!MMB{FF^^iA)AFtMirm;(muNH>t;G67P1!E?kUjNV zV8qkc4-m&!Ve9^@?+q<|=5#6ybqSOIUhW^LF@7hbP;XX*{U{YG3aK(p8Xi>xn4M>6 z41Hx=f^&U+fGkJPXX#riuEKZ>*+C0gPR+(egsUw_0I4@x^jK!~Z_yfN1jN^z^?=O#XMx&;Kpqp_ewknPn-XVM`a`0essr9!CHZL^mhhc^MMBY(j1m z#;TZCx}>s(KYcB?o!ICmWg+-aQRD9f>=}#(!B!Lb0R)8c&7GUIoCEGTO-0ls9M%eg zpUyK!ZPp=$h53)O#f|FtsO@S8up=hWIGW1GP`EL#hey5%xjn={g{3C?eLSFL&o-t$ zGGGrE&A6G77^A{*lo~4OFKSMS0jRYzyjJD!+cLB&=H!{C9rE55tEmC>+^33oHL0az z!(GdaJN48FhG*LVuw;fAAejh4M8y#3YmhvJzdS=Nd-yyFf69rqw$|$m5xw2gZx8v6 zX@J@&R_}_K!;kxLM#d`g5fESpEm(e_<%Si6sQ~5ejgCwbutW1Tn$fiVd_HB~w{f0Q z?q2|hzmo`ft@B$l-cOxDMjim>H1*BrVoaM2p20+Fln}Y<8Z<4u<1~H;!guK{DH6@= zkPTX!=|((FChhq-O`uz20Mzie&l9&d`xTz#+s~OQW>=PJi4=L#*~hO3_BM3;?Ro5FQA(4o4Rcb zE-&mT5d0QMGSa_(KvTwg*?f_H8-F$y&<^Z^EVgYyJKspSIX{nA#)#8J2PSX8Qk$)_ z`FcQ&Arf)M#4Vc$#H|H-q!CzhUT~ljPHD#$pe0&f4<@_~<$Czhl8ftbCYi%8&U5Y3 z3%=)C`!}BZj~n+M_xBC1(N{VLqGN52KTOPd`pLhQR6xSFZrEOrscOKn{W5iPPykZH3Ok!-^GmSO+^|PdI6Z0M=HH zAPRz%#+1r=`H;l)2RzKR3|0pN-GzzYJ%$aLX{`nJ6O`;`E69iY%fUC_Z_-}ge-*N% zNM5UAlIhY= zpDR~d0?_chq>ECgyB+Gg@x~mX4`cZz8VxpttZ4#n7#D~0opsDp)icN+)WP=?N8c^a zSjC~|H7WS+bbE%?+b9&vT$Nf!zf57I3Ft z(u|yXO511^zDdqmoC`WrJrS>TrjHRF;9j^aH?NwLmc%>L*$2-iJ~-c@;XC|s^>zD~ zYgW4!aLty1q&o&(=X7o!07c;(a9}o~iK7E1*rcn2Rw^o#>lb%GiiNvwZrilsNbdvr z+s-w~*J75#AG3224A&0)fHgKK(I>#~?2{}};5XGk54apJARf$V4cu4 zwLwP>SWIsFjPE^Te1^hd8yVmkM81oTL`5TT&JLeB>IQ>Bw3-D&=NzSxk_8(csW<-C*=4Kcu8@tNKx3dy)pwz*nT48K;SM?M~=q zTtPyKRS^vU+DItToqWHtmG=!3n@s^NFsCF!1xDvJs;=*=q)yX;GA>VFY{bT?Q0*_( zehK%_2!WX8*@f`^oLq(3qf;lE>$Kg%J6fB1OFmBgB1tYiw>%?nArnh%dl8)`9En1Y zk(cB>GFHG!6tq2keJ&hk37)3VaMfgqz?Tx)YCE~-fP$%7DBQIJc>Heu z_hSxpf}@{6k^WnFXIslA(Q%j23Yl9xlf6*a-wjO}3$1#(WoFfD z*4mfj;a_>Z1xB8yMs1D1HVZxrCbtx{U1B`zSQ!_f``k`P~w;3`~6JQ6~yw>Po~RLz?5%vMT{tu<}A5lWhPjs z{$(^yw`uwKcN8Z5lksD>mHY1>pTrDTMIa+;hO4_1NS`q-UGGK=7&VF+4xV<{*}kx- zLn-J;b^&hTnfrau^TZ@^LXtkbjr=9_HSs{ID1wns;-%*kXE}SEBIU|N85@#HuH?%d zpfll>Udzer0}Z)}eLi{^(%YLZuH9-neC7+NL2T6RC~G>6o}>OH6}4FLCzyTH6yX$$U29Y1g=5!>MmV}P>vl-rrQbY#ZFxNGLh z(;o+>?JcVNJ%k2H<(FSH=VYl97t-Xn7X6?1! z#DNZ}C8YO!?y^FbF4OGo^8Apl&jx#2P6lA!Co9Z81g1fQc2XTDj4ZU{|E~Ui@qIC0+0^>dVY8c8W z8UeiAy}=dz5+lTl9fx4A;lP9z691WLTszCf3IQ3XO&3MmB8W9Xi{GnA3E=R969*%0 zG_&QhyoT96e?D3;i>9L=EF@&(jr^#ID!+NeeE{@XINd5?U7!~TUK_m`x(rC@;?A;I z^aCEiR_mX8S|^M@5}Z4%oVHjos34x$DQ;*G(6LYgqYrt@ zADV@Pp;T-+p8Oo8?S~1n3aX0)SX$ z-24}OR5Siy`e6jw(5ZYkDRSMFppa9ycQ&WHXg<9%qSs&^hJ_e=nud<1k4;yjj@_m`K&^n0S+bzItQ z;72fP8Tv)#z=yyfQ%V9B1aXyH`^CDfSr@>f$FiDC-9!sQd{(_qYXTgXr`g#&9ZX^b z2A!9NE!9&@&YP^pJ;I+JrlUwqMS+;wfo)AC~ z;CsX$L_nPcqWVWoBRVgZ?Q!=cNVl?p6s;74oCCuq0VE$$=|Tt>Imz}pMeb0iB}^%J z;H3~jVH$PJxSo_qA1;DPp|8$2Xli%!oQK@Y0%6&}r}WXb;HuPO^Vs|Su_8h7pIc>j zM_i>p<((4NXf-h7v^wBKGFKP_livb#TOqhKoD!?sPxz)N0H64~lz5R7E%Ml8RU%B$ zS|H5s48YbfHsyF~)RY`EHO~~&1OtxQm2M3Jo;dJ_uZqRS3=hJw25gTRD!Gm4o^7~NyC#l=%%5G! z&jqrQDp8CqfpaVF56zpy<3K0K-4}dulfQu?ol2`7;>>_*&n_rdoy~;gy`{6F2Do;T z;1Ee^_5;+Ibr=B$U5WYz5X5-@*6Vgsv2A}CaVQHl=oVTXu#-|<0-poJZNJoqsPJ|w zQSc8+f%(4$2-E6m#+}v(nvebh72?=_+$u&H=x%J_`?}j?4xb2L8qbVX$FB@=5U%uQyfWaJ8A35!_PODoJ|N^t)gHv#w#~-I_uLVKEG}Jp;wxaGJ(S2{dD28 zOZ7=8^*wGZHsWGf66qd_O7r)pHKJYjJ=5tyP&ACc8iVUpE=iUb0Lbb}`G^ew{{*NZ*`BOw6gRbJ|uKQPm%D$+m5W1K(zs;%O zC2QYqP-|A?7R)lA+ymaeG<=@VH214(9H$`)K@!v$sZ#E(7)Kz^;pAfqO8rq`)_Gv| zu7IZ?Wtl2_%}nG^BV8aE=8U1+MP^2b;MegSf$)eKJM*u95*2vC0!Yd#6{SSoklc9Fqr(7mM8K1uPz{JX+nP?rmyFz|o$xQ8 zBUs{xx7Z9f>q8~1BS&8zIhLw%Lu&H9?`kru&TbWLPYgBes?zcE16GV01T$~I#eszl z*nB3-m0qXj(KDH99GtGz5{-#ndaau?t$@mC()BWeE|fGfr6bgJKRA8esSCw5<9Lj; zaL&7+l?>KWq6b(242_&PnzSA6RJ#SB?pi7s+%}S#$t|9;uAu>p4P1&)Qc^zl(T)I& z%)p)B1s6N-Xw}XbBHCdhGD61|07yVQB^BTTZ$ELEVfGvENNZ(OOMnPwVvyj%Ts_&z zwb`|nHRyF`91P*U2PE_2$f^We{k$hJo0$P2B~d}%T>g@-S$j2inakK>Ktt{@nH)c+ zIN3E75t-33u8)6b4=$}|PdB~5gxZf3*S;9z zJHYyJC}Su}1e<{F1f#5GpM7bS=!axZX{EsE5burh;A78zn4AwPSM|_l(CGNJG3vFC zgwq}TH!BkXMcn96+rsF5t9y}i+Vyo&Sq>@o#nm<~)uKC1z~@K;n@f+5CSuL<&wKC} zXqgseq7TIKOdQa@U?Z}B$;Nywsu~E6vqZOMzJb39Puuy%M$d*ZYYfhcI=68feWU(e z##RTc^G%MF_fKqEtIO`LF{p>NO3eS42&=(~u6<;(DSfW6Ek04Sy1>^im)o-Iu@1CB zA9|1AbK6n!{#VM1VCV&hus!aE+nXH4fsG?i$sw~@A*?aS?kP9>SGa>`L~CB%jYq@z zT|?!RgTv%^{Y%S|{7&=Ndq5z8T*P{FPHr&QATe?sZYDdU^x+H69U|t1{t`~NehgJO zVkaSA47}GKNn4OMfT>gk#EPy{v3qG?Y`T^xuLTzvKNj&d$g8PEdHz`IVVmGz6;0u7 zlHI;ow#7rqGtaxG+Z%t*ede6`>9dO9)!{^ETGq<2@SO^23a7}yg>Xobc#Sy_lxj_b z>J3Dg$zZtLNn;s$4hK$h$kem0S`khrS1>>Jnr@PRAeW06B9?CGYRk+I?@iAbVP`dN zZLdwF68v0|$`u!t!LL9!n!ZIdXhU025>TGO%r2U{02sWdJN1nY%#^O%oXPS?2QkLs zAE2gzU4AB`iYcXNcIgf@Np1adf|K)8KscB)S54PMq4-QkWZn})%g-%Lw?V~5*6>2l z-f2*&px;X%gXQapV)H}lT)+1^H86hb@6&PruZz`LZsL;c zD6)J_aFs4AgI2)XIqpM~>2dl}d7JuJ7;*_!$DiF=xdBB_*anrVhD3)DQX&~%)K7Bh zG(Xq77!0SnE*?$Dt#3^wo?(IJS0qx@bU!x=dR~1@vWoSOZSp`; zHvI)mX?`!Os_Sr|Bd{i{t6%|={vYcZN}dnEjPl$}}Re#H$ZmLiLA5kAO(D5wKR&D6@Z?ShI`?JmBCr7k7c3&R2c` zB=vo^!@K;;D28N+7UIE4AZWJjZclYZMzjC>Q zFqgYagVg$VY@*(QcFTV!!>v2FGv+&J*%=2xTJ`zTDI5hWowIn~yi|b+R@X--$ijTT z1_bok(raB2M2x0{{A-#mN&}eTyJg{z@7zw&qUAd@)mDo3)o-!j%Rt?nW!sLU51st- ze18jl7_s)3erI>-HXkzj)O-XDg%S@P%WpU3KX}}q9|a>B;W?0W0s5z1w-!`V*8Lln z%I+l$EmP7;S2#vB=8A4nLeZ2rHDhgGF`dJI*jj;+MJ;qJ} zYW7Dev_fpvlp;l)Gwo;jv1thd;t2dX*hlahBI_cmX zRuI{56*Q&-nnB}GqT4Z#MLtv}zQv;pLM0AB-b*(#x_WdWq5CZnVT^&3!7l8NVTD(- zH^>37W9RmzWb=4N>}W;s>1!bu`J1k#RS|$Ceudu;XTu|MX=%@b=o9hxIxH;Xl4FFs z)(kmzdH*VL5TXJn-k|YKdJeC4J~h+sZUku)1OF9iM=(qe`5aI`=YBQ1+^TxH>9ps) z37g2m%Y$J~TGW|(xGQp}6;1>x>PR^BafkvPa!nxpA~ zGdsencIjXb0j>iIGRHmikn2D;PU0*_q06#VC3fLG(@MQjn&7(y9pUI8(-9~1)bGIU z=|?X^ku<8Q1pbmc|B{lA?Qcy5WFt_jC5Vt14*)VaL9i%^r!`9AI731(vVkFga1p>y z5Pk7cCd!;rR?iNMbdx4B;4}Up_~{r#2Oj#$#pzKcbCFT{v1;PEf9B|D-wdo9@mlSs z{ss9@rvp2HbF9yt)hEtnh0ralgbZXyoKs^AZ86flkWxJij7i7;?-k+~0tYmmA|%tg z(u6#ip#f}mxh`R84J8rs7{}qFz-yR~oO)Pn1X5r$V1#ZsC;skNn0>j{FSZN>Tm)hmJda#A8>%h?RWyK!UmndDY+|{!9`uvgbI~Zqb4_MbFb|;VI!@s z77<@AfbwK$`V*iPdiSL9dT>nZ)?3yt@jKqYW6|{~WF>DhKPH7(3q=i?MGseh8K8YL zhP(Ke1;Aj!5Y>OT@e`K`9*^>W-%KavvCq?$&-ux(%0{Sm;pRCYS!~afCo`BWIsxnD ze|@^3{z1Wi7qwq4h2XR1gnT0=YU2F#=v84NboraP$P~&}>-!%*iHuj0mA}QL6Q4eMIbv9 z{{Lg^Ed!!lxA$Rb6iMk0k#3MKDFvjvm69I1Tj@}`Q@V5L4(aah?igT*_u=ew&fe$! z{Xg-En!DDzYO&~l$#gmr{usV|(g|H5Gl57Bj-DDV$Gpzg)XOioGbODBy{ls? z`AW)GBCj6KF`Zot{(JJt5rIdnGIbw$#zB0p09e!~S)kXI2<986aFf5L&T?ojUz zriCvj-$X(`f5SeP`#~|cmUbK)6+`h54cNi%f07%`1d~W9cQ$?^C-AZ^em==IrRPy@yIV~=I zX6=I4V^TgYYUG&V`E~FahZtP~Y!blG&oE3+Z1T$N1v=W#y4al$@}AVmrwZB#2tRxV zVk|Z*fo<`AJw~4!do4`?2MCzU?z4|SulFl!m3D7=N>nRek_G~tvo-b6GQ@+i#!v8= zF~1s+@wtUXq~E0;EH^{Sz>y;Sz?P^w;>VCDNgT}sBB##_?0q*C9VgXx_%fKwk*pih zh>gS$Pd@{;+9Cah008)t>UCzOc&picMF&99hR-Q9V;3VrpC6=TRhG=G4!|efSEIO+ z7*oB$x-xWgRG&UcZCkPk?8JgSqn(@kM8|ML+>4bGZjHT{i9bc_Ev@GzpQ6cQqk96HL=wgJQnE^k3wKFXn-&+wQ*uNEDl zqa}FlnLYa^bNxp-mP6}$7|M-{FBNUc1Y9s6<*%<$NpWTIqTB|19_9dGrToM{tSyf|hLJWY$;q+nF1)h_?#7+N?FS`_{UvtAa z4ON8I)M(^lf{2!&5dD52pR&pO;Kch9|Hl*||AWQy!D1yT!-DNk&QD+WZ}r|V2Uaf1 zQipEtB84|EQhZ@}bjpaCc3JKXCqZ6LiujN!h-G!L-SXpYU zHBu{0UDG1Zri$&orK9<%*VepmZZv_JA8hkL!~vwq5n$7UD(dW()U@ioh=6>DC_&Jw zuWI2gk)Bf!N(goN)IfZOC{^C*wV?1Q$KHhE6uS-PW+Wa<8o1Q4_vIT^ebf8=A|Pn9 z8+X9`VJ+e!+39enF7I^TZLBVBsy{XZP#Ler#HWDl_Qlxj3iGH!-yj0%FI;h-^fOrQ zoHJz!CW=bu#L9FdGkXM~uTf7X`n0W=YzZ0mks9z)H><88tfWW{=nkhd54wpJo~NrY zS6u5Yq&Is(YsR;THC8&&lpRuMlfO9FkKb@#j9oVipQnU@U@~9>&U5r<)C9OUct#!D zTp89Nyl(p*hR1?(&q^hL=bUIE^UfSlFCAMYJ*sOsenOx}3eA*rCuxFR%YeF1mjt>x zg+n{BZr(5qPj85v^XeKhupFFC0#k+_1M%$B)b+BQ!Yv4%V7fgE_acV! zei6fqzj*qLoXz%Sn*00BMk}ds=bAI@`&S^W5wVOj4!p5vppwgG<*chkiU*5h&0A>F zXsZB-*%t(#Yi(6noLut(=~Tt&$qr^uy}jVamd}tdjQ3KJ>DxOJ0vyRNTbXn}%wluo z$UyPQve18)4yuNkPWF&M#{m(T8Q^)f{S%j{U-tIHtiR?{=E3c&P|(#KsrdR)S@4E%uI%)7F`g_#e5`)ZPe zGrcc>y3)jHK0C zu!#5(B-NZANt*X{N(&SXC}KAcepn#NbK=vB@bMt*`zL<)M0nnNXoz&mZ+9#LppD7{ z4a>*B6kg3#+Qi2#vmZnZYmD`*H0M*L*Ng<7&8~Q6__rRP^oKFTY#s>%E!@GXF@W?s zV*qhuc@Zi3Lj&sCd>F#@9czH?JEiMT=|{*oK+ef z(V07*V6ZB_FeA1zsM7U2KC+Cy(|CQgz(2C`cr3NFQe`d35pZ*|2;|!g0qVF_Wc;M| zbPv9nghc4=hn1UEw-3JpH3n|N2o{I&h8`_fr}BVEVdhE+D>_O zjKP>AI`J4-)EImHDSWE0-gm8Ww?G2*pC#8fbDF$m8IcMGWXRDX8vvs|C6c$L6NC{& zMk&-G`L{3$-j^r%Mbzu&l>-jah2bq_v(66NOX#EO{f97~fKatZu)qYzH+6KIRlL(r_P7&({+Acgbg9rd;cBtMKi_!=x476Gkh}>u$=_U3#UbgfD{P7o zEVnCIC%!b+aB8reM~*-@6Uw`G?BzAg>^*pOM#T-p69`xJzBYP4FykVyf+K&a-Rh=E z6|k#R3I-HuLN$OQO_h344e1T-fkRK3HcJYIB+S=zEnDsx3&k>e{UU&8$VJ!?UQ=eZ zqaAPWD?slaD9|ImmJ?dCICS{3Y8LW+xK5ZHZ@1Hz>g7ve$KLJ9 zz!dbzHd8}WyDwxLyt^IfE9W+tl8ZE*0x_LnWSy+0pMj9Qk1InYM-Qu-mf|bJlO>+n zZLcZUic4i1t|&#tUrjlR%s%yw|Ne@3wqm!oo-VYW#u?=s5VH73hlR20)$8PsuU-{u zUy+p2{t9m9!hyvKPI|cv`S2?eP$pB68SaVxy-mKd!5+M3p{DIRTTOYYNfE&6(zwrX zgp=F;eoBj(1N>ugkd6sAh_BcnVy5h~&t1Rm;q2jAr#BeDZC}L~%ezgr-?4!CDXN@! zG3n+Fg+YHj<6()#Rtdk{cRe52muFNs6r^vFLns(B^%-LkDRfYG+uA#uYM|ro;?DOC zSBIM*djBl=nO77>XKrK%syWd8T@o&&!%qm{Lqr zHA%sSTq~gs=ZVm0PkngcDZ16AD^-XBADz9Vux9)~@5ynid}1?;O4coJ1+2AWMR*wW z?WhNk=3||9fO+?-6-gpNy<&VFNa}OAOlXPv+KgF>((n4+=s9-2s?)ny!SFbU7Qvt5 zF6^T__XYU)L=(IW2n+GWx-L9{oUGSGkM>AT7DN=tVz%LDtrmKYaP_QG>sn--A6$1M zm_ER{{2^M?e5nG~BCxrsz3AEJulXvDl;(Z%l;<*-zHlKM2p#)CdUx0mwfGACgO6{{U{S}rKlSZZ zcSqS=u`q=4ZfR$`%-LijV(X)-94HKLSBNXeC5r6NU-8; zL_|vAXQM?Lxr?!iXw!Ok+U}CyA1sOa9pmgw1}p`w+&vcaQQU5G@H~b){jvJhTx1$^ z3|PhWt>^jIjA2o3##|sRQ)?L5Cg+YbnNKLGc^%Qkf{!OGRR3g|6ub~69F4%7I45a zpudDrZu*LTSwHMvc3(1UvJ>Kg?-(I(KZ~CJdtZF%W;l#Lo|B zO+n3S*7|LfmRyiB3X7ZvMkvle!_hkaqw7^ed^lHWuF@{er<7T38pnR@HNC@TnocK& zo?z;&ps9$23UZgZ7&^V5(a~PtXf;Y=`gdoT_6)N4y_VdpjXmxwIAN0Oy6MO{0;A)JC+x}%C|(@hz<0 z>63)*=Ie>N!1{4+8)$u-fAE_juaFEV0VX`YZzg2`&6jlW+7jg&G4111l{3ky(i?e~ z7YHg{uRf{*9(unFhu{7V1%B9j$bL#soT3=mq9QPR&CYugg_rb{5`{nyL{E|f9pR1) zum9P&u-FK3IkDb`G|E)YrKUc-2gl2rw1yveVt(bgXeQy2rkIZZ0g*G~?K^tH`_(;a zzcMS*Y%2B5Ce0=OR!B$Qrc86rX%OuGYw@UT!|ZNsOS7xB5_wn=--wI^9Ht)4Q%0V>KgUs@|2 zUnp}WPfGO@Zqo0B^Fa2<&8vIvw9?_Q&3ZD!Q9ga6biAat5Uoblad$rDU@C~~yLq$j zyhDsSv$A->hLusdx>I3^l4bAPPLzVZqBN_-y9$|fzTOYZ3r36)SV6{M_N zqr;|M5Y)K`BOU; z?kRT_=$^#<$k)oiHSObMv^@J*?J|W}sM1=}j=8j;QSE{_QC2r*ctoVjUt(Mg9kWf% z=PPF|%TiW)Z#jESby6rmzchopL2Xo3;ZvbXM$5;Ff`qxCb_Vgr)O<~)y=-0t_WTjq z%BJpYxoj>D`SAYaCb(c&r5SWb*1}ySowH{d>-lTXkjr8~YX#B+oBb0{DJP>VnE9eb z_%%3seIdY!PfR^GYi)J(oY)M>@52)1M_l(lzmhl>44bb?Y!Gi8eHNk=W7yUvB3 z%cc$Qi(auBcJC1??Z9;}CpXI_c+BSKj@8ol)VQXM=gOH48y!yPRBkm*?N1(VeE#cTg$`#&nW8x=unSetmOVW+~g^@JZ z=sbnmJRZEltlKG&pxmn4)0?0d{AVah@-0f&@U17LwBr01g*m-&zjoe2 zS)vvfI_=TQVKY@RZn}avu2zHwzSbNFxM*oWb2xjhN(9zKV2|E>r|VOvmiL|a?qgxHHhMRfg{=?i{M$v&eoARr4q-5%c5M1?%Ju&mPK(pF%c76 zElUE0Mulc2cAh9J@g-}UmP`&RIz++g4j1j32%6P)&Am@7JULU0v_&M#*Rh_ymle7+ z`Msy(qJ2MP;>~I*;$G^7W$89pDQ_7ckira}!jVL-j|3v}sGmVEB{lQRMK!nHs+-aJ zJE}|L_4OXSna%c86*{OL`FR$T19EIlU)GQ03gw-$N~=EFo!?~8Cx1Ubcx$`Yva>>hAM9P{x){MQL$)1XBIJ zLrwnkDr4zm2rGuA=}357%GbJGPiZn6PVM|ff5Wl<& zPoBIA&3qS_MZa?3J#or)NlwEN~eP8=06h+k9(6H8TR{Wp5=48DO+B^BI`wek z$gqg?P`|}4JnhfrJLR?%fd_uy7Ky&z5~490tK@{H_UFr>0yWWg@V$xV0xc9+U<@cG za$-fllzLG1BGUg1D(HZN@s6+G>sGU0)aJM0opE!_E$srHq=t`kNgphR6ArT7E~8-vzSv##?{( z7as%WolEg`@l6}wPgOpVB)YN=3uVb8eQ#+NQ_trn7FU032U-g?GVx4zuRcViPn-tZ ze}j$(&sV`MR!{Z4=f38RlRp-&9I4QGEqBSqJXZ#%d++G2{%G)0C9*WNWq+nQ!gKG` z8SQ4BdWS<^P?W`3_JD0$YhWJQ?uK^u4U`~sKPuLQPono*@Jjq^E`}@5XKSjj%>v;> zvrAgv>CEpR^u=*I|HMI9ZS+PO13Je>28@K0>hPpuEV~ z&DU1&7)R-su~_iKcR;XFPg+lp9a8k0QFdnDOf2{Davp5o%>B8O5hE_Far{#hIK>N02R`MvUK zxi|;4=f#=M46Qg&B08pj|4?KGc=q@uQS1Tz{o4c9r;8sCWCfh4Npqe4 z9~7^Al4+;@TSig@`iRE_>cmU?|NWT!#RNMe3*3GD(D5Oh@_9Q8z_)#R6n)sgf0?E> z_V)P`7Xe6&kt-ru#aLF+d;Gb&1S7I(t2VxuVC$t^Jf%EjK0Ux{{=3onDMt$H9dg6* zY=#15zo8gQaQOfEcm85i0h+Mu1AO_%o4$$Gi?6j6qxVqRi2duXPrpL@C#@azn;)@o zOEsiuLnZ2CIV~rmCw^K#7||;v?$_>19@O4vR0@q+Ra#QhnikBXPa>+;D?jyMLx=Al zY0A8R?booYG@D7i=k;6;iDA_KWbE}D++Emgv&(>KCRm~B%hPXYF%rD=fBrHN4Gn1~ zN<3+h!4dp6ENYJACvD(!YQywZz<=J0slrbIQe6ytQ`)aO#A>7bYemZq*j%*E0dPhF{Y%D`qK!X(PK+X>$L&9sEQ< z7$ThXS@q(;R1grE-@#Z(#^4nZ_Y!Vs)ID2Y9IaUfEvf~)^-7Bvpp!{0Rt)}v8pJ6i zjrsF{NqWt5wO{ms&AE@THrp(4WOv|8v`eevf_#DQNZGfM5vhD2?fX(Pu_3nvgh*)< z*D-ZF0hn3my?600n&!ub^3I|2ca^obZY(7*rfB}Q{cY;&^QEVI-~EQ+&VlWEg4bUBKb2q&HhL=(oTdMr9? z7^x&0Cs&^gIqB8kffL_@HdW-3Yd|@PPLJ!xa!`*`9u8Fg6`M!j{p!OW70Nb5GWZmM?v6&>Jp+&SlZ-F6&WyiwB7TL(m!HV1??}n0U3@w^)$)VUAYU9##rUSyzSk(X7}%>y=9Z-%+M7#dnEBe} zAZn$@gzCYs`uI-3$e~bY=M87~j^mM^E`@wYgq3>`_&Tn$%~;DGNAS}7vOnIA`YvR2n^w)%sKUULgI-Q)CpVO+or^y23 zp6?r%+3$1oD0|oZkF71Fg5i~TWfB(LN58Ahl*Z#y-SI6he{r8pxBekxgp$f%;)5R+ zaxhtb#xPyPdynkNzw^?ecC~Dm_ZquF6&-$X^&L)whC&prbGN9!TQB4h$vNw!&#pTo zw%pk{3V&VHv`z2|&K8gb;sgI7{$@k>O|C`42BEFLiNGSc|JmTUyB#VkERkE5-Ps~i zr$pr+7z501mLo!6UPY^w%$CqUQc`xHSe+b+6pH#8B?RT9mclkvKHV6wRJTIx4u z-C>z2)BPZPF^7vp9JAxuBU}3I5<#Gx+dg!k8T{?I60trqnc2*1H5L*?yQD7%D7mMt zjJ@`jigL%I`uul0e7P>qL-)Q7R=a*Da8~n;zK5eya@oDnR4D}MC2^MuuQ?OR`U-X1 zcv$iPFNKwRX&5h@v+h~TA7wf@+ZZoAGJs(RD4R^3JTKr2N z#7=odVGSjD02(9$zFJ2ZNbkO8r{+k=3HW?^Z$SI0u&KTLBvqPPbLsMSAXaO+@Y@+7 z4%M)G3Mbk-)Z3ZwGx-W^OPF_ zTEdiat-Efj*8T@DF93_gJxIMq5_YzPjSZJm<`0`q`<$DAhur3S36)<_yv6#V6BAVo zTz{DOlSP8S(8`~rZnUHibtf274=oAIs9c4r!4nGFXMQ#q-#&QV-LkSE7bde{$dp{y z(XDiVSeX-8eJYKlO>t$;2bG(=ue9J%gR@e#TOIMN7HT3#DBN87Hp|S04lzx558FO1 zXI&^zyx^{!wsn^x8D7svDNK49NV{yXJn9T$!h z3(~urwk>tm!+~ohNiW{Yhu#N)Y?OERPS?azcCFXaCjBvwuJLNTrjV&?>Z12{-X4>6 zxLX6U;W%BPc=2w|mTSd~VM@kqBdq(DW`+OI@$kT7pjH`8A!=2+Q3=1m9*&RB_CNf^ zsfN;iapRIDRp1SoRspMWH@NK4qn<1TE4`KZY9jU<%|&1Ws8d%HEj#xz6nC$t@H?v2 zJ}Mg8=0Xlsx03DTPS0`-X?R{w2&P9B#xY2yqY_FbhwU{KD80?@?}7W=2st?I3@?OT z4BW_NVI{SWRJdkjQ7Qq;6e;V0R|9n%BB?N~iWDj_4pb4^(1Q!^MpN0W%nOxj@oTJ= zWKy?FTAgl+#ON;K<$G~cAIq<~_7T1x}~4jIi~BUE+dB(MGjNPpptNMH0U#j^GZR3>r%%QxwZ$ zt>b;7bRS5zZCMw=cGRNY3rXa6Yj(_iHJ%Ev5^%D5vL$Q(70a<8 z)5JP2LongCYsYt*L*`LM=5mRTw@gnU7JE6$ZaNb2yv?8 zP=X=xiQq}IuC_(@mF4!tNMPjH!CVzS=5Y8P0Dh>L2>rC84Kwr&)2!?5v#7U@BOMHjz+*br15*Cyg@^fOckNrDQr#G3y2<}Cv)saVqX+Ks<@(RQG^Tn2d4k4+) zPyj33-!$DT%KIsUzrBGylfVv_Mg%+#ai#(^e@?ocY?{h!!9;ZAQVAP ztq#a$Gd-X~4{#F8_i7#8gg-qPm!R&8{c?^12HMIZ6 z0-C8W2OI?F3miA(uH*)rFV{U#7#hs78%;9Uiw1NY^eR}01-VS$P^S)J&?l|ek6aCkzX z$yMVQ;&~)3`v%mI7LP4uo!CG7L%2)N=jzgz0Vkz&)kXpyS5KBFm>cTAs-RQgf)VIX ztWyADg^?en%Ex1wcEeGp&-IO`jY+Oof*UiOqJyHN`4Vy45U{M4mc!I71FgOh5B5_i zR+pbShK@JrW>BZxuU?NWTvuXu&3H&-!x;Z<>)J=D@5Gb{GuF$Wlmjla0?C}bHowCm zpwv8+@4RU3avuPdZscg^jRcgxF`F9v641%ZoXX=Ez^e^Dp0@y1rtR>p_j=D(Z^biR zB%|749tF-Aql0cIU65IzL`jW|M`{M_8v`w4FOu& zT=rdMp~(|8%v(F%$z{bM3Oa$XcuGlOQ-62p;Xgs;9w#d>?e`8zXGB-XvMmM?KbmOr za+B$q6Wh2J_1`~y>$Gpmlgj!|omMr7M7u$wv(zt^(01huW1#XY;sNPbTYYQ0w2`F; zpKA<{wn+rMVEJ`g>!wXuw2bE;K6ZS+j{znul6ugt+ zt2YQkul0oFIFARm8TE!(V9(ewAfJNhk-+s)mE9<(2_bB?YFp#KvudVp4J^+(kXzBk zJ>12msrp$tJ0R@aoO_ z?(f~I^a+N|0WcfMl0f?Kk!E`YHc!!-hOdDd5;0E@sU&HPaD^u(zwoMyUhR87^=YxS zW`9NH7Gs)MSv%LoX>uF^-f~i?dECS_LE>Elf<wDm2Jq!lMJ)ID9bk)6g{@z- z<_lDskpdt|>IBA*qt6ZtA$YPbzQ{=UCgui;d`&)nZ;CgNPAc4VbvtQ>ztHefs`@gx zM50@z4DbPPy?`=@OVvzL>BPwN{bPB6GCCS7kK5xsI0>+`$O?OKcNccp>i0$%=-X)H zhUZ1|$Fn-IzH-VY8$NyoANZ2!0x=IED)vk$1~%Ww**3$0?!AWnv7I1 zH);LxW-ofKO$B*+1~~>dk!xiW2-v2#hks2KnZvuzLa8jaFZC{p=A!Iz%hnNCLkW($ z2ZZlOR=Z=&X-qQfFqaNG!-oyF9SzCOVb$T240Jl4NcCv*6F;_B4}8MI<^EyWA_YvZ zTh&}YZB8ViA8P16#1r8DQ3*goG4AT~{|H@TgM}ekmi7*y#6nWEb*Z}n`kCPfWb#FW z4N=SqW4JZz>gj{&VWe))-B2>DBijWu21IL!=N#7DqYqPsFT)h-PNB93^^?CuhVsDE zt^jKzLJU2|7HuFE-uQIJzG4+AYa`sRVGN#u=3x3z0@@(rKp$%a#}9!1Yf$?NfmAij z5kuUTE+DF7`BWT$rawPi4gD+JPtZLZI&dcmDlEeqxTUm0YS*6MsTASKAEyErG~{l*OugNrl_w zSGQ$dJ+s&Iua%7?!?LoQK;uWWj(B)p**3V}v5iyVR($yIz|jvU<+l3SgiZ>>{{*&s zp$p}wEW}*A#ZZ9%oKiE(si8;#l*{NGLk)1R$Q1BIF}Tcdw!SHNbnT~j+Ey7M_A+&q zFb%yvc2M}!rWuZ&!nK8($Da@DF;-e<#*if;ityu)1u}8J8r0E2lTG@`gMK=@r5smW zC1gr%(y*IwEMS*E%-cNkgE30oG8I*O%d(ypfi+g>3$&v-G1VyhdXNg@jOgit1)9V&d*O=d+jl>;rTT)K=J6KQoKruZF zqDKlM41UioWcM%)lDkq#;XYdV_`T}I2s7n(I^muUb4`tGH;k~rYOP7XCVQWM^UmJw zai;2G`tj;2?AK84FmUt44tyr0I(feDItDHwe$3Uvk# z31=L*mANT%lqr=N#!7y+GbO+cZ+$g?u>hS}xH4zinHFMHo3GPlNi%+->oSI=3u|pR zc-|hC_v)l3_l}Fc-2WcVf1Y7cf_Q7q3*jU5Z%Bk(8gq23WRfk*BuD9xHr-0r7mWyxja%^xD1w|fN8YYcOQTrr%M)6jxt@In9Kv=8EjZg z>mbJP2vxiDN?jU@H*I&kO+nPtux*Sa9_6#!gP5Mkp}~B?rCzGj`(d74L3*_z5v4^l zk86~mrdhVi{qtI~-LHQ0kM>x)?~2tS-nWBpJy|#L{Sf-HhBdT+z6ikG*x%{5PK71(sXe8eSF zkFhDV0^TqF6NAZXV`jTzqH+7SZ@KPCoOLu`9*~NaGvH_Fd&r9IGvGsE8ARREnVAZn z$(32|-G~(N@IbZFvpNWt=#gI})~M(dH}0}THQ%*AQ%>lnu@vuabsGbEUlJW$W=RJB zxTDa*(JQCcg{zI(0BCO~(Xhz}IG(WZXu)aD!SBBLC08j6o`Vigh`)_{%IFT#1Ccv#y-klh}8}TQ#9wWhls(PMnxg#eOeHgUAz zyqh6ve75-}c#!h|jhOnzrwDHbJq1C!ZR*w8d$j@&^P>CYhFYKZh}A?OzBT_KX@!)_ zUEwGpHlbzWt%kcVGmvEO3}33eBs2=1t`LHheRJ8-F@!ueRzFW5f^zx(#K((g2?O=6 z6@7p0CqjZY!Yrb;4;QYhzwQk>T=>w0{JZx>6(g{$^6+L-NMLeRoFnrOUx+WbOpNj}zEOTaM=F`7*4X zHqb~YPnN&~3MPl>s?pJMZm?^aTB9@pz3HF6VtET-LpRPj`*)B_v>FTR zrjE>!9z>rYuR`-d(E6)31c=4L*&uT}> z)VSV1&0AS7VRV`|j>5aiUthf7s#lpJ=i!vgUN?U`%s_g;InJBR~NHXdB_8 z+$LV+ZmyI{zZALjM)d%kn0LyqW?PsXEaU`RA%@3IHgzZXBfg$SE;Tbc&l{4g&R!?= zVunFaWe?ee$pGR7%*BFr)<&-N0d~t zmdC-IuTgWkT%MhO>LP(%zFSJgU8z5MIN%5GXp%r#FOaYekp23u%uloL1exrFJ{a*$ z^LC(+*hWbiyv5uao(cK=x1U7>pW<10#3@<4NouJ$tmNGk+ra%twI6q@dkupr$gEl7 zTta-J!+LQPseg{ZlAmh86Q5T2ce2y&bY}91*O7Rx@L_`o$->b@w+QbVM{ zl>JzsPsp)OgBz76mpT0e-`@0cfvP7VyY)NA$9p2?C_$Nb^R*T%QYM{e6T3@6S8q}- zJ;!V5gn50GVWHay3i)@^Rw&*;=!&m_I~YbXei%(o4aY43Fc^h zG6NCzW@c`fR(w86n)(v4L0l#d!l5E0MS<(sg9+p!zE%sC71q8oXw4H1ukbiB`LN`>#}4+#?!kFqOJNMLH3z&(mv=a=Esy>Ho}P~Lnbj1$9I&- z;&`wc)m+{`0vxU*TkE6;d4ia*URCMee_@KS^ZuWNZwz=!Uy+__vualc#~Zda;@%J8 zpfrP|ve-Z@lZG|P>h}ZTsnd2X*HoSV{ODhXia^D7v=px9j@&VH3K~+1`c39~h~Y7o z<|;)|2?d-GYmS9{q+1euH-)Zxd<*OBmEX#Icy1fCm>Lp>?W$jM!e+M|O7on2E?-?r z8S~t0jugs_i|g)WB|_NCxbdMSnpE3sl$z)tHvGLe51Y2(UAmI-60n6#+Qid2s?@r` z+%;VwZC7|oNj)Wn^UuDFjE4s>%%7@0$Pxde|s%(&CvH&RA^ z7_Iv0*QC}|FxE~4sc?5w>@;0{p{!ADg5+W7!bI}1!9uY1&>w(LOUJ_uYEZ6GZCtDt z`QLnI^YPNy~?g*Qr$XHr7l zpS;cia_~$CYn!)*pRRe&e}b@S?Iye_hK*??Y>esPxAF|G_&1xC=5*JHXB?GeSnlr7 ztl{oxD<#6waSiNoGh22E5uSNj>sQ;(tYLJqI<_Hck~W?Mj^Jr6yhejmENL z;I+5`jV%6(M#9+_J&y{2!`nU0wRu=4AmDefRle>Cu=*2bIL2er9pHsSgy5?nMsCzY zPewu&VMq2qY39i2@L8RTq@*9E84!GTrO1Di&3El#Kj6ho?&A6KF*Rc51A&?N{g>>t zFNAiRww5;#v`$jy-~F2NQoJ0*VBbgx(@Y~_kOJllQ(&+g#zuN!?&JLLZ}>NL9yEu1 zIuF}t-(yJyS1zZwitr){I~W&!UxleN;v9=BNx7iI)fE>O*8xH57GM#&Kaq;CeD8QB z`CpK*NC31hc@G77#5w*9_1B+&L*4)4+yBkAVsK!-h$TQUT86n8c@q(tfnhFI~#zUW=vb+;+fRR>VnU6>Ij&m zOUw4OFh$If%i~MI=HEi8Ws8XarAsUw#Cd(ZNoR%oNt?(#5M^ft=AAYp^=Qx4C z^$!1au9M4R?B3sU$GlV5)RX0=PxiQ&wnD!G4Q?3Xh@(lxic9f39*hp*scHlPFL%EB zCgK0%XZ*u({`JK(K@$$67WC3j#D$U^b8BtxWZeAkBNhbvU(WgQfqOs8E357BoBGQz zz?p<&b+z2=9uGx$pu)1p3_3ob+@_?6d-?3X#F$5B)NKyda@v#GyHNX`l4GvCKnl0l zcmlq$y6hfM&j*U(m;w=FSQ4asnmg3gkIu)7SG4ZumnW0eou`QVQC%|_v2bQt~eqQ(Vu$n)6qnbYxpn#YzeYL=j z5RlkDYc_eUY(8_rFn@7@S-8@G)U23WdR0C00I*ja@0QuuT5_MSumGE$2dVI^1?wU` z{Uh;~6YeJwM=hrfC)g99Qq&5)XlZ@CR1Z|zWl4`<;`4lSc<^zqtoE6uCWDYjHbTg< z2#5GE^BvFQ%0^}i9|%Ny^>({YvbUkBw{8KC-3;9M`vSFmGd|W(LF~XWK=06*UzJnv zx2OQ42Kn;N?X_TBi_h&(oWuE3R`|63*aL9Ie$~!n)VqhP^ta>;18jLuo9Zc2e+g$6oEgDzdVt=*X)@1yw`FyVm7CmnN#S6%X#qVtab7( zD!7>Jv%Tr;=SV81JSv_UIvsM1R~re(30!8^SoF$`IH+vLW=cZwF{JL7n1rlfU&R*Q z!Z7KqrCJc6_3VG<8^>FbWyMX96+u}3BS!>2$wg~MtPs;`5AQav!Y-A3rm=-b^f@nS zHXF`k+#^$4=vS&;2MWH`m{bGLa)06xwOm>ah#IGKJO&_p)0lM{K0N8P4)4V?>*rW_ zKN)WK>1V<$B=JkBx!rbGH}9duALmtAmqKH4RL zElUj5c>1)Rj-&*U!mc}f46x6b!E-e2vS#WcGxX*HVBR)^^5H#~SZEU7VnXJL?%7*aDSpDuOFsIt8Ph5-5kT$P| zop|sk&^G5rHeBsIFopI^0GBM!3G}M4GMf0;rhV^aHlUO0cFje93Tpscbqt@QhwVBb zTWYX=c@h7^>*GVD&{+Z-57tEA}zON3+$A$Ru&9ulppR%>* zQ&v8a)A#o&TMd4ZrHDC%GqLrODhcV_C9C&qL%~;lMiFx5yPZ8qdQ0{QUri9gbV%^O zzbDg21f{bb3CTWAc5iU|t?M@3av8vOEYSw83#|xMtR@`K5pUALiL{_3m(K>|*&dgmBbMSbcqq0o$b2#Vje2 zG1N6l;ZMXrU*AKX??!AkGsKNyGNu=22jF}!v`2Y+GkbS+U}L)HKkUg{h=9&(m^YG_Donz9_(wJeN9mVfJ%iay2!p!REfeXXgt{s5aJ3ILrKqlUsa50Mv>03cRoMFcRu z;mIwdF0=w4`=W&g&|3r-xT&swTFsaWwzyv4LJ)E}4EdavQ_2)Z(1rv^oqp-#!4+8> zJJ+0d@9ojNxrkX%*XtK~XasLt`tGXS;Y7R%r)}~?inP;ah-H=qc&9&(1s>B!fQ-wm zfvtpi%-IEhAcNjP9WOHPQz-!~NO@wPj}I1kz6lKl6YrOdQ8G z7}Q}HS=SXyP*uw}p1I_yf)C%yR2}9E=KTx$8fJdfpw0a|Cnu;GxvlRW;B8-GlV*hQ z*d4xoBD=L10|@6ze|#0X`hn?ehmpKZ!$t3Q+t*Uu4x-G2Ds*++mHo?bQnwgSGy9JK z&--NWv|%*QN%w7@^@P&|aE5;+sS~b3+0_O;IbC+qJ&ts{F1D`eQQ`YN*?W-FrOSN1 zm#1N!+OH)VJFF(}Dmvnb` zcXywc@7sHS{`NlSI)CZ~OV=B7KJ&T97*ECEcq2`3t55=+lYE`sMt&8uPL1e;$6l~Kv)=Zp?(=>xKC?! z?T>&2ge&Y}5128ypSxIR#>B%7IA=JHV%dX+F0(M-P8BfOGFuscZGDSCku^x@5}$%f zB+c>))IL$+#}Y$3xU;DcE<+pnbfIDbFy4O5Ks~U{)**3;#oh55lgV)G&VEamq=%O{ zsFczTXrl6FaRIKC#=H%?3GwY9Z^TuWO+XeU1I#$v^h41fwMb~BkV^Ae`vy?ZO&CYt z$~-QORBk0=;Kjj3bzB}io29=`4US<|B{QEHZ>3A03&B>t(`8^a4QtSPysCRyo$p+-y$!GUX5u3&2|r`n>Nq37XQLsQwm=59d(U^iJ;PXV+9!$(Wnig>ea!W+<>HGx9MU{F6uM zkxD*%a|WIc=Uk3tC$d24P}PMm7}0=3b6ut-0$OQ26xOH(BU^M@e*8NE5vF)!&MZcb zt?y2O;WxwCK5Nqfi0}r!F45C*&H!!+UG2HFdAaHDong~<&m6@M78BM-x_m%9N7-3u z_2(_=95X6Iz)H;CtA6YbwMq1gBpRH4?%fX#k@zN++AnwKJ@*K&SLA6(i5?sseTvLB zgHy43BJhG(wb*fvZ-3^9IalD`B+g#8CBy7f`DM5RN^L{$deg3_?`Y|OBI~3vmM~mWSsTXY(z;$K)Htn4*1@-MI%1J>s4fE5DrrhE`*W&49%gA~9 zuSmHKL3>J@KXR}^HayCz`E}SJD>_uy0{i9T?VH#sIeqh~DqLg_;r9t>m4cs-BLI4dkM&96 z_FfBy`=Cqex7DxZ##tmItgM57Y6f(6gk^H1@HQ)9xAB_n8DK2Ddd@0^JnTrXBVM6K zRbd=jc!MbviC9@W=<+F(ji<*t*myDhMrTVQwfzSf5>mrxs;o7=Q*d7Ma=4;FYYZY( zG`v3G#%d@slFd-f`3B)2YWfL`emGXXUskq7N^cz&*OS;*?80D{iYhA?*-ZcaRu*^p6-W zz^SJB2sqVvMIBPau#mBAH`GtCnC+3-ohHf=nz)<#Nro=T*`1>Z* znPWaj%xC!t@BBk5cdHb0L#%k|3(@L@$9?&O^B9>Vv`m5LgKv)c$U%axws`)bAf)cn zQyZ=vka&lgVb5>`83DxpqX?cFKFYE8>cTtE4&n&kMGLodBe>}$&2 z%=bgddI8dxn))a@6KCsgS}o0hntiTX?f*svnS)#lxU)uHgo||5GL|fyG&0umlTsKB ztGoBWDvUoiLCLu@!In3e_NeZ=_F{hB|4~5qoI%^4OkPu5o83{jC>1xHal0N2_2RPSxvsoTZXbq z@EU|g-Fb$T+pTYGA@?OlTQe%LBR=?gS!Pw4$|y_ZqKlV=?BRI_+|{NnP_Jr81w}a% zeWM8>9EP6QTX6g*A8?s6lte9hwi)zyyF|DR(335ga5FctT}?1&&_-$yEQvy(maY^tYQ7%x4lL5M~2+c zK5LlkL1MFGoXpZiAGTxoS(ZEbgzIjU?Z}{piG8U$G90>~CBxud0EzQ@6Dw7FW6u42 zV~5XA!!7o9&*YyP)!<0WCV{6wV*%Vs7wY#ltuPqaY+n8@^|a0hjF{i04F#7 zj3pPX`?dGDbXgf<-!C^obWcG2zw*b*3E9lgNGAx0=2*nfSA00-a{bC$IIa`#&{F!( zbwA6MJh2&xr*kJC+oOekPN~&}<4Foft>errc+%t?qrpcu8Tw$j(7}>;mg)*MpaHW+ z&1#79)i*5yFoYdb?Cf$jVVo4xb2}ByZ>id0vGj3Yl1PQjy7ihBZA0dI-sCuNZ&c*e z?#MjTp&5(TGSCw29k)%n2!}M#Hi>7wR(R%@wyxxvY=vqgs+E^Wu2&B@MCIF>Fm(qi z+y@%{ZfWaROonDdxCvnw?zLsL(O>KTJeUXx3v!v3{Y=veP3AOslLa~y8#yUbg%QNn%8cUrKh_+9!(if7E!B`|^?+P$3^2b+ zFvu%ROR=6g>kh8(0vZ)0_3)7j9|yUjciQ9(ACq$tSNb+^Rp9=8%1Z$!#Q;klFIO#5 zC1=rpAs;{I z7u2eSgl73a7+(cx>z({A>@4KINU7@% zly8bOavWwYWN!{2yO%i%#GiBQ_o8H`{ytagS7{wMS6ppx-q0a~?GHNGAa=cEzim5D zB8?C#L?`-)3WOKT1alsg8&@DtO9<$e3^AAgFfE{2_yXFW{dXI7VgDt%ktTKowqfj~GPRydJQKGQ_BSpY{gshQMjF3$68pXi$qcKgCar%)gA6NBxidCR$%8ESoT|_W*rz@3 z*b5>xle%y!aU8@sM*-U7cSO9uRcMgmtW&)Ja^R{Odz->HAnm^UOzSL>L+x+hOizVJ z64#k#D82?kN9TStBf8GIDIFBw8S8x8uTnu}_ z6BDT9o^mBbbJ`O_$$L(Ddm9On&a(*fP^>g%(GF%7y7xmN8O++}Em3Z&slAR67s7=H zx`16lTpmjVBjob+el+B^Ola(OsT`nsu6u`54(P+}3-x3rENb#s}*Rh`lrc)X)<%AM8-$6XqI0^WzQCH%jNw+J(F=y#tfY#P~ik;Dj)ixD_ z7A2$|GtN=#0gpAe)xr*MT04aF?I7IX)Ug$BGM60)OZk)-x)e6{KZV@i5P=eUmG+yr z*z12beL?i&P{F-7N25BpjMkz|IFjDFUvdFDPB1uy(Mh53vbK_3Rdly^!t7k)DO?ed zY=YWUl7K*|j4`R2YCRnyMPho_%X=&C!}}ehT^4;_TU&0f-e^>3wJe1b5G4VELI7dq zp+rWuOCM>JP!w{FfFy2!DyKY$&T1EF2Fh8N?943bXe#sA4UB8Xox4;~{S}Q8(`e%Q zBSa}X-bcmSRWY%fn>BbVD*Q|PIo}2c zInJ(%6G!onG`oUPvz>5yxu4rmSpmmYh5EaF)@*kUZP`g}4(<5mIy?aD+SaC{r*F7j zTOu`%6=Dv#bceICi2q(mq$`1ZstEi&^j%v^AP`r(Iw`!7vCtv!0Vc@ygt3Gz^|grZ zp5cKvx^XcOH-caW3y2>gndu9ezL+$Sp?^SVXU?|#NWN##y-bDj$8bzpaY0*V8TwbL z8Z*wvxvj)WiK9UJz8$CfnJ%dvY3h3q{hp{t{$weBjAdM$mwb0!I#Ikk73*f<5?U8E zY_MURxdyLkz6aYhMD+N7ZgPhLEx44T;b}Eqa*&U5gHx0}O8D}!@%=_S_}=El znCt?CFfko)L8cde)ZyJPo&IGx=Q3j{fcq-R-(SFBI6qV3f+*|LuXgPY*Dimmr7~v$ z+nhH*kB{FSIM{JJo^zfhiFYVkFF1VMtSjYU#UhfrWRL5D3YIifn*qL=hpLw#z~DX@ zcEp>3USY#Rek26S|B zC&!EGO6C9mA8zse!P#r^qdV=N<>F7u_J^@iE}%tV3Oo#St}-$MbH|CPUv{BqtKw^pu}1?Y9ls((3>^6S<}> zBQ3D2)_B+LHmdrGFem_CGF>=l0kWOjroH9G?O~kk zqE3_8=@3e_h&TG!H90%!e;zTfm?^>DjAnq>JZ}efI=kR3fhEF+&DT zlk6m*S{>sj*m+IL3G7GLKLj7@bJSHHc}FdV=14HGTSQxj*}V!)1&&qdRhdWgNtJX|uR%RW2Sq zk+-#gqqVcv)MkA3D5995Mw4CF^X$;PJZgTDOTB5EkWT8ZH(Wz~)LN+*ZvHxR3J`n;9O?&%PL-g6-$F!&HtQ{+$IN*UgD=&aM2tY3Uwj!el1o;J3a1 z(hsG?*)?QbGd1_RA}52CPZYfybbq2vGH;9;mkk2G@Ez&=3kQ?%ko+hUgIg`IEG#pCE?3kRIz8PR$bk+9-gMzPwE4W)bv+SoZlc%HA^LrxMNvq zx?+tTfd6@sEMf`eP&Nfiz6bH`safJw7^44L~T5bT!ZYzwtvSJeF zCg8puSU^bTtSd=1&UzmKRr}<@T%}b9_w41GHXYz8WB=M+gMZ!^utaM)JCVhx%r zJrEyM0ZIk_WPW$9r_j4^VB()ER{P4}(eP)gGo#)6>6y7%;eh9x5`c&y8kGGJUx1%| zZHR3eyk+{gnUrQgTi9O1e(k}t*7n$;#s97MkS8Kcu1kP$A_QP)i~=^Nnr;|B4{xHh z?QNjuVl4R}U$ytF%Ha*{_k;w5zPqydKKmgJK0omSc_Bdn`w~IKe3SYM#q=j?@o<{P z)-%piK4YX6e&!PoexVrJsVz74Mi+J^7F9Z=v@q~Iun)EyvuyFr_s)-nvCL6{xWP4- zcC+1|&2>DqyJRb#hM5#=K4VV$Kgnr&T~kS+r!1DJM2{UDocJN%!l!2>u=K_R0H*ka z|AGx^em~fL(~PTcwM*ceT0~tUKr=&mjEbF}^szTswZVg^yZe~3&pt7!r0dEKG&)~3 zBXsD}p+@aZXb+maD&HEZnj6e97nq!&yy3+tT{9NA>}L>1gMR)5n<~QUgUti{HVG6O zE`1=)c#|UDi~~Ok%{S`VNJ)9;!@UeN-kh)UP449n0hcCkaY!6{*n4NQ!&tX-%Z=)q z{GB#|j6(~`#JFd-XJw1^4E=4&Kkm_~0#KOn73%!B9>dXq z<$Bqi7c0j_stZt5Y)?<4UAxhP?XAQNLWw~I9OgNE@S(E6Y2Nsx7lo)Jky@cH)h;ysy@=>JMC)!lgh*|>r#*}i z^{ixP=nU6&awOf&-gKt)rJ69RbKAaPiFq)rd6jad(s}1gL_wR^T0l- zP&S^h8Kg}sg2k0SK4m#8;TQV&S&b!Ui~D$^AjI%ZA4tDs&5hLk)3ddVt?5A-W06jZ zVdA)0Lvwx`GKC%5wMvWDr5(fmhlyX6;yu8r3Hach?$dKr=--B~%R_%=e$V9g_S;m)2Gl*pN_&P#iR&zlT6ob5AlvTYLP<6&hX zwQ7;5?RGTw{lQTw+#_7*g&E8w)gz|SiW?8uGBc7oa_uA4cUi$Q$&X1nXnNcnnYqkK zgbJD%)CI6E$uj&WoX<&UFM|_>?@&pyfE17XF_Jl5h|F8xhiCui?LLCR&?$xZQNHbD z5lEx(#y|(%pAOcp6Z&{+_38oW0RlsAQ|{}1VKSu0X0?e)za1@Rk-&T$DdvL@DWgVf z?Ro7_Qc0*;5=Qeq3d_Lj5Im(mIESY{knw)9RdmCC_M?M~FDQw5Bqb>|zUB`nYkVMr zZgAU<&ZiDLY)*{r*vvUxCBkpIgvaU;abXhr&Awi6I0Z6MNu8#8D?ae&0o zqH?drTEAFtIFpu!%Wehkg?WwL1|8}VCPz)pgsYChm)O*+Tk2OH;cxzU)~?9_F({Gz zh-TXCZr&2(nonj+bsh=QvN0a}7j}-D6VWi{D;gpdWhi&bYXS^|4e1sZwQL7^;V2Wp zb2+LP#{Zi)Da+KY#XyN``{w&OYp-?#jzCl2fQ(j!1eJP?5i>#S1XdJf;)`rF7-xBjY0!` z;Auj7ewsRT?tmDBSC130{m8Gx@j9X2ecz(8im2Y74f{?I3JkvfOY#xRTVr`nyRiH{ z36O+vua|u^GB5vi#{N?6EESqqN=l?*U)0dW_j3}nTo>pZx3gBPv&I}XH z9J9nXqNEB(HuC&Y#%nYMEaFRB8zNf_TK6!>jvpWVwR@9j+B`3N%U99p0^C_EeR#>` zU|8bb`x6*W;}?VC^EAuu>^eTTZ%At!`Gdc(EgebK(6o960a+}-0@E#{PRFCgUd`Zckp{hlZ**LrQ{&~^Uk5f_`t@?U5y=+Wy3nodA7 zd%nx1Md}oD;=W}&3Ztd{T?NdLq@yL0f%TIaiUDh;#h>M=_j~Br?*U?rt$j7tt*Vwg z041V$cYOoOig0;F6Q*Q{2U7nO5{R)?v^Cy@I+WSF7j`8VBR)z>lf}gUkvEm?Xxz_< zTikUf`i2pM8nyWI^i;1^w;G&@vYXr<*PUDG>=hth49T6+E+lbNM8FurcoH(SKPmAqaQLUmpIUb6?JNXET7I(q>ck z_t!wx2E4VX$RF8oOr;oct`1kH$$3i42Lvj?tmG3s9J?esa(q%~htBA1gR1eFajK%HenEuRxVL z>Js*$D=E2kJyG92Q&(J_Yck@xSbawx>@{7OZ8&~Pw55(7#p(96 z8W15O1^)s*J#e@^_Eo6SF_V!aIUAgrRA69}tZFy=CizcFGeZYnG(2XXkT&RqpMcpc z)G?25Lqj-Rr!RLs&^% zr#WYJx*c~kvNB)Ou3%$pzIc@oyvhQ%&d}qB0xgJPWNj|}>*u7z_X*wneM1@=LR#=@ z*9+Wrwp)xxYsjeI`oF&53n;nMtoV_Vv|Sgvu)5l1&SfDY_`gTqH2)UDmp%cmyG%qf zj)E`HxDv~bl$g5C;gMg}VLQaX)9I3JP|0YJ`DEw#CK}qkAdW&$3?#w1Z?^6$YCYX}lPy zwnR}JlN5;ASOZVo1u$%c#TJ~O-DlmWQ$rK_cW!is1~p`Rg`PP~Y}`q&B>pwtxuxn0 ztRTm)X>vp&R-|P>hG6f7sdr=yriG3}lA|0rrh76&0e&~woX?@&-m1}+#`91VUIdn> zsk(G}f zHh=pUsUMGNlXTVbM&=g^EQ(`iZL`8n28he=R9QZpFsoDkZ24yXpxa6-TBJrAyYG@b zS+{@JYMN4h5-QTHmgGZ6x?c)`xdU00%@HDX#q}Mg_J=&8_+&d)l0%A;Qh9K;kEhf< ze%Qid7`#+!SSZ9tOB6sg$@v* zaHzNs-`;{J`jd2nB|I)WsMj`(%%g$0DheLMXvWvA0--V2y8@hM*{=+-Y9m=@W|vMv z{H+S6!-}>_!#X->P!4-A_EZzA1v`AD`h0BxJj0C3-c=QXZ>%a{5M1_&Gk4n8eI%}n zTDHogga{ez)l>wU_`pkFwDn^|R%Fqa)E60QYdRPzmn$cLSOp2l1S_G|lMk+z3hp_GH_?Z&6^JD_4Bx4{l)i zLig*}adXrPlR1Gc!hUjIkm_^e1qz<^cEtgPZ%A`B7{*8YUu3Wd1En$4p} zz(+9v6x2PSH9*gx8sxOE;q(R#oM^;fxxBLG-nr^xDaO^^N*Mr8S^yg)E+s~^M4nd_?SVz;M#mg?qC)Wn%i zYsy$`eQ^=S9x>tq#CWO!-REE{O|VZS`3TpWg(hN*=w86O(0qTJFdJ?0PBitSPlR`v z(y{RVX`26x#iZT-+?dQ^u>ZF5&3+f%LS2zo)~m66VosOD!3TSf2z;guK@p=YN2sFt zRuo%ARuLJ2xY!_$B89lTIiTSXM%fEwvjmQ<^dBu|Bjzo6aS$fjsUOJS)m`M?PZlW< zFYb>Nb%oaE9|4^QAP|RZU>PDi<fzM%)F#mXHaNC&I1 z11uB_)Iyn{U$Zh)JTJig8DAI+J?G4-wp48WkaL+0A<1IOhb(rI0hx*iHaz@$yY^;A z4+Pk%7d!*pClJdj8$+cLwm0Oa*vQOZp^T{mZ-t5bl+lNUUYJp>_uL?@bP&^W7lLfe zoMfTZlJc#_(-UnX3K}>sIf6tss`eCjCN1>$M)F`T#2_RE1JhHjKm$vLFFf|76HL01 zD4J8$?Ip%xYv|mQA&_+5;mb;_={XbnSFA5u0PU6EpR?+KcBd#htxgGB6%fCYk>U%K zKt;Qgb!A;%(CIaV)q5SN2>LBwm6}Ak#DI;(bw_S%{`k}FTBafZHhHP+jkRNLQIkIX zi>iM?igRmwW0NTdWE?l})6Ut~@=aQh*7Phrcch9JMX?vnq^+b{g&u`snn;xRyCIHv z6!2fdejKW%w(0D_Zce2@*7B}YTZ(*{`zU1jKy@(EXB;ngzODxKO`9gnoy@3DPBm%p z2z5;W+Th2O7Yv|qms+Wd=Sx{f!UXy&vzB0faxS=Ay8~=NK>2Un?D<0ywq5S<_4}Sb zM0uWq=E7uye9$(--<~r%UFW~Wnmht2opK4;NAX?Lt%{1G;6VHs;kM zXLP^M0@xbgEC=PW`xPmFT%O^0t@e}IAjr;szkMrj5Uy^*VkxsVWwf55uDpT>)%KH! z9(f}WVE3LhKVPSsfv(vc&ZCDQgV0N`8}KI-P;3A{3b3?$cXSxD4gTUS`e-(?zZmE zNYT*SlxF5nxR^8xmz9E@M)jyb9(*OHy=Ye~>@429RYdI_Ri-i*q98z-U)XG!2?gZu z0%IM!=-jOWGUiEzZM6Ss+5d*|cyAqbx7RNa+))_OB=3o9HV4s9Z{7!f$Z;8gNR>$F z?nl*2VUWHiQY~W$AX#w+_u&4>w@@|8#?YQCeNh zE=4s9i*N%xX+Gl6BEJ0;C*bDq?$%4_5Bz=~1wPaN3#WYLhql&h3i$eexQJZPi)`cq zzlGO=K@4PPVg#Ukuu0n*{X#^16IP=)NZUn8YCcd=!{MxPKV32M`jh z*4-WHltI=H9@yiCOyghk(ZPJRK)dboJX-bt(1R%Q7jEEpp)?eKBL(yd^q(hOh8KRS zlnA0Y9`&7HSDTX_yZ~E9xUm)?wQPOH>|)7B>8!~G_~A{THCmZL70tLCz`1ZPSN*7I z2w3kFPX~C5dnFBpT0((t>KsP6-amGpKQGe1uo4*(I_JY(%Cn=$bS4XoWsKI;n+usz ztxnu1o*glV#^HSef+YqQilp_vztvM8h=`B|xGC_-&Rrh||J*nJz(@anngw5pET`;o zZ1+wy=jk32jb~_$;Ta~yVro1GX;07Eey#o=5+%D?&O>XP;k;r@?(J8Ygf5))RvH8L z{@JafYK~XYVz5xWrSj|$`h5SD{CkzE^s`TOq1HCW*%;WQ6w|Z`XUlETp0V@UfL8hJ zexo%Dj%?g)5v~2;2gTw;@kH@xrMTy;!IzENXrW(o?J(4DXDUA*Zgz>zq&+jOPJ}srkTE3g=Ges*g%5*229JpPPks9bcvR4ctAiPu^f`tWbLbc7`ZK~k9}Mp-6$B}XnWaD*z}AszHQS!*sO9`b^!lt zr#XNt5%9P|9c=+k*=OmldV>v2(LzIH_NyJSXZhdC)q_Ku!~VSs??{GXgRZ5g$TvVF z{2W*|+h|I#P~#NDs9pE_`(v$J(qD;FyGO=T*85XqiVfdwJs*EN*_IVm;1pB2xGj{$ z%IAFQtlQV&hRpOWPbW0i-9ne)f=+?xOsmT4^Z*^XKz)fr7L*64`*jnRhxR-cyN6rp zN1eBT-1Rw*s`36SHxSb5He2b+VSj6mzyLJ+ln01Ds*>Rooh;tYDw+Zp-~IXGJKz+K z`yU9U7)T}fa-S3ECo@IS_?c-tRFv+EB0`@I5mA>0%Kvle{iXjdmY%bEpI?9xuaBz!CRno>Qy-vKKaDQdjcPmIV-`9!SR=>S}fS;Flqe2rP$ zVh7X|PQRpeY{^Cm8VFN55E_{-Lb&yTNXLaG`PfqwF>!slfxp%ku~DIn>RA=#5TTdW zlaa7B24u>rK6i_6X0;&>n7CSv)_@|EutCA&alSfmGjvD13&NQBtpBfbe>f;ysTmMI z>q1+;-;l)msx_4JxmZhlDGjq`|K1wLxYZlVPJfJ-fa5)duq%))=Q6k>*~Ok?v$#Jo zu{EhJ>O)U+19%&A%}<~~hH@(|TqXyJ;V!65uZC&B>)pc7QU}luAn42CE65oOUP&1n zVK_r{t#TLx#lJTT_v3fgaZYUbmOA$YGVqg*9k^61k@fsDG3l*Y;U{FD8K%b{IO4Se z-s=tjvpfI`j$jnovdsbe?^O%*s*u+iq9()Wj_2XtQ9usX+b_Sbg~sr;0_U|8Mhs%c zG4Y@sCE#w-&FDjEJNeU{?_BT6qZyQcFwO^^e*7LFTpM>r5Wa=ZIYVxdFlm^>af$iH ze@Je7TAY;w_7>2~_JADve|gN;xh4RTg}|$lhX*upQj^^tr#m2OOsTbk(*m-|jV2p3 zZWw0E%wH?fX-!M8<%o5%(`41%&QIU1EqZwyTOEfoC4KPMq2ru5pqE~m20SqpDI>T^ z>XTbv`zFmVX)TY;!XmFwqd@KtM~V*pmHsiU&&kqi@ZFJ=W^cwway~>{>SCbpM#Bd+ zkN;V9{r$-Oy{Az@1EC${E~2m=@POB;DYGj!++miAC{rru! z@W`#vcD0}Z+bQt;vg@#;;ApmlkRz9OuHmsE>ElLbPr?Aci_6aBNFfM2{#gQew9?{} zQSH(rtk@(fR8mPFUNz8Tz5uB!s}|d0>dyy$-Q;lZQ1y;$P7CI6x`Svu2% zgtJb8-JWtaxX_?947aZ4@VNYa4~vXb;virM4AbNC=R)`->eRo3TqgQYY49J70|V?m zgYxCWCaGgMC-%V0ELC(AadiUXl(#SaCzx&QS^)Nmo$Vmz6reiaFvz z*`c9xX?&$ijIJSK<5rekhYyzu#i1}ADoW5&-%;^4JdVQGXeLZ-_t12z9}MW4s@K5Q zZ8v?*Mh!pmlmt&+5PiePNJR%DuYD;Kephb9aC9_VHL17oZA^KAdtNi)@fI5LvfMbW zDx{p04MDRJ2csth;lz(5aH~3^i$r=me5=1!;N}{&q{ymmxi$2f3?pok&!v2lHsKO6b1fnt)8mmv0AWOFjhYIG{b}Z zKCg)J6=@|FU>v}i>X1yUsb|Fc7L(4PUZ|R;szxh2zmNnMSYMCz?c2BQl%rQ1`hMa4 zgM}$)yetxy#Z5i>EAt6Q$Bd4e^-khj&elUV+TnqbhSwB7l4ka@W|cKKBa`4byxo{~ z!HQ!V*lPzjl2e?G_8F!w=1lJwYlBowE+g31waQ<>7qZwMQ4A+Du<$5XSk%~n<7;sq z5!G`$@d=XkLX*`@6NP}b41W~+Q@|sTB4n)Z9@CNMs&A1cQ2HOfRQf#o_oY2ZqZ{oJ)(Bj&QSx7m1 zX!vAY<4%!5r{7TF@O(ho$8gU!t2yWm>YJn2a8-NO9xz1|j;4|7*cNPH7L?WxCtS8G zNHU3T56!CI`C+fTvq0ghGA#9am$RxH!Y9{uQo;Hkj3b}nNs4kT7$ zkN02U&xCZ;S)4OB8+1Sj!|;A1xo^*Q+{?boZj>{N;qUL-!(J~IoE&0Up$nLzo8pYRacWVQP88L(Zos#&pg*R}Xwm<+WZm8OteAnneNKJH4dTN}dE z0~zsa8qfz~fmq@3W_69F(md}#?_sOG7}OdAs;|}e>%*_i6lv3P)Q)&v?g7=ad#*c) zfRka8n1F*H6LjB3@2`M8PX`Npi*)GhHx&J+8^W_O6?<8y_|?5~dT(md$`UhNjXX}q zYZ4dgLuaknfp;smkweLK@X%hx6Nj51B@r19y0KDeu{55cZln|#3ttjoo7)m5%~`Z2 zV}H>SmZ*C%QB_2ZPDPbTwgZb#R=8}rc!QQ~XC^;azRUIPvS0JHJgwv6tC7rPo2a}l zOgm1GYVBhwIr<}ajCN< zAPNa`YX;$eI=}Ke8dccyoru-gv-GmC@3B-rLLIo#tlHFaT*Y#!J13Q(d^2EBbbLF} zJHudhX1ac~~FNLqM(bg{+Rt5b%kBf=L6(JLrCaj}}|dWt!I z${sey5II}cH~-`Hv-0^dqIRe>xoTd<2=3S8rMY2X^$zp#nnx3I7Qk~)NV8aq)-_P2 zK4h`PX~j=wH~8R2-1r3r97w`IXE9$Erb0#6Wm5*tb)Wh<;X_`^nxl2ord}45*_#^t zOwchBud+K$Fm9KO>*31}eTj?URLJ}c18A!Px5SDk3u)^M{A6KAfr)Q`eJeKI`6urtVH%sFGGpp zI$0nl?8C`L4n!dn=7h!b35JLE=VQ^SK9Ejo6DUbCv(C!O?~@3gFxd3b(N$*3L3LFY z?S3o#w@(zRJF06pRn8lV`4jm(T^h0mV>uE+n2-Bu0!z2wOnOdm$y8vCxL<|Nd{^p~ z@AycZYuk(gJ8-zKHhLzy)!lQJtHnf0C-)wAFC@VvW2uCps+vxFtn!9lZSvDamU)>A zYpRBs{q@Xbbdwsc?>O?C>fi@9jg+`Yy2F);&`FP`B=>X^WaU$Rn#2XX6h36q$H+By z@yS=Ph%qml&$HPV1h{6%*?jG~(^?c2CZ}eV2@Ok{8D?nDjSdp!=5eKpTTZw7dn1e& z;6t-xNtg6Xl_r&Ss2G+Jfq1uNd`aa0+-Sj1R6ofQ%o=~)hdLpWuIN#r4_|qe70E(M zi1G|Qqc?79>M&+kt+rc`)^C$3#Dcrk*Slm=D0M8vC=-88hMH%IScb@O;aaN0RkLii z<$vX5N#S+2l)9{V^2v5S3~ePht?UlJpM*F16oN#J_<`sr!VgU7a(dM)Z9iw~O}O$DteMSXe`jSRL}ctg?7Q_2f;10%rty3*Td za;cu1>Z8D_wShg``vq1_(F12IjL=wxM?FLm0wwbT(-`e(K`K_(iwgVANmC%c2pF$i z>Uz37amh#@pUyZ!r_nm-b!V7JT!Z}1YkFF*YRz9VXK5PW4##}xr*`UJnViSMaG(~E z8{ZTJQ_Da7*X-K%7Eb#{1UN<#t1?X$v@`@^VCe3!epMOn2pdEu!2I|J(4-*StOkP(WEnj zLVW7B!nYEZW$NYk^~ndPvr7h^P8qOHe?e!4Xh6TaS5&9-Eo)CLmxh7Gg~%v$G9b)_ zNiM7W_cker0BZ|f3=3sP&E(5)L#*SnLg^9=3w`VM9)c}@b&_J@(hp1Tg_-7Z0$muE zz%BNg#0Ju@J?lQo@Ps0Y&SU(UUILm$iZul_A#T}l*WR@fs!Q&^=9kh=?s7!-+HNR$ zEL9?DuVO0un(10RHjr}FT|x^lF+eJrN5Ni=>Gx>JvY`A`@L1^}cBSBydp3X1AgOC& z*%v|Gn04O0IG+BhxWJxLpwkqBqH-u*G4&gG0Uz;GqE23UAYlBCydWetH1i$99hJN0 z{J^^xJjAo!k-*!zg*jSyMm7LcB*pX+@1j`D41xWPU*q{LalbPwAT=C)ua*z3oX`V) z6ENJV=H zyL#e7g{g-Ll}xanfr1Nkzc{c0RlpKird4Ua2e-0y&`OTw&hyKbs8uIk`9ohCwbbND zCXZg=H~)7rMIQLVGg{~gN4=i%$Ub{L0JFTozev~MuZ##3N@kVj5U_ktDhrV(7Tm0Ih0inL5`iC`njBjc-dUk&M+Q?@G-N zaPnvORXn49KUc29OJna2Cd*+bM6?TuEL0nLQ`)R^a4vWcqYzA+@M7Fiz^{K$dJ--+ zxXS2ZhQ3dOR%k`3Ff9Kxv|LAFOh?oooB1O+#JwMQ=LIe@f@j$K7ZVJR>|q&1mt|np z%oWEHv>U&-5%g_GW{?GOGQENI7Tl)#5wI(NVF5_XENCC;5x%qF#Enj32MmgXx{T>Sn|gp zWsCK%co|3i82j%yCKVcm5f|jNOH9?)-iGZv2bSyx7r0E=%WEiwjYgGvtUnZ+q=J z`hOMJ|G5t62qCa!dN02XFkV15@$V14X@|urN_f^hu|gY{ee)MpN|ubL zZXzx(e^;-+L(ijIGbY5lD*pSnmcS`*)xXx4+rs*tBx9JYcB^V24t#~5l4RZj1&JQG z;CM!ksJ~oPG(WGcx4F-tZe@fc_96&r?P|7aU!(#U)4VXNf zthyYqhV{PJKetmawc#^Mb5H4!9Q!a-1nL1UHq^f#DRy9IoqvNPf%QKh2TKf9@+Mw* za{xwY%0tkc%PGR!JB)@weVl3MCP+nbpq>+DfAZs0^`$N`*+b*{9|3vQQVsNCno|g=snPr&oJcQ{wXWf6NRS`FaMl2u=WM^gE3S6z8?NuLaoCA#u z^ve-nx`Nvv_K~jn4MLlx{HO6~P*Q#S#sn_j1H0p^Enw;r7y0tZq6kf{TF&ElSGtnf z***BtR>TK9K6@xzo&9<_?2NZ(zZBxQEozxIb{~E_1y2bZuttL0E*ljq)sdSF-`c9A znhw+tHybhK)9qV=7iwkNI)}35t7c^z`l)k2j}4wrwR72REy6Sg)88laxwlTS>G*Vd z%M6k0?XNBxi^VaqR3F<;{vGiLSF;B2Hu9!jB?&9HtRq+;pfkc6Vt zYe|Ow6MMtsgw%7< z*Lc&|?2Jlm1aGxSS}wcZ9d7)1YG3KJ1yxt-j89(5jJHuTEqdg>yDkBoQe=i^pli!* zT-~@ci5uL`ewkma0qkae3e#xt%u)7mVD6h{gY{igyy2D2qPY7dF~3B?BzP*8Bvmcr zRxa}s4o7C3ixmNG!DK{BgY4nH_hsr(=uq@SL8TFx*Rtyt8FibK@SDCke=km7O5`OG zF9_HRGka`*jfJDw*7(;g4qmrPXlL%q@Zx-0%KUW8@W5}LZeNi??4Ce|YWw@bOtS(y zWvT26A!p?UCef17>FRme816{N|HIf@M@8AS?Zbd{hae3WDBUo034(+)NOyO~fPlcQ zq;z)ScXvs5Gw@wJ^}g@z^IPlt)3tC0u6^yj&-19WaQY^-L*Tool(y**wXUy( zuxd04sfGE+KTZX`FgOn33?$NI%)&Pr37(g0F>rfRK{%8|p3Yf$@wly$8hRnRRfIE| zn;VJ;UjSp-EIup`(N6%iqj2B*)B@k@5d4VAn4hX)$I`y4o?#?X-)Q^RTAR&xXkUFm zjQIRYS(K#@ts=HGs#fIU)X8dH3;Wbl$MIDhLv#{F-#8KU-m0fTO>Xo1>j@P9ipEcS z$WD7bLUX2!aRKbG>zy<2zIN7Nv^=0#8TF4!;#p3>P(y`rSjMwxaZLtQ#4+o9t!7RV z2il@iP4Xe9jkfLc>Q3c1%Q*WyYV;*#Ur1mjTiVHoX)_;DriQZp9|y`c(|A{*RCc#l zR?E@dnpvV~?cd;%H|*97{qSIIobaYRHPcp0y(&qA+-~O_LoHT6a2V6J#I{|Sa^80^ z&>xf`ET=y8>nR(d7H;EB1Y~9>*)N^!htXZ^)^+L}V6kbLL)Ws&P0=YED?umwUswae zY!ipEy@UugD6*wv|dI z&;6C;4{_~z4sn++73ME&C#Q#HEfj~2*iT=oexTo*%piF=Vo+AlWr5T8iN0;p_#odtr0(Nr(6|EA_NXe#(8*k4b*KHPCSF zpxoQK#~!JnASndrA}%vU-qI(ijOeOReS`paCnmiGdF}YAARd=vsDt z&V~f~l9@P5QmslruV0B@S6=P_VOA5iwbhX0b)Wj+jX^oaT{Zmzc*9MTGm`!l&YPII zy|dD-lt(>DnQkKI8)Dv)X0qz2qb`bbl>uS~&{x85Z_&5b&aT<`kej|%`^Th%y=X=< z4D+f8zt`ofbXYt zbA=QjQXzD)U?OZj9uY-ad6}4gq8yh&3;U+9=7G`*6-wStH&}~wUFLcBU+)=S|NI#B zG9Q?*v0C4nf#}a<+wNv>Cf*|F4e=GUp({%B=iJWZt9E=;Xa+(~;QEV--W<%|&^Alj z@9SQgbO!+~!f-8@QsrbZaJA<3I%ezdJdbwm&K=Tho2DofsW6t4EFx2#E(YTjcT3*sLc`1f!^+x?rv@Ufln5{(~M*+mxEGqE;_az;Z&A}63)8T1#@wv?EIcXjjbNDE5k&G-AH{KA< z1Y@HW^=_1~o6|YO4>!QHgudc*@B1Z|3}0?Efb^9$W!BmxoaZs^CqMBlljkY%(o%xyNiVvVIRh0M9r+-UE48AYq_UAX|LT`^OEo9!<&;dx2yZQ`r<~OX z!$hhA7?U-vJuowx6SK(WhZ9|>65Z@sdfh;~orvOKXMFW2{jziB1m za-IExT^a=TT<-?)WT30qNU*=Su^>Piy}7MCI_PMdwOdL}&^Ik%xc%Phv`kpoIfmC8 z<<+nFtd`l1F?Z?-7mf606m`9w}%U`>+TS<3M~(km84?z8$YRPTNW8mHjR3H_<0wY4GX zWl@gXTIcrz+Th5s&)^HkF*`fJA=~lOvSH+9jd47)=fy2n+AYA8q#4_DQ!{#hlIRd; z+HbnN?{d@xM-cIzEeKI*CoTBlRx7HMIsfG*_H1Aa(W>n8D2W)_vE+%)hGA3WV zF)fcxcwDxTb(=(xYD2@o!~#o#8m&ubTbg#o~P z?&{f|Lnm+8Y3!jCCquijXYgVG{tw@wVnO&vcT+11M_Ou!y)m2+^DN@!$YzI9(u_Ha z`H&*x%p94^MCCqjg#WPYbp?vHP;KJntz4e-nS>)LIR*=l)4)c>q`6t+T8!(=LYWWl z8&o}ZqA#jgq9uf1ny&{a7t@A|v`jU8ZA>t=R@Pr6ZxmHc)@J1~=~>U`C(R13B^15+@whCFf8-z# z;LB#@>-kVnh0QrO;kv~mM<*O5b25BVxq5b9e|<-+FDfsUknaLj8!L2rv}sa&yPhf7 zG(Rfj_&6nW-M|TzN7)_Ag-_#7!ojwMu2Ic2VLc9|!-^j+&nbCR_sTCgo%Utq4vSzZ zeyRMa%MpKlf3(kODq^c1Yh?yVxtr$?4=aOjvb4wiT6o!^RzXAj4`J)i`eSE<(YGE_ zuk6z@52^Z}ZyDa8djRV+htUa+ufi{E(M>X?y=sq~b@gtAd z8fFPi*NtU_=@>SW5(}4wqQFD5)qO(ljv*b57;Gs*9s|9;lQpQe%2W!YYRGFi3WRs0 zn+$ftgndz=6mh0Qy7oy;S->%n2Ik&h*~6qTsH!K3`~YjHbU=YG`E0Y?SgnJy`yd$g zq9yah!w%}cGTlGVP?LeG) z@J@>MA?dm^qBbi)o3b$V8n_@Eygh{uAcX#QqZ z(g#9fqW_%*zzeJBBOY>wTB#t@GLZ9zrwJ-aan+d2%racF;#m`K@}=j5+=&(GIV(>s zI&L#-uhXqOui<(t=J0UJ+4nnUZ22F%9PG2zZhV*t=)ND;65I3-bPs-$Co16%ga+P` z7e;4@gfw{rV?vd+D~xi>ny2<$QAVsb>BB!Inr#9=bNhPT@llVyfjs+ z_`vPm6@Wt(wk#nc#QUHeSE2xLcWAb5%9cw35=(nBy#%yxc$6e%68obJFRJ!7-uu5% zXkzv_Wj~6~4Z@jafc{pU=C{nPTzIZ3E*6Uvrv8h&H9KW=LV9cR%YM)*fyv%xsQbX- z)xkNzBUanBXNq~3?F$h)^eFA2ff#Qm>-mVBw0f-Tq{0Apw-TZjI71|VnkssS`dKfx zV6?f7_;a&=BC29Q@3O&52U7P<(Y!lYbq}j4U~v!GCM>QpXmnWQiZhaH#qmknt={R4 zVsRUiOKORvZ3F6B_pD2v4I{nl`A{^{kLJ@Hw&6BIzyILI*2|(8}a2ApmCwgC{Rt zDs&}&6kd0V4?JmV23{18MCM9I=iP( zq1T9PHCK<~_4M(je^r5A_())&${EwpynFxjiOU0ezbexGhWL#`u<%rfx%mYYZ{OK9`YE#jiWJNr!cNvUXpK6L z$D>M9D=I^>rZ*v*6bEAH$ZdFKq=)-qIoWTGAYJHx_EJHEj75`6^MN58+lR)&PFQ4V4Hq3Qu@O?^cE9WI)eFZC89lJ~S ztXmy|yTligrhuCKxsV}Swrnr&e3zFHcR|5sp-kSe?wD$gPhrc?u?nz~A(!7dZZfP^ zjo{Z^V2;=47B){<(V@2Au|l95d@ars^LTrskSU(q^YhiuNLcBVyxQi(l&a9KGELb5~FH>NO>TKUz5?g91wR;L&ak+-feIX4Ju z9&=h^6=lF;(95Oym_&}$&;!_ z|1b;LLs=&#V7EgxBrFk?Z@tHOiWwd)(KXsp15w*l~4l2@4qgpT_Ou5j*;Pq3{Pq7+uhPYwkm?I zHFlzggltBCO=u!dIlmJ4bjwj6wQ$?W8%A|y3H-d_qZL`rV@hUjPrvQBumdVgOmFy! zGj)C+sjkY$2bquYULgrn$BA!k-N>_NYo7_6^}25O`rSZ_+f>fM5cZq>O@uNzO0s_x z*)YvIx{V=;^09_8_O zZ^Z_?4NW-H5zg`nq-Th6Z**mJyg<2#Yogj7OUIYTXuxR-qx*+A&(Se!)G#F%bj<(a zghYODS9vVO*RFAG(i`zaTv%rFug)LyusJ$mcEi%iE!`H^jTOs?kNL$#h?lkk`DAjH z0H-!K;Z9#$V3oi)G>%ZmfbIAucAA_uY{27Qee+0HDNNaPzjSSs!e0p`3Tp{#PKnU^ z-V-Nngrru9S=C?k0dD%PTY`cUw&B1p#jdxZTwEPj%|_%P#3En1{R7%uN;)$D!<5w6 zdF8Gi*w!Gzrvs0U;%+JH*P%_X+d|QAxUwXfE~q~2A`9c$DqRDH#e4JX`<}(C;}anG zN~PPxu-$7h=`_8y%U{&9d4yeBKox&VKKXAN)&$F6%3Lloz%RIx6H5sr;c={2B38+T${A$9V&yOr5cTNw<2-wgdyLOc)10`osT z{+!6}IC9cEkWpgz9L`9u!o$t?JwvQGxt3%+cMS~@(cN+Dx|*`3;=cMeeGHdnl7Ua9 zOK4uGzS`hBP#*N95Gi3RpWOYpXDE=RZ+iPz^F+Qj6?S&5!J;Z` z0H800q6qBbnsn+W!)EW?yLy%jTnZ`o8G>wBq4tC5U-ahl&WB?cRjYUfl?x4Dt~*?G zS>IY86F0Tm9wdIg+p4-S+!q!^u>DBAvLSy#mjtwO@<C@mm` zV;qHR>O0(qZ_jYu-G5u}`1rDOJb4r~4B51o&Lt?WvShwD>%VICiD35N-l3`dDysi&JQdg!JS5KJhvF{=OT8l5dhv7I>uN2-s}# z#@p%WN_o^5e$=V8w*1yB@Y)_c-!kr?hZyoT>-mE0SL|9;+swLIpVVy2P0Gh6T$M`_ z93zrMQW7}P-h5=ADJRlK9+}w*He24^fd*UAUy~?&+P@|7y`5Up!jGf^9@w$A z$J`#@qBov>^t|b7Q{W>|i4fcUvb3_*{5p$hQvRnH{6C-W=O;Yyd(>=fWLbujf<6#r zj)gckxVIQ@v)D9zacQwUpbU$YdcypH9dWE_^U_Okm;^}b<$L{R`@cZUK<(-K`4hFl zFVrWJBs>hK%~ip6cjJ2%T$(J;b%7*VMBhKZ9jG<{o1%U8e{FD{zAY9_xR3(gtn-_& zFs|Fxp+J-SUFAx=}K&kMS#iq*u zJ&uKsQN2uX1o;MFb%9%yOXQR8?628R@4xhURRXVn%*IJkk&D1=&oNp>!Y059Y87*R z8coz9($aguq`PgXMYc|Bl8Ep`*zNAI`|31$ZB|mqhtH~leeDmDv6b0o-cpA-G?;CC z`{P%kHbZseya`vw;4n*!Qw5$HsyG5_L>|I5vOxuYl8H^k*||l4xp`f z*lFoHK4Do@($iUIam663&T+#_Conc2Gp&HAaJCx1p8_4;A7IkI>2%aV#9h_*V%L8m z$s_0#M2?CVwl<|0hZ=zk3T0tF>SLnTG5JzsexBnw9DtZ1M${5kV&XX?wc_0cki3L3y_f4 z7Cu_mR5dK*?<&f25$K(tp}7o)d4|z(?F+|{x@H2*@t3sAY5Q|C1@rrr!+V-mfT2bu zw@%1nUDucfubB0zmSe9zw7CEp3hcDiuwAh`c;^GF&_N~hjMak|rVPM-`0wfn_$0(1 zs@55x+#mD&wBIk$_}y=lF9OIO#=5<8!%bK2+i6)2a%nDBVp`bV-Zo?M5gb&7TH*vL z*s<>2jV7izL?FjKNDD2{er^3ri0kmM(mR= zX2{rSo}H-cQ|UUCLNYd?{9&*Ha3b;o3j9p~jRh#Cqh$-f#$?V0MEjPPUcW?f zd_(yzPap>poQ*q6-?1v)#&GLvO_6c{61HTi*#Sm`<8u7lyiuF0Gw4YU>Btv17Ofu} zGxurQiYq0EowT`2M)M;|cuJUY_t2*rfcJWsK@7X40pO)G5Bh0N{=-%}Rq4zY zOUD3oeXQ)oYR73Oh8>8fA+*}E^Eq#eCCMVF`mo~mVYWO8z^&x!%8l3f&F)T{W0cE3 z+hBjJH#w6tRJm<#0$yxQTbcPbX-}TsG(k_1W_HQXK-V9VCs3Zortzv6#aGBWp^4S7 z{n<2e;x^FC<+vN7jNB~t$FFXspqS11#Z*IHdtQ*Rqx`C3pJKi%2KdOjy@BjMPsM*; z6)OOL#$PQ+k)#yk@Ih>l=cyG6>-x-2O@f*um-@{lWd9Q|^(P1Di&%fw94#sIWfSG) ze<^^ij1mZP`*iZ^Tu?A+@j(6;Ex0|fu^JLsBIOu+GMfL8f>s!-ufd+1Q*2Fo+I%q$ zFp(z^*KA3Eo&?(56^5`4HRv7-Wflcbo4$SX169nZDqlzRI(Yy5gV#caJ4Gsgs|cVt zRk}(ev*%TvY%oaOD4G-Sy5}gF35@c3!XorkxB2UksNxGF)qdy$c)|O|OBy)LtHk;) zORj@84z(79ySci#meNFBKli{%dggVazn#L=Gx$85tmIdN03Gggg;z3rXEP($Oy)YG z#%lOEgMZcyN$a~`-8pYYRd7t4UEl+&0s6s$>o@$jA(AoDFLJ{eckz>@`bydCe^j%b z74 ziA--o=`@;v@oMga8F_$!>MF<7mG~}-b4>JyAnMZ;F zHt#R?j~=CeTV<h?j;`)szasB!>v(Aka zx98WD7>VE)v|Ln>TWXYNWI~Rtvbv=|u1+p?tKL@sy3j1%`RW;2vx{k@7yVZLv}o?) z`tlGKq_usO&?qyFr9r4=81EqgX-^o-SzBDsV+c{HpS9N0<*R_9@7?_Re~3#n!r;j3 zF6J&b>_r5hZ2^t|A8Nj@YS;SoQ`Vb|$s_hH-(~IAsAotJCO>>XMbby2uzC_lnFQN3 zK6be7m;=%Q=y)(94<$vyO|#WFf`79?5Vk5&yDtu3b`ckYdcpga$Z$cLN%G08+=1=s zMKu|+p)gy|gJF&OSc|Itp*&UvyVHRWv1DJz2}(w?1leJpSv!bgal}-_w}Ci*Rjcd= zC4$NTs3T~aD>#%7F5q1~4l=|lIaz1-5Pp%0`WZ0vxVq_Gyh9*vx5MEFKO|p#%|L6k zSuz8#c@&Yf`_U-VIrSb*Fc!L}|(qJn7W@nl9 zw|&-zl&)7#qz2u-ticRKSC(gGHjo=GB=>yrwZw6f%>a;jT3V8l)!b7jkJ#=r7bEaT zT?JH(ScoPJl~8j2W^=(OX^c>XSnU-x?dS!#*P(e1fQG| za_&upU%4`*$*6CF&5xw5Hyt^JE@t@bs+irXd;lmI5vBv3v6^+J=If=spY<=M(i%MI zCz$1lEu+^%e_m4oBw=w|TX1iZ@8bM1 zXQM}JoQJuwUQ^H)?{1UR{M%BPVv@`+@s~8g(N@8{N4s=}2MRB!b5$Ad&TS+g2Vk0y z!YE$qY1k7vvd`k?fF+$g2Ie`Lm&-G^OWVp!h$=0P2bwk~{vL=F4Bgqa2cL)x1m59L z-MvRybWq=Y{vDR>x!XEEJwyO&pJ&#QMfh!UA&w&OIf$oE08Rn&XB&n{i%`Tt%cU9y z=u||HVk411V{5~{RkLU6(#A3ilV(fl1%+uQ!>I?Ln7*oXekp(ujQf)R;%My0RSNhf zk9m^=ga}>Ydt&-*x-FWYm_GX3(o+(VV_dky{Z4wWhEfqtS@i9XfVuA7_7w>TXBRl| zDJSzk`*nX6SG${T$m*;MEY}O5_Fl;%H!PkAvahn$AyX;yWlsK}wJh0-=!^~QRp@ec zoV)TnjgjzgaOwtCu&N~2-vjRR458rCDjZXx4KVfOSr*OwGo>q>OKp9>dw6%DOm9oa zi6sfydX(vBifo{AlaP^@qwY-b*IjKB+$C z+LPb_YF0!L#e@dOl*4PYH#H!f%dCa@sWCEs|H^s4;Gp5^NV}NMRJFfCz9?6fP$sn@ zgpH_J0tl*6l5(l(dMaZ$iFGkbgO?{}L}I1tE}Oupm;%ObT-!{`5rubEDqx4|NHUU8 z!@vprf$KnouxYDu8Du~~M-YTPsGiml5*U?Q>k_zYH2nttrw%KcbUE4|fTt)rJdfC_ zcwh&-BE>e7jP$R8rw=_v_6*#-xO_x9^J(^?54a!fYzt|i}R;S}hhEy75EPRXkp;o*+MoTjRa&>#cGYWl`7UrV& z`+@(U?z(u}m}S_bO-vylFWx3_ab57C8Oc~%AAjU3>q0%b%2mV=LCND6#B0CA0H22U zxGO+?1h1z^mPx;gd5Njbi1hFbh(tKuK=!CojM9)IX2wQ2{Kf@(Q$RX-o~u@}RO&@= zs!V5?upnY5Z|WYgYzF3oi38eM1F0+>)5H@^7C!Dw^Pg}iF zYxx3dSS(jbTO3fOU8r+WRq4&Zcmg007<%at|6Sbwrx`v(q#lOXw)y>|BYjr0{-cg` z4wA;b3dV$)HLIa`johgtREImLtEfuEqxEOqT%7tB-HT^!Y@ zjIf>3Gi{SBqiEbIRs0cgvDzmt_IzcPKu4r_!+WI` zs+Pl`Vm0B5n@lvf4)eAy=oEI79p5UMc*`@gSKfKLLwW|BdT`yV9U6$F$FXg5psf5* z8q108tZx`=qQZ%JcdesyZz4BuAbkZzuX4S&!@NCFRe!kQ0YihcT$;R4;S*E@EDCp( zG*zf*(5MAe3RPScha5J1rvx{kfCgyRVmhkvqO6dj=rt+>zjd25AiX6h`qBcc5bm7< ztN1WKM`?ulmiMucd~F^7P{nNuG3Pyx?{PG$?h3KQbdN_)hyV3SFHwK%#gqIpr! z3@HMzegXRfW$kk36u^06_T}#D+^M<6it2D(sO8DmAY{j=iD=u!5X6&)o}o(zQGf=yR{@-v!#> z8KXIf5V0zOsP_kwzR-A{xN=h|c{?vd(KZHpGh$6LRsD{1rM+FZNr;ZFMo5{ZuaBRaQm4b&6Wl>xN3W8VMV_9+6^X z`mx0-rNVMY!j~F%(#-XRg3U%5^3yIE{z6M zZckzelACCTc*d=S^H$dc@PDqU1_ahjB8|2)qt=Cj|8RdzpzOT=<;4SjU;`}4|FP)} zxp-Q?TCCU37MbcNXneUH5I*|wf}TbI5Ov2JIa1jZg#=pOEQi9n-uN8NlRDrTkG?~McPm;vn7bi{3V@B4YTwi0zG1Ap=%i%M_w*BX6WK{ z$?}{PWywiL`fJPmD_w%Ek@S{4dp$0-JCyGzA7|fr0&4%_516LOg%=`}C}Bp%fXH2+ zLW}2ca%K`_rIP65Cj1JydM&M}UXDGC)gG?k#Yfa^*@Wj(l$>e_JeCV7ccU7M)kCHu z$zMv1ExGPikAR>a_J!-OfNLA|3Dzeh7q1+ZY2#&&F;aqn6S%R}WHoGCTg-IX7@ z4t(<$$x~Zz5mR6U1nCLf$$z zV{#Gx6Lh{Xef7>pT}_4Wgp($iLwP`^eyK#EtG~-cX+1Yzk0zOpNR3)}1Gvp%@$V#% z0tg_1bOwV7W9{hX*?2fg5s2lC&8C0}0}`mmAm=4?CZ#gvmma74Brlx1=$udAcn|=l z427Vy-Os=!asp9+GCWjlGw(;U^XV9ZH>+-`3%~AhcDws`+hDxf^0->#k7cjWjoxT2pX%)t~$ ztN9a{Ma26`;If}?GvU~yj%^oIY*=+%@1A8|p9|wP%wWE_Na!gUPNJ9!`Prg$peit< zQS9_Jqb-bEIEMWKic1PP4I`=zoZ{|>X7(*?haRAu(F zE><^nPoaV*{)sI`>NQZB2nd$B{Z)3=S+u`7SETZYzj+T8!&gf2tuZ1=rii~bB5Cbz+qcXQWbz?>0naMm7AaHpE!tRPy z7@rP>smN%`&dT^__wG2xxwpgdE=<8MCSNcs{`%`YM(rh?ZX=vLi?H0rzzsb)wTihq z8JUY}8mDJZ+E>dhrvf+Q`Z6X@0A2W6&Bd{o(TiE6ouw7fbh#kw8uPv4a-ohYWzw2I z+(oC!TdWoZ*XZbE+!T?*xaUS(I#Nk9K{quQbI+Jz?bJJ8BWGuez2DeQ@d=g^ev507 zs)C&l#Nxq|gWmqR&Da1w2A%DE3QNfQbRawnV0g)cbP!O#{sth}m+AY}IRwty22dtj zpu564niuiOYHfKg8hR#`s`1c-l%4#P%qluq(Fbome^d>6N1gZgeGD`S)Ou*iiNs-K z$8-%sdSsDv0BvCR5l&ISF7jx`^&6lul>#{P3Dw8tbZ5=0&mN2;rU%kF6tUcnkv`jK zKH1VXp~r_It2gbF}$h$bRy0T?7UhFA=1y%gM-T*PVnMiPDC z9Y*A5gH&4TG5S*kH zR{Ark=13uAt%wESp&$LC+542L0&>!2}r zzt{rc(BusH?k!~=TbJ&HO{;XgCqG9K+f*41@zr~@v*R6O9Qghia zGaFlVy`@vdgy>e0--M)npp{FbeLD&-Y1y(GWp=mJv7n4MI6DUbj@WFLR`XVZh9sVM zVYi0bU5RSI5&Q1Lm~FwoEDDuM7!gVD^!XuxNkP~3*E2h#B$xd>5g+-il)LbeIEBp5 zZ41i;$pbrzw9~=vr_J_3^8l@Jv$Wv&o9BwrwOVGP=1krz{8a`J6j5n4Xd*c6I)gaZ zxCa*=K!B-xd595X3_zG1_Lqw7;CNnl0|2Xh*De2fyUf{?yvw7#ubHQ>qc0}b{_pQF zt^q*jjbJY<&%&zC^Y}I|I@~;UNGEAnhtFg5qAOaluB3PrhSV?uBaSJ zv$@p0hTvdO-wS48 zR6q41jTc{PoN@T5&Ni>ZR^BXTfOKum=7u|NE4LlGn0b2V&xu6=iFW#viKc^escT&B z3a^KAX!>!SV$(4WCdR4hwC;dLXeIJ~zEJZ|@q_!1S4 zGS>47^m1~Oi2x^kG>3v0DW|cZtY&GXDuDaR8L6En927P^%+T2mT6WeKC1VYN&q3CG z*_GDAFXzB3#2-ez$*f6LYE-cD2LA;R-o*TtZ#Ng>e! z;XG>3vnvq{blF}Kt9RZOJks=;ZD5W#+DO2F+K0ga z@b9=O{Eo^8gH<2F(Ue?Eg!sN(ppyt$q$lD}BDyUF&d)>Nd8Wbj=vj6ls+U@>+&o;t zyim+5J&nEv!t>1PE-Ge6dw`M)OYM%Kke}X`o;NxD622@$(o1lU`n+h)&o1r9&D&Cd zvUwsGXoo27P%d^yLat01v^wY4leWgE-V$81dph~ZY1R#uBf#1>_kbzjuVFobAady0 zYJqHHqQ_Wr&bMB)tTw5o`a3EtQ?87LQ9Cjz}naY5PJ()M!mI6x=(u>`|ie; zVkYJS2zR@X56Xlod3uy+V4eLT#50gcTflP-QL(|Rx6sY9|K!Gm6;D&o7*qGzHwB;rTI_obyVcnRf z$0?pTW@Se-g4+dmT@*I)`)y$44)FKy6z4Cdk*AL1md>{hG@mLJ&JxY<o87SM&xVxB>*lp&Nm1=I9+sR4mYs zOP;?GkHj)NUAJ`i<2SyA>jDEtcDeonh_Rki#!oblJF!vZlR%K_)eRX@myS*jOk0Up0Z%mEGTFbl3U z9}kQD@WM?6Rar%0K_r*o*Y6u9t!A3TDb}3n;xd33lMSzxk%A8b5THO~s#yQWV|%g) zH>YrWse`?D+!!9(3^TWP<&?wC1X>VSQOlat`_oWHu%-}%e&MM=5; zC@O0GggQyH%NbLjMz!Fl$dy{FQLkidNeEj{#mcigE^qP%d>*=%go6Z(I8YKGtY!m% zi>xDd_p+=nIdu&IAs8IRF}^66V-!mlFzEquA?MWLMF4}^6d2g(uy9rzs23`ZmW`%n z;&V|+0BrDQRSlkx8Pc~_!8Is)8e@5vj!b~5p2Kv2$|EuFkgUSX+MW-n{H{>s>@E9a zK@`?Y?q7#=n0WFzKtlgQ54;gsD{0K z0ncdh+o$97AtFHfMenDAO5uPO3wYd^w)d#-BPWww#++p1JVzm+jRxd}T^TR1>w?V` zT9juCfcT=yqhqN=DAE#CrQkW?V4RrHc3KL6Iy;tK%~?2GR^)xKO&Q*|hZ2v%7LFj+ z(LNV*<>fk)Imx}c;$bp?2(8?tW(vltiG5>WVQ4=|U4jq{ND>=92)HlTc3=(Lsz2$n z_x9#%j(8Zo+=ih&4^LL8Dt#Hde_V!hPnY2wVcf|dm*Fe48I0Y{UN{p8mTH9MHj-5f zIDv_q%SAp>>YApY@I7pZg3=bADtfzlI{D`O73G$fU1WPm+sb|@)y)7Rr!#WaX6E2(R<_X=oXSx#6p7#|Js2+o(Iy-`t;#?w zr=xA=cs@>jcRatZekWa@AI2MQyEI{wwUsiZd*9dPO8p+m)BA1!WD!RX6H_o1K@FXr zTwDoL)y85Eico-;TzCe6Mw@8QF)3T@vjAV5uuQYaSUX^6^&@cDOZA^9?-zFY%Mi)E zQ!yYOpfn52cQ!IAEjnBvGo{buTPfywwMG+z8`VAZJ2Lh~maDuJAd_xNYoWJ92SQwA#XtEjhfJ&Wz)C>v_g`q0-jz@%S| zF{QO{C;TqU@tcLW`U{Y9R7gSg=Lz?FuzvwRoj`guBqhQd_UuP^lZTLO+g$(4o&N}( z{s#)c%|}d!M`!$;H4Cgv0h~!!^*&OwBj?vtNQLt1LSuvB5#EvkVWmfk_j(xE!)|Pl z@9OLZAIY&G^LA?KS_N5BWKfxMeJbU41@p`{g5Qjxkov2qs%#cP(zc^seHW(?5+moO z(!q3rR-)^R;)V1`H$K2xzhn>tErj_w&P}#@KwCRM<+XsPljyeW;b}3 zR3XoY$d!q2m{@)^?dckrj?Rr*J;$5UkIA9aDJx+*##d2lQID7c814<#sT##0qMZ`8 z-h0?D3O|=e9KMlkzbD*-Dc2ZX(DbR-k`~+v0Xh$UG&NutZ?e33!a6koYpHjW*}h(B zZm-BI8AcSksPlkxC!FcKm_Ofs5tgA{tSY=dBb2K?L!b0sn@$i3x%Mbpq(;Cr;dWs2 zVz0)CD~*myt0vybuV{3Mk_EZ^!Lps4^!$oL2Xq9KFBAa%@Ua7|eKM@-@%Zoz7;7U3 zmN^$;dJEJ-9`*EmLx&i9^$R3H&f5Ar>g1dHI~M)wf3HnYoe}v7TV;IhpI;Bfz>9 zCYl&64_}Sw{`89do~eoj+4X21G4GN#guV)@bENpZH2DBBAe?EV7=0Yk0}Mg^9lzJv zb)u$c3;A44nND+nXxbCH)p~0W#k7od5EV!56%|P8!|6k7_XulHGP>%qs7t5mf{fho zU59I9)x+)HRai12N@0CC^ei3}$mI?Qb!T=C7t<*iN62q{> z{1fuu_a~u0fZPjQn&A=eHfdRn{wB?NiF-cQq+uPtwzm{f`06R(t#-nvc#qX3vzcNX zEJ}ft?(f_v(MmG}SD}0hxK_{EgnsXZhw_dYEQc;EuT5&Q4(S{u;Tzd&u~u9KIHw$j zbkrA@Ix&pV|NmT|jGV+zjt;LPW(%in%>d@ytG;_U)I6)2msqa&+P>LjTNDTi4EZ2? zz=vUB0>KxfF}N-h03o$t%Dcj?{zyv+Kf+(X-ZT3ta70Vo=TG_TXuf*!FU3sM>IEF&C;26s|<6^ z%(@z?qxHNxO_||*#plDbZqL|jvo3f1xOsVLoRkKSx$c;<~4G9RcG?Mu7V2?mtC!rd`sx;-*ic7H2t!fcHL{iUf9$Do$@3hE z#MipL1_fm}0IIc|sL;LZo?A_~=wZ3nTsmZUG?QXK10k?&`Rq6REM~5cOmW=maZPmB zEPMHn)6bVh9Bz!jm*jeA63(ORlR~qb_fv<`;vE)~)rqmOK^@!k%+#HKkOY}tqvzFl zI|@xpG7=}dMri7w2KW$B3c!jotiGM5NCCUuGAc%^V)F)qRft)Y#7waA)(q4|-bIaAk2lQKJ zL&wEVw+qJJXQ-qL#5HX4OWcQc9h~aC#_yKLN2a>Leo`il?+rPA#e6P%8?rNXSAB@# z$xu`h&bMBAD5(x2l5|(E8)K9EJDws+;oFMsg<_gM3+FLan!&dOs35;&gWOm7^VO;t zN^rlK9N$`dx=n)mo)1vms}%yf21{gHuc1=v+2%?Y>xTLY!>>ML&#f3b5|NS@_?!`; zt-qdebj7TXq{um;QM4NXI(FFuthObtD6bO?Xcs;6A0i!pGBxcU|lefbWg)yG{`Y;K;q7!Yc~S zR97O(jW5@%eYJ>!K-j?Gp;q(DW@tCgdt}#vmJ5AjD!-kV@#KCxRn}Vm)SIjTXCc&f zZgqiGsEfCcRoMP%!s^53kIn6sZxwOSvKUy!lO^SIfAKSoVT!rIfHQSJomW|Wuv_R$ zZh~ln`PrrfflnSjH5>nUHiQd!UnWrx|3VApyQ2IIock$ZM-z1YoEytc;|p!<{!ON; z$NNP&Y7rMFM;1=(>*&942hZCyQX@trO${T?L|dbt7-p$NAY<&`Zw2+g8e?iWGFM)h@ekhl?84&plr!xP;*iD5kpInAo2J@!Eg$-IlClG z4oI<*1rnW%z%D$ELHC#Jp$W|qnUb*QBV#jaRpE`OqThw>M>aSu&R>P|!4$3C43c== z|3AjwI;_fV{Q^})LJ*J?T!b`8NOwqghvX9J?(QxDr9ncvyIZyb zksmk3?yra}q-P73q-fxz+)e>`=CY4r3woqjsB<|7^WMTp-dig6&mNw;17Qn-L9f5H z_#+DgreUJZ{YK}DBtnwz?hou)041-{x2COpvu5>-6amNxmQ>Pb`R?Aivvt38U5hhI z$CyvPfv~a|r+d-T4H2R9A$rQ3^iUK32WZd-}uA|A|mx|zu_5Y!Ra!ZJXmbX*Y+=6|x&hgdQ6;eF!uqn=R# z>2*&+6aETbe!SZkMWGDkh_%SBLS2Q)-J-*((yX?&UqXnxj0q^$@j`{^h<;Ix|E;Dd z)RN?S#NWez|Gw7Wp?}mge7=5PfCP!f`e6+H$y_5bcW zi*FtxMb&T;rT=!yK*j&e30$g%FDkuxR!fls28J7pyaXRA7l#nsFFpX{2qFD40qq2Vmv7cgRA{zo^w!&RjVI;l%^B#@H zw`U;wXgqGW)MRB2y<=c%;0wu}3oMIDaflO_$x$^mXlK94Yg1gHQE!xzPHtFqE1W8i z`0fJi1j)oIuN{63!MutejofIPmpLc7;`O!_lITvSs}y6#GZ8a0^(P+5*Q>m6tb~Bc zMA&9E;a{7R02(Eh)tN$2JZ>;>_6rtAksq(?BmzWf3P!bacPB6()#WIC7i9^00wNFT&Krl#_LeRHupi2keoAg zE+Yk}AEMQ_+$JF~e0cxK0w7$Yobf1Js7)(lh&UK%fQ>BTLxWJx8KQBKa>RGh$~CQ` zO#pIhpjjEXK|a`OPV00+JzuDI?d&Y5MM?*3CAGeN(r4j zrY)kO-B1!B9kH087i;iS*AMKRQ}F1JKn(Q0;edZF1@KgmcmgutlY`ApPl2-U*wq3aCDFC;2J(;Bm5I#@1u??=Sp`hn2gjVR1$ z(+`nP3N!bm05ckSAVUB$SYkA}HR;e}UWk{hs~!M!>yZ0h3?OOuR=rS#+QSLD%(PFv zzL`t zh|C>gALlwIf$l>ERP!ow;nM%z(fS`Q&n1AEQ*!C^KBqz{>YXEQ zCH2<6b?4(i61PQ|o z=TiKEZ9e@8^O;`N>N;f5$cy_^ z{b9dMHV&X+&1TWf9C$f%Q3_+x$N0RuX)NA8#eGn7bmu41Dh|Z|KP5K)cC{5^(}`DT zQR7-Dtx!8{+zgx^7-ss;hWi0lEA$$1L%FlD)e&Ss23W)xje2ee_uoi|1aq7o83QAw zS?QG*lYkw_N;RV+5f10H2f|iwVHM53w|&UA0xHvo4^Q&CkJi0QM>c4V_B(KIuDCnO z-X!Dj*sj>*6L;R3F(*S}2FX9D+X;|$Yepv{e@$(%CbF&_%~g?CJ1rXz%lIe`%9}r8 zK^TO(y`ztRX9`?mlz8KJ4A{Hrm56TmelmInWLk>}{p&0Qq{QRUkVuI;Z@XPU!}&1= z)3XmUGC)FS6?8M1{kCY)ZhY8&yphfY8#a=v_{Q)!VeNLiPB~X6-@a~R$kJ#e8wQvX zs(^h<;h_9IOn{zbV2{ykAqJe>`2jdqizA?#SD6pkdCP>((nP+QJj9Gd+`X5_y0+h6 zRvd5fT_I7fln^=A*4vTw4N|VE9|i*k6n4vN&XB~$0Hwkip{z>k)W2BITa&w91Sv=8 zJ`T%u&fa%FTNBY78fA)uXF~lAK#J0TN2aF~W*J!9 z=;#y7yRr}75CrC;*|x1ljHT}SiVY(WoKn8Q`z+eygC3{w_tD(0!M74J6xJ1zx0!VC zpW^u8DX z&fkYJd(1^yTn&7lW?Zr0I#_D-m;0FN!I>hz_>MlebF1dRbWMSdS=@&fBdB)%24in8 z?eWuoP-TBjuk3q6-O(z~V41VBq9bQ0m-AhhkflTMGrQh_ zJEbfCOk5!w6()g+Pepi+*p{=wl~hR*%1DJ-*G!aMz3|-FrWC$DF}Y#dDAu!c-#hC! zZ?4B)7BxE{OUss+71p&uHI};<_;4J5kzZ&7{s^`flG9(WGQD3$RKd#=Q}^ zNeS0>X4Ij=17rdC(j2e)2CR%J828@i_Qq2iH8ePNAnktu;`XBVcSZJQGfP(O$+eKE zGQJ+lot4N3uIyV~K9dr%J>HU(>Sb{l0p^Rv9DlB8~e8BFc6O_7JTPHCo?6l&{dDh%c+X;*(;)wTx z&{=z80eDi|x?Uz|sBi*;P)7MyNHOWs`YyEcg~KnmI^EJTrn5m0wLY!fS8hmKEwmC> zzKPdWC)*WUP59R(`D^C$HMElbQTN;K!K`f~rDyY=wUZ2b*X23s2LX+VYs6Q}Olk&Y zVP{yCo-lk*p}EnDZ#h^OpFTx-^3R_DD`-}eAnpv&D7m1bg;*LbVA$2*^J!_Mm25C6 z3-C|&7*>7x3)AUFp zUt*c;QLCK{qsQxBMpoaP3N9lKMiAvCn3!hW_7Dc5)_S?C{KR^hOUnuP@U_O@2%-ew zKwmB#E&HB)yV&O+&3Q0akiPo9;c(j&noNrJdUoU#wGUYI@67`nN^|}_x^dm%#H7Fs z(cSkOhqK<=gveIDS9ikO0w2@Qo%Y6Sy2jt290lxd(WQg%X$x;_y&pJI?^C_qo7+;F zzkIp6+$!T;DSh@}PJ)QI&^na!V8C8woZ*xBg4hQN?&I4h!ZjH0vtj=EZ9MS|AYA0= z74@^Tt8ihTir3gBfTKC;K6b%~4-(lnm+KMz2~$BC)cTbctRR1^Bf6T(WETYDI>YC3 zzY=rnnHOf`D(s+Yx>@`d081{VG{#nVt}kqo1X3CO{8iszT1!D0g{Y5mcdS(k>?$WM zxV>|F1$p9$rB2sUxeFO`%jDudqjI?J51)xq?Q<=&YHz3vrl1*Iot7w+$r)mMC2CkM zw<-BYY}{PnuVRzgEnf5Ti8ZTEK5yvX4wUD9WzHR{2{!1@Gn~tHs!(mTDd7v>_)33e zr61#RCAT0u%W6rCcN2FK)77h=tS-|<7v9R=z2L|`f{!R+NY#TEW(7(-|s?>o5qYc?nU>U!@`HeZoMMW9`3dt_CtD@lxYywIH)h>Hm-S2 zUuoR7KbYmmvPrq+q$Q;c>Z$PB?U&`*1z7s;#oo>ve&f%?Y} z${yS;n`ug)p}>L^>W-@I`$PB-Cv92xld=PJ`HEx)c|uG~bleSYtE+5Q_`kk4_Fs?` zQYCZq0IYF_NRmJV)1Xf#?)fHt6+gIA85yh@$D+(E`5bK2**%Tm_4RNVhOYPZSU2rc zR1yh-0YbaiM}kElDBaa$1_PgCtt?dVeh-~DK98#u*gZ=9jcB5B;ci?x`@kXl4%$UU z)TJO&SnJAy`=!q)nA3vi{tPPl>%$ru%Zq+TmC`_!(E=q+n!~;f)+<&F>eYN7kM}hq zlbE3e-0D{xAD}$Dcs(9M?rb`bgXQfw)r?oLxV~dartVbj_bjj^L($5;53>s5(EMSD z{cYtzQvx*Qe{E}8pdRWX?&x?OPp>Z_er2VLeBO?Q-1g96(UsUMcmfnxS8Sn<)gij*^}!2a0#AA08bGPoPtwpWd@^ zWGRIh8)iLRT2;QBuk)S+SE$2V8kO?fZq>T4p0ag@E6H~gJ}2I(a7|Vv8DtZmko6Sn zH#lFm_1r%59V&0d({OszcXGb1MU%|!Iy`y^Zz?s`6EnPh8V9WT&aaJ-ZK|zpArhlH zQIS{sgJfcCm7H0^(h^z-J<;S;x_7h))t`Hj_C_U$-?LLfTh*x zd9SgdB-!={0(#U>`V8RVzMD8{)9)NW=yFKU(HtU%dSe>9*d{5`82W4xzrx(@Y8{9^ zLmEva39Ncl#HK*T)_VkRf1d$cmDBx;ZtUK{59#UsS+I2{?ZX@bZoxNk1gS{j!ZQ!1 ze>}dx(~P1AtseOm&E+_T-^|8j%HvYuG<`~(B>x3+tt@v6} z;A_uaob_NX5IlY9JcKcq3?JAm0jVHxOYs^yhuX8jV@P(loo^Jz&Z8{Gcz?AU1URT3 zX`DDTl$p?v_H`Ltaanl8HDhuE&cb<>=iFxZ2$q#sLSkydR04&unpS zAMdc^FefIm@tA}TA6{;Xt#EM~j*;TWX`WMIcNs4cTNYdS*4%$Rq@Tz*X3VudrJdU> zNak^*Ss-7s8NDx5>>ZA6<`FFs_;y=vH12SnG6A0W%ug=LyN}siSmIIwV}n}xg1iz zqv5kyT?f2+J<#V2FRN5VNf0<0cMTLT=q@)teqX{2R-{e({SSz43aUqDhQ&RzW}ait}vkKihK^ZB{ta;V1lZCmID2;|^J6x=1u* zz(<3DcLB#;N}j!(L^DA@@qori96I%~NijMzy~sOFUHX~hzj`Gq=zY9ks_36cC{H}! z6ED_vqhFKsbl$f&sc2P;|Gtb#}j~C z=HNlr*e=+l+m=tGGd)ea-h3&$-J9qQurLg0vhFTxuBis;=dU<(7G}n0X z6_rd(ghHMeAwtEk^YywPka;Z#q(!H-<2A_!!!Y%IFNn^f{V1v7c9j?{jV~^_qf|k; zVc<=IS%z7ZQTVKLD4xw-#ycJZR}t5QM|=flrg@;FNslITzIATvr(caiuEB@a26tSZ zsE&KCu=|;Y@C0i;rde7-XllB01*~yra>8}ICGBZvF}&kuTI@@Yuq0mSUD%D#3FDn%~ihr)Y=cdFWAoz`}iG5dL@-YHa5*wFP{$&_l-^+*7s|RmbXy{m$=W0@s z@1JJelai2#pwNC~6MjSF^?U|rd?mM@Cl}k>gWEM)IT@x-Fd&x1FM7Mh30bgfwbfF_ z8DwzYb&O7cf6M2Ee7OnlbLKV_hJkxx5h>iM*q-nY>;;^;1Te1*M$(y&VBw)bBpzI= zgJsfV@U@-N-(LN|6ugZm5;!O9eU8CPJswj;vJ^NfT z#*vg2lj>&s>gfCG4EV}{S(5qP^_F*alix2x;T+a7$ z)AQF?K>ENShOo6q8`Z*M!}kHrY6-wx8+~prmq}1KDzLiaeHOM0d%FU;o``XEzfEtQ31u?sC53$!J%A9 zZbtoXC-w^0zyKhqI0Cb1ito%QGUnsVg!$aqdcXDR(WNfbOoP>monvXE4?OBnd_RZ5 zOcKA%&ZM4LG-HXIL${iC$_pzATdAosov(D!MHiWXnEuxo|4v}5qs8`+J~|-a);!h? zau*ktN=lOi9CtfbUoh{u;+H#KUc2`fgcwJ5kG-+aHYzh~JIUXalQ?e=dN~uo!xCzi zDzP;Zz;#Uv2%U2lG|$^RuH1nuTyjqPKO6%bYeX#$hQ{XZRWGCIJ>~RfgTKo~ekvzh znSt@A!Fg?8A=9e%F;sq@CVR{WxBR^nezJisacs>hhoj~2+D3r;iQs^80LK^)$-16!+?r@z>>($_Cx(=!GLVZAySzgr(uDP^Mz*KW&|yzuEXB$S0lqlS9$t>S+A^tl z@rbpg%wzP{p&=^KlK> zcF}M{`nCou952iu-bLh_11-UOVC>ZC_jNPTikqa81%OP0dkZ zIf{6qkhrReK=#detkfuCEUO;Gx-Y1PDV_NacA|Is7yZfvd1Y7xq!+WC2H%mr= zDQacx&G&b)($Qd{qxhqZ+oZ7%B4X1*yw3eX9bw=p;98lA?p&Jp|G))J~qT z)~!2#7ECl{DVywm<15=BCUWel<0GTF>U&Obdm+?Tb?0o>nr1zfJ& zGxDoJzwLZz-N-bw!OcW;dp;12tg;e3diV}dD?}8!KQQy&=<))zNqG~zv6C$FU#$$v z6&&=PtMY2uD@@OSbqTMDhbAk;2)g5=#Cmg%1oK!%R)0N9H(jEn&B;?r(IJ>xeBrWu zGwb_~P>$TZkT(^=79C@Qd$UTQ~|fJt}p{6J?WdPWP*; z8}XzSmzjt!^joQ{1#A*<9FbS8v@+Y2w9mJd-eD2%id{6XFrt;}4*Xa%)qSysP>-x0 z6sP%Gz21qxmc91k%Ou{kdO<&vbSSNJfbMYmwW@%lE060nu{&B$lPCqP=qY;;W=|e1 z;h*Js4!0=ai2ji{7VdH9Cj?I{r4tlf&;#k38jHaEd<7N~hpu80mfUQ+S>=jT zi%GdFEWlmDZDhu0f!aydL1-Kn4U`Zjah0X>1i6B=-%B>A||;b%)mOv{~VH~qqFU5xFup5jywy>hd%IlwOA zDz8zE$DbgPiX8eJVZ{qp>9rs3uzwm$Mies>fAInPH%$8s4=h33ap&gaW*KE2T9q;T zgA3*N)*=fyBq?f~@p5BzJNA%3J}_t2Yu3gvSN)kN;r0iFHcqr3wi zm(+wFro>vkxaaR0RtdYnZdN1q-)@sfFng?hP$_*^3iB$fwz(MtOmqqs(KcKhvu*~(aDfE%Tq%HCF#9W86a<_3C2EnOLTZnnMChPKjEdD^h%oK2v^?Ekft3&CC4k!Ps+PANY1O?Z$JsLbFSIO&h1dim7n>-Esn*|-nh`X zQ9SNDl|y$`(esIZpisEGCQZA^08WTH{&(-XOAIioi9ZRD9&eIYlDu3swNv`|cTCoF zT+T=IA0s|@h6?V*Pegrv2eQkM-w~SjjUQ)M#nBd67$BU_KjFQ0-nW`AH>G`fYf3K} z-=F|GGV9;|C@<{dNt%VJ0Xx!$9lYgU7AUp?=7_q z58%Wj<0lA@TmPRlP$0Q9;DA~l+T~JbyUSCDyJAay(O!v4R_}PXJ^kABd##b9F}ApN zBzbr;s|2k7cOVv%bIfoixI^+N{on=rNQ&eMF}g34tKf^(l>T5+Q80JOtnp+rYDb2B zRy1R^zVntIxBmi+ojgr4745)U2QKW8$FGQNu^QBJ*DHlzt-6h@axc44d%I8FEyqf) z6->oq2`p~y3d1mZ(S!VGZ_1;oN@Q&Fq)!@i=T8mgel>@jkUK{swhbIl7dQv;GlBPa z%XNMCalT~qiyVg$FP2uX zmeZwRKt_7$b<6Ouvb}nfSyj=cAI^AnxB%=*7eGK zIhn*At#f~)nEAGp05}lacG@W7e8FOyQv`nsxFZ}Z1y4lFfivNt)6ai(a0EyVErI;> z&@sSGNK`4b!x>kktaOHTjvL&%H0zY18)r%T%xj8I#kK3tPRK%u`rmT03NiVg$>4?< z@fb@ZJ#QJoBEE;HhexTlWK!Nrz0=o_`3X!rrSTP>|o| z?Lb9HGa8LuWjUBlJ2jM-{jibX7pHfb>BFP`J=#{{e&|^5LFs*;JOgK-|LamJNsK=18cRn;p$MXa2n`}W(26f;MB?+xraB*BKSj*ST!!L~!4pjjHN_id70?_84 zedhdkuY5@K)3QO?WL5}(0ud+_Oz&!Z78YMq2%!bQI~M_G)G~R|c>SBP>`lU~k*j5; zP-Gt0+fUk3$FCd2-~UAi1#m(dKThMP;*Yltpk%UFAk>-X!lYz`Fb_owm$GF}V+Om6 zcz&&}K0S*vsA=$RJ`KtZd=%3qR_sUZnVK^f!+{JNIbOZ?qvcYHMygf0DQ6dR3KFZU z2lFz>aKF1DpXX0~G~p3)hu|MqwzniGVxh-h<2~E7 zJ$R~7=SZgBapryz>X7s*ku@>i6o&XjfKWg6~Z1?VR?@Xj-x2*Z!wi2#KH z9!SsgGMlfF#^;7MIM1L^2niZDD2OW14PT>?W>eo*GiFwIzqlu|qM3-LcT@fjz;E)q zkLK}wV=s4Po-<$+NZyu2eywbenBN0Y%rFB z^>Y<6V^=Q!C@|6q^LnabyAEqjN9kuAM3j?PiJhEIz8nk#VJbc*6mSTaGB0~v(o z@0k2*|5TF=m;0*f>9oVH4F27O$+Yuj`lzB(!nVd-yiDWl6ce^McBMNodptdGkIA;U zpB*jLk`({!x$UK0_ORJRKL{Xb5&W3c=Z2#mH1rF+Vm7{urzNq}<5b!@_v^;PB?k|( zKvULTV2Ep#ToN#l)Fk2GuwGV6kfV5!5=p8kW~5of4p_j0D)+dFX=xzCL68c=@Q|gv zAwVcZ0_9U>BBg;{CjTRN+_r4c?RdH|rrzZ|P@;WUFh@ubD_1i`;YW$xE{E7kro-@k zS{AvM7qmk28i&eBeNE}}@Ur$cmqHVFfWgleO{6@%Nv|n?=%VO}<$lSOt0;P25fKrQ zxd10FIVsdJi-c*fGdT4crvLZ%{4LTW!s^!xw*@p&ELgoqD5y;W3gqOA=CAWU9LIK( zHgph}dIUsN$?l0U)|-kJrIKSw+iQ1_U~7OBz6T7|-oi+{O(^nW^UGtdy)Yq%+>1kqvehiK&+C!Fl?)qBRJ6O~Uvl48w{? z%7kI3H-acwuQmPG9R!09n?+{8y}6{<-``APc&{My%|_6BJO$==holbg;;0KMZ2kQH z-v`MMVX@OWv=IRBv(?!5>@CB0Z0(Ka0+O!x2^P5W4BEd~4yUs>omnO5lTmVXPl-Ai z-Jl+;vWi|G8y-xFkB2|h*{^G)*MB-D-=59@ z^Jw{ByRmv%1^|iKS0{4Sug0@I>R!HjQIJgJT8KL@!c$?aC#wlI4D5#lP-nee5&W{z zg|vwKE(>j@IY*=D)#?77bN6?5z~3ALA6k)iqI|}XranbK0y7wB;}*7O!R8|NaCN0& zb1d(>A-ENV@m zZD112I(#MIy!F{P9ogUG%Jh@HHxVr6Oyx!~s|{NMVsgAPux43lSLxTjy)2_fbxF-7 zb~g7;&n^XQ6OGmw?XHcD1YJ zn$o=l)_epq+XX)uaan`4cjXreQCc!D|2pnb0^taR9EnvCWB)aRk@#7YhWhrTkOEOe zB+z2>g4U)`=iPH9_l!|sO^3<6-b zLhsh6)s*F``uSFU;8HWX@&-A%E61>*2e_9=T-G)`&y=$WXy(;y3iIfrlK|8jZe$nq zJuB7sSPU+@cf#BdN!J?NSXV6{H?fHwkE3F$#+0~(nyM%>T~xxEz}m0e2qUMYaqKJ2 z>`z+cOW)_6(fY9LGx>hivK+@nNUW~k4|>I6X!Ls%lAXlBr{`PAKT+65KRB>zgi-JF_u;kR?p+6lHfDE zO9Z{I223$gBEPfAd`a?p(WFQo^VN{TVAS!_`j(DusMLy>;&nHWqk4`9TD+apcE3_BB$*Yp%R4mN5l9A-~WS^xR zDcDYPJPf^_2|z-sXqB?!4s^3zP!)@y%&_6GUlJn_b{v=3%1ENsT04Aaw9J&iXiR}| z!;H_ABQIEh6rumI3~`SOixlMt`tPc$01rIR*~>okkBe%+M<{$AN-Z_MuaLgtIVDqC zyK!YebhYJ*OjIdJwqR?#oYIN{2faXZJzK_`u;v(&+`yI8nEXA`mFpYW27!pyJd5dS zQ)Jgmlpl6Pp+p5qX5*CJ-PtBDHU_EX-c;^qdU()gjZXb?zAdM!jX<2>(y_4q+e%7y?uOK^CF1H5w#)Z2f}n30^;@xIYL%$PAy#(3y_;V~ zwD_vkJ;Aw5EE-7c^@CwL6wqJT18TS{=Eoye%sA-X)tvbAG;FyUf`LocySI*+x%_^0 z@#uGJUU-8WpQz44IC6cGwU zB`vNiYJA4=!JUnOR-6%CNpMl2IMeiSmu#Sw!nE5SwE(WK6Ku z6)*c{|F}Xel2ZkB7(8@!dW8VQ;MMx%EmbeoCoLtmgzJi2Bxqr71>s=&68r@Tc_&c- z>||2S_wF%5WR)Nw4z==!6%W?f}0_Tx_g zVBWTmP=InVQ%(?}WAaLS`S%lf{tE74QR{pP*6{y+um658aDd$-(w{<;9QL21*8l#2 zKc8(E+9FP02mE#t_McE4g#mt+3zK0ZM8%sIk!Z0lC$?|0W+m%2v$X^k>7o?xU1=2kl(oX9!_Plm{n7$@bZw(*I zpH=oD^<+)SL9G4vCntpU48!LMdJ7r74zQJpar5TX*_|Nm&ANYaLQ3QX2IgXT+Aw~# z&AaKz%phs;*F?cBHaSfx3Sjq)xRd=m*dVNn-iLl>T4OJ*Soj0F{!Rv3 z|0RVKoWBl~C(wLRKVu%e{Bu>wArggu{sbUG*Or?~6ufa~TkB)isI`l*iZTTK6C#r;n>4Wh{PpV=>{9WNS6!+ zB|$dHaf&UN*I*}-Jn+mdizkz2==y-&A^{>M0HhK`W-AeUkXq;M_MjHAHF@!ny^!6s zc?v*dje~Crsdj1wA+0qQJo|&mc>EnBH3-V(b_0{8v|kT5__FSsy6eG>PH9Zi2_+x5 zl}six$AH_q`L;VGlHS?Q79Dg2s@A1p6V0mG;)?;|XR)jSjUVe8FrooiF|~U>cUjWO zR7m|U4qQd^)o9sw9ed7l3;I6JKb%fl^pfvdVq1IB3x27t*V;~eu%`R2t9D`?*;L_a z8q#^UyJV=dpissUa8#C^s-a6>K<{OOJnZ~ zy!a9erl_2Sq;={UUcj^)Q;DWO@NVEJbNCz>SBNE$KfU9!XN$@`c~t8KdLe?87Dcrl1V58F zhM{KdEMG3`;>d7PQL4Lf6Xu3$8C?er6>yM_=vXenATWf=w%bW+VFd`}7Y9D8+^(<2 z42~jBUk*2m`F^`%>sc87D%7#!Cgg}SWgorEi~D;?M~MJhZd8roBjP^`&J!p+l5Mli{l#)=s#Y&D-Xq$>WPsJ>?TK!bS6ldg86p1<_tS~wpJVZ__wFea6TN& zH<696HQb;?y;Bibt;du~&1&R8&vLQ@jE~e;P0qr3`qDp?LX1S4GDh68mRvc00TCkE z@(;h{>g5V|BE*VjVwI?cpF{q1`$LaXcb+3#-FgP zx0Mpwz2Ox2A>1!UBR6k<8OeDt?@nA>y;yb-U`Me9=%F$ioP6Z~_5!O(;C+h*uK&h# zrl@JHlK~e*i{PRp5kY#O;ji$GcktkiLJU2}>6u~N@vxWt$#tfk>-TtYu~mf5;O<8n z?IVX^F1LtUU@W6p@+nzp155QbBs2@hG?=W(fv)sG!PVgpDm8`F&%HD6v&Wqa3Y8~h zlyZ<;6^`srw{_fmP`)t)-xEv2)PHBp+8%@p2D~^{Ct4+Hn&(s-Z>-HYx6Qct64m%_6zPVJPa9DBeli8L5dWb9a8A zjb+jQu^veg{)(e%p`OXtNcPPX4L}Kw5o**r$sZ3!%FuwU)si82cKOa2CJ4mqB$2Jx=u+0`x=VW=*Wto2gQ%WF|f0)Hj?o(2zVBqIge#M<;QMP16nSY%v*%yKA>7Aiex*>^PoR}XXB(w3w% zc+2PA#I!C^dvG~{Eb{vSl1&EAZCUr1bk822PsL(C3au#XY*(h0W@pXYV!k`C zCzhkThTCzN*lJiKN_HjEdJ2HExf-T7%*k8OF1HRxpvo{?It(FxDN$dnlsm;UElOC9f>A@?HkmY3vG&B6A7WyJXuMNXY=0}PYWF6! z?GuZy0mXmdY+rPso2(7Ci9&p70TjFAM za|G0wf|?Ie6s|ZFcru`0PIsVjA8Cq{?)k-VBYX}MHkexOqxSSaD3{Fye`lq7g}=jz zeBfcvX1@i)Xl68Oxg#Wvb*T4U=m~#Y)&QHL1-#R?CJqSjkLU*1J)1$n5ac`M{ulD?ISu!ynOq^S(sxT~UPwCX+c3$=-!7{-pgOC_ z8nBnAdll2rWdJkw)qn*^i0Or60yF(>vXF?z` z^VLmL)eQGtwcrcZVC_lQYr-784f-r246%5cR~qF)pgyB&97DvV7}@=|Afbf&{4_!3 z5t71NRD$X@%RaWTB3W7MaBIgaKhxXy3A=G%gTpF)PNInSwFh4|z5bl%t7IN%Yv0^M zKD~W>p!-mGhA&_cOyueY(&hn~llXT-^`Wfkof1i8D@X??M3x2-5ab)TqGau2Vwd#b zyiZso4JJR+4Z@1n_bbmtTPB**m&qCrS%t36ZE_0UN8PyvaA0saa4C`PaYKsEsgGpkFj!Ba0S*rU2S6WW4%hMTNKY7Ac zDJt+m0iZO%7Dio3SH3Xr&K(Hjhl3$P7m2Sl{wVYUZXt8QTVrU1$3)amGpOCJb;w)< zfw>jh`RzWTQl=#!n?B8bi&V;n=1qn4p7DLYO1B_r4dkByMzo;(N|wdC#3q3_ zNK~z3R_8b+2PT@OJ}XnwH|#5F5~GQ+KAyHSocXw}UBEMOvKBeg@iJ2jEmL+dB~yl_ zUUR;elbHF=D@v2G#}%{S!iMbRsIM2O2kEy{cFrBzj%wXqjb$0n_WsmCZ@@2rIS+JT z*;=&u|FR3jejos8NA7r9^;v`p_798!Qx(}%ANbS$aCczhbfsA@gp9`%B~Eifk)lZD zORS{i^jBS%Vl!1Ux}Mny~?MG$2zA={7>5Z)#cclHDlJLKzKSJaSRu& z6+oTa-JbY7!8*vznl0@-?jpFW^ws{`lA@iTbPyRQd#Ph%f5hT8E68u7tGld?tjAiX zKU-;J&A5u(v6NVK)~?`fti;E`L6^-Tyuq$UhN@-*Y`UJ1aIe3Ry$>~n`H7}2|9vd} z50`mpLlbt%?#GriU$6t-FSZzC2^Wgxq>8ex?ru?bi8FQ4Ihc@)CZV&8WR6NWO?XvY z(nA@?ly9}4m?(jn3hsIQK{1{U;v1l#`oB~*cn(21&VYi$jF#@t5&XaR;(d*Fn5b(- z%u$E;a^+i#FxSJ^8g=i`@`El4_!>Egj1xd%jtATVE;z0e+t_xAQb_oDY4_wVHAZnx zxSR8>ou|NEgww1Kw1I;7XZn~g^}iMxFeae?_Q=Qvdr%l?jFw`L|8AE4_r6cy1l~fq zc)7IR1~LL;KC4_uz>T$;vD~&dmqW4#+*>Af{9aW&R34v9%7kRyf%IBUYY;1!@V{90 zBPmc%qHBKqE}MTtzJy) zV#z0=Rx@7+0H4CYNYwxR7nBf)BKSL z@dqEt^9enchi@AkPK@A^J940ug)*rXz^6Oz!&1VKdD zdqN1xj^E_3KbPz5@eFs?n|zdg{o?bW&s+7sT&JGoVgO%4UTg9G&3{nuf0jJ;nWuD$ zMZozVE5g}pdTw@tKy>TNbgI6hm8>A@*6UjlM{8XMlbG7fr%#{$pD#`zgFA;I}+U4ALULtMh7~ zWt+AKToSi=Qz?c3Xv&UxPv{9-UxXZ%=yL49ORWzbF`V)jy`mC=h*BYrW4B`cf#InZ zEWo?p?%c~6auG{wDlDDIU_RW_JXHWs5x2W(#{C270BUC$+-4(iJP86eTtd5X{qES%&;(9l zKoXjUIR`TWn1XG>!KL>H^CLiDU&eAlax!YxZOyU=63X{4lNW*`F|&V!_C1&SIjO;0 zsqGkVDrFmANRnW(i)+@nsj<#EUtWp}lh|KPQ|Gu}UgnIJmCa{Jaa>zZ^Fbnwfb&y0 zVE{zx2d1pgMjh}y+#+UxCO`+o|1 z>$oVl?tNGkFc1YnIU=QiBOr`)hf>ng4Jy*zIfST)bW0=M9nvb@-7yLbHH5?fL;m)l z=N$Ds-}m*8`3x}kc;7qLy4G6PwKiEPq5fUocnsSjam!Uj5mXkN2=f!N6Dp1HG13SS z5=dphBKwPt^%gfj+bg9c<6-h#e5z)|1BQ$`3|H0-P}zMb>RTA;kexw`jbsdsd{UPA zl>L*+QCt29dW~QvN;SxAF&|P7f{KhkIMy;A#pkd!tkSbDGEE4M~Y z-8Xy{R>q$aNHi^HIFd3qxuNKE)o)>%Vks%YwEE8EWlWwz7ackoJ&&T;i1c9=BYnkU%89^8tHfRzd&-tZYfKv2#OE zWnFl89v$HJDRgZLyIVk=9U>>flwjp6C8=9&tcq&y0be~r@$28+8AQb^?kC~0GiWS7 zFALNqwju>&`er)S@=i7Yk=n{6)m^gV-f-SY>2A3}3CRB;MLZv#7(I=Q0~Mza#+rbm zj|Lq5k>yTSu@#Q?HZ9KfpWeZ0pf30lLbrIM=Hvg#r+OmUk_`+$kAzy#9k zRFyBCZ6(qE>-ra?Y(Ru*?Uo@IMjx!z_sIENL{CEfeZ);X)q%t7v85b>9v*G*y4@!^ zB@y2Wp<*i~=^0Y7&DTuc#OEJosnpR7DeDjet#%-g`|9Os2D{XfW3-cl(*>rt=x&8P zdzj+pKWZUzH@N77R;GGZX&k9;sSB$N1;0=!2GZIO(TA7v#1K{o*c9_zApP+W&+lUr z&P7r|zJD5MPy4gJM6{)&nPmAYGvNmknrkc3zH+h1Fj6T#*_F}lnITh{Vv?I1?OLV4 z6zu!scVrE5@w3Z53}f=~P*sjvr$XnH9d$*8ENSM=sgif@OKW04HUwFp^2r35lJLA2 z{1?yZ%Mn7E8my{?jFSjY)ibS5`gK}zj>uG z2Ds$lv@pp{3mIfs50+#h0dZq(NR6#v9U2#dvS*DUoArVOVBGl&Bs9gps z&^D$rfQQx#P93BZ-K5co&-0f*$X)uzwE_w6_=Y1^2OtK? z=`SRR@E~g*C*O!L)zWbhP%>(x+W<^+RvNwVAi{}&R--o>t=OD~cr!P00FC{&^&I!% zC7<$dgUQci{EAJ|Fq5WWKl3;7j~+~#s>Ij7fBYA@Jbf=TcI~z3u;F@$5ZD_Jw5!z1 zv?Q!OH;t`iF()|9f#{O{wv2R9$51=Ss6HMxJrF39Ot6j2PdOVA)3?%uJUgUG?{;Bt zrj+A(A}zU=YX4Ax7(enuZ|a; zWb&c?ev`QivxuRAS$^wpkjtcJ*ImV=Qi70zi34qe#8#wb5)jnk%__j7cRb5L=8vOY zf?T-XaFB=ZN8t4QE@ov$BLmg{SeYWv&vuhX=uJ2Vi9W~k7295wj)mwN$g#Ka5|#}MMO4OLXOGlVuGh^yoDZN zaD+k#(WKj>8oeA`mkl9j)ZD&7B5Zr4vuRs+tLn`vUh1N)7c>^5Q}6smr=C^@*jJnP zK@S8z^egAdkJfW(XLQ@qn?tcZ8qz_StZ0>ogS=n9_tM&tc>C)F**Rv**K9k;eley! zwmUy3A3LUT;bkAU=CY{{2}tvpWaJKj>T>^Jy{YDEv7)VdnOUPnO5FX`XyUfeY~k0) z0gzd^DR;cqVE^JW?kSQ@0<6r+1l-MkSHcf?OVDsJ^Vx&JjCZrPc9*TUZM1=|2l@n`zSJ>7{x3=r&}t8FC8#>XMy@cY9Kk>_Ab5b;&cid%x!D|Fsn25 zcW=j(#J%Pg+v^m36N=VPN?zO|@sU{StK-Jhk6f-gW-MQqyjd<+Al?;poOY`g1^#>t z`p*oS*yL$MHeWuLXa{ZZk}=VZPQ!635PGKO7n$nMa7{FvywB%``4P7Y17%St$t55P zFs*WNG?DOjEsrWDy!peliLr;1ADFQ47}^&!s>}@9vOsh8V@3+{x!Wf=?3Hu!1Oi6Q z!^6_}iR1%qa)`u!a8!jpUbEUyO|>E?^!_Kp_$O8wy-Uz07oJ1()Q6=da6XvEIRcN9 zo6n~*EM8w1P@5p#aTzqeMDkvI+;ha`*}^AEdZF+d+o1jo8Bv^gTaCet^^|$;D?BH< zlXk{+@;Qy)%o_#ryqOvxpMv6e#DOZETHs<&;PWjI1IYS*aF^khPxRutTUpllOp8gU z_92J_e3_(V)v5p9DQW1x;!D!%_N!tY*A(ZU=POlcIBTq<5wtILniZzsPKj}=kF$c2 z?BI#JcU7vY_mmsdjEVo^uG9RPaiBW9AVMhayodGqabLih#Ksd?KN;Yj`I;y*kx!)? zItf^X-x9-lh_RHQuz8{OTDsE*vOi-0jGqvad-}4)O{2&7G9s1%Uq#c@wt8O8r~5ijhAeC`4#=D)SbWG46> zZ=JdD7c~G}c3#P#dZb5Ag#+~LWfxN!NXu4zPIK`D_!un|o0^C;*8jTUzXKSdPu3t% z=Iy@1|L55J^NG_p$ygvnb*X} zRs`f7T6K9KwnwAc?_tA!B8JW+>NlP*t!&0`YRE)w zkHVK|p*SmwtN)`eJWBO-a)YREN{=J87ZiyI$S>?!(BB;hu0L3OaJ%#L`s906#QEU#I zd>SAd3c$wOONcI778p-O`e;%8Vd23e$nY=fC9v}5(Mva5=%R<1ARKKUP{uz$XaJ z@3RClL0+xmU%UH2&DM={ID1>d`U$;w_fpu5=P_HdB_u=<`7uGTvcxbFvcTVbdC-m= zUiBE62pGMI??}2KHj^F;**9b202!!LuIby&7ycWM1qZiM0n>t`2WMNXgPWFL4C)u4&V6Em9mbG`!JaV#c;0vTubP zXHJf|R{7xvE?+G`m9Z6ojHby}re@wDqzPRR0XV>|HSR__s>|h!oDu3lRg~c*cgL%8 zV;7ig)~NR%lds>hzq%2#94$jSrHeFtvFao}{9&YxLoFsOjfWc9a+=s`tI11)C8bO(Fk9?{_%8hDsn$a>U9STYnZaaacYA zIoS4~<9YO&x+sHze;9`Ve}@FRK5@{zSIq^zjNf&rcW+9dPF?mJz3h`LB)8qm)}{Kr zR5WOXw>X`Zm&zq4x;BKYume2WczAWp4xsAJ08&}VLIkp+O_Ljz&-G|&aEErT%qn!W zA!Eo8sxAfMW$qW}87!wp+15dyln%A!5#T&&CW_@{8maXFXy zp65aEREv~~rPBJ8{RUUqP-U(AR-`*Ai_W_mi+2r)4!Lo%HJn^!NcNYQ?i#>sKX!(H zQ{0>zIOJ266*veqBIyKdK&9nv$ci(3BWo+iXBdw)@%n&Bv+Kxh=kaPmbzKbY$$LSB zr{1t^@xiA4iz6leax?d>VL5JnL5)VVrI%cpE^keUyUB>OvKQnB2q(sLG$B^M_x?Ws zRqTQ^P%~e|`SRg@_&{4fqVcA#Gav$aU7_HWX*afA9xcXd@+Hz-228Mrpi8>y7cs5N zHV+qnq1%c!6H8SdT$RZJ1-hk<58UC3C3Z8N&UE#tt*8aS0bl&?TN1kP{k{&~2_#T8 z->UJ-nkpc)E65_>Q6Gce2U?<_0!u}aBfVisXE-eV#{O23B5vXLA#LlI#njv&-qbJ! zl=;v@P|TjYdF?1h0WZ2&N7w!>=-xB{=D?@#Zg4nHli;v!8e4*cmvnvhE+2(xXqz{k8bIT z4a*hW;fe+N$uMVz`pBgIrb`l>SD@PypVnNi|6NeUI%}Qm8Snt~Q2E_u34J<)8WGLF(NK zF{hj;9wH6XjRAqIn8T5vLm)0h9Ua2^*1TIp-4=VuTgB1Jp9N@loW_-O2VOI9zKqMB zuWg0O01aK6bqA$@JH4{lNT6JZ?M!VO)MP~ljNFiM$2=e?`(-ZEs2*&d)GKA zOll`05%i6D}hlp3346sh_Zw@dA&ROq%Oc0l8dC$fl{L0vJq z{yFlY0=mNBqH>Dt%)ZK;&HW6QM}kt#cKar6^&Te=6N;Wk@91kIusKgyzU>+7A|8!2 zq&B8T4IJMG5=XXnyc@EIFGUhVX=Re3xNQ@r9yX$hE?#B?`YQDP`HACGnO#_vg4x=o zhF`EZ%G|7OqIu;=wsAzQV7))W27-MsNLOL$z5fxEhlF}AW9u(4wR{=Q;N7L{A25Vs zbkqAL)mtkoHM?J#ty=>@E{BL$-I0<9H0}>f1Ed{^(eU8WZ*i;)MGb&zZS|4FVbo?4 zIoBpFtCj-n*I1H46V=v&70U|E!ayg96=|+6WU} z0mA$`yC(P?o{U>638vm&!C^45) z!-(!ZXU1UuSdI7IwMXpMe5;{lQ<*|(26O8tI(ZI@ZB^<)E}!r6KH<){_j|)GO4;)L zN)|Z~5ff>{9dFX~l*=HE%1MXJ8)ap(m~0Oc=o%$~B#Irv%?X7U%0NWtGTm!KziYw2 zplv&P|0W}+pm8oGk}VWMoo!waM&H4SLx_5TK9&meewy6MIZqU3?0d9I#bl$A4Lff= z1E49UhB93P3(!T-6#BV0`^^-jVP3s6zmMuSpyZ-hy`#uvyJ8cF4*b!}jKCh#3Ce!> zQskf6VNZhAV2(0A@v5HSUJ|h)s~QB>)c8B6f0@SLPnpJ}r%dDbb7H7v1PJz-L<8X% zqOz}g*9X1!osd|`7V3aW4O-d0!}F@n8w7c&^^g&PC+Ons}^K;sP4JL6KMnn*)s zFZFXRcMFs&*|Y%xY8gdii$pY3C>FW8 zxKjdi_bebVXWg0c)D?i;*YAkaS@s_%l;aMuNEqerCSl1xFeI_J7e}DBs@C;3p%C2A9xvsNJgF-o%#JTw>hk=%6OY!sF(Dp3CitV`!xZ%r zN||r`C)A|1+I=rCf#Is$!`^%4+M^5UMVv#<;fN`D&4AW!Jgt?~-OOSU?B4OfX!L~% zeT8R;_HaK}`O}1)M!bD-LO^@CR6oU#5+24E1HG7jTF#SyC)E4YQoh~oFTDR%H%V<#s8T3e?EbE142SB zn1X`c`wR0wvPZwX_PxgFUZdZYAo~_sXgkk=@#H$Y^bU9A9mnY{ds$I|#Ot>+H--O6 zt^9l=Btmf7-mM0e0*Y#c%x>?4&>OSj(Ud(zKce1KSo7!+D7*ys3hVwE)4Zj@9yNB` z>V~<1;-*0#2sY`g1B**PyH==>g!-p3KT3wC!W>rw>9=A_?6e;%a}Rp#zZ{wiuloy# z`(^eqiEjkZ0~V<{7!jl?s##sdix2FE-ak-}$v{`VM(q8_piupP*hpmzCpEdVNh_-* zctb`1(KrEx9@ld{5gcNffBUb=b*ijhxbPs}iWADq!nsCtW3u5gmhkN9_ah=68 zZUMU=X-pAvfae0U3V(=Teus2-u6l9Em=JjcC*Q!z)g07-s-3QtZ=z=)?G1ix&Hvec z5AJ*|*}YJC#HUpX7_sk{D^VYS;?gLk7PM9b%^+w1hxeXh-}qon2UV5bYWi?@G^Pb3 z2wk%bIw-=^pV*sh&Ysza=h9;8{2?XmZ*;~0t@n9D{fTxebJzkd>Bw$Bd+j}t$NQ}* zTi}r^MXl?JKrmU)Ga!Oi0#s)7<=6)S34BM_48)*(j$ul1#!n8w6%Lg6TQiHq%hHTRYb!)AC-rIv#ZA)K^2KK+Lc3Z+--)FNS>9>0R z?WjiY@^aR~v`Y>qs?K4mG7BqN`? z9M43kP{uJSztuzT-a5sna)S1x$=~e(l>eo(`iwj6qEEh?-wgu^|J17c`2(u) z*}YN1$wFa4>up+@(6`x<3=%$pi64|>-Hf_JQFcH!TFm}tIsqdw(%J@z$+s!Bm>5Q< z=3{E0E8;5;U@6~5qw9$>b~gsh@6~vS94qfEa#+8@l`0(yDDnG_QVn z80}TPIfKqi zF(o<`I~WwgsGFwVZQJEq2NRY|U;FGIy`#5~K)EVVI&BVLFU?-Y0`e5-P7yKd#Q zzbi{r*SL-U@v0lk=QUB=bqHVYU17(8x`WSa72=O-aE8uJEpWou2;kOuJI+Jy>}C_9 z+s;E9*;;k}+qZc7C)`t9%8IwiQqvpN$amJKHE%Iopz=I(c8u|p|K`e#41R0^p)**2 zzfg6aWsI4=+ZJ{$Z+N(iw5@$^L!n%0<8oeZG^c$3Fil4t^oG;`ZiU8~30_m@As4(* z$YEu`3cOgvAc%4eyKli4H)>ddL_rvY#n86C6M~j*5jTN^QFqm~%CT0VvfrT~CyuJN`>)~64M?I(5YnBIr&@=fEs65p*R@)z zR}s%rAQNM4L`3>)b0TO1)B%h2tA!CP9$p^S-L!}P(UzQSj|DP!Q;PLw&pJCl?b#B5 zu9ba`33U2U0rUN!o8PJaQF^;6os_1&%z)jwyoFjtyU>0qig4L&S3AJ`P#}R-rA~u= zV%Z51AhBbkSmCjtVPFt7#=hXHgBrmmr5RcHp1~-kKYLygG2kKBk;}6~4Tk>091GT2 zM5WoMMW(Z-bMf?{G!Rwxx{>SzGM2Cq|A<)Jx3*7}By^1Gp4%*@`urNuG_gG&zN={WlWlt}#`)hxo$1GAWKPsyo%WkGe z5Tk4VtlHD{`*oM-ZN3tdFrw+*jiS|*7QT`UcKbK!Py238$CjH#6jZDh-mJaJ)c!?m z=$$^RmU8YQ`?P~xq5z|=ds$bxWz`3pH(Mr?Puj{kGt%1%>Jvf>%FQc2Ir=^qWsOrk zNWaBmW;qsPFkvYd&!}jS?i3Wy<=j8ajxS*#YUm58WAA$TO_?FGgoBrxbp`Kw%_F-V z2bXPz$ZHkFZS%aZhHT9Z4u8gz+xFIOHbK`mOP+|>E(|c)B#2uw|Pg+){Kk~BX zA+^pwVh%7@6Q@{rO8ls6W+XJWd-Fm%6MW&zQF8ODF1&^JV@`cXe?`H#=lYh*eCJJ9 zor3D}w~J9SbxkMS+x*Qum?b5&Mo9Gpl(*j{+`+6j%zi(8QNMQ2P5-m4P6lg74tpKE zyH6;oJJn($*%v1Or5~)$7~{kD#QLs`->uXFg%AFY%|)*HxGiOKwJR*#c5|842e}A@ z?6fVs*cI+RA?^6`yM@&xe?FGciBP7ibW}ytGt5}tel{ai|_8CEq_6boNh;% zX#P&Zdj4L$)9_T!>EfVryhw1bM|)P(lJFNB2c)ogH9Q8{L);&G^dj9w2Rw|7Pa18@ zFYo%Wa*u5KA@K<9%lG62PwtEyZqQq@#+=uXLR?BqYaM!Ru5D|!KDHaCbFQnhy2 z?QEQB*%!SP)4^x`eZa=HjDA{pf2JeP7~V0Y>a25biT`U!GV3yXeRUmGaWPTNh{8d- z5#+l6LVefzp{ZA`(57?Cy*SZx)8pmy_#^d{4(miR{F`5LEIXbqKud(29Rk$vrBmji zmBeb|U+B5+wKDgSI8HCkH8^e|&MQW_XQlMK=26|?IYJ-eAzVv7S@v$eZJgwd>>2yKNxqI)zIF8wT*?y7bE?(m=C)r&H z_eep+CrqxUK)OmvJarNT>j!I!vT+_yeX`qXMjb+{lUA#&$c_`l8*y!%4^wcAR2G4;H& zIq28epKsrLeZ;Xpa8X)IX15RVxjb}d>MD!Pp*pZq+NJGinpV#1F`4HPwfNkNdm&L+lp0ThFFnZ;uRbW1XK^v4)o) z>@L%!-0cp=g4RB(W^b)sE9v53)ik7YG=>lFg0rn)wn3(n#Edb=!sm8uZ!nd3I>*Ow zCfHBCUg;%qG_kP3KMU}Lm~7l$fph{lJi8_XL0*1&j$-A#{&0nmJuYd-Q<($&ql~Vz zBMY*&5uCZ2iUwRzxgqF7HbXQ~{0tagyJ7du^OSApg02=q%{J$JuN`eZl7d^1uizw> znJAT+$J;0NM57AoU-m}tt+AS(j}H>sU82CV&+7ShzGGx`YyVI+$akJGk;l|)Wx|7M zFq?}KW7w(AUwV+jcmB#H?MJ_j@T2R!+vNO20&z)7jppnUhKao$&0BI)(LavIcd@< zBloJ;^7d*}HHCjx-JFv5(Y}7;_j&>2sAaQ5U+RPk6h-%_`+92I#dN0HB;YQK zt;Qec6zqa(wMlQzj%fEl5dXb%F0^X#JSqkFOM1w2x)kQRfs6JSPkpdCx8X05bin62 z$=8!o4X3vf(Bj=i_b;Hl9mRd;heigugs-(owjm2jJOo{2o*Aa|;+#&;?j;d!xaa0U z!X&TzHrcPPnCT&wOl`8LBFifcwxEh*&H|?*Q{mb{8&AuLx&aAJg{GG?8lOW_T3%!j z*%hdjhjTu5yKRoWJh(vw5w*29%?`OmA5~FGdi+qT0-9((P5=6m&h4QbmD1=&uVq`? z(Dl(WaY-#*B@+?VP2BZ!@rgt`#@Vr`L=U=s7U_8A0*$s*)_DSaZ+2Cf;P)oal{mFiB+7 zMSo}zPZRPwl)ZA`mTc_2jTcv-+H;Z1!hHyP`o0eDclVuB*ZLy%jMt`FO8V{Jj3^bC z7v9D2^CM>sZ+i-5o{iZTSIoQbZdsZZ)rUkiC7?9Nk`zWy(W0PloGaV~`W#D`xZZ1n|y zx1GuCg^SK=q& zjciu-E=tG=!s-;c1AkssspKi-%tX#r74YlVT%aOw_ZrBM>j>0#MSS`!Jl)AE`|5fOy{{FRPjrjzN_1n$|&_<=Ra@@evbcqu9#3vUrew7F-u{hgN6 z?{QZJPhQUejretDe!J&6JMal^*sDd#-)CQ_{K9?hN*x{nbWIuR+dKRIbUjP-vt0qp z3GqORu-m?RY3@i_g(?Rrrw>(-9?Gp@F2z#^^0sazGL1^$)K(0$9ctlAJR z$1<}@gC6kaPaBo#Lez;LvN|Nb@ngV5!iA>aR%u$?_|*zvu(~w1?D4KD_g=>{UYEnh zix4?9RMwMs%GJRq!P~6%(OBpWp+siKqWikF@^#w0s`-1uSiHlPy9Ch>VEK7)cVt(w z`#@Ca<~K?8I)fDHTkJ}k2;PJGZ_#BrP{O0cZWv?1Uc~GC;L$hs`l}hS`YP=T(cjm! z&~9zj!`&4Vju>;=XB+b)NN?+OrW}Xw;L|Boi7@l_>Pld0U0TxklZzSQ*|tK}GHB3g5q z;+2EvMQr9)IbACbh88CWDRTE8>l8TP^NJUoxF5My=19QsG@u%FJi^**Vg{>B+GW!( z=Pr6!P#;v>4;h>F;eCj9PWIYAIqDfHhAmL!JReIY3Iy=NBL6ovChJE zODD~ns|QV|sL(I7sA-wXy>|cl5z}7~$p+TwF}d^Ft>34DipJ}hpVt@na~W~%d{BS! z(rWn{ZhMP#wEhIFO5nw3v#EPl&h9t&Uc6i#QJ?-0-j3*Kq|8=dKBh2kv zX-M)zmrFmF^V_(iSg6vkn+jM4rfea*DAqgGoH~O7y?bM4`y$%)N7ZwU2qy$wR$ehy zn8}nNCKL@j!lUV?ZRO(ljFG&%uOiRaxJ6%!?AKo@KpmgAPv1vzaz@o( zaaB~wouawk5m7vbh}mqan6!5FPtAW%+r!rAIwX5*a)B8y*i`a5<7%Q)cjTH6?jTA(8G3ca*h6q-8ZsL?9Yvx8)5PWV0Jh#< zE<%0wjYRBxfPTlYx$O5N){d-c08poAbALDuf~>Qh_kspP7V3VBov^T3u5(2sBrFwm zUKz|&p1Q)QR!rYON0bhcLh;V%yD8YbIr8Fgn-~%*kKEZUFRYoZs&id;kFMC$(?&)9 z1oNQ@YtiI7*?acM&i!R8f>yn*3He$cQ)Qu?>-sG75m@E*0KANqah8TZxJm!w+>cEu zCE_WBrez79#QohmetL~ZTv=79Tx_*Ok3rqQsc|hz0$luJ;fm7|zVi~w7yQX2c4(>$ z?q{R_fgx4upwrOeyh(+7r;JKsx_or))2z#s{7o0%3YtM@2G4Dg6a?#DAul3vT$}I^ zq5$ziWUdy3jxs;I8}??jY`3(gA@Z2AVmS9MKTngUHb3s=Ex}HXA2&q^`2^1Nv1qM) z_PYo4>cnPyEz$GJVRQf0?i>KFY0k4Q(_@ns%S0!pTXP$!B6RY(nQkl|p?rIdLVZsw zHQ6lpMm_i-E_@}|GNEeur82b9@K_89oIzK{P;+9RNP* zZ~CJ{*$hJ}d_RujZuWaplpkph-)Ni7=W_MgM&1oG?2h8bi&D4J?)eeKP=QI7H;lWM z#n}V<-79g+Q`yHszLSzy+=e(n@9dWXzma^R&7`w39=tx%B~hn0LP2K@lg}d5Zo6eB zsH^WaJ_MU6Uk{JrR4LM$(`doqJCFxWdp@QRDJi;ZtPzPpXgEwgP)zg!urbm?(t_Zg z4ln0+r~n2@MU?{6CFSB&$^GldwFY3|#cXDuAvTi`n17tF)^uQ`2`I2^!hKpoH2yFq z|Ndx`1-?#;$I9*xOZYDqq2j|Jo7u;V|0fptzo5n6*_6}!(3!tUA#U>U-|xk2SB64Y zJtt%e2R1=#$XO6d4;L&l8QQ!!S;Sy80y@mj3J;kV_+w}Nd-rEA5dbCo7ujEj;g$ua@kd}g2%z?;n_x|rq5L~!NVBbuK z6;w#{yFvPzd?7W^uh=1FmP0Fi$CwxkyI4KRY1Pakc>eV2L!9^WYtS!0x5R&MKu83n zWr8xl%^Uom18@lN<$+(}ADHf!ftLr9M{V-4QvLrLA}kNDnq%HkvELuAwGuNOSiDhV zeuCWahSxzYUJJK<1g>g#V;?$posPHH3K7Vi!G=p;{pJd=X$j&ZlGHcG9}cbZ`)<_| zW2t_>*g7-i8x(ctt7N7C7Q-_L#s&yETsovAu_*GjsG3?j1O7>f%8KMadiwJJ0o?GO A(*OVf diff --git a/documentation/en/.gitbook/assets/data-types.png b/documentation/en/.gitbook/assets/data-types.png deleted file mode 100644 index c9cbcd16b527212c6b6142232fe27b5ab3112abb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101545 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'n?YE7m6lIhLi(PbD&Z1jO^r8L&mR&bz&hKZ2i zhYe~_(o`X4%!R+{{N9Uku#wzOM*^}{KFo*@^5*B*b$a$2NYu@Q8jS~W`!n0ttOS48RL{SiFFBJ@HS>cx;z z!;|;T&8f?O>U3^2t~v3~MJIYVUExQ8`%e{W&`bkCI`+{)0spYOZRKm>kK0Iq0XE3+ z3p;AzMmp$>01q_7R`E9?#J>GAKCszAGBo}?^^${Uw>9W9MZ*aJYi@yonr|%t{n>51;l_r(aquiXx;irDI z!=EP}oD4^*o?%n7o6YH2T9u*PfJ#pVEbT6=cET8@3yx5`!;Plpj+=?L^f*9N5q|nt zNOuKa4!QQ#XZ6So8RQ7AO*>N3A9k&;`1Yy`4AFl^TxBmtJI2tI- z7kCA92S^P;Xb!If7_a$ModlC2AK!Om$eCI*p%4f&hxb2wkG;X{uiuAUx0dG%QlTiV zVH5)5w(3H$Y1{*&1`%HD;_SFh;UB*GB@$h7Tz$M+IZVx7;lfx))Se!574-%0qKu?r>KIK14qn^4T_Izk5BU_5B-`ZzliVJCf)k0J1JTMJ6F0bgXv320?wM?5y_X zAU8Uyn<@QGg8=;bS?t${neBwnC&MFzCo8$Tb|B@9*r|q;sxl63E@%vxfqFn`sv=|~ z+-JiPB|4`!6ztM8vdig4jaF*qDL?`h<>ox&yTP{omRW1X%KXHp;}h(bt;+tz2PUin z_bb}zBPoy|M8^Qq<312;%$GUY;vw~p^V6q$Krj(h7GBvW4IZfPzYGmkF!%h)AJq|> zE>&H{SD9gqc;nGJtgrr*@n`#09FQ__h1;o2JITFjGC+s*vY8TBju;@@`&b|Ig2-X! z2xp6pZ($X)KU^dz`#t+}Ke5UbAa)Wwm3j4q&L3D2KPWa88Ta;*s_H+rXHO^Ia<*&g z|6um_T~X{vnCb1NG1Jyl=Abx`iz=7*16|B)qBPB%uS5SV{}mzf(h3b>B|I$4%jgt5Tx!drYhGX$OA`hvf%A>PH+85;C4!_i$?Fe>b=^7^t!)^sBa%Q@~L)j`m z>fjJj4Zag~ z#KjV9cg<>|So{g@917ne&rZl)%f3b=On=x5+_o-h>I=pe^>RsQ+ssFyC~J}v)7b49 zKzjWd^SSeb)Sfkse~m3ZBiP#B;nlpeeor7;!WautWgH(LCJ|bb_rmLiS^Up%B%%n` zhVkqyrF(GkDtsB(&uTJ*vsqUqduX;tk}_GfOI>X*oGtrGWk5lFL{q#R6O4CEi~!ERjqWx&vK2h?~6p-!&XNJGJv9aZT|Rf zfDco4qYU0gK#wdY;n65U!E8id8?*|US>{m@{gn)Bz_vyF+a*lu6_;xr`Gd>yaaax% zMG2^58jWDx+J)E_VI<3|MNw63PFdjtV$j<9$P{zElzBJz3OvZKU8~7JZ#=O@&@&Y? zFzaVnWFXDJJw1*GKU4QA>=0sybH>kahPE#Px_7{*=>Ylsm#Lo} zs3$G0puqj~tt9yPWoNC9wLGK3^AHPDE9ioS(T5~1rDHq@qu1p+-=`(Ht#yH*vwHne zN(VG5ppumgOM_WN&RM^pZmJTs=h}|3U+NKuNkorVK&w$V4G^qkhsuYHNO|mTrlY{k z1SmZYl1;LM2H?T zV0~W4#W)OcTs#R26iLcSXk$xt&CD0cyoAruy|+YkzA9ps|BlI)m0d*cLL4(2h#o0m zd4y9I%mP3j3`U*9XL-tZct=gQ(AZhOy(27((g1+)$9>qy^)V-M;ajk6KE@7My9J4y zi*qwox!pdU^CC<$)Jh4TRA}p4@hvvybzAB^%jgo6Y98d-YE)WAyZU%MZ}(O!l5dKWt_pjhuSB5zT`KYQl&2z|ohmcV3JaJxhW@iRjAgC&ej; z=S)ba!nGA+j`N#Nx1P(z4=!yJUcVf!RD#jwtdsP>hSY3^Nk>VVoeZLqnR`ecqG53C zx=vh~?=m;`7;tQAkC#T?e?pJZ4+A1N3Bqq^uBrM(tUh7*i%}tAAo$f3<%-*(1QhpP zTUNZsLKjFv1v6~)1m|u+R%52v5=MQ4dN-}SaZ%#5{=D$*^Jn~ICX`8C00s?L{j~Kl zH4!mYETQfWmQd_<=p&N2Ew_YK$P{HpU*Dn5tJ02h^2p{SB{xx^@GCI(bK={4foWVl zLW+_;R_67qyJJAyURU66o4rzX7W6X142x9|O{z00$}Rfam8^n?%v;0*;3lZH9)p&= z4kJ9!8tO73MM%HNS8ODx;wRUehV|KYpH#qLt{@_+i~e0;J>xVi1VwYj5Gv! z5k_X%107vUX1+{>($t$U6(}0K5(kzkh^PQ)@>nS!EJNr6h0lv=;R}i$YDSWhY8zY# zCT)Rv^;Rbu)*Ooxdf=D1Qrsj)*l@b^fY*`DsE*o%Sm12PKSlpgwq2B!9$gtc9pA2? zfvouG`3inPUtjA)Ew0yeE>vpveimUKYNMYi|0Ld?=SS;nmnSUyBa0a-z_3)_^-_R$;q5P33yJ+5MW&L)g?U^fm0l35XK-m(cLa&|CtYL z#?L;*pvL;gDt*Bp7{jxHn>@2GZC zgI|GEouLvwYR#0<{GIEF0!0#JAHGYJBBwS|CPxqGY7bKMk!M%5GT3I71|12|XgX#P7SM2yKG3_&B z3N0RWXEb_2D6ou~S&w8p-qVXi?vt6rme7n!Sex)bt7Ojn!J=u7?=#|Fo z9nUr6^Y>)K{2?hIet|`<*}KJU3DFPpX?bsJvg$MZ&MtM#u2x!1i=K#uf@g-JSMUR7 zo`{nG*&xpiLMyF18uG&C2;%D2ubN&Ft4q)Y|4EW}W@5NB_T%H$AM#jBx)2j;+yFcE zKR7$-^fL0W&)*~vpeYz-G#mnIpsetJ|Bk{+Wkm&XK=(|P{;s2)`yn6?i=7}LP#1&Q zork3IWzLAM=NOu?m3Up6M`DtNXUCFc!+x38;1?_+4_DJ^fO%vqqz)wUfgXHd>_1^# zp=g}$#sF*Nnr!KuBM%Nz6gt-8JO)I%caJ7Y#W7@3%Eu+%mzkdlvuXRExw>4&#KcH9 zA04NMJq@1=KL{2pDs$Z+yj){0U_sAH_~qZUY#6WMdh8!##5$v2VKD1?hohr8CiP)2S`%I8NQjO5j&7W5W7-w^6l`9 z`Ctk3z{iq~)r%)u6dG21=bXwBQ!`&643WV~O-9A{B=uK1DZ~tV8=9XNFM+;~HVC7= zx-L2%8`FiNR(+Ca?BX9tZvVfz0DPKw)~bBby&;sdWFUsZ8x&&VcTq}tv>mwtL=lJI z#1GyXpF4rSRx!WyQWEyU{3JAlHZldv)vPr!ZyBjo;%otXrOp)!N1}gqR$Il_a$!8D zT{1oqg++Mse$|b-N*YV-5G7we9Q)dBG8~uU37PZ@>V|DigZXQC;n|U=G#nr)Wkm?u zI`!;$z7vjR#3{pKGwpwMnL+)Wf#lPlpYSpjq=;gfk6~svIN-nR?Gb@7BHUlty>RM9 zM)dAylzancM!5NXgO}Q9OwnDk24nat)FQX8Rs6M{pxOYYRN~FMe=9pJjZHS~yPDGu z7UGOXzOA&qJN|qv!K}xbxF7QCS_{p&WUscH@T=(5bjv^|nQUUIb1SLB@%U|x^vg(= z=MCY81u>kVg{`IP0_S3LR+P1~zL0i%l2;uRq~iR@`)g7sBGucO6h08pJ(XS z#H%KN9r;Msi8`pDdi8FdD1keXH_RD5b{BuCk3r`r0)KT)B}JwEiE<6M)wD=|apni~ zRbpr$U$R+yvD2G=KCK_C@BNM%wVqr7uh1<9;w`t;x*6A;-DB#Ez5Uj+(40FuobNeo zp7_7^3gu(=+#9m#=8qQ9Nv3g`Er~dW(7@kckk0+6uY9?!l_{qh`84oAKNYLJYo2sQ zYw-n*;djlTyW!@t&-WnWW-Xi(3(bL^$=9^=(PD{c{ z!+L&Xd)eK=8WinT45SQ#?Kf}l>x2VpBiRbMG#P428b|HqQ^LvkeZnt7{7rks)Y>L# zBDYldeJez&Uuf=#hC>`&1J}Xaj{se1-6xKrvo<=O`rY|I$>?A9A1Ki{I^pFR@9s$D8nP;=1 zNO5~$EJTA*=I-#-6uY&04!AQH^l|gItod3V?-NN^zTe+1cRxSJHg$GBE2bPv zXvIczPlYQ+2&mIo5U;%R(wKT_#4BB;R6pUSv`H}u`+K??tC9M%oCBiA8dY zP)-X}D;elt;9V|`xdA&c(FQ$5FaF80ZyCJn9SX zq*>}&FP+^?h#N^A#mt(*eH}!18BumTt*ZxzISuGmM10N zMf^Kl;0WwgB1p%n3{V2sef7chhy$3yN^D{6FLgR;kK#}t$45rn~G zCL8D(d~K7EuJ4i8R_novMnsXQ`K5a z8V-eq>W% zIDov~f;q}So($kc$sDF&#-O{&XRaZYMf@8Z57JRFYPpj-X9q?+lm-)ukzta`ueVtSsM==<1x`u_dUL%s<--eKq*NX z8W*FmtfVw?5Z=!XpV=HHNd~!bTal|dIS85MRR&0$9|Z+ZPP* zjN@g1aJr{=J`|BT3P&_FC~wUbAxcW5P7%yENX?yTom*;?wOv9t8lyX)m^{eZQw~fu z=wPwI!_^w~S6c0(BTuwe>3oiEQ(Ui4^t>4fZM`q+@c1O8Pd3!wh4R~p&ETQsui(JdQGLE1OEK zi%)Iat>mo@6%ZzEE02x=WlTbrwO@`aPl=FK;kiq=kBMTgWroNX|#WB)6CVL_Nwc$|S$&?>-KNaA-Q z#f*S|DuzI`*r>Wx{KwDTs!RoWjt9E&wUDBRMGMZ*Q>F3ReQ|1!rdWPYM<@3hrRVxzaZr>-|T<16c)S$0;yo_%Md! zH;L0JPYjzccJ@5s2%HTlwlXm}KNJaRf^dfkF^4l0OMgTg*cWn;FbZB{J;Jf)j1*T{ zfzhCWWLg!*s`Np3e=U)etT?|GjQYM1fRyoluI!ce-DggXS-&kgKr(rcaTESTzNB$y zI4)W1K=tp)S4XGUsPW`LDa!T2%A@vVjPR&&$T8vHYkDy!Jm`GtckI@|e$-gs=xZpY z^d<0IjiB@BT0YMb+;Ba}M1E8bAp^V+-oE&?uuzpaNnYCV?62h>awd-=C876=cm1ipyqC%h=(wS$UuRh#Jhd}$jJA5AR!@jW17Q+b zgEzjO2}4;gwiy~~g^xD~TjLNJVS}V+dpU@DxIRj&OHYE$79{Qy@IjA=0V}_KQG;Uo zSa2C-xE>wIJf73{-GNqqkRpeZYBsZXp(ktn(10){NwU%%xEb;v4@L(S{}0v2&HV$` zYM`Bp7zP9Pw_UcBm^^2FHjvU3(L)lP&uU}SDq@;aoK%1bvOXX|AtC8#LM@s7zOM!k zfT|eKWkA&c7~QoS66_1+@Z(^PD_rB({d)l}xz98Rmtk%PM$PLMI75kL_F{0%VMH`F zkwL#lWsrY(DJ}&@$A~5pY+@ec@4nbYIIAR$X!~twsti@6kP?VP`=TG3LHGAyoZq(_ z_Q!Wm;K!u|hk|xd`&ItJnQ|sZWhWZb2-XY3?$BQ0@pHIPz?c<9yiAhP@8^&yu#^0= zY(|-!UJm+H@eP_6oBe~P^SZY%HL{4qw*VHnsu>6 zrMA$HmiU5&h&As*;D^~|W^a?UuiGIZM9Q9hnmz|}Hz)~}#MXi5|eLHULDYJtq#25C^z&0mINe;)HOHEeTWL7hFgG7PX z&=}$9D`Dz&S+-(4pHl;BmP(E_LVp3T$q3# z9I-Qu>v;L(3vtDZ-7F}uj$(Ro8Y&9v>b6ea?p=}Igbc7BgCbs%awhfmaO?hBb6?p* zf4~;t01M^J42-mQpS|lP#@tg4WWm}Qa&%@W5)EA!SD&c(+jms9cR>0VT%oZg5h#qe71aewPDufF2oM;xQBD}<$UYr~xu&UTX zw|nHl#AMl{*kO`{)5YcF6d?8r$ewu;#Mb2K1n3(jMUR1m5_cfH;s3k9tEHCi{h$7E zMhnvlDL{TDpY!O{n<(d&sk$b1^#rU2LHSACBi(p1HmI9wwgis6yye$##l1ziM$>4< zp%($BwAt?Sa#GP$tkIVAoT0(~A`Oc){u4tSAEk!EDc|5XzoJU5dcF5b-ITvI0ZYSS zh&Ly{4OL{Otvyo>`UkbKcIWSxA2|(G$=6!D>&0}RJsFnmyx&p6Z-{PPx;pBs#ub83 zsSXuTp$j!~j6vlI)Ou?#l<>!LH)_$JBU3Mk2|)Q@oBuzi-ZCtz?u{Fr8HN%R2Bf7+ zI;A_MMOwO5x};%7Q0Y>nTj}m*B&8dqOIo^NfU|l2?|aVqGS{USANJaN-SLZit;$qs z98zU6=?tu8JkY*9E0;sv`=9*wt}dZ+nN>LAg+N%&IUN%S8-)E1qd8;*l$AXLknq0(O9Y zdUj#{>YR^K)sGM9fc=-$OU7I*K~)3s(*O7$V<63{A^4gpG9|jSpg{PKsaLOeT#%H$ zSaW%~BpHl?T4GxlL|Yba{Hpv<(;{QrS0-D-*&p5V%T@il;y8yFWGFO?WN3Q}4XWYY zyMo`zEI^uJf&z*#HfK&1!(oLbG5JdGU<=uRXWgZrqRo%I@Z>5r0i87bHaP%cjR-rg<&|ZGj#Y^9YuY>t!0&Z=`q1{F-}~qpF;0MX}(dPG!~UAZ9!YG`aOlF zdAYUR>6ddw>UOzW1~VjcE-j4n?68Fd|4{_I;FFvVo7!A-YwEH!9!svt|J!6HU<9ar z<*lD9m?9s#m6!z)kM+coe~oY{DcRR73;$L`cU$#!nkdS%_Sg|Jb5df-M-CXTe< zGg3Unk@I-v>umwI5UL-o?4ohNkrsA}-UZJ!o*N4O7nq{}ew>#>wghaf4alvc<#**4 zuB`j4l5hgl$f{H(8wAfRLrq7qo0fC^%S%Ycv7wk54tt`eYh$Tfxs~qySI-J(yV$B{ z5$MwR7OwKOv*BD{WTroAJ_Qa9)%DF5H0WuY>EW85ZfaHLN7_D3;~VWPnZs?sO{nW; zJn>{8{|k;`t{h15s}~=*UbNJ`2ERIrN#j+Av=u&DHt6)>`RYmsZ$tBH2D;#$FYIxy zD=zdSpU|m*P3V#~SRYSnfyM~P_Z>T~ZcZaf2YhT{U1ht4F%0wDC1+=ts|l?Z&hLEp=Y~R%IAs4x3_G;=Jg)7dzLoERn?bdg$G=4M)bCyk@%KbU#eRxMG8mkY z{JGhG_G3%{MynIoomn^oU{1S(gciZ29Ic4g-w^hbALgx3n)OZB2xv_!A9F)oVt@Rr z42uK}y-LirlVc`yUwM6Rq;)k8SJAb=n1v}&r^pughk#h$n zb8-{?!S7TP=|htumze=O{QGwRV^k8<49%|kC1#Y5lvvtoA56J8tr7_eXnYfH9l)&z zch90eZF=GUw0b60(T)jg_hv=LZifkBRH^q=eVNRwad9u1O z`}!rH^ESTo*Hd>X|710V#eY>YF1kiS)9p%MmIDh&jP575=?<$lg0d``ic zqt^yT|Pz>GjOS^gkc?3=3 zdTVbqN7CS0EJtGkZO0Z1`HT=Y{mq-CDm-cC5H9DyVhTYRr)-ds79D13rdWy5K`F=m#wk5M-F;)RK~cx07Gsw3zF{NSju z$Wguf+3Q?6DLQ;98WTtx2@;En?|tz0od3A{*fd|gkK&b)fr>$TapJ=R+x)g7zWzgN zN3jABW}s|WrexX10J0EHTeA;Yh2&)JfF^J%2=F@n{1}VGWd3AtX^}R5QiMcL`T0rB zsVZyeAJEC;UMb{`b1B4`EU}cg@Ap}(SWl5<52=?u(7G^pvG%{&a<6Rv31vke*$~l? zBl4Jxce9M2HoR|6;$x0+^udd88PQx_py>}e`<&!wOgBOTU8Olxov|)*how(zn-r?n zU(amY^G*i6wHzN4_V(9Qh!W?2c=~hy1kTfkq^W6HF`x(UNxD*g{Y?vrGSm!glG4ct zF)jR`w}vX5@mp~zlUWxpDaxSs^XC`-UsHW@7!evR;*_{-egDBubkb=A&HEy}i^ie| zugg1oN^G$}!jdP%d2VvLY#Xsr2bd*$v^8xQYh)jfRgDM9%^5Ykc1i2XRMm5f0@~vf zAdC=Md_*EP%3P0~IzBzVf+AR4O+`gf1Jzr|(l|u7zaEr(JeEoug3$Jc!?s>7HxOm= z6CRPxeII)K-IdG?9dqS$1!`jRFWMpKJ;!%%Tru?JJO;5)xMa}QCh*KR7GD{BRiFf4 zq(YE;r`StZ#BJfGqjD0xS%%0qqN2ve=hCpVu! zgGY^Q@}=Jb>|n%R0OX@;D+>Sf;o}`Wh;Ak=AD8I82d)n>(>-74fB-diu(|*AfC-!# z;*Q)c<&SgjV}iwCG2lHct)9A#f3*0r77QF|d^MlL#O`&c&tyFDdU00U#K-7ZJ3dZ} z2;mGFj?kt10e=3DmCNJjPV!A7CxCqwN4}=`3McA;F419o)*C$`S3@7WyO(;nbfUgt zojwNm??4jRt@=ws6S_~4k*k$TwOCLYukEnc7E9Gi0lL2l$84d;k5ue`9AaQ_Fpg3D zI@N=x1FH)BW4pqG_4~o}7?C0)>;9>jVp?y?lWr&~4kz@AE=GD@G1$a*BVOjuQ*z1RZ<@ujYH;bv_3g4EdG#35-etsIxN>O7f+BT>}eTk=N7pA{lJ;i zI_vyRo$L*rxMv^0E=566kH@!VAtnr;(hH1DuN(un-lu!@5!2S1%cA=74w-`F~eL;`15fqY{Ca z((+f2MY}xpTdLjb6DTVBImr*Sdq{bEZlNB7ojQvi-3Y~lE~pY1dCoHyPiaOAK(a8oaZLbh15+hCO{e z!e#mDN7g?b_;;U$_}ld07h8?@Z$=zU89=FMW>U%rjQ3W*$r@#szu-O2u%RR8Fkw#X z-s&80=gdgmTYHPE-{x|a?LTJ83hrUCfl%9AxxI)__`du>w^GvdC%9NJewe6J1z@OD zvE&#k2(bx>l$L>Vy^Y^B;vLlG8d|Q+eFzVI`*Wx{9WnW-FgfN;6Hh)}lQMJ`AHW4c zThXZlT zhU~AQW_vG}MTc4EQPQZkv&qu4-mwC~25^#N+k zvz&e34+ipl@CcYe2cIA?U@xD|0SiG#VBz@X*Jni_4#0BTGSvOpyMLxrzPe>8oQ6GT zv>mI);9V(qfP%+~0%h&Wqn{(`kt8oRdbjqkf9vHXZ%nfc1$_sY( zf=tW{mSd!8tUd`oeWJe-jk#r0)^wb1#nJxWQ&+(%N-%EPfO6=SN7%?jKha@F%|5GU zi3ReFes+toYW*kDXpmRO?g#AYfEj`iBucUSSzd*tm{GQx2wx+^SSM-6M|VYjj3|1V z(W|~ibjyUJ548X2a?5{YH<~*ze~KC>>v~s`OOa9Uk}#@Q+e(YihsY>5TlZG2CP%iV z^r;M!jN5V*Ut&a5Y-9R;@vmJCbGpfmd*+`{JEB7-{0?z&_4EP!HT@6}yb!Y?zVFce z!E>J*{}u;KO`N~;?SBnJEA4WHJ`}r!<0DeiB)?E{|3Aki0ELf@j(+MATu#idf{k_3 zTP}s^9+f4u8V6Yf&b8Rs@jm6l;yDTcrDTqm;qsQ{Kp(LNos^7aiB*oa*dY6r-%zTr zu$r20b-6z#G*yMa1n!tJ-1FfkyJV2H`LQnS8db_Mx?tC?$`fNrjuzaI%xsAm?YF02 zHva0oHsc9$q+c9u{59O>G(Z~Ic<;l#05Zc(+}Ce?8{O<28Q|2oN5+SsZYy7gHpd2Nhb-?dGgj936_Q?wU&*|W!xlHD7SIq;!waHR=wJD4*hp8~ zE5j9xyT4+xulVF0C)-qc_Y>Yb=?PX66rqUlqMF0tT^KHS)y#vy-uQto!6Ve8zTD3m z@sMn0O-w{YrIz&^F}CE4c{J{hD^w)aBi_I6%lZfh@YI1jDWdE>D;MPswR#2G$QRh+ z{5(OV_hVQ~tW!m*>DAu66)tx) zdU}O|P}pxSSCd~6>nnwPC-c|Ih43@sUmU~xsU`SSR?E+2`A3}|nC!IWcdNt+dfG-Z z_ExFXvj1y$N}^V+LD*bb0lgA|T|xAcYKb^P6f4RLg6+iI@@gNHRyc~?v~N8=d6v|F z2xR_93Gl|IHl4icr;*L5E!bzr`6FLadZUYuwRKTXYtGQAFzVgeC-HYYgqPSjddA%Y zMM#w2cx6L-q=NpkJnnWu@!>mBs+60%EJ(VMtp)zpXXMhTwh8NkeIo+k@Ggf<9Mp%{ znFy%o?Hmf<`~&trQ6vl#9?MwR$Q980KP^g3Sh!016c5w{CMEO#^{@7Y0C5-B3lGK5 z%(qnqh0UF+3nf$|@dkTCj5O}gd6IDnGX7ISsUIDFF!|M3*#QVok@9$TGt;G*GYn!8Y z_tOr~T|P<+_z5Q30(G~}I26c=T)uZV&|3p|h8=6hO%M%&#Az17J(v7_uw*Yq+4VH* z^MBvH{(oRvGa<$B>42E2aeg767;*n5D9WPB`}Km4X1qPFJf|*-%g184Imk7aG>; z4#1J%Q3rFL+ooUDq-M-mT{d60FLl+5o~9FS=#J~J$WR|sdF|NV_?&-?p;+L6{P&^R za1-b-(ib&NL^NIw0Z7DDr1Nq8z%x!f!-0pO=d)TBXI^w#^=CHTvJ7^TRad8lh2pj< zYha^rBbD#;jF2PxSA5oeE@9bztS?1p`%!)lT9YnEDryU{ z=1>z8*B@0;aLfPe1=ttBD~w+k4Lh(M3G~noJ6IuZtZQ97o6LM&8{MbM=1yh%8h6#v zZaC!xBg~8`UJ6j2t+EBCpbX5)Z=2)qYk|)o< zW^24ojDj3Nr`~0IF&xTq|NPR(yAtmM@GnOn1)X}am+WX(o`pPwq#Uz;$@<46zmGI)N%tZ-y-Wf+O@t9zkl zCCE|-xYwlKRU(lpf%x*zlKcx{;c=pDABX^P{`>SE3)qZ57wAO3w!2$8c3bdVrx#WL zm(q7Q8FBRk=(CrfY8ZVU*EBSQCtdl_PUjZ#1STj|OT1ppLP!O~o&+Wy?S@PSVCDKg z43B7_KW#7B2L*z&mwbzi`yr*L_=|S*og!-FOx|LpKR%^}UT+4d5iYs4yBT5C9bNU4 z?Ct6G--zm6)&D!D*noCaV)$5OH48HArT1v}b z`gHM3#H;#QWzM33H{_ZklL#BXol6*utpi{sQ=_-5n+9fha;_J!zHuO{u}Qf%JQ=7e z+8O5wi8E$|V9RIXK%&e1TL*9ioE(+5tuwTDx@1*d+4{mib$?@qIftf6NbjTjzOYbM$?kH7|19pP37gD#TYl ziPWs|8#PIC=6^HdyG_Ce7~Tv$IFNV{uY3Rk{2pN8IK-Zfl+}&^Qlpa}sm+)c&>!r$ zy5{c4WxweLW>3<0dI$YU2kxU2%Q)WJ`w9IoRRAi8{IXiWJ!~pkLYd`aUJeA9Y3W{l z<6V`Ps!vS877Q{YtrQ_33P7m!ozM@WKK8G_kMfMVBNtrQZ~pybB!0k%b;D}ekPfTp zCP-k;VC_ZK2R71aj5F`i-4Dje>2LtVNg$sy4t!}=+hb&6J~Hr=>)%)M zH0-5K{@BSMKJInk$=f#rX#AwbB{nQ^c-(3nMT8l?RtkYMb_ zF}wZLm|TO1*bB-x*kjZq*w*9O8pwQOiYPbgY&ux-2u^-svq=Xb1`82Ou}QU^G_oBi zbrVDs|9y8iM~b0|>tx*cmihG;RCe6K_Of>;ma(cI?kgf5-HA!H*At0@6Jj0Gm+ zj{a^e;%+p7=k2s6O}n@Z{zo2^Vu`W!ZGTD;Xqgu5Ef8!(L+E`YxXD$+E;>u~dD~0G zNCCFfJmUJrP(1PR--q{56MBL#ED?_Z@B&j@JQ#ebYTNE@HUMx=aJhfgZx8U--Ypc1 z8@D+wd?;%9+e1U#X*|J9vZwRuQln;4XE!eEw3(6KHVF3u<-A*R2=!tqndFx=P#Uu5 z8?M|+KG(w-dR(faAMvT~D@`{-!Ru?H-b6zYWCcyLHU>SNY*4N^=qcZBV`xZcbo;=g z5YJr^fv++-Pbn3*9(_Q(dy2L8bc3Fh6tf(iCQIY#{>dddl7!|T%}CwAb=@iqo+M2O z?&xU8J?uB})UjGDsExKSyDmuvk~fesJYz3oOHqNJpN9UL9}e`JU>kuy29X+gq6 z7et|YX_bEID54E^sE;T#A#AhypBT|dcPKK7+f*Dif~~K#eDh)I?^Y-MD{XE5O0suL z%-z8G8j~Hk8R4&UaZPYWDCoMyj%Gn0ZjuyhDgy{YI6+6k=D|ka4#uRb$pGM2KvgNu+Y7yv!5thPv;ho`6x=u8^>FL&g2Vr;oM8ME6kEc&-i%>rf& z*L<`GU|7+a2k=V;kXD2@83IS9J%wp+nIO7{zHjU7Pw}~dE&N+#%USrbhxCvn4r;`< z6Gis)DF41EZ~VhjI(_S_$w#K1mB+TJ9+2JHo>h-Dm$7d0>5bp53ai4#OJ3vm2hUuM0q#lBE%=@_G3jmIjRI93BL##nF8PdbZd|)lq9wV*U0D zX^f-;GlPAL-g|HsSapdPqN_#!ByHP}^1AL3h3*6uMGALPq6Wm0_o+2+=Yf=NXQsa# ziZ@aBM!(?M=b)v_m;e~UhKv>@mq&JsJqZghUro6>TsrohQ(ABD? zM0{#mw7!nd@pP(Qgu#OF_&6+8k};P8EYW~-6^U!|`k>V3M_$8;%}^>x?TS+0C^Iuj zuG=fy!R#*k_FnXyryM8PxU(G+z0gj;6~Ii{#J@F%%HfstJvf`b=xH1}yu13a>8+~& zcv;e>kATJ7UmwmPAaKP83%5Yqjd}l2NKKe-fK~h9fm0nm#?=CYC6o5 z8yo381MLJyjU^R4f0ap^%!Fm=Miim#O79Z$8w7MpwsN+0F*Lui-l+S|iL6`dbj^6(n9Do^f!z$wMPo-BxJDTwYC`@|f^3W9Y zr48vvYCQJ)ObD0Wgs1NQdj5#>m<))EFTL$`q7A^SQd6xbF{_(4CYnIUvbk|mdBt43 z^XO8Gl3$dr_Ew2o5@x_zn&%-$;FWgD7w640zLfan)bGFMvM4}p`JVQ0VXl8OtW#qQ zB016|)VYaQ^p2{PKxx_ckKThz?sQi}*xDkwmw~szv94f84oJrzo`03&tIli^pkEIrQa?9l3={gRjzFF8nN(B?PAodRLp8i%M4n>61PmdWl8Q-jZ^d zKXe$?hurivbWVjl%VQH#H&?aUSd(@K?j9WNr!4A+8KUQ(1b?HpRI&d1vqCkSg zOzL)BV?E*6+3ZHY83WiNyu6>Ri{o2l*VcNzuw_7)1}rQl3fl&*@qgP0CmT4z(KFFd z4e!|1P{BdHnmzuNXZOM2(Hl?=boIHtyZZ)HDotAaCorGmR5>;?4pu5QBMFJq_Qm!>Bs{0JK=Q3h2^6{fJHOZm6K(!V{j zaRhan1l+%TtohwQ$WAau)_wuVmN{P|y_s9Wm36~-5lNO$iiP$+c89{ByG(oFbk?4% z>KE@BD*;nT4NcDg2JcnvF*B~uH|glT=NXm^eh>ej@@;4Ap~im!ejaN4K`(Rk_`pUQ zsI|6Wr=B|;^(3Xxrsw~b_v8Ytw6Ido`T>RwLmYC7Pm_wZ+|d8=6Vc0BV-PNlo)|?M zu7iK0FE1$3cq!4gdY&^>cAoGIAbQG+kHkyk5geU=+JiZ=CF-BpYr5MXp&2gDEbmOa zhKuVjcoMFB&MRG*v)ob%Xyr>8mxD+&W~T9b8cC#7htl~5TtFKy70P4F)$#9Bb{0z8 zg0BIpPr9?qE}N?9`O^8#tJiJmQnkdw)KFP%N>IpR4!=a*(E9tG_YspTe@9L%oOXcu zS?tlWL0z%k7bQAZLy3fKGPMqNdTuyQ!6buB<9jPfe{Zs_popbLRAY++_Te?1Uese6 zd`yJti|Ah(Jmr3h-rLc^_)5#`E;~4Yp4=0)2pEs+l)ibQzXO32r^rX1iBa#Z9;}jEt>JR`|GmB6t5e-1C7pd`is@XD#=F) z^UQ)*>DvFKmdSJgL>cd0LQtMZ3#%Z!q?Ys~W9wtZ7hkG&A9_anlHd}$|C{zX5NCe` z#hZ%h+;a@a0M2Wdx(BrKx%aE0rcYzN!y?c(YFgw2z<6D6tXkanv#`WH$_#h)!T8jU z5158>c@95dBIKg~kdx!qY0k{TLTC-d;r4!1o zE7d+>GYL_4gwf@D@~4OGZ#;D(y?FI)#s8MLzxO=4(fxAbA!P)GTC{cj$)sp5Z=`tk z8DR>DBY|OMW0DklT z#PhPW53`3n0rwIhO#4Ds$8~fBi3?m2pF2xRr^!7iJW%1myDtvtJ3j{(UPsWGc_RwR z7ajkvv`c{a^+_sP*E3VgTL|c(h0RhQ$I$#)U^ul*le%CbC-xQNH1`*LBZN2@`Xs@= zf9vqoMr3Kt+pfpmx3>X`iVxucNtlhOo$dGO-F*BpsfnV8%RTnitaX|WaaVP2Fd77l zM;4#&&aICV07b3sn%C6HQa)5dlY^Zu-0y9oCf(3KJ>m;pjM6%9AKw;wM4sq(uGw+B z(vOQ)ebXK4uZzusV>$G+yx)bA0-mYe$F+I#JP!)>p z*AJL?e5Pc`{7JLLdr+YttTCg+^p&OO`tD}0Zv9Au{=vKreVSMGwM-! z5{Jcrjz}-wUj}*ir)XNxQ+Amxbjt}qqTXwL9)Tz*D6VgjNei^RuzOD*zc00Hc%C~w zJze+tBI&;w8gY1>Qs&9-yxr8B@L9_haPe5?{AsPPS^{{b1z}Z{CRwQSt~MpamYbUp zi3`eIuE($$C@6FB=Wh9Jkk5@<1|B6vnV#(zGPd+aZ=M09nvgVuvcKngU&Q z?fTE+)Y763S!auz0G04bwH`LX$D;p{l^%ywfnF_^Gkw60?)pUmAXguU-cunDII+k}5^gQucFCPY$Jas+q zf4TDqzCe9VJFsn=sIiOs?Cq!O zR7JXx7myPwauDkQ#k<8rUKlj!bwC(k{dcK>aA z#AcShP$R6F-}D@Jk_z#Cnc$5VWsiqx$+>N3(Aa7gA7*KJcML=dD^(D}^ee;R=z+A? z5J+h`r-!3Ck6CaU&t@D!AFayf(trZSBS?^bEQImI0{q2c8imgoVOye*SZF#N?~(S4 zyn{F`m5&UE1vMG2FJv(h)DrxD$?ds4;B?}#Yh+aH<-d}zqMRQ!@m77xR}mlIJ9(^s z`An4J0t+d{4Ied;e{}D(a9tRv5H4e4VnS{m@ig82u+f;ZJ|ecuWLm;%+4$2Iz2?2q zDPNLmL%N4kf%ssoq-8huh?*_WOE2-zV4p8_7n@w5H)y%a^5d*_cGCf~DXj=zueWS2 zBn5U(YfV1l-wY(&y~hePxD4*rlK9ejfIJZN=F}446{y%|_(HLOo)}|sM$=?g?e$j% zR$izaATnI2&6-t&kY1{4=}rOl>=q16$P>~uh9S^D6<%Mo4%0Bcgs#eF;^3eJQVOXk zGpZ*j0hM`te7q<9Xh^i_wP%;BH30&lNb}a?fR}9M%dq-ImAVZm18}@6(K={|?um8` z();~<1dSEgX$Y^Key*f;I??@J&&b>^>v|_yN%VLRI4MuL=2KTs_&ug&r{G+UJ#QBRNw91Zf@&+cSnlB43EOuZn8^bD|zzxaLx*tb85e2hI?)Ytpc zoe#M@|7EfLg!%A6UXYtiIKT-g;0Gj5?b$)v=I@;BhcQ#@rGnZ7m#x(9(Oqp1cD62m{M^rf2`OV! z4)q^rGI-7BQD;!EHWeNfD`q=Yq5pOAS2mTW%0vx3XspItTGqRm z(;`gYN}jHZsbfzAErkg-Y6`ILtYJ*6KY8o`^yz815h^EFQK_xoC+g8%$BLjf^Xw%O z0seVmeqGucRr!bfQSKP3+MYG_y@-}*n&KcC*moqt!s-vjw%yoJ$Pctu7oAGEMfJxR6(9~eTQ17n#(GJ~W6Ur1KL);9%yDKtFPs-+4Y)KME zQ(4|fUUw1YW(p&R1W)tzwQSS35Z|3g1`m^Sc%juIVUp0Tzh1l}z>2A8T9^LuEv5g9 zb3Q`SWBZBa%S!?is#_It;$K6Mm*_-}bnY+Z=zvoa;2K8d?`zdjc(I27Cs$qMN~<(q zFoC~Uq2CI+lk~NPP+NQK-!GjEF_`z#ltO=nP3azYqm%GT8-7}xo0^j!jjQK=`|Xtj z_Q$##<+nEnu5*T&&?16I%FeX)HMK31b2!zks&e5ni{K`N4r%A(j|>can^%EDqI~AO zsx(O)Rbrbby|#-<-otL`C*sV#sEyPUF;YrgXt&AvPLY!r8*3}Z1~uPd6>EQ(T>D`3 zkTRERnA9_H^lPM!xdEnIA^p1#x=_DlaQM|n=FBd7!flYVBG=PSVO#(0bv?gF_J4#Y ziJXhT#h~)oB$C#87g?2TDP|LanT|~0@+2XvpbTb#)_#mY@o$P$;+pGRt@f@C^~Uh+ zJnr&m5q463FGv%pj}Un9?Vl3!;v&4nO-Q2@j=A+Umk5GG zF2U)#i%yl7?o=;Z7NK&;{)pd?Al4onfilk%Y&2kC>cF>sJ8$UN-07AHQ(H{N=dqVn ze@+;Dt#w+Od1G>i&eTYOY;o*wq?fLGt%k**mO069Cw%&=E>9>?qitey7d!ZyJH59V zjV@p!GuDyFkf30d$HGD|U_A?*q^vorwNu>p8wU;l8z?=9vV(_6AC$lJe;^zV= zqm-}kf?>=8jz!XPh`Q!TP;Wfe^ret2Cqd@t3j~4gVOI8;GJsgBaSiuOm@ zeW7BOvL~q@4D6MUD5Vd^=2BHSgb0!Q9wFWn-1I0=n8p z4&0L1*?IF04jF2#=oK_j0(yK6WYy~gU5BMbw_IMH{wp07s9!*2-l>f<_Qaj*-+K5X zPN?PkXBz)#Jn)7B0{bhPo88C$deHdt;K@xKx4Z4WzaB3N=gKgWM?$%cRXa1#bN=P~ zM4Zvs!`ppY3aN+6?npqKEwlISC%dOl8jD$cNYF^oyUTy&TpWmv`mN2l5tGDI-ECr) zEpDuh*hX7+a;-{!EP%sYS2;K2iBs@Jsyo)=6g^;n`r)(vJ=uob@zOqD3g5gQ` zk9YyMWVmf_NCVAO2BU@E!UduEV&Tjl+s*hd70xDC7DVe?9IxeJ-~-=SUQ>FpsYcO>Ij zG^uPb4{n6?maUh&p_2n;WEL}J`yr1ASUqDsAg^N-{}sXz`Si*@K??{4anZ_8>BMpn z%G{4_f3RSrKrFmCsW=JwXb4{1a4HlwrHCc+N>cA72qE|>p8FTq&#w^371tTt93sx) zSeKnP>C^m%9-k@Dwbd%w54w+!!ynVNv^R7)7?3d9=)A{9OyD0T=SnQk0EhMO^wrib z{pj`y&=0MGwEc20a2?{6{H*5_3x@QlK2AV}9WW+nv<8v3;WpjX0YPvd)0!^kU3qfb zap{TAY3s}=_2v&==y+F<*_(}5D7P}t+ua^n{F!9+;2u*i#}t$*0eZZh#6Tt+;!hFRym|JQk*a1fBS#E0NR8Q7Fv9^WoiC}g{gBh<%rEt z80^rSH)bp{f>6jNrcr2g{bqN$i#o|QG|S8F@-7He0s?MV5|ygR(GbOz4AK=MT3Vo9 zp{gK^=XC7f*qo+53BO2EqgUU-&F6)B@yF&wAgznJnb22JFYB<<%uw;a48d#Y+--+X z>YVOw(}bSQU2HwIi@hNAii6vMPIrIH1ol{$?~Bqcdn*el_EWP<^wx@+flYO9MuddY z?xExA_s8#SL*W`9uzm!1J?Ywz_|9?auNoNw7fdW&Xz`mR*k1OaksD znBXxtPv!f=GE?ZkZLPP6GqQOzTBQ!s;8|f&tXnIXnv!f?h!$yaY&bn;yT?=23aP)9 z6>R12py3Q^e~TXvd(|yPmZ*rPjUjU+wMV^nr&sgp3qtQ#G5SrBLgr;z(MHS7o4~mc z=H;_TVilIhJJ)F5v1+nVzd&1Ai;Ktl$PCvx**ww5n-qX-lu~#mjAww*h-jGzqoZLv zyv=x`$#xibmUaKfXJMOz>mDsc0-Rk0ImMkP-5W_$B)1P|R;p5?Lzs1+V zNH|uigxj9BJj%&KUTY653UelSP@Q)XR1W*C}V z&c|%|WYSmgM#QDZ_PUmY^>dxEMwgB?k&=|4k*udCrS&s&R9l?nvKY}k$UMHS)AV>( z=cJa`rFw(lHLtyvnltw;q%-~S%$Lf(04_hpfmU^7+fz$C1WN8bUJwfR^4I%mCDdJ! z%BsDuWV!~LcUuh9uhpN2C&op6vjy$W)^qH11J)(0avtQ2Y%9JFj)6OQQz03CURDYQ z>QwQhJqh1KF}%{9&Tb>xCz=3u5vqc-$gTp-2s@)QkffQ2C>n9~hACNha_T(4_V0_q zI#8zM`@nI~EzUS3pDH#m(h@<99Foe8}ou4&8EVH`}Su{$Mbds! z`V= zT`UaeI?TcMcpzI^Qn9%f%O1(EPV)b?I@P+`>=qJnx?e+*S?6YL7;QL!mIuqLg?>AD zb#;}HYqpY+F`GfMK&k8zaJj>d$2tfcV$*u zm|Y3;G&GP_Kx46)O2(FE5>>1&MqWf4G&cz(ZLmVb%v!tlPQ>wv4-G*^SlQV7wF0+- zYCyCfgy%sO zpKy!+?MC?SjjdR-{>}+{D&nLb%qxEihGbw*LDG7_{Ot1FO<2_lzpmL)CZs<7jV;Qp zdKI%ONE6<2!Iw|&gG}e0!rS~f(tnovo23#gwD}P8w?PM zqhIIAz(q!Nh=!rPlWjYD-a$#iLm1}as0zpKOlOIT8g0xoggzK=+0(KA+TB(6q^K6_ z5=E}Dt@a-KE%*hy{%Q0@cu<~JOn=fLt^eY)AH#`SLLyE6i(*M*S$uWya=c7`+<)|D z)P(0`*P7-T(tk*>#tggq{v;G~-1G{ia(IYGa^BA99++*hTrs%IBl7}t8CjP-8ozu^ z9bj&2ZQe+$Y^(`HyA0}cPCwc3pS}~nbyUH*QZO^xTca0EL;P_vV(jx7kWz$-!P=T_ z4I&o>SQ){k2v__*#3EaB&&tp7#_c~`*C)4gWzjHT$iz|rBL;Wn+acXq4A$O*rZV|K8 zBZcuz6Rsk|6LKkAQjCm-o7QCTmmqfS%dvw+D4lInjtLQ%nolWvY|r6PP^Tw1D3)bX z<6$l6aNz;5vc65j;v#P~w-@jfssD8ol4`vUGBoSZ)xSbZ8@0tJT8poqP@H~G&_Ius z*t}r?`J?0&w@sI8+5J&cVffFnApZv}xmaqzM!J!0q^PJYd7(8*(k!>XxB+v{Pg}aa zY&*D03SC56 zPqzT+q*C#q7?1d5%inYQGI~0{nG3oK!v_bVylEkKml4-)Jxt>$GO%gbP}#y8&5CbH zZNCAloL_6xjiur~46;pwuZXrLX@ao|GFGemX6oL4p6bkpN62uS5UuM{LPk?V5lDhUQN(tw&3?kdln#3 z*G-5vKFe!9LV8@k0YaD?NOC=jy1)|?AUQx*=y#X(*Ugq+-`$14%g`>r&s7HGJK4V& zq~<+*jL~XfZ6K-K-mFaoQG&gFF^G-(=NBt*$h?CAeH?GHZM-~ka|W*L8ArEl@Ol6tz z>YZNC3gM!`o^TA>Eip+|3>@on4Nuv?I6SJ{j}d-zt2SBFQ%39ANe}E;9Ma2D2(juT zr-n0KZNJ9@k{Bl%^AZ`v7eKkrgdHX`DGIjsSEjyz4}s_z-TyKY6a<13>*Q+3n>g$W zK?IOb3N*^d-8O;*!C{BM))CUbuLH$ZjCQ5ZZ5z_#GzPEY|+%xSij-nGyfpS0zYX)W4R5UR$+3y4>P= zE{DvswE=QQhS@SXM((~tVL+w5O*jOBx|s?6PHsT^a#(-8W%9WT`F0W3Wuhjv&h#-S znBJqD33eEIuk6*|-}Wdw19Vw1SJ_&~(eg^uCCDNmB#FB8_{vdrzH#Cyq?ZuDbDuko zeuWy=-O+pZUztk-KsO@ilA3arx8i>`LjmImbPA+P;DEcY+X;tf=}#4H-SC z-!-!d5dP8_j#eXTrCA+RqJNHBO%Mm?f;uF5OV;mbO|e7Zl6SuqDEWX;@iX#YTq((~ z#~F}h&X$jNaPXXgEb`yWg4-;YFLb`26)+5_=+MUSgUjA2MD_ov#a&(v{Z8c1DX}f! zIwQpeE}KvW&}rD3uVcRmPr?mjD-J>qYyK2Ruf+UM0rLgG|Lk&I{j}l%Yvk-kgCvOe zEF`cmw=(mHlxJgW?iHPixK zjL^Thutd#?FoD1g!z3>%{GYzFp{`7Z9kdYtxAjAO7tm}~hlwWd&h>1%nm+nowKUDb zeGVv)%%jEo@`jB>bzr-JBaOe0J~9Nb0Q;~>VpkpMAOHPlna9)XM;Nu>w{C`0-b#rH zg)%hnAQcd*f$2v7R^~W?RA!89y=5T4doz^<37CKY7a^0o#%VnpJloSE5MUtUlQFxF zgAL;!warEHv|y~_!M&AFQiFUpb%sb_huhTcP;}HRHP7WP?i~h&JjdrpsK-c2;0bO2 zzb}9OTVWke0?zo$^^0k|ITF4OEzYklo~v$9BQfIs4nYKhy?|6>%PhO!V0Keo%pCr!>muGugMK z%~7PgO_ukuT*PN%R$f(6qP&mQ?Z7;`56lIT=v@lY9Y5tRe}sHrXYF0xATZ7@j#bU) zT;5k{q$EH)`AOi6#2P_J zm<$)>uD%-M9s}5x(;x{7z}Y5F6EQ>rrmmsr+)u~4JRPV5G7*42oCpr@v4G3pC9&za z;DZ2e3Eg(lDkg>?5{YbJ1w28Ec3(d7Ie))Tr?8G^`DGe0b$q;=v}F#m10bk>XGC2# z9mwX(-+6WXVr><&hrT8gAR};IPf0~l5P&n*(4Oz-eM6oqOh1CWCwpsbytJ=g;KK9W z6*5j?91U}J*y=a<$JqWHcF59`I*ma{aA?hE*!rklL+X+Xc_ixmDr4rds;%HUtT~r4 zO@-~D%5+o2%RB*|GdRF=Tm&v`)$D<~-2KB%g+98rUt7ED18siS`gob4w;@e7C@HVB z7GRsWOLLUx7)2~)(m!}hEr=*1d+ZCSV|W@2u>J}Gfvb`cn1O2sSha7^g%{JBJ(sGi zI?3_%<|wWIp{-~G%!1@UmOV2WICPEYT50J}2@wPZX@NmPkQV6%=^DD>+q~~N z=R5D=2NxGyJhS%NYp=N1z4l{Rbx~Jcf0q9B4rgmTI6$+bgz|reznF@OikZPrcU#GJ z5Z?q~sujIlQYN!kRa7w1sROq{X&XNG3qV)tyb{8*hHHyjCrQ{85!d8p;eJ!UeR5;^ zuQOZWO2=Lw)LuM_h$v*}Y{19jS6c7+Z4KL}@(Vg?A*&8=0fkaNE=a%3U72f*u8FNy zn~gn94TNSZ)|!9|(Aa)4Uj+yI9IHl(r(&)&7dAv&6kM|5Q0&MogjsR%4IxnQp8?^_cf!_EX$F= zM{fEiJbu`=zAd5~&GSMmwpiMS=Y}-if(-0XrqcS%C?^BhrMtSY!S&nLzxLO?W4k#_ zh+7ADk-68b7dtp zKf&<2)>2s@Lrc?da;$L8C^P})RRZ+g{M(S`X#vpptyvDF8D&M`k8Tc_^gzPSm?;qb zcjp^%wwvtP1PY%z{g}~7n|2=yIvkCE)w+>~krmWjZ+B&{*2zz?RJkHzv}1*S`{Aj@+|(|iNaaSJKee~$B^3B%^?~=8ICWBE)A3`y&?Z7P^p+BfM_Lu) zkbMbg8yK>Sp2H3P61I1*h`kDL7T&PzHqzRnO)kORad*ht+`5()yCTnW9o7e9!pMxj z*=x)pUU)K(b%rta@|W%`sX~U9HmZ1e-u4KJMaYj+!<5OYocpj^B>6MZ-<%J>df48( z5)^d9mjJ||PZ0T(TG~)K?sgieOkLj|{N;u8>P9>D@os0+i}S5lnFF^n=(>o(jXm_} zfE@N;CrP@2yiyJk1M(~Y2{hP>J~;olK>xD$U~cb=KB1T_{B#S&xOjGd?uVIt$d?p! z(#Lmtx9jHTNrRS@koP?+%cYX7gdUn8t|_u8VH(yeinQZyB|lCSdCe@-EkNvF>~BB3 zXYy0PzR7!PeS*Lcv-*6mlrZaYFwaI_6ecP+cfQj~k(j!{?AENlneRQvjyG|+aLIed zX|kXD&ji_J;kK7HPCn#=ERM&9xmBGTi21lydH;Z_D;KvtbbPOJ4b=om*sI+ewNTVYrG0Q13k^3j3st__)cli z&h#e+4Qe0B3U0#Vu1(+W5`m`Mr&*BH_)FWyak}RDbb1_}b&fxn-&vjr=nbkXEL=6A zC;I%WJFv@7|Ib86`+8#yq*kI*P$KU17D(`}1EBQ-vd1AD}+aWV0 zaxw>#+qM4IZ)(OJD-|#Y^tum4KyXtYDmTt&@4@jR#_&|2xcnvn#>1uR&7MecLW7D;BlOv3*K4s3uaLZ{$?b8ec1Mz(YvmcdXle1e}bKCA?qd|U-2tb z3(}HK<%|2{qzi_XJqHTEdRtJ)HbGcst+L&*dgm7h%7ofXC4Ei5 z_{`TryiYP+Sr%o+!cje)IvSTgvV6hb(uX|CEEpR{jqQ|l+}uuWNpUtZY*&UUmtfv| zZ*H&99Sskmcdu(W$&g`jptOsVU5gn9joA+a*{3%X-webHRSpOTwqlZK57iQ_&u+Hc zwB**3nfLfhQuGl1GJ4E&IYR)u`ja#KER`7nt3`Ny z0?2w)@{XR)DWr3XZDCXA*iS~Kl&*je9>)giqA}VJVYCDSS%K9(mApXcN8VtcjM;wi zXvQvW*SS)qevkNJ$m-`wN&Sobl!kuf+?ma$-@MI*K4rm!?sh%t|hqSybV)?t^ z%&-*Hp)7t3I>wX&YdVw>D8aFikTru8 zte$lgo5kZXw^%{RxC@_(x$uSAWdt65ji!2VFy~SJY+*Do=uy7rD6VV?btG`B4~tH) zp_+6HZW}ngJf#Pqj0bHIoE>>!##yR&*#FA)Kw^DuAf^ILKY-tk})wOx_v@D^qXf((jqPaMKVq%hp&ZM3tC`x>#j%ds(q+fFj<; zOCEOq)qppNE^3kXlmUHCGHqj1bM@>9Lp8WzHn3jLXfywRdD=andeyA|z zh(uj^sH_kf84+=Hm(GK1L-jsQfpIo)k!ne(5B2#cQBTtrzuuGmaWj+j=*G0vJvFZ2 zCnmp*6Q~Y_yP7U*6p=Ws6>?Ru8)0*E#bavEJPbtfAW${nb+`Ud6?rGpMn2P?2??y7~Dkr=|yq z?@pHk1X^iLr6|4*Dp#^jQu4kgP`Qdw!-qiJcBz_@Q0~i4T zTB}mZ=MJ5kW5yH|YlTSDn^F~M)!rDcUUlOnv{RAs_v?7_`3*k{Nt zyG;LVLDHHxNhYEz>0UWW-ZA*56}`3&KS3DMtX^;L&rlkoHy%71Q6 z;_T&g|CXw4sIITOlT<5O=iDp_TbCo*6L{#M0}F%ftvOpv;|iTqsLkyrAT6?FnOZ{5-MWc3I=oRPl!^ZI_J# zcL?uu=efhJ_$y71lrbS{9dW<8+8AJF)Y1D$Uv4-4!)PGzO}gO*_X2qx6s;#cr+Dn-5Pw9VJ->b>Vcf_ldN}iPn-8}>imgwzZJI7RY`&{VS$)~74G#6j zBa*yD0s=3c66b^rSttY_%7Euo`o6>YCq1cgeq}%C01!}cr;TjG5J~&Ah;6%bs@vjb zo{b5m5=>V^QQD4xDh+XTLiR**jqlZ+`#StiVaXwm0m#nnN+F!iIlhA#b=-#J-;6AZ1Jprvhj)U=VN$7&nJ5yf+ zy4G)(Rlnx-Yl56`!gN%AUpXUq@tSdy!c)wnVafb686t*zgB~(!m zt-+i;BogLNhP~;&jx(3Qawv)agr2qo1i&GJFKgF&UGbQP?_-vwOcxsIF0n%{?gTMA z!Q=%10q=G-T7fkmJKMM2-q;lxAikfKW?B6J5tUlKZ@?z)vY)I4+}lK4$=Q(6wAj)k z6?KnP4z_@llm*2=JHg`pt=NoijIqFg5|JlTq}eE=M_;dCBdPM+DK64PO(79P75-t^ z`M7J3E=lO*>%)&@rQP@4(=0U+#4k`FsBng*`m7+`tHwt0q(0jg+6{)xxega@G@sIN zrm{d+@NU((lps~EKs6sPpFpngJoGcHlyeN~9ha>2SF$gPOw^$WGeieoLS*DvfJW}U zopz5!MGW^!=9|D^`99=!buk~hN^9N(?x{<*j-AgBD8mG=+3T!ONut4TWuS*kv7|-G z>t=fXp3*^mWAk*qW7Bt;gU}&MyG~>?OzxU0(>Rd|Ra`Rc-|~)ZAv7NX;KX6sb;K)ht@ z!12gDQ0o|tb6(7mV|@U!l~;U&CXU69Tqmg?a=rJ_sj!yVy$R_!rPro7TlfkX+p`$! z+~9V^VFOH*YrJp>*qE)2HEByhI@@JyyRyT~yV>rt%JVnPy$i(OTS=5|C_Yie#IF%| zM#A5h1rNK^blJ`pSU5Wd3Je-863vLp<#84b3184)!2B+#EB2Hp902^A(Wq93H*E$$ z=1M6IJ^0`PjbARULKHgW&~Fw0Gv%qAy#2fU2*2 zb}zvtYs3to)n?jD#--&KT1HErzhc)I+CtYCN?}>m21zeaW@S{_y>wbZ^JaP`v0|0E zxqci@2`Jm~bu-fpn#MG$w}awqj>URDLXO+E8P9j*RAX%rTXp9#r}f1 z90ZhA0C5Rx2VZ=yIX557OJjg57z|kbralgYh)T>d;7I5XRc0mXc9Zndfg%k4rg>cz zaY*fNBb>ewX^IuOAD?hfmH36u6*5sZ429uo$4A!yp5YG$Pj~6|L)tvN8OPhFbe?bC z4C5Myj+5GE%ROw)-4tp18`I#(mDaEJKY3h}>&|?Rz220rkx_wtUTNL_C3|;0m-mOEJGfy$QBm; z@uwX-l4JUUx;%cwL6bRH#i)r+fFUJP`4(Fn-JzR>rq{cKF8d=PT4n-?ib((v2j2X3 zTMgH$vZz=w|LU*UL3WP(#lbHX9nmS}Hu4YXT;J=DgXG_#)bR#?U|5&~r0+gJJwx3( z(t4y%UQEZZ9vg3h+%Y3Y%rS?9)kzq-dAOB@wm4O4XqpLY0k;Hj9{cs=#1A>^O=Rh) zb)|jvKk0TmW~q3ILM|}_XipQ7gNUogyHlQ3|kzL&j#|AsI3|=#r^^bZFjYs=~hJtz50#^f7bqsj9Yxa ze=N17m(FI+r~*ilhqkxxt7Bnl5mg1M;ZK}JecR!rS6iM6RZ;5*)2vOf_^mNo!MoY-^HZ1-R;@6-MCBDw zP<=klQT;nqe*5+c@u>%_H4??2)2C@-7LUa8ULwxJiMK)Sw5q-M=Ftrum^1uTI#7Gh zuDY4sruLhMe`5^FRV!a8J9to$$WubIG=TrklrP_&h`#?`>Vg!+0UwK7X}$cEcRDhN zkCC;84dwJb;HoQNUe^#nJmB>=*@ptlavTUO-7)_s zYl+=TgVvYA)sv>9ad&m{>+-S)D?zlV+?pxy)iUgnCVWqZ*kG9{so|ofNP8hNs9CS} zW7!PNN0_96@+B%1|Hvo7fLSxsvps0}O%WorD14Ui5E4CES=yTQ3N!mWNhG;~d$wB3 zcHFwqkD6pMZ+m-_qOUULNr0}=*Z~`#&wcGc17W|gegmHwo|2^<>}97I8OAe>R;sk- zID2{2x;6KMF61ry_>bZm83SWuW1hZweCxJcEmi^ZON*-qz9C)QM|4_a(di`1 zW%7hx3#98trtkZoTip+@HOchiNOpstsW^#~Z5RkyDoe})q8)Wu0AxB8P)+m_P=WZE za1)Xrs>~BLx)(x!wIF0Ap*^y$iPl{zt#9wo&%1`Jl+;8=m9opN#G!Avzr?VRg|SbQ z3J+D@qfV5&8a;R0*NRBW?Ph$<(uu1#Zar6x^kW>%70?(Ip@{R9afZs2%@?wqDu`${ zn~jzgEiATIvz5O@W#CKSA(TpJ5}fJsE%6njKWrZ3(^S_K*m}t}US{#)c(Vy0Ah)10 z9McUvysI6+?QHJTwuETul|LVwJU2>^cqwZSd=B2ZNa7oJcQ#%|cB%28zwok^OoVO$ zI~*?wOcexHRoDBsP5W?sI#6V>Cpwc-@KY{1NzNDU5lfCwkp}VFqnnFw+P2(}EGoAG zM7A%s-g|W^?k0vE%D_UuHMS~y@L!C(22V_hj?IH>`eBSCK{t3df~8b&o=gGsoqn4? z+1oC$N1qvZbX@bB5*fBSb=yBzaRjbc5`xTq=`qn+*2Ek47Fqi3zZfGVIy7}F^{jq_ z{vERG?Pr&UiVt{v(u+M0ZShBTz52>vJ--pNnLSJ%PuZsXaimB;aRLF0>u`NKKG(rW zdoryD3U^|n-L5ymX9>L6YV3PT?E>3A^GJ2IjPQ{PtizqJX_g`m8n32b8=bHMR~=8A z3WxyOynz<%d=t`rhv7A;#(2#hv#Kzw?q&b*cv!xn{AVfOQpt?;ucmd|g^(Lrj#`21 zZT^?CaiM9UfwZz;c0TRD<)QCQ$zYVuQznQlGBrg`o$GjSZI8Y~5BOC)D<2dociQLzp6N4VE z&2EKu$F#J}ZlXW=$7hUPjzpcz<^?9+RT zab!&q>Fk@eXD0r<932P-1N4s`*(I@h+gea;b|~@qPN+V@L}ykn+~7Q}AQ_2L>Zm<0e?w+C6Q}uo&}Lz_vx&E>m&Y8D z2=tm2Jhi7IENqm-*Vsj8J2=5Ox&+51g|hL&73BRWA~2 zzS^Jc)8MyD+36v&Nukkd9k*1toL*_W`H1585pqUYHT8P7f2{4~VvWg%zrzK6!CylN zw~(O6p%PX7TqdAEBgY4nc5ggkwjvNB~?2kuMztDiNga(X~MtK-ko%NBMKo?^;|8G0{&TTYdt(kl#K=nBWTGA?7OX z17+S5pBTV0*R5UfbNR*NkrdXw!=EaP$o0eoyHpraqJA@#khd z16LLt_^vO9Je-KAHo}EXOoWnpZl;NTsm;q(9J;>bl7Qk8hc8$l@OnHphqrnV42&N( zob-p}VfOD)bwvrO;&vzd8Ms%p#QEXd>9U>FK4;aZeoYT(q_HgrceDC(t*FqZFs9Qh z$Ov{4@|i*1vN6|fqM@aL+dX2vNGbj@d&qWk$_w1n0->SwIhNzXh3u$lF~>>I;Me0f zLCaW?#Rk`usDLN@$yTOy|LmtIu7Nj`e9Tscw22K;mYOeoA6mKQZ!7gb6A1GFRU^|c z%l2ib1l;5w^q3^sugNK)C~pLv(h?c%cLn8QXvS0h3u0?bfXu0}OrGMiMUsg>k{q%l z^30!c1J_7#pl7%cvb}FVFcvtXIbq_MaXAIX=4Uco3nalyF_slmcb78n3Ph2>gBhVs zOHMc3!_vD+-WL|)@D07aXX^LmeaWYl_B|4>qadOXPj20h$tD^L5Alrg9$bYO!xL7X z+IXOs@U@3W zFni&Zju?jrVG;&yEN2^?2w^LZ@gOy-R?0|(_ucUq-gI*U&gi?-Ec z1l7uzgWV(&O2d&MvzrOX>`F^dyT*G8p^XeIHo@Tx<{l`Oz@zEj9`+K7o!FnrgfG28%;eOZaRSw#p5Z(LoGAq3kL6u4~WiKUy2pi2p;!a*)LC7A&kd{ zGFLl8hXp2Wr&*x*DM$V%eceTbMlq|(XYaoc8T#RHE2<=u-p6QWP}_$+wEqc+Fhf6x zbn=Pcd;F?+zDn_#SN8>Ixyixm;HM9VvM`4qU}i_=XN@mBW9C^x(w)VWFg>^yIf%n_ zy80q#VP|OI&SL;<20Jciiq?>1Y`5Z6e#^LBN3QJh2D2VjzPQepZ{`AMHg*EOmUtjZwRWAe1SfYnaRWku%l(zS zm>FlE(CatpDnC@da7JpA;xjv9txtOS`SFe8BC`m_E0wXHX5W!mPdw@2;K-%biI$ea z2nh-Od)YO@>TH77;Vx0Kn^cFt@}b9~Jah4do8uR5uibN5#$SoyTqr{FBT)QdZ#C_> zD5$aTZ6pQK)k2uQ$_Ufl4cV;UEc0=fj{r?S6z^xWdmk*5PIJ@5^sL>AIB8<5SCmAY zn!Nuvw?u^#aH8$)J4)?X?%f(N5`^E|t`KTa&_u#k_si!I*|P4k20N`J10rKc!`qoQ z#B`qIlkDmb^Uo@ZnaZZxAKO?6KdDntUC(Ya_gGOzie1S~uOWeI3`VPo?XAw7WW?$| zJF7Q6s#t|;SiT;oso~Q3VK+uF)q#30^35`H``k87uI|3{=}QGGiTZOFw)65#iW&YJ z-^X_MD)#rWYTp8^IIn78oVag)Tf9o!ExWWgIfQd8Q0rQIxF{qJq+h~x|hh{Zm`zA z&r3$Dw!c9-e^aeXZT)pB-h)$7s&M5;`!e5mDXrv(CDVwaG|3S$heeG=dJYanW8<|y zuSpg^zhldH5lw$atKsHO^`*%o@cJ|{-d++xH$;mJKlu0_y7}VAHI-E2rb)rp&S6V&7%^vt@$7_;iL&m&x7>bxK!Q0>LEC8~h&ua1s;(;u zm`N~D0&S`I#!3O@7XDZvtic__kyVZF%*Cw(#q__H{qAMqzGx^Aw~!c#RFb482AqjZ zH1Au#wXa=M!t1B#Ay@yUD&Oz3>fu(k=xOz&|jM05(LT3Szl;tEU?d z!7HO>j}gs97=D}w_~v@9{=VABhEyHl3EnB8v9pHr>g*1ih)tAi zbT5Y~F(>1}@^_WFPA`YO^!;e7&J@Z!fQ0{2;KbsF1=P%A^(qC4JrTj-hPLOFXMEjN zeh|d&f|QAQS44LeWvHAe{ZeA9qf@vCKrhP)adgN69yoAmNZ4gQ%!^KD@sPot>oE7r z_0~A)DIHvfd32UF-==!;qj4D74Gpv-B?+nY*6`Kknv3amUtmKnyxwZ2GRn48CAX{4N}?AhnXnR&HtmITv1zv1}tb=OvAl+id%X^WPEdnxgs7NRsRE^EO2mmkd_?m?xelGtY)YhD~8CZ^k|Cyq$&Dr#)&CygWP6k$=WfR($X2kxDk8&=S`SK9HnAN%K=0 z?NjuA&M)xMlD-uyP4J(E%Cj(`pFm~a_w8N53uwbc>kU-~YKK`fqbFgRFvtac@Fqv^ zI;7$bfG=bGO_`_I0S(YL;im*S4Yq7>5OowAgVJXnsXIMhe7O9m;hA8+nCE%@VckJ( zK6({C(td1ua`jl!gAA&%&|3%Bg@^PP7j8aw8Fh!^(~_{!65oQ{SsQ`` zhY{P%L*k)9&=dc8gw)F7v9y2Sp+BzjQhi(9voSH368|em+{Plv*Vt z?2_rNAcdmjx3V)svNfhT^(INO5ltn6bD!mw%pY*kGO}z~$%no*mw}BF+!3c8x1(K> zjS(N|Jt)-BTXKr)BfuBe(f7=EAz59zL*hwtMU?Z#U8(+(tsxWKOeM_g0q*m$K9Of|pO zn}yXE&+9=N2y4?`%UW!-{={x!)M zJRkq{|IZNcSJ%Ms#`2-8VpGIub&q;M)`3v&LGyettU%>C2)Mg0bC;#YX~w zq7YDl7Z=zh{@<*`@3+Kt*3kD~4VLQ-tnxWSzKx_aA$E%o;CJ&6!}vl+iGs3ZeF^Lx zA+4s_PdC%xc|T@57=C4szd%KuL0mT)x}I*)*lkUdx@$!*i>bmBhKR)1~ja&_PR z@JG9o(_w1Hn$yx^GhPr$uqxg0sN6HBUV+`?+A}8NrnkcZ(R=n1bRiXQc?5}lsU`z5 z_O8~Og7+v@+xW_*%l8dw+-_EeE40e$J}HgL3^&m91jSBLs1W4 zt+C44FX-;7G>|ZnyrbCF2x(KHaK;z9g8P{c#aN(SQj-KvFOR$G@F4Ic$NAqrL*6{* zl1{e{Q6ud~>Jy0DH-3eyzXBcGPCBchoFh?C4NBrTQp||M{8Jkn1}Z^IfUBqrkHU)q zTGF49IlbnQUbS6(aBa^n0-tL}_2Heu`KRWmv=|r!#|+JdkApUyV9hlnqT(gF(xj!X zmdO2q+)`OE_J)=MN3+N8R&q-|)>{!&U#R0aJcO0=$d{BKa^%PlvG&o{BpH-UzJEc` z(rhTalGXMzAYyqTr`mLE!}obs^yq75Vv|+hJ!;>xCkj%e&%1`EV8bP=j#m+lZTo&O zPoZ6EU&4!}=X>L-m~Zc61fSzCW!L>$Ha4jK^ru;Uo`6(B%gcM&b$U6 zQwPk+Gv~e3mlOuHsn(KQ0B1cDXe+ku9$lMGsu~P-%H1#m1aq9B@OF#tlTm`pIey+9 z#3L1O|A1fe6=PWp5*31c%zZZzCTtwYqkYZI0}vd|!|G#j`l-vSj*Dp;N6S zSNlogc!1`KjZEoteSNmGOjA43^1`XFJ*#)KI=Cu&mO_VDhKTWZeOU)JLZoY%YhE9> zb8nyDX~n#G3tgl%aNpz?tk(Qb$Y}Gt9FC!fXplNNsgp5WG``?Oz7gqhDCsz;U$ngN zdHz-e%P$}aW`>=w;SVjo!2RY?yS9Hj?_%<5A()%7otK>1cmcQ1XFOELR}8Knj6N0< zmwWrv#_ejhhK>89hSuJm>VA?OrKPVpdDqXx-EUnV3$d889qyqjY*MsxTfx}Lfk`#3 z-(uvO?i>=A_f$KDD^t2Kle3A`9LO1J1$)#EJTga|N3_E|dp4K4m<`#6MAN zPH%OY!0ioB+<*nd;B(-oX{uqAk0pEt*|V$^9eCfQeCY4hYJD#E>1El9+tSjUmD{bL zjEE==-s}`uhFsIgNG>c?lW)uO{CRsusB27CRk|hYz0D`@^yIw#WOuyoIKIVrscVBL-8_*df6eL?22Wa&QPyZ zUw);ivRlRy;L!(Km~+WC04@y~*6v59=an#2Pc3WL1WCqUlgQr?n3U$P$&ocQ?JK?; zuk*e5{{J{7f#WnlXwF8V8{~Zx8V&XO2B^?AyA?MFDL8;rA5o5``xYj<6XwJtq_;HW zB26fT3>R%M3(QPn@d)pZdwfYaWGc42EeEqM8(gB~=8^R)3^aHp{euIHZ~s^HC%NRd z_dulOUqr)1W9b_3uxS7xFT{Q1K^}(ig2>=vsbJ@6X#SDO1@qtgqh_xeXdX1aG*@_y zv1i+>Fn~aa`c)O=bhhgIC+XsX&)T~U`p0<4u+;);v+w^)TVOB3Sf}k6wi-ZAaraDO zEurI70vRwRS$n1pIKY5@h;@%T+WqIeh1*C>_3*HeaV-Zf*n$#rSB_!zIT0&&gOV(z?H;LQd?R@ z0*AeqeL95(^+cL1FfAn@h6q;gG1C?c&98YG?k>LNT<6pMHQT!z%Gjf(mI_9hG=Job)fX{gMOQ{>yf<#ClrXGJr;56;cE`A6ap)_nU3DFB_;~3n*{ZJ49Y}_vYg&hDL~OjALul~(0@k9m_##h@YU3&%`%ifLOVcrgmwv7eB29{2H~)46CQYT&|Fo&Bxt!?*Ps+fV zLMtz!UoLdiyiz<&Yi#e%k-30Cl3cmg*dNbjb~=a&0t+8gtXtV|>WrUuTh8G6QOXAk zzz*N*_=nu`EEX`KtM>vMv&A~yxa6KwL9+yYM(IX@!L_%1IzPR{u1yOuBluSQYN>n_Xi0iAuI_Bol0`@6ld61^OeP=30i-$ zQ}c~@!JFJ7;6a{R)~g6qPw^Jg@qa{ZK&U(3JmW)CBbR(T?K2RE0T%SX(=2iQT>T{& z37#d@^X_^mcn2>ig}Zjm1Q=C$&eoZ0nM(&RyqsCX?`LaYmHwa&Mm#)bX-fX*$(Hau zerNv-gbdsFXoD?4qvUE8j4zkGcaH{b$0u}w4wELB4asy}uzQ4#jwf`G3DXz9vdG35 z)(xg}jK@ORk0v%fJtP*|J&x47Bhcj>JXoAL4o?8s{i}Mq+)Q*4i@@XMu-fFKMf02R z!y%w)%SW%5Ux2G)@Q^*Wc^4eBft3w@7Jd`O3Gz^8{VE||7rZD%!}Qey-wapVXAeSB z52n`+Dy?K%zVCxsSc~X}UDJP@b!CFiCpR;?vXuZ^QST`@Fc-2)a7oz<9IURnDe=4N z0&?telrIadG1S~8Ii!wJnr+oUW;d4bSOuL9gz|9(VIr+BMymCzR+<8ehiLgaj|1GJcj;(tv$_ah7l7= zV-?wJjK=&kOk7?Q0eH8Iie)}Ok-gI16|4cKBC<)*qW`6!OKst4V9MN@yUgpEqwpc7 ztgwJ-Vj+|Fwz!#F@V3|c0Wv6~XEL<(sf%Bg^}0{iQ*G^*{XR3I9IUDy_K58tdQaNP zSt-^}y=r@9a2E^|4HCZ;W&5YQI@UB-dc1sv*awjv+PGp09FMKYBTt_JQQ9=Q zs)R5mi-lDRGAtMhGdvX8{qxlJnUgqUxwz=WmtQT*2l#~-zZ|x~fE8EIgPZ?j_)!$e zU%u{&+xR5VMU#1jBMzfT8&UMc_(?|it#^>!ICDcR#!^TqGncH1W<4Mx<1odg7Xq)c z7^2QV{ZDOQj;Yxq4gsA>a3>Iq`JEf|u}`D*A;yq}e7W85bA*?KYz84;)X(|)NW>L@ zc9s0LoyKWFS1Uiy^%T8o)gpDW*di-Q36((_0$$W#7{b4$Z6k+ewo*uwe8`6e;6*Wm z!xo1Y3!$Ik#s)%%NgvRm_N2&WqMh-iIn8`EQQ{K`h=Voe105e=7m30xZ~o_DNHm>i zl4*Oy;Oew3L<9tMCplyQb9@tyARrGP*{U~9d0sV38_1z>8 z&0an3`uH?{?;+f;6rNlEPqAp>muuw1`yB~sfVU|8X=C1mojN$Dd&y5HG6E zO2EDsoEA>mx#|1~f97Wu>|7=7fa1^uZ+T~feLcy#Me06#oRJNfWE=Dful%Q~Fq}@> zb8SLb;GVEy+yz6BU-HI$Xxv2o_ky#~e%Ys7CT#dHKE(pwrGbiaq(0Pl*4 zFzzxCiWpJVP$uKy!*dmE>sYF~)jAb#}+0#xU+M z821vYSMI(c;f-IxR!>w&{YO-KmW)DWnTrGf$`U@cB30 zv(jG}7Hl2D5dg*MQvd(QAQ)0G>pyJA&h)A|wDpVKRgyZ{D2RGpw(k%vIxNZG%>O*6wHON90P?2=se5=W@KYq%>jJ1gd;9kf?c zUOx9;;V_`1{F!5sV!$2x^QRbnf`8<^{NRm-%;QJJru|ESZ~6Ioo@MHtUzbR#JPv*` zBEU>}ebgg1G-g{%y|2@iKF2Si<;nKAQfB_N7IoP)Q(a9?oqh1Tn^p^>%Y~ErXMy{# zWOi2LcANNl+Y-M9hKz0=P91kKty5WTduFb^!ZljG`Mgfr?`^t;Aua;jUsF~@^dHg9 zS8(?;ubWEA_^r@LSQCwp)h1gnW=$RGO+>}e!0-vNcV%M2p#P;Q^*l^hK2fBub;ik* zK3AFi$5GAcR<+uiv2Ug~-TB|XkTrqA{7kO5vi^IE{`J4T*$`;GoL`>O|Euk?=AVyb3X9M zqDpvLME|{4|Ng^ON)|Ag05}l;v8BI%`b~96aFF_moAqa+Jp_EIDrzVc%bN%NA8-Ci Ay8r+H diff --git a/documentation/en/.gitbook/assets/emptying-boxes.png b/documentation/en/.gitbook/assets/emptying-boxes.png deleted file mode 100644 index bdf86cf637eb3d19a75e84acfff39dd8caccc892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109558 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"OxR_+^iZv-CP+lkj-tN#I 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 VZ-y<8Z3_fE40KI&s{e9`{2zhYs7C+* diff --git a/documentation/en/.gitbook/assets/lotus-logo-big.png b/documentation/en/.gitbook/assets/lotus-logo-big.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c4dc51d546115a1f413e4b02906077736bb57e GIT binary patch literal 39615 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�=Jce4G|1yaGz0vH1@Flq%qUrb% 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

        Pxs=5w=3xui3en z#HnTw&WWQ9iODV5=>71~f|IdV=S%6ZFC(dYJGd>riX;op@wj*QWF=71seb4 zzij?zD`ua0T^Ub=d=jpsU`XnllzO;)v3L4r;fp5V?!Zo^f6t5ZMzm|UceO4V@(yTH zeIdji@dg9wR~@DI!OyTmHT6QYpV?-B8ZXGfmN>7uI;T?&CZ>w1Y?EO2fxG{Colq^j7Pt`-yUM{s?#K=pD4#78Zc|7?RXLtK0Jy>XXBUU>4`_DJGP?(@n z#4Or{hciG!=2lpEE~f5;7Y2xbfCNL`h%X>>v7^L zYuKXyumIq;jB$apEq7o?t2B_b6cTuDv1D11zC8zyr>O;X+bJIzn7O?ea=)XCp$DvX^~TgS?c;&jDG?<_NN^Zb4V4M>(_oaQss#2d->1k#9y4G>%cMjWHb2D$b) z|4IZQUi1AxT2@-|WQ6e^TL7QD^vfl?E9nfSAnO6a*k>a-Jc2q5`a}=;Ndd)`(cf{W z6$(4B97GTn4kRCVB}8KDO>dZca#s~sz&Z$Sl<^^}@d+%{_M0hnnS`hK*d!7VfQu7L)>;i z8o0t{d-ghrbk%m--(6l+Q}-uuEhc^=)Vm&@sB8qxA8B1z``1+E26?#u>0V)g;H8H8FCwqt=1blBxz0yLt{TnZ80MU7K5Q_FD5Ah z9w`L*H@PqPdBFhUGvYLk&Zm!Yg96+LpH2JX&cfOYozlG@&PNWzkVH3#JPu?HdGS&8 zzfV0Nj6PctA)oXE7HA%_+I`+Df2)eRNf3LEM0#nJ)x+VVdWT*{&;x>wZM-dPRw~@l zuLnkc4e7~Tu%+tvtPwK(G?9QSnVrU|J$~^inQvmRJO4fQHqy|5v42Z(8$K!+#TAP$ zJ6WhOhyf+yjd6Jrx7N0sMTxYDL!b@bA`*`>KhHsUsR8l6AaJj8l|qh5llM=J1GBia zH&i>QsY>O722ox~>7Lrg)ucKV>JeJPvEL<&YHee1?eHE>UdB(xd$TOqk$IA(f0r!S z%zP~=8!+WS68Z0UpoY!g<+o`MCbIFE&Bn4M_BahfmuK$}Y9p6|V>NN_b71Dq2mefvwip84k)nnT#9K{k%n+9NJOKX%@^Y zh(T%^5m0iatXKK4JG2r!4@!oDV~L_r8YjB5n9`qYci+JEYB214`=a~XV@T7`F~skc z>T!(Btl#>S5mt&9UVvc#`50lL88r~nRlR_i@ePVV?_1Z61jmPu*IN=S+RufLjj?qd z2^dq6W4f$$mKPn&>ehVSTPXBnvi22w1l+-q!ipr&=-wxN6 zRF&0m-g{*@eA?m{3dN}bIs74U%6I{zvXW?d_jg9+*t}fZUtjLBwmbn?NE<#LhTKkk zakmcIW&<1(A#qV^m?4Jljx{dbg!d2b^G-fjbZdZuxfn@cWZ*knM419nO$M9+abNUa z*-NqlOdpTo*qTy#ET8vS7v^-DsZ@=V{}YDv@4sP>7Y>-2WWxz7DC*|Qqf(>3>OY0; z(+@J2;D&FV01J3l1RS}$3_8+@aD(HU(`Yv~zVC%@)Uw1=;N50=+3_j*J(R*OA+%OH zd@#!!Ryp#eUU9+r28OQ&J(UJ2%GCZEBnWGz-D;z;+< zjqEcQk8Bf{1(R@tCe%z3B#Wg%{dd7mL6+xz95~cFzgxQ9DUhX`(LqfKsoc2xeXUO3 zb=aZP#!y3OB0somfb6#wHWQE{aW$49hnFudXtmTYvVz;gpWkYo= zP40P6a0ql%K`dZguJDSD*Z-GA>R;%rnnPxzo;}Lmsehd|QbyveJI->elJD;d5&y zyDRkYQ{=Wqy>1<37Xe%PCvDUtusS5~w*BY5r&r=y?uVHdzm+26uKXlnJ1jl{!x9ac zof4ZTuGrU{qIt!k?fwtfAoqN zl@tW*%@#{v5qt+=PbzK(tAdw>sCPrMBHS4xS$@<}Avl5kQDDH35@MLiY%o^v1q1yAF&YBQ3phc9DuG&3z%Cpfxg^)c*$8GkZr3Z)*E^n z?V@qZ9M|`6kIIWyrw~KW5hnvZC6E#LabtyV7Vpw+tc6pVy`Vk#xgf&8Pv~M2m897b zqOXJq&ya1xBv*m2Iy08Y?PgwW-3 zn5penMbP0Vl%}R-GY}oG2iKZEhGFp;Wc#+k1xsMlAA#y2rP{lnH)4{5yLUmKYZ482i6~NjU9y^7tUCE>M;_%VgS>m!w18GsXW0 zmssrCTgjhU*YR~B~ z;YWd-`$zW@vYkUpPk&B0R#;czlZKhrR=n}9fJc#|Fc-49{wGN_PyG*zIX*W_vGC@4 z08$8bp~Xk6r8od78U9($i!Pp02xr|N`8xPn%E0X%_ zFV?&lAK%vC4Gtx$>T-Ur)vLX%hL(X@aKroO83W)NPy9cw-ZChzF521!fRzjk`+-?k)j>ySuvwcL?q--{w8vxwr1E+WeuatDu+cwZ;N?M7Hg+o%pPV`n`YWyzUab&YCA! znGH?UX%2wD+~jIf`D$pztq#n!#d}`5^{k8)7++V0e|MPL`}44+s3=H zQ`kMAUskB`YF3jEh0C5JmctOs_ZZz-3;N9>LrEPuL!m}=ya%fDmAYZ_7^WU*0LHv> zqnQI{Pv6O+?*BL?Rr6pjFs{#PlLaH8QLg4X%SA_X`!!IocM_~;3idEbt&PT3pALti zwkpD|@lBAs@{hmUe^9mSP)WfM(Vv}gz9W*SxwL!(x>Zc!dV%>F#`({HAgX*7V31(Ra|mW`jpFUATt8kBie8fk)UqSN=Q!DhGijjgdP)3cxB`~xfv z9idDN(>aV8HY{?N0xIk{>YzMds%H1rCRR`l_ZAvIZ0B{iDV^6H&zYG*H8s>w{hH~>9%fVh_X zrS(2~;M(xu@ z)LEB%*XZ$2TK7EB;@ju0CO+e)VG&sMD^Bv|U=G&x^rr0Y7;lzTL-j?yqja3pbV1F( z4F}QY{Slr3%hUPHYTTJ1`O={QGas^siaVE_-@@5=zhC^+lvkFb=U^nP{e#HjW1SAi zF>@Ob%;^NR7kOd+GT(-IPhnoxd_Fiz4`=rkah39}w=t0_1N{8tgLL8m16fHTZF5y^MG(X#)tzD)Rl3kHWq2IZ!U|L{F#r zk}oCG)d&%{<@=h6hC8JpIuGyGgkLKzY}xzQm%xej9bhS5eh?zIF<5dIkOQa-U+Pn9 zmfMd5S|^qwtO@iVB2e~QAm8y5rY=2N(*Or6f7xIo@9t$b$Zt&dX+{@%cX!c9RudTz zd%w`!1ECy)+ASzfvhh!OZ9Z10>@$%%7Eg;`dE4kcP3So&3i9Hte&GF;#`AAh=+u7W z&4UZoEyv`!A3?y68P~{5Zry?!iZj_@_Ad-)NI)(hPn&8-N>Hg3z0#m~^H%=AbR&-*k8-$V8f_W=AQa?X$8MEc8gWTf{90ic|+Y$7M!rm-hzlHUK7r>{;57|OSW7h70=7O}puCyz-N9P~cUvR2)HsMVXj8d!dg7o16(&GJSS? z>t8L<#x*`^Ix~xmgx!o4RJ-$_)E4rjfonM27s=?%#49OHDmBC>4BD1XYJ34+h}-YF ztqV8EGDU;)F5TG}$c6CXLY=amW-SLztPN<8NhQ+GJq?Ys zKgb0BGM#bE{s@9hU||U=UTVG3vlIdd%e%D>%#O^xk#{_B7M8O8{_CV)|78X(_}am| z=L7=q2xa#A)aVu3Mw8yP%*9=Muh{=7K2>RvQlK)iY&jeL7k9J!2yHpjbcW`&a@Zsd z^*iXK=1aazCbT*l_3boKxd**wuG(mst>}~bV@`k3C*W>kv9{373=uHkrP5|%H!U&s zi)x6-Fi($Kd+X57_sNiDQ(%?bu*hFHyy?B=t8w**QQuS3mK7^=+i5x|1>GuN)a5Kp z_wYl)Fr?mGPY)G8ubiGQaPifOAHn$#mf4_9pnL?N# z+fJO22({*6TO6N>ushLxxzhD$4mDQf|BzV}!{IZPjD^x zyQo6b!f!In(w>HRnu-#Y=92_`25imGCfjea-=`Gwz{A0t&vhe6Mn>|~v4`HS?Fn*A zWQ+5ngq{zO%L7Dx=gYy*Sya8DmVN8JG^_y!gD`M8*ghdajlXD_slWyuGVbPh6{o(x zgB=ZpXOKvTCiyx)G2X_>RjZ~xhKk}_WA^M0Zdr)0xkruE2{KZY4bkg(;XptU2K$aS9i(#UOsLNnFgiW*4x?qEt)uC#?^>GGX)^ z3oJw5O~tmy=LoA|tHXl(#zu{r6i|0Qm?SdGCQfqs`@|_A6XRjN#V3om0|2frgj_{T z$y$l%1G=ASM7L7Nhe!R~8W#kvG+^b?E%KAc2 zad1T!Sz+PAKQS<8MyILVFxS-d8qcJhZ9lBOwD#!_D}A=chYh4`74ph+R&FE3!L!C1 zWFu&r@XaPZYZllYgFcQtYwcTJ%$gHHN5iJr{}JgD-N5r&4hIAol6MmJ%Ntg2^wJwP zxX=I$36gI-)wu|#bu3=+?A??y8q?jzS-&q&L)JRkzOlRhtykoa4RVHSN6eliXQ23# zPMIOWpZkq;JhK)7X%QD$9`@4^0w3mCn1zxZ5>#q1 zxgh7B90{!LT;mpCbiX>G?z2m(cBVSCK{o9v&I;Km-Ea~CF7y0^$k>Rd6%{#<5Rx~U z_+$*p6ytXzYc)vQzQ~B4i1Y3@h(f5wXA=?%?A3drz7%hm(?2tVbD(QXLeb|NltS~=vLAb9L=8>N#fkfbihY-fCedNTzI3`(fn2O;#P+eL!LU$&!zP|IAZq@#gB&;Yx7Tbr#t6N+B@@@fcoSr zLJ*8KuNl*q3*~>=h|%Y!=o1@KXX8A~nq-mEvLs*YvMgnF#=l+8(qKO}afm=^!Ry68 zMCQP!`hHSmp1$^(-0dEKv6&7CGyNrSMTmnpaU65M%D$~=;&(?!Mv9{Ir=wTFTUNXE zZ7&-vt#Ph?uB>s3z>5^V zi2bxKa95NiW+a^$#$v`k=u%Q^J|}&D;F7u$LT>cy*D2jXkq}yld&L9X)=`eTV}M-{ zKJzv9SI{0TyO3h;=;Musf3G&Xy|JQ{Teldouk6M3uCH*S+R6d#&eyQw#K_057$=mc zBd6M;dL81efF74f^+m%j2`?Dw;%y39cHJhDXoxe=kLm_dO)jBVfe+* z6P3(SuOy)NQhbMQhyTj*3U;sTfvW(V9w}xiLk(G=$d4hb^p7|vw;6=R%%heO$HYEH z)om4m|2903tIss$KAJ6^jFStb>p6}8Kw+vP))rNx;Z*^lWFbd6kZ zhl8JW;`%7e{+noxAd83A)?T&3YahAcJ_}_OCa_4gVw?A9_=kPWiWk&^5nBYCeX6yj z#vV%i(in~7aWCh|)BO?V1-aGQaH!uzX+T6*hYY(^37sZ)49f$d&H%k%fYEeB2$d@Qt(8t?=}djOqBExH zpCJ?JI&z&czzlY2wD56YRHadzRSRJHnH**OGB3>a!{7n`g*jFovtHj~T93%OWVa^) z+o;jV*bVKvaKAZ3H?P!AGy*yD09FjX!%j5F$r6J%-1AFv{KSd*41#37v08W91hbQXf^3jYkmdp97EB+UG}2WE(S=_s7dv@ z2yD~6gx_r o#iVn=x7tI+lvQsXrcq9s90k!RaGkd2uy>A2l%Q>8gSIwL!)8 z13Mql%I0a2iHuQYPuA|xyZ*(#H(jgbLBt!RV}~wcjew_S>4+SF61<@nLNiPiK6Gv} zLtUe@#TnP7q&4 zi$@mB6M9WjJlj7Zw0xTFuG+WX>rLJFx~StnJL*ao1C*}6ZM3Z*O|zy1kyg7_1jFPx zJj13?(%wW9xP?zAL2wplO8ihFk!luMczFvnx*MLmm%}uaW)H)w7m#wO)L9(W*I!9W zNdXe?(Io>z`|pznL_NTFRo=?mM`g5Z4aqc zV=cQ&ZllW?SFX!V1*YyNEn}Y73kT{$i0fk0Ql3bAIk{}GDd`(+e{z|7XC#-npSR1b-x&{V=+Z&BXiE zeA{*cqSNvADX)b)TDOLq-3&UPC+4v_tYaH^)g3?T4ruG$PFU9)bqwDbvWJO-r5}y6 zgt*K)2JXhH1Ek6Gcypr!&iQ&)o5q8vUKoi63thAhf5_8HS8In2D?1WHf{V!=#`x+k zm=V4lCL1<%qSD_w4Z-%x^FoLqcFSe83l`?jce{}6xnwvB>xv$HYp-09!%aYr1;YB=DFQXiX`^mO*arDMbKi2zll>LXUO3sBn!c4O)m$oSnlFKl@I)IBZ6WC|<{u}PEfuSRKUhmAHqeUf_5pd_Ojk7x z*IZwX`owjvsrgUy_<4H}NFWxQBKkr&trM7T0 zg$SeYf^OS=9hLBsK>Pxu?F0D^4>n+OQ>ac4+c>V{ZQn_`I_{lfYz40k7C$~2Zw$7> z7j<461)51YD!k8U6G4{V2PEq^%M6Ade9vM~-fs$zWVx@w10F3>(0!ys-OHd>axJ$B z=M0VIXDOXOt!w>VVv3|35yuI5{pPMz1f&R;ZD#Sti`8JmJFb;Arl+Kk=F+66e zV^Vizrd+`8S6ZgbxA5WxuaJA;F46!=;)mOVBm8zsj+Vz`NU|bC-9^oOVjEV*ut6n{lzj!Mc-$=Lm2on7@NbP6XT6sP>1XKSA z69sE+WI`4(gAMtKKJDU?#f-YXK0rVnX1nh9gEZ9^rAIk;C;@P)r(tSYNu?(c#q*=5 z-+k1ezKjy$(2ZyyBG9yADWiS)7{+Q2bO4_v;H#AY+El4b*m=>YJaHKHb~1NX)wb4o zPdKbuDPE@%LrD)sMtm2ow>{jt7~3ckJ{5Xk5F=P{1QMlLv5o2Dg1u}MBYXcHZr0^d z4zTh3OHVjJmktaGm7QRy1g2(!$+5nJ)h?>RLc268M2Dq6N*F4+_PlGHyb6jv0HdZ~ zm6(eC8r&9Lc!!{m(s?4BYLkL?9OUBj8|U7ylCVeN`RYU7Y`WX=zo!j^udFO^+oq&# z2@-ePd{TA4!Th!x$?H)Ufq6(?Dv;07koZTF-CuJ-HAG_qR3*BUjAIV)#mG7m(3PxP zI^AOZ8LT^(XG*m(gShvd()gWfnK63ge!jnU@s9H4(#3%sm6)d=ehKoe{1mu%Eqh;W z4ngqrgYUlz(6}B$cUZr4YJ{`+$_6>mm+YBBLvTb{X<>C%?lL=T0)68iVCXsd@6SFA z*qDdED46y3g@Qv&ePw@KM3H4>((0;>$3(Kb-)>QogBXW!wha~gxVRD&lD{NBs+G+B z69IEj$`=58Z2dJB1I8W9`%Wa%(k>zCIA1>gNXLiUX?k5X_8XouzkT`CuHQvA3P-Bk z6l8Fll6rD%v2=$>p|J`$ij2C-gnHR7$m`M;(01ZJg;r+5kv7CrAgvzTZ&FJV4@%RR zYpphv={~qPSIn!^Ncgok%B}3OI_VOcF$i_(FcK6NXrc?D02#B?BU58Ps6#NfC_NaU zu$iRs4ZpyV7u$XbVhf5_2!;EPqAO~hNF2@m7p%CD-*#F<|H!du{;8d^6pC?&bo$b1 zB15J)bJfu_VC8lrMafpCub zZ;D3xDnSiUZB_8{tw#6^mDGkbq=h}n<`cvQ02W4mT!>%N1V@>(4au=4Ig2H^zZGW* z>O@`%0(sWIv>w(jevi(zCW@!pS>p28q6FD(lS)BiMIV`*2Io|RIe2jPu8bQ}D^`C; zY(JiLDzA*$*nz(@Q^XtH<0<(F_}mp>u-uY$a4HHRu#;wXmRB_>SSS4 z_vEK1cIUU>CpyLl>F`T5Sc*`=jnw}=*vF~`OBS9`zJ^h(Qqm}rCAE;qDyhLg&k{+| zb~k)+hWBvC{EPlMDLYEqdnw!Bk;RxRU-68Ewr*0W!~Z_B}a^7`MADhw2~My_~>+jg;=&IK!N75~hYZ2q4?dN>N^ zXZZY{Y_rFT-$)e9>F~nX1Vi=^VW_Vd$*e0nk76hp*i6CxR0aEhQ%5eF7>}i)`&q5G z;$wipG?6r(l1$42z?w$k6$*zZ;Q{UAI_O?zchUP6lcPEgetdFzx1@!PAFtP zmdO`8F;UAk*X+Hy+D+_68!JYBOVcT=PYBsl42pNaSP6!N8N5a$3C@#AhOMcOqKlU#rRUo#QVsEt^29)%prgiF*xW1qB9A1UFn# z){-7@>rI$L@}BaF{cD>cmLEFq{V?5mInQWo{+gsTd_X8A;P138JO41q*Xw{0M&@~P z=iQEk%g>J`e)=w2#R%>6wCW14&kol8{0oZEkSv#$3*3#hcwIQ(RHKHBUMj zr`X@szzU}rkM`y(q!Jo_Mgb-HxswZuTs^!u=EO z7VH*MD0{u_sC1vIo9W`-X9)tu=0obq z9Ph;Jyna)B{`9^Qlu#hN2V9_~%k7%kG7VK1B^>H0!SE2+CNr7YT&(8w=SXr&J&C$r zM9Z=P0ic%X;RI3Ub^aQHwc4lc2s2Le5MN(g#!erP$Fs$EIRE^b42Z1A!}!~x%|7OWue`!irAj?@j0=x zG~%ry!G)cSC*NgE*)f#yhO#WGwo-fdzE~4vER`(nU6DwarMdG69VBP=+~pyuo&S1; z?<5&04wJ!$gN+4?op=U+81@GfXGALhPuX?P43a7Oc;gdGVnT2`8OnStQyUFbXw5jX zd?||yOi#JdLyyN8&4dTSW?E!u*7&AnCpMJtSUnutKeVex8)83r757dIjI|js%CO)3 zi2Na(;v=GE^Y9m*2aVOr-^JFDvI)-%p|80j>fIjZ@$#*hq{JsQV9spPs_c)yl0N|r z@6R}dPv|j-2&9Es1S8q|z7lr_!{OHHe1!Lv(u#;Z5g!;#llj-WZv za;O;NM_8<(-azIAKybqgl>wavQo}bULlmPmrLFfC-;TfL>1U{4xk7iO3*zX#FD}6c zT$l~zQJ4%nhaQoJ(8i*xMvuZl&6RHj3_2zaNW)ReLnT;4Vlu9u@%T-A_KeRq(B1fn zonk_^fZeZYW^t_IcWGHhE#1*2j^H{d)F?I=8TI5lD1xV^zGVC`mT7fW@?TN`Q8&+^ z?*1?IDDV9Azrhj|z*gyiqPHLqPo3YOHyicWi%CXuaXg#u@|W%LB7It9n4mVCiZY_% zy*$H^anIKdF49G(e2(}bgU^E@#!;i+$&x1n=(KPXP47E8nz(Qv4`^J{p7?OXqeY97jL#w-du>f>%_7ya?HXbQ8 z{-gCif#ioejD4v-1>nuihFCe@8EHVzzSJXB%mh4zCeGR|q*Sn}%&cGtCKZx;&>)Ua z2o@R7x+HDd)~N8=D$ax|jZ*x1a62>d+E|b{%bUu9P+0-TJa7m6Dcj5#np#@pNa|9K zHqP&;HH_w;ffVFpQEzlp`!>4Xh_|S~VoQMdLxxd1pETA>YKoeh5AD>;hAb4Gemfi& zmwvj=vh5;g9R&Gbh;KCnw=evOP%(CvE;HN|_kNgWh_(1c?4_S}e4~MIDKRatdHb|U zO^{(ipzCfI_3Pz?xr0Z+@hauyMQS`5Sq22_KDz#6vSinSE)Qv0$=41m6P%rb(fA0C z0uS8!9pFn)PFirYz!~O&8xJdoe%(==D&%k-TUKJ3qvXl>^QFn*H#47-aa28uCa!$! z;QpON_z)&GV|RoL`?_HN@8ctcT~1eVj7JP0^zP^4LUxKZTPH)>%aPZ#(!jN9c>0X; zq6(=in^vp&hHlLG`!r^-pqN_VonkcAHU+?gJYG)ya6L+VHvQg?o>!not|4(SPQ5YF zYZ&T7$qq}lVTTBWBM2*Y2Wj|PoIcB~p;_~@OtUPL1o&%0#w5IqA8L2<+HMAL_d zZXb6APD07~EwCgIOrMnSYV_aV_NvM9Z4OZp7?mL-yeVM!ML3V6`o4i}wL&br02m(l zx+}S9(>D{HgT0ae-v`)o^vG{UY&@$@C}@+*PC{da;1OkDw%-mC`%Cz$xl@3n%JHZz zAUIR3KtIX}MbxYd;Cymr*JSt=avH`QM{Ed#C#J@a8#3V@diTJE&nL=M-Htu*NI`v3 zvj@F3?Z85s2BVlt&MfR`O|Cg5__saC)n}i&NnQvDEty0dXygLqb z+72V1#4hz>)qbsGC%UY1*7Q;CL+HsQs`yPwB5&O4RW|g->*k7q-6n6+)qg+6BWOxIqvrSiH zzYEfnZAE^e%}NlrU5tKS{s!(-U?2ylU9Y&=e8WitA};x7?gBr2KRq}9cB|Ui7-f%z zC!2e>4e?51urE59YFo!4Bod1jGq<}?NL>TGMsg^96*6V05wwKkyaqUZto~?m9>W2m zRUy4V>fD_?vGWU3;u2%sl0Awt7g|eF>(h}9L7#fZ#L=sj!s$C8)Ra1n;HrrRcDu{( z>?>pLxMK3(0m!=C zszO{afpiS@c1Q;RPSF z&UFICkDkU9``b*Q;n?qAgME^R?G87`DkEShMRc+n8?j*qD3Y>-;bby)o7yU@2=FpF zoHz!_5|~pK+TWA%D~)Mv#1d6IA1U$!F4_H`L}i2&w^#zc902yp2%8l3RM2jQxs(TJ zU02p_Q~$EiuRJT5PU?}1{Eh7Azm%6=efdhUS%zSoZgM+&?>9T;45nvDIv1A_K}={d;4e5^JE`#owR^V^jsyh zSf_Nv;m=3mhxc;cwyRo(*TzOh5~m-8QULT;Go57&ogZ(>$?Je*kIIoZg~4lJ|3AAD zEVdcE4`6KU?khMel`a?oDW1vobDS78FUAKr5~Jy-c?5eTS|yd~K~l~j574?DzU4=d z82%XOB%?=8GpiK{KVmcf8Tn)E5wgN3OFqLIpwL&rak8PPqZ2iYBn~rG7X4EJFYA!y z0M=%z%=3!A4Mvy_cQ6w8ozWUaRX?#9NWr^&j6IsMO7G0c!9|6bvzT->XtHm|?w)7x zU6s)pJJ=qafEE?DQWC`*VXhU%I-C@*I}dH?5z-`Qv}P7J==q-VX8%EI}1d}((+=6ceiT@OKmE+GJn>K*x#yIMe zbaU6r*}VQXod%C5ALZJbjm&+zHCO_ zC|&q$ZATXr9cn4!8Gh@XD0Atd|M=pP@QHRw=b3vql}%g|Fve)ph3;gs&XZ8GT@5p_ z66~l1#_Z(9YkW-F=r3US>qqtL_SbJ9$dLl|y#qy(?tpG$-Z~#&z9`EJt3Pv#j00Ow zkeiF?i%E+0j$D0z6fX0Qj=_#IP*AUb1DRYqL^}b_xeoHI0pap|Zb1B6PZqa-zwVZ< zK?pT3dnTQEvm6d9-o2#TeHHV7p2)Wa&i`>~4(u2E&}J?2simKFZBIu%x?}lBC&K&9&VJng zD`-M{xAH0DVQJSD2p(-3O*k8yCg=aeSX)Dk;S;Tl*Moq)yuBd;B!vicGwEh`3l2B- zzaz*$y4(if3nvd}XMR(RMgWoS#`tm3Wiuj1y^bn{VyEde0{2cma5Wu}E4cnt4t^Xc zA;h_0RqV!E!Sv#xO#=j1&c0vn;AR(?>_peAV%;N84+?Sz`XmR*)mPf5ztZkMd9TJG z^zJ!{vQ0%f2EQHvrGW3*=u-Pz#D8xEo~I_S6w(aYP9`yL?0ZQmh!i@e;<}cRRVU zwD|^2_Zt|)f&8PN>^H|3mD|%!0k!20yR=#b0?)x)l6C>Y*1q5kZv(Cb9diY)%^Z4= zn#0RN0`bY}7a-^=F=K@HJMo!Vqo>-|QO7{0EX$Sl^xLtAleRVqI8IM_`&w}Akg$uQ zXUy8m!d&a@yEU*6H3hRae34GzeybHm<%r5rB5HuJN{ip&99bNUpH;$Ok-WDZHb|Zl zNAW53O6hzupxdQfr*!|TC^{QGY}EI!Y1tk&)61NTenO;>UncdNcPHe3A(0}f{M zB?Mk&d_a_QOX%HB%2?kdc67L%nfChA`z)E>QSxS+*IaZR%s{f{GD?n?KO^#VCliDu z5`ofsE9>~HUjK|ud$Bi82IM{MHT5g3m6;#&DvvU)Pk(j_5uA^UVCE?Zm&^9^lNzZ_ zku`56|4k{|eGxVfnCyEz!&^{7jC9cyPcnG+K4)kh9U|w9mR&z5(8m*2!`zOSZHBq< zmC?NI^w~5=bnt(>CDu51)~uxCj7E;3j|n8_LQ7dtD-D=C&iNUpB*72x-|7c4Sla})|qUDI!3UnIqlIh0F+wZ zkAh@8zNXHW3jU5kq(;BtM*UE7>{72E5j^EQ_~myv?gLipa7-yvSU-U@Y2uligf@80 z9zp)GwH+NnsXPzzxI)f#5mi=~`i4svaPWI#wBGhWXh`pIuoErd&RDxIQV+2H-55Jy zS(jS$kqsWH^p+n)By0$QVO_7p`oz3V6?vmXMc_sCcChr^Bj+8<*@5k=X&oNq-PP`E zXRKXeZpQzGA7~eU5@G8|a8W(O7$Jw$zJccy3?T~c{+Z!qe5%4~h~!%XLwc_7 zjP;bn6NM)E&ig4nD_B(+*njW%fkUk|4Osi$+D+uj|VZIhBF6Ml+FFBB~!COh^T0^JSBaKN=6`83yU z@rN3p82M?8nt_RH_176$`=?&0NOY)h{KLB*_&F*}%;P^=3bwWa=Y1{xB1k=oY8RRQ zVo;v|Ow@OtnDq$_L9UX^wWkWg3ML}ZIc;kVZ!FA==?YbCDME65_vT~?XbM>okk^9)0|H8E?&+yUq zv;*nkGa|??q;&W*(g`CDHZlQI1u-6W?{zZ)+mJtI6yc|}N%-|mBSN+5KT(BSuUm?^ zViz^~rs)c-?M+D0VET`q)=Kk4eangTse{AE8F_C}7T7|w{H5~-~;IV{ArXwM# z=O5bcYEJ8~?`U4<94a=%E{-SoR?Om{(Pao)pxch#}_N>`fTeR zM#)^oYA>#Qb&9<-5^Z&0oIMWhI5Tay1?DY}e%C!|V{^j{L{9ntyq@yk3ogttGpT{wki|H@t-hs5`RTj*vu%-g7wZ@^ zJM>gDbyb(QZ@$kV0-Qm-zBmEPtm_wlo&OE$Vr=J{QD`l3jH!@!OwI>X8=;o@}x{@dOi< z1P-SC+~q#aQMwy-3I5p2aS|2e@Q-WF7fnBPG40&*A)C$TDI=gIgS3O6fJ!`JAO2w- z4O04fl2u3Oa8ttWsrRYZ^ZZv(^;rqIhSjv8?rK=Y2Sd4Z5tYswd1kD0MbbN$omuk_ z+jb}7I>%YfWoN_mx|CX=iR)lqt(n>)j}DIXh;T)ss!7Co#Id#UqXr!n&$Q?1KWr4I zJ2FM7JCl*XDk+`gK6d0ENRcjZ%%}QTiquQ;h}ipS;3Q4`{cew$HawzS`%=?w)il3O zt<1mzt6`|*j6NdjGlu8Y%(uGp!d7Tj^M~_cV=Fz>^T(gFK@u=*{~hRihGclB6)OEV zU=Xk$8YHk{h3+s}`&=ffA$MXKF7w-%Fr=!lZBllrpyzXuu+wuB62)9{19e{J%?^`R z!O+d^cl+pKveh9-jF=L&zo$yXD5srkl5ZCs#&$XKISVTVc>0ludX&Ov;R*=1G=Cp3g)Cv7sg_eB6f42iXUL zmOicr;co}XE?YcNxTz0MP13Y3C}LjCV3Yc@1e3Mg>7I88J(jc0XY!J+sOZwTkwkGY zE97}G5K+Zo>aUG{+wcrP!gzy#DBsY@011NpBo;5$`bJ2$rJ*;97D~?E?>J?$9|e)ffrruog= z`_+6j@cXT)r*0&n_$fN;gVLp%{Jh-`Ip5XK3-56-!kg5m7y z4tR7pHhBsTU5E-s&NRCcVeekKTh?oN?EKAo4R|*$OF`-Nmt~rt`*p>$#t#rGzUJAe z&V1O_pN@r5IRf>0*zsLeb{kpse2Vev-nik%J3I?V>p{bJCU-lkNznbl+xGJoiwC=S zw8%2|`(iyoy=Rm9L~l#zI|E+&a?y-n_{I7ko0MXI?f*pP*{VD_-7D9PD&X1iyGf?G z9;9y;U8t*gsWcMSZGn0QhJy4)*^Xjgb-;EqiyR2dYlvmxu9bG)8ZuST!Fqfb0CHScC@1Jk7hfyK zoYtoY#yu?Y91>%k^m7Nb2woCeVZ*z1=24{fF12^0A_j7fY3xwSVA6gY_!|Rm;Sc=r z_tk2t{+9T3*W4_dIi4{0vy`3gov* zXr>c3709mZn(aFNPYpuJjmGQp=yw2LdtZ)Gz0c=!B-naElj3}j*$7anu6AjRFT%Uq zkPSk$b(5VcA=dYfEP*Z)VLGug(ERr=dIM1MeabPT zZahQMylAHf=I-p_#G&^`c#A!GBV-O~vaBt-IaMv_ z%`@+v_DAuJwEo*zd$%i73a8mKr^#X+AfMYoCaGZ_Nd;tD9%bjsge_LI$|9~4I4cGy zvt+c)ze2N{eKbyFy@i)u$qb?2z7DH%#KsW5{Q{sb`!m)P$xgLa=# z?}&aO0^#%;P zPGMNu8?}M7fjP!VesXZ2Jqw!?rpSB9{2j}mC?p?G9l79J(|C+$)_yc{)HvirL7Riv zxV92eTVJxP^qXedq&&U-%V_dRS;wThIM#ClH=S|C+2om6dWUl!ntP@9#+ORq>2-YL z8TCj%oJ=`^FMP714oA~+cs}m8%o+C2XAuV^+iB{RHO4})BGdeED4Drz(&lY_^>Y*p z3}avXP2XdCZbo_VJ`5}Q&nzg_S-XdeMq8*>>mW%nQJ~vJ1mJL&u~Wn+$(MDv@Dm9^ z|4QDv@L>O&$q1Pqm~Tk9EJ}FvSJ;bNK3#3tPx zs2w)cn_MrRw#|tO4akj@Re6hG6|r9L6PeQn%xyq&K!Z}y>8Yr^VDPc;wB#mAmDhwb z+k^8ERY|PXeZgEDb;`7bnzsI1Jvr+bZcwSVj@nl&Xy7XHVEeu07~hSfW#O{(;vZ*q zDJ~88dk^k`3^cW_ZKVQ+Y!tu-MtiO#Y%~%gRY1UlH`44v30!`Yb6ipaIr>^Xo&WpV zXXQOMGvW6N1U8dvOY=TH{TC;{Oyx>r$m(w@DFOa~1dL0awU%^CiCIpB=+pM5&)v0s z58**fw2O)Cv{HT1vCb3Gm$d4fZ!Nh*m)!ZoTIE_hnDmU<#XC5Psuf@UXA=}eo+sc6 zc`b~{1h+rkte(h4ANBR`_EuHXF#-WPh-|HxtK=r<#|NT9g9sqREf(cRgCB=staM1b z;oFX4fiHiit;tjIk2p1z2v-?fNqZls5}fzNL=W?zpdUE+!>wQ^T;zw3^u2l2FVBqiO z{hF^kM!CCmfyyo!oF5r8>u3qm1W_D0Q0V1@KeTM5|6p54YM?51%$`gT;~CKGZ{3Gt z&6WE{^UHEA^Sn5;Yslgm=jWU6SQ#8_V263F z)PHJ44fz+m*CQU$Xx$a^398776B__--YIRru|ub$51l8NV-H>Sq?!-RMy5TTut^W% znv7b-yuK+07fod}I$h_0i$IraC(O|~AZ{eE5UQdFc2Z=TiPKA=x1_b8(^4@_d;VD_ zmuA-*BDWyDKdX5|oG@lua9=!`RUPhtJNF^pH;sbx$4AYF*Ed(@2Uxn$a17n)k-N;4 zHY5fagCq{t$j)zu`43yV4ZRg0iz?)BTv#1f!}dUxH;_&Jp7v?D5M=Zi!Lo!H`m*N9 zGI<@QVR40tSgi^i%1p4B25YhzvyK7k2?7B30E2mjhE9CG@i>;>7EbcvLMS?T)SFVj6Hgi_v*riF z+@#BzUi2GqCDSmlVx!!}1hmrmMeqTjN(NGbToM3 zucy+ltGSCh2iT7&29-Dq#yOlKqQ02}Frti{@W#(B=~FbRj<`?3yIkwrc8}7c91HhA zb-T^dF2-D3`@729!lDEZE;!G1G~GS@zXL&Rc2#;(qHCz88`l&`w)gU0C}JzcQ7TuK z8OV+lubLdSa-=hl)*8WoEGr@E65cJWuE0wvysd0LstcdXN3@$GF}dp@Np{1^U-Y zF(6f{N&!GS-O7ezYcZvh*GjRjDP0%wN7v*brY43YHZgf=LaWX=%B@wyC_bE{T%Gd; z$Ik-2ZLf9qR!p>y`#Ej@-R1y410gLOI20?)HI`%1s;V0Jc=GP;F(0ICceiWy?PXRJW63Ha-Q zr#AowBm@93imHJQRhkk!hRRrZ*#E=cTSry3c5UN|hzKeTBBeBvg3=+vraJ`$q#L9g zB&53=q`L({2^Hz?6qRPv-F)|A`<&;T^L}Ie#`o`UykjuV*}~p?t#!w|=e*`MulcO4 z{-Q$v)yaE@pugx5&DGcmG5%SEQHd<04%q68S^3LYy~PuvwDQRQV+T2dhl!roW(iCJ z9I$tK9UF&+Kx4=?Qw^{e>Nn2V$O|hdSMR)Mj6}5-AK$>tBM7^9H5IbhCt0GcU1imH91-r0DUW4ixP(|v!WQF?j)^EA1S3gX89^W*2LbrUOp`6A$60SVb#kb9k|jL3sGh9@ZzelykpS&1>UvO zWW)zo>&RrGM0Zb?y1j4_2?2=I#K(_b606}R>UU;kO68_Ma-)KY32CTk+AGg4&Vue` z@ZO@OM58oa?cys{mXYa-XZQ+`Gz(6z8?R zk-ot4jVfUHe2uNaG7^Sw!h@^0k>G$|33MCU3gg(`UK@Li74c?~`_3;Hkw8H2ZJq|K3ERT^%-S_0vI|UxE6UIAiJ;8JEiPK37*NNjZzW4ZQ3Hrgn zfy$)+2`2Kz3d_6cksC_vB_#3G8C60173>z^d`7BiU7n1c20xLhF2I0cpk>-Po2R?1 z7HotEcmu`#+1l7}U9@!A5yfNl-lE&78Z~YoA>k4e(%z36>0Jw^u6wtC7Q2J01PL%? zeR2nC|ETRGP<$i&ph#%i(wZ z&eNK7YKw3%)(OB=c@;ctP6!HTs9SiC-Honz(s{9wVum; zsF`BA=u@EzMSR?6cUbw)eqqoMOE;}ZTS+XXdp62m*Ly(3Yyo9k4IoO?rB%`)aD0XEWUQ^!2d=?kZ0M5w6m>R3ctLul~p3__l zW^Q!)Z8dCAIHguvw!y`?L}XuT3Y??nZkmU%$W%S@h(||vSo3-tf56E`F&59bXFN{V zZ<{^b@c@)`ai}iil<|?iyV@36^lR z6}P(~%$icsl)73RUlc4rn%`!DI*!Kv9eXBkPhLgh+)>LzvxfcAU4decRhcZI+jbyF z^T{UeAS?Sj!T4Obz=m`^7{ej(7;A7^w}PpZ{=R`}OJZ>;A`Fnau0EJF`;-|t`xbDq zjKXaAf#B3>{HxqR8_#6h6RzU39jTes)ZX2(63vE$rSqZsD^6PT5q5KlAdP2A)^JgQ z<&rQw*|! z0~;UtN7c<31!mW1f=I!?sJjo92TZEW=?4>HWxI-(-IDDLxt3O--kh^Wqb7~g)dHQA z(!w+JXloTa1+wm)yQyGg(gqpa)v?qfPFW|VCeGY}Dc*RQNyiY>h@%{l|8_uh!>nq< zEU_#r^X#WyXBJoITFaA3qV{VIOKM8x#`y|)Y8e2a>ZL4^A3f9+-sa#I>Cz5#!JjN z-DIQp?r%-DLug)D3h0uNHIO)yPU<&uH_R?3eQCSSlF66qYm_o^ELjE7z`(3)Mu8jjg8`s<}PuYYXFEs(R&D z1Nr8!Bajm|D38gm+pew&be|&$3hHSqtAD0U7Pl%{%WgQ^>Ee?e3I6>JLtvV{5(+lEF?@XCeO&|f1{X^3o!6jP zdQ;>WGw5FM>eA_tgPK}rZWJZdu^P4SM~!lSg;k>5sk;!BlB|S7fUfeg`uj*ePEYu7>X9?w%=sC}P?z^nh&5ThtJ=>-=dgwtnF> z{-iGX9E=Cs$$eyKi7z?O2QrU2X5DNf$*6?gwjK&ddXjL&VuL@d!*B&P7!$|8h zwBI;2*)7uAFC^~)%||tq#2e*spU6zRZZ`0dIPZoN!Tgx$_x!De+5sO)aacTkZtjkK zR890&3U#O&9)Y+nZ{c)wd^H4JRVq<@V@ssf@ zXwp_v3_F5HcmW+*O@A~9y7xO?Z*gHlZwtv`ua!`h8v6CBZE^T(()|?uO_u> zHuNHTJx=^sSPWfRgEFBGofhjnAT`<0U5=!mAx47VQ^KhEay!u~x90q~H9xJX&|$@l`$gnIh*WFK_#wMN(4+0luxs~cfD?NU&- z;!XaRl*;>lErT&Y+VNmVp8Q?Eh)29h?M?3Ond<8>EQw6us(0;{&y+<4e6{(Ga_l4f z^1fb&FCMPFO>y*AH%;jA?LA6%gPB?iGP24DsMl1Z0H?6~Oz*AZ9S7Y4V!-EZC66Iv zxbOeazU!bR$J5!JxR5(9hoLcXsmPVTsB?fHIzsQ`UO%R-q=^(pP7?lE*XLe(`iT|h zcS@}eYGASXYt0`{`F%m*XtY2hJaqlAlABCDN}#46$(6!CcMCnQA9X=i#r$X7R+oV` z9!?~Z?FycKE6VByPY5qNZC_QcvWnXGT8oT{8c$ZDF6JgTje~#<-5W-;;pr?bxux~# zv~I9%f2$`gxH^r+r&hRqvr24bT@ovhYx=q$+5E9OxjKUf)wk4bB$(z04eR^QM*vL#7I2Q;k97xvewQEHJnL? zH0ox7}%cN_5!ef!FmPx+ZqCX+B`p>jZkh>Ey$ z?)6NgL_PTm;1lN2d#}-(rVWn;s{4)ep0+%!kfH z5*poR_#BSfZ`x1E%H96t1_l(JDuL^3pD)cRjxAW$^7N}@B9M?}d zM4CgQ%BYWNXVHZD<4F9qm9_VQqqN80!~3K{9K+Rd0pm;#8mjO6=lU z<@(3tu&s4K?WwW2Wa0SwyZ!8OHi%w}kLJ*ek98y##hS`iMYqpFAM7^1eOv)qo?*(j z3R%hXeJN+(uEA+(F!c8&s?$xdvQfuDt(xtO$^cCLsYs^rG4ACN7^~qz~pj z(jjNxGW$EMw!ezzAD9)(`@UH!T7f!!i<1JeS>6H-TAdsmZMx$f6AzTh!M!TMPrrld zd|EM4-ph-w6{#=Y=sr8*XgZdj)ql_|Ou6)uLx30yWU5)7YXfEEA&B0-S^BCEPLi`5 zUu*WVo8HSf@9Ic-c%8u$Gk8zg4L1M-84`h|ckLWyn5qBrly&#l9GSq8vG-SBlWy9# zHh^l_hLvUk9C8m#baA0G783)B#mtwW>yE@u``IBu-Bo6xF-Sxmd zQcx%TsXXHK0oOaR{@s~$b*f+nY;mV7-^#g5t%Xhkx8ALRx8XPN zy{e3Mvwm#pwCz=Gd5RjM6V0li?9111)g7GEs>#)?m4Ca}NYWTG{u1;{c0YM$kQwmB zh9j*u%?asJ*M)G-|Lg`5nb_B$JdFxwmx16j=YR!9U70%fj$0J1)Qk701xR%oxCwPa zytf8ut(Lai$Tn5fbqJp&a&s?)+D@)GH8!R1CN3d->^m{d8J~5Fh(T00Kv~|$e_FjJ z`t8yjO$`o~+aaxXMR*RKjJlzRmhcISfmBzqpPOe|m_3`?VF2?U`-^c=C#M4-Z0q^B zvqF&KlWCwDnlq8bwO85U#rRpZG`(vI;wUMibrO49UqE^xiV z)x07pFbAH^g4X3uEvygPcl~GAD=|^h^d8+Je)Cq~M!<6srKf2ozQIeiv;6mkD?1J9 zw5qUo+~z-EkTAaJPo`MZC6ga^(wYUnPGh)3Lab>QL%2Fkx|_}R9m+|%7hJ+z=sKRf z(dLt?Yo#BunbOQ2u~YSS>58YXQ%K7@^wJE*#{(L^Z6t`U5^cA1$}w+wL}}T*@_s;GA$>ZU3D8?X&!8n&+XhWcW2J?cuA$BsMT|5~`iHD*l{Z#z?_R#I7z$ME{RWXszu(mKtY zIsr|(mo1tgRkajr?VB;!s@4otD<8#CwZ5Jt!Q|mU1aqZ`@oy^x4U!7h0liV9$@?TZdLvKXF9% z{aPiRiG>ZhCLfShLg2|}dU!Hz; ztDo+t->mWmH937N0Jz&(Sw4#U&3jj|bE#TJbI6?^UM+6|d>cb1;1L*Z)G7A~zn;83 z{b1lhqeoBlIO+a`* zkv~uJ=Xo%ZI2{{-i)I?T4>rkoR@8_@u`uE-dg1^js^GOSt%erR|NOa=);#UQtU&c& zxbmOx3ZZ~5xm{e)^N&j+E)0z&G5})kUM~#7^|F5STE}e&8Ut&SjrQtYfcHt3Crc!n zrwRkDHm_T}4|rq{W6?;^g;pbeu|ws z5`f2DY*kvfC;)D}pW%HT~aG(PjWgK96^8Q-Aer-O4jLPTS*nZ_P-6#{&3? zKS~VZ)C^y^zqIL~!trd-XI)=cuK6>Ne~kku@Wh3E(<_RCz0O7@w(A!(fzU1lZe#X% z6+q6HJQ4hijYq!&n-ZzD0S-I}Z~`_Acem#2x10`_X@asm79dN>5j=>Pqrbj71PdCu zW&MHzFmm6h-hk4KoK26zPv1)PA4s%C-Qfb}dJy2|bMU=gkkx%(2EPi=0-oF6-l}-F z)RKO&mxuIK%_udte4KA7#Wu)Y`c;80P`Y(%op3wu(zYbW-d6)Drbo!xw5IKWDjdnu zufa8>3ACKv3ylLcpCK>-Qz-MRMP)Jo&d!pBLHU6}0GDmo%$c(UP;N@lm&|(tWKXsp zD6cPx#cwXFY;rVihYAx)dFh@^K@AU?0DjKvdIBKLsC&Fy&DGO3T~xX625JBVKz+U> zaA_hLZ^e?I%;)MbsT&N=N1D_avemlAHd0q7o*mz6C~vXFe+9wC11R6)W7&TFd4b}R z<)`(yAG>LX*&0?2&(}Rn)r&hK>;2gFjPTTKGgYj8G zUK4x>3Y`*uA!{Ahk9|nniOFMGH7fzgeTfhT->@t3>3H8Py4DtwcBKapGAB^71X@bu zO?Si8nStIfAIWjkZt5oPN+*5lDjz`Af?P(mJX`d{e&=gbVZD>Lqp&Vz5)NTTMqDP0 z`GRnOu5Ib&pMpBfIsu9!_q+yLQ5zW6x{-iE%mN5M^T|Gev`Cl#WX-1!`(V-6#a93j zqlSUoC~{M^=|nl$eafoIy^Fyn_#7~kg?%_VQpZ^?1Pkz&KHOXStO+EMZk@d{|M<(V z1W2>h+n?``)j~jh=4Y{@9LOX~L1sNSx^WfXi;hw*r~Edo9iUFHs(l5iJLAhA=sfIV z9~ChO{F1{Z!9@1BrfAh*i#Sdwk_A_G8#a`yN4}w4-U+;u_4pd zd>`v4mya%OT6~?s8q_k8j|&ueo^b}fe+43y&CAi+#)VHpbUsMwJ4fHttA;#S8-QLl z;~)F|h0}fT{?Jtkg%(8!R5!vg>>o*1m z&26vcAgu;kw@`%h{+FB%#JePJfxP9Sj7#>I+jAv@{!4|2Efd@x)mcwOl`^+&Mq z>VA}tZ?q=*R?{;xkItoV%(xVBc0dc|{%xckdHtqdY%F6|&>ZgLW%_Ft(6`U&DT89b z5mS}#Hr0jw)@k%*A}oT;75D=bt|d9{kEB3&Uwzs!0XRRr)Ae+&lRKs5U(q^Z_#3T2 zL4}>R2zv>G{E}%=NgN<2UXVA?B@TiWY%;3_>fHvT)Aq7|j|-~?VEYw=tgi*^Cw&Ks zqs8f}Ibg;%*-u{MD*;fBec@)3Vdm1u*#id)-+RzG3ypE&Zglz?I&0uHS7?n2r`R%*x%+}|^NHoxM;zqA9yy!jH5XwLV`Jf)AG z-T~#D?BBVzc?+ZJExvP*&tX+%OXR+kXaqAJCpu=JKS^cEw(w7#}|H$3!U0QMlcI(uy9$-MvF^7JW04+!5m0;DWv1$O`|#~ zJSiio82QQ8c!!mxy1<-Y&fs+_IvRbl!orQ0DEW6{2=yC4A4U6x(8SoKj_Aah(}&St zsuF{1Ns`+|_C9q+E(znx+n)?sr2+vsIgmr|xC{|(c+=U(44>(>o+rZ13QVC{fT~!% zRvvBv5UaOnVFIt|8x+gmdiB#;Uoq#@62DI|Q!xo{-NN1Y_g;Fsju&$N~A=fMn%$p`2CUrUbAl^>#BYN{Hx`O zAD}TVCI6jAh6d5bYzno-Iw?d}&%-?%IHBa4)>lZC@#(DF?(qrKduI=zNll_1+zgP> zR+RmDdATFw-cTqH#!m{hB_4*7_=Gkj7w4|;7Z#tndYf-|IVjo24$8uT6H+UxPQi>d z3_zwsyzd#lM>Crq@$3`&IAp__a=(KaeMEQPMU;~RCO`>qL*gY(a_=Hm$GGSoYo-@g zqJHKM$TE&qC1H5SV0g>h4QzPiKx_`98FraHVp&yJ_<Z@Z6NjvthtF1*qG&Nv1K zk3UFB-1$=0^F&ehV4}~1eFC?F9KF-MYJrduj5uL~;Geu!0u~F-R*fjh3o=0m%a0(wbVs1<})_H=yMT!K#lIALv6Y>j0W4R!+LDyEw_6{vG} zUy@;=d9Y#+bwPbQsdlH7a1Hp;r}dl00SjRX<;NxzCrp3PE{S!s>k410O@Le_1? zo>H*!^#w`YNZ{!-pmdd_>R@V=ciwHnrB+7m8#f0DPXftuD_4w@vdZ)#oQ@t=1bNpi z50LfcpFUU;EWz}8kJIdk;jPAl&*4^AL~+L#1N2Y<=qt81?(A`|<8S2I9{6U{|z`yJ3IXPDF7eKYW*SYaE zs@g6ug!|__jp&(^>w65+6P|I8PoyIN|;VFaIJU- zn?#=a5a%6xIIPZ>8M%>MT^P@?rG1Y%crEH4-(G*|_ZYZA(gP0^mL`#vmWMdEVx_32 zfKIq3q3<(H4}$w|+Fn}&kcZw4|Ft{rP+C6knNWG}MOGMh&`34Z^vEXjGM{WIgEsgL ze_&LAmznc}=czmJgFMUBnZ}=SQ#dzHUdDx2X#zGFykzP}A@_$Xl&&@Q+P(LYK%<~= z8A&25)nSq@)orKaHkr*YGum9K$bRym9MD=Mvz;vxuh5**!r1`Elwmv~H&ZkN#DBZ;qWiHYSRT>Wk6&20_Jf$5Kgl z1NJ9u%iO0Xd&0fjb~Ux>jdUef8z<;3tZ3)W277{4qJbBm| z1<}qgs8UYNH_vDm^zUJmjrY&&n;J7|lK#cinIrY}W3uk|!^9DZ;5jj0i`s%d=ZX^0 zk-2SXQj}=6FX8P$#2AB%I&U8Lh((+NZ00~duVlIqFc{sT-dzhDpn5V*d!`b_*|KmPS#`H|c|B-dE2XUI;>3Ff)TV3T|0-Q~DaT+|Mnz0m?z?M>Vw6{# zk>Yknw{C{o60@qz$h#+NJMbEzD|-nDY-w-RlIv}#VgwnW#yzzRM=u8M(ZBj^?>)cet)>`{b$zXpQfWdTAJo# zzd~$SaD(=ofivkyMGkkvjK1>T@-Y*F{l>$i!F&U_f%v-A_iaZd(Ex7jU#9SEnx68m zvZ;GH2)bGVDH3N4H8%AZ(gfXC3uLIGtw;BCO`r1Hp-}Pq(2g-U3{|D=Ghj&dTLf8` zxdcA#G`oJCocp#tmkCj}aJxFrSs|vU=F-5Y)4S+9qiz z1?K{aHrDykxSyQ^_DhxjDwUf>JBZoiPz3~{vkTL|Et9>EiB~gB^upB~Sxj`YL_v~# z2d$~Uex3^fcW<~Kr_3_=c@r{pjyfNW?vH5;ki2QWPEtkoH}u4@?J3)@W~Ke;eA=_S zFLDcee2j}a|NG=uqX3q{u8i!5LS^6xO{1Qjj5QrllL3KRldMqo2epgg7OtD%M5wU% z^nmFfPe;z;0UeVbOHz#ZUS2pyz`aVZ8P^SNc}jV4#fk)ub$0$O^h_vvZ*&K};qoS` zj0oCxVj%@)O>mSnLInj<0HZMX;Dq>bCP3X{k9!ng5qrSB{k+aeM4R3I38?KJ&+?zH zMO!wVA8-xEI)d&}p5lNv@><=pZUKAf1MOvkUYIz5yF4eOMj0;)i%KORcPRd5G$0zX z&w#^4OQqK1Kv(=al(lr}bNvwwk0 zw%emYWcg92!W}3{@FYTkLWvRY9ATs9cRW?|#GTBjaX5fNfZXy9u59gUVNne@A?0KV zPBYU8KL5N4BY{9|`B4B2yqeEzjBnh_NeerJ+>Ri-g;)S%G?l1+{*4D~xWYSj0PAX& z+<9gPj0bvW&M=}b`s|MIrDNK*TqJx8zF)pL zofE<9G8SR%ci_{wcl)pM`~O{R%`Y*<^adoJDS*{Miwr24O?VQRRdRHz&jo#dHxsMY zlDe)vnYB`3XoMK7j|Y`YKCfF??b;dMR3g4-fQ&|Mn?L=cVi!!=#L)Yc7vr^nWpmu9 zD8rQlLZI`mLs1PmUi&BzPqyv8e|q~pX^i@?1=g5p{N-5F#fR5BK4fRj!C8z@#oX97 zM6)@JJ)OYllH)A_kZcJc+h#ADRr6^NUQ}iV*y_cpl|b4qX?vaYW#)Q`OMPQq7K`KM zebQP@qmZTg+mA>(q$o!e53=qOKZEE?#h?!k0nj~B3QO_zIFQ4QQX9+$W$CjdF9~i@ z*L_tg&*NJ+F@exe!(YF1KuZ{Ouz9dQ|tpzwBLfunr(Ru;_%wkKsEUsKt>wc9gG8UMS}?-<;a50dEuM% zm&vG-Ro5iS+}F(%_ddKbthLx-0vf|<`aXBrw+zbH;>w09fFm!nZ_@NPvj7FO#@G>T z@Bv?P9*pA?H2UHQ2tmuW0-21`=_lyKvmQNWT62=PPwcy( zEw^D%3O2jNKJQ^&pEN*6Wu_Y4vb5t2JLVeS?Xa$ve!B~M**CCvM1WvB$Y|H&??N;~ zPD{n_LG~&yOxP~Zc5Bze@5acmzoU1bBbpU6O0gEH2e4C=G}f-buI;=E%)YDbD;lJr zLil}5{h-U{{X2XK9E0Gh4Z%*9zMh9u1(kna7vQy@EHK-@*i`P4vs5C#5Zr6nbT3Ol z!w&^6Miaa!lKKF{jBvjg;4HBD>U=nqre#eRiX9cs7QDR&xOq%Zr0<$h#=IJPWh*@i zreG+P<3~bwpM0T4BiH8x(+-d{#GGulD~ta;Ph|oORp88bAe(nH4wi*djqRS?UPma0 zqZIP5iN(dbA5zea`%Gm74B4HyW_0bN7tEMuDZC-P5?Hv@QsU&(XTmKhiifclK*xG} zk3iE-9zvev=f7WKHhL#q7>0caK0iit=CmB>bUOr=DW3g@(_A%ROdi#6CCPw6Lb`nn z;LgMg09~ANUxo=>9PJH+dkn`a09~m-k9*MuTC)#FvwG~i3cE@zoe{wYxLeCk7KacUb9;^+U)T`#TGFG%;dn|)QsU)XU zDgDt5*Uz^%c#nbFQCu%1?h`qH9hPKW=nldvsg&lhBbE6^q*^l`g+U8o@T@WD$m~70e8~3nAo8J}>cSwg zY%Pdz@;=b&r1@d4`4%z<(>>(nbzS3tzaIrSy>|7ZN!u1I(P~o9vu!bzI$p4$m)b=e zz=@z0*=Ttj&buRK1_-1U04@Tjpgl}Y`MkI*%41hmblHcikSWSRSNuVkeRLta<72Cc zrCg0oJ-`u)Fa^Y0g6QHR!P$?p5n z|Jt6vJS)hARzvqU*9Ylq?;$|0(j$}Xa?o~{lNDh0>BvMS4sPW|7ZcAD#F0D z?1}yaXO*eCVWPoF*Rbd+Rs1W~Z35P{lgu=?V*p%podYjR20FoaXZXe-N!@B-vT`*Y zCUT4>Z3J8m<≥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%0D%`9O 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 diff --git a/documentation/en/.gitbook/assets/storage-gc.png b/documentation/en/.gitbook/assets/storage-gc.png deleted file mode 100644 index c55eb38a7ec1253ff67961d047aaa2973c219e7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147265 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

        d;-1R2v$0EK9Lp@1p6b^zLsdQ@+(#89 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�W06eFLL%eDPL}7T3TN9M))U(=`>XPJr)B+NMW#sRR z-EmGkIPA{lmg644*ExR(&Eqcz*S)#7^>fUn8zK$IG2TL48JYT&` zam&zOv@e^?xaXb*V9Am))OR%B!{;K7q9OM)`V&YFH8n(~oRbuyXqDB?<|7@q&2}HN z3#u>Mk!>91gxG>ed#tVM5+$;DI3omn|M<>k@m_){Bk&2kN%J4+@~(e9`<>&=Uzppg zs4ZlUMP4y8iYD~7)H8#edrFlP0%>k>*4J#K%Qn5wnSQM&x9_kvKjA>_lW~9OE$M_A z4!KO82!e&e-+|$j!slm6_Zf>@Pud_<`Ba@Yra zRBO1&73}MSKH7n=8KCYuk@-=x2LPxpR{n{yra8SF@mZJ`M*&o3-*{;?R(znjT^4@w)0kM6o z7EO9}fX=-#(ybS=x>MUVf%)0&ex}BqCZQ38=g!LKIM;# zTIIm^;skK6bUISELU|$ap}Bv=w+w9he&wAV@Cc^4+)ivYylfOzj4W~;iffsID=jVy zq-uhKUWlkPET0+IVVZNZfO9E;eV#Q~>|wEv*0JXv;waEWS1-mB4__zfs<}*{bu(kb z9dk=e9r(yAa{Jg52{)hcqLe064jUJA`QdZ(Q9!YIp4pzYjP2SpL&)tfxdu5U-EtFq z4kvH0fu{xvX>UAOhZo<}RsPC#G9|s0zIRv>a~KsJy`^@8wHe7;Gj!zJZCT957NZ~U z2rfm(U%?ULKBanX4*M!931(sF3~R{g6TBH>E8W&@7EgWd0Tcmf|G}|Rce%t z>$JBd6BCoRHlJ&KqDG&IeUe58yZdab$}hCY^MJo%0EYMnHs=wMdxYX5N~mev%d8@- sfojVBa5Gf-xB`pz2MK;gtP{xpKU7re2qkoY(L(^x(=yhq)^Ljc7dUBS+yDRo diff --git a/documentation/en/.gitbook/assets/yugabyte.svg b/documentation/en/.gitbook/assets/yugabyte.svg new file mode 100644 index 000000000..954f89d8a --- /dev/null +++ b/documentation/en/.gitbook/assets/yugabyte.svg @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/documentation/en/SUMMARY.md b/documentation/en/SUMMARY.md index 0ef7ec991..56c4ef47f 100644 --- a/documentation/en/SUMMARY.md +++ b/documentation/en/SUMMARY.md @@ -27,6 +27,10 @@ * [Market UI](curio-market/market-ui.md) * [Retrievals](curio-market/retrievals.md) * [Migrating From Boost](curio-market/migrating-from-boost.md) +* [Market 2.0](market-2.0/README.md) + * [Products](market-2.0/products.md) + * [Market Contracts](market-2.0/contracts.md) + * [API](market-2.0/api.md) * [Snap Deals](snap-deals.md) * [Batch Sealing with SupraSeal](supraseal.md) * [Scaling Curio cluster](scaling-curio-cluster.md) diff --git a/documentation/en/configuration/README.md b/documentation/en/configuration/README.md index 4f883f909..23c3ffc52 100644 --- a/documentation/en/configuration/README.md +++ b/documentation/en/configuration/README.md @@ -4,9 +4,11 @@ description: How to edit and manage configuration for a Curio cluster # Configuration +## Configuration + The configuration for Curio is stored in the HarmonyDB in a table called `harmony_config`. When a Curio node is started, one or more layer names are supplied to get the desired configuration for the node. -## Configuration Layers +### Configuration Layers Configuration layers provide a set of configuration parameters that determine how a system will operate. These layers can be defined at different levels, meaning that higher layer can override the lower layer, and the system will behave based on the final stacked output. @@ -26,13 +28,13 @@ curio run --layers=post `base` layer is always applied by default when a Curio node is started. {% endhint %} -### Advantages of Configuration Layers +#### Advantages of Configuration Layers Flexibility: Configuration layers allow different parts of the system or different users to behave differently according to predefined settings. Scalability: By separating concerns and allowing for specific configuration, the systems become easier to manage as they scale. Maintainability: Changes to configuration can be made on an appropriate layer without affecting the entire system. -### Layer Stacking +#### Layer Stacking -The configuration layers are stack in the supplied order. The `base` layer is always applied by default so it can be skipped. +The configuration layers are stack in the supplied order. The `base` layer is always applied by default so you don't need to specify it. For example, if a Curio node is started with the following layers: @@ -42,11 +44,11 @@ For example, if a Curio node is started with the following layers: These layer will be stacked on top of each other to create the final configuration for the node. The order of stacking will base > miner1 > sdr > wdPost > pricing. If a configuration parameter is defined in multiple layers then the final layer value will be used. -### Working with layers +#### Working with layers Curio allows you to manage node configurations using layers. Each layer can be applied or modified independently, with the ‘base’ layer being essential at startup. -#### **Print default configuration** +**Print default configuration** The default configuration is used in base layer by default. @@ -54,7 +56,7 @@ The default configuration is used in base layer by default. curio config default ``` -#### **Adding a New Layer** +**Adding a New Layer** To add a new configuration layer or update an existing one, you can provide a filename or input directly via stdin. @@ -62,7 +64,7 @@ To add a new configuration layer or update an existing one, you can provide a fi curio config set --title ``` -#### **List all layers** +**List all layers** List all configuration layers present in the database. @@ -70,24 +72,22 @@ List all configuration layers present in the database. curio config ls ``` -#### **Editing a Layer** +**Editing a Layer** Directly edit a configuration layer. -* Edit with `vim` editor\ - +* Edit with `vim` editor\\ ```shell curio config edit --editor vim ``` -* Edit with a different editor like nano\ - +* Edit with a different editor like nano\\ ```shell curio config edit --editor nano ``` -#### **Interpreting Stacked Layers** +**Interpreting Stacked Layers** Interpret and view the combined effect of all applied configuration layers, including system-generated comments. @@ -95,7 +95,7 @@ Interpret and view the combined effect of all applied configuration layers, incl curio config view --layers [layer1,layers2] ``` -#### **Removing a Layer** +**Removing a Layer** Remove a specific configuration layer by name. @@ -103,11 +103,11 @@ Remove a specific configuration layer by name. curio config rm ``` -### Pre-built Layers +#### Pre-built Layers When the first Curio miner is initialized or when the first Lotus-Miner is migrated to Curio, the process creates some layers by default for the users. These layers mostly define if a particular task should be picked by the machine or not. -#### **post** +**post** ```toml @@ -116,14 +116,14 @@ EnableWindowPost = true EnableWinningPost = true ``` -#### **sdr** +**sdr** ```toml [Subsystems] EnableSealSDR = true ``` -#### **seal** +**seal** ```toml [Subsystems] @@ -135,7 +135,7 @@ EnableSendCommitMsg = true EnableMoveStorage = true ``` -#### **seal-gpu** +**seal-gpu** ```toml [Subsystems] @@ -143,7 +143,7 @@ EnableSealSDRTrees = true EnableSendPrecommitMsg = true ``` -#### **seal-snark** +**seal-snark** ```toml [Subsystems] @@ -151,20 +151,50 @@ EnablePoRepProof = true EnableSendCommitMsg = true ``` -#### **gui** +**gui** ```toml [Subsystems] EnableWebGui = true ``` -## Configuration management in UI +### Configuration management in UI The Curio GUI provides a user-friendly interface for managing configurations. To access this feature, navigate to the “Configurations” page from the UI menu. On this page, all available layers in the database are listed. Users can edit each layer by clicking on it. -

        Configurations

        Curio GUI configuration page

        +
        Configurations

        Curio GUI configuration page

        To update a configuration field, users must first enable it by checking the corresponding box. After enabling, the field value can be populated. To comment out the field, simply uncheck the box. -
        Configuration edit

        Curio GUI configuration editor

        +
        Configuration edit

        Curio GUI configuration editor

        + +### Dynamic Configuration Updates + +Historically, **all configuration changes required a full server restart**, impacting uptime and SLA.\ +This is no longer the case — **a growing number of settings can now be updated on the fly**, without restarting any node. More dynamic options will be added over time. + +**Identifying Hot-Reloadable Settings** + +In the UI and documentation, these settings are clearly marked with: + +> **“Updates will affect running instances”** + +When updated (via UI, CLI, or direct SQL), they are applied automatically within **\~30 seconds**. + +#### **Behaviour & Caveats** + +* **Invalid values apply immediately** (e.g., unparsable or out-of-range values) and may cause system-wide disruption.\ + They can be corrected by pushing a valid update, but there is **no safety delay or rollback**. +* A few configuration changes still **require a restart** — typically structural or first-time operations\ + (e.g., adding the first miner address while Market 2 is active).\ + In these cases the system will **clearly return an error stating that a restart is required**. + +#### **Quick Reference** + +| Type of Change | Restart Needed? | Notes | +| ------------------------------------------------------- | ---------------- | ------------------------------------------- | +| Marked with **“Updates will affect running instances”** | ❌ No | Takes effect in \~30s | +| Bad or invalid value | ❌ No, but unsafe | Applies instantly, may break services | +| Structural / unsupported change (rare) | ✅ Yes | System explicitly errors and refuses update | +This gradual shift to dynamic configuration reduces downtime, shortens maintenance windows, and improves operational flexibility. diff --git a/documentation/en/configuration/default-curio-configuration.md b/documentation/en/configuration/default-curio-configuration.md index af6c3ed04..b83dac6fb 100644 --- a/documentation/en/configuration/default-curio-configuration.md +++ b/documentation/en/configuration/default-curio-configuration.md @@ -305,11 +305,6 @@ description: The default curio configuration # type: int #IndexingMaxTasks = 8 - # EnableBalanceManager enables the task to automatically manage the market balance of the miner's market actor (Default: false) - # - # type: bool - #EnableBalanceManager = false - # BindSDRTreeToNode forces the TreeD and TreeRC tasks to be executed on the same node where SDR task was executed # for the sector. Please ensure that TreeD and TreeRC task are enabled and relevant resources are available before # enabling this option. (Default: false) @@ -429,6 +424,7 @@ description: The default curio configuration # Addresses specifies the list of miner addresses and their related wallet addresses. +# Updates will affect running instances. # # type: []CurioAddresses [[Addresses]] @@ -580,7 +576,7 @@ description: The default curio configuration # Time duration string (e.g., "1h2m3s") in TOML format. (Default: "5m0s") # # type: time.Duration - #IdleTimeout = "2m0s" + #IdleTimeout = "1h0m0s" # ReadHeaderTimeout is amount of time allowed to read request headers # Time duration string (e.g., "1h2m3s") in TOML format. (Default: "5m0s") @@ -588,10 +584,13 @@ description: The default curio configuration # type: time.Duration #ReadHeaderTimeout = "5s" - # EnableCORS indicates whether Cross-Origin Resource Sharing (CORS) is enabled or not. + # CORSOrigins specifies the allowed origins for CORS requests to the Curio admin UI. If empty, CORS is disabled. + # If not empty, only the specified origins will be allowed for CORS requests. + # This is required for third-party UI servers. + # "*" allows everyone, it's best to specify the UI servers' hostname. # - # type: bool - #EnableCORS = true + # type: []string + #CORSOrigins = [] # CSP sets the Content Security Policy for content served via the /piece/ retrieval endpoint. # Valid values: "off", "self", "inline" (Default: "inline") @@ -731,6 +730,60 @@ description: The default curio configuration # type: bool #DefaultCIDGravityAccept = false + # MK20 encompasses all configuration related to deal protocol mk2.0 i.e. market 2.0 + # + # type: MK20Config + [Market.StorageMarketConfig.MK20] + + # ExpectedPoRepSealDuration is the expected time it would take to seal the deal sector + # This will be used to fail the deals which cannot be sealed on time. + # Time duration string (e.g., "1h2m3s") in TOML format. (Default: "8h0m0s") + # + # type: time.Duration + #ExpectedPoRepSealDuration = "8h0m0s" + + # ExpectedSnapSealDuration is the expected time it would take to snap the deal sector + # This will be used to fail the deals which cannot be sealed on time. + # Time duration string (e.g., "1h2m3s") in TOML format. (Default: "2h0m0s") + # + # type: time.Duration + #ExpectedSnapSealDuration = "2h0m0s" + + # SkipCommP can be used to skip doing a commP check before PublishDealMessage is sent on chain + # Warning: If this check is skipped and there is a commP mismatch, all deals in the + # sector will need to be sent again (Default: false) + # + # type: bool + #SkipCommP = false + + # MaxConcurrentDealSizeGiB is a sum of all size of all deals which are waiting to be added to a sector + # When the cumulative size of all deals in process reaches this number, new deals will be rejected. + # (Default: 0 = unlimited) + # + # type: int64 + #MaxConcurrentDealSizeGiB = 0 + + # DenyUnknownClients determines the default behaviour for the deal of clients which are not in allow/deny list + # If True then all deals coming from unknown clients will be rejected. (Default: false) + # + # type: bool + #DenyUnknownClients = false + + # MaxParallelChunkUploads defines the maximum number of upload operations that can run in parallel. (Default: 512) + # + # type: int + #MaxParallelChunkUploads = 512 + + # MinimumChunkSize defines the smallest size of a chunk allowed for processing, expressed in bytes. Must be a power of 2. (Default: 16 MiB) + # + # type: int64 + #MinimumChunkSize = 16777216 + + # MaximumChunkSize defines the maximum size of a chunk allowed for processing, expressed in bytes. Must be a power of 2. (Default: 256 MiB) + # + # type: int64 + #MaximumChunkSize = 268435456 + # IPNI configuration for ipni-provider # # type: IPNIConfig @@ -743,7 +796,6 @@ description: The default curio configuration #Disable = false # The network indexer web UI URL for viewing published announcements - # TODO: should we use this for checking published heads before publishing? Later commit # # type: []string #ServiceURL = ["https://cid.contact"] @@ -779,6 +831,7 @@ description: The default curio configuration # A "running" pipeline is one that has at least one task currently assigned to a machine (owner_id is not null). # If this limit is exceeded, the system will apply backpressure to delay processing of new deals. # 0 means unlimited. (Default: 64) + # Updates will affect running instances. # # type: int #MaxMarketRunningPipelines = 64 @@ -787,6 +840,7 @@ description: The default curio configuration # waiting for a machine to pick up their task (owner_id is null). # If this limit is exceeded, the system will apply backpressure to slow the ingestion of new deals. # 0 means unlimited. (Default: 8) + # Updates will affect running instances. # # type: int #MaxQueueDownload = 8 @@ -795,6 +849,7 @@ description: The default curio configuration # waiting for a machine to pick up their verification task (owner_id is null). # If this limit is exceeded, the system will apply backpressure, delaying new deal processing. # 0 means unlimited. (Default: 8) + # Updates will affect running instances. # # type: int #MaxQueueCommP = 8 @@ -804,6 +859,7 @@ description: The default curio configuration # Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. # The DealSector queue includes deals that are ready to enter the sealing pipeline but are not yet part of it. # DealSector queue is the first queue in the sealing pipeline, making it the primary backpressure mechanism. (Default: 8) + # Updates will affect running instances. # # type: int #MaxQueueDealSector = 8 @@ -815,6 +871,7 @@ description: The default curio configuration # possible that this queue grows more than this limit(CC sectors), the backpressure is only applied to sectors # entering the pipeline. # Only applies to PoRep pipeline (DoSnap = false) (Default: 8) + # Updates will affect running instances. # # type: int #MaxQueueSDR = 8 @@ -825,6 +882,7 @@ description: The default curio configuration # In case of the trees tasks it is possible that this queue grows more than this limit, the backpressure is only # applied to sectors entering the pipeline. # Only applies to PoRep pipeline (DoSnap = false) (Default: 0) + # Updates will affect running instances. # # type: int #MaxQueueTrees = 0 @@ -835,6 +893,7 @@ description: The default curio configuration # Like with the trees tasks, it is possible that this queue grows more than this limit, the backpressure is only # applied to sectors entering the pipeline. # Only applies to PoRep pipeline (DoSnap = false) (Default: 0) + # Updates will affect running instances. # # type: int #MaxQueuePoRep = 0 @@ -843,6 +902,7 @@ description: The default curio configuration # 0 means unlimited. # This applies backpressure to the market subsystem by delaying the ingestion of deal data. # Only applies to the Snap Deals pipeline (DoSnap = true). (Default: 16) + # Updates will affect running instances. # # type: int #MaxQueueSnapEncode = 16 @@ -850,6 +910,7 @@ description: The default curio configuration # MaxQueueSnapProve is the maximum number of sectors that can be queued waiting for UpdateProve to start processing. # 0 means unlimited. # This applies backpressure in the Snap Deals pipeline (DoSnap = true) by delaying new deal ingestion. (Default: 0) + # Updates will affect running instances. # # type: int #MaxQueueSnapProve = 0 @@ -857,6 +918,7 @@ description: The default curio configuration # Maximum time an open deal sector should wait for more deals before it starts sealing. # This ensures that sectors don't remain open indefinitely, consuming resources. # Time duration string (e.g., "1h2m3s") in TOML format. (Default: "1h0m0s") + # Updates will affect running instances. # # type: time.Duration #MaxDealWaitTime = "1h0m0s" diff --git a/documentation/en/curio-cli/curio.md b/documentation/en/curio-cli/curio.md index 8c58437e0..508a3d2c6 100644 --- a/documentation/en/curio-cli/curio.md +++ b/documentation/en/curio-cli/curio.md @@ -7,7 +7,7 @@ USAGE: curio [global options] command [command options] VERSION: - 1.27.1 + 1.27.2 COMMANDS: cli Execute cli commands @@ -1347,8 +1347,9 @@ USAGE: curio toolbox [command options] COMMANDS: - fix-msg Updated DB with message data missing from chain node - help, h Shows a list of commands or help for one command + fix-msg Updated DB with message data missing from chain node + register-pdp-service-provider Register a PDP service provider with Filecoin Service Registry Contract + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help @@ -1366,3 +1367,26 @@ OPTIONS: --all Update data for messages in wait queue (default: false) --help, -h show help ``` + +### curio toolbox register-pdp-service-provider +``` +NAME: + curio toolbox register-pdp-service-provider - Register a PDP service provider with Filecoin Service Registry Contract + +USAGE: + curio toolbox register-pdp-service-provider [command options] + +OPTIONS: + --name value Service provider name + --description value Service provider description + --service-url value URL of the service provider + --min-size value Minimum piece size (default: "1 MiB") + --max-size value Maximum piece size (default: "64 GiB") + --ipni-piece Supports IPNI piece CID indexing (default: false) + --ipni-ipfs Supports IPNI IPFS CID indexing (default: false) + --price value Storage price per TiB per month in USDFC, Default is 1 USDFC. (default: 1000000) + --proving-period value Shortest frequency interval in epochs at which the SP is willing to prove access to the stored dataset (default: 60) + --location value Location of the service provider + --token-address value Token contract for payment (IERC20(address(0)) for FIL) + --help, -h show help +``` diff --git a/documentation/en/curio-cli/sptool.md b/documentation/en/curio-cli/sptool.md index 867c34982..67547e1a6 100644 --- a/documentation/en/curio-cli/sptool.md +++ b/documentation/en/curio-cli/sptool.md @@ -7,7 +7,7 @@ USAGE: sptool [global options] command [command options] VERSION: - 1.27.1 + 1.27.2 COMMANDS: actor Manage Filecoin Miner Actor Metadata @@ -503,6 +503,7 @@ USAGE: COMMANDS: spark Manage Smart Contract PeerID used by Spark mk12-client mk12 client for Curio + mk20-client mk20 client for Curio help, h Shows a list of commands or help for one command OPTIONS: @@ -888,3 +889,162 @@ USAGE: OPTIONS: --help, -h show help ``` + +### sptool toolbox mk20-client +``` +NAME: + sptool toolbox mk20-client - mk20 client for Curio + +USAGE: + sptool toolbox mk20-client [command options] + +COMMANDS: + init Initialise curio mk12 client repo + commp + deal Make a mk20 deal with Curio + pdp-deal Make a mk20 PDP deal with Curio + aggregate Create a new aggregate from a list of CAR files + upload Upload a file to the storage provider + chunk-upload Upload a file in chunks to the storage provider + deal-status Get status of a Mk20 deal + help, h Shows a list of commands or help for one command + +OPTIONS: + --mk12-client-repo value repo directory for mk12 client (default: "~/.curio-client") [$CURIO_MK12_CLIENT_REPO] + --help, -h show help +``` + +#### sptool toolbox mk20-client init +``` +NAME: + sptool toolbox mk20-client init - Initialise curio mk12 client repo + +USAGE: + sptool toolbox mk20-client init [command options] + +OPTIONS: + --help, -h show help +``` + +#### sptool toolbox mk20-client commp +``` +NAME: + sptool toolbox mk20-client commp + +USAGE: + sptool toolbox mk20-client commp [command options] + +OPTIONS: + --help, -h show help +``` + +#### sptool toolbox mk20-client deal +``` +NAME: + sptool toolbox mk20-client deal - Make a mk20 deal with Curio + +USAGE: + sptool toolbox mk20-client deal [command options] + +OPTIONS: + --http-url value http url to CAR file + --http-headers value [ --http-headers value ] http headers to be passed with the request (e.g key=value) + --provider value storage provider on-chain address + --pcidv2 value pcidv2 of the CAR file + --duration value duration of the deal in epochs (default: 518400) + --contract-address value contract address of the deal + --contract-verify-method value contract verify method of the deal + --allocation value allocation id of the deal (default: 0) + --indexing indicates that an deal should be indexed (default: true) + --wallet value wallet address to be used to initiate the deal + --announce indicates that deal should be announced to the IPNI(Network Indexer) (default: true) + --aggregate value aggregate file path for the deal + --put used HTTP put as data source (default: false) + --help, -h show help +``` + +#### sptool toolbox mk20-client pdp-deal +``` +NAME: + sptool toolbox mk20-client pdp-deal - Make a mk20 PDP deal with Curio + +USAGE: + sptool toolbox mk20-client pdp-deal [command options] + +OPTIONS: + --http-url value http url to CAR file + --http-headers value [ --http-headers value ] http headers to be passed with the request (e.g key=value) + --provider value PDP providers's URL + --pcidv2 value pcidv2 of the CAR file + --wallet value wallet address to be used to initiate the deal + --aggregate value aggregate file path for the deal + --put used HTTP put as data source (default: false) + --add-piece add piece (default: false) + --add-dataset add dataset (default: false) + --remove-piece remove piece (default: false) + --remove-dataset remove dataset (default: false) + --record-keeper value record keeper address + --piece-id value [ --piece-id value ] root IDs + --dataset-id value dataset IDs (default: 0) + --help, -h show help +``` + +#### sptool toolbox mk20-client aggregate +``` +NAME: + sptool toolbox mk20-client aggregate - Create a new aggregate from a list of CAR files + +USAGE: + sptool toolbox mk20-client aggregate [command options] + +OPTIONS: + --files value [ --files value ] list of CAR files to aggregate + --piece-size value piece size of the aggregate (default: 0) + --out output the aggregate file (default: true) + --help, -h show help +``` + +#### sptool toolbox mk20-client upload +``` +NAME: + sptool toolbox mk20-client upload - Upload a file to the storage provider + +USAGE: + sptool toolbox mk20-client upload [command options] + +OPTIONS: + --provider value PDP providers's URL + --deal value deal id to upload to + --help, -h show help +``` + +#### sptool toolbox mk20-client chunk-upload +``` +NAME: + sptool toolbox mk20-client chunk-upload - Upload a file in chunks to the storage provider + +USAGE: + sptool toolbox mk20-client chunk-upload [command options] + +OPTIONS: + --provider value storage provider on-chain address + --deal value deal id to upload to + --chunk-size value chunk size to be used for the upload (default: "4 MiB") + --wallet value wallet address to be used to initiate the deal + --help, -h show help +``` + +#### sptool toolbox mk20-client deal-status +``` +NAME: + sptool toolbox mk20-client deal-status - Get status of a Mk20 deal + +USAGE: + sptool toolbox mk20-client deal-status [command options] + +OPTIONS: + --provider value PDP providers's URL + --id value deal id + --wallet value wallet address to be used to initiate the deal + --help, -h show help +``` diff --git a/documentation/en/curio-market/curio-http-server.md b/documentation/en/curio-market/curio-http-server.md index da6f98905..95a037160 100644 --- a/documentation/en/curio-market/curio-http-server.md +++ b/documentation/en/curio-market/curio-http-server.md @@ -114,8 +114,8 @@ The Curio HTTP Server can be customized using the `HTTPConfig` structure, which Default: `2 minutes` — Prevents resources from being consumed by idle connections. If your application expects longer periods of inactivity, such as in long polling or WebSocket connections, this value should be adjusted accordingly. * **ReadHeaderTimeout**: The time allowed to read the request headers from the client.\ Default: `5 seconds` — Prevents slow clients from keeping connections open without sending complete headers. For standard web traffic, this value is sufficient, but it may need adjustment for certain client environments. -* **EnableCORS**: A boolean flag to enable or disable Cross-Origin Resource Sharing (CORS).\ - Default: `true` — This allows cross-origin requests, which is important for web applications that might make API calls from different domains. +* **CORSOrigins**: Specifies the allowed origins for CORS requests. If empty, CORS is disabled.\ + Default: `[]` (empty array) — This disables CORS by default for security. To enable CORS, specify the allowed origins (e.g., `["https://example.com", "https://app.example.com"]`). This is required for third-party UI servers. * **CompressionLevels**: Defines the compression levels for GZIP, Brotli, and Deflate, which are used to optimize the response size. The defaults balance performance and bandwidth savings: * **GzipLevel**: Default: `6` — A moderate compression level that balances speed and compression ratio, suitable for general-purpose use. * **BrotliLevel**: Default: `4` — A moderate Brotli compression level, which provides better compression than GZIP but is more CPU-intensive. This level is good for text-heavy responses like HTML or JSON. diff --git a/documentation/en/curio-market/migrating-from-boost.md b/documentation/en/curio-market/migrating-from-boost.md index 7398df495..b6e45273d 100644 --- a/documentation/en/curio-market/migrating-from-boost.md +++ b/documentation/en/curio-market/migrating-from-boost.md @@ -12,7 +12,6 @@ Migrating from Boost to Curio involves transitioning all deal data, including Bo * Run the following command to build the tool.\\ ```bash - git checkout feat/curio-migration make migrate-curio ``` diff --git a/documentation/en/experimental-features/Enable-PDP.md b/documentation/en/experimental-features/Enable-PDP.md index 736b46801..c207a05fa 100644 --- a/documentation/en/experimental-features/Enable-PDP.md +++ b/documentation/en/experimental-features/Enable-PDP.md @@ -1,149 +1,587 @@ --- -description: This page explains how to enable PDP in Curio. +description: >- + This guide walks you through setting up a PDP-enabled Filecoin Storage + Provider using Lotus, YugabyteDB, and Curio --- # Enable PDP -## What is Proof of Data Possession (PDP)? +{% hint style="danger" %} +**ALPHA FEATURE - UNDER DEVELOPMENT** -Proof of Data Possession (PDP) is a new component of the Filecoin ecosystem, designed to work alongside Proof of Replication (PoRep). While PoRep ensures that data is securely stored and uniquely encoded, PDP focuses on verifying that data is accessible at specific points in time. Here’s a breakdown of what PDP does: +This documentation covers the PDP (Proof of Data Possession) feature, which is currently in alpha and under active development. This tool is intended for testing and experimental use only. -* **Periodic Accessibility:** PDP checks that data is available when needed, ensuring it’s stored and accessible at regular intervals. -* **Efficient Retrieval:** Unlike PoRep, PDP operates on unencoded data, making it faster to retrieve without the need for decoding the data. -* **Lightweight Verification:** PDP’s proving process is computationally efficient and doesn’t require heavy resources like GPUs. +For production use and submitting real deals with live PDP Storage Providers, please use the [Synapse SDK](https://github.com/FilOzone/synapse-sdk). +{% endhint %} + +## 🚀 Prerequisites + +{% hint style="warning" %} +**Note:** This guide is written specifically for **Ubuntu 22.04**. If you are using a different Linux distribution, refer to the relevant documentation for package installation and compatibility. +{% endhint %} + +Before starting, make sure you have a user with **sudo privileges**. This section prepares your system for the PDP stack. + +*** + +### ⚙️ Hardware requirements + +* **RAM**: 32 GiB+ +* **CPU**: 8 Core+ +* **Storage**: + * 1 TiB Fast storage (NVMe/SSD) + * 10 TiB Long-term storage (HDD) +* **GPU**: Not required +* **Connectivity**: Public HTTPS endpoint (domain) + +*** + +### 🧰 System Package Installation + +```sh +sudo apt update && sudo apt upgrade -y && sudo apt install -y \ + mesa-opencl-icd ocl-icd-opencl-dev gcc git jq pkg-config curl clang \ + build-essential hwloc libhwloc-dev libarchive-dev wget ntp python-is-python3 aria2 +``` + +*** + +### :hammer: Install Go (v1.24.0) -PDP is particularly useful for applications where data needs to be accessed frequently, such as in hot storage scenarios. It ensures that storage providers maintain accessible copies of data without the overhead of constant decoding. This makes PDP a valuable tool for improving retrieval efficiency on Filecoin. +```sh +sudo rm -rf /usr/local/go +wget https://go.dev/dl/go1.24.0.linux-amd64.tar.gz +sudo tar -C /usr/local -xzf go1.24.0.linux-amd64.tar.gz +echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc +source ~/.bashrc +go version +``` -It’s important to note that while PDP is a supporting element of efficient retrieval, it doesn’t guarantee retrieval; malicious storage providers could still deny service. Additionally, PDP complements, rather than replaces, PoRep, as it does not guarantee data replication or incompressibility — both essential for storage-based consensus. +{% hint style="success" %} +You should see something like: `go version go1.24.0 linux/amd64` +{% endhint %} -You can read more about PDP [here](https://medium.com/@filoz/the-pdp-journey-an-in-depth-look-at-how-pdp-works-4b6079f4baad). +*** -## PDP Provider Setup +### :wrench: Install Rust -### Existing Curio cluster (Filecoin PoRep) +```sh +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` -In one of the configuration layer used by Market nodes, please enable the following tasks and restart the node. +{% hint style="info" %} +When prompted, choose the option 1) Proceed with standard installation (default — just press Enter). +{% endhint %} -```toml -[Subsystems] - EnableCommP = true - EnableMoveStorage = true - EnablePDP = true - EnableParkPiece = true +```sh +source $HOME/.cargo/env +rustc --version ``` -Once done, please proceed with [PDP owner](Enable-PDP.md#pdp-owner) and [PDP service](Enable-PDP.md#pdp-service) configuration. +{% hint style="success" %} +You should see something like: `rustc 1.86.0 (05f9846f8 2025-03-31)` +{% endhint %} + +*** -### New Curio cluster exclusively for PDP +### 🔐 Add Go and Rust to Secure Sudo Path -1. Get familiar with [Curio's design](../design/). -2. [Get started](../getting-started.md) with a new Curio cluster. -3. Since, this cluster will be dedicated to PDP, you can install Curio using the [debian packages](../installation.md#debian-package-installation) when PDP feature is available as part of a release. Till then, you need to manually [build the binaries](../installation.md#linux-build-from-source).\ +```sh +sudo tee /etc/sudoers.d/dev-paths <Lotus Documentation
        https://lotus.filecoin.io/lotus/get-started/what-is-lotus/lotus-logo-big.pnghttps://lotus.filecoin.io/lotus/get-started/what-is-lotus/Lotus Support ChannelsFilecoin Slack - #fil-lotus-helpFilecoin.svg.pnghttps://filecoinproject.slack.com/archives/CPFTWMY7N -4. Once Curio is installed, proceed to [Curio setup](../setup.md) and [initiating a new Curio cluster](../setup.md#initiating-a-new-curio-cluster). This new minerID will not be used by PDP but we need to initiate it as Curio is designed to function with at least one miner ID. As part of initiating a new cluster, you will start the Curio process and the [proceed with service configuration](../curio-service.md) from there. Update the `/etc/curio.env`file and remove the post layers. +### 🔧 Build Lotus Daemon +Clone and check out Lotus: +```sh +git clone https://github.com/filecoin-project/lotus.git +cd lotus +git checkout $(curl -s https://api.github.com/repos/filecoin-project/lotus/releases/latest | jq -r .tag_name) +``` - ```bash - CURIO_LAYERS=gui - ``` +**Build and Install for Mainnet** +```sh +make clean && make lotus +sudo make install-daemon +lotus --version +``` -5. After the service configuration is complete, please start the Curio node using the `systemd` and verify that GUI is accessible. -6. Go to Curio UI at `https://:4701` and click on "Configurations" in the menu. Click on the layer named "base" and update the following configurations. - 1. **Set a Domain Name**: - * Ensure that a valid `DomainName` is specified in the `HTTPConfig`. This is mandatory for proper HTTP server functionality and essential for enabling TLS. The domain name cannot be an IP address. - * In case `DelegateTLS` is `False` , the domain name must point to the public IP address your curio node is listening on. The purpose of setting this field is to allow lets encrypt ACME protocol to automatically issue a certificate to use TLS for encrypting access to the curio api. For let's encrypt policy reasons this will only work if curio listens on port 443. - * Domain name should be specified in the base layer - 2. **HTTP Configuration Details**: - * If TLS is managed by a reverse proxy, enable `DelegateTLS` in the `HTTPConfig` to allow the HTTP server to run without handling TLS directly. - * Configure additional parameters such as `ReadTimeout`, `IdleTimeout`, and `CompressionLevels` to ensure the server operates efficiently. - 3. Save the layer with the changes. -7. Add a new layer with name "pdp" and update the following configuration. - 1. **Enable the Deal Market**: - * Set `EnableDealMarket` to `true` in the `CurioSubsystemsConfig` for at least one node. This enables deal-making capabilities on the node. - 2. **Enable CommP**: - * Set `EnableCommP` to `true`. This allows the node to compute piece commitments (CommP) before publishing storage deal messages. - 3. **Enable PDP**: - * Set `EnablePDP` to `true`. This will allow the nodes to run PDP related tasks. - 4. **Enable ParkPiece:** - 1. Set `EnableParkPiece`to `true`. This will enable the nodes to download the remote data and save it locally. - 5. Save the layer with changes. -8. Add a new layer called "http". - 1. **Enable HTTP**: - * To enable HTTP, set the `Enable` flag in the `HTTPConfig` to `true` and specify the `ListenAddress` for the HTTP server. -9. If you have more than one node in the cluster, you should enable HTTP server only on one of those nodes unless you plan to load balance with a reverse proxy. -10. Now, we have all the required configuration layers in place, we can start the nodes with required configuration. Update the `/etc/curio.env`file and add the PDP layers.\ +**Build and Install for Calibration** +```sh +make clean && make GOFLAGS="-tags=calibnet" lotus +sudo make install-daemon +lotus --version +``` + +{% hint style="success" %} +You should see something like: `lotus version 1.32.2+calibnet+git.ff88d8269` +{% endhint %} - ```bash - CURIO_LAYERS=gui,pdp,http - ``` +*** +### 📦 Import a Snapshot and Start the Daemon +Download the Snapshot - {% hint style="danger" %} - **The layer "http" should only be added to one node if cluster has multiple nodes and TLS is not delegated.** - {% endhint %} -11. Start the Curio nodes and [attach the long-term storage](../storage-configuration.md#adding-long-term-storage-location) to store the PDP files. +**Mainnet:** -### PDP owner +```sh +aria2c -x5 -o snapshot.car.zst https://forest-archive.chainsafe.dev/latest/mainnet/ +``` -To interact with the PDP smart contracts the Curio SP must import a private key owning their PDP proof sets. +**Calibration:** -1. Obtain private key bytes -2. In the Curio web UI (localhost:4701) navigate to PDP and click "Import Key" -3. Paste key bytes +```sh +aria2c -x5 -o snapshot.car.zst https://forest-archive.chainsafe.dev/latest/calibnet/ +``` -There are many ways to obtain key bytes. Any method of exporting an ETH private key will work. Filecoin native address private keys can be extracted with +**Import and Start the Daemon** -```bash -lotus wallet export | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32 +```sh +lotus daemon --import-snapshot snapshot.car.zst --remove-existing-chain --halt-after-import +nohup lotus daemon > ~/lotus.log 2>&1 & ``` {% hint style="info" %} -PDP providers can use an existing wallet or create a new dedicated wallet for Proving. +If you encounter errors related to `EnableEthRPC` or `EnableIndexer`, run the following command and restart Lotus +{% endhint %} + +```sh +sed -i 's/^\( *\)#*EnableEthRPC = .*/\1EnableEthRPC = true/; s/^\( *\)#*EnableIndexer = .*/\1EnableIndexer = true/' ~/.lotus/config.toml +``` + +**Monitor Sync Progress** + +```sh +lotus sync wait +``` + +To monitor continuously: + +```sh +lotus sync wait --watch +``` + +**Monitor Logs** + +```sh +tail -f ~/lotus.log +``` + +*** + +## 🐘 Running YugabyteDB + +🧠 Curio uses YugabyteDB to store metadata about deals, sealing operations, and PDP submissions. + +
        Cover image
        Yugabyte Documentationhttps://docs.yugabyte.com/preview/tutorials/quick-start/linux/yugabyte.svghttps://docs.yugabyte.com/preview/tutorials/quick-start/linux/
        Yugabyte Support ChannelsFilecoin Slack - #fil-curio-help - Yugabyte SlackCurio_placeholder.webphttps://filecoinproject.slack.com/archives/C06LF5YP8S3
        + +### 🛠 Set ulimit configuration + +{% hint style="warning" %} +Before starting Yugabyte, you must increase the default `ulimit` values to ensure system limits do not interfere with the database. {% endhint %} -### PDP Service +To do this: + +#### 🔁 **Persist new limits across reboots** -To interact with the Curio PDP api clients need to have authentication to access a PDP API Service. PDP SPs must create PDP Services for clients to use their API. Here is the creation flow. +Add these lines to `/etc/security/limits.conf`: -1. Client creates a local authentication token offline, they then send PEM public key to curio PDP SP -2. In the Curio web UI (localhost:4701) navigate to PDP and click "Add Service" -3. Fill out service name (i.e. clientX) and paste their public key +```sh +echo "$(whoami) soft nofile 1048576" | sudo tee -a /etc/security/limits.conf +echo "$(whoami) hard nofile 1048576" | sudo tee -a /etc/security/limits.conf +``` + +This ensures the increased limits are automatically applied to future sessions. -## PDP Client +#### ⚡ **Apply limit immediately (for current shell only)** + +```sh +ulimit -n 1048576 +``` -Curio provides a client utilty which can be used by clients to onboards the data with PDP providers. +Verify: -To build the client binary, clone the Curio repo and build the PDP client. +```sh +ulimit -n +``` + +{% hint style="success" %} +This should output `1048576`. +{% endhint %} -```bash +### ⚙️ Install Yugabyte + +```sh +wget https://software.yugabyte.com/releases/2.25.1.0/yugabyte-2.25.1.0-b381-linux-x86_64.tar.gz +tar xvfz yugabyte-2.25.1.0-b381-linux-x86_64.tar.gz +cd yugabyte-2.25.1.0 +./bin/post_install.sh +``` + +### 🚀 Start the DB + +```sh +./bin/yugabyted start \ + --advertise_address 127.0.0.1 \ + --master_flags rpc_bind_addresses=127.0.0.1 \ + --tserver_flags rpc_bind_addresses=127.0.0.1 +``` + +{% hint style="warning" %} +If you encounter locale-related errors when starting Yugabyte for the first time, run: +{% endhint %} + +```sh +sudo locale-gen en_US.UTF-8 +``` + +{% hint style="success" %} +Visit `http://127.0.0.1:15433` to confirm successful installation. This is the YugabyteDB web UI — it should display the dashboard if the service is running correctly and all nodes are healthy. +{% endhint %} + +{% hint style="info" %} +You can also check your Yugabyte cluster details directly in the CLI with: +{% endhint %} + +```sh +./bin/yugabyted status +``` + +*** + +## 🧱 Installing and Configuring Curio + +🧠 Curio is the core PDP client that coordinates sealing, interacts with Lotus and submits PDP proofs. + +
        Curio Documentationhttps://docs.curiostorage.org/Curio_placeholder.webphttps://docs.curiostorage.org/
        Curio Support ChannelsFilecoin Slack - #fil-curio-helpFilecoin.svg.pnghttps://filecoinproject.slack.com/archives/C06LF5YP8S3
        + +### ⚙️ System Configuration + +Before you proceed with the installation, you should increase the UDP buffer size: + +```sh +sudo sysctl -w net.core.rmem_max=2097152 +sudo sysctl -w net.core.rmem_default=2097152 +``` + +To make this change persistent across reboots: + +```sh +echo 'net.core.rmem_max=2097152' | sudo tee -a /etc/sysctl.conf +echo 'net.core.rmem_default=2097152' | sudo tee -a /etc/sysctl.conf +``` + +### 🔬 Build Curio + +Clone the repository and switch to the PDP branch: + +```sh git clone https://github.com/filecoin-project/curio.git -cd curio/ -make pdptool +cd curio +git checkout pdpM3d +``` + +{% hint style="info" %} +Curio is compiled for a specific Filecoin network at build time. Choose the appropriate build command below. +{% endhint %} + +Mainnet + +```sh +make clean build +``` + +Calibration + +```sh +make clean calibnet +``` + +{% hint style="info" %} +This step will take a few minutes to complete. +{% endhint %} + +### ✅ Install and Verify Curio + +Run the following to install the compiled binary: + +```sh +sudo make install +``` + +This will place curio in `/usr/local/bin` + +Verify the installation: + +```sh +curio --version +``` + +Expected example output: + +```sh +curio version 1.24.4+calibnet+git_f954c0a_2025-04-06T15:46:32-04:00 +``` + +*** + +### 🔧 Guided Setup + +Curio provides a utility to help you set up a new miner interactively. Run the following command: + +```sh +curio guided-setup +``` + +#### 1️⃣ Select Curio Installation Type + +Use the arrow keys to navigate the guided setup menu and select "**Setup non-Storage Provider cluster**". + +#### 2️⃣ Enter Your YugabyteDB Connection Details + +If you used the default installation steps from this guide, the following values should work: + +* Host: `127.0.0.1` +* Port: `5433` +* Username: `yugabyte` +* Password: `yugabyte` +* Database: `yugabyte` + +You can verify these settings by running the following command from the Yugabyte directory: + +```sh +./bin/yugabyted status +``` + +After selecting "**Continue to connect and update schema**", Curio will automatically create the required tables and schema in the database. + +#### 3️⃣ Telemetry (Optional) + +You'll be asked whether to share anonymised or signed telemetry with the Curio team to help improve the software. + +Select your preference and continue. + +#### 4️⃣ Save Database Configuration + +At the final step of the guided setup, you'll be prompted to choose where to save your database configuration file. + +Use the arrow keys to select a location. A common default is: + +```sh +/home/your-username/curio.env +``` + +Once selected, setup will complete, and the miner configuration will be stored. + +#### 5️⃣ Launch the Curio Web GUI + +To explore the Curio interface visually, start the GUI layer: + +```sh +curio run --layers=gui +``` + +Then, open your browser and go to: + +```sh +http://127.0.0.1:4701 ``` -The `pdptool` command contains utilities for uploading files to a curio node and interacting with the pdp contract to create proofsets, and add and remove roots from proofsets. +This will launch the Curio web GUI locally. -### Create service secret +*** -To get started using `pdptool` to access the curio API as a client you will need to create a service authentication secret for accessing the API. To do this run `pdptool create-service-secret`. This will display the public key for sending to the curio node for [registering the PDP service](Enable-PDP.md#pdp-service). Additionally it will write a file `pdpservice.json` that contains a PEM encoded private key for API authentication. `pdptool` can be used without any extra steps if run in the same directory as this file. +## 🧪 Enabling FWSS PDP -### Connect to service +🧠 This section enables **FWSS Proof of Data Possession (PDP)** on your SP node using Curio. These steps guide you through running a standalone PDP service using Curio and pdptool. -Once the curio node has imported the service public key you can check that you are able to connect with +
        Cover image
        PDP Support ChannelsFilecoin.svg.pnghttps://filecoinproject.slack.com/archives/C0717TGU7V2
        +### 📦 Attach Storage Locations + +With Curio running with the GUI layer: + +```sh +curio run --layers=gui ``` -pdptool ping --service-url --service-name + +Run the following commands in your Curio CLI to attach storage paths: + +```sh +curio cli storage attach --init --seal /fast-storage/path +curio cli storage attach --init --store /long-term-storage/path +``` + +{% hint style="info" %} +Your fast-storage path should point to high-performance storage media such as NVMe or SSD +{% endhint %} + +*** + +### 🔧 Add a PDP Configuration Layer + +Browse to the **Configurations** page of the Curio GUI. + +Create a new layer named **pdp** and enable the following under Subsystems: + +{% hint style="info" %} +You may find it helpful to search for the setting names in your browser. +{% endhint %} + +* ✅ `EnableParkPiece` +* ✅ `EnablePDP` +* ✅ `EnableCommP` +* ✅ `EnableMoveStorage` + +In the **HTTP** section: + +* ✅ Enable: `true` +* 🌐 DomainName: `your domain (e.g., pdp.mydomain.com)` +* 📡 ListenAddress: `0.0.0.0:443` + +{% hint style="info" %} +**Tip:** You must point your domain's A record to your server's public IP address for Let's Encrypt to issue a certificate. +{% endhint %} + +*** + +### 💰 Import your Filecoin Wallet Private Key: + +{% hint style="warning" %} +There are several ways to obtain private keys for Ethereum addresses. In this guide, we will use a new delegated FIL wallet address. +{% endhint %} + +Create a new delegated wallet: + +```sh +lotus wallet new delegated ``` -Upon success you can start proving files on PDP. +```sh +# Example output: +t410fuo4dghaeiqzokiqnxruzdr6e3cjktnxprrc56bi +``` + +{% hint style="info" %} +You can display your Lotus wallets at any time by running: +{% endhint %} + +```sh +lotus wallet list +``` + +Export & convert your new delegated wallet address private key: + +```sh +lotus wallet export | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32 +``` + +```sh +# Example output: +d4c2e3f9a716bb0e47fa91b2cf4a29870be3c5982fd6eafed71e8ac3f9c0b127 +``` + +Browse to the **PDP** page of the Curio GUI and in the **Owner Address** section: + +* Select **Import Key** +* Copy the previously generated private wallet key into the **Private Key (Hex)** field. +* Select **Import Key** + +{% hint style="success" %} +Your 0x wallet address - the delegated Ethereum address derived from your Filecoin delegated wallet private key - will be added to the **Owner Address** section of the Curio PDP page. +{% endhint %} + +Make sure to send a small amount of FIL or tFIL (testnet FIL) to your 0x wallet - we recommend 8 FIL for Mainnet & 5 tFIL for Calibration to ensure uninterrupted PDP operation during initial setup and testing. [Calibration test FIL faucet information](https://docs.filecoin.io/smart-contracts/developing-contracts/get-test-tokens). + +{% hint style="warning" %} +**Important:** Secure your private key material. Don't expose or store it in plain text without protection. +{% endhint %} + +*** + +### 🚀 Restart and Verify + +Restart Curio with both layers: + +```sh +curio run --layers=gui,pdp +``` + +{% hint style="info" %} +If you encounter errors related to `EnableEthRPC` or `EnableIndexer`, run the following command and restart Lotus +{% endhint %} + +```sh +sed -i 's/^\( *\)#*EnableEthRPC = .*/\1EnableEthRPC = true/; s/^\( *\)#*EnableIndexer = .*/\1EnableIndexer = true/' ~/.lotus/config.toml +``` + +{% hint style="info" %} +If you encounter errors binding to port 443 when starting Curio with the pdp configuration layer, run: +{% endhint %} + +```sh +sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/curio +``` + +Test the PDP service: + +{% hint style="info" %} +If `pdptool` is not installed, clone and build Curio: +{% endhint %} + +```sh +git clone https://github.com/filecoin-project/curio.git +cd curio/cmd/pdptool +go build . +``` + +```sh +./pdptool ping --service-url https://your-domain.com --service-name public +``` + +{% hint style="info" %} +Always use `public` for the `--service-name` flag +{% endhint %} + +{% hint style="success" %} +Expected output: +{% endhint %} + +```sh +Ping successful: Service is reachable and JWT token is valid. +``` + +*** + +## 🎉 You're Done! + +You've successfully launched a **PDP-enabled Filecoin Storage Provider** stack. Your system is now: + +* ✅ Syncing with the Filecoin network via Lotus +* ✅ Recording deal and sector metadata in YugabyteDB +* ✅ Operating Curio to manage sealing and coordination +* ✅ Enabled Proof of Data Possession (PDP) +* ✅ Connected to your PDP-enabled storage provider + +*** + +## 🔜 Next Steps + +* :heavy\_check\_mark: Register your FWSS node +* :link: Explore FWSS & PDP tools & resources at [https://www.filecoin.services](https://www.filecoin.services/) +* 💬 Join the community - Filecoin Slack - [#fil-pdp](https://filecoinproject.slack.com/archives/C0717TGU7V2) diff --git a/documentation/en/market-2.0/README.md b/documentation/en/market-2.0/README.md new file mode 100644 index 000000000..6da4cd306 --- /dev/null +++ b/documentation/en/market-2.0/README.md @@ -0,0 +1,192 @@ +# Market 2.0 + +This guide introduces the new Filecoin Market 2.0 architecture for clients, developers, and aggregators. It explains how to use the new modular, contract-governed storage market and how to interact with Curio-based storage providers under this new system. + +--- + +## 🧭 Overview + +Filecoin's Market 2.0 removes legacy assumptions of the built-in storage market actor. Instead, deals are processed through **user-defined smart contracts**, allowing: + +* Flexible pricing and service terms +* Support for custom retrieval logic +* Contract-governed deal lifecycle +* Composability via extensible "products" + +Curio's role is purely to onboard data and respect contract terms—it does not mediate pricing, payments, or retrieval policy. + +--- + +## 📡 Supported Endpoints + +### 🔄 POST `/market/mk20/store` + +Accept a new deal (JSON body). + +* Auto-validates structure, products, sources, contract +* If valid, returns `200 OK` +* Otherwise returns appropriate error code (e.g. `400`, `422`, etc) + +### 🧾 GET `/market/mk20/status?id=` + +Check the status of a deal. + +* Returns one of: `accepted`, `processing`, `sealing`, `indexing`, `complete`, or `failed` + +### 🗂 PUT `/market/mk20/data?id=` + +Used only when `source_httpput` is selected. + +* Clients upload raw bytes +* `Content-Length` must match raw size + +### 📜 GET `/market/mk20/contracts` + +Return list of supported contract addresses + +### 🧠 GET `/market/mk20/info` + +Markdown documentation of deal format and validation rules + +### 🧠 GET `/market/mk20/producs` + +Json list of products supported by the provider + +### 🧠 GET `/market/mk20/sources` + +Json list of data sources supported by the provider + +--- + +## 🧑‍💻 Clients + +### 📝 Submitting a Deal + +Clients submit a deal to a Curio node using the `/market/mk20/store` endpoint. A deal includes: + +* A unique ULID identifier +* A `DataSource` (e.g. HTTP, offline, PUT) +* One or more `Products` (like `ddov1`) that define how the deal should behave + +#### Example Products: + +* `ddov1`: governs how the data should be stored and verified +* (future) `aclv1`: may define retrieval access controls +* (future) `retrievalv1`: may define retrieval SLA or payment terms + +### 🛠 Smart Contract Control + +Clients must select a contract that: + +* Is supported by the SP +* Implements a deal validation method that returns a valid DealID + +Clients pass the contract address, method name, and encoded params. + +### 🔁 Deal Lifecycle + +The contract governs whether the deal is valid. If valid: + +* The SP accepts and starts onboarding the data +* The deal may be indexed and/or announced to IPNI, based on deal config +* Data may be retrieved later via PieceCIDv2, PayloadCID, or subpiece CID + +--- + +## 🧱 Developers + +### 🧩 Building New Products + +Each product is a self-contained struct in the deal payload. Developers can: + +* Define new product types (e.g., `aclv1`, `retrievalv1`, `auditv1`) +* Implement validation logic on the SP side +* Optionally affect indexing, retrievals, ACLs, or other lifecycle aspects + +This makes the deal structure extensible **without requiring protocol or DB changes.** + +### 🧠 Writing Market Contracts + +A contract must: + +* Be added to the SP's whitelist +* Implement a method (e.g. `verifyDeal`) that takes a single `bytes` parameter +* Return a valid deal ID if the deal is accepted + +Contracts can implement features like: + +* Off-chain or on-chain ACL logic +* Multi-party deal approval +* FIL+ verification +* SLA enforcement + +--- + +## 🔁 Aggregators + +Data aggregators in Market 2.0 should: + +* No longer implement protocol-level workarounds (like ACLs or approvals) +* Provide value-added services like dashboards, alerts, analytics, SDKs +* Optionally act as data sources for multi-client deal generation + +Market 2.0 aims to reduce dependency on aggregators by letting providers and contracts do the heavy lifting. + +--- + +## 📦 Retrievals + +Curio supports the following retrieval inputs: + +* **PieceCIDv2**: required for all piece-level retrievals +* **PayloadCID**: if indexing is enabled +* **Subpiece CID**: if the deal was aggregated and subpieces were indexed + +ACL-based gating is not yet implemented, but future products can enable it. + +--- + +## ♻️ Deal Lifecycle in Curio + +1. **Client submits** deal with products, data, and contract call info +2. **Curio validates** all inputs and uses the contract to get a DealID +3. **Data is onboarded** via HTTP, offline import, PUT, or aggregation +4. **Products control** indexing, IPNI, and future extensibility +5. **Data is removed** from disk and DB when the sector expires + +--- + +## 🧪 Current Product: `ddov1` + +This product represents the first non-native Filecoin market product. It includes: + +* Provider, client, and piece manager addresses +* Optional AllocationID (or minimum duration) +* Contract + verification method for DealID +* Indexing and IPNI flags +* Notification hooks for deal lifecycle events + +More details can be found in the product schema or SP guide. + +--- + +## 🔮 Future Directions + +* ACL enforcement via `aclv1` +* Retrieval policy enforcement via `retrievalv1` +* Sealed sector access / download pricing +* Smart contract SLAs and renewals +* Market UIs and dashboards + +--- + +## ✅ Summary + +Market 2.0 enables: + +* Composable, contract-governed storage deals +* Modular product design +* Client-friendly HTTP-first onboarding +* Decoupled market innovation from SP software +* Stronger integration paths for aggregators and external tools + diff --git a/documentation/en/market-2.0/api.md b/documentation/en/market-2.0/api.md new file mode 100644 index 000000000..5e23cbff5 --- /dev/null +++ b/documentation/en/market-2.0/api.md @@ -0,0 +1,209 @@ +# MK20 API Reference + +This document describes the HTTP endpoints supported by the Market 2.0 module in Curio. These endpoints are used by clients and external systems to submit storage deals, upload data, track status, and fetch provider configuration. + +--- + +## 🌐 Base Path + +All endpoints are exposed under: + +``` +/market/mk20 +``` + +--- + +## 🔄 POST `/store` + +Submit a new MK20 deal to the storage provider. + +* **Content-Type**: `application/json` +* **Body**: JSON-encoded Deal +* **Query Parameters**: None + +### ✅ Response + +* `200 OK` – Deal accepted successfully +* `400 Bad Request` – Malformed JSON or missing required fields +* `422 Unprocessable Entity` – Unsupported product or data source +* `426` – Deal rejected by contract +* `430` – Malformed data source +* `441` – Deal duration too short + +### 🧪 Example + +```http +POST /market/mk20/store +Content-Type: application/json + +{ + "identifier": "01H9Y...", + "data": { ... }, + "products": { ... } +} +``` + +--- + +## 🧾 GET `/status` + +Retrieve the current processing status of a deal. + +* **Query Parameters**: + + * `id`: ULID of the deal + +### ✅ Response + +* `200 OK`: Returns JSON-encoded status +* `400 Bad Request`: Missing or malformed `id` +* `404 Not Found`: No such deal +* `500 Internal Server Error`: Unexpected backend error + +### 📄 Response Schema + +```json +{ + "status": "accepted" | "processing" | "sealing" | "indexing" | "complete" | "failed", + "error_msg": "string (optional)" +} +``` + +--- + +## 🗂 PUT `/data` + +Upload raw deal data for deals that declared a `source_httpput` source. + +* **Headers**: + + * `Content-Type: application/octet-stream` + * `Content-Length`: must match declared raw size +* **Query Parameters**: + + * `id`: ULID of the deal +* **Body**: Raw byte stream + +### ✅ Response + +* `200 OK`: Data accepted +* `400 Bad Request`: Invalid/missing content headers +* `413 Payload Too Large`: Content exceeds allowed size +* `415 Unsupported Media Type`: Incorrect content type + +--- + +## 📜 GET `/contracts` + +Return a list of smart contract addresses currently whitelisted by the provider. + +### ✅ Response + +```json +{ + "contracts": [ + "0x123...", + "0xabc..." + ] +} +``` + +* `200 OK`: List of contracts +* `500 Internal Server Error`: Failure fetching contract list + +--- + +## 🧠 GET `/info` + +Returns markdown-formatted documentation describing: + +* Supported deal structure +* Data source formats +* Product extensions + +### ✅ Response + +* `200 OK`: Markdown string +* `500 Internal Server Error`: If the info file cannot be generated + +--- + +### 🧰 GET `/products` + +Fetch a JSON list of supported deal products enabled on this provider. + +- **Content-Type**: N/A +- **Body**: N/A +- **Query Parameters**: N/A + +#### ✅ Response +- `200 OK`: JSON array of enabled products +- `500 Internal Server Error`: If the list cannot be fetched + +#### 🧪 Example Response +```json +{ + "products": [ + "ddo_v1", + "aclv1" + ] +} +``` + +--- + +### 🌐 GET `/sources` + +Fetch a JSON list of supported data source types enabled on this provider. + +- **Content-Type**: N/A +- **Body**: N/A +- **Query Parameters**: N/A + +#### ✅ Response +- `200 OK`: JSON array of enabled data sources +- `500 Internal Server Error`: If the list cannot be fetched + +#### 🧪 Example Response +```json +{ + "sources": [ + "http", + "offline", + "put", + "aggregate" + ] +} +``` + +--- + +## 📑 Error Code Summary + +| Code | Meaning | +| ---- | ---------------------------------- | +| 200 | Success | +| 400 | Bad proposal or malformed JSON | +| 422 | Unsupported product or data source | +| 426 | Deal rejected by contract | +| 430 | Malformed data source | +| 441 | Duration too short | +| 500 | Internal server error | + +--- + +## 🧩 Status Code Values (from `/status`) + +| Value | Meaning | +| ------------ | ----------------------------------------------- | +| `accepted` | Deal was accepted and is waiting for processing | +| `processing` | Deal is being staged or fetched | +| `sealing` | Deal is being sealed into a sector | +| `indexing` | Deal is being indexed for CID-based retrievals | +| `complete` | Deal has been sealed and is finalized | +| `failed` | Deal failed at any point in the pipeline | + +--- + +For full type schemas, see the `/info` endpoint or consult the documentation. diff --git a/documentation/en/market-2.0/contracts.md b/documentation/en/market-2.0/contracts.md new file mode 100644 index 000000000..757ec2364 --- /dev/null +++ b/documentation/en/market-2.0/contracts.md @@ -0,0 +1,119 @@ +# Smart Contract Integration Guide + +This guide explains how to write, deploy, and integrate a smart contract that governs storage deals in the Market 2.0 architecture. Contracts are responsible for determining whether a deal is valid and returning a DealID. + +--- + +## 🎯 Purpose of the Contract + +In Market 2.0, contracts are used to: + +* Accept or reject deals +* Optionally implement additional business logic (e.g. FIL+ validation, payments, approvals) +* Return a DealID string if accepted + +The contract does **not** manage storage or retrieval itself—that is handled by the SP. + +--- + +## ✅ Requirements + +A valid Market 2.0 contract must: + +1. Be deployed on a supported chain (e.g. Filecoin EVM, Hyperspace, etc) +2. Be whitelisted by the storage provider (via UI or admin tool) +3. Have its ABI uploaded +4. Expose a method that: + + * Accepts a single `bytes` input + * Returns a string (representing the DealID) + +--- + +## 🔁 Flow + +1. Client encodes parameters for your method +2. Client submits deal to Curio with: + + * Contract address + * Method name + * ABI-encoded parameters +3. Curio: + + * Loads ABI + * Packs the method call + * Calls `eth_call` + * Unpacks the return value + +If the method returns a string → deal is accepted. If empty string or call fails → deal is rejected. + +--- + +## 🧪 Example Contract Method + +```solidity +function verifyDeal(bytes calldata params) external view returns (string memory) { + // decode params into your structure + // perform validation + // return deal ID if valid + return "deal-123"; +} +``` + +--- + +## 📜 ABI Upload + +The SP must upload the ABI JSON for your contract when whitelisting it: + +* This enables Curio to find and call the method +* ABI must include the method name, inputs, and return types + +--- + +## 🔐 Client Responsibilities + +Clients must: + +* Choose a contract accepted by the SP +* Encode call parameters into `[]byte` +* Provide method name and contract address in the deal + +--- + +## 🧩 Products and Contract Use + +Contracts are typically used from within a **product** (e.g. `ddov1`). The product defines: + +* Contract address +* Method name +* Encoded params (using ABI rules) + +This decouples contract logic from storage logic and keeps deals composable. + +--- + +## 🚫 Common Errors + +| Error | Cause | +| ------------------------------- | ---------------------------------------------- | +| `426 Deal rejected by contract` | Returned string is empty or `eth_call` fails | +| `ABI not found` | Contract not whitelisted or ABI missing | +| `Invalid method` | Method name not found in ABI | +| `Incorrect input format` | Method doesn’t accept single `bytes` parameter | + +--- + +## ✅ Checklist for Integration + +* [ ] Deploy contract on supported chain +* [ ] Expose a `function(bytes) returns (string)` method +* [ ] Whitelist contract via SP UI +* [ ] Upload ABI including the method +* [ ] Coordinate with clients on method + param encoding + +--- + +This guide enables market developers to plug in custom contract logic without requiring any changes to Curio or the storage pipeline. + +Welcome to programmable storage governance. diff --git a/documentation/en/market-2.0/products.md b/documentation/en/market-2.0/products.md new file mode 100644 index 000000000..00f277250 --- /dev/null +++ b/documentation/en/market-2.0/products.md @@ -0,0 +1,246 @@ +# Products & Extensibility Guide + +Market 2.0 introduces a fully extensible framework for storage deal configuration. This guide explains how products work, how new ones can be added, and how developers and providers can safely evolve without changing core Curio logic. + +--- + +## 🧩 What Is a Product? + +A **product** is a named section of a deal that adds optional logic or configuration. Each product defines one or more aspects of the deal lifecycle. + +Examples: + +* `ddov1` – controls how data is onboarded and what contract governs it +* `aclv1` *(future)* – may define access control permissions +* `retrievalv1` *(future)* – may define retrieval conditions or SLA pricing + +Each product is a top-level field in the `products` object in a deal: + +```json +"products": { + "ddo_v1": { ... }, + "aclv1": { ... } +} +``` + +--- + +## 🛠 Product Responsibilities + +A product may: + +* Validate a deal before acceptance +* Provide smart contract call details +* Affect retrieval behavior (e.g. IPNI, ACLs) +* Receive notifications (e.g. on sector sealing) + +A product **must not**: + +* Trigger storage actions directly (Curio handles onboarding) +* Conflict with other products +* Depend on runtime configuration (products are static per deal) + +--- + +## 📐 Product Structure + +All products are Go structs that implement the following interface-like behavior: + +* A `.Validate(*DB, *Config) (ErrorCode, error)` method +* Optional `.GetDealID()` logic if a contract call is needed +* Unique product name (`ProductNameDDOV1`, etc) + +Products are stored in JSON under the `products` field. + +--- + +## 🧪 Example: `ddov1` + +The `ddov1` product includes: + +* Provider, client, and piece manager addresses +* Duration or allocation ID +* Smart contract call details: address, method, params +* Flags for indexing and IPNI +* Optional notification hooks + +Curio uses these fields to validate the deal, determine storage lifecycle, and optionally announce to IPNI. + +--- + +## 🛡 ACLs and Retrieval Products (Future) + +Market 2.0 was designed to support retrieval-layer enforcement through: + +* ACL products (e.g., define who can retrieve what, when) +* Retrieval policy products (e.g., define pricing, terms) + +These will live alongside onboarding products like `ddov1`. + +--- + +## ✅ Design Philosophy + +* Each product handles one concern +* Multiple products can be included in one deal +* Future products won't require code changes to existing ones +* Extensibility is done via composition, not inheritance + +--- + +## 📦 Summary + +| Concept | Description | +| ------------ | -------------------------------------------------------- | +| Product | Modular block in a deal defining optional behavior | +| Validation | Each product validates its own logic | +| Contract | Products may define how to obtain deal ID | +| Future-proof | New products can be added without DB or protocol changes | + +Products are the core of Market 2.0's flexibility—allowing new ideas to be layered in without disrupting existing workflows. + +# Write Your Own Product – Developer Guide + +This guide walks developers through creating a custom **product** for Market 2.0. Products add modular capabilities to deals—ranging from storage control to retrieval logic, ACLs, SLAs, and beyond. + +--- + +Each product must: + +* Implement validation +* Optionally provide contract call instructions (if needed) +* Return its canonical product name + +--- + +## 🧱 Structure of a Product + +Each product is a Go struct with a few key methods: + +```go +type MyProduct struct { + SomeField string `json:"some_field"` + // More fields... +} + +func (p *MyProduct) Validate(db *harmonydb.DB, cfg *config.MK20Config) (ErrorCode, error) { + // Check for required fields + // Enforce constraints + return Ok, nil +} + +func (p *MyProduct) ProductName() ProductName { + return "myproductv1" +} +``` + +--- + +## 🛠 Adding a New Product (Step-by-Step) + +### 1. Define Struct in `types.go` + +Add a new `MyProduct` struct to the `Products` block: + +```go +type Products struct { + DDOV1 *DDOV1 `json:"ddo_v1"` + MyProduct *MyProduct `json:"myproduct_v1"` +} +``` + +### 2. Implement `.Validate()` + +Use `Validate()` to define how the product ensures the deal is valid. +You may: + +* Check required fields +* Enforce logic (e.g. if X is true, Y must also be set) +* Query DB if needed + +Return `ErrorCode` and reason for failure. + +### 3. Optionally: Contract Integration + +If your product relies on a contract, implement: + +```go +func (p *MyProduct) GetDealID(...) (string, ErrorCode, error) +``` + +This is how `ddov1` fetches DealID via contract call. + +### 4. Add to JSON Marshal/Unmarshal + +Nothing needed—`Products` already uses JSON tags. +Curio stores each product as a JSON field under `products` in DB. + +### 5. Update UI Toggle Support (Optional) + +Add a toggle entry in the admin panel: + +* `market_mk20_products` table +* Use your product name as key (`myproduct_v1`) +* Enable or disable per deployment + +### 6. Document via `/info` + +Update the markdown generator so your product shows up in `/market/mk20/info`. + +--- + +## 🧪 Example Use Case: Retrieval Policy + +You might want to create `retrievalv1` with: + +```go +type RetrievalV1 struct { + PayPerByte bool `json:"pay_per_byte"` + MaxBandwidth int `json:"max_bandwidth_kbps"` + AllowedIPs []string `json:"allowed_ips"` +} +``` + +And enforce in `.Validate()`: + +```go +if p.PayPerByte && p.MaxBandwidth == 0 { + return ErrProductValidationFailed, xerrors.Errorf("bandwidth limit required for paid retrieval") +} +``` + +Later, your retrieval service can look up this product and apply pricing. + +--- + +## ✅ Guidelines + +| Rule | Description | +| ------------------ | ----------------------------------------- | +| ✅ Modular | Product should only affect its own logic | +| ✅ Optional | Products are opt-in per deal | +| ✅ Composable | Multiple products can exist in one deal | +| ❌ No Runtime State | Product logic is static and stateless | +| ❌ No Storage Logic | Curio handles onboarding, not the product | + +--- + +## 🔄 Deployment Considerations + +* Curio does not require a restart to recognize new products +* Products not enabled in DB will be rejected during validation +* Ensure all field names are `snake_case` in JSON + +--- + +## 📦 Summary + +Products are the extension mechanism of Market 2.0: + +* Validated independently +* Optional per deal +* Zero-conflict by design +* Fully extensible without schema or protocol changes + +Use them to inject new behaviors into Curio without touching the base system. + diff --git a/documentation/en/versions.md b/documentation/en/versions.md index 3e4d318a7..c751884dc 100644 --- a/documentation/en/versions.md +++ b/documentation/en/versions.md @@ -18,6 +18,7 @@ This is the compatibility matrix for the latest free Curio releases. | v1.26.0 | v1.33.1 | Mainnet | NA | v2024.2 / Automatic | 0.26 / Automatic | | v1.27.0 | v1.34.0 | Mainnet | NA | v2025.1 / Automatic | 0.30 / Automatic | | v1.27.1 | v1.34.1 | Mainnet | NA | v2025.1 / Automatic | 0.30 / Automatic | +| v1.27.2 | v1.34.1 | Mainnet | NA | v2025.1 / Automatic | 0.30 / Automatic | {% hint style="danger" %} Releases in red color are **not recommended**. Please proceed with the next stable release. diff --git a/extern/supraseal/build.sh b/extern/supraseal/build.sh index 62708d4a6..0bbfec436 100755 --- a/extern/supraseal/build.sh +++ b/extern/supraseal/build.sh @@ -13,24 +13,33 @@ do esac done -# Function to check GCC version +# Function to check GCC version - enforces GCC 12 for compatibility check_gcc_version() { local gcc_version=$(gcc -dumpversion | cut -d. -f1) - if [ "$gcc_version" != "11" ]; then - if command -v gcc-11 &> /dev/null && command -v g++-11 &> /dev/null; then - echo "GCC version is not 11. Setting CC, CXX, and NVCC_PREPEND_FLAGS to use GCC 11." - export CC=gcc-11 - export CXX=g++-11 - export NVCC_PREPEND_FLAGS='-ccbin /usr/bin/g++-11' - else - echo "Error: GCC 11 is required but not found. Please install GCC 11 and try again." - echo "You can typically install it using your package manager. For example:" - echo " On Ubuntu: sudo apt-get install gcc-11 g++-11" - echo " On Fedora: sudo dnf install gcc-11 gcc-c++-11" - echo " On Arch: Install gcc11 from AUR" - exit 1 - fi + local target_gcc_version=12 + + # Check if default GCC is version 12 + if [ "$gcc_version" -eq "$target_gcc_version" ]; then + echo "Using GCC $gcc_version" + return 0 + fi + + # If not GCC 12, try to find and use gcc-12 + if command -v gcc-12 &> /dev/null && command -v g++-12 &> /dev/null; then + echo "Setting CC, CXX, and NVCC_PREPEND_FLAGS to use GCC 12 for compatibility." + export CC=gcc-12 + export CXX=g++-12 + export NVCC_PREPEND_FLAGS="-ccbin /usr/bin/g++-12" + return 0 fi + + # GCC 12 not found + echo "Error: GCC 12 is required but not found." + echo "Current GCC version: $gcc_version" + echo "Please install GCC 12:" + echo " On Ubuntu/Debian: sudo apt-get install gcc-12 g++-12" + echo " On Fedora: sudo dnf install gcc-12 gcc-c++-12" + exit 1 } # Call the function to check GCC version @@ -38,22 +47,98 @@ check_gcc_version set -x -# Rest of your script remains unchanged -SECTOR_SIZE="" # Compile for all sector sizes -while getopts r flag -do - case "${flag}" in - r) SECTOR_SIZE="-DRUNTIME_SECTOR_SIZE";; - esac -done - CC=${CC:-cc} CXX=${CXX:-c++} NVCC=${NVCC:-nvcc} -CUDA=$(dirname $(dirname $(which $NVCC))) +# Create and activate Python virtual environment +# This avoids needing PIP_BREAK_SYSTEM_PACKAGES on Ubuntu 24.04+ +VENV_DIR="$(pwd)/.venv" +if [ ! -d "$VENV_DIR" ] || [ ! -f "$VENV_DIR/bin/activate" ]; then + echo "Creating Python virtual environment..." + if ! python3 -m venv "$VENV_DIR"; then + echo "Error: python3-venv is required but not available." + echo "Please install it:" + echo " On Ubuntu/Debian: sudo apt-get install python3-venv" + echo " On Fedora: sudo dnf install python3-virtualenv" + echo "" + echo "Or if you prefer, you can install dependencies manually:" + echo " pip3 install --user meson ninja pyelftools" + exit 1 + fi +fi + +# Activate the virtual environment +if [ -f "$VENV_DIR/bin/activate" ]; then + source "$VENV_DIR/bin/activate" +else + echo "Error: Virtual environment activation script not found at $VENV_DIR/bin/activate" + exit 1 +fi + +# Install Python build tools in the virtual environment +echo "Installing Python build tools in virtual environment..." +pip install --upgrade pip +pip install meson ninja pyelftools + +# Ensure venv is in PATH for subprocesses +export PATH="$VENV_DIR/bin:$PATH" + +# Detect CUDA installation path - search for CUDA 12+ (required for modern architectures) +CUDA="" +MIN_CUDA_VERSION=12 + +# Try common CUDA installation paths +for cuda_path in /usr/local/cuda-13.0 /usr/local/cuda-13 /usr/local/cuda-12.6 /usr/local/cuda-12 /usr/local/cuda /opt/cuda; do + if [ -d "$cuda_path" ] && [ -f "$cuda_path/bin/nvcc" ]; then + # Check CUDA version + CUDA_VER_CHECK=$($cuda_path/bin/nvcc --version | grep "release" | sed -n 's/.*release \([0-9]*\)\.\([0-9]*\).*/\1/p') + if [ "$CUDA_VER_CHECK" -ge "$MIN_CUDA_VERSION" ] 2>/dev/null; then + CUDA=$cuda_path + NVCC=$cuda_path/bin/nvcc + CUDA_VERSION=$CUDA_VER_CHECK + break + fi + fi +done + +# If not found in standard paths, check if nvcc in PATH is CUDA 12+ +if [ -z "$CUDA" ] && command -v nvcc &> /dev/null; then + CUDA_VER_CHECK=$(nvcc --version | grep "release" | sed -n 's/.*release \([0-9]*\)\.\([0-9]*\).*/\1/p') + if [ "$CUDA_VER_CHECK" -ge "$MIN_CUDA_VERSION" ] 2>/dev/null; then + CUDA=$(dirname $(dirname $(which nvcc))) + NVCC=nvcc + CUDA_VERSION=$CUDA_VER_CHECK + fi +fi + +if [ -z "$CUDA" ]; then + echo "Error: CUDA $MIN_CUDA_VERSION or newer not found." + echo "Please install CUDA Toolkit (version 12.0 or later):" + echo " Download from: https://developer.nvidia.com/cuda-downloads" + echo "" + echo "Checked locations:" + echo " - /usr/local/cuda-13.0" + echo " - /usr/local/cuda-13" + echo " - /usr/local/cuda-12.6" + echo " - /usr/local/cuda-12" + echo " - /usr/local/cuda" + echo " - PATH (found: $(which nvcc 2>/dev/null || echo 'not found'))" + if command -v nvcc &> /dev/null; then + echo "" + echo "Note: Found nvcc in PATH, but it's version $(nvcc --version | grep release | sed -n 's/.*release \([0-9.]*\).*/\1/p'), need $MIN_CUDA_VERSION.x or newer" + fi + exit 1 +fi + +# Ensure CUDA bin directory is in PATH +export PATH=$CUDA/bin:$PATH + +echo "Found CUDA $CUDA_VERSION at: $CUDA" SPDK="deps/spdk-v24.05" -CUDA_ARCH="-arch=sm_80 -gencode arch=compute_70,code=sm_70 -t0" +# CUDA 13 architectures - removed compute_70 (Volta) as it's no longer supported in CUDA 13+ +# sm_80: Ampere (A100), sm_86: Ampere (RTX 30xx), sm_89: Ada Lovelace (RTX 40xx, L40), sm_90: Hopper (H100) +CUDA_ARCH="-arch=sm_80 -gencode arch=compute_80,code=sm_80 -gencode arch=compute_86,code=sm_86 -gencode arch=compute_89,code=sm_89 -gencode arch=compute_90,code=sm_90 -t0" CXXSTD=`$CXX -dM -E -x c++ /dev/null | \ awk '{ if($2=="__cplusplus" && $3<"2017") print "-std=c++17"; }'` @@ -162,9 +247,26 @@ mkdir -p deps if [ ! -d $SPDK ]; then git clone --branch v24.05 https://github.com/spdk/spdk --recursive $SPDK (cd $SPDK - sudo scripts/pkgdep.sh - ./configure --with-virtio --with-vhost --without-fuse --without-crypto - make -j 10) + # Use the virtual environment for Python packages + # Ensure venv is active and in PATH for Python package installation + export VIRTUAL_ENV="$VENV_DIR" + export PATH="$VENV_DIR/bin:$PATH" + export PIP="$VENV_DIR/bin/pip" + export PYTHON="$VENV_DIR/bin/python" + # Run pkgdep.sh without sudo - system packages should already be installed + # Python packages will be installed in the venv automatically + # If system packages are missing, pkgdep.sh will fail gracefully + env VIRTUAL_ENV="$VENV_DIR" PATH="$VENV_DIR/bin:$PATH" PIP="$VENV_DIR/bin/pip" PYTHON="$VENV_DIR/bin/python" scripts/pkgdep.sh || { + echo "Warning: pkgdep.sh failed (likely system packages already installed). Continuing..." + } + ./configure --with-virtio --with-vhost \ + --without-fuse --without-crypto \ + --disable-unit-tests --disable-tests \ + --disable-examples --disable-apps \ + --without-fio --without-xnvme --without-vbdev-compress \ + --without-rbd --without-rdma --without-iscsi-initiator \ + --without-ocf --without-uring + make -j$(nproc)) fi if [ ! -d "deps/sppark" ]; then git clone --branch v0.1.10 https://github.com/supranational/sppark.git deps/sppark diff --git a/go.mod b/go.mod index c84bdb0ec..2fea3d981 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/filecoin-project/go-commp-utils v0.1.4 github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20240802040721-2a04ffc8ffe8 github.com/filecoin-project/go-commp-utils/v2 v2.1.0 + github.com/filecoin-project/go-data-segment v0.0.1 github.com/filecoin-project/go-f3 v0.8.10 github.com/filecoin-project/go-fil-commcid v0.3.1 github.com/filecoin-project/go-fil-commp-hashhash v0.2.0 @@ -51,6 +52,7 @@ require ( github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c github.com/hashicorp/go-multierror v1.1.1 + github.com/hashicorp/golang-lru/arc/v2 v2.0.7 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/icza/backscanner v0.0.0-20240328210400-b40c3a86dec5 github.com/invopop/jsonschema v0.13.0 @@ -75,12 +77,14 @@ require ( github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 github.com/jellydator/ttlcache/v2 v2.11.1 github.com/kelseyhightower/envconfig v1.4.0 + github.com/kr/pretty v0.3.1 github.com/libp2p/go-buffer-pool v0.1.0 github.com/libp2p/go-libp2p v0.44.0 github.com/manifoldco/promptui v0.9.0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/minio/sha256-simd v1.0.1 github.com/mitchellh/go-homedir v1.1.0 + github.com/mr-tron/base58 v1.2.0 github.com/multiformats/go-base32 v0.1.0 github.com/multiformats/go-multiaddr v0.16.1 github.com/multiformats/go-multibase v0.2.0 @@ -98,6 +102,8 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/snadrus/must v0.0.0-20240605044437-98cedd57f8eb github.com/stretchr/testify v1.11.1 + github.com/swaggo/http-swagger/v2 v2.0.2 + github.com/swaggo/swag v1.16.4 github.com/triplewz/poseidon v0.0.2 github.com/urfave/cli/v2 v2.27.7 github.com/whyrusleeping/cbor-gen v0.3.2-0.20250409092040-76796969edea @@ -123,6 +129,7 @@ require ( github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee // indirect github.com/Jorropo/jsync v1.0.1 // indirect github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa // indirect + github.com/KyleBanks/depth v1.2.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect @@ -166,7 +173,7 @@ require ( github.com/ethereum/go-verkle v0.2.2 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect - github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect + github.com/filecoin-project/go-amt-ipld/v3 v3.1.1 // indirect github.com/filecoin-project/go-amt-ipld/v4 v4.4.0 // indirect github.com/filecoin-project/go-clock v0.1.0 // indirect github.com/filecoin-project/go-crypto v0.1.0 // indirect @@ -210,7 +217,6 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/arc/v2 v2.0.7 // indirect github.com/holiman/uint256 v1.3.2 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/orderedmap v0.1.0 // indirect @@ -240,13 +246,14 @@ require ( github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect + github.com/jessevdk/go-flags v1.5.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/kilic/bls12-381 v0.1.1-0.20220929213557-ca162e8a70f4 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/koron/go-ssdp v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.3.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect @@ -261,7 +268,7 @@ require ( github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v5 v5.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/magefile/mage v1.9.0 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.14 // indirect @@ -317,16 +324,18 @@ require ( github.com/quic-go/webtransport-go v0.9.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/supranational/blst v0.3.13 // indirect + github.com/swaggo/files/v2 v2.0.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tklauser/go-sysconf v0.3.15 // indirect github.com/tklauser/numcpus v0.10.0 // indirect github.com/twmb/murmur3 v1.1.8 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.0.1 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba // indirect github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect diff --git a/go.sum b/go.sum index 901fbd88c..0a9ac8d38 100644 --- a/go.sum +++ b/go.sum @@ -60,6 +60,8 @@ github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivyb github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa h1:1PPxEyGdIGVkX/kqMvLJ95a1dGS1Sz7tpNEgehEYYt0= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa/go.mod h1:WUmMvh9wMtqj1Xhf1hf3kp9RvL+y6odtdYxpyZjb90U= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= @@ -289,8 +291,9 @@ github.com/filecoin-project/go-address v1.2.0/go.mod h1:kQEQ4qZ99a51X7DjT9HiMT4y github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= -github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-amt-ipld/v3 v3.1.1 h1:n+nczYe6VedXmdtAXygRuey246YnYyuY1NPrmy2iK6s= +github.com/filecoin-project/go-amt-ipld/v3 v3.1.1/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= github.com/filecoin-project/go-amt-ipld/v4 v4.4.0 h1:6kvvMeSpIy4GTU5t3vPHZgWYIMRzGRKLJ73s/cltsoc= github.com/filecoin-project/go-amt-ipld/v4 v4.4.0/go.mod h1:msgmUxTyRBZ6iXt+5dnUDnIb7SEFqdPsbB1wyo/G3ts= @@ -312,6 +315,8 @@ github.com/filecoin-project/go-commp-utils/v2 v2.1.0/go.mod h1:NbxJYlhxtWaNhlVCj github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.1.0 h1:Pob2MphoipMbe/ksxZOMcQvmBHAd3sI/WEqcbpIsGI0= github.com/filecoin-project/go-crypto v0.1.0/go.mod h1:K9UFXvvoyAVvB+0Le7oGlKiT9mgA5FHOJdYQXEE8IhI= +github.com/filecoin-project/go-data-segment v0.0.1 h1:1wmDxOG4ubWQm3ZC1XI5nCon5qgSq7Ra3Rb6Dbu10Gs= +github.com/filecoin-project/go-data-segment v0.0.1/go.mod h1:H0/NKbsRxmRFBcLibmABv+yFNHdmtl5AyplYLnb0Zv4= github.com/filecoin-project/go-data-transfer/v2 v2.0.0 h1:SUU6c0+K9K9WY16Ur9+cX1GOboTQ4TypR8cuLZANbDE= github.com/filecoin-project/go-data-transfer/v2 v2.0.0/go.mod h1:VdCAN4UqvZzbtTMVUi4yA2TKdzG1CtgjGzs7mdnRPWk= github.com/filecoin-project/go-ds-versioning v0.1.2 h1:to4pTadv3IeV1wvgbCbN6Vqd+fu+7tveXgv/rCEZy6w= @@ -812,8 +817,9 @@ github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0 github.com/jellydator/ttlcache/v2 v2.11.1 h1:AZGME43Eh2Vv3giG6GeqeLeFXxwxn1/qHItqWZl6U64= github.com/jellydator/ttlcache/v2 v2.11.1/go.mod h1:RtE5Snf0/57e+2cLWFYWCCsLas2Hy3c5Z4n14XmSvTI= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= @@ -954,8 +960,9 @@ github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magik6k/reflink v1.0.2-patch1 h1:NXSgQugcESI8Z/jBtuAI83YsZuRauY9i9WOyOnJ7Vns= github.com/magik6k/reflink v1.0.2-patch1/go.mod h1:WGkTOKNjd1FsJKBw3mu4JvrPEDJyJJ+JPtxBkbPoCok= @@ -1170,6 +1177,7 @@ github.com/pion/turn/v4 v4.1.1 h1:9UnY2HB99tpDyz3cVVZguSxcqkJ1DsTSZ+8TGruh4fc= github.com/pion/turn/v4 v4.1.1/go.mod h1:2123tHk1O++vmjI5VSD0awT50NywDAq5A2NNNU4Jjs8= github.com/pion/webrtc/v4 v4.1.5 h1:hJqfKPdRAVcXV9rsg2xcCiuXuMJ38BLW/87GsYJUtUU= github.com/pion/webrtc/v4 v4.1.5/go.mod h1:vzHh7egVnZRgkK83lYzciWVszdDs759y3/eyu6AvZRA= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1238,6 +1246,7 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= @@ -1333,6 +1342,12 @@ github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= +github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= +github.com/swaggo/http-swagger/v2 v2.0.2 h1:FKCdLsl+sFCx60KFsyM0rDarwiUSZ8DqbfSyIKC9OBg= +github.com/swaggo/http-swagger/v2 v2.0.2/go.mod h1:r7/GBkAWIfK6E/OLnE8fXnviHiDeAHmgIyooa4xm3AQ= +github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A= +github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= @@ -1363,8 +1378,9 @@ github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/gozstd v1.20.1 h1:xPnnnvjmaDDitMFfDxmQ4vpx0+3CdTg2o3lALvXTU/g= github.com/valyala/gozstd v1.20.1/go.mod h1:y5Ew47GLlP37EkTB+B4s7r6A5rdaeB7ftbl9zoYiIPQ= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= @@ -1730,6 +1746,7 @@ golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/harmony/harmonydb/harmonydb.go b/harmony/harmonydb/harmonydb.go index 31f08bf4e..3e3d0ff35 100644 --- a/harmony/harmonydb/harmonydb.go +++ b/harmony/harmonydb/harmonydb.go @@ -21,13 +21,11 @@ import ( "github.com/yugabyte/pgx/v5/pgconn" "github.com/yugabyte/pgx/v5/pgxpool" "golang.org/x/xerrors" - - "github.com/filecoin-project/curio/deps/config" ) type ITestID string -// ItestNewID see ITestWithID doc +// ITestNewID see ITestWithID doc func ITestNewID() ITestID { return ITestID(strconv.Itoa(rand.Intn(99999))) } @@ -43,11 +41,32 @@ type DB struct { var logger = logging.Logger("harmonydb") +type Config struct { + // HOSTS is a list of hostnames to nodes running YugabyteDB + // in a cluster. Only 1 is required + Hosts []string + + // The Yugabyte server's username with full credentials to operate on Lotus' Database. Blank for default. + Username string + + // The password for the related username. Blank for default. + Password string + + // The database (logical partition) within Yugabyte. Blank for default. + Database string + + // The port to find Yugabyte. Blank for default. + Port string + + // Load Balance the connection over multiple nodes + LoadBalance bool +} + // NewFromConfig is a convenience function. // In usage: // // db, err := NewFromConfig(config.HarmonyDB) // in binary init -func NewFromConfig(cfg config.HarmonyDB) (*DB, error) { +func NewFromConfig(cfg Config) (*DB, error) { return New( cfg.Hosts, cfg.Username, @@ -92,10 +111,27 @@ func NewFromConfigWithITestID(t *testing.T, id ITestID) (*DB, error) { func New(hosts []string, username, password, database, port string, loadBalance bool, itestID ITestID) (*DB, error) { itest := string(itestID) - // Join hosts with the port - hostPortPairs := make([]string, len(hosts)) - for i, host := range hosts { - hostPortPairs[i] = fmt.Sprintf("%s:%s", host, port) + if len(hosts) == 0 { + return nil, xerrors.Errorf("no hosts provided") + } + + // Debug: Log which path we're taking + logger.Infof("Yugabyte connection config: loadBalance=%v, hosts=%v, port=%s", loadBalance, hosts, port) + + // When load balancing is disabled, use only the first host to prevent + // Yugabyte client from discovering internal Docker IPs via topology discovery + var connectionHost string + if loadBalance { + // Join all hosts with the port for load balancing + hostPortPairs := make([]string, len(hosts)) + for i, host := range hosts { + hostPortPairs[i] = fmt.Sprintf("%s:%s", host, port) + } + connectionHost = strings.Join(hostPortPairs, ",") + } else { + // Use only the first host when load balancing is disabled + // This prevents topology discovery that would return internal Docker IPs + connectionHost = fmt.Sprintf("%s:%s", hosts[0], port) } // Construct the connection string @@ -103,12 +139,17 @@ func New(hosts []string, username, password, database, port string, loadBalance "postgresql://%s:%s@%s/%s?sslmode=disable", username, password, - strings.Join(hostPortPairs, ","), + connectionHost, database, ) if loadBalance { connString += "&load_balance=true" + } else { + // When load balancing is disabled, explicitly disable it + // fallback_to_topology_keys_only=true ensures client only uses specified nodes + // Note: Don't set topology_keys= (empty) as Yugabyte rejects empty topology_keys format + connString += "&load_balance=false&fallback_to_topology_keys_only=true" } schema := "curio" @@ -124,6 +165,24 @@ func New(hosts []string, username, password, database, port string, loadBalance return nil, err } + // When load balancing is disabled, restrict the pool to only use the specified host + // This prevents Yugabyte client from discovering and connecting to internal Docker IPs + if !loadBalance { + // Parse port as integer + portInt, err := strconv.ParseUint(port, 10, 16) + if err != nil { + return nil, xerrors.Errorf("invalid port: %w", err) + } + + // Override the connection config to use only our specified host + cfg.ConnConfig.Host = hosts[0] + cfg.ConnConfig.Port = uint16(portInt) + + // Note: Yugabyte-specific connection parameters (load_balance, fallback_to_topology_keys_only) + // must be set in the connection string, not as runtime parameters. + // The connection string already has these parameters set above. + } + cfg.ConnConfig.OnNotice = func(conn *pgconn.PgConn, n *pgconn.Notice) { logger.Debug("database notice: " + n.Message + ": " + n.Detail) DBMeasures.Errors.M(1) @@ -268,6 +327,8 @@ retry: //go:embed sql var fs embed.FS +var ITestUpgradeFunc func(*pgxpool.Pool, string, string) + func (db *DB) upgrade() error { // Does the version table exist? if not, make it. // NOTE: This cannot change except via the next sql file. @@ -328,7 +389,13 @@ func (db *DB) upgrade() error { if len(strings.TrimSpace(s)) == 0 { continue } - megaSql += s + ";" + trimmed := strings.TrimSpace(s) + // Only add semicolon if the statement doesn't already end with one + if !strings.HasSuffix(trimmed, ";") { + megaSql += s + ";" + } else { + megaSql += s + } } _, err = db.Exec(context.Background(), rawStringOnly(megaSql)) if err != nil { @@ -337,6 +404,10 @@ func (db *DB) upgrade() error { return xerrors.New(msg) // makes devs lives easier by placing message at the end. } + if ITestUpgradeFunc != nil { + ITestUpgradeFunc(db.pgx, name, megaSql) + } + // Mark Completed. _, err = db.Exec(context.Background(), "INSERT INTO base (entry) VALUES ($1)", name[:8]) if err != nil { diff --git a/harmony/harmonydb/sql/20230706-itest_scratch.sql b/harmony/harmonydb/sql/20230706-itest_scratch.sql index a4a333b81..622651e1f 100644 --- a/harmony/harmonydb/sql/20230706-itest_scratch.sql +++ b/harmony/harmonydb/sql/20230706-itest_scratch.sql @@ -1,4 +1,4 @@ -CREATE TABLE itest_scratch ( +CREATE TABLE IF NOT EXISTS itest_scratch ( id SERIAL PRIMARY KEY, content TEXT, some_int INTEGER, diff --git a/harmony/harmonydb/sql/20230712-sector_index.sql b/harmony/harmonydb/sql/20230712-sector_index.sql index 750884c8c..eadb15ac7 100644 --- a/harmony/harmonydb/sql/20230712-sector_index.sql +++ b/harmony/harmonydb/sql/20230712-sector_index.sql @@ -1,4 +1,4 @@ -create table sector_location +create table if not exists sector_location ( miner_id bigint not null, sector_num bigint not null, @@ -19,7 +19,7 @@ alter table sector_location alter table sector_location alter column read_refs set default 0; -create table storage_path +create table if not exists storage_path ( "storage_id" varchar not null constraint "storage_path_pkey" diff --git a/harmony/harmonydb/sql/20230719-harmony.sql b/harmony/harmonydb/sql/20230719-harmony.sql index 969b2e56b..ecf168f19 100644 --- a/harmony/harmonydb/sql/20230719-harmony.sql +++ b/harmony/harmonydb/sql/20230719-harmony.sql @@ -1,6 +1,6 @@ /* For HarmonyTask base implementation. */ -CREATE TABLE harmony_machines ( +CREATE TABLE IF NOT EXISTS harmony_machines ( id SERIAL PRIMARY KEY NOT NULL, last_contact TIMESTAMP NOT NULL DEFAULT current_timestamp, host_and_port varchar(300) NOT NULL, @@ -9,7 +9,7 @@ CREATE TABLE harmony_machines ( gpu FLOAT NOT NULL ); -CREATE TABLE harmony_task ( +CREATE TABLE IF NOT EXISTS harmony_task ( id SERIAL PRIMARY KEY NOT NULL, initiated_by INTEGER, update_time TIMESTAMP NOT NULL DEFAULT current_timestamp, @@ -28,7 +28,7 @@ COMMENT ON COLUMN harmony_task.name IS 'The name of the task type.'; COMMENT ON COLUMN harmony_task.owner_id IS 'may be null if between owners or not yet taken'; COMMENT ON COLUMN harmony_task.update_time IS 'When it was last modified. not a heartbeat'; -CREATE TABLE harmony_task_history ( +CREATE TABLE IF NOT EXISTS harmony_task_history ( id SERIAL PRIMARY KEY NOT NULL, task_id INTEGER NOT NULL, name VARCHAR(16) NOT NULL, @@ -40,14 +40,14 @@ CREATE TABLE harmony_task_history ( ); COMMENT ON COLUMN harmony_task_history.result IS 'Use to detemine if this was a successful run.'; -CREATE TABLE harmony_task_follow ( +CREATE TABLE IF NOT EXISTS harmony_task_follow ( id SERIAL PRIMARY KEY NOT NULL, owner_id INTEGER NOT NULL REFERENCES harmony_machines (id) ON DELETE CASCADE, to_type VARCHAR(16) NOT NULL, from_type VARCHAR(16) NOT NULL ); -CREATE TABLE harmony_task_impl ( +CREATE TABLE IF NOT EXISTS harmony_task_impl ( id SERIAL PRIMARY KEY NOT NULL, owner_id INTEGER NOT NULL REFERENCES harmony_machines (id) ON DELETE CASCADE, name VARCHAR(16) NOT NULL diff --git a/harmony/harmonydb/sql/20230823-wdpost.sql b/harmony/harmonydb/sql/20230823-wdpost.sql index c6f993d76..36241b8b0 100644 --- a/harmony/harmonydb/sql/20230823-wdpost.sql +++ b/harmony/harmonydb/sql/20230823-wdpost.sql @@ -1,4 +1,4 @@ -create table wdpost_partition_tasks +create table if not exists wdpost_partition_tasks ( task_id bigint not null constraint wdpost_partition_tasks_pk @@ -17,7 +17,7 @@ comment on column wdpost_partition_tasks.proving_period_start is 'proving period comment on column wdpost_partition_tasks.deadline_index is 'deadline index within the proving period'; comment on column wdpost_partition_tasks.partition_index is 'partition index within the deadline'; -create table wdpost_proofs +create table if not exists wdpost_proofs ( sp_id bigint not null, proving_period_start bigint not null, @@ -34,7 +34,7 @@ create table wdpost_proofs unique (sp_id, proving_period_start, deadline, partition) ); -create table wdpost_recovery_tasks +create table if not exists wdpost_recovery_tasks ( task_id bigint not null constraint wdpost_recovery_tasks_pk diff --git a/harmony/harmonydb/sql/20230919-config.sql b/harmony/harmonydb/sql/20230919-config.sql index 84699a0d5..ec8778163 100644 --- a/harmony/harmonydb/sql/20230919-config.sql +++ b/harmony/harmonydb/sql/20230919-config.sql @@ -1,4 +1,4 @@ -CREATE TABLE harmony_config ( +CREATE TABLE IF NOT EXISTS harmony_config ( id SERIAL PRIMARY KEY NOT NULL, title VARCHAR(300) UNIQUE NOT NULL, config TEXT NOT NULL diff --git a/harmony/harmonydb/sql/20231103-chain_sends.sql b/harmony/harmonydb/sql/20231103-chain_sends.sql index e70cf3738..d91253156 100644 --- a/harmony/harmonydb/sql/20231103-chain_sends.sql +++ b/harmony/harmonydb/sql/20231103-chain_sends.sql @@ -1,4 +1,4 @@ -create table message_sends +create table if not exists message_sends ( from_key text not null, to_addr text not null, @@ -37,14 +37,14 @@ comment on column message_sends.send_time is 'time when the send task was execut comment on column message_sends.send_success is 'whether this message was broadcasted to the network already, null if not yet attempted, true if successful, false if failed'; comment on column message_sends.send_error is 'error message if send_success is false'; -create unique index message_sends_success_index +create unique index if not exists message_sends_success_index on message_sends (from_key, nonce) where send_success is not false; comment on index message_sends_success_index is 'message_sends_success_index enforces sender/nonce uniqueness, it is a conditional index that only indexes rows where send_success is not false. This allows us to have multiple rows with the same sender/nonce, as long as only one of them was successfully broadcasted (true) to the network or is in the process of being broadcasted (null).'; -create table message_send_locks +create table if not exists message_send_locks ( from_key text not null, task_id bigint not null, diff --git a/harmony/harmonydb/sql/20231110-mining_tasks.sql b/harmony/harmonydb/sql/20231110-mining_tasks.sql index 508528ca2..13c8419dd 100644 --- a/harmony/harmonydb/sql/20231110-mining_tasks.sql +++ b/harmony/harmonydb/sql/20231110-mining_tasks.sql @@ -1,4 +1,4 @@ -create table mining_tasks +create table if not exists mining_tasks ( task_id bigint not null constraint mining_tasks_pk @@ -20,7 +20,7 @@ create table mining_tasks unique (sp_id, epoch) ); -create table mining_base_block +create table if not exists mining_base_block ( id bigserial not null constraint mining_base_block_pk diff --git a/harmony/harmonydb/sql/20231113-harmony_taskhistory_oops.sql b/harmony/harmonydb/sql/20231113-harmony_taskhistory_oops.sql index 7a71d98ae..c12288bc0 100644 --- a/harmony/harmonydb/sql/20231113-harmony_taskhistory_oops.sql +++ b/harmony/harmonydb/sql/20231113-harmony_taskhistory_oops.sql @@ -1 +1 @@ -ALTER TABLE harmony_task_history ADD COLUMN completed_by_host_and_port varchar(300) NOT NULL; \ No newline at end of file +ALTER TABLE harmony_task_history ADD COLUMN IF NOT EXISTS completed_by_host_and_port varchar(300) NOT NULL; \ No newline at end of file diff --git a/harmony/harmonydb/sql/20231120-testing1.sql b/harmony/harmonydb/sql/20231120-testing1.sql index 71daaef69..c52ca8067 100644 --- a/harmony/harmonydb/sql/20231120-testing1.sql +++ b/harmony/harmonydb/sql/20231120-testing1.sql @@ -1,8 +1,8 @@ -CREATE TABLE harmony_test ( +CREATE TABLE IF NOT EXISTS harmony_test ( task_id bigint constraint harmony_test_pk primary key, options text, result text ); -ALTER TABLE wdpost_proofs ADD COLUMN test_task_id bigint; \ No newline at end of file +ALTER TABLE wdpost_proofs ADD COLUMN IF NOT EXISTS test_task_id bigint; \ No newline at end of file diff --git a/harmony/harmonydb/sql/20231217-sdr-pipeline.sql b/harmony/harmonydb/sql/20231217-sdr-pipeline.sql index 1dffbf8a0..a7741b2a6 100644 --- a/harmony/harmonydb/sql/20231217-sdr-pipeline.sql +++ b/harmony/harmonydb/sql/20231217-sdr-pipeline.sql @@ -1,7 +1,7 @@ -- NOTE: task_ids can be the same between different task types and between different sectors -- e.g. SN-supraseal doing 128 sdr/TreeC/TreeR with the same task_id -create table sectors_sdr_pipeline ( +create table if not exists sectors_sdr_pipeline ( sp_id bigint not null, sector_number bigint not null, @@ -103,7 +103,7 @@ create table sectors_sdr_pipeline ( primary key (sp_id, sector_number) ); -create table sectors_sdr_initial_pieces ( +create table if not exists sectors_sdr_initial_pieces ( sp_id bigint not null, sector_number bigint not null, @@ -144,7 +144,7 @@ create table sectors_sdr_initial_pieces ( comment on column sectors_sdr_initial_pieces.piece_size is 'padded size of the piece'; -create table sectors_allocated_numbers ( +create table if not exists sectors_allocated_numbers ( sp_id bigint not null primary key, allocated jsonb not null ); diff --git a/harmony/harmonydb/sql/20231225-message-waits.sql b/harmony/harmonydb/sql/20231225-message-waits.sql index 74b1dd979..81483335a 100644 --- a/harmony/harmonydb/sql/20231225-message-waits.sql +++ b/harmony/harmonydb/sql/20231225-message-waits.sql @@ -1,4 +1,4 @@ -create table message_waits ( +create table if not exists message_waits ( signed_message_cid text primary key, waiter_machine_id int references harmony_machines (id) on delete set null, diff --git a/harmony/harmonydb/sql/20240228-piece-park.sql b/harmony/harmonydb/sql/20240228-piece-park.sql index b4fbfeffa..32665569c 100644 --- a/harmony/harmonydb/sql/20240228-piece-park.sql +++ b/harmony/harmonydb/sql/20240228-piece-park.sql @@ -1,4 +1,4 @@ -create table parked_pieces ( +create table if not exists parked_pieces ( id bigserial primary key, created_at timestamp default current_timestamp, @@ -13,6 +13,8 @@ create table parked_pieces ( -- long_term boolean not null default false, -- Added in 20240930-pdp.sql + -- skip boolean not null default false, -- Added in 20250505-market-mk20.sql to allow skipping download + -- NOTE: Following keys were dropped in 20240507-sdr-pipeline-fk-drop.sql foreign key (task_id) references harmony_task (id) on delete set null, -- dropped foreign key (cleanup_task_id) references harmony_task (id) on delete set null, -- dropped @@ -37,7 +39,7 @@ create table parked_pieces ( * 2. (MK12) A deal pipeline not yet assigned to a sector is deleted * */ -create table parked_piece_refs ( +create table if not exists parked_piece_refs ( ref_id bigserial primary key, piece_id bigint not null, diff --git a/harmony/harmonydb/sql/20240317-web-summary-index.sql b/harmony/harmonydb/sql/20240317-web-summary-index.sql index e1c7e7a79..ab3fe2ee2 100644 --- a/harmony/harmonydb/sql/20240317-web-summary-index.sql +++ b/harmony/harmonydb/sql/20240317-web-summary-index.sql @@ -1,8 +1,8 @@ /* Used for webui clusterMachineSummary */ -- NOTE: This index is changed in 20240420-web-task-indexes.sql -CREATE INDEX harmony_task_history_work_index +CREATE INDEX IF NOT EXISTS harmony_task_history_work_index ON harmony_task_history (completed_by_host_and_port ASC, name ASC, result ASC, work_end DESC); /* Used for webui actorSummary sp wins */ -CREATE INDEX mining_tasks_won_sp_id_base_compute_time_index +CREATE INDEX IF NOT EXISTS mining_tasks_won_sp_id_base_compute_time_index ON mining_tasks (won ASC, sp_id ASC, base_compute_time DESC); diff --git a/harmony/harmonydb/sql/20240402-sdr-pipeline-ddo-deal-info.sql b/harmony/harmonydb/sql/20240402-sdr-pipeline-ddo-deal-info.sql index 2230ef574..38303c682 100644 --- a/harmony/harmonydb/sql/20240402-sdr-pipeline-ddo-deal-info.sql +++ b/harmony/harmonydb/sql/20240402-sdr-pipeline-ddo-deal-info.sql @@ -1,8 +1,5 @@ -ALTER TABLE sectors_sdr_initial_pieces - ADD COLUMN direct_start_epoch BIGINT; +ALTER TABLE sectors_sdr_initial_pieces ADD COLUMN IF NOT EXISTS direct_start_epoch BIGINT; -ALTER TABLE sectors_sdr_initial_pieces - ADD COLUMN direct_end_epoch BIGINT; +ALTER TABLE sectors_sdr_initial_pieces ADD COLUMN IF NOT EXISTS direct_end_epoch BIGINT; -ALTER TABLE sectors_sdr_initial_pieces - ADD COLUMN direct_piece_activation_manifest JSONB; +ALTER TABLE sectors_sdr_initial_pieces ADD COLUMN IF NOT EXISTS direct_piece_activation_manifest JSONB; diff --git a/harmony/harmonydb/sql/20240404-machine_detail.sql b/harmony/harmonydb/sql/20240404-machine_detail.sql index ae6de0951..128d1ceda 100644 --- a/harmony/harmonydb/sql/20240404-machine_detail.sql +++ b/harmony/harmonydb/sql/20240404-machine_detail.sql @@ -1,4 +1,4 @@ -CREATE TABLE harmony_machine_details ( +CREATE TABLE IF NOT EXISTS harmony_machine_details ( id SERIAL PRIMARY KEY, tasks TEXT, layers TEXT, diff --git a/harmony/harmonydb/sql/20240416-harmony_singleton_task.sql b/harmony/harmonydb/sql/20240416-harmony_singleton_task.sql index d565cfa47..250795379 100644 --- a/harmony/harmonydb/sql/20240416-harmony_singleton_task.sql +++ b/harmony/harmonydb/sql/20240416-harmony_singleton_task.sql @@ -1,4 +1,4 @@ -create table harmony_task_singletons ( +create table if not exists harmony_task_singletons ( task_name varchar(255) not null, task_id bigint, last_run_time timestamp, diff --git a/harmony/harmonydb/sql/20240417-sector_index_gc.sql b/harmony/harmonydb/sql/20240417-sector_index_gc.sql index e9771d9f3..e59c7d1a3 100644 --- a/harmony/harmonydb/sql/20240417-sector_index_gc.sql +++ b/harmony/harmonydb/sql/20240417-sector_index_gc.sql @@ -1,4 +1,4 @@ -create table sector_path_url_liveness ( +create table if not exists sector_path_url_liveness ( storage_id text, url text, diff --git a/harmony/harmonydb/sql/20240420-web-task-indexes.sql b/harmony/harmonydb/sql/20240420-web-task-indexes.sql index 33eb9e736..1ae59f6ba 100644 --- a/harmony/harmonydb/sql/20240420-web-task-indexes.sql +++ b/harmony/harmonydb/sql/20240420-web-task-indexes.sql @@ -1,9 +1,9 @@ -DROP INDEX harmony_task_history_work_index; +DROP INDEX IF EXISTS harmony_task_history_work_index; /* This structure improves clusterMachineSummary query better than the old version, while at the same time also being usable by clusterTaskHistorySummary (which wasn't the case with the old index). */ -create index harmony_task_history_work_index +create index if not exists harmony_task_history_work_index on harmony_task_history (work_end desc, completed_by_host_and_port asc, name asc, result asc); diff --git a/harmony/harmonydb/sql/20240425-sector_meta.sql b/harmony/harmonydb/sql/20240425-sector_meta.sql index 9a4a7f0c6..57818085d 100644 --- a/harmony/harmonydb/sql/20240425-sector_meta.sql +++ b/harmony/harmonydb/sql/20240425-sector_meta.sql @@ -1,4 +1,4 @@ -CREATE TABLE sectors_meta ( +CREATE TABLE IF NOT EXISTS sectors_meta ( sp_id BIGINT NOT NULL, sector_num BIGINT NOT NULL, @@ -33,7 +33,7 @@ CREATE TABLE sectors_meta ( PRIMARY KEY (sp_id, sector_num) ); -CREATE TABLE sectors_meta_pieces ( +CREATE TABLE IF NOT EXISTS sectors_meta_pieces ( sp_id BIGINT NOT NULL, sector_num BIGINT NOT NULL, piece_num BIGINT NOT NULL, diff --git a/harmony/harmonydb/sql/20240501-harmony-indexes.sql b/harmony/harmonydb/sql/20240501-harmony-indexes.sql index 72a9b669a..656b832dc 100644 --- a/harmony/harmonydb/sql/20240501-harmony-indexes.sql +++ b/harmony/harmonydb/sql/20240501-harmony-indexes.sql @@ -1,4 +1,4 @@ -- Harmony counts failed tasks by task_id, without this index we'd do a full scan on the history table. -CREATE INDEX harmony_task_history_task_id_result_index +CREATE INDEX IF NOT EXISTS harmony_task_history_task_id_result_index ON harmony_task_history (task_id, result); diff --git a/harmony/harmonydb/sql/20240508-open-deal-sectors.sql b/harmony/harmonydb/sql/20240508-open-deal-sectors.sql index 068bd3a65..2f4f49725 100644 --- a/harmony/harmonydb/sql/20240508-open-deal-sectors.sql +++ b/harmony/harmonydb/sql/20240508-open-deal-sectors.sql @@ -1,7 +1,6 @@ -ALTER TABLE sectors_sdr_initial_pieces - ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT current_timestamp; +ALTER TABLE sectors_sdr_initial_pieces ADD COLUMN IF NOT EXISTS created_at TIMESTAMP NOT NULL DEFAULT current_timestamp; -create table open_sector_pieces ( +create table if not exists open_sector_pieces ( sp_id bigint not null, sector_number bigint not null, diff --git a/harmony/harmonydb/sql/20240527-machine_name.sql b/harmony/harmonydb/sql/20240527-machine_name.sql index 568ed862c..ec2008eb7 100644 --- a/harmony/harmonydb/sql/20240527-machine_name.sql +++ b/harmony/harmonydb/sql/20240527-machine_name.sql @@ -1,2 +1 @@ -ALTER TABLE harmony_machine_details - ADD COLUMN machine_name TEXT; \ No newline at end of file +ALTER TABLE harmony_machine_details ADD COLUMN IF NOT EXISTS machine_name TEXT; \ No newline at end of file diff --git a/harmony/harmonydb/sql/20240606-storage-gc.sql b/harmony/harmonydb/sql/20240606-storage-gc.sql index a80ab8a5c..2136cf0c3 100644 --- a/harmony/harmonydb/sql/20240606-storage-gc.sql +++ b/harmony/harmonydb/sql/20240606-storage-gc.sql @@ -1,4 +1,4 @@ -CREATE TABLE storage_removal_marks ( +CREATE TABLE IF NOT EXISTS storage_removal_marks ( sp_id BIGINT NOT NULL, sector_num BIGINT NOT NULL, sector_filetype BIGINT NOT NULL, @@ -12,7 +12,7 @@ CREATE TABLE storage_removal_marks ( primary key (sp_id, sector_num, sector_filetype, storage_id) ); -CREATE TABLE storage_gc_pins ( +CREATE TABLE IF NOT EXISTS storage_gc_pins ( sp_id BIGINT NOT NULL, sector_num BIGINT NOT NULL, diff --git a/harmony/harmonydb/sql/20240610-mining-inclusion-checks.sql b/harmony/harmonydb/sql/20240610-mining-inclusion-checks.sql index d074f1378..c6b8a084d 100644 --- a/harmony/harmonydb/sql/20240610-mining-inclusion-checks.sql +++ b/harmony/harmonydb/sql/20240610-mining-inclusion-checks.sql @@ -1 +1 @@ -ALTER TABLE mining_tasks ADD COLUMN included BOOLEAN DEFAULT NULL; +ALTER TABLE mining_tasks ADD COLUMN IF NOT EXISTS included BOOLEAN DEFAULT NULL; diff --git a/harmony/harmonydb/sql/20240611-snap-pipeline.sql b/harmony/harmonydb/sql/20240611-snap-pipeline.sql index 57ff929de..813e769d9 100644 --- a/harmony/harmonydb/sql/20240611-snap-pipeline.sql +++ b/harmony/harmonydb/sql/20240611-snap-pipeline.sql @@ -1,7 +1,6 @@ -ALTER TABLE open_sector_pieces - ADD COLUMN is_snap BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE open_sector_pieces ADD COLUMN IF NOT EXISTS is_snap BOOLEAN NOT NULL DEFAULT FALSE; -CREATE TABLE sectors_snap_pipeline ( +CREATE TABLE IF NOT EXISTS sectors_snap_pipeline ( sp_id BIGINT NOT NULL, sector_number BIGINT NOT NULL, @@ -57,7 +56,7 @@ CREATE TABLE sectors_snap_pipeline ( PRIMARY KEY (sp_id, sector_number) ); -create table sectors_snap_initial_pieces ( +create table if not exists sectors_snap_initial_pieces ( sp_id bigint not null, sector_number bigint not null, @@ -84,7 +83,7 @@ create table sectors_snap_initial_pieces ( primary key (sp_id, sector_number, piece_index) ); -CREATE TABLE sectors_cc_values ( +CREATE TABLE IF NOT EXISTS sectors_cc_values ( reg_seal_proof INT, cur_unsealed_cid TEXT, PRIMARY KEY (reg_seal_proof, cur_unsealed_cid) @@ -108,9 +107,9 @@ INSERT INTO sectors_cc_values (reg_seal_proof, cur_unsealed_cid) VALUES (13, 'baga6ea4seaqao7s73y24kcutaosvacpdjgfe5pw76ooefnyqw4ynr3d2y6x2mpq'), (14, 'baga6ea4seaqomqafu276g53zko4k23xzh4h4uecjwicbmvhsuqi7o4bhthhm4aq'); -ALTER TABLE sectors_meta ADD COLUMN expiration_epoch BIGINT; +ALTER TABLE sectors_meta ADD COLUMN IF NOT EXISTS expiration_epoch BIGINT; -ALTER TABLE sectors_meta ADD COLUMN is_cc BOOLEAN; +ALTER TABLE sectors_meta ADD COLUMN IF NOT EXISTS is_cc BOOLEAN; -- Create the trigger function for updating is_cc on sectors_meta CREATE OR REPLACE FUNCTION update_is_cc() @@ -141,15 +140,29 @@ UPDATE sectors_meta SET is_cc = EXISTS ( ); -- Create the trigger for updating is_cc on sectors_meta -CREATE TRIGGER insert_is_cc_trigger - BEFORE INSERT ON sectors_meta +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'insert_is_cc_trigger' + ) THEN + CREATE TRIGGER insert_is_cc_trigger BEFORE INSERT ON sectors_meta FOR EACH ROW EXECUTE FUNCTION update_is_cc(); + END IF; +END $$; -CREATE TRIGGER update_is_cc_trigger - BEFORE UPDATE ON sectors_meta +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'update_is_cc_trigger' + ) THEN + CREATE TRIGGER update_is_cc_trigger BEFORE UPDATE ON sectors_meta FOR EACH ROW EXECUTE FUNCTION update_is_cc(); + END IF; +END $$; -- Create the trigger function for updating sectors_meta based on sectors_snap_pipeline changes CREATE OR REPLACE FUNCTION update_sectors_meta_is_cc() @@ -174,20 +187,41 @@ END; $$ LANGUAGE plpgsql; -- Create triggers for sectors_snap_pipeline changes -CREATE TRIGGER update_sectors_meta_is_cc_on_insert - AFTER INSERT ON sectors_snap_pipeline +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'update_sectors_meta_is_cc_on_insert' + ) THEN + CREATE TRIGGER update_sectors_meta_is_cc_on_insert AFTER INSERT ON sectors_snap_pipeline FOR EACH ROW EXECUTE FUNCTION update_sectors_meta_is_cc(); + END IF; +END $$; -CREATE TRIGGER update_sectors_meta_is_cc_on_update - AFTER UPDATE ON sectors_snap_pipeline +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'update_sectors_meta_is_cc_on_update' + ) THEN + CREATE TRIGGER update_sectors_meta_is_cc_on_update AFTER UPDATE ON sectors_snap_pipeline FOR EACH ROW EXECUTE FUNCTION update_sectors_meta_is_cc(); + END IF; +END $$; -CREATE TRIGGER update_sectors_meta_is_cc_on_delete - AFTER DELETE ON sectors_snap_pipeline +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'update_sectors_meta_is_cc_on_delete' + ) THEN + CREATE TRIGGER update_sectors_meta_is_cc_on_delete AFTER DELETE ON sectors_snap_pipeline FOR EACH ROW EXECUTE FUNCTION update_sectors_meta_is_cc(); + END IF; +END $$; CREATE OR REPLACE FUNCTION insert_snap_ddo_piece( v_sp_id bigint, diff --git a/harmony/harmonydb/sql/20240612-deal-proposal.sql b/harmony/harmonydb/sql/20240612-deal-proposal.sql index a0ddca09a..fea7aae8f 100644 --- a/harmony/harmonydb/sql/20240612-deal-proposal.sql +++ b/harmony/harmonydb/sql/20240612-deal-proposal.sql @@ -1,2 +1 @@ -ALTER TABLE sectors_meta_pieces - ADD COLUMN f05_deal_proposal jsonb; \ No newline at end of file +ALTER TABLE sectors_meta_pieces ADD COLUMN IF NOT EXISTS f05_deal_proposal jsonb; \ No newline at end of file diff --git a/harmony/harmonydb/sql/20240617-synthetic-proofs.sql b/harmony/harmonydb/sql/20240617-synthetic-proofs.sql index 7e7010e41..1f786b3dc 100644 --- a/harmony/harmonydb/sql/20240617-synthetic-proofs.sql +++ b/harmony/harmonydb/sql/20240617-synthetic-proofs.sql @@ -1,5 +1,3 @@ -ALTER TABLE sectors_sdr_pipeline - ADD COLUMN task_id_synth bigint; +ALTER TABLE sectors_sdr_pipeline ADD COLUMN IF NOT EXISTS task_id_synth bigint; -ALTER TABLE sectors_sdr_pipeline - ADD COLUMN after_synth bool not null default false; \ No newline at end of file +ALTER TABLE sectors_sdr_pipeline ADD COLUMN IF NOT EXISTS after_synth bool not null default false; \ No newline at end of file diff --git a/harmony/harmonydb/sql/20240701-batch-sector-refs.sql b/harmony/harmonydb/sql/20240701-batch-sector-refs.sql index fac3ed229..a7d5a239f 100644 --- a/harmony/harmonydb/sql/20240701-batch-sector-refs.sql +++ b/harmony/harmonydb/sql/20240701-batch-sector-refs.sql @@ -1,4 +1,4 @@ -CREATE TABLE batch_sector_refs ( +CREATE TABLE IF NOT EXISTS batch_sector_refs ( sp_id BIGINT NOT NULL, sector_number BIGINT NOT NULL, diff --git a/harmony/harmonydb/sql/20240730-alerts.sql b/harmony/harmonydb/sql/20240730-alerts.sql index ec6b96f80..d986bafbd 100644 --- a/harmony/harmonydb/sql/20240730-alerts.sql +++ b/harmony/harmonydb/sql/20240730-alerts.sql @@ -1,4 +1,4 @@ -CREATE TABLE alerts ( +CREATE TABLE IF NOT EXISTS alerts ( id SERIAL PRIMARY KEY, machine_name VARCHAR(255) NOT NULL, message TEXT NOT NULL diff --git a/harmony/harmonydb/sql/20240731-market-migration.sql b/harmony/harmonydb/sql/20240731-market-migration.sql index 9ee7a71ed..453e2b0fa 100644 --- a/harmony/harmonydb/sql/20240731-market-migration.sql +++ b/harmony/harmonydb/sql/20240731-market-migration.sql @@ -2,7 +2,7 @@ -- Stores the deal received over the network. -- Entries are created by mk12 module and this will be used -- by UI to show deal details. Entries should never be removed from this table. -CREATE TABLE market_mk12_deals ( +CREATE TABLE IF NOT EXISTS market_mk12_deals ( uuid TEXT NOT NULL, sp_id BIGINT NOT NULL, @@ -25,6 +25,7 @@ CREATE TABLE market_mk12_deals ( piece_cid TEXT NOT NULL, piece_size BIGINT NOT NULL, + -- raw_size BIGINT (Added in 20250505-market-mk20.sql) fast_retrieval BOOLEAN NOT NULL, announce_to_ipni BOOLEAN NOT NULL, @@ -43,7 +44,7 @@ CREATE TABLE market_mk12_deals ( -- It is also used to track if a piece is indexed or not. -- Version is used to track changes of how metadata is stored. -- Cleanup for this table will be created in a later stage. -CREATE TABLE market_piece_metadata ( +CREATE TABLE IF NOT EXISTS market_piece_metadata ( piece_cid TEXT NOT NULL PRIMARY KEY, piece_size BIGINT NOT NULL, @@ -54,6 +55,8 @@ CREATE TABLE market_piece_metadata ( indexed BOOLEAN NOT NULL DEFAULT FALSE, indexed_at TIMESTAMPTZ NOT NULL DEFAULT TIMEZONE('UTC', NOW()), + -- dropped in 20250505-market-mk20.sql + -- PRIMARY KEY (piece_cid, piece_size) (Added in 20250505-market-mk20.sql) constraint market_piece_meta_identity_key unique (piece_cid, piece_size) ); @@ -62,9 +65,8 @@ CREATE TABLE market_piece_metadata ( -- This along with market_mk12_deals is used to retrievals as well as -- deal detail page in UI. -- Cleanup for this table will be created in a later stage. -CREATE TABLE market_piece_deal ( +CREATE TABLE IF NOT EXISTS market_piece_deal ( id TEXT NOT NULL, -- (UUID for new deals, PropCID for old) - piece_cid TEXT NOT NULL, boost_deal BOOLEAN NOT NULL, legacy_deal BOOLEAN NOT NULL DEFAULT FALSE, @@ -73,11 +75,16 @@ CREATE TABLE market_piece_deal ( sp_id BIGINT NOT NULL, sector_num BIGINT NOT NULL, + piece_offset BIGINT NOT NULL, -- NOT NULL dropped in 20250505-market-mk20.sql + + -- piece_ref BIGINT (Added in 20250505-market-mk20.sql) - piece_offset BIGINT NOT NULL, + piece_cid TEXT NOT NULL, piece_length BIGINT NOT NULL, raw_size BIGINT NOT NULL, + -- Dropped both constraint and primary key in 20250505-market-mk20.sql + -- ADD PRIMARY KEY (id, sp_id, piece_cid, piece_length) (Added in 20250505-market-mk20.sql) primary key (sp_id, piece_cid, id), constraint market_piece_deal_identity_key unique (sp_id, id) @@ -85,7 +92,7 @@ CREATE TABLE market_piece_deal ( -- Storage Ask for ask protocol over libp2p -- Entries for each MinerID must be present. These are updated by SetAsk method in mk12. -CREATE TABLE market_mk12_storage_ask ( +CREATE TABLE IF NOT EXISTS market_mk12_storage_ask ( sp_id BIGINT NOT NULL, price BIGINT NOT NULL, @@ -104,7 +111,7 @@ CREATE TABLE market_mk12_storage_ask ( -- Used for processing Mk12 deals. This tables tracks the deal -- throughout their lifetime. Entries are added at the same time as market_mk12_deals. -- Cleanup is done for complete deals by GC task. -CREATE TABLE market_mk12_deal_pipeline ( +CREATE TABLE IF NOT EXISTS market_mk12_deal_pipeline ( uuid TEXT NOT NULL, sp_id BIGINT NOT NULL, @@ -155,7 +162,7 @@ CREATE TABLE market_mk12_deal_pipeline ( -- This table can be used to track remote piece for offline deals -- The entries must be created by users. Entry is removed when deal is -- removed from market_mk12_deal_pipeline table using a key constraint -CREATE TABLE market_offline_urls ( +CREATE TABLE IF NOT EXISTS market_offline_urls ( uuid TEXT NOT NULL, url TEXT NOT NULL, @@ -170,7 +177,7 @@ CREATE TABLE market_offline_urls ( ); -- This table is used for coordinating libp2p nodes -CREATE TABLE libp2p ( +CREATE TABLE IF NOT EXISTS libp2p ( priv_key BYTEA NOT NULL PRIMARY KEY, peer_id TEXT NOT NULL UNIQUE, running_on TEXT DEFAULT NULL, -- harmonymachines machine id (host:port) @@ -181,7 +188,7 @@ CREATE TABLE libp2p ( -- Table for old lotus market deals. This is just for deal -- which are still alive. It should not be used for any processing -CREATE TABLE market_legacy_deals ( +CREATE TABLE IF NOT EXISTS market_legacy_deals ( signed_proposal_cid TEXT NOT NULL, sp_id BIGINT NOT NULL, client_peer_id TEXT NOT NULL, @@ -209,7 +216,7 @@ CREATE TABLE market_legacy_deals ( ); -- Table for DDO deals in Boost -CREATE TABLE market_direct_deals ( +CREATE TABLE IF NOT EXISTS market_direct_deals ( uuid TEXT NOT NULL, sp_id BIGINT NOT NULL, @@ -227,6 +234,7 @@ CREATE TABLE market_direct_deals ( piece_cid TEXT NOT NULL, piece_size BIGINT NOT NULL, + -- raw_size BIGINT (Added in 20250505-market-mk20.sql) fast_retrieval BOOLEAN NOT NULL, announce_to_ipni BOOLEAN NOT NULL, diff --git a/harmony/harmonydb/sql/20240802-sdr-pipeline-user-expiration.sql b/harmony/harmonydb/sql/20240802-sdr-pipeline-user-expiration.sql index b3f3dc7c5..ae01a76ab 100644 --- a/harmony/harmonydb/sql/20240802-sdr-pipeline-user-expiration.sql +++ b/harmony/harmonydb/sql/20240802-sdr-pipeline-user-expiration.sql @@ -1,2 +1 @@ -ALTER TABLE sectors_sdr_pipeline - ADD COLUMN user_sector_duration_epochs BIGINT DEFAULT NULL; +ALTER TABLE sectors_sdr_pipeline ADD COLUMN IF NOT EXISTS user_sector_duration_epochs BIGINT DEFAULT NULL; diff --git a/harmony/harmonydb/sql/20240809-snap-failures.sql b/harmony/harmonydb/sql/20240809-snap-failures.sql index 352786be3..d8c2f183d 100644 --- a/harmony/harmonydb/sql/20240809-snap-failures.sql +++ b/harmony/harmonydb/sql/20240809-snap-failures.sql @@ -1,11 +1,7 @@ -ALTER TABLE sectors_snap_pipeline - ADD COLUMN failed BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE sectors_snap_pipeline ADD COLUMN IF NOT EXISTS failed BOOLEAN NOT NULL DEFAULT FALSE; -ALTER TABLE sectors_snap_pipeline - ADD COLUMN failed_at TIMESTAMP WITH TIME ZONE; +ALTER TABLE sectors_snap_pipeline ADD COLUMN IF NOT EXISTS failed_at TIMESTAMP WITH TIME ZONE; -ALTER TABLE sectors_snap_pipeline - ADD COLUMN failed_reason VARCHAR(20) NOT NULL DEFAULT ''; +ALTER TABLE sectors_snap_pipeline ADD COLUMN IF NOT EXISTS failed_reason VARCHAR(20) NOT NULL DEFAULT ''; -ALTER TABLE sectors_snap_pipeline - ADD COLUMN failed_reason_msg TEXT NOT NULL DEFAULT ''; +ALTER TABLE sectors_snap_pipeline ADD COLUMN IF NOT EXISTS failed_reason_msg TEXT NOT NULL DEFAULT ''; diff --git a/harmony/harmonydb/sql/20240814-pipeline-task-events.sql b/harmony/harmonydb/sql/20240814-pipeline-task-events.sql index 316f70a42..dd2b47f5d 100644 --- a/harmony/harmonydb/sql/20240814-pipeline-task-events.sql +++ b/harmony/harmonydb/sql/20240814-pipeline-task-events.sql @@ -1,4 +1,4 @@ -CREATE TABLE sectors_pipeline_events +CREATE TABLE IF NOT EXISTS sectors_pipeline_events ( sp_id BIGINT NOT NULL, sector_number BIGINT NOT NULL, diff --git a/harmony/harmonydb/sql/20240823-ipni.sql b/harmony/harmonydb/sql/20240823-ipni.sql index b9b9117c2..a3966b932 100644 --- a/harmony/harmonydb/sql/20240823-ipni.sql +++ b/harmony/harmonydb/sql/20240823-ipni.sql @@ -1,15 +1,15 @@ -- Table for storing IPNI ads -CREATE TABLE ipni_peerid ( +CREATE TABLE IF NOT EXISTS ipni_peerid ( priv_key BYTEA NOT NULL PRIMARY KEY, peer_id TEXT NOT NULL UNIQUE, sp_id BIGINT NOT NULL -- 20241106-market-fixes.sql UNIQUE ); -CREATE TABLE ipni ( +CREATE TABLE IF NOT EXISTS ipni ( order_number BIGSERIAL PRIMARY KEY, -- Unique increasing order number ad_cid TEXT NOT NULL, context_id BYTEA NOT NULL, -- abi.PieceInfo in Curio - -- metadata column in not required as Curio only supports one type of metadata(HTTP) + -- metadata BYTEA NOT NULL DEFAULT '\xa01200' (Added in 20250505-market-mk20.sql) is_rm BOOLEAN NOT NULL, -- skip added in 20241106-market-fixes.sql @@ -26,11 +26,13 @@ CREATE TABLE ipni ( piece_cid TEXT NOT NULL, -- For easy look up piece_size BIGINT NOT NULL, -- For easy look up + -- piece_cid_v2 TEXT (Added in 20250505-market-mk20.sql) -- For easy lookup + unique (ad_cid) ); -- This index will help speed up the lookup of all ads for a specific provider and ensure fast ordering by order_number -CREATE INDEX ipni_provider_order_number ON ipni(provider, order_number); +CREATE INDEX IF NOT EXISTS ipni_provider_order_number ON ipni(provider, order_number); -- This index will speed up lookups based on the ad_cid, which is frequently used to identify specific ads CREATE UNIQUE INDEX ipni_ad_cid ON ipni(ad_cid); @@ -42,10 +44,10 @@ CREATE UNIQUE INDEX ipni_context_id ON ipni(context_id, ad_cid, is_rm); -- dropp -- CREATE INDEX ipni_entries_skip ON ipni(entries, is_skip, piece_cid); -- Since the get_ad_chain function relies on both provider and ad_cid to find the order_number, this index will optimize that query: -CREATE INDEX ipni_provider_ad_cid ON ipni(provider, ad_cid); +CREATE INDEX IF NOT EXISTS ipni_provider_ad_cid ON ipni(provider, ad_cid); -CREATE TABLE ipni_head ( +CREATE TABLE IF NOT EXISTS ipni_head ( provider TEXT NOT NULL PRIMARY KEY, -- PeerID from libp2p, this is the main identifier head TEXT NOT NULL, -- ad_cid from the ipni table, representing the head of the ad chain @@ -54,9 +56,9 @@ CREATE TABLE ipni_head ( -- This table stores metadata for ipni ad entry chunks. This metadata is used to reconstruct the original ad entry from -- on-disk .car block headers or from data in the piece index database. -CREATE TABLE ipni_chunks ( +CREATE TABLE IF NOT EXISTS ipni_chunks ( cid TEXT PRIMARY KEY, -- CID of the chunk - piece_cid TEXT NOT NULL, -- Related Piece CID + piece_cid TEXT NOT NULL, -- Related Piece CID V2 chunk_num INTEGER NOT NULL, -- Chunk number within the piece. Chunk 0 has no "next" link. first_cid TEXT, -- In case of db-based chunks, the CID of the first cid in the chunk start_offset BIGINT, -- In case of .car-based chunks, the offset in the .car file where the chunk starts @@ -72,7 +74,7 @@ CREATE TABLE ipni_chunks ( -- IPNI pipeline is kept separate from rest for robustness -- and reuse. This allows for removing, recreating ads using CLI. -CREATE TABLE ipni_task ( +CREATE TABLE IF NOT EXISTS ipni_task ( sp_id BIGINT NOT NULL, sector BIGINT NOT NULL, reg_seal_proof INT NOT NULL, @@ -87,6 +89,8 @@ CREATE TABLE ipni_task ( task_id BIGINT DEFAULT NULL, complete BOOLEAN DEFAULT FALSE, + -- id TEXT (Added in 20250505-market-mk20.sql) + PRIMARY KEY (provider, context_id, is_rm) ); @@ -175,24 +179,24 @@ BEGIN -- If a different is_rm exists for the same context_id and provider, insert the new task IF FOUND THEN - INSERT INTO ipni_task (sp_id, sector, reg_seal_proof, sector_offset, provider, context_id, is_rm, created_at, task_id, complete) - VALUES (_sp_id, _sector, _reg_seal_proof, _sector_offset, _provider, _context_id, _is_rm, TIMEZONE('UTC', NOW()), _task_id, FALSE); - RETURN; + INSERT INTO ipni_task (sp_id, sector, reg_seal_proof, sector_offset, provider, context_id, is_rm, created_at, task_id, complete) + VALUES (_sp_id, _sector, _reg_seal_proof, _sector_offset, _provider, _context_id, _is_rm, TIMEZONE('UTC', NOW()), _task_id, FALSE); + RETURN; END IF; - -- If no conflicting entry is found in ipni_task, check the latest ad in ipni table + -- If no conflicting entry is found in ipni_task, check the latest ad in ipni table SELECT is_rm INTO _latest_is_rm FROM ipni WHERE provider = _provider AND context_id = _context_id ORDER BY order_number DESC - LIMIT 1; + LIMIT 1; -- If the latest ad has the same is_rm value, raise an exception IF FOUND AND _latest_is_rm = _is_rm THEN RAISE EXCEPTION 'already published'; END IF; - -- If all conditions are met, insert the new task into ipni_task + -- If all conditions are met, insert the new task into ipni_task INSERT INTO ipni_task (sp_id, sector, reg_seal_proof, sector_offset, provider, context_id, is_rm, created_at, task_id, complete) VALUES (_sp_id, _sector, _reg_seal_proof, _sector_offset, _provider, _context_id, _is_rm, TIMEZONE('UTC', NOW()), _task_id, FALSE); END; diff --git a/harmony/harmonydb/sql/20240824-longterm-indexes.sql b/harmony/harmonydb/sql/20240824-longterm-indexes.sql index 2b5e8e83e..423114bc6 100644 --- a/harmony/harmonydb/sql/20240824-longterm-indexes.sql +++ b/harmony/harmonydb/sql/20240824-longterm-indexes.sql @@ -1,8 +1,8 @@ -create index mining_base_block_task_id_id_index +create index if not exists mining_base_block_task_id_id_index on mining_base_block (task_id, id); -create index message_waits_waiter_machine_id_index +create index if not exists message_waits_waiter_machine_id_index on message_waits (waiter_machine_id); -create index message_sends_signed_cid_index +create index if not exists message_sends_signed_cid_index on message_sends (signed_cid); \ No newline at end of file diff --git a/harmony/harmonydb/sql/20240826-sector-partition.sql b/harmony/harmonydb/sql/20240826-sector-partition.sql index f2d8279d9..34f40b334 100644 --- a/harmony/harmonydb/sql/20240826-sector-partition.sql +++ b/harmony/harmonydb/sql/20240826-sector-partition.sql @@ -1,11 +1,11 @@ -ALTER TABLE sectors_meta ADD COLUMN deadline BIGINT; -ALTER TABLE sectors_meta ADD COLUMN partition BIGINT; +ALTER TABLE sectors_meta ADD COLUMN IF NOT EXISTS deadline BIGINT; +ALTER TABLE sectors_meta ADD COLUMN IF NOT EXISTS partition BIGINT; -- index on deadline/partition/spid/sectornum -CREATE INDEX sectors_meta_deadline_partition_spid_sectornum_index ON sectors_meta(deadline, partition, sp_id, sector_num); +CREATE INDEX IF NOT EXISTS sectors_meta_deadline_partition_spid_sectornum_index ON sectors_meta(deadline, partition, sp_id, sector_num); -- schedule delay in case the sector got into an immutable deadline -ALTER TABLE sectors_snap_pipeline ADD COLUMN submit_after TIMESTAMP WITH TIME ZONE; +ALTER TABLE sectors_snap_pipeline ADD COLUMN IF NOT EXISTS submit_after TIMESTAMP WITH TIME ZONE; -- force sector metadata refresh DELETE FROM harmony_task_singletons WHERE task_name = 'SectorMetadata' and task_id IS NULL; \ No newline at end of file diff --git a/harmony/harmonydb/sql/20240903-unseal-pipeline.sql b/harmony/harmonydb/sql/20240903-unseal-pipeline.sql index c1d7d668a..93ea852d9 100644 --- a/harmony/harmonydb/sql/20240903-unseal-pipeline.sql +++ b/harmony/harmonydb/sql/20240903-unseal-pipeline.sql @@ -1,4 +1,4 @@ -CREATE TABLE sectors_unseal_pipeline ( +CREATE TABLE IF NOT EXISTS sectors_unseal_pipeline ( sp_id BIGINT NOT NULL, sector_number BIGINT NOT NULL, reg_seal_proof BIGINT NOT NULL, @@ -14,7 +14,7 @@ CREATE TABLE sectors_unseal_pipeline ( primary key (sp_id, sector_number) ); -ALTER TABLE sectors_meta ADD COLUMN target_unseal_state BOOLEAN; +ALTER TABLE sectors_meta ADD COLUMN IF NOT EXISTS target_unseal_state BOOLEAN; -- To unseal -- 1. Target unseal state is true @@ -91,8 +91,15 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER trig_sectors_meta_update_materialized - AFTER INSERT OR UPDATE OR DELETE ON sectors_meta +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'trig_sectors_meta_update_materialized' + ) THEN + CREATE TRIGGER trig_sectors_meta_update_materialized AFTER INSERT OR UPDATE OR DELETE ON sectors_meta FOR EACH ROW EXECUTE FUNCTION trig_sectors_meta_update_materialized(); + END IF; +END $$; -- not triggering on sector_location, storage can be detached occasionally and auto-scheduling 10000s of unseals is bad diff --git a/harmony/harmonydb/sql/20240904-scrub-unseal-check.sql b/harmony/harmonydb/sql/20240904-scrub-unseal-check.sql index c6c8bc70a..26053d640 100644 --- a/harmony/harmonydb/sql/20240904-scrub-unseal-check.sql +++ b/harmony/harmonydb/sql/20240904-scrub-unseal-check.sql @@ -1,4 +1,4 @@ -CREATE TABLE scrub_unseal_commd_check ( +CREATE TABLE IF NOT EXISTS scrub_unseal_commd_check ( check_id BIGSERIAL PRIMARY KEY, sp_id BIGINT NOT NULL, diff --git a/harmony/harmonydb/sql/20240906-http-server.sql b/harmony/harmonydb/sql/20240906-http-server.sql index 4e02fc545..fc4aa388f 100644 --- a/harmony/harmonydb/sql/20240906-http-server.sql +++ b/harmony/harmonydb/sql/20240906-http-server.sql @@ -1,4 +1,4 @@ -CREATE TABLE autocert_cache ( +CREATE TABLE IF NOT EXISTS autocert_cache ( k TEXT NOT NULL PRIMARY KEY, v BYTEA NOT NULL ); \ No newline at end of file diff --git a/harmony/harmonydb/sql/20240927-task-retrywait.sql b/harmony/harmonydb/sql/20240927-task-retrywait.sql index 0208826bd..05b304c36 100644 --- a/harmony/harmonydb/sql/20240927-task-retrywait.sql +++ b/harmony/harmonydb/sql/20240927-task-retrywait.sql @@ -1 +1 @@ -ALTER TABLE harmony_task ADD COLUMN retries BIGINT NOT NULL DEFAULT 0; +ALTER TABLE harmony_task ADD COLUMN IF NOT EXISTS retries BIGINT NOT NULL DEFAULT 0; diff --git a/harmony/harmonydb/sql/20240929-chain-sends-eth.sql b/harmony/harmonydb/sql/20240929-chain-sends-eth.sql index 2d3dc7cbf..fdb270660 100644 --- a/harmony/harmonydb/sql/20240929-chain-sends-eth.sql +++ b/harmony/harmonydb/sql/20240929-chain-sends-eth.sql @@ -1,10 +1,10 @@ -CREATE TABLE eth_keys ( +CREATE TABLE IF NOT EXISTS eth_keys ( address TEXT NOT NULL PRIMARY KEY, private_key BYTEA NOT NULL, role TEXT NOT NULL ); -CREATE TABLE message_sends_eth +CREATE TABLE IF NOT EXISTS message_sends_eth ( from_address TEXT NOT NULL, to_address TEXT NOT NULL, @@ -46,7 +46,7 @@ CREATE UNIQUE INDEX message_sends_eth_success_index COMMENT ON INDEX message_sends_eth_success_index IS 'message_sends_eth_success_index enforces sender/nonce uniqueness, it is a conditional index that only indexes rows where send_success is not false. This allows us to have multiple rows with the same sender/nonce, as long as only one of them was successfully broadcasted (true) to the network or is in the process of being broadcasted (null).'; -CREATE TABLE message_send_eth_locks +CREATE TABLE IF NOT EXISTS message_send_eth_locks ( from_address TEXT NOT NULL, task_id BIGINT NOT NULL, @@ -56,7 +56,7 @@ CREATE TABLE message_send_eth_locks PRIMARY KEY (from_address) ); -CREATE TABLE message_waits_eth ( +CREATE TABLE IF NOT EXISTS message_waits_eth ( signed_tx_hash TEXT PRIMARY KEY, waiter_machine_id INT REFERENCES harmony_machines (id) ON DELETE SET NULL, @@ -70,6 +70,6 @@ CREATE TABLE message_waits_eth ( ); -- index for UPDATE message_waits_eth SET waiter_machine_id = $1 WHERE waiter_machine_id IS NULL AND tx_status = 'pending' -CREATE INDEX idx_message_waits_eth_pending +CREATE INDEX IF NOT EXISTS idx_message_waits_eth_pending ON message_waits_eth (waiter_machine_id) WHERE waiter_machine_id IS NULL AND tx_status = 'pending'; diff --git a/harmony/harmonydb/sql/20240930-pdp.sql b/harmony/harmonydb/sql/20240930-pdp.sql index f9ed4832c..31a250104 100644 --- a/harmony/harmonydb/sql/20240930-pdp.sql +++ b/harmony/harmonydb/sql/20240930-pdp.sql @@ -1,16 +1,16 @@ -- Piece Park adjustments -ALTER TABLE parked_pieces ADD COLUMN long_term BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE parked_pieces ADD COLUMN IF NOT EXISTS long_term BOOLEAN NOT NULL DEFAULT FALSE; ALTER TABLE parked_pieces DROP CONSTRAINT IF EXISTS parked_pieces_piece_cid_key; ALTER TABLE parked_pieces DROP CONSTRAINT IF EXISTS parked_pieces_piece_cid_cleanup_task_id_key; ALTER TABLE parked_pieces ADD CONSTRAINT parked_pieces_piece_cid_cleanup_task_id_key UNIQUE (piece_cid, piece_padded_size, long_term, cleanup_task_id); -ALTER TABLE parked_piece_refs ADD COLUMN long_term BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE parked_piece_refs ADD COLUMN IF NOT EXISTS long_term BOOLEAN NOT NULL DEFAULT FALSE; -- PDP tables -- PDP services authenticate with ecdsa-sha256 keys; Allowed services here -CREATE TABLE pdp_services ( +CREATE TABLE IF NOT EXISTS pdp_services ( id BIGSERIAL PRIMARY KEY, pubkey BYTEA NOT NULL, @@ -23,7 +23,7 @@ CREATE TABLE pdp_services ( UNIQUE(service_label) ); -CREATE TABLE pdp_piece_uploads ( +CREATE TABLE IF NOT EXISTS pdp_piece_uploads ( id UUID PRIMARY KEY NOT NULL, service TEXT NOT NULL, -- pdp_services.id @@ -45,7 +45,7 @@ CREATE TABLE pdp_piece_uploads ( ); -- PDP piece references, this table tells Curio which pieces in storage are managed by PDP -CREATE TABLE pdp_piecerefs ( +CREATE TABLE IF NOT EXISTS pdp_piecerefs ( id BIGSERIAL PRIMARY KEY, service TEXT NOT NULL, -- pdp_services.id piece_cid TEXT NOT NULL, -- piece cid v2 @@ -60,17 +60,17 @@ CREATE TABLE pdp_piecerefs ( ); -- PDP hash to piece cid mapping -CREATE TABLE pdp_piece_mh_to_commp ( +CREATE TABLE IF NOT EXISTS pdp_piece_mh_to_commp ( mhash BYTEA PRIMARY KEY, size BIGINT NOT NULL, commp TEXT NOT NULL ); -CREATE INDEX pdp_piecerefs_piece_cid_idx ON pdp_piecerefs(piece_cid); +CREATE INDEX IF NOT EXISTS pdp_piecerefs_piece_cid_idx ON pdp_piecerefs(piece_cid); -- PDP proofsets we maintain -CREATE TABLE pdp_proof_sets ( +CREATE TABLE IF NOT EXISTS pdp_proof_sets ( id BIGINT PRIMARY KEY, -- on-chain proofset id -- updated when a challenge is requested (either by first proofset add or by invokes of nextProvingPeriod) @@ -100,7 +100,7 @@ CREATE TABLE pdp_proof_sets ( service TEXT NOT NULL REFERENCES pdp_services(service_label) ON DELETE RESTRICT ); -CREATE TABLE pdp_prove_tasks ( +CREATE TABLE IF NOT EXISTS pdp_prove_tasks ( proofset BIGINT NOT NULL, -- pdp_proof_sets.id task_id BIGINT NOT NULL, -- harmonytask task ID @@ -110,7 +110,7 @@ CREATE TABLE pdp_prove_tasks ( ); -- proofset creation requests -CREATE TABLE pdp_proofset_creates ( +CREATE TABLE IF NOT EXISTS pdp_proofset_creates ( create_message_hash TEXT PRIMARY KEY REFERENCES message_waits_eth(signed_tx_hash) ON DELETE CASCADE, -- NULL if not yet processed, TRUE if processed and successful, FALSE if processed and failed @@ -124,7 +124,7 @@ CREATE TABLE pdp_proofset_creates ( ); -- proofset roots -CREATE TABLE pdp_proofset_roots ( +CREATE TABLE IF NOT EXISTS pdp_proofset_roots ( proofset BIGINT NOT NULL, -- pdp_proof_sets.id root TEXT NOT NULL, -- root cid (piececid v2) @@ -147,7 +147,7 @@ CREATE TABLE pdp_proofset_roots ( ); -- proofset root adds - tracking add-root messages which didn't land yet, so don't have a known root_id -CREATE TABLE pdp_proofset_root_adds ( +CREATE TABLE IF NOT EXISTS pdp_proofset_root_adds ( proofset BIGINT NOT NULL, -- pdp_proof_sets.id root TEXT NOT NULL, -- root cid (piececid v2) @@ -179,11 +179,18 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER pdp_proofset_root_insert - AFTER INSERT ON pdp_proofset_roots +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'pdp_proofset_root_insert' + ) THEN + CREATE TRIGGER pdp_proofset_root_insert AFTER INSERT ON pdp_proofset_roots FOR EACH ROW WHEN (NEW.pdp_pieceref IS NOT NULL) EXECUTE FUNCTION increment_proofset_refcount(); + END IF; +END $$; CREATE OR REPLACE FUNCTION decrement_proofset_refcount() RETURNS TRIGGER AS $$ @@ -195,11 +202,18 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER pdp_proofset_root_delete - AFTER DELETE ON pdp_proofset_roots +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'pdp_proofset_root_delete' + ) THEN + CREATE TRIGGER pdp_proofset_root_delete AFTER DELETE ON pdp_proofset_roots FOR EACH ROW WHEN (OLD.pdp_pieceref IS NOT NULL) EXECUTE FUNCTION decrement_proofset_refcount(); + END IF; +END $$; CREATE OR REPLACE FUNCTION adjust_proofset_refcount_on_update() RETURNS TRIGGER AS $$ @@ -222,10 +236,17 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER pdp_proofset_root_update - AFTER UPDATE ON pdp_proofset_roots +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'pdp_proofset_root_update' + ) THEN + CREATE TRIGGER pdp_proofset_root_update AFTER UPDATE ON pdp_proofset_roots FOR EACH ROW EXECUTE FUNCTION adjust_proofset_refcount_on_update(); + END IF; +END $$; -- proofset creation request trigger CREATE OR REPLACE FUNCTION update_pdp_proofset_creates() @@ -245,10 +266,17 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER pdp_proofset_create_message_status_change - AFTER UPDATE OF tx_status, tx_success ON message_waits_eth +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'pdp_proofset_create_message_status_change' + ) THEN + CREATE TRIGGER pdp_proofset_create_message_status_change AFTER UPDATE OF tx_status, tx_success ON message_waits_eth FOR EACH ROW EXECUTE PROCEDURE update_pdp_proofset_creates(); + END IF; +END $$; -- add proofset add message trigger CREATE OR REPLACE FUNCTION update_pdp_proofset_roots() @@ -268,7 +296,14 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER pdp_proofset_add_message_status_change - AFTER UPDATE OF tx_status, tx_success ON message_waits_eth +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'pdp_proofset_add_message_status_change' + ) THEN + CREATE TRIGGER pdp_proofset_add_message_status_change AFTER UPDATE OF tx_status, tx_success ON message_waits_eth FOR EACH ROW EXECUTE PROCEDURE update_pdp_proofset_roots(); + END IF; +END $$; diff --git a/harmony/harmonydb/sql/20241017-market-mig-indexing.sql b/harmony/harmonydb/sql/20241017-market-mig-indexing.sql index 357296c13..3b0853838 100644 --- a/harmony/harmonydb/sql/20241017-market-mig-indexing.sql +++ b/harmony/harmonydb/sql/20241017-market-mig-indexing.sql @@ -1,6 +1,6 @@ -- All indexing task entries are made into this table -- and then copied over to market_mk12_deal_pipeline for a controlled migration -CREATE TABLE market_mk12_deal_pipeline_migration ( +CREATE TABLE IF NOT EXISTS market_mk12_deal_pipeline_migration ( uuid TEXT NOT NULL PRIMARY KEY, sp_id BIGINT NOT NULL, piece_cid TEXT NOT NULL, diff --git a/harmony/harmonydb/sql/20241021-f3.sql b/harmony/harmonydb/sql/20241021-f3.sql index 4dd78e881..d0a49c889 100644 --- a/harmony/harmonydb/sql/20241021-f3.sql +++ b/harmony/harmonydb/sql/20241021-f3.sql @@ -1,4 +1,4 @@ -CREATE TABLE f3_tasks ( +CREATE TABLE IF NOT EXISTS f3_tasks ( sp_id BIGINT PRIMARY KEY, task_id BIGINT UNIQUE, previous_ticket BYTEA, diff --git a/harmony/harmonydb/sql/20241029-mk12-filters.sql b/harmony/harmonydb/sql/20241029-mk12-filters.sql index 2fcc2267d..715609a7f 100644 --- a/harmony/harmonydb/sql/20241029-mk12-filters.sql +++ b/harmony/harmonydb/sql/20241029-mk12-filters.sql @@ -1,5 +1,5 @@ -- This table allows creating custom pricing rules -CREATE TABLE market_mk12_pricing_filters ( +CREATE TABLE IF NOT EXISTS market_mk12_pricing_filters ( name TEXT PRIMARY KEY, -- Filter name min_duration_days INT NOT NULL DEFAULT 180, -- Minimum Deal Duration in days @@ -13,7 +13,7 @@ CREATE TABLE market_mk12_pricing_filters ( ); -- This table allows attaching custom pricing rules to specific clients -CREATE TABLE market_mk12_client_filters ( +CREATE TABLE IF NOT EXISTS market_mk12_client_filters ( name TEXT PRIMARY KEY, -- Name of the rule active BOOLEAN NOT NULL DEFAULT FALSE, -- If the rules should be applied or not @@ -29,7 +29,7 @@ CREATE TABLE market_mk12_client_filters ( ); -- Table to track allow/deny list for client wallets -CREATE TABLE market_allow_list ( +CREATE TABLE IF NOT EXISTS market_allow_list ( wallet TEXT PRIMARY KEY, -- The wallet to allow/deny deals status BOOLEAN NOT NULL -- TRUE for allow, FALSE for deny ); @@ -113,22 +113,43 @@ END; $$ LANGUAGE plpgsql; -- Trigger for enforcing uniqueness in wallets array -CREATE TRIGGER unique_wallets_trigger - BEFORE INSERT OR UPDATE ON market_mk12_client_filters +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'unique_wallets_trigger' + ) THEN + CREATE TRIGGER unique_wallets_trigger BEFORE INSERT OR UPDATE ON market_mk12_client_filters FOR EACH ROW EXECUTE FUNCTION enforce_unique_wallets(); + END IF; +END $$; -- Trigger for enforcing uniqueness in peer_ids array -CREATE TRIGGER unique_peers_trigger - BEFORE INSERT OR UPDATE ON market_mk12_client_filters +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'unique_peers_trigger' + ) THEN + CREATE TRIGGER unique_peers_trigger BEFORE INSERT OR UPDATE ON market_mk12_client_filters FOR EACH ROW EXECUTE FUNCTION enforce_unique_peers(); + END IF; +END $$; -- Trigger for enforcing uniqueness in pricing_filters array -CREATE TRIGGER unique_pricing_filters_trigger - BEFORE INSERT OR UPDATE ON market_mk12_client_filters +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'unique_pricing_filters_trigger' + ) THEN + CREATE TRIGGER unique_pricing_filters_trigger BEFORE INSERT OR UPDATE ON market_mk12_client_filters FOR EACH ROW EXECUTE FUNCTION enforce_unique_pricing_filters(); + END IF; +END $$; -- Function to enforce naming convention on "name" column CREATE OR REPLACE FUNCTION enforce_name_naming_convention() @@ -144,13 +165,27 @@ END; $$ LANGUAGE plpgsql; -- Trigger for the market_mk12_client_filters table to enforce the naming convention on "name" column -CREATE TRIGGER enforce_name_convention_market_mk12_client_filters - BEFORE INSERT OR UPDATE ON market_mk12_client_filters +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'enforce_name_convention_market_mk12_client_filters' + ) THEN + CREATE TRIGGER enforce_name_convention_market_mk12_client_filters BEFORE INSERT OR UPDATE ON market_mk12_client_filters FOR EACH ROW EXECUTE FUNCTION enforce_name_naming_convention(); + END IF; +END $$; -- Trigger for the market_mk12_pricing_filters table to enforce the naming convention on "name" column -CREATE TRIGGER enforce_name_convention_market_mk12_pricing_filters - BEFORE INSERT OR UPDATE ON market_mk12_pricing_filters +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'enforce_name_convention_market_mk12_pricing_filters' + ) THEN + CREATE TRIGGER enforce_name_convention_market_mk12_pricing_filters BEFORE INSERT OR UPDATE ON market_mk12_pricing_filters FOR EACH ROW EXECUTE FUNCTION enforce_name_naming_convention(); + END IF; +END $$; diff --git a/harmony/harmonydb/sql/20241030-deal-label.sql b/harmony/harmonydb/sql/20241030-deal-label.sql index a553db971..d97afeff9 100644 --- a/harmony/harmonydb/sql/20241030-deal-label.sql +++ b/harmony/harmonydb/sql/20241030-deal-label.sql @@ -1,2 +1 @@ -ALTER TABLE market_mk12_deals - ADD COLUMN label BYTEA; \ No newline at end of file +ALTER TABLE market_mk12_deals ADD COLUMN IF NOT EXISTS label BYTEA; \ No newline at end of file diff --git a/harmony/harmonydb/sql/20241104-piece-info.sql b/harmony/harmonydb/sql/20241104-piece-info.sql index 097a32f55..49e36694f 100644 --- a/harmony/harmonydb/sql/20241104-piece-info.sql +++ b/harmony/harmonydb/sql/20241104-piece-info.sql @@ -1,6 +1,6 @@ -- Piece summary table. This table will always have 1 row only and will be updated -- by triggers -CREATE TABLE piece_summary ( +CREATE TABLE IF NOT EXISTS piece_summary ( id BOOLEAN PRIMARY KEY DEFAULT TRUE, -- Single-row identifier, always set to TRUE total BIGINT NOT NULL DEFAULT 0, indexed BIGINT NOT NULL DEFAULT 0, @@ -43,10 +43,17 @@ END; $$ LANGUAGE plpgsql; -- Trigger to call update_piece_summary function on insert to market_piece_metadata -CREATE TRIGGER trigger_update_piece_summary - AFTER INSERT OR UPDATE ON market_piece_metadata +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'trigger_update_piece_summary' + ) THEN + CREATE TRIGGER trigger_update_piece_summary AFTER INSERT OR UPDATE ON market_piece_metadata FOR EACH ROW EXECUTE FUNCTION update_piece_summary(); + END IF; +END $$; diff --git a/harmony/harmonydb/sql/20241105-walletnames.sql b/harmony/harmonydb/sql/20241105-walletnames.sql index 1bef61aa1..c1bc23e2d 100644 --- a/harmony/harmonydb/sql/20241105-walletnames.sql +++ b/harmony/harmonydb/sql/20241105-walletnames.sql @@ -1,4 +1,4 @@ -CREATE TABLE wallet_names ( +CREATE TABLE IF NOT EXISTS wallet_names ( wallet VARCHAR PRIMARY KEY, name VARCHAR(60) NOT NULL UNIQUE ); diff --git a/harmony/harmonydb/sql/20241106-market-fixes.sql b/harmony/harmonydb/sql/20241106-market-fixes.sql index f98ca4592..c48723e6a 100644 --- a/harmony/harmonydb/sql/20241106-market-fixes.sql +++ b/harmony/harmonydb/sql/20241106-market-fixes.sql @@ -9,15 +9,14 @@ CREATE UNIQUE INDEX market_piece_deal_piece_cid_id_uindex alter table market_mk12_deals add proposal_cid text not null; -CREATE INDEX market_mk12_deals_proposal_cid_index +CREATE INDEX IF NOT EXISTS market_mk12_deals_proposal_cid_index ON market_mk12_deals (proposal_cid); -- Add the is_skip column to the ipni table -ALTER TABLE ipni - ADD COLUMN is_skip BOOLEAN NOT NULL DEFAULT FALSE; -- set to true means return 404 for related entries +ALTER TABLE ipni ADD COLUMN IF NOT EXISTS is_skip BOOLEAN NOT NULL DEFAULT FALSE; -- set to true means return 404 for related entries DROP INDEX IF EXISTS ipni_context_id; -CREATE INDEX ipni_context_id ON ipni(context_id, ad_cid, is_rm, is_skip); +CREATE INDEX IF NOT EXISTS ipni_context_id ON ipni(context_id, ad_cid, is_rm, is_skip); -CREATE INDEX ipni_entries_skip ON ipni(entries, is_skip, piece_cid); \ No newline at end of file +CREATE INDEX IF NOT EXISTS ipni_entries_skip ON ipni(entries, is_skip, piece_cid); \ No newline at end of file diff --git a/harmony/harmonydb/sql/20241210-sdr-batching.sql b/harmony/harmonydb/sql/20241210-sdr-batching.sql index 41f7b44e0..4b7f54516 100644 --- a/harmony/harmonydb/sql/20241210-sdr-batching.sql +++ b/harmony/harmonydb/sql/20241210-sdr-batching.sql @@ -1,5 +1,5 @@ -ALTER TABLE sectors_sdr_pipeline ADD COLUMN precommit_ready_at TIMESTAMPTZ; -ALTER TABLE sectors_sdr_pipeline ADD COLUMN commit_ready_at TIMESTAMPTZ; +ALTER TABLE sectors_sdr_pipeline ADD COLUMN IF NOT EXISTS precommit_ready_at TIMESTAMPTZ; +ALTER TABLE sectors_sdr_pipeline ADD COLUMN IF NOT EXISTS commit_ready_at TIMESTAMPTZ; UPDATE sectors_sdr_pipeline SET precommit_ready_at = CURRENT_TIMESTAMP AT TIME ZONE 'UTC' WHERE after_tree_r = TRUE; UPDATE sectors_sdr_pipeline SET commit_ready_at = CURRENT_TIMESTAMP AT TIME ZONE 'UTC' WHERE after_porep = TRUE; @@ -37,16 +37,30 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER update_precommit_ready_at - AFTER INSERT OR UPDATE OR DELETE ON sectors_sdr_pipeline +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'update_precommit_ready_at' + ) THEN + CREATE TRIGGER update_precommit_ready_at AFTER INSERT OR UPDATE OR DELETE ON sectors_sdr_pipeline FOR EACH ROW EXECUTE FUNCTION set_precommit_ready_at(); + END IF; +END $$; -CREATE TRIGGER update_commit_ready_at - AFTER INSERT OR UPDATE OR DELETE ON sectors_sdr_pipeline +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'update_commit_ready_at' + ) THEN + CREATE TRIGGER update_commit_ready_at AFTER INSERT OR UPDATE OR DELETE ON sectors_sdr_pipeline FOR EACH ROW EXECUTE FUNCTION set_commit_ready_at(); + END IF; +END $$; -ALTER TABLE sectors_snap_pipeline ADD COLUMN update_ready_at TIMESTAMPTZ; +ALTER TABLE sectors_snap_pipeline ADD COLUMN IF NOT EXISTS update_ready_at TIMESTAMPTZ; -- Function to precommit_ready_at value. Used by the trigger CREATE OR REPLACE FUNCTION set_update_ready_at() @@ -64,6 +78,13 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER update_update_ready_at - AFTER INSERT OR UPDATE OR DELETE ON sectors_snap_pipeline +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'update_update_ready_at' + ) THEN + CREATE TRIGGER update_update_ready_at AFTER INSERT OR UPDATE OR DELETE ON sectors_snap_pipeline FOR EACH ROW EXECUTE FUNCTION set_update_ready_at(); + END IF; +END $$; diff --git a/harmony/harmonydb/sql/20250111-machine-maintenance.sql b/harmony/harmonydb/sql/20250111-machine-maintenance.sql index 07b2686b6..d37de8629 100644 --- a/harmony/harmonydb/sql/20250111-machine-maintenance.sql +++ b/harmony/harmonydb/sql/20250111-machine-maintenance.sql @@ -1,4 +1,3 @@ -ALTER TABLE harmony_machines -ADD COLUMN unschedulable BOOLEAN DEFAULT FALSE; +ALTER TABLE harmony_machines ADD COLUMN IF NOT EXISTS unschedulable BOOLEAN DEFAULT FALSE; -CREATE INDEX idx_harmony_machines_unschedulable ON harmony_machines (unschedulable); +CREATE INDEX IF NOT EXISTS idx_harmony_machines_unschedulable ON harmony_machines (unschedulable); diff --git a/harmony/harmonydb/sql/20250113-pdp-never-delete.sql b/harmony/harmonydb/sql/20250113-pdp-never-delete.sql index 8f27e5a8e..acaabacf2 100644 --- a/harmony/harmonydb/sql/20250113-pdp-never-delete.sql +++ b/harmony/harmonydb/sql/20250113-pdp-never-delete.sql @@ -1,4 +1,4 @@ -- Add roots_added flag to track processing status -- This aligns pdp_proofset_root_adds with pdp_proofset_creates behavior (never delete, only mark as processed) -ALTER TABLE pdp_proofset_root_adds ADD COLUMN roots_added BOOLEAN NOT NULL DEFAULT FALSE; -CREATE INDEX idx_pdp_proofset_root_adds_roots_added ON pdp_proofset_root_adds(roots_added); \ No newline at end of file +ALTER TABLE pdp_proofset_root_adds ADD COLUMN IF NOT EXISTS roots_added BOOLEAN NOT NULL DEFAULT FALSE; +CREATE INDEX IF NOT EXISTS idx_pdp_proofset_root_adds_roots_added ON pdp_proofset_root_adds(roots_added); \ No newline at end of file diff --git a/harmony/harmonydb/sql/20250115-proofshare.sql b/harmony/harmonydb/sql/20250115-proofshare.sql index ef7a28ce9..51358d3a9 100644 --- a/harmony/harmonydb/sql/20250115-proofshare.sql +++ b/harmony/harmonydb/sql/20250115-proofshare.sql @@ -1,6 +1,6 @@ -- Proofshare queue -CREATE TABLE proofshare_queue ( +CREATE TABLE IF NOT EXISTS proofshare_queue ( service_id BIGINT NOT NULL, obtained_at TIMESTAMP WITH TIME ZONE NOT NULL, @@ -24,7 +24,7 @@ CREATE TABLE proofshare_queue ( -- create unique index proofshare_queue_request_cid_uindex -- on proofshare_queue (request_cid); -CREATE TABLE proofshare_meta ( +CREATE TABLE IF NOT EXISTS proofshare_meta ( singleton BOOLEAN NOT NULL DEFAULT TRUE CHECK (singleton = TRUE) UNIQUE, enabled BOOLEAN NOT NULL DEFAULT FALSE, @@ -44,7 +44,7 @@ COMMENT ON COLUMN proofshare_meta.enabled IS 'Setting to TRUE indicates acceptan INSERT INTO proofshare_meta (singleton, enabled, wallet) VALUES (TRUE, FALSE, NULL); -CREATE TABLE proofshare_provider_payments ( +CREATE TABLE IF NOT EXISTS proofshare_provider_payments ( provider_id BIGINT NOT NULL, -- wallet id request_cid TEXT NOT NULL, @@ -57,10 +57,10 @@ CREATE TABLE proofshare_provider_payments ( PRIMARY KEY (provider_id, payment_nonce) ); -create index proofshare_provider_payments_request_cid_index +create index if not exists proofshare_provider_payments_request_cid_index on proofshare_provider_payments (request_cid); -CREATE TABLE proofshare_provider_payments_settlement ( +CREATE TABLE IF NOT EXISTS proofshare_provider_payments_settlement ( provider_id BIGINT NOT NULL, -- wallet id payment_nonce BIGINT NOT NULL, @@ -71,7 +71,7 @@ CREATE TABLE proofshare_provider_payments_settlement ( ); -- Table tracking provider-router interactions (deposit, withdraw-request/complete) -CREATE TABLE proofshare_provider_messages ( +CREATE TABLE IF NOT EXISTS proofshare_provider_messages ( started_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp, signed_cid TEXT NOT NULL, @@ -84,11 +84,11 @@ CREATE TABLE proofshare_provider_messages ( PRIMARY KEY (started_at, signed_cid) ); -CREATE INDEX proofshare_provider_messages_signed_cid ON proofshare_provider_messages (signed_cid); +CREATE INDEX IF NOT EXISTS proofshare_provider_messages_signed_cid ON proofshare_provider_messages (signed_cid); -- Client settings -CREATE TABLE proofshare_client_settings ( +CREATE TABLE IF NOT EXISTS proofshare_client_settings ( enabled BOOLEAN NOT NULL DEFAULT FALSE, sp_id BIGINT NOT NULL DEFAULT 0, -- 0 = all/other @@ -108,7 +108,7 @@ COMMENT ON COLUMN proofshare_client_settings.enabled IS 'Setting to TRUE indicat INSERT INTO proofshare_client_settings (enabled, sp_id, wallet, minimum_pending_seconds, do_porep, do_snap) VALUES (FALSE, 0, NULL, 0, FALSE, FALSE); -CREATE TABLE proofshare_client_requests ( +CREATE TABLE IF NOT EXISTS proofshare_client_requests ( task_id BIGINT NOT NULL, sp_id BIGINT NOT NULL, @@ -167,11 +167,11 @@ CREATE TABLE proofshare_client_requests ( -- updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp -- ); -CREATE TABLE proofshare_client_wallets ( +CREATE TABLE IF NOT EXISTS proofshare_client_wallets ( wallet BIGINT NOT NULL PRIMARY KEY ); -CREATE TABLE proofshare_client_payments ( +CREATE TABLE IF NOT EXISTS proofshare_client_payments ( wallet BIGINT NOT NULL, nonce BIGINT NOT NULL, @@ -189,7 +189,7 @@ CREATE TABLE proofshare_client_payments ( ); -- Table tracking user-router interactions (deposit, withdraw-request/complete) -CREATE TABLE proofshare_client_messages ( +CREATE TABLE IF NOT EXISTS proofshare_client_messages ( started_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp, signed_cid TEXT NOT NULL, @@ -202,7 +202,7 @@ CREATE TABLE proofshare_client_messages ( PRIMARY KEY (started_at, signed_cid) ); -CREATE INDEX proofshare_client_messages_signed_cid ON proofshare_client_messages (signed_cid); +CREATE INDEX IF NOT EXISTS proofshare_client_messages_signed_cid ON proofshare_client_messages (signed_cid); CREATE OR REPLACE FUNCTION update_proofshare_client_messages_from_message_waits() RETURNS trigger AS $$ @@ -217,11 +217,18 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER tr_update_proofshare_client_messages -AFTER UPDATE ON message_waits +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'tr_update_proofshare_client_messages' + ) THEN + CREATE TRIGGER tr_update_proofshare_client_messages AFTER UPDATE ON message_waits FOR EACH ROW WHEN (OLD.executed_tsk_epoch IS NULL AND NEW.executed_tsk_epoch IS NOT NULL) EXECUTE FUNCTION update_proofshare_client_messages_from_message_waits(); + END IF; +END $$; CREATE OR REPLACE FUNCTION update_proofshare_provider_messages_from_message_waits() RETURNS trigger AS $$ @@ -236,10 +243,17 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER tr_update_proofshare_provider_messages -AFTER UPDATE ON message_waits +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'tr_update_proofshare_provider_messages' + ) THEN + CREATE TRIGGER tr_update_proofshare_provider_messages AFTER UPDATE ON message_waits FOR EACH ROW WHEN (OLD.executed_tsk_epoch IS NULL AND NEW.executed_tsk_epoch IS NOT NULL) EXECUTE FUNCTION update_proofshare_provider_messages_from_message_waits(); + END IF; +END $$; diff --git a/harmony/harmonydb/sql/20250220-mk12-ddo.sql b/harmony/harmonydb/sql/20250220-mk12-ddo.sql index eede4249d..b4e5c2c3b 100644 --- a/harmony/harmonydb/sql/20250220-mk12-ddo.sql +++ b/harmony/harmonydb/sql/20250220-mk12-ddo.sql @@ -1,8 +1,6 @@ -ALTER TABLE market_mk12_deal_pipeline - ADD COLUMN is_ddo BOOLEAN DEFAULT FALSE NOT NULL; +ALTER TABLE market_mk12_deal_pipeline ADD COLUMN IF NOT EXISTS is_ddo BOOLEAN DEFAULT FALSE NOT NULL; -ALTER TABLE market_direct_deals - ADD COLUMN error TEXT DEFAULT NULL; +ALTER TABLE market_direct_deals ADD COLUMN IF NOT EXISTS error TEXT DEFAULT NULL; -- prevent DDO deals with same allocation per SP_ID CREATE OR REPLACE FUNCTION prevent_duplicate_successful_mk12ddo_deals() @@ -23,14 +21,28 @@ END; $$ LANGUAGE plpgsql; -- Attach trigger to prevent invalid inserts -CREATE TRIGGER check_duplicate_successful_mk12ddo_deals - BEFORE INSERT ON market_direct_deals +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'check_duplicate_successful_mk12ddo_deals' + ) THEN + CREATE TRIGGER check_duplicate_successful_mk12ddo_deals BEFORE INSERT ON market_direct_deals FOR EACH ROW EXECUTE FUNCTION prevent_duplicate_successful_mk12ddo_deals(); + END IF; +END $$; -- Attach trigger to regenerate announced count after an IPNI task -- Otherwise, Announced count stays behind indexed count -CREATE TRIGGER trigger_update_piece_summary_ipni - AFTER INSERT OR UPDATE ON ipni +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'trigger_update_piece_summary_ipni' + ) THEN + CREATE TRIGGER trigger_update_piece_summary_ipni AFTER INSERT OR UPDATE ON ipni FOR EACH ROW EXECUTE FUNCTION update_piece_summary(); + END IF; +END $$; diff --git a/harmony/harmonydb/sql/20250312-batching-functions.sql b/harmony/harmonydb/sql/20250312-batching-functions.sql index d4b690d6f..044dc20ff 100644 --- a/harmony/harmonydb/sql/20250312-batching-functions.sql +++ b/harmony/harmonydb/sql/20250312-batching-functions.sql @@ -1,5 +1,4 @@ -ALTER TABLE sectors_sdr_pipeline - ADD COLUMN start_epoch BIGINT DEFAULT NULL; +ALTER TABLE sectors_sdr_pipeline ADD COLUMN IF NOT EXISTS start_epoch BIGINT DEFAULT NULL; /* Logic: diff --git a/harmony/harmonydb/sql/20250422-msg-wait-timestamp.sql b/harmony/harmonydb/sql/20250422-msg-wait-timestamp.sql index f5c78dbe8..bc1f655ff 100644 --- a/harmony/harmonydb/sql/20250422-msg-wait-timestamp.sql +++ b/harmony/harmonydb/sql/20250422-msg-wait-timestamp.sql @@ -1,7 +1,6 @@ -ALTER TABLE message_waits - ADD COLUMN created_at timestamptz NOT NULL DEFAULT TIMEZONE('UTC', NOW()); +ALTER TABLE message_waits ADD COLUMN IF NOT EXISTS created_at timestamptz NOT NULL DEFAULT TIMEZONE('UTC', NOW()); -CREATE INDEX idx_message_waits_created_at_executed +CREATE INDEX IF NOT EXISTS idx_message_waits_created_at_executed ON message_waits (created_at) WHERE executed_tsk_cid IS NOT NULL; diff --git a/harmony/harmonydb/sql/20250505-market-mk20.sql b/harmony/harmonydb/sql/20250505-market-mk20.sql new file mode 100644 index 000000000..9489cfe33 --- /dev/null +++ b/harmony/harmonydb/sql/20250505-market-mk20.sql @@ -0,0 +1,1015 @@ +-- Add raw_size column to mk12 deals to calculate pieceCidV2 +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'market_mk12_deals' + AND column_name = 'raw_size' + ) THEN + ALTER TABLE market_mk12_deals ADD COLUMN IF NOT EXISTS raw_size BIGINT; + END IF; +END $$; + +-- Add raw_size column to mk12-ddo deals to calculate pieceCidV2 +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'market_direct_deals' + AND column_name = 'raw_size' + ) THEN + ALTER TABLE market_direct_deals ADD COLUMN IF NOT EXISTS raw_size BIGINT; + END IF; +END $$; + +-- Drop the existing primary key constraint for market_piece_metadata +ALTER TABLE market_piece_metadata +DROP CONSTRAINT IF EXISTS market_piece_metadata_pkey; + +-- Drop the redundant UNIQUE constraint if it exists for market_piece_metadata +ALTER TABLE market_piece_metadata +DROP CONSTRAINT IF EXISTS market_piece_meta_identity_key; + +-- Add the new composite primary key for market_piece_metadata +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.table_constraints + WHERE table_name = 'market_piece_metadata' + AND constraint_type = 'PRIMARY KEY' + ) THEN + ALTER TABLE market_piece_metadata ADD PRIMARY KEY (piece_cid, piece_size); + END IF; +END $$; + +-- Drop the current primary key for market_piece_deal +ALTER TABLE market_piece_deal +DROP CONSTRAINT IF EXISTS market_piece_deal_pkey; + +-- Drop the old UNIQUE constraint for market_piece_deal +ALTER TABLE market_piece_deal +DROP CONSTRAINT IF EXISTS market_piece_deal_identity_key; + +-- Add the new composite primary key for market_piece_deal +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.table_constraints + WHERE table_name = 'market_piece_deal' + AND constraint_type = 'PRIMARY KEY' + ) THEN + ALTER TABLE market_piece_deal ADD PRIMARY KEY (id, sp_id, piece_cid, piece_length); + END IF; +END $$; + +-- Add a column to relate a piece park piece to mk20 deal +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'market_piece_deal' + AND column_name = 'piece_ref' + ) THEN + ALTER TABLE market_piece_deal ADD COLUMN IF NOT EXISTS piece_ref BIGINT; + END IF; +END $$; + +-- Allow piece_offset to be null for PDP deals +ALTER TABLE market_piece_deal + ALTER COLUMN piece_offset DROP NOT NULL; + +-- Add column to skip scheduling piece_park. Used for upload pieces +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'parked_pieces' + AND column_name = 'skip' + ) THEN + ALTER TABLE parked_pieces ADD COLUMN IF NOT EXISTS skip BOOLEAN NOT NULL DEFAULT FALSE; + END IF; +END $$; + +-- Add column piece_cid_v2 to IPNI table +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'ipni' + AND column_name = 'piece_cid_v2' + ) THEN + ALTER TABLE ipni ADD COLUMN IF NOT EXISTS piece_cid_v2 TEXT; + END IF; +END $$; + +-- Add metadata column to IPNI table which defaults to the binary of IpfsGatewayHttp +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'ipni' + AND column_name = 'metadata' + ) THEN + ALTER TABLE ipni ADD COLUMN IF NOT EXISTS metadata BYTEA NOT NULL DEFAULT '\xa01200'; + END IF; +END $$; + +-- Add is_pdp column to the table to allow generating 2 sets of chunks per +-- piece cid. One for Payloads and another one for single CID chunks to announce a PDP piece. +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'ipni_chunks' + AND column_name = 'is_pdp' + ) THEN + ALTER TABLE ipni_chunks ADD COLUMN IF NOT EXISTS is_pdp BOOLEAN NOT NULL DEFAULT FALSE; + END IF; +END $$; + +-- Replace the old uniqueness (piece_cid, chunk_num) with the new one +ALTER TABLE ipni_chunks + DROP CONSTRAINT IF EXISTS ipni_chunks_piece_cid_chunk_num_key; + +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.table_constraints + WHERE table_name = 'ipni_chunks' + AND constraint_name = 'ipni_chunks_piece_cid_is_pdp_chunk_num_key' + ) THEN + ALTER TABLE ipni_chunks ADD CONSTRAINT ipni_chunks_piece_cid_is_pdp_chunk_num_key + UNIQUE (piece_cid, is_pdp, chunk_num); + END IF; +END $$; + +-- The order_number column must be completely sequential +ALTER SEQUENCE ipni_order_number_seq CACHE 1; + +-- This function is used to insert piece metadata and piece deal (piece indexing) +-- This makes it easy to keep the logic of how table is updated and fast (in DB). +CREATE OR REPLACE FUNCTION process_piece_deal( + _id TEXT, + _piece_cid TEXT, + _boost_deal BOOLEAN, + _sp_id BIGINT, + _sector_num BIGINT, + _piece_offset BIGINT, + _piece_length BIGINT, -- padded length + _raw_size BIGINT, + _indexed BOOLEAN, + _piece_ref BIGINT DEFAULT NULL, + _legacy_deal BOOLEAN DEFAULT FALSE, + _chain_deal_id BIGINT DEFAULT 0 +) + RETURNS VOID AS $$ +BEGIN + -- Insert or update the market_piece_metadata table + INSERT INTO market_piece_metadata (piece_cid, piece_size, indexed) + VALUES (_piece_cid, _piece_length, _indexed) + ON CONFLICT (piece_cid, piece_size) DO UPDATE SET + indexed = CASE + WHEN market_piece_metadata.indexed = FALSE THEN EXCLUDED.indexed + ELSE market_piece_metadata.indexed + END; + + -- Insert into the market_piece_deal table + INSERT INTO market_piece_deal ( + id, piece_cid, boost_deal, legacy_deal, chain_deal_id, + sp_id, sector_num, piece_offset, piece_length, raw_size, piece_ref + ) VALUES ( + _id, _piece_cid, _boost_deal, _legacy_deal, _chain_deal_id, + _sp_id, _sector_num, _piece_offset, _piece_length, _raw_size, _piece_ref + ) ON CONFLICT (id, sp_id, piece_cid, piece_length) DO NOTHING; + +END; +$$ LANGUAGE plpgsql; + +-- Add ID column to ipni_task table +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'ipni_task' + AND column_name = 'id' + ) THEN + ALTER TABLE ipni_task ADD COLUMN IF NOT EXISTS id TEXT; + END IF; +END $$; + +-- Function to create ipni tasks +CREATE OR REPLACE FUNCTION insert_ipni_task( + _id TEXT, + _sp_id BIGINT, + _sector BIGINT, + _reg_seal_proof INT, + _sector_offset BIGINT, + _context_id BYTEA, + _is_rm BOOLEAN, + _provider TEXT, + _task_id BIGINT DEFAULT NULL +) RETURNS VOID AS $$ +DECLARE +_existing_is_rm BOOLEAN; + _latest_is_rm BOOLEAN; +BEGIN + -- Check if ipni_task has the same context_id and provider with a different is_rm value + SELECT is_rm INTO _existing_is_rm + FROM ipni_task + WHERE provider = _provider AND context_id = _context_id AND is_rm != _is_rm + LIMIT 1; + + -- If a different is_rm exists for the same context_id and provider, insert the new task + IF FOUND THEN + INSERT INTO ipni_task (sp_id, id, sector, reg_seal_proof, sector_offset, provider, context_id, is_rm, task_id) + VALUES (_sp_id, _id, _sector, _reg_seal_proof, _sector_offset, _provider, _context_id, _is_rm, _task_id); + RETURN; + END IF; + + -- If no conflicting entry is found in ipni_task, check the latest ad in ipni table + SELECT is_rm INTO _latest_is_rm + FROM ipni + WHERE provider = _provider AND context_id = _context_id + ORDER BY order_number DESC + LIMIT 1; + + -- If the latest ad has the same is_rm value, raise an exception + IF FOUND AND _latest_is_rm = _is_rm THEN + RAISE EXCEPTION 'already published'; + END IF; + + -- If all conditions are met, insert the new task into ipni_task + INSERT INTO ipni_task (sp_id, id, sector, reg_seal_proof, sector_offset, provider, context_id, is_rm, task_id) + VALUES (_sp_id, _id, _sector, _reg_seal_proof, _sector_offset, _provider, _context_id, _is_rm, _task_id); +END; +$$ LANGUAGE plpgsql; + + +-- Update raw_size for existing deals (One time backfill migration) +DO $$ +BEGIN + UPDATE market_mk12_deals d + SET raw_size = mpd.raw_size + FROM market_piece_deal mpd + WHERE d.uuid = mpd.id; + + UPDATE market_direct_deals d + SET raw_size = mpd.raw_size + FROM market_piece_deal mpd + WHERE d.uuid = mpd.id; + + UPDATE market_mk12_deals d + SET raw_size = p.raw_size + FROM market_mk12_deal_pipeline p + WHERE d.uuid = p.uuid + AND d.raw_size IS NULL + AND p.raw_size IS NOT NULL; + + UPDATE market_direct_deals d + SET raw_size = p.raw_size + FROM market_mk12_deal_pipeline p + WHERE d.uuid = p.uuid + AND d.raw_size IS NULL + AND p.raw_size IS NOT NULL; +END $$; + +-- This is main MK20 Deal table. Rows are added per deal and some +-- modification is allowed later +CREATE TABLE IF NOT EXISTS market_mk20_deal ( + created_at TIMESTAMPTZ NOT NULL DEFAULT TIMEZONE('UTC', NOW()), + id TEXT PRIMARY KEY, + client TEXT NOT NULL, + + piece_cid_v2 TEXT, + + data JSONB NOT NULL DEFAULT 'null', + + ddo_v1 JSONB NOT NULL DEFAULT 'null', + retrieval_v1 JSONB NOT NULL DEFAULT 'null', + pdp_v1 JSONB NOT NULL DEFAULT 'null' +); +COMMENT ON COLUMN market_mk20_deal.id IS 'This is ULID TEXT'; +COMMENT ON COLUMN market_mk20_deal.client IS 'Client must always be text as this can be a non Filecoin address like ed25519'; + +-- This is main pipeline table for PoRep processing of MK20 deals +CREATE TABLE IF NOT EXISTS market_mk20_pipeline ( + created_at TIMESTAMPTZ NOT NULL DEFAULT TIMEZONE('UTC', NOW()), + id TEXT NOT NULL, + sp_id BIGINT NOT NULL, + contract TEXT NOT NULL, + client TEXT NOT NULL, + piece_cid_v2 TEXT NOT NULL, + piece_cid TEXT NOT NULL, -- This is pieceCid V1 to allow easy table lookups + piece_size BIGINT NOT NULL, + raw_size BIGINT NOT NULL, + offline BOOLEAN NOT NULL, + url TEXT DEFAULT NULL, + indexing BOOLEAN NOT NULL, + announce BOOLEAN NOT NULL, + allocation_id BIGINT DEFAULT NULL, + duration BIGINT NOT NULL, + piece_aggregation INT NOT NULL DEFAULT 0, -- This is set when user sends a aggregated piece. It is also set as `deal_aggregation` when deal is aggregated on SP side. + + started BOOLEAN DEFAULT FALSE, + + downloaded BOOLEAN DEFAULT FALSE, + + commp_task_id BIGINT DEFAULT NULL, + after_commp BOOLEAN DEFAULT FALSE, + + deal_aggregation INT NOT NULL DEFAULT 0, + aggr_index BIGINT DEFAULT 0, + agg_task_id BIGINT DEFAULT NULL, + aggregated BOOLEAN DEFAULT FALSE, + + sector BIGINT DEFAULT NULL, + reg_seal_proof INT DEFAULT NULL, + sector_offset BIGINT DEFAULT NULL, -- padded offset + + sealed BOOLEAN DEFAULT FALSE, + + indexing_created_at TIMESTAMPTZ DEFAULT NULL, + indexing_task_id BIGINT DEFAULT NULL, + indexed BOOLEAN DEFAULT FALSE, + + complete BOOLEAN NOT NULL DEFAULT FALSE, + + PRIMARY KEY (id, aggr_index) +); +COMMENT ON COLUMN market_mk20_pipeline.piece_aggregation IS 'This is set when user sends a aggregated piece. It is also set as `deal_aggregation` when deal is aggregated on SP side.'; +COMMENT ON COLUMN market_mk20_pipeline.deal_aggregation IS 'This is set when user sends a deal with aggregated source. This value is passed to piece_aggregation when aggregation is finished and a single piece remains'; + +-- This table is used to hold MK20 deals waiting for PoRep pipeline +-- to process. This allows disconnecting the need to immediately process +-- deals as received and allow upload later strategy to work +CREATE TABLE IF NOT EXISTS market_mk20_pipeline_waiting ( + id TEXT PRIMARY KEY +); + +-- This table is used to keep track of deals which need data upload. +-- A separate table helps easier status check, chunked+serial upload support +CREATE TABLE IF NOT EXISTS market_mk20_upload_waiting ( + id TEXT PRIMARY KEY, + chunked BOOLEAN DEFAULT NULL, + ref_id BIGINT DEFAULT NULL, + ready_at TIMESTAMPTZ DEFAULT NULL +); + +-- This table help disconnected downloads from main PoRep/PDP pipelines +-- It helps with allowing multiple downloads per deal i.e. server side aggregation. +-- This also allows us to reuse ongoing downloads within the same deal aggregation. +-- It also allows using a common download pipeline for both PoRep and PDP. +CREATE TABLE IF NOT EXISTS market_mk20_download_pipeline ( + id TEXT NOT NULL, + product TEXT NOT NULL, -- This allows us to run multiple refs per product for easier lifecycle management + piece_cid_v2 TEXT NOT NULL, + ref_ids BIGINT[] NOT NULL, + PRIMARY KEY (id, product, piece_cid_v2) +); + +-- Offline URLs for PoRep deals. +CREATE TABLE IF NOT EXISTS market_mk20_offline_urls ( + id TEXT NOT NULL, + piece_cid_v2 TEXT NOT NULL, + url TEXT NOT NULL, + headers jsonb NOT NULL DEFAULT '{}', + PRIMARY KEY (id, piece_cid_v2) +); + +-- This table tracks the chunk upload progress for a MK20 deal. Common for both +-- PoRep and PDP +CREATE TABLE IF NOT EXISTS market_mk20_deal_chunk ( + id TEXT not null, + chunk INT not null, + chunk_size BIGINT not null, + ref_id BIGINT DEFAULT NULL, + complete BOOLEAN DEFAULT FALSE, + completed_at TIMESTAMPTZ, + finalize BOOLEAN DEFAULT FALSE, + finalize_task_id BIGINT DEFAULT NULL, + PRIMARY KEY (id, chunk) +); + +-- MK20 product and their status table +CREATE TABLE IF NOT EXISTS market_mk20_products ( + name TEXT PRIMARY KEY, + enabled BOOLEAN DEFAULT TRUE +); + +-- MK20 supported data sources and their status table +CREATE TABLE IF NOT EXISTS market_mk20_data_source ( + name TEXT PRIMARY KEY, + enabled BOOLEAN DEFAULT TRUE +); + +-- Add products and data sources to table +INSERT INTO market_mk20_products (name, enabled) VALUES ('ddo_v1', TRUE) ON CONFLICT (name) DO NOTHING; +INSERT INTO market_mk20_products (name, enabled) VALUES ('retrieval_v1', TRUE) ON CONFLICT (name) DO NOTHING; +INSERT INTO market_mk20_products (name, enabled) VALUES ('pdp_v1', TRUE) ON CONFLICT (name) DO NOTHING; +INSERT INTO market_mk20_data_source (name, enabled) VALUES ('http', TRUE) ON CONFLICT (name) DO NOTHING; +INSERT INTO market_mk20_data_source (name, enabled) VALUES ('aggregate', TRUE) ON CONFLICT (name) DO NOTHING; +INSERT INTO market_mk20_data_source (name, enabled) VALUES ('offline', TRUE) ON CONFLICT (name) DO NOTHING; +INSERT INTO market_mk20_data_source (name, enabled) VALUES ('put', TRUE) ON CONFLICT (name) DO NOTHING; + +-- This function sets an upload completion time. It is used to removed +-- upload for deal which are not finalized in 1 hour so we don't waste space. +CREATE OR REPLACE FUNCTION set_ready_at_for_serial_upload() +RETURNS TRIGGER AS $$ +BEGIN + -- Transition into "serial ready" state: chunked=false AND ref_id IS NOT NULL + IF NEW.chunked IS FALSE + AND NEW.ref_id IS NOT NULL + AND OLD.ready_at IS NULL + AND NOT (OLD.chunked IS FALSE AND OLD.ref_id IS NOT NULL) THEN + NEW.ready_at := NOW() AT TIME ZONE 'UTC'; + END IF; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS trg_ready_at_serial ON market_mk20_upload_waiting; +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'trg_ready_at_serial' + ) THEN + CREATE TRIGGER trg_ready_at_serial BEFORE UPDATE OF ref_id, chunked ON market_mk20_upload_waiting + FOR EACH ROW + EXECUTE FUNCTION set_ready_at_for_serial_upload(); + END IF; +END $$; + +-- This function sets an upload completion time. It is used to removed +-- upload for deal which are not finalized in 1 hour so we don't waste space. +CREATE OR REPLACE FUNCTION set_ready_at_when_all_chunks_complete() +RETURNS TRIGGER AS $$ +BEGIN + -- Only react when a chunk transitions to complete = true + IF (TG_OP = 'UPDATE' OR TG_OP = 'INSERT') AND NEW.complete IS TRUE THEN + -- If no incomplete chunks remain, set ready_at once + IF NOT EXISTS ( + SELECT 1 FROM market_mk20_deal_chunk + WHERE id = NEW.id AND (complete IS NOT TRUE) + ) THEN + UPDATE market_mk20_upload_waiting + SET ready_at = NOW() AT TIME ZONE 'UTC' + WHERE id = NEW.id + AND chunked = true + AND ready_at IS NULL; + END IF; + END IF; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + + +DROP TRIGGER IF EXISTS trg_ready_at_chunks_update ON market_mk20_deal_chunk; +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'trg_ready_at_chunks_update' + ) THEN + CREATE TRIGGER trg_ready_at_chunks_update AFTER INSERT OR UPDATE OF complete ON market_mk20_deal_chunk + FOR EACH ROW + EXECUTE FUNCTION set_ready_at_when_all_chunks_complete(); + END IF; +END $$; + +-- This function triggers a download for an offline piece. +-- It is different from MK1.2 PoRep pipeline as it downloads the offline pieces +-- locally. This is to allow serving retrievals with piece park. +CREATE OR REPLACE FUNCTION process_offline_download( + _id TEXT, + _piece_cid_v2 TEXT, + _piece_cid TEXT, + _piece_size BIGINT, + _product TEXT +) RETURNS BOOLEAN AS $$ +DECLARE + _url TEXT; + _headers JSONB; + _raw_size BIGINT; + _deal_aggregation INT; + _piece_id BIGINT; + _ref_id BIGINT; +BEGIN + -- 1. Early exit if no offline match found + SELECT url, headers + INTO _url, _headers + FROM market_mk20_offline_urls + WHERE id = _id AND piece_cid_v2 = _piece_cid_v2; + + IF NOT FOUND THEN + RETURN FALSE; + END IF; + + -- 2. Get deal_aggregation flag + SELECT deal_aggregation + INTO _deal_aggregation + FROM market_mk20_pipeline + WHERE id = _id AND piece_cid_v2 = _piece_cid_v2 LIMIT 1; + + -- 3. Look for an existing piece + SELECT id + INTO _piece_id + FROM parked_pieces + WHERE piece_cid = _piece_cid AND piece_padded_size = _piece_size; + + -- 4. Insert piece if it is not found + IF NOT FOUND THEN + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term) + VALUES (_piece_cid, _piece_size, _raw_size, NOT (_deal_aggregation > 0)) + RETURNING id INTO _piece_id; + END IF; + + -- 5. Insert piece ref + INSERT INTO parked_piece_refs (piece_id, data_url, data_headers, long_term) + VALUES (_piece_id, _url, _headers, NOT (_deal_aggregation > 0)) + RETURNING ref_id INTO _ref_id; + + -- 6. Insert or update download pipeline with ref_id + INSERT INTO market_mk20_download_pipeline (id, piece_cid_v2, product, ref_ids) + VALUES (_id, _piece_cid_v2, _product, ARRAY[_ref_id]) + ON CONFLICT (id, piece_cid_v2, product) DO UPDATE + SET ref_ids = ( + SELECT ARRAY( + SELECT DISTINCT r + FROM unnest(market_mk20_download_pipeline.ref_ids || excluded.ref_ids) AS r + ) + ); + + -- 7. Mark the deal as started + UPDATE market_mk20_pipeline + SET started = TRUE + WHERE id = _id AND piece_cid_v2 = _piece_cid_v2 AND started = FALSE; + + RETURN TRUE; +END; +$$ LANGUAGE plpgsql; + +-- Main DataSet table for PDP +CREATE TABLE IF NOT EXISTS pdp_data_set ( + id BIGINT PRIMARY KEY, -- on-chain dataset id + client TEXT NOT NULL, -- client wallet which requested this dataset + + -- updated when a challenge is requested (either by first dataset add or by invokes of nextProvingPeriod) + -- initially NULL on fresh dataset + prev_challenge_request_epoch BIGINT, + + -- task invoking nextProvingPeriod, the task should be spawned any time prove_at_epoch+challenge_window is in the past + challenge_request_task_id BIGINT REFERENCES harmony_task(id) ON DELETE SET NULL, + + -- nextProvingPeriod message hash, when the message lands prove_task_id will be spawned and + -- this value will be set to NULL + challenge_request_msg_hash TEXT, + + -- the proving period for this proofset and the challenge window duration + proving_period BIGINT, + challenge_window BIGINT, + + -- the epoch at which the next challenge window starts and proofs can be submitted + -- initialized to NULL indicating a special proving period init task handles challenge generation + prove_at_epoch BIGINT, + + -- flag indicating that the proving period is ready for init. Currently set after first add + -- Set to true after first root add + init_ready BOOLEAN NOT NULL DEFAULT FALSE, + + create_deal_id TEXT NOT NULL, -- mk20 deal ID for creating this data_set + create_message_hash TEXT NOT NULL, + + removed BOOLEAN DEFAULT FALSE, + + remove_deal_id TEXT DEFAULT NULL, -- mk20 deal ID for removing this data_set + remove_message_hash TEXT DEFAULT NULL, + + unique (create_deal_id), + unique (remove_deal_id) +); + +-- DataSet create table governs the DataSet create task +CREATE TABLE IF NOT EXISTS pdp_data_set_create ( + id TEXT PRIMARY KEY, -- This is Market V2 Deal ID for lookup and response + client TEXT NOT NULL, + + record_keeper TEXT NOT NULL, + extra_data BYTEA, + + task_id BIGINT DEFAULT NULL, + tx_hash TEXT DEFAULT NULL +); + +-- DataSet delete table governs the DataSet delete task +CREATE TABLE IF NOT EXISTS pdp_data_set_delete ( + id TEXT PRIMARY KEY, -- This is Market V2 Deal ID for lookup and response + client TEXT NOT NULL, + + set_id BIGINT NOT NULL, + extra_data BYTEA, + + task_id BIGINT DEFAULT NULL, + tx_hash TEXT DEFAULT NULL +); + +-- This table governs the delete piece tasks +CREATE TABLE IF NOT EXISTS pdp_piece_delete ( + id TEXT PRIMARY KEY, -- This is Market V2 Deal ID for lookup and response + client TEXT NOT NULL, + + set_id BIGINT NOT NULL, + pieces BIGINT[] NOT NULL, + extra_data BYTEA, + + task_id BIGINT DEFAULT NULL, + tx_hash TEXT DEFAULT NULL +); + +-- Main DataSet Piece table. Any and all pieces ever added by SP must be part of this table +CREATE TABLE IF NOT EXISTS pdp_dataset_piece ( + data_set_id BIGINT NOT NULL, -- pdp_data_sets.id + client TEXT NOT NULL, + + piece_cid_v2 TEXT NOT NULL, -- root cid (piececid v2) + + piece BIGINT DEFAULT NULL, -- on-chain index of the piece in the pieceCids sub-array + + piece_ref BIGINT NOT NULL, -- piece_ref_id + + add_deal_id TEXT NOT NULL, -- mk20 deal ID for adding this root to dataset + add_message_hash TEXT NOT NULL, + add_message_index BIGINT NOT NULL, -- index of root in the add message + + removed BOOLEAN DEFAULT FALSE, + remove_deal_id TEXT DEFAULT NULL, -- mk20 deal ID for removing this root from dataset + remove_message_hash TEXT DEFAULT NULL, + remove_message_index BIGINT DEFAULT NULL, + + PRIMARY KEY (data_set_id, piece) +); + +CREATE TABLE IF NOT EXISTS pdp_pipeline ( + created_at TIMESTAMPTZ NOT NULL DEFAULT TIMEZONE('UTC', NOW()), + + id TEXT NOT NULL, + client TEXT NOT NULL, + + piece_cid_v2 TEXT NOT NULL, -- v2 piece_cid + + data_set_id BIGINT NOT NULL, + + extra_data BYTEA, + + piece_ref BIGINT DEFAULT NULL, + + downloaded BOOLEAN DEFAULT FALSE, + + commp_task_id BIGINT DEFAULT NULL, + after_commp BOOLEAN DEFAULT FALSE, + + deal_aggregation INT NOT NULL DEFAULT 0, + aggr_index BIGINT DEFAULT 0, + agg_task_id BIGINT DEFAULT NULL, + aggregated BOOLEAN DEFAULT FALSE, + + add_piece_task_id BIGINT DEFAULT NULL, + after_add_piece BOOLEAN DEFAULT FALSE, + + add_message_hash TEXT, + add_message_index BIGINT NOT NULL DEFAULT 0, -- index of root in the add message + + after_add_piece_msg BOOLEAN DEFAULT FALSE, + + save_cache_task_id BIGINT DEFAULT NULL, + after_save_cache BOOLEAN DEFAULT FALSE, + + indexing BOOLEAN DEFAULT FALSE, + indexing_created_at TIMESTAMPTZ DEFAULT NULL, + indexing_task_id BIGINT DEFAULT NULL, + indexed BOOLEAN DEFAULT FALSE, + + announce BOOLEAN DEFAULT FALSE, + announce_payload BOOLEAN DEFAULT FALSE, + + announced BOOLEAN DEFAULT FALSE, + announced_payload BOOLEAN DEFAULT FALSE, + + complete BOOLEAN DEFAULT FALSE, + + PRIMARY KEY (id, aggr_index) +); + +-- This function is used to mark a piece as downloaded in pdp_pipeline +-- A deal with multiple HTTP sources will have multiple ref_ids, +-- and download is handled by market_mk20_download_pipeline table +-- We add ref_id to pdp_pipeline once download is successful. +create or replace function mk20_pdp_mark_downloaded(_product text) +returns integer +language plpgsql +as $$ +declare + updated_count int := 0; +begin + with candidates as ( + select p.id, p.piece_cid_v2, dp.ref_ids + from pdp_pipeline p + join market_mk20_download_pipeline dp + on dp.id = p.id + and dp.piece_cid_v2 = p.piece_cid_v2 + and dp.product = _product + where p.piece_ref is null + ), + picked as ( + -- choose ONE completed ref_id from the array for each (id,piece_cid_v2) + select c.id, c.piece_cid_v2, c.ref_ids, ch.ref_id as chosen_ref + from candidates c + cross join lateral ( + select pr.ref_id + from unnest(c.ref_ids) as r(ref_id) + join parked_piece_refs pr on pr.ref_id = r.ref_id + join parked_pieces pp on pp.id = pr.piece_id + where pp.complete = true + limit 1 + ) ch + ), + del_other_refs as ( + delete from parked_piece_refs pr + using picked + where pr.ref_id = any(picked.ref_ids) + and pr.ref_id != picked.chosen_ref + returning 1 + ), + del_download_rows as ( + delete from market_mk20_download_pipeline dp + using picked + where dp.id = picked.id + and dp.piece_cid_v2 = picked.piece_cid_v2 + and dp.product = _product + returning 1 + ), + upd as ( + update pdp_pipeline p + set downloaded = true, + piece_ref = picked.chosen_ref + from picked + where p.id = picked.id + and p.piece_cid_v2 = picked.piece_cid_v2 + returning 1 + ) + select count(*) into updated_count from upd; + + return updated_count; +end; +$$; + +CREATE TABLE IF NOT EXISTS market_mk20_clients ( + client TEXT PRIMARY KEY, + allowed BOOLEAN DEFAULT TRUE +); + +CREATE TABLE IF NOT EXISTS pdp_proving_tasks ( + data_set_id BIGINT NOT NULL, -- pdp_data_set.id + task_id BIGINT NOT NULL, -- harmony_task task ID + + PRIMARY KEY (data_set_id, task_id), + FOREIGN KEY (data_set_id) REFERENCES pdp_data_set(id) ON DELETE CASCADE, + FOREIGN KEY (task_id) REFERENCES harmony_task(id) ON DELETE CASCADE +); + +-- IPNI pipeline is kept separate from rest for robustness +-- and reuse. This allows for removing, recreating ads using CLI. +CREATE TABLE IF NOT EXISTS pdp_ipni_task ( + context_id BYTEA NOT NULL, + is_rm BOOLEAN NOT NULL, + + id TEXT NOT NULL, + + provider TEXT NOT NULL, + + created_at TIMESTAMPTZ NOT NULL DEFAULT TIMEZONE('UTC', NOW()), + task_id BIGINT DEFAULT NULL, + complete BOOLEAN DEFAULT FALSE, + + PRIMARY KEY (context_id, is_rm) +); + +-- Function to create ipni tasks +CREATE OR REPLACE FUNCTION insert_pdp_ipni_task( + _context_id BYTEA, + _is_rm BOOLEAN, + _id TEXT, + _provider TEXT, + _task_id BIGINT DEFAULT NULL +) RETURNS VOID AS $$ +DECLARE + _existing_is_rm BOOLEAN; + _latest_is_rm BOOLEAN; +BEGIN + -- Check if ipni_task has the same context_id and provider with a different is_rm value + SELECT is_rm INTO _existing_is_rm + FROM pdp_ipni_task + WHERE provider = _provider AND context_id = _context_id AND is_rm != _is_rm + LIMIT 1; + + -- If a different is_rm exists for the same context_id and provider, insert the new task + IF FOUND THEN + INSERT INTO pdp_ipni_task (context_id, is_rm, id, provider, task_id) + VALUES (_context_id, _is_rm, _id, _provider, _task_id); + RETURN; + END IF; + + -- If no conflicting entry is found in ipni_task, check the latest ad in ipni table + SELECT is_rm INTO _latest_is_rm + FROM ipni + WHERE provider = _provider AND context_id = _context_id + ORDER BY order_number DESC + LIMIT 1; + + -- If the latest ad has the same is_rm value, raise an exception + IF FOUND AND _latest_is_rm = _is_rm THEN + RAISE EXCEPTION 'already published'; + END IF; + + -- If all conditions are met, insert the new task into ipni_task + INSERT INTO pdp_ipni_task (context_id, is_rm, id, provider, task_id) + VALUES (_context_id, _is_rm, _id, _provider, _task_id); +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION insert_ad_and_update_head( + _ad_cid TEXT, + _context_id BYTEA, + _metadata BYTEA, + _piece_cid_v2 TEXT, + _piece_cid TEXT, + _piece_size BIGINT, + _is_rm BOOLEAN, + _provider TEXT, + _addresses TEXT, + _signature BYTEA, + _entries TEXT +) RETURNS VOID AS $$ +DECLARE + _previous TEXT; + _new_order BIGINT; +BEGIN + -- Determine the previous ad_cid in the chain for this provider + SELECT head INTO _previous + FROM ipni_head + WHERE provider = _provider; + + -- Insert the new ad into the ipni table with an automatically assigned order_number + INSERT INTO ipni (ad_cid, context_id, metadata, is_rm, previous, provider, addresses, signature, entries, piece_cid_v2, piece_cid, piece_size) + VALUES (_ad_cid, _context_id, _metadata, _is_rm, _previous, _provider, _addresses, _signature, _entries, _piece_cid_v2, _piece_cid, _piece_size); + + -- Update the ipni_head table to set the new ad as the head of the chain + INSERT INTO ipni_head (provider, head) + VALUES (_provider, _ad_cid) + ON CONFLICT (provider) DO UPDATE SET head = EXCLUDED.head; + +END; +$$ LANGUAGE plpgsql; + + +CREATE TABLE IF NOT EXISTS piece_cleanup ( + id TEXT NOT NULL, + piece_cid_v2 TEXT NOT NULL, + + piece_cid TEXT, + piece_size BIGINT, + + pdp BOOLEAN NOT NULL, + + sp_id BIGINT NOT NULL, + sector_number BIGINT NOT NULL, + + piece_ref BIGINT, + + cleanup_task_id BIGINT DEFAULT NULL, + after_cleanup BOOLEAN NOT NULL DEFAULT FALSE, + + announce BOOLEAN DEFAULT FALSE, + announce_payload BOOLEAN DEFAULT FALSE, + + announced BOOLEAN DEFAULT FALSE, + announced_payload BOOLEAN DEFAULT FALSE, + + complete BOOLEAN DEFAULT FALSE, + + PRIMARY KEY (id, pdp) +); + +-- This functions remove the row from market_piece_deal and then goes on to +-- clean up market_piece_metadata and parked_piece_refs as required +CREATE OR REPLACE FUNCTION remove_piece_deal( + _id TEXT, + _sp_id BIGINT, + _piece_cid TEXT, + _piece_length BIGINT +) RETURNS VOID AS $$ +DECLARE + v_piece_ref BIGINT; + v_remaining BIGINT; +BEGIN + -- 1) Delete the exact deal row and capture piece_ref + DELETE FROM market_piece_deal + WHERE id = _id + AND sp_id = _sp_id + AND piece_cid = _piece_cid + AND piece_length = _piece_length + RETURNING piece_ref + INTO v_piece_ref; + + IF NOT FOUND THEN + RAISE EXCEPTION + 'market_piece_deal not found for id=%, sp_id=%, piece_cid=%, piece_length=%', + _id, _sp_id, _piece_cid, _piece_length; + END IF; + + -- 2) If no other deals reference the same piece, remove metadata + SELECT COUNT(*) + INTO v_remaining + FROM market_piece_deal + WHERE piece_cid = _piece_cid + AND piece_length = _piece_length; + + IF v_remaining = 0 THEN + DELETE FROM market_piece_metadata + WHERE piece_cid = _piece_cid + AND piece_size = _piece_length; + -- (DELETE is idempotent even if no row exists) + END IF; + + -- 3) If present, remove the parked piece reference + IF v_piece_ref IS NOT NULL THEN + DELETE FROM parked_piece_refs + WHERE ref_id = v_piece_ref; + -- (FKs from pdp_* tables will cascade/SET NULL per their definitions) + END IF; +END; +$$ LANGUAGE plpgsql; + + +create or replace function mk20_ddo_mark_downloaded(_product text) +returns integer +language plpgsql +as $$ +declare +updated_count int := 0; +begin + with candidates as ( + select p.id, p.piece_cid_v2, dp.ref_ids + from market_mk20_pipeline p + join market_mk20_download_pipeline dp + on dp.id = p.id + and dp.piece_cid_v2 = p.piece_cid_v2 + and dp.product = _product + where p.url is null + ), + picked as ( + -- choose ONE completed ref_id from the array for each (id,piece_cid_v2) + select c.id, c.piece_cid_v2, c.ref_ids, ch.ref_id as chosen_ref + from candidates c + cross join lateral ( + select pr.ref_id + from unnest(c.ref_ids) as r(ref_id) + join parked_piece_refs pr on pr.ref_id = r.ref_id + join parked_pieces pp on pp.id = pr.piece_id + where pp.complete = true + limit 1 + ) ch + ), + del_other_refs as ( + delete from parked_piece_refs pr + using picked + where pr.ref_id = any(picked.ref_ids) + and pr.ref_id != picked.chosen_ref + returning 1 + ), + del_download_rows as ( + delete from market_mk20_download_pipeline dp + using picked + where dp.id = picked.id + and dp.piece_cid_v2 = picked.piece_cid_v2 + and dp.product = _product + returning 1 + ), + upd as ( + update market_mk20_pipeline p + set downloaded = true, + url = 'pieceref:' || picked.chosen_ref::text + from picked + where p.id = picked.id + and p.piece_cid_v2 = picked.piece_cid_v2 + returning 1 + ) + select count(*) into updated_count from upd; + + return updated_count; +end; +$$; + + diff --git a/harmony/harmonydb/sql/20250619-proofshare-fixes.sql b/harmony/harmonydb/sql/20250619-proofshare-fixes.sql index 434617557..36599954b 100644 --- a/harmony/harmonydb/sql/20250619-proofshare-fixes.sql +++ b/harmony/harmonydb/sql/20250619-proofshare-fixes.sql @@ -7,5 +7,5 @@ WHERE EXISTS ( AND pq1.obtained_at < pq2.obtained_at ); -create unique index proofshare_queue_request_cid_uindex +create unique index if not exists proofshare_queue_request_cid_uindex on proofshare_queue (request_cid); \ No newline at end of file diff --git a/harmony/harmonydb/sql/20250620-proofshare-pow.sql b/harmony/harmonydb/sql/20250620-proofshare-pow.sql index 23f5b0495..63b7238a5 100644 --- a/harmony/harmonydb/sql/20250620-proofshare-pow.sql +++ b/harmony/harmonydb/sql/20250620-proofshare-pow.sql @@ -1 +1 @@ -ALTER TABLE proofshare_queue ADD COLUMN was_pow BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE proofshare_queue ADD COLUMN IF NOT EXISTS was_pow BOOLEAN NOT NULL DEFAULT FALSE; diff --git a/harmony/harmonydb/sql/20250724-proofshare-autosettle.sql b/harmony/harmonydb/sql/20250724-proofshare-autosettle.sql index f2c16440e..48583198f 100644 --- a/harmony/harmonydb/sql/20250724-proofshare-autosettle.sql +++ b/harmony/harmonydb/sql/20250724-proofshare-autosettle.sql @@ -1 +1 @@ -ALTER TABLE proofshare_meta ADD COLUMN autosettle BOOLEAN NOT NULL DEFAULT TRUE; +ALTER TABLE proofshare_meta ADD COLUMN IF NOT EXISTS autosettle BOOLEAN NOT NULL DEFAULT TRUE; diff --git a/harmony/harmonydb/sql/20250727-balancemgr.sql b/harmony/harmonydb/sql/20250727-balancemgr.sql index f2cf0ab93..b44adf651 100644 --- a/harmony/harmonydb/sql/20250727-balancemgr.sql +++ b/harmony/harmonydb/sql/20250727-balancemgr.sql @@ -1,6 +1,6 @@ -- Balance Manager -CREATE TABLE balance_manager_addresses ( +CREATE TABLE IF NOT EXISTS balance_manager_addresses ( id SERIAL PRIMARY KEY, subject_address TEXT NOT NULL, -- f0 address @@ -26,7 +26,7 @@ CREATE TABLE balance_manager_addresses ( last_msg_landed_at TIMESTAMP ); -CREATE INDEX balance_manager_addresses_last_msg_cid_idx ON balance_manager_addresses (last_msg_cid); +CREATE INDEX IF NOT EXISTS balance_manager_addresses_last_msg_cid_idx ON balance_manager_addresses (last_msg_cid); ALTER TABLE balance_manager_addresses ADD CONSTRAINT subject_not_equal_second CHECK (subject_address != second_address); ALTER TABLE balance_manager_addresses ADD CONSTRAINT balance_manager_addresses_subject_address_second_address_unique UNIQUE (subject_address, second_address, action_type); @@ -43,8 +43,15 @@ BEGIN END; $$ LANGUAGE plpgsql; -CREATE TRIGGER tr_update_balance_manager_from_message_waits -AFTER UPDATE ON message_waits +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'tr_update_balance_manager_from_message_waits' + ) THEN + CREATE TRIGGER tr_update_balance_manager_from_message_waits AFTER UPDATE ON message_waits FOR EACH ROW WHEN (OLD.executed_tsk_epoch IS NULL AND NEW.executed_tsk_epoch IS NOT NULL) EXECUTE FUNCTION update_balance_manager_from_message_waits(); + END IF; +END $$; diff --git a/harmony/harmonydb/sql/20250728-proofshare-payment-stats.sql b/harmony/harmonydb/sql/20250728-proofshare-payment-stats.sql index edb650511..c11171b86 100644 --- a/harmony/harmonydb/sql/20250728-proofshare-payment-stats.sql +++ b/harmony/harmonydb/sql/20250728-proofshare-payment-stats.sql @@ -1,10 +1,8 @@ -- Proofshare payment statistics upgrade -- 1. Add timestamps to proofshare_client_payments table -ALTER TABLE proofshare_client_payments - ADD COLUMN created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp; -ALTER TABLE proofshare_client_payments - ADD COLUMN consumed_at TIMESTAMP WITH TIME ZONE; +ALTER TABLE proofshare_client_payments ADD COLUMN IF NOT EXISTS created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp; +ALTER TABLE proofshare_client_payments ADD COLUMN IF NOT EXISTS consumed_at TIMESTAMP WITH TIME ZONE; -- 2. Create index on created_at CREATE INDEX IF NOT EXISTS idx_proofshare_client_payments_created_at ON proofshare_client_payments (created_at ASC); @@ -40,7 +38,14 @@ END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS tr_set_consumed_at_ps_client_payments ON proofshare_client_payments; -CREATE TRIGGER tr_set_consumed_at_ps_client_payments -BEFORE INSERT OR UPDATE ON proofshare_client_payments +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_trigger + WHERE tgname = 'tr_set_consumed_at_ps_client_payments' + ) THEN + CREATE TRIGGER tr_set_consumed_at_ps_client_payments BEFORE INSERT OR UPDATE ON proofshare_client_payments FOR EACH ROW EXECUTE FUNCTION trg_set_consumed_at_ps_client_payments(); + END IF; +END $$; diff --git a/harmony/harmonydb/sql/20250801-proofshare-pipeline.sql b/harmony/harmonydb/sql/20250801-proofshare-pipeline.sql index d6287364b..e5b18b2d4 100644 --- a/harmony/harmonydb/sql/20250801-proofshare-pipeline.sql +++ b/harmony/harmonydb/sql/20250801-proofshare-pipeline.sql @@ -1,18 +1,18 @@ -- One background sender task per wallet -- entries created by task_id_upload -CREATE TABLE proofshare_client_sender +CREATE TABLE IF NOT EXISTS proofshare_client_sender ( wallet_id BIGINT NOT NULL PRIMARY KEY, task_id BIGINT REFERENCES harmony_task(id) ON DELETE SET NULL, updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp ); -ALTER TABLE proofshare_client_requests ADD COLUMN request_type TEXT NOT NULL DEFAULT 'porep'; +ALTER TABLE proofshare_client_requests ADD COLUMN IF NOT EXISTS request_type TEXT NOT NULL DEFAULT 'porep'; ALTER TABLE proofshare_client_requests DROP CONSTRAINT proofshare_client_requests_pkey; ALTER TABLE proofshare_client_requests ADD PRIMARY KEY (sp_id, sector_num, request_type); ALTER TABLE proofshare_client_requests DROP COLUMN task_id; -ALTER TABLE proofshare_client_requests ADD COLUMN task_id_upload BIGINT; -ALTER TABLE proofshare_client_requests ADD COLUMN task_id_poll BIGINT; +ALTER TABLE proofshare_client_requests ADD COLUMN IF NOT EXISTS task_id_upload BIGINT; +ALTER TABLE proofshare_client_requests ADD COLUMN IF NOT EXISTS task_id_poll BIGINT; diff --git a/harmony/harmonydb/sql/20250803-wallet-exporter.sql b/harmony/harmonydb/sql/20250803-wallet-exporter.sql index ffaeb53e5..5121bbac8 100644 --- a/harmony/harmonydb/sql/20250803-wallet-exporter.sql +++ b/harmony/harmonydb/sql/20250803-wallet-exporter.sql @@ -1,4 +1,4 @@ -CREATE TABLE wallet_exporter_processing ( +CREATE TABLE IF NOT EXISTS wallet_exporter_processing ( singleton BOOLEAN NOT NULL DEFAULT TRUE PRIMARY KEY CHECK (singleton = TRUE), processed_until TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ); @@ -6,12 +6,12 @@ CREATE TABLE wallet_exporter_processing ( INSERT INTO wallet_exporter_processing (singleton) VALUES (TRUE); -- presence of a message in this table means that we've already accounted the basic send -CREATE TABLE wallet_exporter_watched_msgs ( +CREATE TABLE IF NOT EXISTS wallet_exporter_watched_msgs ( msg_cid TEXT PRIMARY KEY REFERENCES message_waits(signed_message_cid) ON DELETE CASCADE, observed_landed BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() -- used for gc ); -CREATE INDEX wallet_exporter_watched_msgs_observed_landed ON wallet_exporter_watched_msgs (created_at ASC); -CREATE INDEX wallet_exporter_watched_msgs_observed_landed_idx ON wallet_exporter_watched_msgs (observed_landed); +CREATE INDEX IF NOT EXISTS wallet_exporter_watched_msgs_observed_landed ON wallet_exporter_watched_msgs (created_at ASC); +CREATE INDEX IF NOT EXISTS wallet_exporter_watched_msgs_observed_landed_idx ON wallet_exporter_watched_msgs (observed_landed); diff --git a/harmony/harmonydb/sql/20250808-cc-scheduler.sql b/harmony/harmonydb/sql/20250808-cc-scheduler.sql index 8b44e3ec8..0b68e90c6 100644 --- a/harmony/harmonydb/sql/20250808-cc-scheduler.sql +++ b/harmony/harmonydb/sql/20250808-cc-scheduler.sql @@ -1,4 +1,4 @@ -CREATE TABLE sectors_cc_scheduler ( +CREATE TABLE IF NOT EXISTS sectors_cc_scheduler ( sp_id BIGINT NOT NULL, to_seal BIGINT NOT NULL, weight BIGINT NOT NULL DEFAULT 1000, diff --git a/harmony/harmonydb/sql/20250817-balancemgr-pshare.sql b/harmony/harmonydb/sql/20250817-balancemgr-pshare.sql index 6bf18e3be..afb3694ed 100644 --- a/harmony/harmonydb/sql/20250817-balancemgr-pshare.sql +++ b/harmony/harmonydb/sql/20250817-balancemgr-pshare.sql @@ -1,4 +1,4 @@ -ALTER TABLE balance_manager_addresses ADD COLUMN subject_type TEXT NOT NULL DEFAULT 'wallet'; +ALTER TABLE balance_manager_addresses ADD COLUMN IF NOT EXISTS subject_type TEXT NOT NULL DEFAULT 'wallet'; -- For proofshare rules we allow subject_address == second_address. -- Relax the constraint accordingly. diff --git a/harmony/harmonydb/sql/20250818-restart-request.sql b/harmony/harmonydb/sql/20250818-restart-request.sql index 743868cb7..52d35cea6 100644 --- a/harmony/harmonydb/sql/20250818-restart-request.sql +++ b/harmony/harmonydb/sql/20250818-restart-request.sql @@ -1,2 +1 @@ -ALTER TABLE harmony_machines -ADD COLUMN restart_request TIMESTAMP WITH TIME ZONE; +ALTER TABLE harmony_machines ADD COLUMN IF NOT EXISTS restart_request TIMESTAMP WITH TIME ZONE; diff --git a/harmony/harmonydb/sql/20250926-harmony_config_timestamp.sql b/harmony/harmonydb/sql/20250926-harmony_config_timestamp.sql new file mode 100644 index 000000000..05e025097 --- /dev/null +++ b/harmony/harmonydb/sql/20250926-harmony_config_timestamp.sql @@ -0,0 +1 @@ +ALTER TABLE harmony_config ADD COLUMN timestamp TIMESTAMP NOT NULL DEFAULT NOW(); \ No newline at end of file diff --git a/harmony/harmonydb/userfuncs.go b/harmony/harmonydb/userfuncs.go index 00d61db36..fa546bf94 100644 --- a/harmony/harmonydb/userfuncs.go +++ b/harmony/harmonydb/userfuncs.go @@ -16,7 +16,7 @@ import ( var errTx = errors.New("cannot use a non-transaction func in a transaction") -const InitialSerializationErrorRetryWait = 10 * time.Millisecond +const InitialSerializationErrorRetryWait = 5 * time.Second // rawStringOnly is _intentionally_private_ to force only basic strings in SQL queries. // In any package, raw strings will satisfy compilation. Ex: @@ -290,3 +290,31 @@ func IsErrSerialization(err error) bool { var e2 *pgconn.PgError return errors.As(err, &e2) && e2.Code == pgerrcode.SerializationFailure } + +// IsErrDDLConflict returns true if the error is a DDL conflict (object already exists or doesn't exist) +func IsErrDDLConflict(err error) bool { + var e2 *pgconn.PgError + if !errors.As(err, &e2) { + return false + } + + // DDL conflict error codes + ddlConflictCodes := map[string]bool{ + "42710": true, // duplicate_object + "42712": true, // duplicate_alias + "42723": true, // duplicate_function + "42P04": true, // duplicate_database + "42P06": true, // duplicate_schema + "42P07": true, // duplicate_table + "42P05": true, // duplicate_prepared_statement + "42P03": true, // duplicate_cursor + "42701": true, // duplicate_column + "42704": true, // undefined_object + "42703": true, // undefined_column + "42883": true, // undefined_function + "42P01": true, // undefined_table + "42P02": true, // undefined_parameter + } + + return ddlConflictCodes[e2.Code] +} diff --git a/harmony/harmonytask/task_type_handler.go b/harmony/harmonytask/task_type_handler.go index 2a0aafa36..0cedfd0ad 100644 --- a/harmony/harmonytask/task_type_handler.go +++ b/harmony/harmonytask/task_type_handler.go @@ -270,7 +270,6 @@ retryRecordCompletion: var postedTime time.Time var retries uint err := tx.QueryRow(`SELECT posted_time, retries FROM harmony_task WHERE id=$1`, tID).Scan(&postedTime, &retries) - if err != nil { return false, fmt.Errorf("could not log completion: %w ", err) } @@ -323,17 +322,14 @@ VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id`, tID, h.Name, postedTime.U return true, nil }) - if err != nil { - if harmonydb.IsErrSerialization(err) { - time.Sleep(retryWait) - retryWait *= 2 - goto retryRecordCompletion + // This MUST complete or keep getting retried until it does. If restarted, it will be cleaned-up, so no need for alt persistence. + if err != nil || !cm { + time.Sleep(retryWait) + retryWait *= 2 + if retryWait > time.Second*10 { + log.Error("Could not record completion (retrying): ", err) } - log.Error("Could not record transaction: ", err) - return - } - if !cm { - log.Error("Committing the task records failed") + goto retryRecordCompletion } } diff --git a/itests/curio_test.go b/itests/curio_test.go index dc39650f6..df6bff52e 100644 --- a/itests/curio_test.go +++ b/itests/curio_test.go @@ -33,6 +33,7 @@ import ( "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/lib/ffiselect" "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/lib/testutils" "github.com/filecoin-project/curio/market/indexstore" "github.com/filecoin-project/curio/tasks/seal" @@ -80,7 +81,9 @@ func TestCurioHappyPath(t *testing.T) { defer db.ITestDeleteAll() - idxStore, err := indexstore.NewIndexStore([]string{envElse("CURIO_HARMONYDB_HOSTS", "127.0.0.1")}, 9042, config.DefaultCurioConfig()) + idxStore, err := indexstore.NewIndexStore([]string{testutils.EnvElse("CURIO_HARMONYDB_HOSTS", "127.0.0.1")}, 9042, config.DefaultCurioConfig()) + require.NoError(t, err) + err = idxStore.Start(ctx, true) require.NoError(t, err) var titles []string @@ -107,13 +110,14 @@ func TestCurioHappyPath(t *testing.T) { err = db.QueryRow(ctx, "SELECT config FROM harmony_config WHERE title='base'").Scan(&baseText) require.NoError(t, err) + _, err = deps.LoadConfigWithUpgrades(baseText, baseCfg) require.NoError(t, err) require.NotNil(t, baseCfg.Addresses) - require.GreaterOrEqual(t, len(baseCfg.Addresses), 1) + require.GreaterOrEqual(t, len(baseCfg.Addresses.Get()), 1) - require.Contains(t, baseCfg.Addresses[0].MinerAddresses, maddr.String()) + require.Contains(t, baseCfg.Addresses.Get()[0].MinerAddresses, maddr.String()) baseCfg.Batching.PreCommit.Timeout = time.Second baseCfg.Batching.Commit.Timeout = time.Second @@ -162,9 +166,6 @@ func TestCurioHappyPath(t *testing.T) { } } - if err != nil { - return false, xerrors.Errorf("allocating sector numbers: %w", err) - } return true, nil }) @@ -188,9 +189,6 @@ func TestCurioHappyPath(t *testing.T) { } } - if err != nil { - return false, xerrors.Errorf("allocating sector numbers: %w", err) - } return true, nil }) require.NoError(t, err) @@ -519,13 +517,6 @@ func ConstructCurioTest(ctx context.Context, t *testing.T, dir string, db *harmo return capi, taskEngine.GracefullyTerminate, ccloser, finishCh } -func envElse(env, els string) string { - if v := os.Getenv(env); v != "" { - return v - } - return els -} - // Helper functions to handle nil or null values func valueOrNA(ptr *int64) string { if ptr == nil { diff --git a/itests/dyncfg_test.go b/itests/dyncfg_test.go new file mode 100644 index 000000000..8b70249f1 --- /dev/null +++ b/itests/dyncfg_test.go @@ -0,0 +1,63 @@ +package itests + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/curio/deps" + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" +) + +func TestDynamicConfig(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + sharedITestID := harmonydb.ITestNewID() + cdb, err := harmonydb.NewFromConfigWithITestID(t, sharedITestID) + require.NoError(t, err) + + databaseContents := &config.CurioConfig{ + HTTP: config.HTTPConfig{ + ListenAddress: "first value", + }, + Ingest: config.CurioIngestConfig{ + MaxQueueDownload: config.NewDynamic(10), + }, + } + // Write a "testcfg" layer to the database with toml for Ingest having MaxQueueDownload set to 10 + require.NoError(t, setTestConfig(ctx, cdb, databaseContents)) + + runtimeConfig := config.DefaultCurioConfig() + err = deps.ApplyLayers(context.Background(), cdb, runtimeConfig, []string{"testcfg"}) + require.NoError(t, err) + + // database config changes + databaseContents.Ingest.MaxQueueDownload.Set(20) + databaseContents.HTTP.ListenAddress = "unapplied value" + require.NoError(t, setTestConfig(ctx, cdb, databaseContents)) + + // "Start the server". This will immediately poll for a config update. + require.NoError(t, config.EnableChangeDetection(cdb, databaseContents, []string{"testcfg"}, config.FixTOML)) + + // Positive Test: the runtime config should have the new value + require.Eventually(t, func() bool { + return databaseContents.Ingest.MaxQueueDownload.Get() == 20 + }, 10*time.Second, 100*time.Millisecond) + + // Negative Test: the runtime config should not have the changed static value + require.Equal(t, runtimeConfig.HTTP.ListenAddress, "first value") + +} + +func setTestConfig(ctx context.Context, cdb *harmonydb.DB, cfg *config.CurioConfig) error { + tomlData, err := config.TransparentMarshal(cfg) + if err != nil { + return err + } + _, err = cdb.Exec(ctx, `INSERT INTO harmony_config (title, config) VALUES ($1, $2)`, "testcfg", string(tomlData)) + return err +} diff --git a/itests/pdp_prove_test.go b/itests/pdp_prove_test.go new file mode 100644 index 000000000..4e4c1d247 --- /dev/null +++ b/itests/pdp_prove_test.go @@ -0,0 +1,207 @@ +package itests + +import ( + "context" + "io" + "math/rand" + "os" + "testing" + + "github.com/stretchr/testify/require" + + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-padreader" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/lib/proof" + "github.com/filecoin-project/curio/lib/savecache" + "github.com/filecoin-project/curio/lib/testutils" + "github.com/filecoin-project/curio/market/indexstore" + "github.com/filecoin-project/curio/pdp/contract" + "github.com/filecoin-project/curio/tasks/pdp" + + "github.com/filecoin-project/lotus/storage/pipeline/lib/nullreader" +) + +// TestPDPProving verifies the functionality of generating and validating PDP proofs with a random file created in a temporary directory. +func TestPDPProving(t *testing.T) { + ctx := context.Background() + cfg := config.DefaultCurioConfig() + idxStore, err := indexstore.NewIndexStore([]string{testutils.EnvElse("CURIO_HARMONYDB_HOSTS", "127.0.0.1")}, 9042, cfg) + require.NoError(t, err) + err = idxStore.Start(ctx, true) + require.NoError(t, err) + + dir := t.TempDir() + + //rawSize := int64(8323072) + //rawSize := int64(7 * 1024 * 1024 * 1024) + rawSize := int64(5 * 1024 * 1024) + pieceSize := padreader.PaddedSize(uint64(rawSize)).Padded() + + // Create temporary file + fileStr, err := testutils.CreateRandomTmpFile(dir, rawSize) + require.NoError(t, err) + + defer func() { + _ = os.Remove(fileStr) + }() + + f, err := os.Open(fileStr) + require.NoError(t, err) + + stat, err := f.Stat() + require.NoError(t, err) + require.Equal(t, stat.Size(), rawSize) + + defer func() { + _ = f.Close() + }() + + t.Logf("File Size: %d", stat.Size()) + + // Total number of leafs + numberOfLeafs := pieceSize.Unpadded() / 32 + + // Do commP and save the snapshot layer + cp := savecache.NewCommPWithSizeForTest(uint64(rawSize)) + _, err = io.Copy(cp, f) + require.NoError(t, err) + + digest, psize, layerIdx, expectedNodeCount, layer, err := cp.DigestWithSnapShot() + require.NoError(t, err) + + require.Equal(t, abi.PaddedPieceSize(psize), pieceSize) + + t.Logf("Digest: %x", digest) + t.Logf("PieceSize: %d", psize) + t.Logf("LayerIdx: %d", layerIdx) + t.Logf("Expected Node Count: %d", expectedNodeCount) + t.Logf("Number of Nodes in snapshot layer: %d", len(layer)) + t.Logf("Total Number of Leafs: %d", numberOfLeafs) + + pcid2, err := commcid.DataCommitmentToPieceCidv2(digest, uint64(stat.Size())) + require.NoError(t, err) + + leafs := make([]indexstore.NodeDigest, len(layer)) + for i, s := range layer { + leafs[i] = indexstore.NodeDigest{ + Layer: layerIdx, + Hash: s.Hash, + Index: int64(i), + } + } + require.Equal(t, len(leafs), len(layer)) + + err = idxStore.AddPDPLayer(ctx, pcid2, leafs) + require.NoError(t, err) + + // Generate challenge leaf + challenge := int64(rand.Intn(int(numberOfLeafs))) + + t.Logf("Challenge: %d", challenge) + + has, outLayerIndex, err := idxStore.GetPDPLayerIndex(ctx, pcid2) + require.NoError(t, err) + require.True(t, has) + require.Equal(t, outLayerIndex, layerIdx) + + // Calculate start leaf and snapshot leaf indexes + leavesPerNode := int64(1) << outLayerIndex + snapshotNodeIndex := challenge >> outLayerIndex + startLeaf := snapshotNodeIndex << outLayerIndex + t.Logf("Leaves per Node: %d", leavesPerNode) + t.Logf("Start Leaf: %d", startLeaf) + t.Logf("Snapshot Node Index: %d", snapshotNodeIndex) + + has, snapNode, err := idxStore.GetPDPNode(ctx, pcid2, outLayerIndex, snapshotNodeIndex) + require.NoError(t, err) + require.True(t, has) + require.Equal(t, snapNode.Index, snapshotNodeIndex) + require.Equal(t, snapNode.Layer, layerIdx) + require.Equal(t, snapNode.Hash, layer[snapshotNodeIndex].Hash) + + // Convert tree-based leaf range to file-based offset/length + offset := int64(abi.PaddedPieceSize(startLeaf * 32).Unpadded()) + length := int64(abi.PaddedPieceSize(leavesPerNode * 32).Unpadded()) + + t.Logf("Offset: %d", offset) + t.Logf("Length: %d", length) + + // Compute padded size to build Merkle tree + subrootSize := padreader.PaddedSize(uint64(length)).Padded() + t.Logf("Subroot Size: %d", subrootSize) + + _, err = f.Seek(0, io.SeekStart) + require.NoError(t, err) + + dataReader := io.NewSectionReader(f, offset, length) + + _, err = f.Seek(offset, io.SeekStart) + require.NoError(t, err) + + fileRemaining := stat.Size() - offset + + t.Logf("File Remaining: %d", fileRemaining) + t.Logf("Is Padding: %t", fileRemaining < length) + + var data io.Reader + if fileRemaining < length { + data = io.MultiReader(dataReader, nullreader.NewNullReader(abi.UnpaddedPieceSize(int64(subrootSize.Unpadded())-fileRemaining))) + } else { + data = dataReader + } + + memtree, err := proof.BuildSha254Memtree(data, subrootSize.Unpadded()) + require.NoError(t, err) + + // Get challenge leaf in subTree + subTreeChallenge := challenge - startLeaf + + // Generate merkle proof for subTree + subTreeProof, err := proof.MemtreeProof(memtree, subTreeChallenge) + require.NoError(t, err) + + // Verify that subTree root is same as snapNode hash + require.Equal(t, subTreeProof.Root, snapNode.Hash) + + // Arrange snapshot layer into a byte array + var layerBytes []byte + outLayer, err := idxStore.GetPDPLayer(ctx, pcid2, layerIdx) + require.NoError(t, err) + require.Equal(t, len(outLayer), len(leafs)) + require.Equal(t, len(outLayer), len(layer)) + require.Equal(t, outLayer, leafs) + for _, n := range outLayer { + layerBytes = append(layerBytes, n.Hash[:]...) + } + + t.Logf("Layer Bytes: %d", len(layerBytes)) + + // Create subTree from snapshot to commP (root) + mtree, err := proof.BuildSha254MemtreeFromSnapshot(layerBytes) + require.NoError(t, err) + + // Generate merkle proof from snapShot node to commP + proofs, err := proof.MemtreeProof(mtree, snapshotNodeIndex) + require.NoError(t, err) + + var digest32 [32]byte + copy(digest32[:], digest[:]) + + // verify that root and commP match + require.Equal(t, proofs.Root, digest32) + rd := proofs.Root + + out := contract.IPDPTypesProof{ + Leaf: subTreeProof.Leaf, + Proof: append(subTreeProof.Proof, proofs.Proof...), + } + + verified := pdp.Verify(out, rd, uint64(challenge)) + require.True(t, verified) + + err = idxStore.DeletePDPLayer(ctx, pcid2) + require.NoError(t, err) +} diff --git a/itests/sql_idempotent_test.go b/itests/sql_idempotent_test.go new file mode 100644 index 000000000..2d11aa450 --- /dev/null +++ b/itests/sql_idempotent_test.go @@ -0,0 +1,36 @@ +package itests + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "github.com/yugabyte/pgx/v5/pgxpool" + + "github.com/filecoin-project/curio/harmony/harmonydb" +) + +// TestSQLIdempotent tests that the SQL DDL files are idempotent. +// The upgrader will fail unless everything has "IF NOT EXISTS" or "IF EXISTS" statements. +// Or equivalent safety checks. +func TestSQLIdempotent(t *testing.T) { + harmonydb.ITestUpgradeFunc = func(db *pgxpool.Pool, name string, sql string) { + _, err := db.Exec(context.Background(), sql) + require.NoError(t, fmt.Errorf("SQL DDL file failed idempotent check: %s, %w", name, err)) + } + + testID := harmonydb.ITestNewID() + cdb, err := harmonydb.NewFromConfigWithITestID(t, testID) + require.NoError(t, err) + + ctx := context.Background() + _, err = cdb.Exec(ctx, ` + INSERT INTO + itest_scratch (content, some_int) + VALUES + ('andy was here', 5), + ('lotus is awesome', 6) + `) + require.NoError(t, err) +} diff --git a/lib/cachedreader/cachedreader.go b/lib/cachedreader/cachedreader.go index e110e3350..5ac710c59 100644 --- a/lib/cachedreader/cachedreader.go +++ b/lib/cachedreader/cachedreader.go @@ -2,6 +2,7 @@ package cachedreader import ( "context" + "database/sql" "errors" "fmt" "io" @@ -12,14 +13,20 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" "github.com/jellydator/ttlcache/v2" + "github.com/oklog/ulid" "go.opencensus.io/stats" "go.opencensus.io/tag" + "golang.org/x/xerrors" + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-padreader" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/commcidv2" "github.com/filecoin-project/curio/lib/pieceprovider" "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/market/indexstore" ) var ErrNoDeal = errors.New("no deals found") @@ -38,13 +45,15 @@ type CachedPieceReader struct { sectorReader *pieceprovider.SectorReader pieceParkReader *pieceprovider.PieceParkReader + idxStor *indexstore.IndexStore + pieceReaderCacheMu sync.Mutex pieceReaderCache *ttlcache.Cache // Cache for successful readers (10 minutes with TTL extension) pieceErrorCacheMu sync.Mutex pieceErrorCache *ttlcache.Cache // Cache for errors (5 seconds without TTL extension) } -func NewCachedPieceReader(db *harmonydb.DB, sectorReader *pieceprovider.SectorReader, pieceParkReader *pieceprovider.PieceParkReader) *CachedPieceReader { +func NewCachedPieceReader(db *harmonydb.DB, sectorReader *pieceprovider.SectorReader, pieceParkReader *pieceprovider.PieceParkReader, idxStor *indexstore.IndexStore) *CachedPieceReader { prCache := ttlcache.NewCache() _ = prCache.SetTTL(PieceReaderCacheTTL) prCache.SetCacheSizeLimit(MaxCachedReaders) @@ -61,6 +70,7 @@ func NewCachedPieceReader(db *harmonydb.DB, sectorReader *pieceprovider.SectorRe pieceParkReader: pieceParkReader, pieceReaderCache: prCache, pieceErrorCache: errorCache, + idxStor: idxStor, } expireCallback := func(key string, reason ttlcache.EvictionReason, value interface{}) { @@ -104,10 +114,10 @@ func NewCachedPieceReader(db *harmonydb.DB, sectorReader *pieceprovider.SectorRe } type cachedSectionReader struct { - reader storiface.Reader - cpr *CachedPieceReader - pieceCid cid.Cid - pieceSize abi.UnpaddedPieceSize + reader storiface.Reader + cpr *CachedPieceReader + pieceCid cid.Cid + rawSize uint64 // Signals when the underlying piece reader is ready ready chan struct{} // err is non-nil if there's an error getting the underlying piece reader @@ -142,99 +152,258 @@ func (r *cachedSectionReader) Close() error { return nil } -func (cpr *CachedPieceReader) getPieceReaderFromSector(ctx context.Context, pieceCid cid.Cid) (storiface.Reader, abi.UnpaddedPieceSize, error) { +func (cpr *CachedPieceReader) getPieceReaderFromMarketPieceDeal(ctx context.Context, pieceCidV2 cid.Cid, retrieval bool) (storiface.Reader, uint64, error) { // Get all deals containing this piece + pieceCid, rawSize, err := commcid.PieceCidV1FromV2(pieceCidV2) + if err != nil { + return nil, 0, xerrors.Errorf("getting piece CID v1 from piece CID v2: %w", err) + } + + pieceSize := padreader.PaddedSize(rawSize).Padded() + var deals []struct { - SpID abi.ActorID `db:"sp_id"` - Sector abi.SectorNumber `db:"sector_num"` - Offset abi.PaddedPieceSize `db:"piece_offset"` - Length abi.PaddedPieceSize `db:"piece_length"` - Proof abi.RegisteredSealProof `db:"reg_seal_proof"` + ID string `db:"id"` + SpID int64 `db:"sp_id"` + Sector int64 `db:"sector_num"` + Offset sql.NullInt64 `db:"piece_offset"` + Length abi.PaddedPieceSize `db:"piece_length"` + RawSize int64 `db:"raw_size"` + Proof abi.RegisteredSealProof `db:"reg_seal_proof"` + PieceRef sql.NullInt64 `db:"piece_ref"` } - err := cpr.db.Select(ctx, &deals, `SELECT - mpd.sp_id, - mpd.sector_num, - mpd.piece_offset, - mpd.piece_length, - sm.reg_seal_proof - FROM - market_piece_deal mpd - JOIN - sectors_meta sm - ON - mpd.sp_id = sm.sp_id - AND mpd.sector_num = sm.sector_num - WHERE - mpd.piece_cid = $1;`, pieceCid.String()) + err = cpr.db.Select(ctx, &deals, `SELECT + mpd.id, + mpd.sp_id, + mpd.sector_num, + mpd.piece_offset, + mpd.piece_length, + mpd.raw_size, + mpd.piece_ref, + COALESCE(sm.reg_seal_proof, 0::bigint) AS reg_seal_proof + FROM market_piece_deal mpd + LEFT JOIN sectors_meta sm + ON sm.sp_id = mpd.sp_id + AND sm.sector_num = mpd.sector_num + WHERE mpd.piece_cid = $1 + AND mpd.piece_length = $2;`, pieceCid.String(), pieceSize) if err != nil { return nil, 0, fmt.Errorf("getting piece deals: %w", err) } if len(deals) == 0 { - return nil, 0, fmt.Errorf("piece cid %s: %w", pieceCid, ErrNoDeal) + if retrieval { + return nil, 0, fmt.Errorf("piece cid %s: %w", pieceCid, ErrNoDeal) + } + reader, rawSize, err := cpr.getPieceReaderFromPiecePark(ctx, nil, &pieceCid, &pieceSize) + if err != nil { + return nil, 0, fmt.Errorf("failed to read piece from piece park: %w", err) + } + return reader, rawSize, nil } // For each deal, try to read an unsealed copy of the data from the sector // it is stored in var merr error for _, dl := range deals { - sr := storiface.SectorRef{ - ID: abi.SectorID{ - Miner: dl.SpID, - Number: dl.Sector, - }, - ProofType: dl.Proof, + _, err := ulid.Parse(dl.ID) + if err != nil { + // This is likely a MK12 deal, get from sector + sr := storiface.SectorRef{ + ID: abi.SectorID{ + Miner: abi.ActorID(dl.SpID), + Number: abi.SectorNumber(dl.Sector), + }, + ProofType: dl.Proof, + } + + reader, err := cpr.sectorReader.ReadPiece(ctx, sr, storiface.UnpaddedByteIndex(abi.PaddedPieceSize(dl.Offset.Int64).Unpadded()), dl.Length.Unpadded(), pieceCid) + if err != nil { + merr = multierror.Append(merr, xerrors.Errorf("failed to read piece from sector: %w", err)) + continue + } + + return reader, uint64(dl.RawSize), nil } - reader, err := cpr.sectorReader.ReadPiece(ctx, sr, storiface.UnpaddedByteIndex(dl.Offset.Unpadded()), dl.Length.Unpadded(), pieceCid) - if err != nil { - merr = multierror.Append(merr, err) - continue + if dl.PieceRef.Valid { + // This is a MK20 deal, get from piece park + ref := dl.PieceRef.Int64 + reader, rawSize, err := cpr.getPieceReaderFromPiecePark(ctx, &ref, nil, nil) + if err != nil { + merr = multierror.Append(merr, xerrors.Errorf("failed to read piece from piece park: %w", err)) + continue + } + return reader, rawSize, nil } - return reader, dl.Length.Unpadded(), nil } return nil, 0, merr } -func (cpr *CachedPieceReader) getPieceReaderFromPiecePark(ctx context.Context, pieceCid cid.Cid) (storiface.Reader, abi.UnpaddedPieceSize, error) { - // Query parked_pieces and parked_piece_refs in one go - var pieceData []struct { - ID int64 `db:"id"` - PieceRawSize int64 `db:"piece_raw_size"` +func (cpr *CachedPieceReader) getPieceReaderFromPiecePark(ctx context.Context, pieceRef *int64, pieceCid *cid.Cid, pieceSize *abi.PaddedPieceSize) (storiface.Reader, uint64, error) { + type pieceData struct { + ID int64 `db:"id"` + PieceCid string `db:"piece_cid"` + PieceRawSize int64 `db:"piece_raw_size"` } - err := cpr.db.Select(ctx, &pieceData, ` - SELECT - pp.id, - pp.piece_raw_size - FROM - parked_pieces pp - WHERE - pp.piece_cid = $1 AND pp.complete = TRUE AND pp.long_term = TRUE - LIMIT 1; - `, pieceCid.String()) - if err != nil { - return nil, 0, fmt.Errorf("failed to query parked_pieces and parked_piece_refs for piece cid %s: %w", pieceCid.String(), err) + var pd []pieceData + + if pieceRef != nil { + var pdr []pieceData + err := cpr.db.Select(ctx, &pdr, ` + SELECT + pp.id, + pp.piece_cid, + pp.piece_raw_size + FROM parked_piece_refs pr + JOIN parked_pieces pp ON pp.id = pr.piece_id + WHERE pr.ref_id = $1 AND pp.complete = TRUE and pp.long_term = TRUE; + `, pieceRef) + if err != nil { + return nil, 0, fmt.Errorf("failed to query parked_pieces and parked_piece_refs for piece_ref %d: %w", pieceRef, err) + } + if len(pdr) > 0 { + pd = append(pd, pdr...) + } + } + + if pieceCid != nil && pieceSize != nil { + pcid := *pieceCid + var pdc []pieceData + err := cpr.db.Select(ctx, &pdc, ` + SELECT + id, + piece_cid, + piece_raw_size + FROM parked_pieces + WHERE piece_cid = $1 AND piece_padded_size = $2;`, pcid.String(), *pieceSize) + if err != nil { + return nil, 0, fmt.Errorf("failed to query parked_pieces and parked_piece_refs for piece_ref %d: %w", pieceRef, err) + } + if len(pdc) > 0 { + pd = append(pd, pdc...) + } } - if len(pieceData) == 0 { - return nil, 0, fmt.Errorf("failed to find piece in parked_pieces for piece cid %s", pieceCid.String()) + if len(pd) == 0 { + return nil, 0, fmt.Errorf("failed to find piece in parked_pieces for piece_ref %d", pieceRef) } - reader, err := cpr.pieceParkReader.ReadPiece(ctx, storiface.PieceNumber(pieceData[0].ID), pieceData[0].PieceRawSize, pieceCid) + pcid, err := cid.Parse(pd[0].PieceCid) + if err != nil { + return nil, 0, fmt.Errorf("failed to parse piece cid: %w", err) + } + + reader, err := cpr.pieceParkReader.ReadPiece(ctx, storiface.PieceNumber(pd[0].ID), pd[0].PieceRawSize, pcid) if err != nil { return nil, 0, fmt.Errorf("failed to read piece from piece park: %w", err) } - return reader, abi.UnpaddedPieceSize(pieceData[0].PieceRawSize), nil + return reader, uint64(pd[0].PieceRawSize), nil } -func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid cid.Cid) (storiface.Reader, abi.UnpaddedPieceSize, error) { - cacheKey := pieceCid.String() +type SubPieceReader struct { + sr *io.SectionReader + r io.Closer +} + +func (s SubPieceReader) Read(p []byte) (n int, err error) { + return s.sr.Read(p) +} + +func (s SubPieceReader) Close() error { + return s.r.Close() +} + +func (s SubPieceReader) Seek(offset int64, whence int) (int64, error) { + return s.sr.Seek(offset, whence) +} + +func (s SubPieceReader) ReadAt(p []byte, off int64) (n int, err error) { + return s.sr.ReadAt(p, off) +} + +func (cpr *CachedPieceReader) getPieceReaderFromAggregate(ctx context.Context, pieceCidV2 cid.Cid, retrieval bool) (storiface.Reader, uint64, error) { + pieces, err := cpr.idxStor.FindPieceInAggregate(ctx, pieceCidV2) + if err != nil { + return nil, 0, fmt.Errorf("failed to find piece in aggregate: %w", err) + } + + if len(pieces) == 0 { + return nil, 0, fmt.Errorf("subpiece not found in any aggregate piece") + } + + _, rawSize, err := commcid.PieceCidV1FromV2(pieceCidV2) + if err != nil { + return nil, 0, xerrors.Errorf("getting piece commitment from piece CID v2: %w", err) + } + + var merr error + + for _, p := range pieces { + reader, _, err := cpr.getPieceReaderFromMarketPieceDeal(ctx, p.Cid, retrieval) + if err != nil { + merr = multierror.Append(merr, err) + continue + } + + sr := io.NewSectionReader(reader, int64(p.Offset), int64(p.Size)) + return SubPieceReader{r: reader, sr: sr}, rawSize, nil + } + + return nil, 0, fmt.Errorf("failed to find piece in aggregate: %w", merr) +} + +func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCidV2 cid.Cid, retrieval bool) (storiface.Reader, uint64, error) { + // Check if this is PieceCidV1 and try to convert to v2 if possible + yes := commcidv2.IsPieceCidV2(pieceCidV2) + if !yes { + var rawSize int64 + var singlePiece bool + err := cpr.db.QueryRow(ctx, `WITH meta AS ( + SELECT piece_size + FROM market_piece_metadata + WHERE piece_cid = $1 + ), + exact AS ( + SELECT COUNT(*) AS n, MIN(piece_size) AS piece_size + FROM meta + ), + raw AS ( + SELECT MAX(mpd.raw_size) AS raw_size + FROM market_piece_deal mpd + WHERE mpd.piece_cid = $1 + AND mpd.piece_length = (SELECT piece_size FROM exact) + AND (SELECT n FROM exact) = 1 + ) + SELECT + COALESCE((SELECT raw_size FROM raw), 0) AS raw_size, + ((SELECT n FROM exact) = 1) AS has_single_metadata;`, pieceCidV2.String()).Scan(&rawSize, &singlePiece) + if err != nil { + return nil, 0, fmt.Errorf("failed to get piece metadata: %w", err) + } + if !singlePiece { + return nil, 0, fmt.Errorf("more than 1 piece metadata found for piece cid %s, please use piece cid v2", pieceCidV2.String()) + } + pcid2, err := commcid.PieceCidV2FromV1(pieceCidV2, uint64(rawSize)) + if err != nil { + return nil, 0, fmt.Errorf("failed to convert piece cid v1 to v2: %w", err) + } + pieceCidV2 = pcid2 + } + + cacheKey := pieceCidV2.String() + + pieceCid, rawSize, err := commcid.PieceCidV1FromV2(pieceCidV2) + if err != nil { + return nil, 0, xerrors.Errorf("getting piece CID v1 from piece CID v2: %w", err) + } + + pieceSize := padreader.PaddedSize(rawSize).Padded() // First check if we have a cached error for this piece cpr.pieceErrorCacheMu.Lock() @@ -266,7 +435,7 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid // Create a new one and add it to the cache r = &cachedSectionReader{ cpr: cpr, - pieceCid: pieceCid, + pieceCid: pieceCidV2, ready: make(chan struct{}), refs: 1, } @@ -283,18 +452,21 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid readerCtx, readerCtxCancel := context.WithCancel(context.Background()) defer close(r.ready) - reader, size, err := cpr.getPieceReaderFromSector(readerCtx, pieceCid) + reader, size, err := cpr.getPieceReaderFromAggregate(readerCtx, pieceCidV2, retrieval) if err != nil { - log.Warnw("failed to get piece reader from sector", "piececid", pieceCid, "err", err) + log.Debugw("failed to get piece reader from aggregate", "piececid", pieceCidV2.String(), "err", err) - serr := err + aerr := err - // Try getPieceReaderFromPiecePark - reader, size, err = cpr.getPieceReaderFromPiecePark(readerCtx, pieceCid) + reader, size, err = cpr.getPieceReaderFromMarketPieceDeal(readerCtx, pieceCidV2, retrieval) if err != nil { - log.Errorw("failed to get piece reader from piece park", "piececid", pieceCid, "err", err) + log.Errorw("failed to get piece reader", "piececid", pieceCid, "piece size", pieceSize, "err", err) + finalErr := fmt.Errorf("failed to get piece reader from aggregate, sector or piece park: %w, %w", aerr, err) - finalErr := fmt.Errorf("failed to get piece reader from sector or piece park: %w, %w", err, serr) + // Record error metric + _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ + tag.Upsert(reasonKey, "piece_not_found"), + }, CachedReaderMeasures.ReaderErrors.M(1)) // Record error metric _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ @@ -324,6 +496,7 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid return nil, 0, finalErr } + } // Record successful reader creation @@ -332,7 +505,7 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid r.reader = reader r.err = nil r.cancel = readerCtxCancel - r.pieceSize = size + r.rawSize = size } else { // Cache hit - we already have a cached reader _ = stats.RecordWithTags(context.Background(), []tag.Mutator{ @@ -365,7 +538,7 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid return nil, 0, r.err } - rs := io.NewSectionReader(r.reader, 0, int64(r.pieceSize)) + rs := io.NewSectionReader(r.reader, 0, int64(r.rawSize)) return struct { io.Closer @@ -377,5 +550,5 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid Reader: rs, Seeker: rs, ReaderAt: r.reader, - }, r.pieceSize, nil + }, r.rawSize, nil } diff --git a/lib/chainsched/chain_sched.go b/lib/chainsched/chain_sched.go index 3fb372866..3f82281f5 100644 --- a/lib/chainsched/chain_sched.go +++ b/lib/chainsched/chain_sched.go @@ -33,9 +33,13 @@ type NodeAPI interface { type CurioChainSched struct { api NodeAPI + wlk sync.RWMutex + watchers []UpdateFunc + callbacks []UpdateFunc lk sync.RWMutex - started bool + + started bool notificationTimeout time.Duration } @@ -66,6 +70,16 @@ func (s *CurioChainSched) AddHandler(ch UpdateFunc) error { return nil } +func (s *CurioChainSched) AddWatcher(ch UpdateFunc) error { + s.wlk.Lock() + defer s.wlk.Unlock() + if s.started { + return xerrors.Errorf("cannot add watcher handler after start") + } + s.watchers = append(s.watchers, ch) + return nil +} + func (s *CurioChainSched) Run(ctx context.Context) { s.lk.Lock() s.started = true @@ -197,11 +211,23 @@ func (s *CurioChainSched) update(ctx context.Context, revert, apply *types.TipSe return } + s.wlk.RLock() + watchersCopy := make([]UpdateFunc, len(s.watchers)) + copy(watchersCopy, s.watchers) + s.wlk.RUnlock() + s.lk.RLock() callbacksCopy := make([]UpdateFunc, len(s.callbacks)) copy(callbacksCopy, s.callbacks) s.lk.RUnlock() + // Update all watchers so handlers can react to the new tipset in the same tipset + for _, ch := range watchersCopy { + if err := ch(ctx, revert, apply); err != nil { + log.Errorf("handling head updates in CurioChainSched: %+v", err) + } + } + for _, ch := range callbacksCopy { if err := ch(ctx, revert, apply); err != nil { log.Errorf("handling head updates in CurioChainSched: %+v", err) diff --git a/lib/chainsched/chain_sched_test.go b/lib/chainsched/chain_sched_test.go index 5f378c9df..99ea46ae8 100644 --- a/lib/chainsched/chain_sched_test.go +++ b/lib/chainsched/chain_sched_test.go @@ -541,3 +541,84 @@ func TestMultipleChanges(t *testing.T) { // Initial current + one call for the batch require.Equal(t, 2, callCount) } + +func TestWatchersExecutedFirst(t *testing.T) { + notifCh := make(chan []*api.HeadChange, 10) + mockAPI := &mockNodeAPI{ + notifCh: notifCh, + } + sched := New(mockAPI) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + var executionOrderMu sync.Mutex + var executionOrder []string + + // Add handlers + var wg sync.WaitGroup + errors := make(chan error, 10) + + for i := 0; i < 5; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + err := sched.AddHandler(func(ctx context.Context, revert, apply *types.TipSet) error { + executionOrderMu.Lock() + defer executionOrderMu.Unlock() + executionOrder = append(executionOrder, "handler") + return nil + }) + if err != nil { + errors <- err + } + }(i) + } + + // Add watchers + for i := 0; i < 5; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + err := sched.AddWatcher(func(ctx context.Context, revert, apply *types.TipSet) error { + executionOrderMu.Lock() + defer executionOrderMu.Unlock() + executionOrder = append(executionOrder, "watcher") + return nil + }) + if err != nil { + errors <- err + } + }(i) + } + + wg.Wait() + close(errors) + + // Should have no errors + for err := range errors { + require.NoError(t, err) + } + + // Start the scheduler + go sched.Run(ctx) + + // Send an initial notification + testTipSet := makeMockTipSet(100) + notifCh <- []*api.HeadChange{{ + Type: store.HCCurrent, + Val: testTipSet, + }} + + // Allow some time for processing + time.Sleep(100 * time.Millisecond) + + // Verify execution order: watchers should run before handlers + executionOrderMu.Lock() + require.Len(t, executionOrder, 10) + require.NotContains(t, executionOrder[:5], "handler") + require.NotContains(t, executionOrder[5:], "watcher") + require.Equal(t, executionOrder[:5], []string{"watcher", "watcher", "watcher", "watcher", "watcher"}) + require.Equal(t, executionOrder[5:], []string{"handler", "handler", "handler", "handler", "handler"}) + executionOrderMu.Unlock() +} diff --git a/lib/commcidv2/commcidv2.go b/lib/commcidv2/commcidv2.go new file mode 100644 index 000000000..2e65197a5 --- /dev/null +++ b/lib/commcidv2/commcidv2.go @@ -0,0 +1,60 @@ +package commcidv2 + +import ( + "github.com/ipfs/go-cid" + "github.com/multiformats/go-multicodec" + "github.com/multiformats/go-multihash" +) + +func IsPieceCidV2(c cid.Cid) bool { + if c.Type() != uint64(multicodec.Raw) { + return false + } + + decoded, err := multihash.Decode(c.Hash()) + if err != nil { + return false + } + + if decoded.Code != uint64(multicodec.Fr32Sha256Trunc254Padbintree) { + return false + } + + if len(decoded.Digest) < 34 { + return false + } + + return true +} + +func IsCidV1PieceCid(c cid.Cid) bool { + decoded, err := multihash.Decode(c.Hash()) + if err != nil { + return false + } + + filCodec := multicodec.Code(c.Type()) + filMh := multicodec.Code(decoded.Code) + + // Check if it's a valid Filecoin commitment type + switch filCodec { + case multicodec.FilCommitmentUnsealed: + if filMh != multicodec.Sha2_256Trunc254Padded { + return false + } + /* case multicodec.FilCommitmentSealed: + if filMh != multicodec.PoseidonBls12_381A2Fc1 { + return false + } */ + default: + // Neither unsealed nor sealed commitment + return false + } + + // Commitments must be exactly 32 bytes + if len(decoded.Digest) != 32 { + return false + } + + return true +} diff --git a/lib/createminer/create_miner.go b/lib/createminer/create_miner.go index eeaa285bd..24c23987b 100644 --- a/lib/createminer/create_miner.go +++ b/lib/createminer/create_miner.go @@ -29,6 +29,8 @@ type CreateMinerChainAPI interface { StateMinerCreationDeposit(ctx context.Context, tsk types.TipSetKey) (types.BigInt, error) } +const DepositMarginFactor = 1.5 + func CreateStorageMiner(ctx context.Context, chain CreateMinerChainAPI, owner, worker, sender address.Address, ssize abi.SectorSize, confidence uint64) (address.Address, error) { // make sure the sender account exists on chain _, err := chain.StateLookupID(ctx, owner, types.EmptyTSK) @@ -108,10 +110,12 @@ func CreateStorageMiner(ctx context.Context, chain CreateMinerChainAPI, owner, w return address.Undef, xerrors.Errorf("getting miner creation deposit: %w", err) } + scaledDeposit := types.BigDiv(types.BigMul(value, types.NewInt(uint64(1.5*100))), types.NewInt(100)) + createStorageMinerMsg := &types.Message{ To: power.Address, From: sender, - Value: value, + Value: scaledDeposit, Method: power.Methods.CreateMiner, Params: params, diff --git a/lib/ffi/piece_funcs.go b/lib/ffi/piece_funcs.go index 9dcb4e151..bb1449352 100644 --- a/lib/ffi/piece_funcs.go +++ b/lib/ffi/piece_funcs.go @@ -9,8 +9,12 @@ import ( "github.com/detailyang/go-fallocate" "golang.org/x/xerrors" + commcid "github.com/filecoin-project/go-fil-commcid" + commp "github.com/filecoin-project/go-fil-commp-hashhash" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/curio/harmony/harmonytask" - storiface "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/lib/storiface" ) func (sb *SealCalls) WritePiece(ctx context.Context, taskID *harmonytask.TaskID, pieceID storiface.PieceNumber, size int64, data io.Reader, storageType storiface.PathType) error { @@ -90,3 +94,82 @@ func (sb *SealCalls) PieceReader(ctx context.Context, id storiface.PieceNumber) func (sb *SealCalls) RemovePiece(ctx context.Context, id storiface.PieceNumber) error { return sb.Sectors.storage.Remove(ctx, id.Ref().ID, storiface.FTPiece, true, nil) } + +func (sb *SealCalls) WriteUploadPiece(ctx context.Context, pieceID storiface.PieceNumber, size int64, data io.Reader, storageType storiface.PathType, verifySize bool) (abi.PieceInfo, uint64, error) { + // Use storageType in AcquireSector + paths, pathIDs, done, err := sb.Sectors.AcquireSector(ctx, nil, pieceID.Ref(), storiface.FTNone, storiface.FTPiece, storageType) + if err != nil { + return abi.PieceInfo{}, 0, err + } + skipDeclare := storiface.FTPiece + + defer func() { + done(skipDeclare) + }() + + dest := paths.Piece + tempDest := dest + storiface.TempSuffix + + destFile, err := os.OpenFile(tempDest, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return abi.PieceInfo{}, 0, xerrors.Errorf("creating temp piece file '%s': %w", tempDest, err) + } + + removeTemp := true + defer func() { + if removeTemp { + rerr := os.Remove(tempDest) + if rerr != nil { + log.Errorf("removing temp file: %+v", rerr) + } + } + }() + + copyStart := time.Now() + + wr := new(commp.Calc) + writers := io.MultiWriter(wr, destFile) + + n, err := io.CopyBuffer(writers, io.LimitReader(data, size), make([]byte, 8<<20)) + if err != nil { + _ = destFile.Close() + return abi.PieceInfo{}, 0, xerrors.Errorf("copying piece data: %w", err) + } + + if err := destFile.Close(); err != nil { + return abi.PieceInfo{}, 0, xerrors.Errorf("closing temp piece file: %w", err) + } + + if verifySize && n != size { + return abi.PieceInfo{}, 0, xerrors.Errorf("short write: %d", n) + } + + digest, pieceSize, err := wr.Digest() + if err != nil { + return abi.PieceInfo{}, 0, xerrors.Errorf("computing piece digest: %w", err) + } + + pcid, err := commcid.DataCommitmentV1ToCID(digest) + if err != nil { + return abi.PieceInfo{}, 0, xerrors.Errorf("computing piece CID: %w", err) + } + psize := abi.PaddedPieceSize(pieceSize) + + copyEnd := time.Now() + + log.Infow("wrote piece", "piece", pieceID, "size", n, "duration", copyEnd.Sub(copyStart), "dest", dest, "MiB/s", float64(size)/(1<<20)/copyEnd.Sub(copyStart).Seconds()) + + if err := os.Rename(tempDest, dest); err != nil { + return abi.PieceInfo{}, 0, xerrors.Errorf("rename temp piece to dest %s -> %s: %w", tempDest, dest, err) + } + + skipDeclare = storiface.FTNone + + removeTemp = false + + if err := sb.ensureOneCopy(ctx, pieceID.Ref().ID, pathIDs, storiface.FTPiece); err != nil { + return abi.PieceInfo{}, 0, xerrors.Errorf("ensure one copy: %w", err) + } + + return abi.PieceInfo{PieceCID: pcid, Size: psize}, uint64(n), nil +} diff --git a/lib/multictladdr/address.go b/lib/multictladdr/address.go index fe06a32bf..18b9037e5 100644 --- a/lib/multictladdr/address.go +++ b/lib/multictladdr/address.go @@ -6,68 +6,91 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/curio/deps/config" - - "github.com/filecoin-project/lotus/api" ) -func AddressSelector(addrConf []config.CurioAddresses) func() (*MultiAddressSelector, error) { +type AddressConfig struct { + PreCommitControl []address.Address + CommitControl []address.Address + TerminateControl []address.Address + DealPublishControl []address.Address + + DisableOwnerFallback bool + DisableWorkerFallback bool +} + +func AddressSelector(addrConf *config.Dynamic[[]config.CurioAddresses]) func() (*MultiAddressSelector, error) { return func() (*MultiAddressSelector, error) { as := &MultiAddressSelector{ - MinerMap: make(map[address.Address]api.AddressConfig), - } - if addrConf == nil { - return as, nil + MinerMap: make(map[address.Address]AddressConfig), } + makeMinerMap := func() error { + as.mmLock.Lock() + defer as.mmLock.Unlock() + if addrConf == nil { + return nil + } - for _, addrConf := range addrConf { - for _, minerID := range addrConf.MinerAddresses { - tmp := api.AddressConfig{ - DisableOwnerFallback: addrConf.DisableOwnerFallback, - DisableWorkerFallback: addrConf.DisableWorkerFallback, - } + for _, addrConf := range addrConf.Get() { + for _, minerID := range addrConf.MinerAddresses { + tmp := AddressConfig{ + DisableOwnerFallback: addrConf.DisableOwnerFallback, + DisableWorkerFallback: addrConf.DisableWorkerFallback, + } - for _, s := range addrConf.PreCommitControl { - addr, err := address.NewFromString(s) - if err != nil { - return nil, xerrors.Errorf("parsing precommit control address: %w", err) + for _, s := range addrConf.PreCommitControl { + addr, err := address.NewFromString(s) + if err != nil { + return xerrors.Errorf("parsing precommit control address: %w", err) + } + + tmp.PreCommitControl = append(tmp.PreCommitControl, addr) } - tmp.PreCommitControl = append(tmp.PreCommitControl, addr) - } + for _, s := range addrConf.CommitControl { + addr, err := address.NewFromString(s) + if err != nil { + return xerrors.Errorf("parsing commit control address: %w", err) + } - for _, s := range addrConf.CommitControl { - addr, err := address.NewFromString(s) - if err != nil { - return nil, xerrors.Errorf("parsing commit control address: %w", err) + tmp.CommitControl = append(tmp.CommitControl, addr) } - tmp.CommitControl = append(tmp.CommitControl, addr) - } + for _, s := range addrConf.DealPublishControl { + addr, err := address.NewFromString(s) + if err != nil { + return xerrors.Errorf("parsing deal publish control address: %w", err) + } - for _, s := range addrConf.DealPublishControl { - addr, err := address.NewFromString(s) - if err != nil { - return nil, xerrors.Errorf("parsing deal publish control address: %w", err) + tmp.DealPublishControl = append(tmp.DealPublishControl, addr) } - tmp.DealPublishControl = append(tmp.DealPublishControl, addr) - } + for _, s := range addrConf.TerminateControl { + addr, err := address.NewFromString(s) + if err != nil { + return xerrors.Errorf("parsing terminate control address: %w", err) + } - for _, s := range addrConf.TerminateControl { - addr, err := address.NewFromString(s) + tmp.TerminateControl = append(tmp.TerminateControl, addr) + } + a, err := address.NewFromString(minerID) if err != nil { - return nil, xerrors.Errorf("parsing terminate control address: %w", err) + return xerrors.Errorf("parsing miner address %s: %w", minerID, err) } - - tmp.TerminateControl = append(tmp.TerminateControl, addr) - } - a, err := address.NewFromString(minerID) - if err != nil { - return nil, xerrors.Errorf("parsing miner address %s: %w", minerID, err) + as.MinerMap[a] = tmp } - as.MinerMap[a] = tmp } + return nil } + err := makeMinerMap() + if err != nil { + return nil, err + } + addrConf.OnChange(func() { + err := makeMinerMap() + if err != nil { + log.Errorf("error making miner map: %s", err) + } + }) return as, nil } } diff --git a/lib/multictladdr/multiaddresses.go b/lib/multictladdr/multiaddresses.go index af751ff17..c14f3720e 100644 --- a/lib/multictladdr/multiaddresses.go +++ b/lib/multictladdr/multiaddresses.go @@ -2,6 +2,7 @@ package multictladdr import ( "context" + "sync" logging "github.com/ipfs/go-log/v2" @@ -17,7 +18,8 @@ import ( var log = logging.Logger("curio/multictladdr") type MultiAddressSelector struct { - MinerMap map[address.Address]api.AddressConfig + MinerMap map[address.Address]AddressConfig + mmLock sync.RWMutex } func (as *MultiAddressSelector) AddressFor(ctx context.Context, a ctladdr.NodeApi, minerID address.Address, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { @@ -27,7 +29,12 @@ func (as *MultiAddressSelector) AddressFor(ctx context.Context, a ctladdr.NodeAp return mi.Worker, big.Zero(), nil } - tmp := as.MinerMap[minerID] + as.mmLock.RLock() + tmp, ok := as.MinerMap[minerID] + as.mmLock.RUnlock() + if !ok { + return mi.Worker, big.Zero(), nil + } var addrs []address.Address switch use { diff --git a/lib/paths/db_index.go b/lib/paths/db_index.go index 6d47195af..a3d2ec864 100644 --- a/lib/paths/db_index.go +++ b/lib/paths/db_index.go @@ -557,13 +557,12 @@ func (dbi *DBIndex) StorageDropSector(ctx context.Context, storageID storiface.I } func (dbi *DBIndex) StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) { - if ctx.Value(FindSectorCacheKey) == nil || allowFetch == true { + if ctx.Value(FindSectorCacheKey) == nil || allowFetch { stats.Record(ctx, FindSectorUncached.M(1)) return dbi.findSectorUncached(ctx, sector, ft, ssize, allowFetch) } findSectorCache := ctx.Value(FindSectorCacheKey).(*ttlcache.Cache) - cacheKey := fmt.Sprintf("%d-%d-%d", sector.Miner, sector.Number, ft) info, err := findSectorCache.Get(cacheKey) diff --git a/lib/paths/http_handler.go b/lib/paths/http_handler.go index 5a7e91e67..020afb8fd 100644 --- a/lib/paths/http_handler.go +++ b/lib/paths/http_handler.go @@ -65,6 +65,7 @@ func (handler *FetchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/remote/{type}/{id}/{spt}/allocated/{offset}/{size}", handler.remoteGetAllocated).Methods("GET") mux.HandleFunc("/remote/{type}/{id}", handler.remoteGetSector).Methods("GET") mux.HandleFunc("/remote/{type}/{id}", handler.remoteDeleteSector).Methods("DELETE") + mux.HandleFunc("/remote/stash/{id}", handler.remoteGetSector).Methods("POST") mux.ServeHTTP(w, r) } diff --git a/lib/paths/index.go b/lib/paths/index.go index 3a82ecf4d..3c21002fa 100644 --- a/lib/paths/index.go +++ b/lib/paths/index.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - storiface "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/lib/storiface" "github.com/filecoin-project/lotus/storage/sealer/fsutil" ) @@ -25,7 +25,7 @@ type spaceUseCtxKey struct{} var SpaceUseKey = spaceUseCtxKey{} -type findSectorCacheKey struct {} +type findSectorCacheKey struct{} var FindSectorCacheKey = findSectorCacheKey{} @@ -38,7 +38,7 @@ type SectorIndex interface { // part of storage-miner api StorageDeclareSector(ctx context.Context, storageID storiface.ID, s abi.SectorID, ft storiface.SectorFileType, primary bool) error StorageDropSector(ctx context.Context, storageID storiface.ID, s abi.SectorID, ft storiface.SectorFileType) error BatchStorageDeclareSectors(ctx context.Context, declarations []SectorDeclaration) error - + // FindSector can be cached if the ctx propagates a ttlcache instance over FindSectorCacheKey StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) diff --git a/lib/paths/local.go b/lib/paths/local.go index 6660bdf1d..ac973a020 100644 --- a/lib/paths/local.go +++ b/lib/paths/local.go @@ -347,7 +347,7 @@ func (st *Local) OpenPath(ctx context.Context, p string) error { return xerrors.Errorf("declaring storage in index: %w", err) } - if err := st.declareSectors(ctx, p, meta.ID, meta.CanStore, false); err != nil { + if err := st.declareSectors(ctx, p, meta.ID, meta.CanStore, true); err != nil { return err } @@ -395,11 +395,28 @@ func (st *Local) open(ctx context.Context) error { go st.reportHealth(ctx) + go st.startPeriodicRedeclare(ctx) + return nil } var declareCounter atomic.Int32 +func (st *Local) startPeriodicRedeclare(ctx context.Context) { + ticker := time.NewTicker(time.Hour * 4) + defer ticker.Stop() + for { + select { + case <-ticker.C: + if err := st.Redeclare(ctx, nil, true); err != nil { + log.Errorf("redeclaring storage: %w", err) + } + case <-ctx.Done(): + return + } + } +} + func (st *Local) Redeclare(ctx context.Context, filterId *storiface.ID, dropMissingDecls bool) error { st.localLk.Lock() defer st.localLk.Unlock() diff --git a/lib/paths/remote.go b/lib/paths/remote.go index a1cd00629..858c03eb9 100644 --- a/lib/paths/remote.go +++ b/lib/paths/remote.go @@ -82,11 +82,14 @@ func (r *Remote) RemoveCopies(ctx context.Context, s abi.SectorID, typ storiface return r.Remove(ctx, s, typ, true, keep) } -func NewRemote(local Store, index SectorIndex, auth http.Header, fetchLimit int, pfHandler PartialFileHandler) *Remote { +func NewRemote(local Store, index SectorIndex, auth http.Header, fetchLimit int, pfHandler PartialFileHandler) (*Remote, error) { findSectorCache := ttlcache.NewCache() - findSectorCache.SetTTL(10 * time.Minute) + err := findSectorCache.SetTTL(10 * time.Minute) findSectorCache.SetCacheSizeLimit(65_000) + if err != nil { + return nil, xerrors.Errorf("setting find sector cache TTL: %w", err) + } return &Remote{ local: local, @@ -99,7 +102,7 @@ func NewRemote(local Store, index SectorIndex, auth http.Header, fetchLimit int, pfHandler: pfHandler, findSectorCache: findSectorCache, - } + }, nil } func (r *Remote) AcquireSector(ctx context.Context, s storiface.SectorRef, existing storiface.SectorFileType, allocate storiface.SectorFileType, pathType storiface.PathType, op storiface.AcquireMode, opts ...storiface.AcquireOption) (storiface.SectorPaths, storiface.SectorPaths, error) { @@ -925,7 +928,7 @@ func (r *Remote) ReaderPiece(ctx context.Context, s storiface.SectorRef, ft stor // file types which are a directory (e.g. FTCache). func (r *Remote) ReaderSeq(ctx context.Context, s storiface.SectorRef, ft storiface.SectorFileType) (io.ReadCloser, error) { ctx = context.WithValue(ctx, FindSectorCacheKey, r.findSectorCache) - + paths, _, err := r.local.AcquireSector(ctx, s, ft, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove) if err != nil { return nil, xerrors.Errorf("acquire local: %w", err) diff --git a/lib/paths/remote_test.go b/lib/paths/remote_test.go index 4bd3274ea..682ded8da 100644 --- a/lib/paths/remote_test.go +++ b/lib/paths/remote_test.go @@ -98,8 +98,10 @@ func TestMoveShared(t *testing.T) { id1 := createTestStorage(t, dirStor, false, ls1, ls2) id2 := createTestStorage(t, dirSeal, true, ls1) - rs1 := paths.NewRemote(ls1, index, nil, 20, &paths.DefaultPartialFileHandler{}) - rs2 := paths.NewRemote(ls2, index, nil, 20, &paths.DefaultPartialFileHandler{}) + rs1, err := paths.NewRemote(ls1, index, nil, 20, &paths.DefaultPartialFileHandler{}) + require.NoError(t, err) + rs2, err := paths.NewRemote(ls2, index, nil, 20, &paths.DefaultPartialFileHandler{}) + require.NoError(t, err) _ = rs2 mux1.PathPrefix("/").Handler(&paths.FetchHandler{Local: ls1, PfHandler: &paths.DefaultPartialFileHandler{}}) mux2.PathPrefix("/").Handler(&paths.FetchHandler{Local: ls2, PfHandler: &paths.DefaultPartialFileHandler{}}) @@ -457,7 +459,8 @@ func TestReader(t *testing.T) { tc.indexFnc(index, tc.serverUrl) } - remoteStore := paths.NewRemote(lstore, index, nil, 6000, pfhandler) + remoteStore, err := paths.NewRemote(lstore, index, nil, 6000, pfhandler) + require.NoError(t, err) rdg, err := remoteStore.Reader(ctx, sectorRef, offset, size) var rd io.ReadCloser @@ -760,7 +763,8 @@ func TestCheckIsUnsealed(t *testing.T) { tc.indexFnc(index, tc.serverUrl) } - remoteStore := paths.NewRemote(lstore, index, nil, 6000, pfhandler) + remoteStore, err := paths.NewRemote(lstore, index, nil, 6000, pfhandler) + require.NoError(t, err) isUnsealed, err := remoteStore.CheckIsUnsealed(ctx, sectorRef, offset, size) diff --git a/lib/proof/merkle_sha254_memtree.go b/lib/proof/merkle_sha254_memtree.go index fec3daecd..009d10159 100644 --- a/lib/proof/merkle_sha254_memtree.go +++ b/lib/proof/merkle_sha254_memtree.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fr32" ) -const MaxMemtreeSize = 256 << 20 +const MaxMemtreeSize = 1 << 30 // BuildSha254Memtree builds a sha256 memtree from the input data // Returned slice should be released to the pool after use @@ -72,3 +72,46 @@ func ComputeBinShaParent(left, right [NODE_SIZE]byte) [NODE_SIZE]byte { out[NODE_SIZE-1] &= 0x3F return out } + +func BuildSha254MemtreeFromSnapshot(data []byte) ([]byte, error) { + size := abi.PaddedPieceSize(len(data)) + if size > MaxMemtreeSize { + return nil, xerrors.Errorf("piece too large for memtree: %d", size) + } + + nLeaves := int64(size) / NODE_SIZE + totalNodes, levelSizes := computeTotalNodes(nLeaves, 2) + memtreeBuf := pool.Get(int(totalNodes * NODE_SIZE)) + + copy(memtreeBuf[:len(data)], data) + + d := sha256.New() + + levelStarts := make([]int64, len(levelSizes)) + levelStarts[0] = 0 + for i := 1; i < len(levelSizes); i++ { + levelStarts[i] = levelStarts[i-1] + levelSizes[i-1]*NODE_SIZE + } + + for level := 1; level < len(levelSizes); level++ { + levelNodes := levelSizes[level] + prevLevelStart := levelStarts[level-1] + currLevelStart := levelStarts[level] + + for i := int64(0); i < levelNodes; i++ { + leftOffset := prevLevelStart + (2*i)*NODE_SIZE + + d.Reset() + d.Write(memtreeBuf[leftOffset : leftOffset+(NODE_SIZE*2)]) + + outOffset := currLevelStart + i*NODE_SIZE + // sum calls append, so we give it a zero len slice at the correct offset + d.Sum(memtreeBuf[outOffset:outOffset]) + + // set top bits to 00 + memtreeBuf[outOffset+NODE_SIZE-1] &= 0x3F + } + } + + return memtreeBuf, nil +} diff --git a/lib/proof/post_vproof_verify.go b/lib/proof/post_vproof_verify.go index c99a302de..99ea41038 100644 --- a/lib/proof/post_vproof_verify.go +++ b/lib/proof/post_vproof_verify.go @@ -3,7 +3,6 @@ package proof import ( "bytes" "fmt" - "math" "math/big" "sync" @@ -131,6 +130,7 @@ func verifyWindowPoStVanilla( return true, nil } +/* // partitionFallbackPoStSectorProofs splits sector proofs into chunks of length cfg.SectorCount. func partitionFallbackPoStSectorProofs(cfg *PoStConfig, all []FallbackPoStSectorProof) ([][]FallbackPoStSectorProof, error) { partitionCount := int(math.Ceil(float64(len(all)) / float64(cfg.SectorCount))) @@ -166,6 +166,7 @@ func partitionFallbackPoStSectorProofs(cfg *PoStConfig, all []FallbackPoStSector return out, nil } +*/ // checkCommR is the fallback post condition: comm_r = PoseidonHash2(comm_c, comm_r_last). func checkCommR(commC, commRLast, claimed PoseidonDomain) bool { diff --git a/lib/proofsvc/provictl.go b/lib/proofsvc/provictl.go index 3f471bcda..df634d5b4 100644 --- a/lib/proofsvc/provictl.go +++ b/lib/proofsvc/provictl.go @@ -92,37 +92,68 @@ func CreateWorkAsk(ctx context.Context, resolver *AddressResolver, signer addres defer recordProvictlDuration("CreateWorkAsk", start) priceStr := price.String() - // Create signature for the work ask - signature, err := Sign(ctx, resolver, signer, "work-ask", []byte(priceStr), time.Now()) - if err != nil { - return 0, xerrors.Errorf("failed to sign work ask: %w", err) - } + backoff := 3 * time.Second + maxBackoff := 5 * time.Minute + var lastErr error - req, err := http.NewRequest("POST", fmt.Sprintf("%s/provider/work/ask/%s?price=%s&signature=%s", - marketUrl, signer.String(), priceStr, signature), nil) - if err != nil { - return 0, xerrors.Errorf("failed to create request: %w", err) - } + for { + select { + case <-ctx.Done(): + if lastErr != nil { + return 0, xerrors.Errorf("context canceled: %w (last error: %v)", ctx.Err(), lastErr) + } + return 0, xerrors.Errorf("context canceled: %w", ctx.Err()) + default: + } - resp, err := http.DefaultClient.Do(req) - if err != nil { - return 0, xerrors.Errorf("failed to send request: %w", err) - } - defer func() { - _ = resp.Body.Close() - }() + // Create signature for the work ask + signature, err := Sign(ctx, resolver, signer, "work-ask", []byte(priceStr), time.Now()) + if err != nil { + return 0, xerrors.Errorf("failed to sign work ask: %w", err) + } + + req, err := http.NewRequest("POST", fmt.Sprintf("%s/provider/work/ask/%s?price=%s&signature=%s", + marketUrl, signer.String(), priceStr, signature), nil) + if err != nil { + return 0, xerrors.Errorf("failed to create request: %w", err) + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return 0, xerrors.Errorf("failed to send request: %w", err) + } + + if resp.StatusCode == http.StatusOK { + var workAsk common.WorkAsk + if err := json.NewDecoder(resp.Body).Decode(&workAsk); err != nil { + _ = resp.Body.Close() + return 0, xerrors.Errorf("failed to unmarshal response body: %w", err) + } + _ = resp.Body.Close() + return workAsk.ID, nil + } - if resp.StatusCode != http.StatusOK { bodyBytes, _ := io.ReadAll(resp.Body) - return 0, xerrors.Errorf("failed to create work ask: %s - %s", resp.Status, string(bodyBytes)) - } + _ = resp.Body.Close() - var workAsk common.WorkAsk - if err := json.NewDecoder(resp.Body).Decode(&workAsk); err != nil { - return 0, xerrors.Errorf("failed to unmarshal response body: %w", err) - } + if resp.StatusCode == http.StatusTooManyRequests { + lastErr = xerrors.Errorf("too many requests: %s - %s", resp.Status, string(bodyBytes)) + log.Warnw("create work ask rate limited, retrying", "error", lastErr, "backoff", backoff) + + select { + case <-ctx.Done(): + return 0, xerrors.Errorf("context canceled during backoff: %w (last error: %v)", ctx.Err(), lastErr) + case <-time.After(backoff): + } + + // Exponential backoff with maximum + backoff = min(backoff*2, maxBackoff) + continue + } - return workAsk.ID, nil + // For any other non-OK status, return error immediately + return 0, xerrors.Errorf("failed to create work ask: %s - %s", resp.Status, string(bodyBytes)) + } } func PollWork(address string) (common.WorkResponse, error) { diff --git a/lib/savecache/savecache.go b/lib/savecache/savecache.go new file mode 100644 index 000000000..44b48b484 --- /dev/null +++ b/lib/savecache/savecache.go @@ -0,0 +1,469 @@ +package savecache + +import ( + "fmt" + "hash" + "math" + "math/bits" + "sync" + + sha256simd "github.com/minio/sha256-simd" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-padreader" + + "github.com/filecoin-project/curio/lib/proof" +) + +const LeafSize = proof.NODE_SIZE + +// All the code below is a copy+paste of https://github.com/filecoin-project/go-fil-commp-hashhash/blob/master/commp.go +// with modification to output the nodes at a specific height + +// Calc is an implementation of a commP "hash" calculator, implementing the +// familiar hash.Hash interface. The zero-value of this object is ready to +// accept Write()s without further initialization. +type Calc struct { + state + mu sync.Mutex + snapShotLayerIdx int + snapshotNodes []NodeDigest + snapshotNodesMu sync.Mutex + expectedNodeCount int + maxLayer uint + maxlayerMU sync.Mutex +} +type state struct { + quadsEnqueued uint64 + layerQueues [MaxLayers + 2]chan []byte // one extra layer for the initial leaves, one more for the dummy never-to-use channel + resultCommP chan []byte + buffer []byte + size uint64 +} + +type NodeDigest struct { + Hash [32]byte // 32 bytes +} + +var _ hash.Hash = &Calc{} // make sure we are hash.Hash compliant + +// MaxLayers is the current maximum height of the rust-fil-proofs proving tree. +const MaxLayers = uint(35) // result of log2( 1 TiB / 32 ) + +// MaxPieceSize is the current maximum size of the rust-fil-proofs proving tree. +const MaxPieceSize = uint64(1 << (MaxLayers + 5)) + +// MaxPiecePayload is the maximum amount of data that one can Write() to the +// Calc object, before needing to derive a Digest(). Constrained by the value +// of MaxLayers. +const MaxPiecePayload = MaxPieceSize / 128 * 127 + +// MinPiecePayload is the smallest amount of data for which FR32 padding has +// a defined result. It is not possible to derive a Digest() before Write()ing +// at least this amount of bytes. +const MinPiecePayload = uint64(65) + +const ( + commpDigestSize = sha256simd.Size + quadPayload = 127 + bufferSize = 256 * quadPayload // FIXME: tune better, chosen by rough experiment +) + +var ( + layerQueueDepth = 32 // FIXME: tune better, chosen by rough experiment + shaPool = sync.Pool{New: func() interface{} { return sha256simd.New() }} + stackedNulPadding [MaxLayers][]byte +) + +// initialize the nul padding stack (cheap to do upfront, just MaxLayers loops) +func init() { + h := shaPool.Get().(hash.Hash) + + stackedNulPadding[0] = make([]byte, commpDigestSize) + for i := uint(1); i < MaxLayers; i++ { + h.Reset() + h.Write(stackedNulPadding[i-1]) // yes, got to... + h.Write(stackedNulPadding[i-1]) // ...do it twice + stackedNulPadding[i] = h.Sum(make([]byte, 0, commpDigestSize)) + stackedNulPadding[i][31] &= 0x3F + } + + shaPool.Put(h) +} + +// BlockSize is the amount of bytes consumed by the commP algorithm in one go. +// Write()ing data in multiples of BlockSize would obviate the need to maintain +// an internal carry buffer. The BlockSize of this module is 127 bytes. +func (cp *Calc) BlockSize() int { return quadPayload } + +// Size is the amount of bytes returned on Sum()/Digest(), which is 32 bytes +// for this module. +func (cp *Calc) Size() int { return commpDigestSize } + +// Reset re-initializes the accumulator object, clearing its state and +// terminating all background goroutines. It is safe to Reset() an accumulator +// in any state. +func (cp *Calc) Reset() { + cp.mu.Lock() + if cp.buffer != nil { + // we are resetting without digesting: close everything out to terminate + // the layer workers + close(cp.layerQueues[0]) + <-cp.resultCommP + } + cp.state = state{} // reset + cp.mu.Unlock() +} + +// Sum is a thin wrapper around Digest() and is provided solely to satisfy +// the hash.Hash interface. It panics on errors returned from Digest(). +// Note that unlike classic (hash.Hash).Sum(), calling this method is +// destructive: the internal state is reset and all goroutines kicked off +// by Write() are terminated. +func (cp *Calc) Sum(buf []byte) []byte { + commP, _, err := cp.digest() + if err != nil { + panic(err) + } + return append(buf, commP...) +} + +// Digest collapses the internal hash state and returns the resulting raw 32 +// bytes of commP and the padded piece size, or alternatively an error in +// case of insufficient accumulated state. On success invokes Reset(), which +// terminates all goroutines kicked off by Write(). +func (cp *Calc) digest() (commP []byte, paddedPieceSize uint64, err error) { + cp.mu.Lock() + + defer func() { + // reset only if we did succeed + if err == nil { + cp.state = state{} + } + cp.mu.Unlock() + }() + + if processed := cp.quadsEnqueued*quadPayload + uint64(len(cp.buffer)); processed < MinPiecePayload { + err = xerrors.Errorf( + "insufficient state accumulated: commP is not defined for inputs shorter than %d bytes, but only %d processed so far", + MinPiecePayload, processed, + ) + return + } + + // If any, flush remaining bytes padded up with zeroes + if len(cp.buffer) > 0 { + if mod := len(cp.buffer) % quadPayload; mod != 0 { + cp.buffer = append(cp.buffer, make([]byte, quadPayload-mod)...) + } + for len(cp.buffer) > 0 { + // FIXME: there is a smarter way to do this instead of 127-at-a-time, + // but that's for another PR + cp.digestQuads(cp.buffer[:127]) + cp.buffer = cp.buffer[127:] + } + } + + // This is how we signal to the bottom of the stack that we are done + // which in turn collapses the rest all the way to resultCommP + close(cp.layerQueues[0]) + + paddedPieceSize = cp.quadsEnqueued * 128 + // hacky round-up-to-next-pow2 + if bits.OnesCount64(paddedPieceSize) != 1 { + paddedPieceSize = 1 << uint(64-bits.LeadingZeros64(paddedPieceSize)) + } + + return <-cp.resultCommP, paddedPieceSize, nil +} + +// Write adds bytes to the accumulator, for a subsequent Digest(). Upon the +// first call of this method a few goroutines are started in the background to +// service each layer of the digest tower. If you wrote some data and then +// decide to abandon the object without invoking Digest(), you need to call +// Reset() to terminate all remaining background workers. Unlike a typical +// (hash.Hash).Write, calling this method can return an error when the total +// amount of bytes is about to go over the maximum currently supported by +// Filecoin. +func (cp *Calc) Write(input []byte) (int, error) { + if len(input) == 0 { + return 0, nil + } + + cp.mu.Lock() + defer cp.mu.Unlock() + + if MaxPiecePayload < + (cp.quadsEnqueued*quadPayload)+ + uint64(len(input)) { + return 0, xerrors.Errorf( + "writing additional %d bytes to the accumulator would overflow the maximum supported unpadded piece size %d", + len(input), MaxPiecePayload, + ) + } + + // just starting: initialize internal state, start first background layer-goroutine + if cp.buffer == nil { + cp.buffer = make([]byte, 0, bufferSize) + cp.resultCommP = make(chan []byte, 1) + cp.layerQueues[0] = make(chan []byte, layerQueueDepth) + cp.addLayer(0) + } + + // short Write() - just buffer it + if len(cp.buffer)+len(input) < bufferSize { + cp.buffer = append(cp.buffer, input...) + return len(input), nil + } + + totalInputBytes := len(input) + + if toSplice := bufferSize - len(cp.buffer); toSplice < bufferSize { + cp.buffer = append(cp.buffer, input[:toSplice]...) + input = input[toSplice:] + + cp.digestQuads(cp.buffer) + cp.buffer = cp.buffer[:0] + } + + for len(input) >= bufferSize { + cp.digestQuads(input[:bufferSize]) + input = input[bufferSize:] + } + + if len(input) > 0 { + cp.buffer = append(cp.buffer, input...) + } + + return totalInputBytes, nil +} + +// always called with power-of-2 amount of quads +func (cp *Calc) digestQuads(inSlab []byte) { + + quadsCount := len(inSlab) / 127 + cp.quadsEnqueued += uint64(quadsCount) + outSlab := make([]byte, quadsCount*128) + + for j := 0; j < quadsCount; j++ { + // Cycle over four(4) 31-byte groups, leaving 1 byte in between: + // 31 + 1 + 31 + 1 + 31 + 1 + 31 = 127 + input := inSlab[j*127 : (j+1)*127] + expander := outSlab[j*128 : (j+1)*128] + inputPlus1, expanderPlus1 := input[1:], expander[1:] + + // First 31 bytes + 6 bits are taken as-is (trimmed later) + // Note that copying them into the expansion buffer is mandatory: + // we will be feeding it to the workers which reuse the bottom half + // of the chunk for the result + copy(expander[:], input[:32]) + + // first 2-bit "shim" forced into the otherwise identical bitstream + expander[31] &= 0x3F + + // In: {{ C[7] C[6] }} X[7] X[6] X[5] X[4] X[3] X[2] X[1] X[0] Y[7] Y[6] Y[5] Y[4] Y[3] Y[2] Y[1] Y[0] Z[7] Z[6] Z[5]... + // Out: X[5] X[4] X[3] X[2] X[1] X[0] C[7] C[6] Y[5] Y[4] Y[3] Y[2] Y[1] Y[0] X[7] X[6] Z[5] Z[4] Z[3]... + for i := 31; i < 63; i++ { + expanderPlus1[i] = inputPlus1[i]<<2 | input[i]>>6 + } + + // next 2-bit shim + expander[63] &= 0x3F + + // In: {{ C[7] C[6] C[5] C[4] }} X[7] X[6] X[5] X[4] X[3] X[2] X[1] X[0] Y[7] Y[6] Y[5] Y[4] Y[3] Y[2] Y[1] Y[0] Z[7] Z[6] Z[5]... + // Out: X[3] X[2] X[1] X[0] C[7] C[6] C[5] C[4] Y[3] Y[2] Y[1] Y[0] X[7] X[6] X[5] X[4] Z[3] Z[2] Z[1]... + for i := 63; i < 95; i++ { + expanderPlus1[i] = inputPlus1[i]<<4 | input[i]>>4 + } + + // next 2-bit shim + expander[95] &= 0x3F + + // In: {{ C[7] C[6] C[5] C[4] C[3] C[2] }} X[7] X[6] X[5] X[4] X[3] X[2] X[1] X[0] Y[7] Y[6] Y[5] Y[4] Y[3] Y[2] Y[1] Y[0] Z[7] Z[6] Z[5]... + // Out: X[1] X[0] C[7] C[6] C[5] C[4] C[3] C[2] Y[1] Y[0] X[7] X[6] X[5] X[4] X[3] X[2] Z[1] Z[0] Y[7]... + for i := 95; i < 126; i++ { + expanderPlus1[i] = inputPlus1[i]<<6 | input[i]>>2 + } + + // the final 6 bit remainder is exactly the value of the last expanded byte + expander[127] = input[126] >> 2 + } + + cp.layerQueues[0] <- outSlab +} + +func (cp *Calc) addLayer(myIdx uint) { + // the next layer channel, which we might *not* use + if cp.layerQueues[myIdx+1] != nil { + panic("addLayer called more than once with identical idx argument") + } + cp.layerQueues[myIdx+1] = make(chan []byte, layerQueueDepth) + collectSnapshot := int(myIdx) == cp.snapShotLayerIdx-1 + go func() { + var twinHold []byte + + for { + slab, queueIsOpen := <-cp.layerQueues[myIdx] + + if !queueIsOpen { + defer func() { twinHold = nil }() + + // I am last + if myIdx == MaxLayers || cp.layerQueues[myIdx+2] == nil { + cp.resultCommP <- append(make([]byte, 0, 32), twinHold[0:32]...) + return + } + + if twinHold != nil { + copy(twinHold[32:64], stackedNulPadding[myIdx]) + cp.hashSlab254(0, collectSnapshot, twinHold[0:64]) + cp.layerQueues[myIdx+1] <- twinHold[0:64:64] + } + + // signal the next in line that they are done too + close(cp.layerQueues[myIdx+1]) + return + } + + var pushedWork bool + + switch { + case len(slab) > 1<<(5+myIdx): + cp.hashSlab254(myIdx, collectSnapshot, slab) + cp.layerQueues[myIdx+1] <- slab + pushedWork = true + case twinHold != nil: + copy(twinHold[32:64], slab[0:32]) + cp.hashSlab254(0, collectSnapshot, twinHold[0:64]) + cp.layerQueues[myIdx+1] <- twinHold[0:32:64] + pushedWork = true + twinHold = nil + default: + twinHold = slab[0:32:64] + } + + // Check whether we need another worker + // + // n.b. we will not blow out of the preallocated layerQueues array, + // as we disallow Write()s above a certain threshold + if pushedWork && cp.layerQueues[myIdx+2] == nil { + cp.addLayer(myIdx + 1) + } + } + }() +} + +func (cp *Calc) hashSlab254(layerIdx uint, collectSnapshot bool, slab []byte) { + h := shaPool.Get().(hash.Hash) + cp.maxlayerMU.Lock() + defer cp.maxlayerMU.Unlock() + if cp.maxLayer < layerIdx { + cp.maxLayer = layerIdx + } + stride := 1 << (5 + layerIdx) + for i := 0; len(slab) > i+stride; i += 2 * stride { + h.Reset() + h.Write(slab[i : i+32]) + h.Write(slab[i+stride : 32+i+stride]) + h.Sum(slab[i:i])[31] &= 0x3F // callers expect we will reuse-reduce-recycle + + if collectSnapshot { + d := make([]byte, 32) + copy(d, slab[i:i+32]) + cp.snapshotNodesMu.Lock() + cp.snapshotNodes = append(cp.snapshotNodes, NodeDigest{ + Hash: [32]byte(d), + }) + cp.snapshotNodesMu.Unlock() + } + } + + shaPool.Put(h) +} + +func NewCommPWithSize(size uint64) *Calc { + c := new(Calc) + c.size = size + + c.snapshotLayerIndex(size, false) + + return c +} + +func (cp *Calc) snapshotLayerIndex(size uint64, test bool) { + if size == 0 { + panic("size must be > 0") + } + + // Calculate padded piece size + padded := padreader.PaddedSize(size).Padded() + + // Calculate number of leaf nodes (each covers 128 bytes) + numLeaves := uint64(padded) / 32 + + // Total tree height: log2(numLeaves) + treeHeight := bits.Len64(numLeaves - 1) + + //Calculate layer L such that 127 * 2^L >= targetReadSize + //→ 2^L >= targetReadSize / 32 + //ratio := float64(1040384) / 32 + testRatio := float64(2032) / LeafSize // 2 KiB.UnPadded() + ProdRatio := float64(4161536) / LeafSize // 4 MiB.UnPadded() + var layer int + if test { + layer = int(math.Ceil(math.Log2(testRatio))) + } else { + layer = int(math.Ceil(math.Log2(ProdRatio))) + } + + // Clamp within tree bounds + cp.snapShotLayerIdx = layer + if layer < 0 { + cp.snapShotLayerIdx = 0 + } + if layer > treeHeight { + cp.snapShotLayerIdx = treeHeight + } + + expectedNodes := numLeaves >> uint(cp.snapShotLayerIdx) + cp.expectedNodeCount = int(expectedNodes) +} + +func (cp *Calc) DigestWithSnapShot() ([]byte, uint64, int, int, []NodeDigest, error) { + commp, paddedPieceSize, err := cp.digest() + if err != nil { + return nil, 0, 0, 0, nil, err + } + + cp.snapshotNodesMu.Lock() + defer cp.snapshotNodesMu.Unlock() + + // Make output array of expected length + out := make([]NodeDigest, cp.expectedNodeCount) + + // Copy snapShot nodes to output + copied := copy(out[:len(cp.snapshotNodes)], cp.snapshotNodes) + fmt.Println("copied number of nodes", copied) + + // Fill the remaining nodes with zeroPadding + if copied < cp.expectedNodeCount { + count := cp.expectedNodeCount - copied + fmt.Println("count", count) + var h [32]byte + copy(h[:], stackedNulPadding[cp.snapShotLayerIdx]) + for i := copied; i < cp.expectedNodeCount; i++ { + out[i].Hash = h + } + } + + return commp, paddedPieceSize, cp.snapShotLayerIdx, cp.expectedNodeCount, out, nil +} + +func NewCommPWithSizeForTest(size uint64) *Calc { + c := new(Calc) + c.size = size + + c.snapshotLayerIndex(size, true) + + return c +} diff --git a/lib/testutils/testutils.go b/lib/testutils/testutils.go index 2203bc245..0a42b67da 100644 --- a/lib/testutils/testutils.go +++ b/lib/testutils/testutils.go @@ -2,10 +2,13 @@ package testutils import ( "context" + "crypto/rand" "fmt" "io" - "math/rand" + "math/bits" "os" + "strings" + "time" "github.com/ipfs/boxo/blockservice" bstore "github.com/ipfs/boxo/blockstore" @@ -23,12 +26,19 @@ import ( carv2 "github.com/ipld/go-car/v2" "github.com/ipld/go-car/v2/blockstore" "github.com/multiformats/go-multihash" + "github.com/oklog/ulid" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-data-segment/datasegment" + commcid "github.com/filecoin-project/go-fil-commcid" + commp "github.com/filecoin-project/go-fil-commp-hashhash" + "github.com/filecoin-project/go-state-types/abi" ) const defaultHashFunction = uint64(multihash.BLAKE2B_MIN + 31) -func CreateRandomFile(dir string, rseed int64, size int64) (string, error) { - source := io.LimitReader(rand.New(rand.NewSource(rseed)), size) +func CreateRandomTmpFile(dir string, size int64) (string, error) { + source := io.LimitReader(rand.Reader, size) file, err := os.CreateTemp(dir, "sourcefile.dat") if err != nil { @@ -164,3 +174,133 @@ func WriteUnixfsDAGTo(path string, into ipldformat.DAGService, chunksize int64, return nd.Cid(), nil } + +func CreateAggregateFromCars(files []string, dealSize abi.PaddedPieceSize, aggregateOut bool) (cid.Cid, error) { + var lines []string + var readers []io.Reader + var deals []abi.PieceInfo + + for _, f := range files { + file, err := os.Open(f) + if err != nil { + return cid.Undef, xerrors.Errorf("opening subpiece file: %w", err) + } + stat, err := file.Stat() + if err != nil { + return cid.Undef, xerrors.Errorf("getting file stat: %w", err) + } + cp := new(commp.Calc) + _, err = io.Copy(cp, file) + if err != nil { + return cid.Undef, xerrors.Errorf("copying subpiece to commp writer: %w", err) + } + _, err = file.Seek(0, io.SeekStart) + if err != nil { + return cid.Undef, xerrors.Errorf("seeking to start of file: %w", err) + } + pbytes, size, err := cp.Digest() + if err != nil { + return cid.Undef, xerrors.Errorf("computing digest for subpiece: %w", err) + } + pcid2, err := commcid.DataCommitmentToPieceCidv2(pbytes, size) + if err != nil { + return cid.Undef, xerrors.Errorf("converting data commitment to CID v2: %w", err) + } + pcid1, err := commcid.DataCommitmentV1ToCID(pbytes) + if err != nil { + return cid.Undef, xerrors.Errorf("converting data commitment to CID v1: %w", err) + } + deals = append(deals, abi.PieceInfo{ + PieceCID: pcid1, + Size: abi.PaddedPieceSize(size), + }) + readers = append(readers, file) + urlStr := fmt.Sprintf("http://piece-server:12320/pieces?id=%s", stat.Name()) + lines = append(lines, fmt.Sprintf("%s\t%s", pcid2.String(), urlStr)) + } + + _, upsize, err := datasegment.ComputeDealPlacement(deals) + if err != nil { + return cid.Undef, xerrors.Errorf("computing deal placement: %w", err) + } + + next := 1 << (64 - bits.LeadingZeros64(upsize+256)) + + if abi.PaddedPieceSize(next) != dealSize { + return cid.Undef, fmt.Errorf("deal size mismatch: expected %d, got %d", dealSize, abi.PaddedPieceSize(next)) + } + + a, err := datasegment.NewAggregate(abi.PaddedPieceSize(next), deals) + if err != nil { + return cid.Undef, xerrors.Errorf("creating aggregate: %w", err) + } + out, err := a.AggregateObjectReader(readers) + if err != nil { + return cid.Undef, xerrors.Errorf("creating aggregate reader: %w", err) + } + + x, err := ulid.New(uint64(time.Now().UnixMilli()), rand.Reader) + if err != nil { + return cid.Undef, xerrors.Errorf("creating aggregate file: %w", err) + } + + f, err := os.OpenFile(x.String(), os.O_CREATE|os.O_WRONLY|os.O_EXCL, 0644) + if err != nil { + return cid.Undef, err + } + defer func() { + _ = f.Close() + }() + + cp := new(commp.Calc) + w := io.MultiWriter(cp, f) + + n, err := io.Copy(w, out) + if err != nil { + _ = f.Close() + return cid.Undef, xerrors.Errorf("writing aggregate: %w", err) + } + + _ = f.Close() + + digest, paddedPieceSize, err := cp.Digest() + if err != nil { + return cid.Undef, xerrors.Errorf("computing digest: %w", err) + } + if abi.PaddedPieceSize(paddedPieceSize) != dealSize { + return cid.Undef, fmt.Errorf("deal size mismatch after final commP: expected %d, got %d", dealSize, abi.PaddedPieceSize(paddedPieceSize)) + } + + if n != int64(dealSize.Unpadded()) { + return cid.Undef, fmt.Errorf("incorrect aggregate raw size: expected %d, got %d", dealSize.Unpadded(), n) + } + + pcid2, err := commcid.DataCommitmentToPieceCidv2(digest, uint64(n)) + if err != nil { + return cid.Undef, xerrors.Errorf("creating commP: %w", err) + } + + err = os.WriteFile(fmt.Sprintf("aggregate_%s", pcid2.String()), []byte(strings.Join(lines, "\n")), 0644) + if err != nil { + return cid.Undef, xerrors.Errorf("writing aggregate to file: %w", err) + } + + if !aggregateOut { + defer func() { + _ = os.Remove(f.Name()) + }() + } else { + defer func() { + _ = os.Rename(f.Name(), fmt.Sprintf("aggregate_%s.piece", pcid2.String())) + }() + } + + return pcid2, nil +} + +func EnvElse(env, els string) string { + if v := os.Getenv(env); v != "" { + return v + } + return els +} diff --git a/market/http/http.go b/market/http/http.go index a9c4934bf..886cca1dd 100644 --- a/market/http/http.go +++ b/market/http/http.go @@ -1,32 +1,61 @@ package http import ( + "github.com/ethereum/go-ethereum/ethclient" "github.com/go-chi/chi/v5" "github.com/filecoin-project/curio/deps/config" "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/paths" mk12http "github.com/filecoin-project/curio/market/mk12/http" + mk20http "github.com/filecoin-project/curio/market/mk20/http" + "github.com/filecoin-project/curio/pdp" + "github.com/filecoin-project/curio/tasks/message" storage_market "github.com/filecoin-project/curio/tasks/storage-market" ) type MarketHandler struct { - mdh *mk12http.MK12DealHandler + mdh12 *mk12http.MK12DealHandler + mdh20 *mk20http.MK20DealHandler + pdpService *pdp.PDPService + domainName string } // NewMarketHandler is used to prepare all the required market handlers. Currently, it supports mk12 deal market. // This function should be used to expand the functionality under "/market" path -func NewMarketHandler(db *harmonydb.DB, cfg *config.CurioConfig, dm *storage_market.CurioStorageDealMarket) (*MarketHandler, error) { - mdh, err := mk12http.NewMK12DealHandler(db, cfg, dm) +func NewMarketHandler(db *harmonydb.DB, cfg *config.CurioConfig, dm *storage_market.CurioStorageDealMarket, eth *ethclient.Client, fc pdp.PDPServiceNodeApi, sn *message.SenderETH, stor paths.StashStore) (*MarketHandler, error) { + mdh12, err := mk12http.NewMK12DealHandler(db, cfg, dm) if err != nil { return nil, err } + + mdh20, err := mk20http.NewMK20DealHandler(db, cfg, dm) + if err != nil { + return nil, err + } + + var pdpService *pdp.PDPService + + if sn != nil { + pdpService = pdp.NewPDPService(db, stor, eth, fc, sn) + //pdp.Routes(r, pdsvc) + } + return &MarketHandler{ - mdh: mdh, + mdh12: mdh12, + mdh20: mdh20, + pdpService: pdpService, + domainName: cfg.HTTP.DomainName, }, nil } // Router is used to attach all the market handlers // This can include mk12 deals, mk20 deals(WIP), sector market(WIP) etc func Router(mux *chi.Mux, mh *MarketHandler) { - mux.Mount("/market/mk12", mk12http.Router(mh.mdh)) + mux.Mount("/market/mk12", mk12http.Router(mh.mdh12)) + mux.Mount("/market/mk20", mk20http.Router(mh.mdh20, mh.domainName)) + if mh.pdpService != nil { + mux.Mount("/market/pdp", pdp.Routes(mh.pdpService)) + } + // TODO: Attach a info endpoint here with details about supported market modules and services under them } diff --git a/market/indexstore/create.cql b/market/indexstore/cql/0001_create.cql similarity index 100% rename from market/indexstore/create.cql rename to market/indexstore/cql/0001_create.cql diff --git a/market/indexstore/cql/0002_piece_index.cql b/market/indexstore/cql/0002_piece_index.cql new file mode 100644 index 000000000..dbfe85a91 --- /dev/null +++ b/market/indexstore/cql/0002_piece_index.cql @@ -0,0 +1,23 @@ +CREATE TABLE IF NOT EXISTS aggregate_by_piece ( + PieceCid blob, + AggregatePieceCid blob, + UnpaddedOffset bigint, + UnpaddedLength bigint, + PRIMARY KEY ((PieceCid), AggregatePieceCid, UnpaddedOffset) +) WITH CLUSTERING ORDER BY (AggregatePieceCid ASC, UnpaddedOffset ASC); + +CREATE TABLE IF NOT EXISTS piece_by_aggregate ( + AggregatePieceCid blob, + PieceCid blob, + UnpaddedOffset bigint, + UnpaddedLength bigint, + PRIMARY KEY ((AggregatePieceCid), PieceCid, UnpaddedOffset) +) WITH CLUSTERING ORDER BY (PieceCid ASC, UnpaddedOffset ASC); + +CREATE TABLE IF NOT EXISTS pdp_cache_layer ( + PieceCid blob, + LayerIndex int, + LeafIndex bigint, + Leaf blob, + PRIMARY KEY ((PieceCid, LayerIndex), LeafIndex) +) WITH CLUSTERING ORDER BY (LeafIndex ASC); \ No newline at end of file diff --git a/market/indexstore/indexstore.go b/market/indexstore/indexstore.go index 3a8e5a40b..7aee0a438 100644 --- a/market/indexstore/indexstore.go +++ b/market/indexstore/indexstore.go @@ -2,8 +2,14 @@ package indexstore import ( "context" + "embed" _ "embed" + "errors" "fmt" + "math" + "math/rand" + "sort" + "strconv" "strings" "time" @@ -14,13 +20,15 @@ import ( "golang.org/x/sync/errgroup" "golang.org/x/xerrors" + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/curio/deps/config" ) const keyspace = "curio" -//go:embed create.cql -var createCQL string +//go:embed cql/*.cql +var cqlFiles embed.FS var log = logging.Logger("indexstore") @@ -44,35 +52,63 @@ type Record struct { Size uint64 `json:"size"` } -func NewIndexStore(hosts []string, port int, cfg *config.CurioConfig) (*IndexStore, error) { - if len(hosts) == 0 { - return nil, xerrors.Errorf("no hosts provided for cassandra") +var ErrNotFound = errors.New("not found") + +func isNotFoundErr(err error) bool { + if err == nil { + return false } + if errors.Is(err, gocql.ErrNotFound) { + return true + } + + // Unfortunately it seems like the Cassandra driver doesn't always return + // a specific not found error type, so we need to rely on string parsing + return strings.Contains(strings.ToLower(err.Error()), "not found") +} + +func NewIndexStore(hosts []string, port int, cfg *config.CurioConfig) (*IndexStore, error) { cluster := gocql.NewCluster(hosts...) cluster.Timeout = 5 * time.Minute cluster.Consistency = gocql.One cluster.NumConns = cfg.Market.StorageMarketConfig.Indexing.InsertConcurrency * 8 cluster.Port = port - store := &IndexStore{ + return &IndexStore{ cluster: cluster, settings: settings{ InsertBatchSize: cfg.Market.StorageMarketConfig.Indexing.InsertBatchSize, InsertConcurrency: cfg.Market.StorageMarketConfig.Indexing.InsertConcurrency, }, - } + }, nil +} - return store, store.Start(context.Background()) +type ITestID string + +// ITestNewID see ITestWithID doc +func ITestNewID() ITestID { + return ITestID(strconv.Itoa(rand.Intn(99999))) } -func (i *IndexStore) Start(ctx context.Context) error { +func (i *IndexStore) Start(ctx context.Context, test bool) error { + if len(i.cluster.Hosts) == 0 { + return xerrors.Errorf("no hosts provided for cassandra") + } + + keyspaceName := keyspace + if test { + id := ITestNewID() + keyspaceName = fmt.Sprintf("test%s", id) + fmt.Printf("Using test keyspace: %s\n", keyspaceName) + } + // Create Cassandra keyspace session, err := i.cluster.CreateSession() if err != nil { return xerrors.Errorf("creating cassandra session: %w", err) } - query := `CREATE KEYSPACE IF NOT EXISTS ` + keyspace + + query := `CREATE KEYSPACE IF NOT EXISTS ` + keyspaceName + ` WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 }` err = session.Query(query).WithContext(ctx).Exec() if err != nil { @@ -82,22 +118,38 @@ func (i *IndexStore) Start(ctx context.Context) error { session.Close() // Recreate session with the keyspace - i.cluster.Keyspace = keyspace + i.cluster.Keyspace = keyspaceName session, err = i.cluster.CreateSession() if err != nil { return xerrors.Errorf("creating cassandra session: %w", err) } - lines := strings.Split(createCQL, ";") - for _, line := range lines { - line = strings.Trim(line, "\n \t") - if line == "" { + entries, err := cqlFiles.ReadDir("cql") + if err != nil { + log.Fatalf("failed to read embedded directory: %v", err) + } + + for _, entry := range entries { + if entry.IsDir() { continue } - log.Debug(line) - err := session.Query(line).WithContext(ctx).Exec() + + data, err := cqlFiles.ReadFile("cql/" + entry.Name()) if err != nil { - return xerrors.Errorf("creating tables: executing\n%s\n%w", line, err) + log.Fatalf("failed to read file %s: %v", entry.Name(), err) + } + + lines := strings.Split(string(data), ";") + for _, line := range lines { + line = strings.Trim(line, "\n \t") + if line == "" { + continue + } + log.Debug(line) + err := session.Query(line).WithContext(ctx).Exec() + if err != nil { + return xerrors.Errorf("creating tables: executing\n%s\n%w", line, err) + } } } @@ -107,11 +159,11 @@ func (i *IndexStore) Start(ctx context.Context) error { return nil } -// AddIndex adds multihash -> piece cid mappings, along with offset and size information for the piece. -func (i *IndexStore) AddIndex(ctx context.Context, pieceCid cid.Cid, recordsChan chan Record) error { +// AddIndex adds multihash -> piece cid (v2) mappings, along with offset and size information for the piece. +func (i *IndexStore) AddIndex(ctx context.Context, pieceCidv2 cid.Cid, recordsChan chan Record) error { insertPieceBlockOffsetSize := `INSERT INTO PieceBlockOffsetSize (PieceCid, PayloadMultihash, BlockOffset) VALUES (?, ?, ?)` insertPayloadToPieces := `INSERT INTO PayloadToPieces (PayloadMultihash, PieceCid, BlockSize) VALUES (?, ?, ?)` - pieceCidBytes := pieceCid.Bytes() + pieceCidBytes := pieceCidv2.Bytes() var eg errgroup.Group @@ -134,12 +186,12 @@ func (i *IndexStore) AddIndex(ctx context.Context, pieceCid cid.Cid, recordsChan if !ok { if len(batchPieceBlockOffsetSize.Entries) > 0 { - if err := i.executeBatchWithRetry(ctx, batchPieceBlockOffsetSize, pieceCid); err != nil { + if err := i.executeBatchWithRetry(ctx, batchPieceBlockOffsetSize, pieceCidv2); err != nil { return err } } if len(batchPayloadToPieces.Entries) > 0 { - if err := i.executeBatchWithRetry(ctx, batchPayloadToPieces, pieceCid); err != nil { + if err := i.executeBatchWithRetry(ctx, batchPayloadToPieces, pieceCidv2); err != nil { return err } } @@ -161,13 +213,13 @@ func (i *IndexStore) AddIndex(ctx context.Context, pieceCid cid.Cid, recordsChan }) if len(batchPieceBlockOffsetSize.Entries) == i.settings.InsertBatchSize { - if err := i.executeBatchWithRetry(ctx, batchPieceBlockOffsetSize, pieceCid); err != nil { + if err := i.executeBatchWithRetry(ctx, batchPieceBlockOffsetSize, pieceCidv2); err != nil { return err } batchPieceBlockOffsetSize = nil } if len(batchPayloadToPieces.Entries) == i.settings.InsertBatchSize { - if err := i.executeBatchWithRetry(ctx, batchPayloadToPieces, pieceCid); err != nil { + if err := i.executeBatchWithRetry(ctx, batchPayloadToPieces, pieceCidv2); err != nil { return err } batchPayloadToPieces = nil @@ -185,7 +237,7 @@ func (i *IndexStore) AddIndex(ctx context.Context, pieceCid cid.Cid, recordsChan } // executeBatchWithRetry executes a batch with retry logic and exponential backoff -func (i *IndexStore) executeBatchWithRetry(ctx context.Context, batch *gocql.Batch, pieceCid cid.Cid) error { +func (i *IndexStore) executeBatchWithRetry(ctx context.Context, batch *gocql.Batch, pieceCidv2 cid.Cid) error { var err error maxRetries := 20 backoff := 20 * time.Second @@ -209,11 +261,11 @@ func (i *IndexStore) executeBatchWithRetry(ctx context.Context, batch *gocql.Bat return ctx.Err() } - log.Warnf("Batch insert attempt %d failed for piece %s: %v", attempt+1, pieceCid, err) + log.Warnf("Batch insert attempt %d failed for piece %s: %v", attempt+1, pieceCidv2, err) // If max retries reached, return error if attempt == maxRetries { - return xerrors.Errorf("execute batch: executing batch insert for piece %s: %w", pieceCid, err) + return xerrors.Errorf("execute batch: executing batch insert for piece %s: %w", pieceCidv2, err) } // Sleep for backoff duration before retrying @@ -235,8 +287,8 @@ func (i *IndexStore) executeBatchWithRetry(ctx context.Context, batch *gocql.Bat // RemoveIndexes removes all multihash -> piece cid mappings, and all // offset information for the piece. -func (i *IndexStore) RemoveIndexes(ctx context.Context, pieceCid cid.Cid) error { - pieceCidBytes := pieceCid.Bytes() +func (i *IndexStore) RemoveIndexes(ctx context.Context, pieceCidv2 cid.Cid) error { + pieceCidBytes := pieceCidv2.Bytes() // First, select all PayloadMultihash for the given PieceCid from PieceBlockOffsetSize selectQry := `SELECT PayloadMultihash FROM PieceBlockOffsetSize WHERE PieceCid = ?` @@ -251,7 +303,7 @@ func (i *IndexStore) RemoveIndexes(ctx context.Context, pieceCid cid.Cid) error payloadMultihashes = append(payloadMultihashes, mhCopy) } if err := iter.Close(); err != nil { - return xerrors.Errorf("scanning PayloadMultihash for piece %s: %w", pieceCid, err) + return xerrors.Errorf("scanning PayloadMultihash for piece %s: %w", pieceCidv2, err) } // Prepare batch deletes for PayloadToPieces @@ -267,16 +319,16 @@ func (i *IndexStore) RemoveIndexes(ctx context.Context, pieceCid cid.Cid) error }) if len(batch.Entries) >= batchSize || idx == len(payloadMultihashes)-1 { - if err := i.executeBatchWithRetry(ctx, batch, pieceCid); err != nil { - return xerrors.Errorf("executing batch delete for PayloadToPieces for piece %s: %w", pieceCid, err) + if err := i.executeBatchWithRetry(ctx, batch, pieceCidv2); err != nil { + return xerrors.Errorf("executing batch delete for PayloadToPieces for piece %s: %w", pieceCidv2, err) } batch = i.session.NewBatch(gocql.UnloggedBatch).WithContext(ctx) } } if len(batch.Entries) >= 0 { - if err := i.executeBatchWithRetry(ctx, batch, pieceCid); err != nil { - return xerrors.Errorf("executing batch delete for PayloadToPieces for piece %s: %w", pieceCid, err) + if err := i.executeBatchWithRetry(ctx, batch, pieceCidv2); err != nil { + return xerrors.Errorf("executing batch delete for PayloadToPieces for piece %s: %w", pieceCidv2, err) } } @@ -284,13 +336,13 @@ func (i *IndexStore) RemoveIndexes(ctx context.Context, pieceCid cid.Cid) error delPieceBlockOffsetSizeQry := `DELETE FROM PieceBlockOffsetSize WHERE PieceCid = ?` err := i.session.Query(delPieceBlockOffsetSizeQry, pieceCidBytes).WithContext(ctx).Exec() if err != nil { - return xerrors.Errorf("deleting PieceBlockOffsetSize for piece %s: %w", pieceCid, err) + return xerrors.Errorf("deleting PieceBlockOffsetSize for piece %s: %w", pieceCidv2, err) } return nil } -// PieceInfo contains PieceCid and BlockSize +// PieceInfo contains PieceCid and BlockSize. PieceCid can be either v1 or v2. type PieceInfo struct { PieceCid cid.Cid BlockSize uint64 @@ -321,11 +373,11 @@ func (i *IndexStore) PiecesContainingMultihash(ctx context.Context, m multihash. return pieces, nil } -// GetOffset retrieves the offset of a payload in a piece -func (i *IndexStore) GetOffset(ctx context.Context, pieceCid cid.Cid, hash multihash.Multihash) (uint64, error) { +// GetOffset retrieves the offset of a payload in a piece(v2) +func (i *IndexStore) GetOffset(ctx context.Context, pieceCidv2 cid.Cid, hash multihash.Multihash) (uint64, error) { var offset uint64 qryOffset := `SELECT BlockOffset FROM PieceBlockOffsetSize WHERE PieceCid = ? AND PayloadMultihash = ?` - err := i.session.Query(qryOffset, pieceCid.Bytes(), []byte(hash)).WithContext(ctx).Scan(&offset) + err := i.session.Query(qryOffset, pieceCidv2.Bytes(), []byte(hash)).WithContext(ctx).Scan(&offset) if err != nil { return 0, fmt.Errorf("getting offset: %w", err) } @@ -333,22 +385,41 @@ func (i *IndexStore) GetOffset(ctx context.Context, pieceCid cid.Cid, hash multi return offset, nil } -func (i *IndexStore) GetPieceHashRange(ctx context.Context, piece cid.Cid, start multihash.Multihash, num int64) ([]multihash.Multihash, error) { - qry := "SELECT PayloadMultihash FROM PieceBlockOffsetSize WHERE PieceCid = ? AND PayloadMultihash >= ? ORDER BY PayloadMultihash ASC LIMIT ?" - iter := i.session.Query(qry, piece.Bytes(), []byte(start), num).WithContext(ctx).Iter() - - var hashes []multihash.Multihash - var r []byte - for iter.Scan(&r) { - m := multihash.Multihash(r) - hashes = append(hashes, m) +func (i *IndexStore) GetPieceHashRange(ctx context.Context, piecev2 cid.Cid, start multihash.Multihash, num int64) ([]multihash.Multihash, error) { + getHashes := func(pieceCid cid.Cid, start multihash.Multihash, num int64) ([]multihash.Multihash, error) { + qry := "SELECT PayloadMultihash FROM PieceBlockOffsetSize WHERE PieceCid = ? AND PayloadMultihash >= ? ORDER BY PayloadMultihash ASC LIMIT ?" + iter := i.session.Query(qry, pieceCid.Bytes(), []byte(start), num).WithContext(ctx).Iter() + + var hashes []multihash.Multihash + var r []byte + for iter.Scan(&r) { + m := multihash.Multihash(r) + hashes = append(hashes, m) + // Allocate new r, preallocating the typical size of a multihash (36 bytes) + r = make([]byte, 0, 36) + } + if err := iter.Close(); err != nil { + return nil, xerrors.Errorf("iterating piece hash range (P:0x%02x, H:0x%02x, n:%d): %w", pieceCid.Bytes(), []byte(start), num, err) + } + return hashes, nil + } - // Allocate new r, preallocating the typical size of a multihash (36 bytes) - r = make([]byte, 0, 36) + hashes, err := getHashes(piecev2, start, num) + if err != nil { + return nil, err } - if err := iter.Close(); err != nil { - return nil, xerrors.Errorf("iterating piece hash range (P:0x%02x, H:0x%02x, n:%d): %w", piece.Bytes(), []byte(start), num, err) + + if len(hashes) == 0 { + pcid1, _, err := commcid.PieceCidV1FromV2(piecev2) + if err != nil { + return nil, xerrors.Errorf("getting piece cid v1 from v2: %w", err) + } + hashes, err = getHashes(pcid1, start, num) + if err != nil { + return nil, err + } } + if len(hashes) != int(num) { return nil, xerrors.Errorf("expected %d hashes, got %d (possibly missing indexes)", num, len(hashes)) } @@ -356,9 +427,9 @@ func (i *IndexStore) GetPieceHashRange(ctx context.Context, piece cid.Cid, start return hashes, nil } -func (i *IndexStore) CheckHasPiece(ctx context.Context, piece cid.Cid) (bool, error) { +func (i *IndexStore) CheckHasPiece(ctx context.Context, piecev2 cid.Cid) (bool, error) { qry := "SELECT PayloadMultihash FROM PieceBlockOffsetSize WHERE PieceCid = ? AND PayloadMultihash >= ? ORDER BY PayloadMultihash ASC LIMIT ?" - iter := i.session.Query(qry, piece.Bytes(), []byte{0}, 1).WithContext(ctx).Iter() + iter := i.session.Query(qry, piecev2.Bytes(), []byte{0}, 1).WithContext(ctx).Iter() var hashes []multihash.Multihash var r []byte @@ -370,8 +441,394 @@ func (i *IndexStore) CheckHasPiece(ctx context.Context, piece cid.Cid) (bool, er r = make([]byte, 0, 36) } if err := iter.Close(); err != nil { - return false, xerrors.Errorf("iterating piece hash range (P:0x%02x, n:%d): %w", piece.Bytes(), len(hashes), err) + return false, xerrors.Errorf("iterating piece hash range (P:0x%02x, n:%d): %w", piecev2.Bytes(), len(hashes), err) } return len(hashes) > 0, nil } + +func (i *IndexStore) InsertAggregateIndex(ctx context.Context, aggregatePieceCid cid.Cid, records []Record) error { + aggregatePieceCidBytes := aggregatePieceCid.Bytes() + + chanSize := i.settings.InsertConcurrency * i.settings.InsertBatchSize + + recordsChan := make(chan Record, chanSize) + + go func(f []Record) { + for _, r := range f { + recordsChan <- r + } + close(recordsChan) + }(records) + + insertPieceByAggregate := `INSERT INTO piece_by_aggregate (AggregatePieceCid, PieceCid, UnpaddedOffset, UnpaddedLength) VALUES (?, ?, ?, ?)` + insertAggregateByPiece := `INSERT INTO aggregate_by_piece (PieceCid, AggregatePieceCid, UnpaddedOffset, UnpaddedLength) VALUES (?, ?, ?, ?)` + + var eg errgroup.Group + + // Start worker threads based on InsertConcurrency value + for worker := 0; worker < i.settings.InsertConcurrency; worker++ { + eg.Go(func() error { + var batchPieceByAggregate *gocql.Batch + var batchAggregateByPiece *gocql.Batch + for { + if batchPieceByAggregate == nil { + batchPieceByAggregate = i.session.NewBatch(gocql.UnloggedBatch).WithContext(ctx) + batchPieceByAggregate.Entries = make([]gocql.BatchEntry, 0, i.settings.InsertBatchSize) + } + if batchAggregateByPiece == nil { + batchAggregateByPiece = i.session.NewBatch(gocql.UnloggedBatch).WithContext(ctx) + batchAggregateByPiece.Entries = make([]gocql.BatchEntry, 0, i.settings.InsertBatchSize) + } + + rec, ok := <-recordsChan + + if !ok { + if len(batchPieceByAggregate.Entries) > 0 { + if err := i.executeBatchWithRetry(ctx, batchPieceByAggregate, aggregatePieceCid); err != nil { + return err + } + } + if len(batchAggregateByPiece.Entries) > 0 { + if err := i.executeBatchWithRetry(ctx, batchAggregateByPiece, aggregatePieceCid); err != nil { + return err + } + } + return nil + } + + batchPieceByAggregate.Entries = append(batchPieceByAggregate.Entries, gocql.BatchEntry{ + Stmt: insertPieceByAggregate, + Args: []interface{}{aggregatePieceCidBytes, rec.Cid.Bytes(), rec.Offset, rec.Size}, + Idempotent: true, + }) + + batchAggregateByPiece.Entries = append(batchAggregateByPiece.Entries, gocql.BatchEntry{ + Stmt: insertAggregateByPiece, + Args: []interface{}{rec.Cid.Bytes(), aggregatePieceCidBytes, rec.Offset, rec.Size}, + Idempotent: true, + }) + + if len(batchPieceByAggregate.Entries) == i.settings.InsertBatchSize { + if err := i.executeBatchWithRetry(ctx, batchPieceByAggregate, aggregatePieceCid); err != nil { + return err + } + batchPieceByAggregate = nil + } + if len(batchAggregateByPiece.Entries) == i.settings.InsertBatchSize { + if err := i.executeBatchWithRetry(ctx, batchAggregateByPiece, aggregatePieceCid); err != nil { + return err + } + batchAggregateByPiece = nil + } + } + }) + } + + err := eg.Wait() + if err != nil { + return xerrors.Errorf("add aggregate index: %w", err) + } + + return nil +} + +func (i *IndexStore) FindPieceInAggregate(ctx context.Context, pieceCid cid.Cid) ([]Record, error) { + var recs []Record + qry := `SELECT AggregatePieceCid, UnpaddedOffset, UnpaddedLength FROM aggregate_by_piece WHERE PieceCid = ?` + iter := i.session.Query(qry, pieceCid.Bytes()).WithContext(ctx).Iter() + var r []byte + var idx, length int64 + for iter.Scan(&r, &idx, &length) { + c, err := cid.Cast(r) + if err != nil { + return nil, xerrors.Errorf("casting aggregate piece cid: %w", err) + } + recs = append(recs, Record{ + Cid: c, + Offset: uint64(idx), + Size: uint64(length), + }) + + r = make([]byte, 0) + } + if err := iter.Close(); err != nil { + return nil, xerrors.Errorf("iterating aggregate piece cid (P:0x%02x): %w", pieceCid.Bytes(), err) + } + return recs, nil +} + +func (i *IndexStore) RemoveAggregateIndex(ctx context.Context, aggregatePieceCid cid.Cid) error { + aggregatePieceCidBytes := aggregatePieceCid.Bytes() + + // 1) iterate children with paging + iter := i.session.Query(`SELECT PieceCid, UnpaddedOffset FROM piece_by_aggregate WHERE AggregatePieceCid = ?`, aggregatePieceCidBytes).WithContext(ctx).PageSize(1000).Iter() + + var piece []byte + var off int64 + + batch := i.session.NewBatch(gocql.LoggedBatch).WithContext(ctx) + + flush := func() error { + if len(batch.Entries) == 0 { + return nil + } + if berr := i.session.ExecuteBatch(batch); berr != nil { + return xerrors.Errorf("executing batch delete for aggregate index for piece cid (P:0x%02x) %s: %w", aggregatePieceCidBytes, aggregatePieceCid.String(), berr) + } + batch = i.session.NewBatch(gocql.LoggedBatch).WithContext(ctx) + return nil + } + + for iter.Scan(&piece, &off) { + batch.Query(`DELETE FROM aggregate_by_piece + WHERE PieceCid = ? AND AggregatePieceCid = ? AND UnpaddedOffset = ?`, + append([]byte{}, piece...), aggregatePieceCidBytes, off) + + if len(batch.Entries) >= 1000 { + if err := flush(); err != nil { + return err + } + } + } + if err := iter.Close(); err != nil { + return err + } + if err := flush(); err != nil { + return err + } + + // 3) delete the forward partition + err := i.session.Query(`DELETE FROM piece_by_aggregate WHERE AggregatePieceCid = ?`, aggregatePieceCidBytes).WithContext(ctx).Exec() + if err != nil { + return xerrors.Errorf("deleting piece_by_aggregate aggregate piece cid (P:0x%02x) %s: %w", aggregatePieceCidBytes, aggregatePieceCid.String(), err) + } + + return nil +} + +func (i *IndexStore) UpdatePieceCidV1ToV2(ctx context.Context, pieceCidV1 cid.Cid, pieceCidV2 cid.Cid) error { + p1 := pieceCidV1.Bytes() + p2 := pieceCidV2.Bytes() + + batchLimit := i.settings.InsertBatchSize + if batchLimit <= 0 { + batchLimit = 15000 + } + + pageSize := int(math.Floor(float64(batchLimit) / 2)) + + flush := func(batch *gocql.Batch) error { + if len(batch.Entries) == 0 { + return nil + } + if err := i.executeBatchWithRetry(ctx, batch, pieceCidV2); err != nil { + return xerrors.Errorf("executing batch for updating index from piece %s to %s: %w", pieceCidV1.String(), pieceCidV2.String(), err) + } + return nil + } + + // -------- Pass 1: PayloadToPieces -------- + { + iter := i.session.Query(`SELECT PayloadMultihash, BlockSize FROM PayloadToPieces WHERE PieceCid = ?`, p1).WithContext(ctx).PageSize(pageSize).Iter() + + batch := i.session.NewBatch(gocql.LoggedBatch).WithContext(ctx) // Batches must be logged for consistency + var mh []byte + var bs int64 + for iter.Scan(&mh, &bs) { + mhCopy := make([]byte, len(mh)) + copy(mhCopy, mh) + + // INSERT new mapping + batch.Entries = append(batch.Entries, gocql.BatchEntry{ + Stmt: `INSERT INTO PayloadToPieces (PayloadMultihash, PieceCid, BlockSize) VALUES (?, ?, ?)`, + Args: []any{mhCopy, p2, bs}, + Idempotent: true, + }) + // DELETE old mapping + batch.Entries = append(batch.Entries, gocql.BatchEntry{ + Stmt: `DELETE FROM PayloadToPieces WHERE PayloadMultihash = ? AND PieceCid = ?`, + Args: []any{mhCopy, p1}, + Idempotent: true, + }) + + if len(batch.Entries) >= batchLimit { + if err := flush(batch); err != nil { + _ = iter.Close() + return err + } + batch = i.session.NewBatch(gocql.LoggedBatch).WithContext(ctx) + } + } + if err := iter.Close(); err != nil { + return xerrors.Errorf("scan PayloadToPieces for piece %s: %w", pieceCidV1, err) + } + if err := flush(batch); err != nil { + return err + } + } + + // -------- Pass 2: PieceBlockOffsetSize -------- + { + iter := i.session.Query(`SELECT PayloadMultihash, BlockOffset FROM PieceBlockOffsetSize WHERE PieceCid = ?`, p1).WithContext(ctx).PageSize(pageSize).Iter() + + batch := i.session.NewBatch(gocql.LoggedBatch).WithContext(ctx) + var mh []byte + var off int64 + for iter.Scan(&mh, &off) { + mhCopy := make([]byte, len(mh)) + copy(mhCopy, mh) + + // INSERT new mapping + batch.Entries = append(batch.Entries, gocql.BatchEntry{ + Stmt: `INSERT INTO PieceBlockOffsetSize (PieceCid, PayloadMultihash, BlockOffset) VALUES (?, ?, ?)`, + Args: []any{p2, mhCopy, off}, + Idempotent: true, + }) + // DELETE old mapping + batch.Entries = append(batch.Entries, gocql.BatchEntry{ + Stmt: `DELETE FROM PieceBlockOffsetSize WHERE PieceCid = ? AND PayloadMultihash = ?`, + Args: []any{p1, mhCopy}, + Idempotent: true, + }) + + if len(batch.Entries) >= batchLimit { + if err := flush(batch); err != nil { + _ = iter.Close() + return err + } + batch = i.session.NewBatch(gocql.LoggedBatch).WithContext(ctx) + } + } + if err := iter.Close(); err != nil { + return xerrors.Errorf("scan PieceBlockOffsetSize for piece %s: %w", pieceCidV1, err) + } + if err := flush(batch); err != nil { + return err + } + } + + return nil +} + +type NodeDigest struct { + Layer int // Layer index in the merkle Tree + Index int64 // logical index at that layer + Hash [32]byte // 32 bytes +} + +func (i *IndexStore) AddPDPLayer(ctx context.Context, pieceCidV2 cid.Cid, layer []NodeDigest) error { + qry := `INSERT INTO pdp_cache_layer (PieceCid, LayerIndex, Leaf, LeafIndex) VALUES (?, ?, ?, ?)` + pieceCidBytes := pieceCidV2.Bytes() + var batch *gocql.Batch + batchSize := i.settings.InsertBatchSize + + if len(layer) == 0 { + return xerrors.Errorf("no records to insert") + } + + for _, r := range layer { + if batch == nil { + batch = i.session.NewBatch(gocql.UnloggedBatch).WithContext(ctx) + } + + batch.Entries = append(batch.Entries, gocql.BatchEntry{ + Stmt: qry, + Args: []interface{}{pieceCidBytes, r.Layer, r.Hash[:], r.Index}, + Idempotent: true, + }) + + if len(batch.Entries) >= batchSize { + if err := i.session.ExecuteBatch(batch); err != nil { + return xerrors.Errorf("executing batch insert for PDP cache layer for piece %s: %w", pieceCidV2.String(), err) + } + batch = nil + } + } + + if batch != nil { + if len(batch.Entries) >= 0 { + if err := i.session.ExecuteBatch(batch); err != nil { + return xerrors.Errorf("executing batch insert for PDP cache layer for piece %s: %w", pieceCidV2.String(), err) + } + } + } + + return nil +} + +func (i *IndexStore) GetPDPLayerIndex(ctx context.Context, pieceCidV2 cid.Cid) (bool, int, error) { + var layerIdx int + if err := i.session.Query(`SELECT LayerIndex FROM pdp_cache_layer WHERE PieceCid = ? LIMIT 1`, pieceCidV2.Bytes()).WithContext(ctx).Scan(&layerIdx); err != nil { + if errors.Is(err, gocql.ErrNotFound) { + return false, 0, nil + } + return false, 0, xerrors.Errorf("scanning highest layer for PDP cache layer (P:0x%02x) %s: %w", pieceCidV2.Bytes(), pieceCidV2.String(), err) + } + + return true, layerIdx, nil +} + +func (i *IndexStore) GetPDPLayer(ctx context.Context, pieceCidV2 cid.Cid, layerIdx int) ([]NodeDigest, error) { + var layer []NodeDigest + + iter := i.session.Query(`SELECT LeafIndex, Leaf FROM pdp_cache_layer WHERE PieceCid = ? AND LayerIndex = ?`, pieceCidV2.Bytes(), layerIdx).WithContext(ctx).PageSize(2000).Iter() + + var leafIdx int64 + var leaf []byte + for iter.Scan(&leafIdx, &leaf) { + layer = append(layer, NodeDigest{ + Layer: layerIdx, + Index: leafIdx, + Hash: [32]byte(leaf), + }) + leaf = make([]byte, 32) + } + if err := iter.Close(); err != nil { + return nil, xerrors.Errorf("iterating PDP cache layer (P:0x%02x) %s: %w", pieceCidV2.Bytes(), pieceCidV2.String(), err) + } + + sort.Slice(layer, func(i, j int) bool { + return layer[i].Index < layer[j].Index + }) + return layer, nil +} + +func (i *IndexStore) DeletePDPLayer(ctx context.Context, pieceCidV2 cid.Cid) error { + for { + has, layerIdx, err := i.GetPDPLayerIndex(ctx, pieceCidV2) + if err != nil { + return err + } + if !has { + return nil + } + + qry := `DELETE FROM pdp_cache_layer WHERE PieceCid = ? AND LayerIndex = ?` + if err := i.session.Query(qry, pieceCidV2.Bytes(), layerIdx).WithContext(ctx).Exec(); err != nil { + return xerrors.Errorf("deleting PDP cache layer with index %d (P:0x%02x): %w", layerIdx, pieceCidV2.Bytes(), err) + } + } +} + +func (i *IndexStore) GetPDPNode(ctx context.Context, pieceCidV2 cid.Cid, layerIdx int, index int64) (bool, *NodeDigest, error) { + var r []byte + + qry := `SELECT Leaf FROM pdp_cache_layer WHERE PieceCid = ? AND LayerIndex = ? AND LeafIndex = ? LIMIT 1` + err := i.session.Query(qry, pieceCidV2.Bytes(), layerIdx, index).WithContext(ctx).Scan(&r) + if err != nil { + if errors.Is(err, gocql.ErrNotFound) { + return false, nil, nil + } + return false, nil, xerrors.Errorf("scanning PDP cache layer (P:0x%02x) %s: %w", pieceCidV2.Bytes(), pieceCidV2.String(), err) + } + + var hash [32]byte + copy(hash[:], r) + + return true, &NodeDigest{ + Layer: layerIdx, + Index: index, + Hash: hash, + }, nil +} diff --git a/market/indexstore/indexstore_test.go b/market/indexstore/indexstore_test.go index 24a6c0693..71b3a8c82 100644 --- a/market/indexstore/indexstore_test.go +++ b/market/indexstore/indexstore_test.go @@ -3,9 +3,9 @@ package indexstore import ( "context" "io" + "math/rand" "os" "testing" - "time" carv2 "github.com/ipld/go-car/v2" "github.com/ipld/go-car/v2/blockstore" @@ -13,9 +13,10 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" - "github.com/filecoin-project/go-commp-utils/writer" + commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/lib/savecache" "github.com/filecoin-project/curio/lib/testutils" ) @@ -34,6 +35,8 @@ func TestNewIndexStore(t *testing.T) { idxStore, err := NewIndexStore([]string{envElse("CURIO_HARMONYDB_HOSTS", "127.0.0.1")}, 9042, cfg) require.NoError(t, err) + err = idxStore.Start(ctx, true) + require.NoError(t, err) // Create a car file and calculate commP dir, err := os.MkdirTemp(os.TempDir(), "curio-indexstore") @@ -42,7 +45,7 @@ func TestNewIndexStore(t *testing.T) { _ = os.RemoveAll(dir) }() - rf, err := testutils.CreateRandomFile(dir, time.Now().Unix(), 8000000) + rf, err := testutils.CreateRandomTmpFile(dir, 8000000) require.NoError(t, err) caropts := []carv2.Option{ @@ -59,13 +62,27 @@ func TestNewIndexStore(t *testing.T) { _ = f.Close() }() - w := &writer.Writer{} - _, err = io.CopyBuffer(w, f, make([]byte, writer.CommPBuf)) + stat, err := f.Stat() + require.NoError(t, err) + + // Calculate commP + cp := savecache.NewCommPWithSizeForTest(uint64(stat.Size())) + _, err = io.Copy(cp, f) require.NoError(t, err) - commp, err := w.Sum() + digest, _, layerIdx, _, layer, err := cp.DigestWithSnapShot() + require.NoError(t, err) + + t.Logf("Layer number: %d", layerIdx) + t.Logf("Number of nodes in layer: %d", len(layer)) + + pcid1, err := commcid.DataCommitmentV1ToCID(digest) require.NoError(t, err) + pcid2, err := commcid.DataCommitmentToPieceCidv2(digest, uint64(stat.Size())) + require.NoError(t, err) + + // Rewind the file _, err = f.Seek(0, io.SeekStart) require.NoError(t, err) @@ -81,7 +98,7 @@ func TestNewIndexStore(t *testing.T) { // Add index to the store var eg errgroup.Group eg.Go(func() error { - serr := idxStore.AddIndex(ctx, commp.PieceCID, recs) + serr := idxStore.AddIndex(ctx, pcid1, recs) return serr }) @@ -111,15 +128,102 @@ func TestNewIndexStore(t *testing.T) { pcids, err := idxStore.PiecesContainingMultihash(ctx, m) require.NoError(t, err) require.Len(t, pcids, 1) - require.Equal(t, pcids[0].PieceCid.String(), commp.PieceCID.String()) + require.Equal(t, pcids[0].PieceCid.String(), pcid1.String()) + + // Migrate V1 to V2 + err = idxStore.UpdatePieceCidV1ToV2(ctx, pcid1, pcid2) + require.NoError(t, err) + pcids, err = idxStore.PiecesContainingMultihash(ctx, m) + require.NoError(t, err) + require.Len(t, pcids, 1) + require.Equal(t, pcids[0].PieceCid.String(), pcid2.String()) // Remove all indexes from the store err = idxStore.RemoveIndexes(ctx, pcids[0].PieceCid) require.NoError(t, err) + err = idxStore.session.Query("SELECT * FROM piece_by_aggregate").Exec() + require.NoError(t, err) + + aggrRec := []Record{ + { + Cid: pcid1, + Offset: 0, + Size: 100, + }, + { + Cid: pcid2, + Offset: 100, + Size: 101, + }, + } + + err = idxStore.InsertAggregateIndex(ctx, pcid2, aggrRec) + require.NoError(t, err) + + x, err := idxStore.FindPieceInAggregate(ctx, pcid1) + require.NoError(t, err) + require.Len(t, x, 1) + require.Equal(t, x[0].Cid, pcid2) + + x, err = idxStore.FindPieceInAggregate(ctx, pcid2) + require.NoError(t, err) + require.Len(t, x, 1) + require.Equal(t, x[0].Cid, pcid2) + + err = idxStore.RemoveAggregateIndex(ctx, pcid2) + require.NoError(t, err) + + // Test PDP layer + leafs := make([]NodeDigest, len(layer)) + for i, s := range layer { + leafs[i] = NodeDigest{ + Layer: layerIdx, + Hash: s.Hash, + Index: int64(i), + } + } + require.Equal(t, len(leafs), len(layer)) + + // Insert the layer + err = idxStore.AddPDPLayer(ctx, pcid2, leafs) + require.NoError(t, err) + + // Verify the layer + has, ldx, err := idxStore.GetPDPLayerIndex(ctx, pcid2) + require.NoError(t, err) + require.True(t, has) + require.Equal(t, ldx, layerIdx) + + has, _, err = idxStore.GetPDPLayerIndex(ctx, pcid1) + require.NoError(t, err) + require.False(t, has) + + outLayer, err := idxStore.GetPDPLayer(ctx, pcid2, layerIdx) + require.NoError(t, err) + require.Equal(t, len(layer), len(outLayer)) + + // Fetch a NodeDigest + challenge := int64(rand.Intn(len(layer))) + has, node, err := idxStore.GetPDPNode(ctx, pcid2, layerIdx, challenge) + require.NoError(t, err) + require.True(t, has) + require.Equal(t, node.Index, challenge) + require.Equal(t, node.Layer, layerIdx) + require.Equal(t, node.Hash, layer[challenge].Hash) + + err = idxStore.DeletePDPLayer(ctx, pcid2) + require.NoError(t, err) + // Drop the tables err = idxStore.session.Query("DROP TABLE PayloadToPieces").Exec() require.NoError(t, err) err = idxStore.session.Query("DROP TABLE PieceBlockOffsetSize").Exec() require.NoError(t, err) + err = idxStore.session.Query("DROP TABLE aggregate_by_piece").Exec() + require.NoError(t, err) + err = idxStore.session.Query("DROP TABLE piece_by_aggregate").Exec() + require.NoError(t, err) + err = idxStore.session.Query("DROP TABLE pdp_cache_layer").Exec() + require.NoError(t, err) } diff --git a/market/ipni/chunker/initial-chunker.go b/market/ipni/chunker/initial-chunker.go index d96a8c3d7..1202ec572 100644 --- a/market/ipni/chunker/initial-chunker.go +++ b/market/ipni/chunker/initial-chunker.go @@ -122,7 +122,7 @@ func (c *InitialChunker) processCarPending() error { return nil } -func (c *InitialChunker) Finish(ctx context.Context, db *harmonydb.DB, pieceCid cid.Cid) (ipld.Link, error) { +func (c *InitialChunker) Finish(ctx context.Context, db *harmonydb.DB, pieceCid cid.Cid, isPDP bool) (ipld.Link, error) { defer func() { took := time.Since(c.start) ingestedPerSec := float64(c.ingestedSoFar) / took.Seconds() @@ -132,14 +132,14 @@ func (c *InitialChunker) Finish(ctx context.Context, db *harmonydb.DB, pieceCid // note: <= because we're not inserting anything here if c.ingestedSoFar <= longChainThreshold { // db-order ingest - return c.finishDB(ctx, db, pieceCid) + return c.finishDB(ctx, db, pieceCid, isPDP) } // car-order ingest - return c.finishCAR(ctx, db, pieceCid) + return c.finishCAR(ctx, db, pieceCid, isPDP) } -func (c *InitialChunker) finishDB(ctx context.Context, db *harmonydb.DB, pieceCid cid.Cid) (ipld.Link, error) { +func (c *InitialChunker) finishDB(ctx context.Context, db *harmonydb.DB, pieceCid cid.Cid, isPDP bool) (ipld.Link, error) { if len(c.dbMultihashes) == 0 { return nil, nil } @@ -228,9 +228,9 @@ func (c *InitialChunker) finishDB(ctx context.Context, db *harmonydb.DB, pieceCi // Prepare the insert statement batch.Queue(` - INSERT INTO ipni_chunks (cid, piece_cid, chunk_num, first_cid, start_offset, num_blocks, from_car) - VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT DO NOTHING - `, link.String(), pieceCid.String(), i, firstCID.HexString(), startOffset, numBlocks, false) + INSERT INTO ipni_chunks (cid, piece_cid, chunk_num, first_cid, start_offset, num_blocks, from_car, is_pdp) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT DO NOTHING + `, link.String(), pieceCid.String(), i, firstCID.HexString(), startOffset, numBlocks, false, isPDP) } // Send the batch @@ -262,7 +262,7 @@ func (c *InitialChunker) finishDB(ctx context.Context, db *harmonydb.DB, pieceCi return lastLink, nil } -func (c *InitialChunker) finishCAR(ctx context.Context, db *harmonydb.DB, pieceCid cid.Cid) (ipld.Link, error) { +func (c *InitialChunker) finishCAR(ctx context.Context, db *harmonydb.DB, pieceCid cid.Cid, isPDP bool) (ipld.Link, error) { // Process any remaining carPending multihashes if len(c.carPending) > 0 { if err := c.processCarPending(); err != nil { @@ -292,9 +292,9 @@ func (c *InitialChunker) finishCAR(ctx context.Context, db *harmonydb.DB, pieceC // Prepare the insert statement batch.Queue(` - INSERT INTO ipni_chunks (cid, piece_cid, chunk_num, first_cid, start_offset, num_blocks, from_car) - VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT DO NOTHING - `, link.String(), pieceCid.String(), i, nil, startOffset, numBlocks, true) + INSERT INTO ipni_chunks (cid, piece_cid, chunk_num, first_cid, start_offset, num_blocks, from_car, is_pdp) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT DO NOTHING + `, link.String(), pieceCid.String(), i, nil, startOffset, numBlocks, true, isPDP) } // Send the batch diff --git a/market/ipni/chunker/serve-chunker.go b/market/ipni/chunker/serve-chunker.go index fa301a411..c938ed9d8 100644 --- a/market/ipni/chunker/serve-chunker.go +++ b/market/ipni/chunker/serve-chunker.go @@ -6,6 +6,7 @@ import ( "context" "encoding/hex" "errors" + "fmt" "io" "time" @@ -19,8 +20,12 @@ import ( "github.com/yugabyte/pgx/v5" "golang.org/x/xerrors" + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-padreader" + "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/lib/cachedreader" + "github.com/filecoin-project/curio/lib/commcidv2" "github.com/filecoin-project/curio/lib/pieceprovider" "github.com/filecoin-project/curio/lib/promise" "github.com/filecoin-project/curio/lib/storiface" @@ -49,7 +54,7 @@ type ServeChunker struct { entryCache *lru.Cache[cid.Cid, *promise.Promise[result.Result[ipniEntry]]] - // small cache keeping track of which piece CIDs shouldn't be skipped. Entries expire after NoSkipCacheTTL + // small cache keeping track of which piece CIDs (v2) shouldn't be skipped. Entries expire after NoSkipCacheTTL noSkipCache *lru.Cache[cid.Cid, time.Time] } @@ -105,11 +110,10 @@ func (p *ServeChunker) getEntry(rctx context.Context, block cid.Cid, speculated if b, ok := p.entryCache.Get(block); ok { v := b.Val(rctx) - switch v.Error { - case nil: + if v.Error == nil { prevChunk = v.Value.Prev return v.Value.Data, nil - case ErrNotFound: + } else if errors.Is(v.Error, ErrNotFound) { log.Errorw("Cached promise skip", "block", block, "prev", prevChunk, "err", err) return v.Value.Data, v.Error } @@ -130,13 +134,15 @@ func (p *ServeChunker) getEntry(rctx context.Context, block cid.Cid, speculated ctx := context.Background() type ipniChunk struct { - PieceCID string `db:"piece_cid"` - FromCar bool `db:"from_car"` + PieceCIDv2 string `db:"piece_cid"` + FromCar bool `db:"from_car"` FirstCID *string `db:"first_cid"` StartOffset *int64 `db:"start_offset"` NumBlocks int64 `db:"num_blocks"` + IsPDP bool `db:"is_pdp"` + PrevCID *string `db:"prev_cid"` } @@ -147,7 +153,8 @@ func (p *ServeChunker) getEntry(rctx context.Context, block cid.Cid, speculated current.from_car, current.first_cid, current.start_offset, - current.num_blocks, + current.num_blocks, + current.is_pdp, prev.cid AS prev_cid FROM ipni_chunks current @@ -169,12 +176,49 @@ func (p *ServeChunker) getEntry(rctx context.Context, block cid.Cid, speculated } chunk := ipniChunks[0] - pieceCid, err := cid.Parse(chunk.PieceCID) + pieceCidv2, err := cid.Parse(chunk.PieceCIDv2) if err != nil { return nil, xerrors.Errorf("parsing piece CID: %w", err) } - if leave, ok := p.noSkipCache.Get(pieceCid); !ok || time.Now().After(leave) { + // Convert to pcid2 if needed + yes := commcidv2.IsPieceCidV2(pieceCidv2) + if !yes { + var rawSize int64 + var singlePiece bool + err := p.db.QueryRow(ctx, `WITH meta AS ( + SELECT piece_size + FROM market_piece_metadata + WHERE piece_cid = $1 + ), + exact AS ( + SELECT COUNT(*) AS n, MIN(piece_size) AS piece_size + FROM meta + ), + raw AS ( + SELECT MAX(mpd.raw_size) AS raw_size + FROM market_piece_deal mpd + WHERE mpd.piece_cid = $1 + AND mpd.piece_length = (SELECT piece_size FROM exact) + AND (SELECT n FROM exact) = 1 + ) + SELECT + COALESCE((SELECT raw_size FROM raw), 0) AS raw_size, + ((SELECT n FROM exact) = 1) AS has_single_metadata;`, pieceCidv2.String()).Scan(&rawSize, &singlePiece) + if err != nil { + return nil, fmt.Errorf("failed to get piece metadata: %w", err) + } + if !singlePiece { + return nil, fmt.Errorf("more than 1 piece metadata found for piece cid %s, please use piece cid v2", pieceCidv2.String()) + } + pcid2, err := commcid.PieceCidV2FromV1(pieceCidv2, uint64(rawSize)) + if err != nil { + return nil, fmt.Errorf("failed to convert piece cid v1 to v2: %w", err) + } + pieceCidv2 = pcid2 + } + + if leave, ok := p.noSkipCache.Get(pieceCidv2); !ok || time.Now().After(leave) { skip, err := p.checkIsEntrySkip(ctx, block) if err != nil { return nil, xerrors.Errorf("checking entry skipped for block %s: %w", block, err) @@ -185,7 +229,7 @@ func (p *ServeChunker) getEntry(rctx context.Context, block cid.Cid, speculated } } - p.noSkipCache.Add(pieceCid, time.Now().Add(NoSkipCacheTTL)) + p.noSkipCache.Add(pieceCidv2, time.Now().Add(NoSkipCacheTTL)) var next ipld.Link if chunk.PrevCID != nil { @@ -197,6 +241,53 @@ func (p *ServeChunker) getEntry(rctx context.Context, block cid.Cid, speculated next = cidlink.Link{Cid: prevChunk} } + if chunk.IsPDP { + if chunk.NumBlocks != 1 { + return nil, xerrors.Errorf("Expected 1 block for PDP piece announcement, got %d", chunk.NumBlocks) + } + if chunk.PrevCID != nil { + return nil, xerrors.Errorf("Expected no previous chunk for PDP piece announcement, got %s", *chunk.PrevCID) + } + + if chunk.FirstCID == nil { + return nil, xerrors.Errorf("chunk does not have first CID") + } + + cb, err := hex.DecodeString(*chunk.FirstCID) + if err != nil { + return nil, xerrors.Errorf("decoding first CID: %w", err) + } + + mhs := make([]multihash.Multihash, 0, 1) + mhs = append(mhs, cb) + + chunkNode, err := NewEntriesChunkNode(mhs, next) + if err != nil { + return nil, xerrors.Errorf("creating chunk node: %w", err) + } + + if validate { + link, err := ipniculib.NodeToLink(chunkNode, ipniculib.EntryLinkproto) + if err != nil { + return nil, err + } + + if link.String() != block.String() { + return nil, xerrors.Errorf("car chunk node does not match the expected chunk CID, got %s, expected %s", link.String(), block.String()) + } + } + + b := new(bytes.Buffer) + err = dagcbor.Encode(chunkNode, b) + if err != nil { + return nil, xerrors.Errorf("encoding chunk node: %w", err) + } + + log.Infow("Served a PDP chunk", "chunk", chunk, "piece", pieceCidv2, "startOffset", 0, "numBlocks", 1, "speculated", speculated) + + return b.Bytes(), nil + } + if !chunk.FromCar { if chunk.FirstCID == nil { return nil, xerrors.Errorf("chunk does not have first CID") @@ -209,23 +300,30 @@ func (p *ServeChunker) getEntry(rctx context.Context, block cid.Cid, speculated firstHash := multihash.Multihash(cb) - return p.reconstructChunkFromDB(ctx, block, pieceCid, firstHash, next, chunk.NumBlocks, speculated) + return p.reconstructChunkFromDB(ctx, block, pieceCidv2, firstHash, next, chunk.NumBlocks, speculated) } - return p.reconstructChunkFromCar(ctx, block, pieceCid, *chunk.StartOffset, next, chunk.NumBlocks, speculated) + return p.reconstructChunkFromCar(ctx, block, pieceCidv2, *chunk.StartOffset, next, chunk.NumBlocks, speculated) } // reconstructChunkFromCar reconstructs a chunk from a car file. -func (p *ServeChunker) reconstructChunkFromCar(ctx context.Context, chunk, piece cid.Cid, startOff int64, next ipld.Link, numBlocks int64, speculate bool) ([]byte, error) { +func (p *ServeChunker) reconstructChunkFromCar(ctx context.Context, chunk, piecev2 cid.Cid, startOff int64, next ipld.Link, numBlocks int64, speculate bool) ([]byte, error) { start := time.Now() - reader, _, err := p.cpr.GetSharedPieceReader(ctx, piece) + pieceCid, rawSize, err := commcid.PieceCidV1FromV2(piecev2) + if err != nil { + return nil, xerrors.Errorf("getting piece CID v2 from piece CID v2: %w", err) + } + + size := padreader.PaddedSize(rawSize).Padded() + + reader, _, err := p.cpr.GetSharedPieceReader(ctx, piecev2, false) defer func(reader storiface.Reader) { _ = reader.Close() }(reader) if err != nil { - return nil, xerrors.Errorf("failed to read piece %s for ipni chunk %s reconstruction: %w", piece, chunk, err) + return nil, xerrors.Errorf("failed to read piece %s of size %d for ipni chunk %s reconstruction: %w", pieceCid, size, chunk, err) } _, err = reader.Seek(startOff, io.SeekStart) @@ -275,18 +373,32 @@ func (p *ServeChunker) reconstructChunkFromCar(ctx context.Context, chunk, piece return nil, xerrors.Errorf("encoding chunk node: %w", err) } - log.Infow("Reconstructing chunk from car", "chunk", chunk, "piece", piece, "startOffset", startOff, "numBlocks", numBlocks, "speculated", speculate, "readMiB", float64(curOff-startOff)/1024/1024, "recomputeTime", time.Since(read), "totalTime", time.Since(start), "ents/s", float64(numBlocks)/time.Since(start).Seconds(), "MiB/s", float64(curOff-startOff)/1024/1024/time.Since(start).Seconds()) + log.Infow("Reconstructing chunk from car", "chunk", chunk, "piece", pieceCid, "size", size, "startOffset", startOff, "numBlocks", numBlocks, "speculated", speculate, "readMiB", float64(curOff-startOff)/1024/1024, "recomputeTime", time.Since(read), "totalTime", time.Since(start), "ents/s", float64(numBlocks)/time.Since(start).Seconds(), "MiB/s", float64(curOff-startOff)/1024/1024/time.Since(start).Seconds()) return b.Bytes(), nil } // ReconstructChunkFromDB reconstructs a chunk from the database. -func (p *ServeChunker) reconstructChunkFromDB(ctx context.Context, chunk, piece cid.Cid, firstHash multihash.Multihash, next ipld.Link, numBlocks int64, speculate bool) ([]byte, error) { +func (p *ServeChunker) reconstructChunkFromDB(ctx context.Context, chunk, piecev2 cid.Cid, firstHash multihash.Multihash, next ipld.Link, numBlocks int64, speculate bool) ([]byte, error) { start := time.Now() - mhs, err := p.indexStore.GetPieceHashRange(ctx, piece, firstHash, numBlocks) + pieceCid, rawSize, err := commcid.PieceCidV1FromV2(piecev2) if err != nil { - return nil, xerrors.Errorf("getting piece hash range: %w", err) + return nil, xerrors.Errorf("getting piece CID v1 from piece CID v2: %w", err) + } + + size := padreader.PaddedSize(rawSize).Padded() + + var mhs []multihash.Multihash + + // Handle exception for PDP piece announcement with FilecoinPieceHttp{} metadata + if numBlocks == 1 { + mhs = []multihash.Multihash{firstHash} + } else { + mhs, err = p.indexStore.GetPieceHashRange(ctx, piecev2, firstHash, numBlocks) + if err != nil { + return nil, xerrors.Errorf("getting piece hash range: %w", err) + } } // Create the chunk node @@ -316,7 +428,7 @@ func (p *ServeChunker) reconstructChunkFromDB(ctx context.Context, chunk, piece return nil, err } - log.Infow("Reconstructing chunk from DB", "chunk", chunk, "piece", piece, "firstHash", firstHash, "numBlocks", numBlocks, "speculated", speculate, "totalTime", time.Since(start), "ents/s", float64(numBlocks)/time.Since(start).Seconds()) + log.Infow("Reconstructing chunk from DB", "chunk", chunk, "piece", pieceCid, "size", size, "firstHash", firstHash, "numBlocks", numBlocks, "speculated", speculate, "totalTime", time.Since(start), "ents/s", float64(numBlocks)/time.Since(start).Seconds()) return b.Bytes(), nil } @@ -326,7 +438,7 @@ func (p *ServeChunker) checkIsEntrySkip(ctx context.Context, entry cid.Cid) (boo var isSkip bool err := p.db.QueryRow(ctx, `SELECT is_skip FROM ipni WHERE entries = $1`, entry).Scan(&isSkip) if err != nil { - if err == pgx.ErrNoRows { + if errors.Is(err, pgx.ErrNoRows) { return false, nil } return false, err diff --git a/market/ipni/ipni-provider/ipni-provider.go b/market/ipni/ipni-provider/ipni-provider.go index 33478e266..b16497843 100644 --- a/market/ipni/ipni-provider/ipni-provider.go +++ b/market/ipni/ipni-provider/ipni-provider.go @@ -22,7 +22,6 @@ import ( "github.com/ipni/go-libipni/dagsync/ipnisync/head" "github.com/ipni/go-libipni/ingest/schema" "github.com/ipni/go-libipni/maurl" - "github.com/ipni/go-libipni/metadata" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multiaddr" @@ -103,8 +102,9 @@ func NewProvider(d *deps.Deps) (*Provider, error) { for rows.Next() && rows.Err() == nil { var priv []byte var peerID string + var sp int64 var spID abi.ActorID - err := rows.Scan(&priv, &peerID, &spID) + err := rows.Scan(&priv, &peerID, &sp) if err != nil { return nil, xerrors.Errorf("failed to scan the row: %w", err) } @@ -123,6 +123,10 @@ func NewProvider(d *deps.Deps) (*Provider, error) { return nil, xerrors.Errorf("peer ID mismatch: got %s (calculated), expected %s (DB)", id.String(), peerID) } + if sp < 0 { + spID = abi.ActorID(0) + } + maddr, err := address.NewIDAddress(uint64(spID)) if err != nil { return nil, xerrors.Errorf("parsing miner ID: %w", err) @@ -207,6 +211,7 @@ func (p *Provider) getAd(ctx context.Context, ad cid.Cid, provider string) (sche Addresses string Signature []byte Entries string + Metadata []byte } err := p.db.Select(ctx, &ads, `SELECT @@ -216,7 +221,8 @@ func (p *Provider) getAd(ctx context.Context, ad cid.Cid, provider string) (sche provider, addresses, signature, - entries + entries, + metadata FROM ipni WHERE ad_cid = $1 AND provider = $2`, ad.String(), provider) @@ -240,19 +246,13 @@ func (p *Provider) getAd(ctx context.Context, ad cid.Cid, provider string) (sche return schema.Advertisement{}, xerrors.Errorf("parsing entry CID: %w", err) } - mds := metadata.IpfsGatewayHttp{} - md, err := mds.MarshalBinary() - if err != nil { - return schema.Advertisement{}, xerrors.Errorf("marshalling metadata: %w", err) - } - adv := schema.Advertisement{ Provider: a.Provider, Signature: a.Signature, Entries: cidlink.Link{Cid: e}, ContextID: a.ContextID, IsRm: a.IsRm, - Metadata: md, + Metadata: a.Metadata, } if a.Addresses != "" { diff --git a/market/ipni/ipni-provider/spark.go b/market/ipni/ipni-provider/spark.go index eb661a292..e3b46d44a 100644 --- a/market/ipni/ipni-provider/spark.go +++ b/market/ipni/ipni-provider/spark.go @@ -27,6 +27,9 @@ import ( func (p *Provider) updateSparkContract(ctx context.Context) error { for _, pInfo := range p.keys { pInfo := pInfo + if pInfo.SPID == 0 { + return nil + } mInfo, err := p.full.StateMinerInfo(ctx, pInfo.Miner, types.EmptyTSK) if err != nil { return err diff --git a/market/ipni/types/types.go b/market/ipni/types/types.go new file mode 100644 index 000000000..7248571e2 --- /dev/null +++ b/market/ipni/types/types.go @@ -0,0 +1,50 @@ +package types + +import ( + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" +) + +// PdpIpniContext is used to generate the context bytes for PDP IPNI ads +type PdpIpniContext struct { + // PieceCID is piece CID V2 + PieceCID cid.Cid + + // Payload determines if the IPNI ad is TransportFilecoinPieceHttp or TransportIpfsGatewayHttp + Payload bool +} + +// Marshal encodes the PdpIpniContext into a byte slice containing a single byte for Payload and the byte representation of PieceCID. +func (p *PdpIpniContext) Marshal() ([]byte, error) { + pBytes := p.PieceCID.Bytes() + if len(pBytes) > 63 { + return nil, xerrors.Errorf("piece CID byte length exceeds 63") + } + payloadByte := make([]byte, 1) + if p.Payload { + payloadByte[0] = 1 + } else { + payloadByte[0] = 0 + } + return append(payloadByte, pBytes...), nil +} + +// Unmarshal decodes the provided byte slice into the PdpIpniContext struct, validating its length and extracting the PieceCID and Payload values. +func (p *PdpIpniContext) Unmarshal(b []byte) error { + if len(b) > 64 { + return xerrors.Errorf("byte length exceeds 64") + } + if len(b) < 2 { + return xerrors.Errorf("byte length is less than 2") + } + payload := b[0] == 1 + pcid, err := cid.Cast(b[1:]) + if err != nil { + return err + } + + p.PieceCID = pcid + p.Payload = payload + + return nil +} diff --git a/market/libp2p/libp2p.go b/market/libp2p/libp2p.go index d30b97c32..cbe9215c2 100644 --- a/market/libp2p/libp2p.go +++ b/market/libp2p/libp2p.go @@ -335,7 +335,7 @@ type mk12libp2pAPI interface { StateMinerInfo(context.Context, address.Address, types.TipSetKey) (minerInfo api.MinerInfo, err error) } -func NewDealProvider(ctx context.Context, db *harmonydb.DB, cfg *config.CurioConfig, prov *mk12.MK12, api mk12libp2pAPI, sender *message.Sender, miners []address.Address, machine string, shutdownChan chan struct{}) { +func NewDealProvider(ctx context.Context, db *harmonydb.DB, cfg *config.CurioConfig, prov *mk12.MK12, api mk12libp2pAPI, sender *message.Sender, miners *config.Dynamic[[]address.Address], machine string, shutdownChan chan struct{}) { //Check in the DB every minute who owns the libp2p ticket //if it was us, and is still us, and we're running DealProvider already do nothing, just keep polling //if it was us, and no longer is us, shut down DealProvider @@ -440,7 +440,7 @@ func NewDealProvider(ctx context.Context, db *harmonydb.DB, cfg *config.CurioCon } } -func makeDealProvider(ctx context.Context, db *harmonydb.DB, cfg *config.CurioConfig, prov *mk12.MK12, api mk12libp2pAPI, sender *message.Sender, miners []address.Address, machine string) error { +func makeDealProvider(ctx context.Context, db *harmonydb.DB, cfg *config.CurioConfig, prov *mk12.MK12, api mk12libp2pAPI, sender *message.Sender, miners *config.Dynamic[[]address.Address], machine string) error { h, publicAddr, err := NewLibp2pHost(ctx, db, cfg, machine) if err != nil { return xerrors.Errorf("failed to start libp2p nodes: %s", err) @@ -469,16 +469,18 @@ func makeDealProvider(ctx context.Context, db *harmonydb.DB, cfg *config.CurioCo go p.Start(ctx, h) - nonDisabledMiners := lo.Filter(miners, func(addr address.Address, _ int) bool { - return !lo.Contains(disabledMiners, addr) + go p.checkMinerInfos(ctx, sender, publicAddr.Libp2pAddr, miners, disabledMiners) + miners.OnChange(func() { + go p.checkMinerInfos(ctx, sender, publicAddr.Libp2pAddr, miners, disabledMiners) }) - - go p.checkMinerInfos(ctx, sender, publicAddr.Libp2pAddr, nonDisabledMiners) return nil } -func (p *DealProvider) checkMinerInfos(ctx context.Context, sender *message.Sender, announceAddr multiaddr.Multiaddr, miners []address.Address) { - for _, m := range miners { +func (p *DealProvider) checkMinerInfos(ctx context.Context, sender *message.Sender, announceAddr multiaddr.Multiaddr, miners *config.Dynamic[[]address.Address], disabledMiners []address.Address) { + nonDisabledMiners := lo.Filter(miners.Get(), func(addr address.Address, _ int) bool { + return !lo.Contains(disabledMiners, addr) + }) + for _, m := range nonDisabledMiners { mi, err := p.api.StateMinerInfo(ctx, m, types.EmptyTSK) if err != nil { log.Errorw("failed to get miner info", "miner", m, "error", err) diff --git a/market/mk12/http/http.go b/market/mk12/http/http.go index eff6a15a7..1f2e5d019 100644 --- a/market/mk12/http/http.go +++ b/market/mk12/http/http.go @@ -22,7 +22,9 @@ import ( storage_market "github.com/filecoin-project/curio/tasks/storage-market" ) -var log = logging.Logger("mktdealhdlr") +const requestTimeout = 10 * time.Second + +var log = logging.Logger("mk12httphdlr") // Redirector struct with a database connection type MK12DealHandler struct { @@ -32,7 +34,7 @@ type MK12DealHandler struct { disabledMiners []address.Address } -// NewMarketDealHandler creates a new Redirector with a database connection +// NewMK12DealHandler creates a new Redirector with a database connection func NewMK12DealHandler(db *harmonydb.DB, cfg *config.CurioConfig, dm *storage_market.CurioStorageDealMarket) (*MK12DealHandler, error) { var disabledMiners []address.Address for _, m := range cfg.Market.StorageMarketConfig.MK12.DisabledMiners { @@ -49,9 +51,9 @@ func NewMK12DealHandler(db *harmonydb.DB, cfg *config.CurioConfig, dm *storage_m func Router(mdh *MK12DealHandler) http.Handler { mux := chi.NewRouter() mux.Use(dealRateLimitMiddleware()) - mux.Post("/store", mdh.mk12deal) - mux.Get("/ask", mdh.mk12ask) - mux.Get("/status", mdh.mk12status) + mux.Method("POST", "/store", http.TimeoutHandler(http.HandlerFunc(mdh.mk12deal), requestTimeout, "timeout reading request")) + mux.Method("GET", "/status", http.TimeoutHandler(http.HandlerFunc(mdh.mk12status), requestTimeout, "timeout reading request")) + mux.Method("GET", "/ask", http.TimeoutHandler(http.HandlerFunc(mdh.mk12ask), requestTimeout, "timeout reading request")) return mux } diff --git a/market/mk12/mk12.go b/market/mk12/mk12.go index 9cb872200..eb8bee24f 100644 --- a/market/mk12/mk12.go +++ b/market/mk12/mk12.go @@ -488,8 +488,8 @@ func (m *MK12) processDeal(ctx context.Context, deal *ProviderDealState) (*Provi tInfo := &HttpRequest{} if !deal.IsOffline { - // Reject incorrect sized online deals except verified deal less than 1 MiB because verified deals can be 1 MiB minimum even if rawSize is much lower - if deal.ClientDealProposal.Proposal.PieceSize != padreader.PaddedSize(deal.Transfer.Size).Padded() && (!deal.ClientDealProposal.Proposal.VerifiedDeal || deal.ClientDealProposal.Proposal.PieceSize > abi.PaddedPieceSize(1<<20)) { + // Reject incorrect sized online deals + if deal.ClientDealProposal.Proposal.PieceSize != padreader.PaddedSize(deal.Transfer.Size).Padded() { return &ProviderDealRejectionInfo{ Reason: fmt.Sprintf("deal proposal piece size %d doesn't match padded piece size %d", deal.ClientDealProposal.Proposal.PieceSize, padreader.PaddedSize(deal.Transfer.Size).Padded()), }, nil @@ -539,12 +539,12 @@ func (m *MK12) processDeal(ctx context.Context, deal *ProviderDealState) (*Provi // Store the deal n, err := tx.Exec(`INSERT INTO market_mk12_deals (uuid, signed_proposal_cid, - proposal_signature, proposal, proposal_cid, piece_cid, + proposal_signature, proposal, proposal_cid, piece_cid, raw_size, piece_size, offline, verified, sp_id, start_epoch, end_epoch, client_peer_id, fast_retrieval, announce_to_ipni, url, url_headers, label) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19) ON CONFLICT (uuid) DO NOTHING`, - deal.DealUuid.String(), deal.SignedProposalCID.String(), sigByte, propJson, propCid, prop.PieceCID.String(), + deal.DealUuid.String(), deal.SignedProposalCID.String(), sigByte, propJson, propCid, prop.PieceCID.String(), deal.Transfer.Size, prop.PieceSize, deal.IsOffline, prop.VerifiedDeal, mid, prop.StartEpoch, prop.EndEpoch, deal.ClientPeerID.String(), deal.FastRetrieval, deal.AnnounceToIPNI, tInfo.URL, headers, b.Bytes()) @@ -560,7 +560,7 @@ func (m *MK12) processDeal(ctx context.Context, deal *ProviderDealState) (*Provi if !deal.IsOffline { var pieceID int64 // Attempt to select the piece ID first - err = tx.QueryRow(`SELECT id FROM parked_pieces WHERE piece_cid = $1`, prop.PieceCID.String()).Scan(&pieceID) + err = tx.QueryRow(`SELECT id FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2`, prop.PieceCID.String(), prop.PieceSize).Scan(&pieceID) if err != nil { if errors.Is(err, pgx.ErrNoRows) { @@ -703,18 +703,18 @@ FROM joined return false, xerrors.Errorf("failed to query market pipeline backpressure stats: %w", err) } - if cfg.MaxMarketRunningPipelines != 0 && runningPipelines > int64(cfg.MaxMarketRunningPipelines) { - log.Infow("backpressure", "reason", "too many running market pipelines", "running_pipelines", runningPipelines, "max", cfg.MaxMarketRunningPipelines) + if cfg.MaxMarketRunningPipelines.Get() != 0 && runningPipelines > int64(cfg.MaxMarketRunningPipelines.Get()) { + log.Infow("backpressure", "reason", "too many running market pipelines", "running_pipelines", runningPipelines, "max", cfg.MaxMarketRunningPipelines.Get()) return true, nil } - if cfg.MaxQueueDownload != 0 && downloadingPending > int64(cfg.MaxQueueDownload) { - log.Infow("backpressure", "reason", "too many pending downloads", "pending_downloads", downloadingPending, "max", cfg.MaxQueueDownload) + if cfg.MaxQueueDownload.Get() != 0 && downloadingPending > int64(cfg.MaxQueueDownload.Get()) { + log.Infow("backpressure", "reason", "too many pending downloads", "pending_downloads", downloadingPending, "max", cfg.MaxQueueDownload.Get()) return true, nil } - if cfg.MaxQueueCommP != 0 && verifyPending > int64(cfg.MaxQueueCommP) { - log.Infow("backpressure", "reason", "too many pending CommP tasks", "pending_commp", verifyPending, "max", cfg.MaxQueueCommP) + if cfg.MaxQueueCommP.Get() != 0 && verifyPending > int64(cfg.MaxQueueCommP.Get()) { + log.Infow("backpressure", "reason", "too many pending CommP tasks", "pending_commp", verifyPending, "max", cfg.MaxQueueCommP.Get()) return true, nil } @@ -750,18 +750,18 @@ FROM joined return false, xerrors.Errorf("counting buffered sectors: %w", err) } - if cfg.MaxQueueDealSector != 0 && waitDealSectors > cfg.MaxQueueDealSector { - log.Infow("backpressure", "reason", "too many wait deal sectors", "wait_deal_sectors", waitDealSectors, "max", cfg.MaxQueueDealSector) + if cfg.MaxQueueDealSector.Get() != 0 && waitDealSectors > cfg.MaxQueueDealSector.Get() { + log.Infow("backpressure", "reason", "too many wait deal sectors", "wait_deal_sectors", waitDealSectors, "max", cfg.MaxQueueDealSector.Get()) return true, nil } - if cfg.MaxQueueSnapEncode != 0 && bufferedEncode > cfg.MaxQueueSnapEncode { - log.Infow("backpressure", "reason", "too many encode tasks", "buffered", bufferedEncode, "max", cfg.MaxQueueSnapEncode) + if cfg.MaxQueueSnapEncode.Get() != 0 && bufferedEncode > cfg.MaxQueueSnapEncode.Get() { + log.Infow("backpressure", "reason", "too many encode tasks", "buffered", bufferedEncode, "max", cfg.MaxQueueSnapEncode.Get()) return true, nil } - if cfg.MaxQueueSnapProve != 0 && bufferedProve > cfg.MaxQueueSnapProve { - log.Infow("backpressure", "reason", "too many prove tasks", "buffered", bufferedProve, "max", cfg.MaxQueueSnapProve) + if cfg.MaxQueueSnapProve.Get() != 0 && bufferedProve > cfg.MaxQueueSnapProve.Get() { + log.Infow("backpressure", "reason", "too many prove tasks", "buffered", bufferedProve, "max", cfg.MaxQueueSnapProve.Get()) return true, nil } } else { @@ -802,21 +802,21 @@ FROM joined return false, xerrors.Errorf("counting buffered sectors: %w", err) } - if cfg.MaxQueueDealSector != 0 && waitDealSectors > cfg.MaxQueueDealSector { - log.Infow("backpressure", "reason", "too many wait deal sectors", "wait_deal_sectors", waitDealSectors, "max", cfg.MaxQueueDealSector) + if cfg.MaxQueueDealSector.Get() != 0 && waitDealSectors > cfg.MaxQueueDealSector.Get() { + log.Infow("backpressure", "reason", "too many wait deal sectors", "wait_deal_sectors", waitDealSectors, "max", cfg.MaxQueueDealSector.Get()) return true, nil } - if bufferedSDR > cfg.MaxQueueSDR { - log.Infow("backpressure", "reason", "too many SDR tasks", "buffered", bufferedSDR, "max", cfg.MaxQueueSDR) + if bufferedSDR > cfg.MaxQueueSDR.Get() { + log.Infow("backpressure", "reason", "too many SDR tasks", "buffered", bufferedSDR, "max", cfg.MaxQueueSDR.Get()) return true, nil } - if cfg.MaxQueueTrees != 0 && bufferedTrees > cfg.MaxQueueTrees { - log.Infow("backpressure", "reason", "too many tree tasks", "buffered", bufferedTrees, "max", cfg.MaxQueueTrees) + if cfg.MaxQueueTrees.Get() != 0 && bufferedTrees > cfg.MaxQueueTrees.Get() { + log.Infow("backpressure", "reason", "too many tree tasks", "buffered", bufferedTrees, "max", cfg.MaxQueueTrees.Get()) return true, nil } - if cfg.MaxQueuePoRep != 0 && bufferedPoRep > cfg.MaxQueuePoRep { - log.Infow("backpressure", "reason", "too many PoRep tasks", "buffered", bufferedPoRep, "max", cfg.MaxQueuePoRep) + if cfg.MaxQueuePoRep.Get() != 0 && bufferedPoRep > cfg.MaxQueuePoRep.Get() { + log.Infow("backpressure", "reason", "too many PoRep tasks", "buffered", bufferedPoRep, "max", cfg.MaxQueuePoRep.Get()) return true, nil } } diff --git a/market/mk20/client/auth.go b/market/mk20/client/auth.go new file mode 100644 index 000000000..fdc57984a --- /dev/null +++ b/market/mk20/client/auth.go @@ -0,0 +1,42 @@ +package client + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/base64" + "fmt" + "time" +) + +// Signer abstracts the signature operation (ed25519, secp256k1, …). +type Signer interface { + // Sign signs the supplied digest and returns raw signature bytes. + Sign(digest []byte) ([]byte, error) + // PublicKeyBytes returns the raw public‑key bytes (no multibase / address). + PublicKeyBytes() []byte + // Type returns a short string identifying the key algorithm ("ed25519", …). + Type() string +} + +// HourlyCurioAuthHeader returns a HTTPClient Option that injects “CurioAuth …” +// on every request using the algorithm defined in the OpenAPI spec. +func HourlyCurioAuthHeader(s Signer) Option { + return WithAuth(func(_ context.Context) (string, string, error) { + now := time.Now().UTC().Truncate(time.Hour) + msg := bytes.Join([][]byte{s.PublicKeyBytes(), []byte(now.Format(time.RFC3339))}, []byte{}) + digest := sha256.Sum256(msg) + + sig, err := s.Sign(digest[:]) + if err != nil { + return "", "", err + } + + header := fmt.Sprintf("CurioAuth %s:%s:%s", + s.Type(), + base64.StdEncoding.EncodeToString(s.PublicKeyBytes()), + base64.StdEncoding.EncodeToString(sig), + ) + return "Authorization", header, nil + }) +} diff --git a/market/mk20/client/client.go b/market/mk20/client/client.go new file mode 100644 index 000000000..f48762c73 --- /dev/null +++ b/market/mk20/client/client.go @@ -0,0 +1,538 @@ +package client + +import ( + "bytes" + "context" + "crypto/rand" + "io" + + "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log/v2" + "github.com/oklog/ulid" + "github.com/samber/lo" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + + "github.com/filecoin-project/curio/market/mk20" + + lapi "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/wallet" +) + +var log = logging.Logger("mk20-client") + +type Client struct { + http *HTTPClient +} + +func NewClient(baseURL string, client address.Address, wallet *wallet.LocalWallet) *Client { + s := NewAuth(client, wallet) + hclient := NewHTTPClient(baseURL, HourlyCurioAuthHeader(s)) + return &Client{ + http: hclient, + } +} + +func (c *Client) CreateDataSet(ctx context.Context, client, recordKeeper string, extraData []byte) (ulid.ULID, error) { + id, err := ulid.New(ulid.Now(), rand.Reader) + if err != nil { + return ulid.ULID{}, xerrors.Errorf("failed to create ULID: %w", err) + } + + deal := &mk20.Deal{ + Identifier: id, + Client: client, + Products: mk20.Products{ + PDPV1: &mk20.PDPV1{ + CreateDataSet: true, + RecordKeeper: recordKeeper, + ExtraData: extraData, + }, + }, + } + + rerr := c.http.Store(ctx, deal) + if rerr.Error != nil { + return ulid.ULID{}, rerr.Error + } + if rerr.Status != 200 { + return ulid.ULID{}, rerr.HError() + } + return id, nil +} + +func (c *Client) RemoveDataSet(ctx context.Context, client, recordKeeper string, extraData []byte, dataSetID *uint64) (ulid.ULID, error) { + if dataSetID == nil { + return ulid.ULID{}, nil + } + + id, err := ulid.New(ulid.Now(), rand.Reader) + if err != nil { + return ulid.ULID{}, xerrors.Errorf("failed to create ULID: %w", err) + } + + deal := &mk20.Deal{ + Identifier: id, + Client: client, + Products: mk20.Products{ + PDPV1: &mk20.PDPV1{ + DeleteDataSet: true, + DataSetID: dataSetID, + RecordKeeper: recordKeeper, + ExtraData: extraData, + }, + }, + } + + rerr := c.http.Store(ctx, deal) + if rerr.Error != nil { + return ulid.ULID{}, rerr.Error + } + if rerr.Status != 200 { + return ulid.ULID{}, rerr.HError() + } + return id, nil +} + +func (c *Client) addPiece(ctx context.Context, client, recordKeeper string, extraData []byte, dataSetID *uint64, dataSource *mk20.DataSource, ret *mk20.RetrievalV1) (ulid.ULID, error) { + if dataSetID == nil { + return ulid.ULID{}, nil + } + + id, err := ulid.New(ulid.Now(), rand.Reader) + if err != nil { + return ulid.ULID{}, xerrors.Errorf("failed to create ULID: %w", err) + } + + deal := &mk20.Deal{ + Identifier: id, + Client: client, + Data: dataSource, + Products: mk20.Products{ + PDPV1: &mk20.PDPV1{ + AddPiece: true, + DataSetID: dataSetID, + RecordKeeper: recordKeeper, + ExtraData: extraData, + }, + RetrievalV1: ret, + }, + } + + rerr := c.http.Store(ctx, deal) + if rerr.Error != nil { + return ulid.ULID{}, rerr.Error + } + if rerr.Status != 200 { + return ulid.ULID{}, rerr.HError() + } + return id, nil +} + +func (c *Client) RemovePiece(ctx context.Context, client, recordKeeper string, extraData []byte, dataSetID *uint64, pieceIDs []uint64) (ulid.ULID, error) { + if dataSetID == nil { + return ulid.ULID{}, xerrors.Errorf("dataSetID is required") + } + + if len(pieceIDs) == 0 { + return ulid.ULID{}, xerrors.Errorf("at least one pieceID is required") + } + + id, err := ulid.New(ulid.Now(), rand.Reader) + if err != nil { + return ulid.ULID{}, xerrors.Errorf("failed to create ULID: %w", err) + } + + deal := &mk20.Deal{ + Identifier: id, + Client: client, + Products: mk20.Products{ + PDPV1: &mk20.PDPV1{ + DeletePiece: true, + DataSetID: dataSetID, + RecordKeeper: recordKeeper, + ExtraData: extraData, + PieceIDs: pieceIDs, + }, + }, + } + + rerr := c.http.Store(ctx, deal) + if rerr.Error != nil { + return ulid.ULID{}, rerr.Error + } + if rerr.Status != 200 { + return ulid.ULID{}, rerr.HError() + } + return id, nil +} + +func (c *Client) CreateDataSource(pieceCID cid.Cid, car, raw, aggregate, index, withCDN bool, aggregateType mk20.AggregateType, sub []mk20.DataSource) (*mk20.Deal, error) { + if car && raw && aggregate || car && raw || car && aggregate || raw && aggregate { + return nil, xerrors.Errorf("only one data format is supported") + } + + acar := !lo.SomeBy(sub, func(s mk20.DataSource) bool { return s.Format.Car == nil }) + + if (!car && !acar) && (index || withCDN) { + return nil, xerrors.Errorf("only car data format supports IPFS style CDN retrievals") + } + + err := mk20.ValidatePieceCID(pieceCID) + if err != nil { + return nil, err + } + + dataSource := &mk20.DataSource{ + PieceCID: pieceCID, + } + + if car { + dataSource.Format.Car = &mk20.FormatCar{} + } + + if raw { + dataSource.Format.Raw = &mk20.FormatBytes{} + } + + if aggregate { + if len(sub) <= 1 { + return nil, xerrors.Errorf("must provide at least two sub data source") + } + + if aggregateType == mk20.AggregateTypeNone { + return nil, xerrors.Errorf("must provide valid aggregateType") + } + + dataSource.Format.Aggregate = &mk20.FormatAggregate{ + Type: aggregateType, + Sub: sub, + } + } + + ret := &mk20.Deal{ + Data: dataSource, + Products: mk20.Products{ + RetrievalV1: &mk20.RetrievalV1{ + Indexing: index, + AnnouncePiece: true, + AnnouncePayload: withCDN, + }, + }, + } + + return ret, nil +} + +func (c *Client) AddPieceWithHTTP(ctx context.Context, client, recordKeeper string, extraData []byte, dataSetID *uint64, pieceCID cid.Cid, car, raw, index, withCDN bool, aggregateType mk20.AggregateType, sub []mk20.DataSource, urls []mk20.HttpUrl) (ulid.ULID, error) { + var aggregate bool + + if aggregateType == mk20.AggregateTypeV1 { + aggregate = true + } + + d, err := c.CreateDataSource(pieceCID, car, raw, aggregate, index, withCDN, aggregateType, sub) + if err != nil { + return ulid.ULID{}, xerrors.Errorf("failed to create data source: %w", err) + } + + d.Data.SourceHTTP = &mk20.DataSourceHTTP{ + URLs: urls, + } + + return c.addPiece(ctx, client, recordKeeper, extraData, dataSetID, d.Data, d.Products.RetrievalV1) +} + +func (c *Client) AddPieceWithAggregate(ctx context.Context, client, recordKeeper string, extraData []byte, dataSetID *uint64, pieceCID cid.Cid, index, withCDN bool, aggregateType mk20.AggregateType, sub []mk20.DataSource) (ulid.ULID, error) { + d, err := c.CreateDataSource(pieceCID, false, false, true, index, withCDN, aggregateType, sub) + if err != nil { + return ulid.ULID{}, xerrors.Errorf("failed to create data source: %w", err) + } + + d.Data.SourceAggregate = &mk20.DataSourceAggregate{ + Pieces: sub, + } + + d.Data.Format.Aggregate.Sub = nil + + return c.addPiece(ctx, client, recordKeeper, extraData, dataSetID, d.Data, d.Products.RetrievalV1) +} + +func (c *Client) AddPieceWithPut(ctx context.Context, client, recordKeeper string, extraData []byte, dataSetID *uint64, pieceCID cid.Cid, car, raw, index, withCDN bool, aggregateType mk20.AggregateType, sub []mk20.DataSource) (ulid.ULID, error) { + var aggregate bool + + if aggregateType == mk20.AggregateTypeV1 { + aggregate = true + } + + d, err := c.CreateDataSource(pieceCID, car, raw, aggregate, index, withCDN, aggregateType, sub) + if err != nil { + return ulid.ULID{}, xerrors.Errorf("failed to create data source: %w", err) + } + + d.Data.SourceHttpPut = &mk20.DataSourceHttpPut{} + + return c.addPiece(ctx, client, recordKeeper, extraData, dataSetID, d.Data, d.Products.RetrievalV1) +} + +func (c *Client) AddPieceWithPutStreaming(ctx context.Context, client, recordKeeper string, extraData []byte, dataSetID *uint64, car, raw, aggregate, index, withCDN bool) (ulid.ULID, error) { + if car && raw && aggregate || car && raw || car && aggregate || raw && aggregate { + return ulid.ULID{}, xerrors.Errorf("only one data format is supported") + } + + if !car && (index || withCDN) { + return ulid.ULID{}, xerrors.Errorf("only car data format supports IPFS style CDN retrievals") + } + + ret := &mk20.RetrievalV1{ + Indexing: index, + AnnouncePiece: true, + AnnouncePayload: withCDN, + } + + return c.addPiece(ctx, client, recordKeeper, extraData, dataSetID, nil, ret) +} + +func (c *Client) DealStatus(ctx context.Context, dealID string) (*mk20.DealProductStatusResponse, error) { + id, err := ulid.Parse(dealID) + if err != nil { + return nil, xerrors.Errorf("parsing deal id: %w", err) + } + + status, rerr := c.http.Status(ctx, id) + if rerr.Error != nil { + return nil, rerr.Error + } + if rerr.Status != 200 { + return nil, rerr.HError() + } + + return status, nil +} + +func (c *Client) DealUpdate(ctx context.Context, dealID string, deal *mk20.Deal) error { + id, err := ulid.Parse(dealID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + rerr := c.http.Update(ctx, id, deal) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + return nil +} + +func (c *Client) DealUploadSerial(ctx context.Context, dealID string, r io.Reader) error { + id, err := ulid.Parse(dealID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + rerr := c.http.UploadSerial(ctx, id, r) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + return nil +} + +func (c *Client) DealUploadSerialFinalize(ctx context.Context, dealID string, deal *mk20.Deal) error { + id, err := ulid.Parse(dealID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + rerr := c.http.UploadSerialFinalize(ctx, id, deal) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + return nil +} + +func (c *Client) DealChunkUploadInit(ctx context.Context, dealID string, fileSize, chunkSize int64) error { + id, err := ulid.Parse(dealID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + metadata := &mk20.StartUpload{ + RawSize: uint64(fileSize), + ChunkSize: chunkSize, + } + rerr := c.http.UploadInit(ctx, id, metadata) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + return nil +} + +func (c *Client) DealChunkUpload(ctx context.Context, dealID string, chunk int, r io.Reader) error { + id, err := ulid.Parse(dealID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + rerr := c.http.UploadChunk(ctx, id, chunk, r) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + return nil +} + +func (c *Client) DealChunkUploadFinalize(ctx context.Context, dealID string, deal *mk20.Deal) error { + id, err := ulid.Parse(dealID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + rerr := c.http.UploadSerialFinalize(ctx, id, deal) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + return nil +} + +func (c *Client) DealChunkedUpload(ctx context.Context, dealID string, size, chunkSize int64, r io.ReaderAt) error { + id, err := ulid.Parse(dealID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + metadata := &mk20.StartUpload{ + RawSize: uint64(size), + ChunkSize: chunkSize, + } + + _, rerr := c.http.UploadStatus(ctx, id) + if rerr.Error != nil { + return rerr.Error + } + + if rerr.Status != 200 && rerr.Status != int(mk20.UploadStatusCodeUploadNotStarted) { + return rerr.HError() + } + + if rerr.Status == int(mk20.UploadStatusCodeUploadNotStarted) { + // Start the upload + rerr = c.http.UploadInit(ctx, id, metadata) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + } + + numChunks := int((size + chunkSize - 1) / chunkSize) + + for { + status, rerr := c.http.UploadStatus(ctx, id) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + + log.Debugw("upload status", "status", status) + + if status.TotalChunks != numChunks { + return xerrors.Errorf("expected %d chunks, got %d", numChunks, status.TotalChunks) + } + + if status.Missing == 0 { + break + } + + log.Warnw("missing chunks", "missing", status.Missing) + // Try to upload missing chunks + for _, chunk := range status.MissingChunks { + start := int64(chunk-1) * chunkSize + end := start + chunkSize + if end > size { + end = size + } + log.Debugw("uploading chunk", "start", start, "end", end) + buf := make([]byte, end-start) + _, err := r.ReadAt(buf, start) + if err != nil { + return xerrors.Errorf("failed to read chunk: %w", err) + } + + rerr = c.http.UploadChunk(ctx, id, chunk, bytes.NewReader(buf)) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + } + } + + log.Infow("upload complete") + + rerr = c.http.UploadFinalize(ctx, id, nil) + if rerr.Error != nil { + return rerr.Error + } + if rerr.Status != 200 { + return rerr.HError() + } + return nil +} + +func KeyFromClientAddress(clientAddress address.Address) (key string) { + switch clientAddress.Protocol() { + case address.BLS: + return "bls" + case address.SECP256K1: + return "secp256k1" + case address.Delegated: + return "delegated" + default: + return "" + } +} + +type ClientAuth struct { + client address.Address + wallet *wallet.LocalWallet +} + +func (c *ClientAuth) Sign(digest []byte) ([]byte, error) { + sign, err := c.wallet.WalletSign(context.Background(), c.client, digest, lapi.MsgMeta{Type: lapi.MTDealProposal}) + if err != nil { + return nil, err + } + + return sign.MarshalBinary() +} + +func (c *ClientAuth) PublicKeyBytes() []byte { + return c.client.Bytes() +} + +func (c *ClientAuth) Type() string { + return KeyFromClientAddress(c.client) +} + +var _ Signer = &ClientAuth{} + +func NewAuth(client address.Address, wallet *wallet.LocalWallet) Signer { + return &ClientAuth{ + client: client, + wallet: wallet, + } +} diff --git a/market/mk20/client/http_client.go b/market/mk20/client/http_client.go new file mode 100644 index 000000000..ad8a35ff4 --- /dev/null +++ b/market/mk20/client/http_client.go @@ -0,0 +1,237 @@ +package client + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "path" + "strconv" + "time" + + "github.com/oklog/ulid" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/market/mk20" +) + +const MarketPath = "/market/mk20" + +// HTTPClient is a thin wrapper around Curio Market 2.0 REST endpoints. +type HTTPClient struct { + BaseURL string + HTTP *http.Client + AuthHeader func(context.Context) (key string, value string, err error) +} + +// NewHTTPClient returns a HTTPClient with sane defaults. +func NewHTTPClient(baseURL string, opts ...Option) *HTTPClient { + c := &HTTPClient{ + BaseURL: baseURL + MarketPath, + HTTP: &http.Client{Timeout: 60 * time.Second}, + } + for _, o := range opts { + o(c) + } + return c +} + +// --- options --------------------------------------------------------------- + +type Option func(*HTTPClient) + +func WithAuth(h func(context.Context) (string, string, error)) Option { + return func(c *HTTPClient) { c.AuthHeader = h } +} + +// --- low‑level helper ------------------------------------------------------ + +func (c *HTTPClient) do(ctx context.Context, method, p string, body io.Reader, data bool, v any) *Error { + req, err := http.NewRequestWithContext(ctx, method, c.BaseURL+path.Clean("/"+p), body) + if err != nil { + return &Error{ + Status: 0, + Error: err, + } + } + + if c.AuthHeader == nil { + return &Error{ + Status: 0, + Error: xerrors.Errorf("auth header is required"), + } + } + + k, vHdr, err := c.AuthHeader(ctx) + if err != nil { + return &Error{ + Status: 0, + Error: err, + } + } + req.Header.Set(k, vHdr) + + if body != nil { + if !data { + req.Header.Set("Content-Type", "application/json") + } else { + req.Header.Set("Content-Type", "application/octet-stream") + } + } + + resp, err := c.HTTP.Do(req) + if err != nil { + return &Error{ + Status: 0, + Error: err, + } + } + defer func() { + _ = resp.Body.Close() + }() + + if resp.StatusCode != 200 { + msg, err := io.ReadAll(resp.Body) + if err != nil { + return &Error{Status: resp.StatusCode, Error: err} + } + return &Error{Status: resp.StatusCode, Message: string(msg)} + } + + if v != nil { + err = json.NewDecoder(resp.Body).Decode(v) + if err != nil { + return &Error{Status: resp.StatusCode, Error: err} + } + } + return &Error{Status: resp.StatusCode} +} + +// Error wraps non‑2xx responses. +type Error struct { + Status int + Message string + Error error +} + +func (e *Error) HError() error { + return xerrors.Errorf("%s", fmt.Sprintf("curio: %d – %s", e.Status, e.Message)) +} + +// --- public methods (one per path) ---------------------------------------- + +// /contracts +func (c *HTTPClient) Contracts(ctx context.Context) ([]string, *Error) { + var out []string + err := c.do(ctx, http.MethodGet, "/contracts", nil, false, &out) + return out, err +} + +// /products +func (c *HTTPClient) Products(ctx context.Context) ([]string, *Error) { + var out []string + err := c.do(ctx, http.MethodGet, "/products", nil, false, &out) + return out, err +} + +// /sources +func (c *HTTPClient) Sources(ctx context.Context) ([]string, *Error) { + var out []string + err := c.do(ctx, http.MethodGet, "/sources", nil, false, &out) + return out, err +} + +// /status/{id} +func (c *HTTPClient) Status(ctx context.Context, id ulid.ULID) (*mk20.DealProductStatusResponse, *Error) { + var out mk20.DealProductStatusResponse + err := c.do(ctx, http.MethodGet, "/status/"+id.String(), nil, false, &out) + return &out, err +} + +// /store (POST) +func (c *HTTPClient) Store(ctx context.Context, deal *mk20.Deal) *Error { + b, merr := json.Marshal(deal) + if merr != nil { + return &Error{Status: 0, Error: xerrors.Errorf("failed to marshal deal: %w", merr)} + } + err := c.do(ctx, http.MethodPost, "/store", bytes.NewReader(b), false, nil) + return err +} + +// /update/{id} (GET in spec – unusual, but honoured) +func (c *HTTPClient) Update(ctx context.Context, id ulid.ULID, deal *mk20.Deal) *Error { + b, merr := json.Marshal(deal) + if merr != nil { + return &Error{Status: 0, Error: xerrors.Errorf("failed to marshal deal: %w", merr)} + } + err := c.do(ctx, http.MethodGet, "/update/"+id.String(), bytes.NewReader(b), false, nil) + return err +} + +// Serial upload (small files) – PUT /upload/{id} +func (c *HTTPClient) UploadSerial(ctx context.Context, id ulid.ULID, r io.Reader) *Error { + err := c.do(ctx, http.MethodPut, "/upload/"+id.String(), r, true, nil) + return err +} + +// Finalize serial upload – POST /upload/{id} +func (c *HTTPClient) UploadSerialFinalize(ctx context.Context, id ulid.ULID, deal *mk20.Deal) *Error { + var err *Error + if deal != nil { + b, merr := json.Marshal(deal) + if merr != nil { + return &Error{Status: 0, Error: xerrors.Errorf("failed to marshal deal: %w", merr)} + } + err = c.do(ctx, http.MethodPost, "/upload/"+id.String(), bytes.NewReader(b), false, nil) + } else { + err = c.do(ctx, http.MethodPost, "/upload/"+id.String(), nil, false, nil) + } + + return err +} + +// Chunked upload workflow --------------------------------------------------- + +// POST /uploads/{id} +func (c *HTTPClient) UploadInit(ctx context.Context, id ulid.ULID, metadata *mk20.StartUpload) *Error { + if metadata == nil { + return &Error{Status: 0, Error: xerrors.Errorf("metadata is required")} + } + b, merr := json.Marshal(metadata) + if merr != nil { + return &Error{Status: 0, Error: xerrors.Errorf("failed to marshal deal: %w", merr)} + } + err := c.do(ctx, http.MethodPost, "/uploads/"+id.String(), bytes.NewReader(b), false, nil) + return err +} + +// PUT /uploads/{id}/{chunk} +func (c *HTTPClient) UploadChunk(ctx context.Context, id ulid.ULID, chunk int, data io.Reader) *Error { + path := "/uploads/" + id.String() + "/" + strconv.Itoa(chunk) + err := c.do(ctx, http.MethodPut, path, data, true, nil) + return err +} + +// GET /uploads/{id} +func (c *HTTPClient) UploadStatus(ctx context.Context, id ulid.ULID) (*mk20.UploadStatus, *Error) { + var out mk20.UploadStatus + err := c.do(ctx, http.MethodGet, "/uploads/"+id.String(), nil, false, &out) + return &out, err +} + +// POST /uploads/finalize/{id} +func (c *HTTPClient) UploadFinalize(ctx context.Context, id ulid.ULID, deal *mk20.Deal) *Error { + var err *Error + if deal != nil { + b, merr := json.Marshal(deal) + if merr != nil { + return &Error{Status: 0, Error: xerrors.Errorf("failed to marshal deal: %w", merr)} + } + err = c.do(ctx, http.MethodPost, "/uploads/finalize/"+id.String(), bytes.NewReader(b), false, nil) + } else { + err = c.do(ctx, http.MethodPost, "/uploads/finalize/"+id.String(), nil, false, nil) + } + return err +} diff --git a/market/mk20/ddo_v1.go b/market/mk20/ddo_v1.go new file mode 100644 index 000000000..65b9893ee --- /dev/null +++ b/market/mk20/ddo_v1.go @@ -0,0 +1,191 @@ +package mk20 + +import ( + "context" + "crypto/rand" + "errors" + "fmt" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum" + eabi "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/samber/lo" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/builtin/v16/verifreg" + + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" +) + +var ErrUnknowContract = errors.New("provider does not work with this market") + +// DDOV1 defines a structure for handling provider, client, and piece manager information with associated contract and notification details +// for a DDO deal handling. +type DDOV1 struct { + + // Provider specifies the address of the provider + Provider address.Address `json:"provider"` + + // Actor providing AuthorizeMessage (like f1/f3 wallet) able to authorize actions such as managing ACLs + PieceManager address.Address `json:"piece_manager"` + + // Duration represents the deal duration in epochs. This value is ignored for the deal with allocationID. + // It must be at least 518400 + Duration abi.ChainEpoch `json:"duration"` + + // AllocationId represents an allocation identifier for the deal. + AllocationId *verifreg.AllocationId `json:"allocation_id,omitempty"` + + // ContractAddress specifies the address of the contract governing the deal + ContractAddress string `json:"contract_address"` + + // ContractDealIDMethod specifies the method name to verify the deal and retrieve the deal ID for a contract + ContractVerifyMethod string `json:"contract_verify_method"` + + // ContractDealIDMethodParams represents encoded parameters for the contract verify method if required by the contract + ContractVerifyMethodParams []byte `json:"contract_verify_method_Params,omitempty"` + + // NotificationAddress specifies the address to which notifications will be relayed to when sector is activated + NotificationAddress string `json:"notification_address"` + + // NotificationPayload holds the notification data typically in a serialized byte array format. + NotificationPayload []byte `json:"notification_payload,omitempty"` +} + +func (d *DDOV1) Validate(db *harmonydb.DB, cfg *config.MK20Config) (DealCode, error) { + code, err := IsProductEnabled(db, d.ProductName()) + if err != nil { + return code, err + } + + if d.Provider == address.Undef || d.Provider.Empty() { + return ErrProductValidationFailed, xerrors.Errorf("provider address is not set") + } + + var mk20disabledMiners []address.Address + for _, m := range cfg.DisabledMiners { + maddr, err := address.NewFromString(m) + if err != nil { + return ErrServerInternalError, xerrors.Errorf("failed to parse miner string: %s", err) + } + mk20disabledMiners = append(mk20disabledMiners, maddr) + } + + if lo.Contains(mk20disabledMiners, d.Provider) { + return ErrProductValidationFailed, xerrors.Errorf("provider is disabled") + } + + if d.PieceManager == address.Undef || d.PieceManager.Empty() { + return ErrProductValidationFailed, xerrors.Errorf("piece manager address is not set") + } + + if d.AllocationId != nil { + if *d.AllocationId == verifreg.NoAllocationID { + return ErrProductValidationFailed, xerrors.Errorf("incorrect allocation id") + } + } + + if d.AllocationId == nil { + if d.Duration < 518400 { + return ErrDurationTooShort, xerrors.Errorf("duration must be at least 518400") + } + } + + if d.ContractAddress == "" { + return ErrProductValidationFailed, xerrors.Errorf("contract address is not set") + } + + if d.ContractAddress[0:2] != "0x" { + return ErrProductValidationFailed, xerrors.Errorf("contract address must start with 0x") + } + + if d.ContractVerifyMethodParams == nil { + return ErrProductValidationFailed, xerrors.Errorf("contract verify method params is not set") + } + + if d.ContractVerifyMethod == "" { + return ErrProductValidationFailed, xerrors.Errorf("contract verify method is not set") + } + + return Ok, nil +} + +func (d *DDOV1) GetDealID(ctx context.Context, db *harmonydb.DB, eth *ethclient.Client) (int64, DealCode, error) { + if d.ContractAddress == "0xtest" { + v, err := rand.Int(rand.Reader, big.NewInt(10000000)) + if err != nil { + return -1, ErrServerInternalError, xerrors.Errorf("failed to generate random number: %w", err) + } + return v.Int64(), Ok, nil + } + + var abiStr string + err := db.QueryRow(ctx, `SELECT abi FROM ddo_contracts WHERE address = $1`, d.ContractAddress).Scan(&abiStr) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return -1, ErrMarketNotEnabled, ErrUnknowContract + } + return -1, ErrServerInternalError, xerrors.Errorf("getting abi: %w", err) + } + + parsedABI, err := eabi.JSON(strings.NewReader(abiStr)) + if err != nil { + return -1, ErrServerInternalError, xerrors.Errorf("parsing abi: %w", err) + } + + to := common.HexToAddress(d.ContractAddress) + + // Get the method + method, exists := parsedABI.Methods[d.ContractVerifyMethod] + if !exists { + return -1, ErrServerInternalError, fmt.Errorf("method %s not found in ABI", d.ContractVerifyMethod) + } + + // Enforce method must take exactly one `bytes` parameter + if len(method.Inputs) != 1 || method.Inputs[0].Type.String() != "bytes" { + return -1, ErrServerInternalError, fmt.Errorf("method %q must take exactly one argument of type bytes", method.Name) + } + + // ABI-encode method call with input + callData, err := parsedABI.Pack(method.Name, d.ContractVerifyMethod) + if err != nil { + return -1, ErrServerInternalError, fmt.Errorf("failed to encode call data: %w", err) + } + + // Build call message + msg := ethereum.CallMsg{ + To: &to, + Data: callData, + } + + // Call contract + output, err := eth.CallContract(ctx, msg, nil) + if err != nil { + return -1, ErrServerInternalError, fmt.Errorf("eth_call failed: %w", err) + } + + // Decode return value (assume string) + var result int64 + if err := parsedABI.UnpackIntoInterface(&result, method.Name, output); err != nil { + return -1, ErrServerInternalError, fmt.Errorf("decode result: %w", err) + } + + if result == 0 { + return -1, ErrDealRejectedByMarket, fmt.Errorf("empty result from contract") + } + + return result, Ok, nil +} + +func (d *DDOV1) ProductName() ProductName { + return ProductNameDDOV1 +} + +var _ product = &DDOV1{} diff --git a/market/mk20/http/docs.go b/market/mk20/http/docs.go new file mode 100644 index 000000000..c64e6a6bb --- /dev/null +++ b/market/mk20/http/docs.go @@ -0,0 +1,1480 @@ +// Package http Code generated by swaggo/swag. DO NOT EDIT +package http + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": {}, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/contracts": { + "get": { + "description": "List of supported DDO contracts", + "summary": "List of supported DDO contracts", + "responses": { + "200": { + "description": "Array of contract addresses supported by a system or application.", + "schema": { + "$ref": "#/definitions/mk20.SupportedContracts" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/info/": { + "get": { + "description": "- OpenAPI spec UI for the Market 2.0 APIs", + "summary": "OpenAPI Spec UI", + "responses": {} + } + }, + "/info/swagger.json": { + "get": { + "description": "- OpenAPI spec for the Market 2.0 APIs in JSON format", + "summary": "OpenAPI Spec JSON", + "responses": {} + } + }, + "/info/swagger.yaml": { + "get": { + "description": "- OpenAPI spec for the Market 2.0 APIs in YAML format", + "summary": "OpenAPI Spec YAML", + "responses": {} + } + }, + "/products": { + "get": { + "description": "List of supported products", + "summary": "List of supported products", + "responses": { + "200": { + "description": "Array of products supported by the SP", + "schema": { + "$ref": "#/definitions/mk20.SupportedProducts" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/sources": { + "get": { + "description": "List of supported data sources", + "summary": "List of supported data sources", + "responses": { + "200": { + "description": "Array of dats sources supported by the SP", + "schema": { + "$ref": "#/definitions/mk20.SupportedDataSources" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/status/{id}": { + "get": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Current status of MK20 deal per product", + "summary": "Status of the MK20 deal", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "the status response for deal products with their respective deal statuses", + "schema": { + "$ref": "#/definitions/mk20.DealProductStatusResponse" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/store": { + "post": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Make a mk20 deal", + "consumes": [ + "application/json" + ], + "summary": "Make a mk20 deal", + "parameters": [ + { + "description": "mk20.Deal in json format", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/mk20.Deal" + } + } + ], + "responses": { + "200": { + "description": "Ok represents a successful operation with an HTTP status code of 200", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "422": { + "description": "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "423": { + "description": "ErrUnsupportedProduct indicates that the requested product is not supported by the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "424": { + "description": "ErrProductNotEnabled indicates that the requested product is not enabled on the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "425": { + "description": "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "426": { + "description": "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "429": { + "description": "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "430": { + "description": "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "440": { + "description": "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "441": { + "description": "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "500": { + "description": "ErrServerInternalError indicates an internal server error with a corresponding error code of 500", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "503": { + "description": "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + } + } + } + }, + "/update/{id}": { + "get": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Useful for adding adding additional products and updating PoRep duration", + "consumes": [ + "application/json" + ], + "summary": "Update the deal details of existing deals.", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "mk20.Deal in json format", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/mk20.Deal" + } + } + ], + "responses": { + "200": { + "description": "Ok represents a successful operation with an HTTP status code of 200", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "422": { + "description": "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "423": { + "description": "ErrUnsupportedProduct indicates that the requested product is not supported by the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "424": { + "description": "ErrProductNotEnabled indicates that the requested product is not enabled on the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "425": { + "description": "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "426": { + "description": "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "429": { + "description": "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "430": { + "description": "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "440": { + "description": "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "441": { + "description": "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "500": { + "description": "ErrServerInternalError indicates an internal server error with a corresponding error code of 500", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "503": { + "description": "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + } + } + } + }, + "/upload/{id}": { + "put": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Allows uploading data for deals in a single stream. Suitable for small deals.", + "consumes": [ + "application/octet-stream" + ], + "summary": "Upload the deal data", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "raw binary", + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "integer" + } + } + } + ], + "responses": { + "200": { + "description": "UploadOk indicates a successful upload operation, represented by the HTTP status code 200", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "UploadStartCodeDealNotFound represents a 404 status indicating the deal was not found during the upload start process", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + }, + "500": { + "description": "UploadServerError indicates a server-side error occurred during the upload process, represented by the HTTP status code 500", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + } + } + }, + "post": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Finalizes the serial upload process once data has been uploaded", + "consumes": [ + "application/json" + ], + "summary": "Finalizes the serial upload process", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "mk20.deal in json format", + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/mk20.Deal" + } + } + ], + "responses": { + "200": { + "description": "Ok represents a successful operation with an HTTP status code of 200", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "422": { + "description": "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "423": { + "description": "ErrUnsupportedProduct indicates that the requested product is not supported by the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "424": { + "description": "ErrProductNotEnabled indicates that the requested product is not enabled on the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "425": { + "description": "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "426": { + "description": "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "429": { + "description": "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "430": { + "description": "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "440": { + "description": "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "441": { + "description": "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "500": { + "description": "ErrServerInternalError indicates an internal server error with a corresponding error code of 500", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "503": { + "description": "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + } + } + } + }, + "/uploads/finalize/{id}": { + "post": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Finalizes the upload process once all the chunks are uploaded.", + "consumes": [ + "application/json" + ], + "summary": "Finalizes the upload process", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "mk20.deal in json format", + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/mk20.Deal" + } + } + ], + "responses": { + "200": { + "description": "Ok represents a successful operation with an HTTP status code of 200", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "422": { + "description": "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "423": { + "description": "ErrUnsupportedProduct indicates that the requested product is not supported by the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "424": { + "description": "ErrProductNotEnabled indicates that the requested product is not enabled on the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "425": { + "description": "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "426": { + "description": "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "429": { + "description": "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "430": { + "description": "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "440": { + "description": "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "441": { + "description": "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "500": { + "description": "ErrServerInternalError indicates an internal server error with a corresponding error code of 500", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "503": { + "description": "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + } + } + } + }, + "/uploads/{id}": { + "get": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Return a json struct detailing the current status of a deal upload.", + "summary": "Status of deal upload", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The status of a file upload process, including progress and missing chunks", + "schema": { + "$ref": "#/definitions/mk20.UploadStatus" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "UploadStatusCodeDealNotFound indicates that the requested deal was not found, corresponding to status code 404", + "schema": { + "$ref": "#/definitions/mk20.UploadStatusCode" + } + }, + "425": { + "description": "UploadStatusCodeUploadNotStarted indicates that the upload process has not started yet", + "schema": { + "$ref": "#/definitions/mk20.UploadStatusCode" + } + }, + "500": { + "description": "UploadStatusCodeServerError indicates an internal server error occurred during the upload process, corresponding to status code 500", + "schema": { + "$ref": "#/definitions/mk20.UploadStatusCode" + } + } + } + }, + "post": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Initializes the upload for a deal. Each upload must be initialized before chunks can be uploaded for a deal.", + "consumes": [ + "application/json" + ], + "summary": "Starts the upload process", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Metadata for initiating an upload operation", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/mk20.StartUpload" + } + } + ], + "responses": { + "200": { + "description": "UploadStartCodeOk indicates a successful upload start request with status code 200", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "UploadStartCodeDealNotFound represents a 404 status indicating the deal was not found during the upload start process", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + }, + "409": { + "description": "UploadStartCodeAlreadyStarted indicates that the upload process has already been initiated and cannot be started again", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + }, + "500": { + "description": "UploadStartCodeServerError indicates an error occurred on the server while processing an upload start request", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + } + } + } + }, + "/uploads/{id}/{chunkNum}": { + "put": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Allows uploading chunks for a deal file. Method can be called in parallel to speed up uploads.", + "consumes": [ + "application/octet-stream" + ], + "summary": "Upload a file chunk", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "chunkNum", + "name": "chunkNum", + "in": "path", + "required": true + }, + { + "description": "raw binary", + "name": "data", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "integer" + } + } + } + ], + "responses": { + "200": { + "description": "UploadOk indicates a successful upload operation, represented by the HTTP status code 200", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "UploadNotFound represents an error where the requested upload chunk could not be found, typically corresponding to HTTP status 404", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + }, + "409": { + "description": "UploadChunkAlreadyUploaded indicates that the chunk has already been uploaded and cannot be re-uploaded", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + }, + "500": { + "description": "UploadServerError indicates a server-side error occurred during the upload process, represented by the HTTP status code 500", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + } + } + } + } + }, + "definitions": { + "address.Address": { + "type": "object" + }, + "github_com_filecoin-project_go-state-types_builtin_v16_verifreg.AllocationId": { + "type": "integer", + "enum": [ + 0 + ], + "x-enum-varnames": [ + "NoAllocationID" + ] + }, + "http.Header": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "mk20.AggregateType": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "x-enum-varnames": [ + "AggregateTypeNone", + "AggregateTypeV1" + ] + }, + "mk20.DDOV1": { + "type": "object", + "properties": { + "allocation_id": { + "description": "AllocationId represents an allocation identifier for the deal.", + "allOf": [ + { + "$ref": "#/definitions/github_com_filecoin-project_go-state-types_builtin_v16_verifreg.AllocationId" + } + ] + }, + "contract_address": { + "description": "ContractAddress specifies the address of the contract governing the deal", + "type": "string" + }, + "contract_verify_method": { + "description": "ContractDealIDMethod specifies the method name to verify the deal and retrieve the deal ID for a contract", + "type": "string" + }, + "contract_verify_method_Params": { + "description": "ContractDealIDMethodParams represents encoded parameters for the contract verify method if required by the contract", + "type": "array", + "items": { + "type": "integer" + } + }, + "duration": { + "description": "Duration represents the deal duration in epochs. This value is ignored for the deal with allocationID.\nIt must be at least 518400", + "type": "integer" + }, + "notification_address": { + "description": "NotificationAddress specifies the address to which notifications will be relayed to when sector is activated", + "type": "string" + }, + "notification_payload": { + "description": "NotificationPayload holds the notification data typically in a serialized byte array format.", + "type": "array", + "items": { + "type": "integer" + } + }, + "piece_manager": { + "description": "Actor providing AuthorizeMessage (like f1/f3 wallet) able to authorize actions such as managing ACLs", + "allOf": [ + { + "$ref": "#/definitions/address.Address" + } + ] + }, + "provider": { + "description": "Provider specifies the address of the provider", + "allOf": [ + { + "$ref": "#/definitions/address.Address" + } + ] + } + } + }, + "mk20.DataSource": { + "type": "object", + "properties": { + "format": { + "description": "Format defines the format of the piece data, which can include CAR, Aggregate, or Raw formats.", + "allOf": [ + { + "$ref": "#/definitions/mk20.PieceDataFormat" + } + ] + }, + "piece_cid": { + "description": "PieceCID represents the unique identifier (pieceCID V2) for a piece of data, stored as a CID object.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "example": { + "/": "bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pq" + } + }, + "source_aggregate": { + "description": "SourceAggregate represents an aggregated source, comprising multiple data sources as pieces.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSourceAggregate" + } + ] + }, + "source_http": { + "description": "SourceHTTP represents the HTTP-based source of piece data within a deal, including raw size and URLs for retrieval.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSourceHTTP" + } + ] + }, + "source_http_put": { + "description": "SourceHttpPut allow clients to push piece data after deal is accepted", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSourceHttpPut" + } + ] + }, + "source_offline": { + "description": "SourceOffline defines the data source for offline pieces, including raw size information.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSourceOffline" + } + ] + } + } + }, + "mk20.DataSourceAggregate": { + "type": "object", + "properties": { + "pieces": { + "type": "array", + "items": { + "$ref": "#/definitions/mk20.DataSource" + } + } + } + }, + "mk20.DataSourceHTTP": { + "type": "object", + "properties": { + "urls": { + "description": "URLs lists the HTTP endpoints where the piece data can be fetched.", + "type": "array", + "items": { + "$ref": "#/definitions/mk20.HttpUrl" + } + } + } + }, + "mk20.DataSourceHttpPut": { + "type": "object" + }, + "mk20.DataSourceOffline": { + "type": "object" + }, + "mk20.Deal": { + "type": "object", + "properties": { + "client": { + "description": "Client wallet string for the deal", + "type": "string" + }, + "data": { + "description": "Data represents the source of piece data and associated metadata.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSource" + } + ] + }, + "identifier": { + "description": "Identifier represents a unique identifier for the deal in ULID format.", + "type": "string", + "format": "ulid", + "example": "01ARZ3NDEKTSV4RRFFQ69G5FAV" + }, + "products": { + "description": "Products represents a collection of product-specific information associated with a deal", + "allOf": [ + { + "$ref": "#/definitions/mk20.Products" + } + ] + } + } + }, + "mk20.DealCode": { + "type": "integer", + "enum": [ + 200, + 401, + 400, + 404, + 430, + 422, + 423, + 424, + 425, + 426, + 500, + 503, + 429, + 440, + 441 + ], + "x-enum-varnames": [ + "Ok", + "ErrUnAuthorized", + "ErrBadProposal", + "ErrDealNotFound", + "ErrMalformedDataSource", + "ErrUnsupportedDataSource", + "ErrUnsupportedProduct", + "ErrProductNotEnabled", + "ErrProductValidationFailed", + "ErrDealRejectedByMarket", + "ErrServerInternalError", + "ErrServiceMaintenance", + "ErrServiceOverloaded", + "ErrMarketNotEnabled", + "ErrDurationTooShort" + ] + }, + "mk20.DealProductStatusResponse": { + "type": "object", + "properties": { + "ddo_v1": { + "description": "DDOV1 holds the DealStatusResponse for product \"ddo_v1\".", + "allOf": [ + { + "$ref": "#/definitions/mk20.DealStatusResponse" + } + ] + }, + "pdp_v1": { + "description": "PDPV1 represents the DealStatusResponse for the product pdp_v1.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DealStatusResponse" + } + ] + } + } + }, + "mk20.DealState": { + "type": "string", + "enum": [ + "accepted", + "uploading", + "processing", + "sealing", + "indexing", + "failed", + "complete" + ], + "x-enum-varnames": [ + "DealStateAccepted", + "DealStateAwaitingUpload", + "DealStateProcessing", + "DealStateSealing", + "DealStateIndexing", + "DealStateFailed", + "DealStateComplete" + ] + }, + "mk20.DealStatusResponse": { + "type": "object", + "properties": { + "errorMsg": { + "description": "ErrorMsg is an optional field containing error details associated with the deal's current state if an error occurred.", + "type": "string" + }, + "status": { + "description": "State indicates the current processing state of the deal as a DealState value.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DealState" + } + ] + } + } + }, + "mk20.FormatAggregate": { + "type": "object", + "properties": { + "sub": { + "description": "Sub holds a slice of DataSource, representing details of sub pieces aggregated under this format.\nThe order must be same as segment index to avoid incorrect indexing of sub pieces in an aggregate", + "type": "array", + "items": { + "$ref": "#/definitions/mk20.DataSource" + } + }, + "type": { + "description": "Type specifies the type of aggregation for data pieces, represented by an AggregateType value.", + "allOf": [ + { + "$ref": "#/definitions/mk20.AggregateType" + } + ] + } + } + }, + "mk20.FormatBytes": { + "type": "object" + }, + "mk20.FormatCar": { + "type": "object" + }, + "mk20.HttpUrl": { + "type": "object", + "properties": { + "fallback": { + "description": "Fallback indicates whether this URL serves as a fallback option when other URLs fail.", + "type": "boolean" + }, + "headers": { + "description": "HTTPHeaders represents the HTTP headers associated with the URL.", + "allOf": [ + { + "$ref": "#/definitions/http.Header" + } + ] + }, + "priority": { + "description": "Priority indicates the order preference for using the URL in requests, with lower values having higher priority.", + "type": "integer" + }, + "url": { + "description": "URL specifies the HTTP endpoint where the piece data can be fetched.", + "type": "string" + } + } + }, + "mk20.PDPV1": { + "type": "object", + "properties": { + "add_piece": { + "description": "AddPiece indicated that this deal is meant to add Piece to a given DataSet. DataSetID must be defined.", + "type": "boolean" + }, + "create_data_set": { + "description": "CreateDataSet indicated that this deal is meant to create a new DataSet for the client by storage provider.", + "type": "boolean" + }, + "data_set_id": { + "description": "DataSetID is PDP verified contract dataset ID. It must be defined for all deals except when CreateDataSet is true.", + "type": "integer" + }, + "delete_data_set": { + "description": "DeleteDataSet indicated that this deal is meant to delete an existing DataSet created by SP for the client.\nDataSetID must be defined.", + "type": "boolean" + }, + "delete_piece": { + "description": "DeletePiece indicates whether the Piece of the data should be deleted. DataSetID must be defined.", + "type": "boolean" + }, + "extra_data": { + "description": "ExtraData can be used to send additional information to service contract when Verifier action like AddPiece, DeletePiece, etc. are performed.", + "type": "array", + "items": { + "type": "integer" + } + }, + "piece_ids": { + "description": "PieceIDs is a list of Piece ids in a proof set.", + "type": "array", + "items": { + "type": "integer" + } + }, + "record_keeper": { + "description": "RecordKeeper specifies the record keeper contract address for the new PDP dataset.", + "type": "string" + } + } + }, + "mk20.PieceDataFormat": { + "type": "object", + "properties": { + "aggregate": { + "description": "Aggregate holds a reference to the aggregated format of piece data.", + "allOf": [ + { + "$ref": "#/definitions/mk20.FormatAggregate" + } + ] + }, + "car": { + "description": "Car represents the optional CAR file format.", + "allOf": [ + { + "$ref": "#/definitions/mk20.FormatCar" + } + ] + }, + "raw": { + "description": "Raw represents the raw format of the piece data, encapsulated as bytes.", + "allOf": [ + { + "$ref": "#/definitions/mk20.FormatBytes" + } + ] + } + } + }, + "mk20.Products": { + "type": "object", + "properties": { + "ddo_v1": { + "description": "DDOV1 represents a product v1 configuration for Direct Data Onboarding (DDO)", + "allOf": [ + { + "$ref": "#/definitions/mk20.DDOV1" + } + ] + }, + "pdp_v1": { + "description": "PDPV1 represents product-specific configuration for PDP version 1 deals.", + "allOf": [ + { + "$ref": "#/definitions/mk20.PDPV1" + } + ] + }, + "retrieval_v1": { + "description": "RetrievalV1 represents configuration for retrieval settings in the system, including indexing and announcement flags.", + "allOf": [ + { + "$ref": "#/definitions/mk20.RetrievalV1" + } + ] + } + } + }, + "mk20.RetrievalV1": { + "type": "object", + "properties": { + "announce_payload": { + "description": "AnnouncePayload indicates whether the payload should be announced to IPNI.", + "type": "boolean" + }, + "announce_piece": { + "description": "AnnouncePiece indicates whether the piece information should be announced to IPNI.", + "type": "boolean" + }, + "indexing": { + "description": "Indexing indicates if the deal is to be indexed in the provider's system to support CIDs based retrieval", + "type": "boolean" + } + } + }, + "mk20.StartUpload": { + "type": "object", + "properties": { + "chunk_size": { + "description": "ChunkSize defines the size of each data chunk to be used during the upload process.", + "type": "integer" + }, + "raw_size": { + "description": "RawSize indicates the total size of the data to be uploaded in bytes.", + "type": "integer" + } + } + }, + "mk20.SupportedContracts": { + "type": "object", + "properties": { + "contracts": { + "description": "Contracts represents a list of supported contract addresses in string format.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "mk20.SupportedDataSources": { + "type": "object", + "properties": { + "sources": { + "description": "Contracts represents a list of supported contract addresses in string format.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "mk20.SupportedProducts": { + "type": "object", + "properties": { + "products": { + "description": "Contracts represents a list of supported contract addresses in string format.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "mk20.UploadCode": { + "type": "integer", + "enum": [ + 200, + 400, + 404, + 409, + 500, + 429 + ], + "x-enum-varnames": [ + "UploadOk", + "UploadBadRequest", + "UploadNotFound", + "UploadChunkAlreadyUploaded", + "UploadServerError", + "UploadRateLimit" + ] + }, + "mk20.UploadStartCode": { + "type": "integer", + "enum": [ + 200, + 400, + 404, + 409, + 500 + ], + "x-enum-varnames": [ + "UploadStartCodeOk", + "UploadStartCodeBadRequest", + "UploadStartCodeDealNotFound", + "UploadStartCodeAlreadyStarted", + "UploadStartCodeServerError" + ] + }, + "mk20.UploadStatus": { + "type": "object", + "properties": { + "missing": { + "description": "Missing represents the number of chunks that are not yet uploaded.", + "type": "integer" + }, + "missing_chunks": { + "description": "MissingChunks is a slice containing the indices of missing chunks.", + "type": "array", + "items": { + "type": "integer" + } + }, + "total_chunks": { + "description": "TotalChunks represents the total number of chunks required for the upload.", + "type": "integer" + }, + "uploaded": { + "description": "Uploaded represents the number of chunks successfully uploaded.", + "type": "integer" + }, + "uploaded_chunks": { + "description": "UploadedChunks is a slice containing the indices of successfully uploaded chunks.", + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "mk20.UploadStatusCode": { + "type": "integer", + "enum": [ + 200, + 404, + 425, + 500 + ], + "x-enum-varnames": [ + "UploadStatusCodeOk", + "UploadStatusCodeDealNotFound", + "UploadStatusCodeUploadNotStarted", + "UploadStatusCodeServerError" + ] + } + }, + "securityDefinitions": { + "CurioAuth": { + "description": "Use the format: ` + "`" + `CurioAuth PublicKeyType:PublicKey:Signature` + "`" + `\n\n- ` + "`" + `PublicKeyType` + "`" + `: String representation of type of wallet (e.g., \"ed25519\", \"bls\", \"secp256k1\")\n- ` + "`" + `PublicKey` + "`" + `: Base64 string of public key bytes\n- ` + "`" + `Signature` + "`" + `: Signature is Base64 string of signature bytes.\n- The client is expected to sign the SHA-256 hash of a message constructed by concatenating the following components, in order.\n- The raw public key bytes (not a human-readable address)\n- The timestamp, truncated to the nearest hour, formatted in RFC3339 (e.g., 2025-07-15T17:00:00Z)\n- These two byte slices are joined without any delimiter between them, and the resulting byte array is then hashed using SHA-256. The signature is performed on that hash.", + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "", + Host: "", + BasePath: "", + Schemes: []string{}, + Title: "Curio Market 2.0 API", + Description: "Curio market APIs", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/market/mk20/http/http.go b/market/mk20/http/http.go new file mode 100644 index 000000000..44a6e016b --- /dev/null +++ b/market/mk20/http/http.go @@ -0,0 +1,844 @@ +package http + +import ( + "bytes" + "context" + "embed" + "encoding/json" + "fmt" + "io" + "net/http" + "runtime" + "runtime/debug" + "strconv" + "time" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/httprate" + logging "github.com/ipfs/go-log/v2" + "github.com/oklog/ulid" + httpSwagger "github.com/swaggo/http-swagger/v2" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/market/mk20" + storage_market "github.com/filecoin-project/curio/tasks/storage-market" +) + +//go:embed swagger.yaml swagger.json docs.go +var swaggerAssets embed.FS + +var log = logging.Logger("mk20httphdlr") + +const version = "1.0.0" + +const requestTimeout = 10 * time.Second + +type MK20DealHandler struct { + cfg *config.CurioConfig + db *harmonydb.DB // Replace with your actual DB wrapper if different + dm *storage_market.CurioStorageDealMarket + disabledMiners []address.Address +} + +func NewMK20DealHandler(db *harmonydb.DB, cfg *config.CurioConfig, dm *storage_market.CurioStorageDealMarket) (*MK20DealHandler, error) { + var disabledMiners []address.Address + for _, m := range cfg.Market.StorageMarketConfig.MK12.DisabledMiners { + maddr, err := address.NewFromString(m) + if err != nil { + return nil, xerrors.Errorf("failed to parse miner string: %s", err) + } + disabledMiners = append(disabledMiners, maddr) + } + return &MK20DealHandler{db: db, dm: dm, cfg: cfg, disabledMiners: disabledMiners}, nil +} + +func dealRateLimitMiddleware() func(http.Handler) http.Handler { + return httprate.LimitByIP(50, 1*time.Second) +} + +func AuthMiddleware(db *harmonydb.DB, cfg *config.CurioConfig) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + authHeader := r.Header.Get("Authorization") + if authHeader == "" { + http.Error(w, "Missing Authorization header", http.StatusUnauthorized) + return + } + + allowed, client, err := mk20.Auth(authHeader, db, cfg) + if err != nil { + log.Errorw("failed to authenticate request", "err", err) + http.Error(w, "Error during authentication: "+err.Error(), http.StatusInternalServerError) + return + } + + if !allowed { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + idStr := chi.URLParam(r, "id") + if idStr != "" { + allowed, err := mk20.AuthenticateClient(db, idStr, client) + if err != nil { + log.Errorw("failed to authenticate client", "err", err) + http.Error(w, err.Error(), http.StatusUnauthorized) + return + } + if !allowed { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + } + + next.ServeHTTP(w, r) + }) + } +} + +// @title Curio Market 2.0 API +// @description Curio market APIs +func Router(mdh *MK20DealHandler, domainName string) http.Handler { + SwaggerInfo.BasePath = "/market/mk20" + SwaggerInfo.Host = domainName + SwaggerInfo.Version = version + SwaggerInfo.Schemes = []string{"https"} + mux := chi.NewRouter() + mux.Use(dealRateLimitMiddleware()) + mux.Mount("/", APIRouter(mdh)) + mux.Mount("/info", InfoRouter()) + return mux +} + +// @securityDefinitions.apikey CurioAuth +// @in header +// @name Authorization +// @description Use the format: `CurioAuth PublicKeyType:PublicKey:Signature` +// @description +// @description - `PublicKeyType`: String representation of type of wallet (e.g., "ed25519", "bls", "secp256k1") +// @description - `PublicKey`: Base64 string of public key bytes +// @description - `Signature`: Signature is Base64 string of signature bytes. +// @description - The client is expected to sign the SHA-256 hash of a message constructed by concatenating the following components, in order. +// @description - The raw public key bytes (not a human-readable address) +// @description - The timestamp, truncated to the nearest hour, formatted in RFC3339 (e.g., 2025-07-15T17:00:00Z) +// @description - These two byte slices are joined without any delimiter between them, and the resulting byte array is then hashed using SHA-256. The signature is performed on that hash. +func APIRouter(mdh *MK20DealHandler) http.Handler { + mux := chi.NewRouter() + mux.Use(dealRateLimitMiddleware()) + mux.Use(AuthMiddleware(mdh.db, mdh.cfg)) + mux.Method("POST", "/store", http.TimeoutHandler(http.HandlerFunc(mdh.mk20deal), requestTimeout, "request timeout")) + mux.Method("GET", "/status/{id}", http.TimeoutHandler(http.HandlerFunc(mdh.mk20status), requestTimeout, "request timeout")) + mux.Method("POST", "/uploads/{id}", http.TimeoutHandler(http.HandlerFunc(mdh.mk20UploadStart), requestTimeout, "request timeout")) + mux.Method("GET", "/uploads/{id}", http.TimeoutHandler(http.HandlerFunc(mdh.mk20UploadStatus), requestTimeout, "request timeout")) + mux.Put("/uploads/{id}/{chunkNum}", mdh.mk20UploadDealChunks) + mux.Method("POST", "/uploads/finalize/{id}", http.TimeoutHandler(http.HandlerFunc(mdh.mk20FinalizeUpload), requestTimeout, "request timeout")) + mux.Method("POST", "/update/{id}", http.TimeoutHandler(http.HandlerFunc(mdh.mk20UpdateDeal), requestTimeout, "request timeout")) + mux.Method("POST", "/upload/{id}", http.TimeoutHandler(http.HandlerFunc(mdh.mk20SerialUploadFinalize), requestTimeout, "request timeout")) + mux.Method("GET", "/products", http.TimeoutHandler(http.HandlerFunc(mdh.supportedProducts), requestTimeout, "request timeout")) + mux.Method("GET", "/sources", http.TimeoutHandler(http.HandlerFunc(mdh.supportedDataSources), requestTimeout, "request timeout")) + mux.Method("GET", "/contracts", http.TimeoutHandler(http.HandlerFunc(mdh.mk20supportedContracts), requestTimeout, "request timeout")) + mux.Put("/upload/{id}", mdh.mk20SerialUpload) + return mux +} + +// InfoRouter serves OpenAPI specs UI +// @name info +// @Summary OpenAPI Spec UI +// @description - OpenAPI spec UI for the Market 2.0 APIs +// @Router /info/ [get] +// @BasePath /market/mk20 +func InfoRouter() http.Handler { + mux := chi.NewRouter() + mux.Get("/*", httpSwagger.Handler()) + mux.Get("/swagger.yaml", swaggerYaml) + mux.Get("/swagger.json", swaggerJson) + return mux +} + +// @name OpenAPI Spec +// @Summary OpenAPI Spec YAML +// @description - OpenAPI spec for the Market 2.0 APIs in YAML format +// @Router /info/swagger.yaml [get] +func swaggerYaml(w http.ResponseWriter, r *http.Request) { + swaggerYAML, err := swaggerAssets.ReadFile("swagger.yaml") + if err != nil { + log.Errorw("failed to read swagger.yaml", "err", err) + http.Error(w, "failed to read swagger.yaml", http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/x-yaml") + _, _ = w.Write(swaggerYAML) +} + +// @name OpenAPI Spec +// @Summary OpenAPI Spec JSON +// @description - OpenAPI spec for the Market 2.0 APIs in JSON format +// @Router /info/swagger.json [get] +func swaggerJson(w http.ResponseWriter, r *http.Request) { + swaggerJSON, err := swaggerAssets.ReadFile("swagger.json") + if err != nil { + log.Errorw("failed to read swagger.json", "err", err) + http.Error(w, "", http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(swaggerJSON) +} + +// mk20deal handles HTTP requests to process MK20 deals, parses the request body, validates it, and executes the deal logic. +// @Router /store [post] +// @Summary Make a mk20 deal +// @Description Make a mk20 deal +// @BasePath /market/mk20 +// @Param body body mk20.Deal true "mk20.Deal in json format" +// @Accept json +// @Failure 200 {object} mk20.DealCode "Ok represents a successful operation with an HTTP status code of 200" +// @Failure 400 {object} mk20.DealCode "ErrBadProposal represents a validation error that indicates an invalid or malformed proposal input in the context of validation logic" +// @Failure 404 {object} mk20.DealCode "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404" +// @Failure 430 {object} mk20.DealCode "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data" +// @Failure 422 {object} mk20.DealCode "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context" +// @Failure 423 {object} mk20.DealCode "ErrUnsupportedProduct indicates that the requested product is not supported by the provider" +// @Failure 424 {object} mk20.DealCode "ErrProductNotEnabled indicates that the requested product is not enabled on the provider" +// @Failure 425 {object} mk20.DealCode "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data" +// @Failure 426 {object} mk20.DealCode "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules" +// @Failure 500 {object} mk20.DealCode "ErrServerInternalError indicates an internal server error with a corresponding error code of 500" +// @Failure 503 {object} mk20.DealCode "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503" +// @Failure 429 {object} mk20.DealCode "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment" +// @Failure 440 {object} mk20.DealCode "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation" +// @Failure 441 {object} mk20.DealCode "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20deal(w http.ResponseWriter, r *http.Request) { + defer func() { + if r := recover(); r != nil { + trace := make([]byte, 1<<16) + n := runtime.Stack(trace, false) + log.Errorf("panic occurred in mk20deal: %v\n%s", r, trace[:n]) + debug.PrintStack() + } + }() + + ct := r.Header.Get("Content-Type") + var deal mk20.Deal + if ct != "application/json" { + log.Errorf("invalid content type: %s", ct) + http.Error(w, "invalid content type", http.StatusBadRequest) + return + } + + defer func() { + _ = r.Body.Close() + }() + + body, err := io.ReadAll(r.Body) + if err != nil { + log.Errorf("error reading request body: %s", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + log.Infow("received deal proposal", "body", string(body)) + + err = json.Unmarshal(body, &deal) + if err != nil { + log.Errorf("error unmarshaling json: %s", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + authHeader := r.Header.Get("Authorization") + if authHeader == "" { + http.Error(w, "Missing Authorization header", http.StatusUnauthorized) + return + } + + result := mdh.dm.MK20Handler.ExecuteDeal(context.Background(), &deal, authHeader) + + log.Infow("deal processed", + "id", deal.Identifier, + "HTTPCode", result.HTTPCode, + "Reason", result.Reason) + + w.WriteHeader(int(result.HTTPCode)) + _, err = fmt.Fprint(w, "Reason: ", result.Reason) + if err != nil { + log.Errorw("writing deal response:", "id", deal.Identifier, "error", err) + } +} + +// mk20status handles HTTP requests to fetch the status of a deal by its ID and responding with JSON-encoded results. +// @Router /status/{id} [get] +// @Summary Status of the MK20 deal +// @Description Current status of MK20 deal per product +// @BasePath /market/mk20 +// @Param id path string true "id" +// @Failure 200 {object} mk20.DealProductStatusResponse "the status response for deal products with their respective deal statuses" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @Failure 500 {string} string "Internal Server Error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20status(w http.ResponseWriter, r *http.Request) { + idStr := chi.URLParam(r, "id") + if idStr == "" { + log.Errorw("missing id in url", "url", r.URL) + http.Error(w, "missing id in url", http.StatusBadRequest) + return + } + id, err := ulid.Parse(idStr) + if err != nil { + log.Errorw("invalid id in url", "id", idStr, "err", err) + http.Error(w, "invalid id in url", http.StatusBadRequest) + return + } + + result := mdh.dm.MK20Handler.DealStatus(context.Background(), id) + + if result.HTTPCode != http.StatusOK { + w.WriteHeader(result.HTTPCode) + return + } + + resp, err := json.Marshal(result.Response) + if err != nil { + log.Errorw("failed to marshal deal status response", "id", idStr, "err", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + _, err = w.Write(resp) + if err != nil { + log.Errorw("failed to write deal status response", "id", idStr, "err", err) + } +} + +// mk20supportedContracts handles HTTP requests to retrieve supported contract addresses and returns them in a JSON response. +// @Router /contracts [get] +// @Summary List of supported DDO contracts +// @Description List of supported DDO contracts +// @BasePath /market/mk20 +// @Failure 200 {object} mk20.SupportedContracts "Array of contract addresses supported by a system or application." +// @Failure 500 {string} string "Internal Server Error" +func (mdh *MK20DealHandler) mk20supportedContracts(w http.ResponseWriter, r *http.Request) { + var contracts mk20.SupportedContracts + //err := mdh.db.Select(r.Context(), &contracts, "SELECT address FROM ddo_contracts") + //if err != nil { + // if errors.Is(err, pgx.ErrNoRows) { + // log.Errorw("no supported contracts found") + // http.Error(w, "no supported contracts found", http.StatusNotFound) + // return + // } + // log.Errorw("failed to get supported contracts", "err", err) + // w.WriteHeader(http.StatusInternalServerError) + // return + //} + w.WriteHeader(http.StatusOK) + // Write a json array + resp, err := json.Marshal(contracts) + if err != nil { + log.Errorw("failed to marshal supported contracts", "err", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + _, err = w.Write(resp) + if err != nil { + log.Errorw("failed to write supported contracts", "err", err) + } +} + +// supportedProducts handles HTTP requests to retrieve a list of supported MK20 products and returns them in a JSON response. +// @Router /products [get] +// @Summary List of supported products +// @Description List of supported products +// @BasePath /market/mk20 +// @Failure 500 {string} string "Internal Server Error" +// @Failure 200 {object} mk20.SupportedProducts "Array of products supported by the SP" +func (mdh *MK20DealHandler) supportedProducts(w http.ResponseWriter, r *http.Request) { + prods, _, err := mdh.dm.MK20Handler.Supported(r.Context()) + if err != nil { + log.Errorw("failed to get supported producers and sources", "err", err) + http.Error(w, "", http.StatusInternalServerError) + return + } + var products mk20.SupportedProducts + for k, v := range prods { + if v { + products.Products = append(products.Products, k) + } + } + resp, err := json.Marshal(products) + if err != nil { + log.Errorw("failed to marshal supported products", "err", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + _, err = w.Write(resp) + if err != nil { + log.Errorw("failed to write supported products", "err", err) + } +} + +// supportedDataSources handles HTTP requests to retrieve the supported data sources in JSON format. +// @Router /sources [get] +// @Summary List of supported data sources +// @Description List of supported data sources +// @BasePath /market/mk20 +// @Failure 500 {string} string "Internal Server Error" +// @Failure 200 {object} mk20.SupportedDataSources "Array of dats sources supported by the SP" +func (mdh *MK20DealHandler) supportedDataSources(w http.ResponseWriter, r *http.Request) { + _, srcs, err := mdh.dm.MK20Handler.Supported(r.Context()) + if err != nil { + log.Errorw("failed to get supported producers and sources", "err", err) + http.Error(w, "", http.StatusInternalServerError) + return + } + var sources mk20.SupportedDataSources + for k, v := range srcs { + if v { + sources.Sources = append(sources.Sources, k) + } + } + resp, err := json.Marshal(sources) + if err != nil { + log.Errorw("failed to marshal supported sources", "err", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + _, err = w.Write(resp) + if err != nil { + log.Errorw("failed to write supported sources", "err", err) + } +} + +// mk20UploadStatus handles the upload status requests for a given id. +// @Router /uploads/{id} [get] +// @Param id path string true "id" +// @Summary Status of deal upload +// @Description Return a json struct detailing the current status of a deal upload. +// @BasePath /market/mk20 +// @Failure 200 {object} mk20.UploadStatus "The status of a file upload process, including progress and missing chunks" +// @Failure 404 {object} mk20.UploadStatusCode "UploadStatusCodeDealNotFound indicates that the requested deal was not found, corresponding to status code 404" +// @Failure 425 {object} mk20.UploadStatusCode "UploadStatusCodeUploadNotStarted indicates that the upload process has not started yet" +// @Failure 500 {object} mk20.UploadStatusCode "UploadStatusCodeServerError indicates an internal server error occurred during the upload process, corresponding to status code 500" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20UploadStatus(w http.ResponseWriter, r *http.Request) { + idStr := chi.URLParam(r, "id") + if idStr == "" { + log.Errorw("missing id in url", "url", r.URL) + http.Error(w, "missing id in url", http.StatusBadRequest) + return + } + id, err := ulid.Parse(idStr) + if err != nil { + log.Errorw("invalid id in url", "id", idStr, "err", err) + http.Error(w, "invalid id in url", http.StatusBadRequest) + return + } + mdh.dm.MK20Handler.HandleUploadStatus(r.Context(), id, w) +} + +// mk20UploadDealChunks handles uploading of deal file chunks. +// @Router /uploads/{id}/{chunkNum} [put] +// @Summary Upload a file chunk +// @Description Allows uploading chunks for a deal file. Method can be called in parallel to speed up uploads. +// @BasePath /market/mk20 +// @Param id path string true "id" +// @Param chunkNum path string true "chunkNum" +// @Accept octet-stream +// @Param data body []byte true "raw binary" +// @Failure 200 {object} mk20.UploadCode "UploadOk indicates a successful upload operation, represented by the HTTP status code 200" +// @Failure 400 {object} mk20.UploadCode "UploadBadRequest represents a bad request error with an HTTP status code of 400" +// @Failure 404 {object} mk20.UploadCode "UploadNotFound represents an error where the requested upload chunk could not be found, typically corresponding to HTTP status 404" +// @Failure 409 {object} mk20.UploadCode "UploadChunkAlreadyUploaded indicates that the chunk has already been uploaded and cannot be re-uploaded" +// @Failure 500 {object} mk20.UploadCode "UploadServerError indicates a server-side error occurred during the upload process, represented by the HTTP status code 500" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20UploadDealChunks(w http.ResponseWriter, r *http.Request) { + ct := r.Header.Get("Content-Type") + if ct != "application/octet-stream" { + log.Errorw("invalid content type", "ct", ct) + http.Error(w, "invalid content type", http.StatusBadRequest) + return + } + + idStr := chi.URLParam(r, "id") + if idStr == "" { + log.Errorw("missing id in url", "url", r.URL) + http.Error(w, "missing id in url", http.StatusBadRequest) + return + } + id, err := ulid.Parse(idStr) + if err != nil { + log.Errorw("invalid id in url", "id", idStr, "err", err) + http.Error(w, "invalid id in url", http.StatusBadRequest) + return + } + + chunk := chi.URLParam(r, "chunkNum") + if chunk == "" { + log.Errorw("missing chunk number in url", "url", r.URL) + http.Error(w, "missing chunk number in url", http.StatusBadRequest) + return + } + + chunkNum, err := strconv.Atoi(chunk) + if err != nil { + log.Errorw("invalid chunk number in url", "url", r.URL) + http.Error(w, "invalid chunk number in url", http.StatusBadRequest) + return + } + + mdh.dm.MK20Handler.HandleUploadChunk(id, chunkNum, r.Body, w) +} + +// mk20UploadStart handles the initiation of an upload process for MK20 deal data. +// @Router /uploads/{id} [post] +// @Summary Starts the upload process +// @Description Initializes the upload for a deal. Each upload must be initialized before chunks can be uploaded for a deal. +// @BasePath /market/mk20 +// @Accept json +// @Param id path string true "id" +// @Param data body mk20.StartUpload true "Metadata for initiating an upload operation" +// @Failure 200 {object} mk20.UploadStartCode "UploadStartCodeOk indicates a successful upload start request with status code 200" +// @Failure 400 {object} mk20.UploadStartCode "UploadStartCodeBadRequest indicates a bad upload start request error with status code 400" +// @Failure 404 {object} mk20.UploadStartCode "UploadStartCodeDealNotFound represents a 404 status indicating the deal was not found during the upload start process" +// @Failure 409 {object} mk20.UploadStartCode "UploadStartCodeAlreadyStarted indicates that the upload process has already been initiated and cannot be started again" +// @Failure 500 {object} mk20.UploadStartCode "UploadStartCodeServerError indicates an error occurred on the server while processing an upload start request" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20UploadStart(w http.ResponseWriter, r *http.Request) { + ct := r.Header.Get("Content-Type") + if ct != "application/json" { + log.Errorw("invalid content type", "ct", ct) + http.Error(w, "invalid content type", http.StatusBadRequest) + return + } + + idStr := chi.URLParam(r, "id") + if idStr == "" { + log.Errorw("missing id in url", "url", r.URL) + http.Error(w, "missing id in url", http.StatusBadRequest) + return + } + + id, err := ulid.Parse(idStr) + if err != nil { + log.Errorw("invalid id in url", "id", idStr, "err", err) + http.Error(w, "invalid id in url", http.StatusBadRequest) + return + } + + reader := io.LimitReader(r.Body, 4*1024*1024) + b, err := io.ReadAll(reader) + if err != nil { + log.Errorw("failed to read request body", "err", err) + http.Error(w, "failed to read request body", http.StatusBadRequest) + return + } + + upload := mk20.StartUpload{} + err = json.Unmarshal(b, &upload) + if err != nil { + log.Errorw("failed to unmarshal request body", "err", err) + http.Error(w, "failed to unmarshal request body", http.StatusBadRequest) + return + } + + mdh.dm.MK20Handler.HandleUploadStart(r.Context(), id, upload, w) + +} + +// mk20FinalizeUpload finalizes the upload process for a given deal by processing the request and updating the associated deal in the system if required. +// @Router /uploads/finalize/{id} [post] +// @Summary Finalizes the upload process +// @Description Finalizes the upload process once all the chunks are uploaded. +// @BasePath /market/mk20 +// @Param id path string true "id" +// @Param body body mk20.Deal optional "mk20.deal in json format" +// @Accept json +// @Failure 200 {object} mk20.DealCode "Ok represents a successful operation with an HTTP status code of 200" +// @Failure 400 {object} mk20.DealCode "ErrBadProposal represents a validation error that indicates an invalid or malformed proposal input in the context of validation logic" +// @Failure 404 {object} mk20.DealCode "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404" +// @Failure 430 {object} mk20.DealCode "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data" +// @Failure 422 {object} mk20.DealCode "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context" +// @Failure 423 {object} mk20.DealCode "ErrUnsupportedProduct indicates that the requested product is not supported by the provider" +// @Failure 424 {object} mk20.DealCode "ErrProductNotEnabled indicates that the requested product is not enabled on the provider" +// @Failure 425 {object} mk20.DealCode "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data" +// @Failure 426 {object} mk20.DealCode "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules" +// @Failure 500 {object} mk20.DealCode "ErrServerInternalError indicates an internal server error with a corresponding error code of 500" +// @Failure 503 {object} mk20.DealCode "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503" +// @Failure 429 {object} mk20.DealCode "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment" +// @Failure 440 {object} mk20.DealCode "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation" +// @Failure 441 {object} mk20.DealCode "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20FinalizeUpload(w http.ResponseWriter, r *http.Request) { + idStr := chi.URLParam(r, "id") + if idStr == "" { + log.Errorw("missing id in url", "url", r.URL) + http.Error(w, "missing id in url", http.StatusBadRequest) + return + } + + authHeader := r.Header.Get("Authorization") + if authHeader == "" { + http.Error(w, "Missing Authorization header", http.StatusUnauthorized) + return + } + + id, err := ulid.Parse(idStr) + if err != nil { + log.Errorw("invalid id in url", "id", idStr, "err", err) + http.Error(w, "invalid id in url", http.StatusBadRequest) + return + } + + body, err := io.ReadAll(io.LimitReader(r.Body, 1<<20)) + if err != nil { + http.Error(w, "error reading request body", http.StatusBadRequest) + return + } + defer func() { + _ = r.Body.Close() + }() + + log.Debugw("received upload finalize proposal", "id", idStr, "body", string(body)) + + if len(bytes.TrimSpace(body)) == 0 { + log.Debugw("no deal provided, using empty deal to finalize upload", "id", idStr) + mdh.dm.MK20Handler.HandleUploadFinalize(id, nil, w, authHeader) + return + } + + ct := r.Header.Get("Content-Type") + if len(ct) == 0 { + http.Error(w, "missing content type", http.StatusBadRequest) + return + } + + if ct != "application/json" { + log.Errorf("invalid content type: %s", ct) + http.Error(w, "invalid content type", http.StatusBadRequest) + return + } + + var deal mk20.Deal + + err = json.Unmarshal(body, &deal) + if err != nil { + log.Errorf("error unmarshaling json: %s", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + mdh.dm.MK20Handler.HandleUploadFinalize(id, &deal, w, authHeader) +} + +// mk20UpdateDeal handles updating an MK20 deal based on the provided HTTP request. +// It validates the deal ID, request content type, and JSON body before updating. +// @Summary Update the deal details of existing deals. +// @Description Useful for adding adding additional products and updating PoRep duration +// @BasePath /market/mk20 +// @Router /update/{id} [get] +// @Param id path string true "id" +// @Accept json +// @Param body body mk20.Deal true "mk20.Deal in json format" +// @Failure 200 {object} mk20.DealCode "Ok represents a successful operation with an HTTP status code of 200" +// @Failure 400 {object} mk20.DealCode "ErrBadProposal represents a validation error that indicates an invalid or malformed proposal input in the context of validation logic" +// @Failure 404 {object} mk20.DealCode "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404" +// @Failure 430 {object} mk20.DealCode "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data" +// @Failure 422 {object} mk20.DealCode "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context" +// @Failure 423 {object} mk20.DealCode "ErrUnsupportedProduct indicates that the requested product is not supported by the provider" +// @Failure 424 {object} mk20.DealCode "ErrProductNotEnabled indicates that the requested product is not enabled on the provider" +// @Failure 425 {object} mk20.DealCode "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data" +// @Failure 426 {object} mk20.DealCode "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules" +// @Failure 500 {object} mk20.DealCode "ErrServerInternalError indicates an internal server error with a corresponding error code of 500" +// @Failure 503 {object} mk20.DealCode "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503" +// @Failure 429 {object} mk20.DealCode "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment" +// @Failure 440 {object} mk20.DealCode "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation" +// @Failure 441 {object} mk20.DealCode "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20UpdateDeal(w http.ResponseWriter, r *http.Request) { + idStr := chi.URLParam(r, "id") + if idStr == "" { + log.Errorw("missing id in url", "url", r.URL) + http.Error(w, "missing id in url", http.StatusBadRequest) + } + + id, err := ulid.Parse(idStr) + if err != nil { + log.Errorw("invalid id in url", "id", idStr, "err", err) + http.Error(w, "invalid id in url", http.StatusBadRequest) + return + } + + ct := r.Header.Get("Content-Type") + var deal mk20.Deal + if ct != "application/json" { + log.Errorf("invalid content type: %s", ct) + http.Error(w, "invalid content type", http.StatusBadRequest) + return + } + + defer func() { + _ = r.Body.Close() + }() + + body, err := io.ReadAll(r.Body) + if err != nil { + log.Errorf("error reading request body: %s", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + err = json.Unmarshal(body, &deal) + if err != nil { + log.Errorf("error unmarshaling json: %s", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + authHeader := r.Header.Get("Authorization") + if authHeader == "" { + http.Error(w, "Missing Authorization header", http.StatusUnauthorized) + return + } + + log.Infow("received deal update proposal", "body", string(body)) + + result := mdh.dm.MK20Handler.UpdateDeal(id, &deal, authHeader) + + log.Infow("deal updated", + "id", deal.Identifier, + "HTTPCode", result.HTTPCode, + "Reason", result.Reason) + + w.WriteHeader(int(result.HTTPCode)) + _, err = fmt.Fprint(w, "Reason: ", result.Reason) + if err != nil { + log.Errorw("writing deal update response:", "id", deal.Identifier, "error", err) + } +} + +// mk20SerialUpload handles uploading of deal data in a single stream +// @Router /upload/{id} [put] +// @Summary Upload the deal data +// @Description Allows uploading data for deals in a single stream. Suitable for small deals. +// @BasePath /market/mk20 +// @Param id path string true "id" +// @Accept octet-stream +// @Param body body []byte true "raw binary" +// @Failure 200 {object} mk20.UploadCode "UploadOk indicates a successful upload operation, represented by the HTTP status code 200" +// @Failure 500 {object} mk20.UploadCode "UploadServerError indicates a server-side error occurred during the upload process, represented by the HTTP status code 500" +// @Failure 404 {object} mk20.UploadStartCode "UploadStartCodeDealNotFound represents a 404 status indicating the deal was not found during the upload start process" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20SerialUpload(w http.ResponseWriter, r *http.Request) { + idStr := chi.URLParam(r, "id") + if idStr == "" { + log.Errorw("missing id in url", "url", r.URL) + http.Error(w, "missing id in url", http.StatusBadRequest) + return + } + + id, err := ulid.Parse(idStr) + if err != nil { + log.Errorw("invalid id in url", "id", idStr, "err", err) + http.Error(w, "invalid id in url", http.StatusBadRequest) + return + } + + mdh.dm.MK20Handler.HandleSerialUpload(id, r.Body, w) +} + +// mk20SerialUploadFinalize finalizes the serial upload process for a given deal by processing the request and updating the associated deal in the system if required. +// @Router /upload/{id} [post] +// @Summary Finalizes the serial upload process +// @Description Finalizes the serial upload process once data has been uploaded +// @BasePath /market/mk20 +// @Param id path string true "id" +// @accepts json +// @Param body body mk20.Deal optional "mk20.deal in json format" +// @Accept json +// @Failure 200 {object} mk20.DealCode "Ok represents a successful operation with an HTTP status code of 200" +// @Failure 400 {object} mk20.DealCode "ErrBadProposal represents a validation error that indicates an invalid or malformed proposal input in the context of validation logic" +// @Failure 404 {object} mk20.DealCode "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404" +// @Failure 430 {object} mk20.DealCode "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data" +// @Failure 422 {object} mk20.DealCode "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context" +// @Failure 423 {object} mk20.DealCode "ErrUnsupportedProduct indicates that the requested product is not supported by the provider" +// @Failure 424 {object} mk20.DealCode "ErrProductNotEnabled indicates that the requested product is not enabled on the provider" +// @Failure 425 {object} mk20.DealCode "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data" +// @Failure 426 {object} mk20.DealCode "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules" +// @Failure 500 {object} mk20.DealCode "ErrServerInternalError indicates an internal server error with a corresponding error code of 500" +// @Failure 503 {object} mk20.DealCode "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503" +// @Failure 429 {object} mk20.DealCode "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment" +// @Failure 440 {object} mk20.DealCode "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation" +// @Failure 441 {object} mk20.DealCode "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold" +// @Failure 400 {string} string "Bad Request - Invalid input or validation error" +// @security CurioAuth +func (mdh *MK20DealHandler) mk20SerialUploadFinalize(w http.ResponseWriter, r *http.Request) { + idStr := chi.URLParam(r, "id") + if idStr == "" { + log.Errorw("missing id in url", "url", r.URL) + http.Error(w, "missing id in url", http.StatusBadRequest) + return + } + + authHeader := r.Header.Get("Authorization") + if authHeader == "" { + http.Error(w, "Missing Authorization header", http.StatusUnauthorized) + return + } + + id, err := ulid.Parse(idStr) + if err != nil { + log.Errorw("invalid id in url", "id", idStr, "err", err) + http.Error(w, "invalid id in url", http.StatusBadRequest) + return + } + + body, err := io.ReadAll(io.LimitReader(r.Body, 1<<20)) + if err != nil { + http.Error(w, "error reading request body", http.StatusBadRequest) + return + } + defer func() { + _ = r.Body.Close() + }() + + log.Debugw("received serial upload finalize proposal", "id", idStr, "body", string(body)) + + if len(bytes.TrimSpace(body)) == 0 { + log.Debugw("no deal provided, using empty deal to finalize upload", "id", idStr) + mdh.dm.MK20Handler.HandleSerialUploadFinalize(id, nil, w, authHeader) + return + } + + ct := r.Header.Get("Content-Type") + + var deal mk20.Deal + if ct != "application/json" { + log.Errorf("invalid content type: %s", ct) + http.Error(w, "invalid content type", http.StatusBadRequest) + return + } + + err = json.Unmarshal(body, &deal) + if err != nil { + log.Errorf("error unmarshaling json: %s", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + mdh.dm.MK20Handler.HandleSerialUploadFinalize(id, &deal, w, authHeader) +} diff --git a/market/mk20/http/swagger.json b/market/mk20/http/swagger.json new file mode 100644 index 000000000..ef9c84c1d --- /dev/null +++ b/market/mk20/http/swagger.json @@ -0,0 +1,1453 @@ +{ + "swagger": "2.0", + "info": { + "description": "Curio market APIs", + "title": "Curio Market 2.0 API", + "contact": {} + }, + "paths": { + "/contracts": { + "get": { + "description": "List of supported DDO contracts", + "summary": "List of supported DDO contracts", + "responses": { + "200": { + "description": "Array of contract addresses supported by a system or application.", + "schema": { + "$ref": "#/definitions/mk20.SupportedContracts" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/info/": { + "get": { + "description": "- OpenAPI spec UI for the Market 2.0 APIs", + "summary": "OpenAPI Spec UI", + "responses": {} + } + }, + "/info/swagger.json": { + "get": { + "description": "- OpenAPI spec for the Market 2.0 APIs in JSON format", + "summary": "OpenAPI Spec JSON", + "responses": {} + } + }, + "/info/swagger.yaml": { + "get": { + "description": "- OpenAPI spec for the Market 2.0 APIs in YAML format", + "summary": "OpenAPI Spec YAML", + "responses": {} + } + }, + "/products": { + "get": { + "description": "List of supported products", + "summary": "List of supported products", + "responses": { + "200": { + "description": "Array of products supported by the SP", + "schema": { + "$ref": "#/definitions/mk20.SupportedProducts" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/sources": { + "get": { + "description": "List of supported data sources", + "summary": "List of supported data sources", + "responses": { + "200": { + "description": "Array of dats sources supported by the SP", + "schema": { + "$ref": "#/definitions/mk20.SupportedDataSources" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/status/{id}": { + "get": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Current status of MK20 deal per product", + "summary": "Status of the MK20 deal", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "the status response for deal products with their respective deal statuses", + "schema": { + "$ref": "#/definitions/mk20.DealProductStatusResponse" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/store": { + "post": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Make a mk20 deal", + "consumes": [ + "application/json" + ], + "summary": "Make a mk20 deal", + "parameters": [ + { + "description": "mk20.Deal in json format", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/mk20.Deal" + } + } + ], + "responses": { + "200": { + "description": "Ok represents a successful operation with an HTTP status code of 200", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "422": { + "description": "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "423": { + "description": "ErrUnsupportedProduct indicates that the requested product is not supported by the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "424": { + "description": "ErrProductNotEnabled indicates that the requested product is not enabled on the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "425": { + "description": "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "426": { + "description": "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "429": { + "description": "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "430": { + "description": "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "440": { + "description": "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "441": { + "description": "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "500": { + "description": "ErrServerInternalError indicates an internal server error with a corresponding error code of 500", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "503": { + "description": "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + } + } + } + }, + "/update/{id}": { + "get": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Useful for adding adding additional products and updating PoRep duration", + "consumes": [ + "application/json" + ], + "summary": "Update the deal details of existing deals.", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "mk20.Deal in json format", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/mk20.Deal" + } + } + ], + "responses": { + "200": { + "description": "Ok represents a successful operation with an HTTP status code of 200", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "422": { + "description": "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "423": { + "description": "ErrUnsupportedProduct indicates that the requested product is not supported by the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "424": { + "description": "ErrProductNotEnabled indicates that the requested product is not enabled on the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "425": { + "description": "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "426": { + "description": "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "429": { + "description": "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "430": { + "description": "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "440": { + "description": "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "441": { + "description": "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "500": { + "description": "ErrServerInternalError indicates an internal server error with a corresponding error code of 500", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "503": { + "description": "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + } + } + } + }, + "/upload/{id}": { + "put": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Allows uploading data for deals in a single stream. Suitable for small deals.", + "consumes": [ + "application/octet-stream" + ], + "summary": "Upload the deal data", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "raw binary", + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "integer" + } + } + } + ], + "responses": { + "200": { + "description": "UploadOk indicates a successful upload operation, represented by the HTTP status code 200", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "UploadStartCodeDealNotFound represents a 404 status indicating the deal was not found during the upload start process", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + }, + "500": { + "description": "UploadServerError indicates a server-side error occurred during the upload process, represented by the HTTP status code 500", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + } + } + }, + "post": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Finalizes the serial upload process once data has been uploaded", + "consumes": [ + "application/json" + ], + "summary": "Finalizes the serial upload process", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "mk20.deal in json format", + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/mk20.Deal" + } + } + ], + "responses": { + "200": { + "description": "Ok represents a successful operation with an HTTP status code of 200", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "422": { + "description": "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "423": { + "description": "ErrUnsupportedProduct indicates that the requested product is not supported by the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "424": { + "description": "ErrProductNotEnabled indicates that the requested product is not enabled on the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "425": { + "description": "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "426": { + "description": "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "429": { + "description": "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "430": { + "description": "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "440": { + "description": "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "441": { + "description": "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "500": { + "description": "ErrServerInternalError indicates an internal server error with a corresponding error code of 500", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "503": { + "description": "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + } + } + } + }, + "/uploads/finalize/{id}": { + "post": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Finalizes the upload process once all the chunks are uploaded.", + "consumes": [ + "application/json" + ], + "summary": "Finalizes the upload process", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "mk20.deal in json format", + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/mk20.Deal" + } + } + ], + "responses": { + "200": { + "description": "Ok represents a successful operation with an HTTP status code of 200", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "422": { + "description": "ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "423": { + "description": "ErrUnsupportedProduct indicates that the requested product is not supported by the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "424": { + "description": "ErrProductNotEnabled indicates that the requested product is not enabled on the provider", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "425": { + "description": "ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "426": { + "description": "ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "429": { + "description": "ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "430": { + "description": "ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "440": { + "description": "ErrMarketNotEnabled indicates that the market is not enabled for the requested operation", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "441": { + "description": "ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "500": { + "description": "ErrServerInternalError indicates an internal server error with a corresponding error code of 500", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + }, + "503": { + "description": "ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503", + "schema": { + "$ref": "#/definitions/mk20.DealCode" + } + } + } + } + }, + "/uploads/{id}": { + "get": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Return a json struct detailing the current status of a deal upload.", + "summary": "Status of deal upload", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "The status of a file upload process, including progress and missing chunks", + "schema": { + "$ref": "#/definitions/mk20.UploadStatus" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "UploadStatusCodeDealNotFound indicates that the requested deal was not found, corresponding to status code 404", + "schema": { + "$ref": "#/definitions/mk20.UploadStatusCode" + } + }, + "425": { + "description": "UploadStatusCodeUploadNotStarted indicates that the upload process has not started yet", + "schema": { + "$ref": "#/definitions/mk20.UploadStatusCode" + } + }, + "500": { + "description": "UploadStatusCodeServerError indicates an internal server error occurred during the upload process, corresponding to status code 500", + "schema": { + "$ref": "#/definitions/mk20.UploadStatusCode" + } + } + } + }, + "post": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Initializes the upload for a deal. Each upload must be initialized before chunks can be uploaded for a deal.", + "consumes": [ + "application/json" + ], + "summary": "Starts the upload process", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Metadata for initiating an upload operation", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/mk20.StartUpload" + } + } + ], + "responses": { + "200": { + "description": "UploadStartCodeOk indicates a successful upload start request with status code 200", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "UploadStartCodeDealNotFound represents a 404 status indicating the deal was not found during the upload start process", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + }, + "409": { + "description": "UploadStartCodeAlreadyStarted indicates that the upload process has already been initiated and cannot be started again", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + }, + "500": { + "description": "UploadStartCodeServerError indicates an error occurred on the server while processing an upload start request", + "schema": { + "$ref": "#/definitions/mk20.UploadStartCode" + } + } + } + } + }, + "/uploads/{id}/{chunkNum}": { + "put": { + "security": [ + { + "CurioAuth": [] + } + ], + "description": "Allows uploading chunks for a deal file. Method can be called in parallel to speed up uploads.", + "consumes": [ + "application/octet-stream" + ], + "summary": "Upload a file chunk", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "chunkNum", + "name": "chunkNum", + "in": "path", + "required": true + }, + { + "description": "raw binary", + "name": "data", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "integer" + } + } + } + ], + "responses": { + "200": { + "description": "UploadOk indicates a successful upload operation, represented by the HTTP status code 200", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + }, + "400": { + "description": "Bad Request - Invalid input or validation error", + "schema": { + "type": "string" + } + }, + "404": { + "description": "UploadNotFound represents an error where the requested upload chunk could not be found, typically corresponding to HTTP status 404", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + }, + "409": { + "description": "UploadChunkAlreadyUploaded indicates that the chunk has already been uploaded and cannot be re-uploaded", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + }, + "500": { + "description": "UploadServerError indicates a server-side error occurred during the upload process, represented by the HTTP status code 500", + "schema": { + "$ref": "#/definitions/mk20.UploadCode" + } + } + } + } + } + }, + "definitions": { + "address.Address": { + "type": "object" + }, + "github_com_filecoin-project_go-state-types_builtin_v16_verifreg.AllocationId": { + "type": "integer", + "enum": [ + 0 + ], + "x-enum-varnames": [ + "NoAllocationID" + ] + }, + "http.Header": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "mk20.AggregateType": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "x-enum-varnames": [ + "AggregateTypeNone", + "AggregateTypeV1" + ] + }, + "mk20.DDOV1": { + "type": "object", + "properties": { + "allocation_id": { + "description": "AllocationId represents an allocation identifier for the deal.", + "allOf": [ + { + "$ref": "#/definitions/github_com_filecoin-project_go-state-types_builtin_v16_verifreg.AllocationId" + } + ] + }, + "contract_address": { + "description": "ContractAddress specifies the address of the contract governing the deal", + "type": "string" + }, + "contract_verify_method": { + "description": "ContractDealIDMethod specifies the method name to verify the deal and retrieve the deal ID for a contract", + "type": "string" + }, + "contract_verify_method_Params": { + "description": "ContractDealIDMethodParams represents encoded parameters for the contract verify method if required by the contract", + "type": "array", + "items": { + "type": "integer" + } + }, + "duration": { + "description": "Duration represents the deal duration in epochs. This value is ignored for the deal with allocationID.\nIt must be at least 518400", + "type": "integer" + }, + "notification_address": { + "description": "NotificationAddress specifies the address to which notifications will be relayed to when sector is activated", + "type": "string" + }, + "notification_payload": { + "description": "NotificationPayload holds the notification data typically in a serialized byte array format.", + "type": "array", + "items": { + "type": "integer" + } + }, + "piece_manager": { + "description": "Actor providing AuthorizeMessage (like f1/f3 wallet) able to authorize actions such as managing ACLs", + "allOf": [ + { + "$ref": "#/definitions/address.Address" + } + ] + }, + "provider": { + "description": "Provider specifies the address of the provider", + "allOf": [ + { + "$ref": "#/definitions/address.Address" + } + ] + } + } + }, + "mk20.DataSource": { + "type": "object", + "properties": { + "format": { + "description": "Format defines the format of the piece data, which can include CAR, Aggregate, or Raw formats.", + "allOf": [ + { + "$ref": "#/definitions/mk20.PieceDataFormat" + } + ] + }, + "piece_cid": { + "description": "PieceCID represents the unique identifier (pieceCID V2) for a piece of data, stored as a CID object.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "example": { + "/": "bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pq" + } + }, + "source_aggregate": { + "description": "SourceAggregate represents an aggregated source, comprising multiple data sources as pieces.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSourceAggregate" + } + ] + }, + "source_http": { + "description": "SourceHTTP represents the HTTP-based source of piece data within a deal, including raw size and URLs for retrieval.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSourceHTTP" + } + ] + }, + "source_http_put": { + "description": "SourceHttpPut allow clients to push piece data after deal is accepted", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSourceHttpPut" + } + ] + }, + "source_offline": { + "description": "SourceOffline defines the data source for offline pieces, including raw size information.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSourceOffline" + } + ] + } + } + }, + "mk20.DataSourceAggregate": { + "type": "object", + "properties": { + "pieces": { + "type": "array", + "items": { + "$ref": "#/definitions/mk20.DataSource" + } + } + } + }, + "mk20.DataSourceHTTP": { + "type": "object", + "properties": { + "urls": { + "description": "URLs lists the HTTP endpoints where the piece data can be fetched.", + "type": "array", + "items": { + "$ref": "#/definitions/mk20.HttpUrl" + } + } + } + }, + "mk20.DataSourceHttpPut": { + "type": "object" + }, + "mk20.DataSourceOffline": { + "type": "object" + }, + "mk20.Deal": { + "type": "object", + "properties": { + "client": { + "description": "Client wallet string for the deal", + "type": "string" + }, + "data": { + "description": "Data represents the source of piece data and associated metadata.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DataSource" + } + ] + }, + "identifier": { + "description": "Identifier represents a unique identifier for the deal in ULID format.", + "type": "string", + "format": "ulid", + "example": "01ARZ3NDEKTSV4RRFFQ69G5FAV" + }, + "products": { + "description": "Products represents a collection of product-specific information associated with a deal", + "allOf": [ + { + "$ref": "#/definitions/mk20.Products" + } + ] + } + } + }, + "mk20.DealCode": { + "type": "integer", + "enum": [ + 200, + 401, + 400, + 404, + 430, + 422, + 423, + 424, + 425, + 426, + 500, + 503, + 429, + 440, + 441 + ], + "x-enum-varnames": [ + "Ok", + "ErrUnAuthorized", + "ErrBadProposal", + "ErrDealNotFound", + "ErrMalformedDataSource", + "ErrUnsupportedDataSource", + "ErrUnsupportedProduct", + "ErrProductNotEnabled", + "ErrProductValidationFailed", + "ErrDealRejectedByMarket", + "ErrServerInternalError", + "ErrServiceMaintenance", + "ErrServiceOverloaded", + "ErrMarketNotEnabled", + "ErrDurationTooShort" + ] + }, + "mk20.DealProductStatusResponse": { + "type": "object", + "properties": { + "ddo_v1": { + "description": "DDOV1 holds the DealStatusResponse for product \"ddo_v1\".", + "allOf": [ + { + "$ref": "#/definitions/mk20.DealStatusResponse" + } + ] + }, + "pdp_v1": { + "description": "PDPV1 represents the DealStatusResponse for the product pdp_v1.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DealStatusResponse" + } + ] + } + } + }, + "mk20.DealState": { + "type": "string", + "enum": [ + "accepted", + "uploading", + "processing", + "sealing", + "indexing", + "failed", + "complete" + ], + "x-enum-varnames": [ + "DealStateAccepted", + "DealStateAwaitingUpload", + "DealStateProcessing", + "DealStateSealing", + "DealStateIndexing", + "DealStateFailed", + "DealStateComplete" + ] + }, + "mk20.DealStatusResponse": { + "type": "object", + "properties": { + "errorMsg": { + "description": "ErrorMsg is an optional field containing error details associated with the deal's current state if an error occurred.", + "type": "string" + }, + "status": { + "description": "State indicates the current processing state of the deal as a DealState value.", + "allOf": [ + { + "$ref": "#/definitions/mk20.DealState" + } + ] + } + } + }, + "mk20.FormatAggregate": { + "type": "object", + "properties": { + "sub": { + "description": "Sub holds a slice of DataSource, representing details of sub pieces aggregated under this format.\nThe order must be same as segment index to avoid incorrect indexing of sub pieces in an aggregate", + "type": "array", + "items": { + "$ref": "#/definitions/mk20.DataSource" + } + }, + "type": { + "description": "Type specifies the type of aggregation for data pieces, represented by an AggregateType value.", + "allOf": [ + { + "$ref": "#/definitions/mk20.AggregateType" + } + ] + } + } + }, + "mk20.FormatBytes": { + "type": "object" + }, + "mk20.FormatCar": { + "type": "object" + }, + "mk20.HttpUrl": { + "type": "object", + "properties": { + "fallback": { + "description": "Fallback indicates whether this URL serves as a fallback option when other URLs fail.", + "type": "boolean" + }, + "headers": { + "description": "HTTPHeaders represents the HTTP headers associated with the URL.", + "allOf": [ + { + "$ref": "#/definitions/http.Header" + } + ] + }, + "priority": { + "description": "Priority indicates the order preference for using the URL in requests, with lower values having higher priority.", + "type": "integer" + }, + "url": { + "description": "URL specifies the HTTP endpoint where the piece data can be fetched.", + "type": "string" + } + } + }, + "mk20.PDPV1": { + "type": "object", + "properties": { + "add_piece": { + "description": "AddPiece indicated that this deal is meant to add Piece to a given DataSet. DataSetID must be defined.", + "type": "boolean" + }, + "create_data_set": { + "description": "CreateDataSet indicated that this deal is meant to create a new DataSet for the client by storage provider.", + "type": "boolean" + }, + "data_set_id": { + "description": "DataSetID is PDP verified contract dataset ID. It must be defined for all deals except when CreateDataSet is true.", + "type": "integer" + }, + "delete_data_set": { + "description": "DeleteDataSet indicated that this deal is meant to delete an existing DataSet created by SP for the client.\nDataSetID must be defined.", + "type": "boolean" + }, + "delete_piece": { + "description": "DeletePiece indicates whether the Piece of the data should be deleted. DataSetID must be defined.", + "type": "boolean" + }, + "extra_data": { + "description": "ExtraData can be used to send additional information to service contract when Verifier action like AddPiece, DeletePiece, etc. are performed.", + "type": "array", + "items": { + "type": "integer" + } + }, + "piece_ids": { + "description": "PieceIDs is a list of Piece ids in a proof set.", + "type": "array", + "items": { + "type": "integer" + } + }, + "record_keeper": { + "description": "RecordKeeper specifies the record keeper contract address for the new PDP dataset.", + "type": "string" + } + } + }, + "mk20.PieceDataFormat": { + "type": "object", + "properties": { + "aggregate": { + "description": "Aggregate holds a reference to the aggregated format of piece data.", + "allOf": [ + { + "$ref": "#/definitions/mk20.FormatAggregate" + } + ] + }, + "car": { + "description": "Car represents the optional CAR file format.", + "allOf": [ + { + "$ref": "#/definitions/mk20.FormatCar" + } + ] + }, + "raw": { + "description": "Raw represents the raw format of the piece data, encapsulated as bytes.", + "allOf": [ + { + "$ref": "#/definitions/mk20.FormatBytes" + } + ] + } + } + }, + "mk20.Products": { + "type": "object", + "properties": { + "ddo_v1": { + "description": "DDOV1 represents a product v1 configuration for Direct Data Onboarding (DDO)", + "allOf": [ + { + "$ref": "#/definitions/mk20.DDOV1" + } + ] + }, + "pdp_v1": { + "description": "PDPV1 represents product-specific configuration for PDP version 1 deals.", + "allOf": [ + { + "$ref": "#/definitions/mk20.PDPV1" + } + ] + }, + "retrieval_v1": { + "description": "RetrievalV1 represents configuration for retrieval settings in the system, including indexing and announcement flags.", + "allOf": [ + { + "$ref": "#/definitions/mk20.RetrievalV1" + } + ] + } + } + }, + "mk20.RetrievalV1": { + "type": "object", + "properties": { + "announce_payload": { + "description": "AnnouncePayload indicates whether the payload should be announced to IPNI.", + "type": "boolean" + }, + "announce_piece": { + "description": "AnnouncePiece indicates whether the piece information should be announced to IPNI.", + "type": "boolean" + }, + "indexing": { + "description": "Indexing indicates if the deal is to be indexed in the provider's system to support CIDs based retrieval", + "type": "boolean" + } + } + }, + "mk20.StartUpload": { + "type": "object", + "properties": { + "chunk_size": { + "description": "ChunkSize defines the size of each data chunk to be used during the upload process.", + "type": "integer" + }, + "raw_size": { + "description": "RawSize indicates the total size of the data to be uploaded in bytes.", + "type": "integer" + } + } + }, + "mk20.SupportedContracts": { + "type": "object", + "properties": { + "contracts": { + "description": "Contracts represents a list of supported contract addresses in string format.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "mk20.SupportedDataSources": { + "type": "object", + "properties": { + "sources": { + "description": "Contracts represents a list of supported contract addresses in string format.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "mk20.SupportedProducts": { + "type": "object", + "properties": { + "products": { + "description": "Contracts represents a list of supported contract addresses in string format.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "mk20.UploadCode": { + "type": "integer", + "enum": [ + 200, + 400, + 404, + 409, + 500, + 429 + ], + "x-enum-varnames": [ + "UploadOk", + "UploadBadRequest", + "UploadNotFound", + "UploadChunkAlreadyUploaded", + "UploadServerError", + "UploadRateLimit" + ] + }, + "mk20.UploadStartCode": { + "type": "integer", + "enum": [ + 200, + 400, + 404, + 409, + 500 + ], + "x-enum-varnames": [ + "UploadStartCodeOk", + "UploadStartCodeBadRequest", + "UploadStartCodeDealNotFound", + "UploadStartCodeAlreadyStarted", + "UploadStartCodeServerError" + ] + }, + "mk20.UploadStatus": { + "type": "object", + "properties": { + "missing": { + "description": "Missing represents the number of chunks that are not yet uploaded.", + "type": "integer" + }, + "missing_chunks": { + "description": "MissingChunks is a slice containing the indices of missing chunks.", + "type": "array", + "items": { + "type": "integer" + } + }, + "total_chunks": { + "description": "TotalChunks represents the total number of chunks required for the upload.", + "type": "integer" + }, + "uploaded": { + "description": "Uploaded represents the number of chunks successfully uploaded.", + "type": "integer" + }, + "uploaded_chunks": { + "description": "UploadedChunks is a slice containing the indices of successfully uploaded chunks.", + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "mk20.UploadStatusCode": { + "type": "integer", + "enum": [ + 200, + 404, + 425, + 500 + ], + "x-enum-varnames": [ + "UploadStatusCodeOk", + "UploadStatusCodeDealNotFound", + "UploadStatusCodeUploadNotStarted", + "UploadStatusCodeServerError" + ] + } + }, + "securityDefinitions": { + "CurioAuth": { + "description": "Use the format: `CurioAuth PublicKeyType:PublicKey:Signature`\n\n- `PublicKeyType`: String representation of type of wallet (e.g., \"ed25519\", \"bls\", \"secp256k1\")\n- `PublicKey`: Base64 string of public key bytes\n- `Signature`: Signature is Base64 string of signature bytes.\n- The client is expected to sign the SHA-256 hash of a message constructed by concatenating the following components, in order.\n- The raw public key bytes (not a human-readable address)\n- The timestamp, truncated to the nearest hour, formatted in RFC3339 (e.g., 2025-07-15T17:00:00Z)\n- These two byte slices are joined without any delimiter between them, and the resulting byte array is then hashed using SHA-256. The signature is performed on that hash.", + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +} \ No newline at end of file diff --git a/market/mk20/http/swagger.yaml b/market/mk20/http/swagger.yaml new file mode 100644 index 000000000..6744e648f --- /dev/null +++ b/market/mk20/http/swagger.yaml @@ -0,0 +1,1081 @@ +definitions: + address.Address: + type: object + github_com_filecoin-project_go-state-types_builtin_v16_verifreg.AllocationId: + enum: + - 0 + type: integer + x-enum-varnames: + - NoAllocationID + http.Header: + additionalProperties: + items: + type: string + type: array + type: object + mk20.AggregateType: + enum: + - 0 + - 1 + type: integer + x-enum-varnames: + - AggregateTypeNone + - AggregateTypeV1 + mk20.DDOV1: + properties: + allocation_id: + allOf: + - $ref: '#/definitions/github_com_filecoin-project_go-state-types_builtin_v16_verifreg.AllocationId' + description: AllocationId represents an allocation identifier for the deal. + contract_address: + description: ContractAddress specifies the address of the contract governing + the deal + type: string + contract_verify_method: + description: ContractDealIDMethod specifies the method name to verify the + deal and retrieve the deal ID for a contract + type: string + contract_verify_method_Params: + description: ContractDealIDMethodParams represents encoded parameters for + the contract verify method if required by the contract + items: + type: integer + type: array + duration: + description: |- + Duration represents the deal duration in epochs. This value is ignored for the deal with allocationID. + It must be at least 518400 + type: integer + notification_address: + description: NotificationAddress specifies the address to which notifications + will be relayed to when sector is activated + type: string + notification_payload: + description: NotificationPayload holds the notification data typically in + a serialized byte array format. + items: + type: integer + type: array + piece_manager: + allOf: + - $ref: '#/definitions/address.Address' + description: Actor providing AuthorizeMessage (like f1/f3 wallet) able to + authorize actions such as managing ACLs + provider: + allOf: + - $ref: '#/definitions/address.Address' + description: Provider specifies the address of the provider + type: object + mk20.DataSource: + properties: + format: + allOf: + - $ref: '#/definitions/mk20.PieceDataFormat' + description: Format defines the format of the piece data, which can include + CAR, Aggregate, or Raw formats. + piece_cid: + additionalProperties: + type: string + description: PieceCID represents the unique identifier (pieceCID V2) for a + piece of data, stored as a CID object. + example: + /: bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pq + type: object + source_aggregate: + allOf: + - $ref: '#/definitions/mk20.DataSourceAggregate' + description: SourceAggregate represents an aggregated source, comprising multiple + data sources as pieces. + source_http: + allOf: + - $ref: '#/definitions/mk20.DataSourceHTTP' + description: SourceHTTP represents the HTTP-based source of piece data within + a deal, including raw size and URLs for retrieval. + source_http_put: + allOf: + - $ref: '#/definitions/mk20.DataSourceHttpPut' + description: SourceHttpPut allow clients to push piece data after deal is + accepted + source_offline: + allOf: + - $ref: '#/definitions/mk20.DataSourceOffline' + description: SourceOffline defines the data source for offline pieces, including + raw size information. + type: object + mk20.DataSourceAggregate: + properties: + pieces: + items: + $ref: '#/definitions/mk20.DataSource' + type: array + type: object + mk20.DataSourceHTTP: + properties: + urls: + description: URLs lists the HTTP endpoints where the piece data can be fetched. + items: + $ref: '#/definitions/mk20.HttpUrl' + type: array + type: object + mk20.DataSourceHttpPut: + type: object + mk20.DataSourceOffline: + type: object + mk20.Deal: + properties: + client: + description: Client wallet string for the deal + type: string + data: + allOf: + - $ref: '#/definitions/mk20.DataSource' + description: Data represents the source of piece data and associated metadata. + identifier: + description: Identifier represents a unique identifier for the deal in ULID + format. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + format: ulid + type: string + products: + allOf: + - $ref: '#/definitions/mk20.Products' + description: Products represents a collection of product-specific information + associated with a deal + type: object + mk20.DealCode: + enum: + - 200 + - 401 + - 400 + - 404 + - 430 + - 422 + - 423 + - 424 + - 425 + - 426 + - 500 + - 503 + - 429 + - 440 + - 441 + type: integer + x-enum-varnames: + - Ok + - ErrUnAuthorized + - ErrBadProposal + - ErrDealNotFound + - ErrMalformedDataSource + - ErrUnsupportedDataSource + - ErrUnsupportedProduct + - ErrProductNotEnabled + - ErrProductValidationFailed + - ErrDealRejectedByMarket + - ErrServerInternalError + - ErrServiceMaintenance + - ErrServiceOverloaded + - ErrMarketNotEnabled + - ErrDurationTooShort + mk20.DealProductStatusResponse: + properties: + ddo_v1: + allOf: + - $ref: '#/definitions/mk20.DealStatusResponse' + description: DDOV1 holds the DealStatusResponse for product "ddo_v1". + pdp_v1: + allOf: + - $ref: '#/definitions/mk20.DealStatusResponse' + description: PDPV1 represents the DealStatusResponse for the product pdp_v1. + type: object + mk20.DealState: + enum: + - accepted + - uploading + - processing + - sealing + - indexing + - failed + - complete + type: string + x-enum-varnames: + - DealStateAccepted + - DealStateAwaitingUpload + - DealStateProcessing + - DealStateSealing + - DealStateIndexing + - DealStateFailed + - DealStateComplete + mk20.DealStatusResponse: + properties: + errorMsg: + description: ErrorMsg is an optional field containing error details associated + with the deal's current state if an error occurred. + type: string + status: + allOf: + - $ref: '#/definitions/mk20.DealState' + description: State indicates the current processing state of the deal as a + DealState value. + type: object + mk20.FormatAggregate: + properties: + sub: + description: |- + Sub holds a slice of DataSource, representing details of sub pieces aggregated under this format. + The order must be same as segment index to avoid incorrect indexing of sub pieces in an aggregate + items: + $ref: '#/definitions/mk20.DataSource' + type: array + type: + allOf: + - $ref: '#/definitions/mk20.AggregateType' + description: Type specifies the type of aggregation for data pieces, represented + by an AggregateType value. + type: object + mk20.FormatBytes: + type: object + mk20.FormatCar: + type: object + mk20.HttpUrl: + properties: + fallback: + description: Fallback indicates whether this URL serves as a fallback option + when other URLs fail. + type: boolean + headers: + allOf: + - $ref: '#/definitions/http.Header' + description: HTTPHeaders represents the HTTP headers associated with the URL. + priority: + description: Priority indicates the order preference for using the URL in + requests, with lower values having higher priority. + type: integer + url: + description: URL specifies the HTTP endpoint where the piece data can be fetched. + type: string + type: object + mk20.PDPV1: + properties: + add_piece: + description: AddPiece indicated that this deal is meant to add Piece to a + given DataSet. DataSetID must be defined. + type: boolean + create_data_set: + description: CreateDataSet indicated that this deal is meant to create a new + DataSet for the client by storage provider. + type: boolean + data_set_id: + description: DataSetID is PDP verified contract dataset ID. It must be defined + for all deals except when CreateDataSet is true. + type: integer + delete_data_set: + description: |- + DeleteDataSet indicated that this deal is meant to delete an existing DataSet created by SP for the client. + DataSetID must be defined. + type: boolean + delete_piece: + description: DeletePiece indicates whether the Piece of the data should be + deleted. DataSetID must be defined. + type: boolean + extra_data: + description: ExtraData can be used to send additional information to service + contract when Verifier action like AddPiece, DeletePiece, etc. are performed. + items: + type: integer + type: array + piece_ids: + description: PieceIDs is a list of Piece ids in a proof set. + items: + type: integer + type: array + record_keeper: + description: RecordKeeper specifies the record keeper contract address for + the new PDP dataset. + type: string + type: object + mk20.PieceDataFormat: + properties: + aggregate: + allOf: + - $ref: '#/definitions/mk20.FormatAggregate' + description: Aggregate holds a reference to the aggregated format of piece + data. + car: + allOf: + - $ref: '#/definitions/mk20.FormatCar' + description: Car represents the optional CAR file format. + raw: + allOf: + - $ref: '#/definitions/mk20.FormatBytes' + description: Raw represents the raw format of the piece data, encapsulated + as bytes. + type: object + mk20.Products: + properties: + ddo_v1: + allOf: + - $ref: '#/definitions/mk20.DDOV1' + description: DDOV1 represents a product v1 configuration for Direct Data Onboarding + (DDO) + pdp_v1: + allOf: + - $ref: '#/definitions/mk20.PDPV1' + description: PDPV1 represents product-specific configuration for PDP version + 1 deals. + retrieval_v1: + allOf: + - $ref: '#/definitions/mk20.RetrievalV1' + description: RetrievalV1 represents configuration for retrieval settings in + the system, including indexing and announcement flags. + type: object + mk20.RetrievalV1: + properties: + announce_payload: + description: AnnouncePayload indicates whether the payload should be announced + to IPNI. + type: boolean + announce_piece: + description: AnnouncePiece indicates whether the piece information should + be announced to IPNI. + type: boolean + indexing: + description: Indexing indicates if the deal is to be indexed in the provider's + system to support CIDs based retrieval + type: boolean + type: object + mk20.StartUpload: + properties: + chunk_size: + description: ChunkSize defines the size of each data chunk to be used during + the upload process. + type: integer + raw_size: + description: RawSize indicates the total size of the data to be uploaded in + bytes. + type: integer + type: object + mk20.SupportedContracts: + properties: + contracts: + description: Contracts represents a list of supported contract addresses in + string format. + items: + type: string + type: array + type: object + mk20.SupportedDataSources: + properties: + sources: + description: Contracts represents a list of supported contract addresses in + string format. + items: + type: string + type: array + type: object + mk20.SupportedProducts: + properties: + products: + description: Contracts represents a list of supported contract addresses in + string format. + items: + type: string + type: array + type: object + mk20.UploadCode: + enum: + - 200 + - 400 + - 404 + - 409 + - 500 + - 429 + type: integer + x-enum-varnames: + - UploadOk + - UploadBadRequest + - UploadNotFound + - UploadChunkAlreadyUploaded + - UploadServerError + - UploadRateLimit + mk20.UploadStartCode: + enum: + - 200 + - 400 + - 404 + - 409 + - 500 + type: integer + x-enum-varnames: + - UploadStartCodeOk + - UploadStartCodeBadRequest + - UploadStartCodeDealNotFound + - UploadStartCodeAlreadyStarted + - UploadStartCodeServerError + mk20.UploadStatus: + properties: + missing: + description: Missing represents the number of chunks that are not yet uploaded. + type: integer + missing_chunks: + description: MissingChunks is a slice containing the indices of missing chunks. + items: + type: integer + type: array + total_chunks: + description: TotalChunks represents the total number of chunks required for + the upload. + type: integer + uploaded: + description: Uploaded represents the number of chunks successfully uploaded. + type: integer + uploaded_chunks: + description: UploadedChunks is a slice containing the indices of successfully + uploaded chunks. + items: + type: integer + type: array + type: object + mk20.UploadStatusCode: + enum: + - 200 + - 404 + - 425 + - 500 + type: integer + x-enum-varnames: + - UploadStatusCodeOk + - UploadStatusCodeDealNotFound + - UploadStatusCodeUploadNotStarted + - UploadStatusCodeServerError +info: + contact: {} + description: Curio market APIs + title: Curio Market 2.0 API +paths: + /contracts: + get: + description: List of supported DDO contracts + responses: + "200": + description: Array of contract addresses supported by a system or application. + schema: + $ref: '#/definitions/mk20.SupportedContracts' + "500": + description: Internal Server Error + schema: + type: string + summary: List of supported DDO contracts + /info/: + get: + description: '- OpenAPI spec UI for the Market 2.0 APIs' + responses: {} + summary: OpenAPI Spec UI + /info/swagger.json: + get: + description: '- OpenAPI spec for the Market 2.0 APIs in JSON format' + responses: {} + summary: OpenAPI Spec JSON + /info/swagger.yaml: + get: + description: '- OpenAPI spec for the Market 2.0 APIs in YAML format' + responses: {} + summary: OpenAPI Spec YAML + /products: + get: + description: List of supported products + responses: + "200": + description: Array of products supported by the SP + schema: + $ref: '#/definitions/mk20.SupportedProducts' + "500": + description: Internal Server Error + schema: + type: string + summary: List of supported products + /sources: + get: + description: List of supported data sources + responses: + "200": + description: Array of dats sources supported by the SP + schema: + $ref: '#/definitions/mk20.SupportedDataSources' + "500": + description: Internal Server Error + schema: + type: string + summary: List of supported data sources + /status/{id}: + get: + description: Current status of MK20 deal per product + parameters: + - description: id + in: path + name: id + required: true + type: string + responses: + "200": + description: the status response for deal products with their respective + deal statuses + schema: + $ref: '#/definitions/mk20.DealProductStatusResponse' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "500": + description: Internal Server Error + schema: + type: string + security: + - CurioAuth: [] + summary: Status of the MK20 deal + /store: + post: + consumes: + - application/json + description: Make a mk20 deal + parameters: + - description: mk20.Deal in json format + in: body + name: body + required: true + schema: + $ref: '#/definitions/mk20.Deal' + responses: + "200": + description: Ok represents a successful operation with an HTTP status code + of 200 + schema: + $ref: '#/definitions/mk20.DealCode' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "404": + description: ErrDealNotFound indicates that the specified deal could not + be found, corresponding to the HTTP status code 404 + schema: + $ref: '#/definitions/mk20.DealCode' + "422": + description: ErrUnsupportedDataSource indicates the specified data source + is not supported or disabled for use in the current context + schema: + $ref: '#/definitions/mk20.DealCode' + "423": + description: ErrUnsupportedProduct indicates that the requested product + is not supported by the provider + schema: + $ref: '#/definitions/mk20.DealCode' + "424": + description: ErrProductNotEnabled indicates that the requested product is + not enabled on the provider + schema: + $ref: '#/definitions/mk20.DealCode' + "425": + description: ErrProductValidationFailed indicates a failure during product-specific + validation due to invalid or missing data + schema: + $ref: '#/definitions/mk20.DealCode' + "426": + description: ErrDealRejectedByMarket indicates that a proposed deal was + rejected by the market for not meeting its acceptance criteria or rules + schema: + $ref: '#/definitions/mk20.DealCode' + "429": + description: ErrServiceOverloaded indicates that the service is overloaded + and cannot process the request at the moment + schema: + $ref: '#/definitions/mk20.DealCode' + "430": + description: ErrMalformedDataSource indicates that the provided data source + is incorrectly formatted or contains invalid data + schema: + $ref: '#/definitions/mk20.DealCode' + "440": + description: ErrMarketNotEnabled indicates that the market is not enabled + for the requested operation + schema: + $ref: '#/definitions/mk20.DealCode' + "441": + description: ErrDurationTooShort indicates that the provided duration value + does not meet the minimum required threshold + schema: + $ref: '#/definitions/mk20.DealCode' + "500": + description: ErrServerInternalError indicates an internal server error with + a corresponding error code of 500 + schema: + $ref: '#/definitions/mk20.DealCode' + "503": + description: ErrServiceMaintenance indicates that the service is temporarily + unavailable due to maintenance, corresponding to HTTP status code 503 + schema: + $ref: '#/definitions/mk20.DealCode' + security: + - CurioAuth: [] + summary: Make a mk20 deal + /update/{id}: + get: + consumes: + - application/json + description: Useful for adding adding additional products and updating PoRep + duration + parameters: + - description: id + in: path + name: id + required: true + type: string + - description: mk20.Deal in json format + in: body + name: body + required: true + schema: + $ref: '#/definitions/mk20.Deal' + responses: + "200": + description: Ok represents a successful operation with an HTTP status code + of 200 + schema: + $ref: '#/definitions/mk20.DealCode' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "404": + description: ErrDealNotFound indicates that the specified deal could not + be found, corresponding to the HTTP status code 404 + schema: + $ref: '#/definitions/mk20.DealCode' + "422": + description: ErrUnsupportedDataSource indicates the specified data source + is not supported or disabled for use in the current context + schema: + $ref: '#/definitions/mk20.DealCode' + "423": + description: ErrUnsupportedProduct indicates that the requested product + is not supported by the provider + schema: + $ref: '#/definitions/mk20.DealCode' + "424": + description: ErrProductNotEnabled indicates that the requested product is + not enabled on the provider + schema: + $ref: '#/definitions/mk20.DealCode' + "425": + description: ErrProductValidationFailed indicates a failure during product-specific + validation due to invalid or missing data + schema: + $ref: '#/definitions/mk20.DealCode' + "426": + description: ErrDealRejectedByMarket indicates that a proposed deal was + rejected by the market for not meeting its acceptance criteria or rules + schema: + $ref: '#/definitions/mk20.DealCode' + "429": + description: ErrServiceOverloaded indicates that the service is overloaded + and cannot process the request at the moment + schema: + $ref: '#/definitions/mk20.DealCode' + "430": + description: ErrMalformedDataSource indicates that the provided data source + is incorrectly formatted or contains invalid data + schema: + $ref: '#/definitions/mk20.DealCode' + "440": + description: ErrMarketNotEnabled indicates that the market is not enabled + for the requested operation + schema: + $ref: '#/definitions/mk20.DealCode' + "441": + description: ErrDurationTooShort indicates that the provided duration value + does not meet the minimum required threshold + schema: + $ref: '#/definitions/mk20.DealCode' + "500": + description: ErrServerInternalError indicates an internal server error with + a corresponding error code of 500 + schema: + $ref: '#/definitions/mk20.DealCode' + "503": + description: ErrServiceMaintenance indicates that the service is temporarily + unavailable due to maintenance, corresponding to HTTP status code 503 + schema: + $ref: '#/definitions/mk20.DealCode' + security: + - CurioAuth: [] + summary: Update the deal details of existing deals. + /upload/{id}: + post: + consumes: + - application/json + description: Finalizes the serial upload process once data has been uploaded + parameters: + - description: id + in: path + name: id + required: true + type: string + - description: mk20.deal in json format + in: body + name: body + schema: + $ref: '#/definitions/mk20.Deal' + responses: + "200": + description: Ok represents a successful operation with an HTTP status code + of 200 + schema: + $ref: '#/definitions/mk20.DealCode' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "404": + description: ErrDealNotFound indicates that the specified deal could not + be found, corresponding to the HTTP status code 404 + schema: + $ref: '#/definitions/mk20.DealCode' + "422": + description: ErrUnsupportedDataSource indicates the specified data source + is not supported or disabled for use in the current context + schema: + $ref: '#/definitions/mk20.DealCode' + "423": + description: ErrUnsupportedProduct indicates that the requested product + is not supported by the provider + schema: + $ref: '#/definitions/mk20.DealCode' + "424": + description: ErrProductNotEnabled indicates that the requested product is + not enabled on the provider + schema: + $ref: '#/definitions/mk20.DealCode' + "425": + description: ErrProductValidationFailed indicates a failure during product-specific + validation due to invalid or missing data + schema: + $ref: '#/definitions/mk20.DealCode' + "426": + description: ErrDealRejectedByMarket indicates that a proposed deal was + rejected by the market for not meeting its acceptance criteria or rules + schema: + $ref: '#/definitions/mk20.DealCode' + "429": + description: ErrServiceOverloaded indicates that the service is overloaded + and cannot process the request at the moment + schema: + $ref: '#/definitions/mk20.DealCode' + "430": + description: ErrMalformedDataSource indicates that the provided data source + is incorrectly formatted or contains invalid data + schema: + $ref: '#/definitions/mk20.DealCode' + "440": + description: ErrMarketNotEnabled indicates that the market is not enabled + for the requested operation + schema: + $ref: '#/definitions/mk20.DealCode' + "441": + description: ErrDurationTooShort indicates that the provided duration value + does not meet the minimum required threshold + schema: + $ref: '#/definitions/mk20.DealCode' + "500": + description: ErrServerInternalError indicates an internal server error with + a corresponding error code of 500 + schema: + $ref: '#/definitions/mk20.DealCode' + "503": + description: ErrServiceMaintenance indicates that the service is temporarily + unavailable due to maintenance, corresponding to HTTP status code 503 + schema: + $ref: '#/definitions/mk20.DealCode' + security: + - CurioAuth: [] + summary: Finalizes the serial upload process + put: + consumes: + - application/octet-stream + description: Allows uploading data for deals in a single stream. Suitable for + small deals. + parameters: + - description: id + in: path + name: id + required: true + type: string + - description: raw binary + in: body + name: body + required: true + schema: + items: + type: integer + type: array + responses: + "200": + description: UploadOk indicates a successful upload operation, represented + by the HTTP status code 200 + schema: + $ref: '#/definitions/mk20.UploadCode' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "404": + description: UploadStartCodeDealNotFound represents a 404 status indicating + the deal was not found during the upload start process + schema: + $ref: '#/definitions/mk20.UploadStartCode' + "500": + description: UploadServerError indicates a server-side error occurred during + the upload process, represented by the HTTP status code 500 + schema: + $ref: '#/definitions/mk20.UploadCode' + security: + - CurioAuth: [] + summary: Upload the deal data + /uploads/{id}: + get: + description: Return a json struct detailing the current status of a deal upload. + parameters: + - description: id + in: path + name: id + required: true + type: string + responses: + "200": + description: The status of a file upload process, including progress and + missing chunks + schema: + $ref: '#/definitions/mk20.UploadStatus' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "404": + description: UploadStatusCodeDealNotFound indicates that the requested deal + was not found, corresponding to status code 404 + schema: + $ref: '#/definitions/mk20.UploadStatusCode' + "425": + description: UploadStatusCodeUploadNotStarted indicates that the upload + process has not started yet + schema: + $ref: '#/definitions/mk20.UploadStatusCode' + "500": + description: UploadStatusCodeServerError indicates an internal server error + occurred during the upload process, corresponding to status code 500 + schema: + $ref: '#/definitions/mk20.UploadStatusCode' + security: + - CurioAuth: [] + summary: Status of deal upload + post: + consumes: + - application/json + description: Initializes the upload for a deal. Each upload must be initialized + before chunks can be uploaded for a deal. + parameters: + - description: id + in: path + name: id + required: true + type: string + - description: Metadata for initiating an upload operation + in: body + name: data + required: true + schema: + $ref: '#/definitions/mk20.StartUpload' + responses: + "200": + description: UploadStartCodeOk indicates a successful upload start request + with status code 200 + schema: + $ref: '#/definitions/mk20.UploadStartCode' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "404": + description: UploadStartCodeDealNotFound represents a 404 status indicating + the deal was not found during the upload start process + schema: + $ref: '#/definitions/mk20.UploadStartCode' + "409": + description: UploadStartCodeAlreadyStarted indicates that the upload process + has already been initiated and cannot be started again + schema: + $ref: '#/definitions/mk20.UploadStartCode' + "500": + description: UploadStartCodeServerError indicates an error occurred on the + server while processing an upload start request + schema: + $ref: '#/definitions/mk20.UploadStartCode' + security: + - CurioAuth: [] + summary: Starts the upload process + /uploads/{id}/{chunkNum}: + put: + consumes: + - application/octet-stream + description: Allows uploading chunks for a deal file. Method can be called in + parallel to speed up uploads. + parameters: + - description: id + in: path + name: id + required: true + type: string + - description: chunkNum + in: path + name: chunkNum + required: true + type: string + - description: raw binary + in: body + name: data + required: true + schema: + items: + type: integer + type: array + responses: + "200": + description: UploadOk indicates a successful upload operation, represented + by the HTTP status code 200 + schema: + $ref: '#/definitions/mk20.UploadCode' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "404": + description: UploadNotFound represents an error where the requested upload + chunk could not be found, typically corresponding to HTTP status 404 + schema: + $ref: '#/definitions/mk20.UploadCode' + "409": + description: UploadChunkAlreadyUploaded indicates that the chunk has already + been uploaded and cannot be re-uploaded + schema: + $ref: '#/definitions/mk20.UploadCode' + "500": + description: UploadServerError indicates a server-side error occurred during + the upload process, represented by the HTTP status code 500 + schema: + $ref: '#/definitions/mk20.UploadCode' + security: + - CurioAuth: [] + summary: Upload a file chunk + /uploads/finalize/{id}: + post: + consumes: + - application/json + description: Finalizes the upload process once all the chunks are uploaded. + parameters: + - description: id + in: path + name: id + required: true + type: string + - description: mk20.deal in json format + in: body + name: body + schema: + $ref: '#/definitions/mk20.Deal' + responses: + "200": + description: Ok represents a successful operation with an HTTP status code + of 200 + schema: + $ref: '#/definitions/mk20.DealCode' + "400": + description: Bad Request - Invalid input or validation error + schema: + type: string + "404": + description: ErrDealNotFound indicates that the specified deal could not + be found, corresponding to the HTTP status code 404 + schema: + $ref: '#/definitions/mk20.DealCode' + "422": + description: ErrUnsupportedDataSource indicates the specified data source + is not supported or disabled for use in the current context + schema: + $ref: '#/definitions/mk20.DealCode' + "423": + description: ErrUnsupportedProduct indicates that the requested product + is not supported by the provider + schema: + $ref: '#/definitions/mk20.DealCode' + "424": + description: ErrProductNotEnabled indicates that the requested product is + not enabled on the provider + schema: + $ref: '#/definitions/mk20.DealCode' + "425": + description: ErrProductValidationFailed indicates a failure during product-specific + validation due to invalid or missing data + schema: + $ref: '#/definitions/mk20.DealCode' + "426": + description: ErrDealRejectedByMarket indicates that a proposed deal was + rejected by the market for not meeting its acceptance criteria or rules + schema: + $ref: '#/definitions/mk20.DealCode' + "429": + description: ErrServiceOverloaded indicates that the service is overloaded + and cannot process the request at the moment + schema: + $ref: '#/definitions/mk20.DealCode' + "430": + description: ErrMalformedDataSource indicates that the provided data source + is incorrectly formatted or contains invalid data + schema: + $ref: '#/definitions/mk20.DealCode' + "440": + description: ErrMarketNotEnabled indicates that the market is not enabled + for the requested operation + schema: + $ref: '#/definitions/mk20.DealCode' + "441": + description: ErrDurationTooShort indicates that the provided duration value + does not meet the minimum required threshold + schema: + $ref: '#/definitions/mk20.DealCode' + "500": + description: ErrServerInternalError indicates an internal server error with + a corresponding error code of 500 + schema: + $ref: '#/definitions/mk20.DealCode' + "503": + description: ErrServiceMaintenance indicates that the service is temporarily + unavailable due to maintenance, corresponding to HTTP status code 503 + schema: + $ref: '#/definitions/mk20.DealCode' + security: + - CurioAuth: [] + summary: Finalizes the upload process +securityDefinitions: + CurioAuth: + description: |- + Use the format: `CurioAuth PublicKeyType:PublicKey:Signature` + + - `PublicKeyType`: String representation of type of wallet (e.g., "ed25519", "bls", "secp256k1") + - `PublicKey`: Base64 string of public key bytes + - `Signature`: Signature is Base64 string of signature bytes. + - The client is expected to sign the SHA-256 hash of a message constructed by concatenating the following components, in order. + - The raw public key bytes (not a human-readable address) + - The timestamp, truncated to the nearest hour, formatted in RFC3339 (e.g., 2025-07-15T17:00:00Z) + - These two byte slices are joined without any delimiter between them, and the resulting byte array is then hashed using SHA-256. The signature is performed on that hash. + in: header + name: Authorization + type: apiKey +swagger: "2.0" diff --git a/market/mk20/mk20.go b/market/mk20/mk20.go new file mode 100644 index 000000000..04ef59a12 --- /dev/null +++ b/market/mk20/mk20.go @@ -0,0 +1,953 @@ +package mk20 + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "runtime" + "runtime/debug" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log/v2" + "github.com/oklog/ulid" + "github.com/samber/lo" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/builtin/v16/miner" + "github.com/filecoin-project/go-state-types/builtin/v16/verifreg" + verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" + + "github.com/filecoin-project/curio/build" + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/ffi" + "github.com/filecoin-project/curio/lib/multictladdr" + "github.com/filecoin-project/curio/lib/paths" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/chain/types" +) + +var log = logging.Logger("mk20") + +type MK20API interface { + StateMinerInfo(context.Context, address.Address, types.TipSetKey) (api.MinerInfo, error) + StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationId verifreg9.AllocationId, tsk types.TipSetKey) (*verifreg9.Allocation, error) +} + +type MK20 struct { + miners *config.Dynamic[[]address.Address] + DB *harmonydb.DB + api MK20API + ethClient *ethclient.Client + si paths.SectorIndex + cfg *config.CurioConfig + sm *config.Dynamic[map[address.Address]abi.SectorSize] + as *multictladdr.MultiAddressSelector + sc *ffi.SealCalls + maxParallelUploads *atomic.Int64 + unknowClient bool +} + +func NewMK20Handler(miners *config.Dynamic[[]address.Address], db *harmonydb.DB, si paths.SectorIndex, mapi MK20API, ethClient *ethclient.Client, cfg *config.CurioConfig, as *multictladdr.MultiAddressSelector, sc *ffi.SealCalls) (*MK20, error) { + ctx := context.Background() + + // Ensure MinChunk size and max chunkSize is a power of 2 + if cfg.Market.StorageMarketConfig.MK20.MinimumChunkSize&(cfg.Market.StorageMarketConfig.MK20.MinimumChunkSize-1) != 0 { + return nil, xerrors.Errorf("MinimumChunkSize must be a power of 2") + } + + if cfg.Market.StorageMarketConfig.MK20.MaximumChunkSize&(cfg.Market.StorageMarketConfig.MK20.MaximumChunkSize-1) != 0 { + return nil, xerrors.Errorf("MaximumChunkSize must be a power of 2") + } + + sm := config.NewDynamic(make(map[address.Address]abi.SectorSize)) + smUpdate := func() error { + smTmp := make(map[address.Address]abi.SectorSize) + for _, m := range miners.Get() { + info, err := mapi.StateMinerInfo(ctx, m, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("getting miner info: %w", err) + } + if _, ok := smTmp[m]; !ok { + smTmp[m] = info.SectorSize + } + } + sm.Set(smTmp) + return nil + } + if err := smUpdate(); err != nil { + return nil, err + } + miners.OnChange(func() { + if err := smUpdate(); err != nil { + log.Errorf("error updating sm: %s", err) + } + }) + + go markDownloaded(ctx, db) + go removeNotFinalizedUploads(ctx, db) + + return &MK20{ + miners: miners, + DB: db, + api: mapi, + ethClient: ethClient, + si: si, + cfg: cfg, + sm: sm, + as: as, + sc: sc, + maxParallelUploads: new(atomic.Int64), + unknowClient: !cfg.Market.StorageMarketConfig.MK20.DenyUnknownClients, + }, nil +} + +// ExecuteDeal take a *Deal and returns ProviderDealRejectionInfo which has ErrorCode and Reason +// @param deal *Deal +// @Return DealCode +// @Return Reason string + +func (m *MK20) ExecuteDeal(ctx context.Context, deal *Deal, auth string) *ProviderDealRejectionInfo { + defer func() { + if r := recover(); r != nil { + trace := make([]byte, 1<<16) + n := runtime.Stack(trace, false) + log.Errorf("panic occurred: %v\n%s", r, trace[:n]) + debug.PrintStack() + } + }() + + // Validate the DataSource + code, err := deal.Validate(m.DB, &m.cfg.Market.StorageMarketConfig.MK20, auth) + if err != nil { + log.Errorw("deal rejected", "deal", deal, "error", err) + ret := &ProviderDealRejectionInfo{ + HTTPCode: code, + } + if code == ErrServerInternalError { + ret.Reason = "Internal server error" + } else { + ret.Reason = err.Error() + } + return ret + } + + log.Debugw("deal validated", "deal", deal.Identifier.String()) + + if deal.Products.DDOV1 != nil { + // TODO: Remove this check once DDO market is done + if build.BuildType == build.Build2k || build.BuildType == build.BuildDebug { + return m.processDDODeal(ctx, deal, nil) + } + log.Errorw("DDOV1 is not supported yet", "deal", deal.Identifier.String()) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrUnsupportedProduct, + Reason: "DDOV1 is not supported yet", + } + } + + if deal.Products.PDPV1 != nil { + return m.processPDPDeal(ctx, deal) + } + + return &ProviderDealRejectionInfo{ + HTTPCode: ErrUnsupportedProduct, + Reason: "Unsupported product", + } +} + +func (m *MK20) processDDODeal(ctx context.Context, deal *Deal, tx *harmonydb.Tx) *ProviderDealRejectionInfo { + rejection, err := m.sanitizeDDODeal(ctx, deal) + if err != nil { + log.Errorw("deal rejected", "deal", deal, "error", err) + return rejection + } + + log.Debugw("deal sanitized", "deal", deal.Identifier.String()) + + if rejection != nil { + return rejection + } + + id, code, err := deal.Products.DDOV1.GetDealID(ctx, m.DB, m.ethClient) + if err != nil { + log.Errorw("error getting deal ID", "deal", deal, "error", err) + ret := &ProviderDealRejectionInfo{ + HTTPCode: code, + } + if code == ErrServerInternalError { + ret.Reason = "Internal server error" + } else { + ret.Reason = err.Error() + } + return ret + } + + log.Debugw("deal ID found", "deal", deal.Identifier.String(), "id", id) + + // TODO: Backpressure, client filter + + process := func(tx *harmonydb.Tx) error { + err = deal.SaveToDB(tx) + if err != nil { + return err + } + n, err := tx.Exec(`UPDATE market_mk20_deal + SET ddo_v1 = jsonb_set(ddo_v1, '{deal_id}', to_jsonb($1::bigint)) + WHERE id = $2;`, id, deal.Identifier.String()) + if err != nil { + return err + } + if n != 1 { + return fmt.Errorf("expected 1 row to be updated, got %d", n) + } + + // Assume upload if no data source defined + if deal.Data == nil { + _, err = tx.Exec(`INSERT INTO market_mk20_upload_waiting (id) VALUES ($1) ON CONFLICT (id) DO NOTHING`, deal.Identifier.String()) + } else { + if deal.Data.SourceHttpPut != nil { + _, err = tx.Exec(`INSERT INTO market_mk20_upload_waiting (id) VALUES ($1) ON CONFLICT (id) DO NOTHING`, deal.Identifier.String()) + } else { + // All deals which are not upload should be entered in market_mk20_pipeline_waiting for further processing. + _, err = tx.Exec(`INSERT INTO market_mk20_pipeline_waiting (id) VALUES ($1) ON CONFLICT (id) DO NOTHING`, deal.Identifier.String()) + } + } + + if err != nil { + return xerrors.Errorf("adding deal to waiting pipeline: %w", err) + } + return nil + } + + if tx != nil { + err := process(tx) + if err != nil { + log.Errorw("error inserting deal into DB", "deal", deal, "error", err) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + } + } + } else { + comm, err := m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + err = process(tx) + if err != nil { + return false, err + } + return true, nil + }) + + if err != nil { + log.Errorw("error inserting deal into DB", "deal", deal, "error", err) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + } + } + + if !comm { + log.Errorw("error committing deal into DB", "deal", deal) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + } + } + } + + log.Debugw("deal inserted in DB", "deal", deal.Identifier.String()) + + return &ProviderDealRejectionInfo{ + HTTPCode: Ok, + } +} + +func (m *MK20) sanitizeDDODeal(ctx context.Context, deal *Deal) (*ProviderDealRejectionInfo, error) { + if !lo.Contains(m.miners.Get(), deal.Products.DDOV1.Provider) { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Provider not available in Curio cluster", + }, nil + } + + if deal.Data == nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Data Source must be defined for a DDO deal", + }, nil + } + + if deal.Products.RetrievalV1 == nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Retrieval product must be defined for a DDO deal", + }, nil + } + + if deal.Products.RetrievalV1.AnnouncePiece { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Piece cannot be announced for a DDO deal", + }, nil + } + + size, err := deal.Size() + if err != nil { + log.Errorw("error getting deal size", "deal", deal, "error", err) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Error getting deal size from PieceCID", + }, nil + } + + if size > abi.PaddedPieceSize(m.sm.Get()[deal.Products.DDOV1.Provider]) { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Deal size is larger than the miner's sector size", + }, nil + } + + if deal.Data.Format.Raw != nil { + if deal.Products.RetrievalV1 != nil { + if deal.Products.RetrievalV1.Indexing { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Raw bytes deal cannot be indexed", + }, nil + } + } + } + + if deal.Products.DDOV1.AllocationId != nil { + if size < abi.PaddedPieceSize(verifreg.MinimumVerifiedAllocationSize) { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Verified piece size must be at least 1MB", + }, nil + } + + client, err := address.NewFromString(deal.Client) + if err != nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Client address is not valid", + }, nil + } + + alloc, err := m.api.StateGetAllocation(ctx, client, verifreg9.AllocationId(*deal.Products.DDOV1.AllocationId), types.EmptyTSK) + if err != nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + }, xerrors.Errorf("getting allocation: %w", err) + } + + if alloc == nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Verified piece must have a valid allocation ID", + }, nil + } + + clientID, err := address.IDFromAddress(client) + if err != nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Invalid client address", + }, nil + } + + if alloc.Client != abi.ActorID(clientID) { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "client address does not match the allocation client address", + }, nil + } + + prov, err := address.NewIDAddress(uint64(alloc.Provider)) + if err != nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + }, xerrors.Errorf("getting provider address: %w", err) + } + + if !lo.Contains(m.miners.Get(), prov) { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Allocation provider does not belong to the list of miners in Curio cluster", + }, nil + } + + if !deal.Data.PieceCID.Equals(alloc.Data) { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Allocation data CID does not match the piece CID", + }, nil + } + + if size != alloc.Size { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Allocation size does not match the piece size", + }, nil + } + + if alloc.TermMin > miner.MaxSectorExpirationExtension-policy.SealRandomnessLookback { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Allocation term min is greater than the maximum sector expiration extension", + }, nil + } + } + + return nil, nil +} + +func (m *MK20) processPDPDeal(ctx context.Context, deal *Deal) *ProviderDealRejectionInfo { + defer func() { + if r := recover(); r != nil { + trace := make([]byte, 1<<16) + n := runtime.Stack(trace, false) + log.Errorf("panic occurred in PDP: %v\n%s", r, trace[:n]) + debug.PrintStack() + } + }() + + rejection, err := m.sanitizePDPDeal(ctx, deal) + if err != nil { + log.Errorw("PDP deal rejected", "deal", deal, "error", err) + return rejection + } + + log.Debugw("PDP deal sanitized", "deal", deal.Identifier.String()) + + if rejection != nil { + return rejection + } + + // Save deal to DB and start pipeline if required + comm, err := m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // Save deal + err = deal.SaveToDB(tx) + if err != nil { + return false, xerrors.Errorf("saving deal to DB: %w", err) + } + + pdp := deal.Products.PDPV1 + + if pdp.AddPiece { + // If we have data source other that PUT then start the pipeline + if deal.Data != nil { + if deal.Data.SourceHTTP != nil || deal.Data.SourceAggregate != nil { + err = insertPDPPipeline(ctx, tx, deal) + if err != nil { + return false, xerrors.Errorf("inserting pipeline: %w", err) + } + } + if deal.Data.SourceHttpPut != nil { + _, err = tx.Exec(`INSERT INTO market_mk20_upload_waiting (id) VALUES ($1) ON CONFLICT (id) DO NOTHING`, deal.Identifier.String()) + if err != nil { + return false, xerrors.Errorf("inserting upload waiting: %w", err) + } + } + } else { + // Assume upload + _, err = tx.Exec(`INSERT INTO market_mk20_upload_waiting (id) VALUES ($1) ON CONFLICT (id) DO NOTHING`, deal.Identifier.String()) + if err != nil { + return false, xerrors.Errorf("inserting upload waiting: %w", err) + } + } + } + + if pdp.CreateDataSet { + n, err := m.DB.Exec(ctx, `INSERT INTO pdp_data_set_create (id, client, record_keeper, extra_data) VALUES ($1, $2, $3, $4)`, + deal.Identifier.String(), deal.Client, pdp.RecordKeeper, pdp.ExtraData) + if err != nil { + return false, xerrors.Errorf("inserting PDP proof set create: %w", err) + } + if n != 1 { + return false, fmt.Errorf("expected 1 row to be updated, got %d", n) + } + } + + if pdp.DeleteDataSet { + n, err := m.DB.Exec(ctx, `INSERT INTO pdp_data_set_delete (id, client, set_id, extra_data) VALUES ($1, $2, $3, $4)`, + deal.Identifier.String(), deal.Client, *pdp.DataSetID, pdp.ExtraData) + if err != nil { + return false, xerrors.Errorf("inserting PDP proof set delete: %w", err) + } + if n != 1 { + return false, fmt.Errorf("expected 1 row to be updated, got %d", n) + } + } + + if pdp.DeletePiece { + n, err := m.DB.Exec(ctx, `INSERT INTO pdp_piece_delete (id, client, set_id, pieces, extra_data) VALUES ($1, $2, $3, $4, $5)`, + deal.Identifier.String(), deal.Client, *pdp.DataSetID, pdp.PieceIDs, pdp.ExtraData) + if err != nil { + return false, xerrors.Errorf("inserting PDP delete root: %w", err) + } + if n != 1 { + return false, fmt.Errorf("expected 1 row to be updated, got %d", n) + } + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + log.Errorw("error inserting PDP deal into DB", "deal", deal, "error", err) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + } + } + if !comm { + log.Errorw("error committing PDP deal into DB", "deal", deal) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + } + } + log.Debugw("PDP deal inserted in DB", "deal", deal.Identifier.String()) + return &ProviderDealRejectionInfo{ + HTTPCode: Ok, + } +} + +func (m *MK20) sanitizePDPDeal(ctx context.Context, deal *Deal) (*ProviderDealRejectionInfo, error) { + if deal.Products.PDPV1.AddPiece && deal.Products.RetrievalV1 == nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Retrieval deal is required for pdp_v1", + }, nil + } + + if deal.Data != nil { + if deal.Data.SourceOffline != nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Offline data source is not supported for pdp_v1", + }, nil + } + + if deal.Data.Format.Raw != nil && deal.Products.RetrievalV1.AnnouncePayload { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "Raw bytes deal cannot be announced to IPNI", + }, nil + } + } + + p := deal.Products.PDPV1 + + // This serves as Auth for now. We are checking if client is authorized to make changes to the proof set or pieces + // In future this will be replaced by an ACL check + + if p.DeleteDataSet || p.AddPiece { + pid := *p.DataSetID + var exists bool + err := m.DB.QueryRow(ctx, `SELECT EXISTS(SELECT 1 FROM pdp_data_set WHERE id = $1 AND removed = FALSE AND client = $2)`, pid, deal.Client).Scan(&exists) + if err != nil { + log.Errorw("error checking if proofset exists", "error", err) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + Reason: "", + }, nil + } + if !exists { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "proofset does not exist for the client", + }, nil + } + } + + if p.DeletePiece { + pid := *p.DataSetID + var exists bool + err := m.DB.QueryRow(ctx, `SELECT COUNT(*) = cardinality($2::BIGINT[]) AS all_exist_and_active + FROM pdp_dataset_piece r + JOIN pdp_data_set s ON r.data_set_id = s.id + WHERE r.data_set_id = $1 + AND r.piece = ANY($2) + AND r.removed = FALSE + AND s.removed = FALSE + AND r.client = $3 + AND s.client = $3;`, pid, p.PieceIDs, deal.Client).Scan(&exists) + if err != nil { + log.Errorw("error checking if dataset and pieces exist for the client", "error", err) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + Reason: "", + }, nil + + } + if !exists { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "dataset or one of the pieces does not exist for the client", + }, nil + } + } + + return nil, nil +} + +func insertPDPPipeline(ctx context.Context, tx *harmonydb.Tx, deal *Deal) error { + pdp := deal.Products.PDPV1 + retv := deal.Products.RetrievalV1 + data := deal.Data + dealID := deal.Identifier.String() + pi, err := deal.PieceInfo() + if err != nil { + return fmt.Errorf("getting piece info: %w", err) + } + + aggregation := 0 + if data.Format.Aggregate != nil { + aggregation = int(data.Format.Aggregate.Type) + } + + // Insert pipeline when Data source is HTTP + if data.SourceHTTP != nil { + var pieceID int64 + // Attempt to select the piece ID first + err = tx.QueryRow(`SELECT id FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2`, pi.PieceCIDV1.String(), pi.Size).Scan(&pieceID) + + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + // Piece does not exist, attempt to insert + err = tx.QueryRow(` + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term) + VALUES ($1, $2, $3, TRUE) + ON CONFLICT (piece_cid, piece_padded_size, long_term, cleanup_task_id) DO NOTHING + RETURNING id`, pi.PieceCIDV1.String(), pi.Size, pi.RawSize).Scan(&pieceID) + if err != nil { + return xerrors.Errorf("inserting new parked piece and getting id: %w", err) + } + } else { + // Some other error occurred during select + return xerrors.Errorf("checking existing parked piece: %w", err) + } + } + + var refIds []int64 + + // Add parked_piece_refs + for _, src := range data.SourceHTTP.URLs { + var refID int64 + + headers, err := json.Marshal(src.Headers) + if err != nil { + return xerrors.Errorf("marshaling headers: %w", err) + } + + err = tx.QueryRow(`INSERT INTO parked_piece_refs (piece_id, data_url, data_headers, long_term) + VALUES ($1, $2, $3, TRUE) RETURNING ref_id`, pieceID, src.URL, headers).Scan(&refID) + if err != nil { + return xerrors.Errorf("inserting parked piece ref: %w", err) + } + refIds = append(refIds, refID) + } + + n, err := tx.Exec(`INSERT INTO market_mk20_download_pipeline (id, piece_cid_v2, product, ref_ids) VALUES ($1, $2, $3, $4)`, + dealID, deal.Data.PieceCID.String(), ProductNamePDPV1, refIds) + if err != nil { + return xerrors.Errorf("inserting PDP download pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("inserting PDP download pipeline: %d rows affected", n) + } + + n, err = tx.Exec(`INSERT INTO pdp_pipeline ( + id, client, piece_cid_v2, data_set_id, extra_data, deal_aggregation, indexing, announce, announce_payload) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, + dealID, deal.Client, data.PieceCID.String(), *pdp.DataSetID, + pdp.ExtraData, aggregation, retv.Indexing, retv.AnnouncePiece, retv.AnnouncePayload) + if err != nil { + return xerrors.Errorf("inserting PDP pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("inserting PDP pipeline: %d rows affected", n) + } + return nil + } + + // Insert pipeline when data source is aggregate + if deal.Data.SourceAggregate != nil { + + // Find all unique pieces where data source is HTTP + type downloadkey struct { + ID string + PieceCIDV2 cid.Cid + PieceCID cid.Cid + Size abi.PaddedPieceSize + RawSize uint64 + } + toDownload := make(map[downloadkey][]HttpUrl) + + for _, piece := range deal.Data.SourceAggregate.Pieces { + spi, err := GetPieceInfo(piece.PieceCID) + if err != nil { + return xerrors.Errorf("getting piece info: %w", err) + } + if piece.SourceHTTP != nil { + urls, ok := toDownload[downloadkey{ID: dealID, PieceCIDV2: piece.PieceCID, PieceCID: spi.PieceCIDV1, Size: spi.Size, RawSize: spi.RawSize}] + if ok { + toDownload[downloadkey{ID: dealID, PieceCIDV2: piece.PieceCID, PieceCID: spi.PieceCIDV1, Size: spi.Size}] = append(urls, piece.SourceHTTP.URLs...) + } else { + toDownload[downloadkey{ID: dealID, PieceCIDV2: piece.PieceCID, PieceCID: spi.PieceCIDV1, Size: spi.Size, RawSize: spi.RawSize}] = piece.SourceHTTP.URLs + } + } + } + + batch := &pgx.Batch{} + batchSize := 5000 + + for k, v := range toDownload { + for _, src := range v { + headers, err := json.Marshal(src.Headers) + if err != nil { + return xerrors.Errorf("marshal headers: %w", err) + } + batch.Queue(`WITH inserted_piece AS ( + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term) + VALUES ($1, $2, $3, FALSE) + ON CONFLICT (piece_cid, piece_padded_size, long_term, cleanup_task_id) DO NOTHING + RETURNING id + ), + selected_piece AS ( + SELECT COALESCE( + (SELECT id FROM inserted_piece), + (SELECT id FROM parked_pieces + WHERE piece_cid = $1 AND piece_padded_size = $2 AND long_term = FALSE AND cleanup_task_id IS NULL) + ) AS id + ), + inserted_ref AS ( + INSERT INTO parked_piece_refs (piece_id, data_url, data_headers, long_term) + SELECT id, $4, $5, FALSE FROM selected_piece + RETURNING ref_id + ) + INSERT INTO market_mk20_download_pipeline (id, piece_cid_v2, product, ref_ids) + VALUES ($6, $8, $7, ARRAY[(SELECT ref_id FROM inserted_ref)]) + ON CONFLICT (id, piece_cid_v2, product) DO UPDATE + SET ref_ids = array_append( + market_mk20_download_pipeline.ref_ids, + (SELECT ref_id FROM inserted_ref) + ) + WHERE NOT market_mk20_download_pipeline.ref_ids @> ARRAY[(SELECT ref_id FROM inserted_ref)];`, + k.PieceCID.String(), k.Size, k.RawSize, src.URL, headers, k.ID, ProductNamePDPV1, k.PieceCIDV2.String()) + } + + if batch.Len() > batchSize { + res := tx.SendBatch(ctx, batch) + if err := res.Close(); err != nil { + return xerrors.Errorf("closing parked piece query batch: %w", err) + } + batch = &pgx.Batch{} + } + } + + if batch.Len() > 0 { + res := tx.SendBatch(ctx, batch) + if err := res.Close(); err != nil { + return xerrors.Errorf("closing parked piece query batch: %w", err) + } + } + + pBatch := &pgx.Batch{} + pBatchSize := 4000 + for i, piece := range deal.Data.SourceAggregate.Pieces { + pBatch.Queue(`INSERT INTO pdp_pipeline ( + id, client, piece_cid_v2, data_set_id, extra_data, piece_ref, deal_aggregation, aggr_index, indexing, announce, announce_payload) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, + dealID, deal.Client, piece.PieceCID.String(), pdp.ExtraData, *pdp.DataSetID, + aggregation, i, retv.Indexing, retv.AnnouncePiece, retv.AnnouncePayload) + if pBatch.Len() > pBatchSize { + res := tx.SendBatch(ctx, pBatch) + if err := res.Close(); err != nil { + return xerrors.Errorf("closing mk20 pipeline insert batch: %w", err) + } + pBatch = &pgx.Batch{} + } + } + if pBatch.Len() > 0 { + res := tx.SendBatch(ctx, pBatch) + if err := res.Close(); err != nil { + return xerrors.Errorf("closing mk20 pipeline insert batch: %w", err) + } + } + return nil + } + + return xerrors.Errorf("unknown data source type") +} + +func markDownloaded(ctx context.Context, db *harmonydb.DB) { + md := func(ctx context.Context, db *harmonydb.DB) { + n, err := db.Exec(ctx, `SELECT mk20_pdp_mark_downloaded($1)`, ProductNamePDPV1) + if err != nil { + log.Errorf("failed to mark PDP downloaded piece: %v", err) + return + } + log.Debugf("Succesfully marked %d PDP pieces as downloaded", n) + } + + ticker := time.NewTicker(time.Second * 2) + defer ticker.Stop() + for { + select { + case <-ticker.C: + md(ctx, db) + case <-ctx.Done(): + return + } + } +} + +// UpdateDeal updates the details of a deal specified by its ID and returns ProviderDealRejectionInfo which has ErrorCode and Reason +// @param id ulid.ULID +// @param deal *Deal +// @Return DealCode +// @Return Reason string + +func (m *MK20) UpdateDeal(id ulid.ULID, deal *Deal, auth string) *ProviderDealRejectionInfo { + if deal == nil { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrBadProposal, + Reason: "deal is undefined", + } + } + + ctx := context.Background() + + var exists bool + err := m.DB.QueryRow(ctx, `SELECT EXISTS ( + SELECT 1 + FROM market_mk20_deal + WHERE id = $1)`, id.String()).Scan(&exists) + if err != nil { + log.Errorw("failed to check if deal exists", "deal", id, "error", err) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + Reason: "", + } + } + + if !exists { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrDealNotFound, + Reason: "", + } + } + + code, nd, np, err := m.updateDealDetails(id, deal, auth) + if err != nil { + log.Errorw("failed to update deal details", "deal", id, "error", err) + if code == ErrServerInternalError { + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + Reason: "", + } + } else { + return &ProviderDealRejectionInfo{ + HTTPCode: code, + Reason: err.Error(), + } + } + } + + var rejection *ProviderDealRejectionInfo + + comm, err := m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // Save the updated deal to DB + err = nd.UpdateDeal(tx) + if err != nil { + return false, xerrors.Errorf("failed to update deal: %w", err) + } + + // Initiate new pipelines for DDO if required + for _, p := range np { + if p == ProductNameDDOV1 { + rejection = m.processDDODeal(ctx, nd, tx) + if rejection.HTTPCode != Ok { + return false, xerrors.Errorf("failed to process DDO deal") + } + } + } + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + log.Errorw("failed to update deal details", "deal", id, "error", err) + if rejection != nil { + return rejection + } + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + Reason: "", + } + } + + if !comm { + log.Errorw("failed to commit deal details", "deal", id, "error", err) + return &ProviderDealRejectionInfo{ + HTTPCode: ErrServerInternalError, + Reason: "", + } + } + + return &ProviderDealRejectionInfo{ + HTTPCode: Ok, + Reason: "", + } +} + +// To be used later for when data source is minerID +//func validateMinerAddresses(madrs []abi.Multiaddrs, pcid cid.Cid, psize abi.PaddedPieceSize, rawSize int64) bool { +// var surls []*url.URL +// for _, adr := range madrs { +// surl, err := maurl.ToURL(multiaddr.Cast(adr)) +// if err != nil { +// continue +// } +// surls = append(surls, surl) +// } +// +// var validUrls []*url.URL +// +// for _, surl := range surls { +// if surl.Scheme == "ws" { +// surl.Scheme = "http" +// } +// +// if surl.Scheme == "wss" { +// surl.Scheme = "https" +// } +// +// if surl.Port() == "443" { +// surl.Host = surl.Hostname() +// } +// +// if surl.Port() == "80" { +// surl.Host = surl.Hostname() +// } +// +// resp, err := http.Head(surl.String() + "/piece/" + pcid.String()) +// if err != nil { +// continue +// } +// if resp.StatusCode != 200 { +// continue +// } +// +// if resp.Header.Get("Content-Length") != fmt.Sprint(psize) { +// continue +// } +// +// validUrls = append(validUrls, surl) +// } +// return len(validUrls) > 0 +//} diff --git a/market/mk20/mk20_upload.go b/market/mk20/mk20_upload.go new file mode 100644 index 000000000..e13d053f6 --- /dev/null +++ b/market/mk20/mk20_upload.go @@ -0,0 +1,1337 @@ +package mk20 + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "net/http" + "net/url" + "runtime" + "runtime/debug" + "time" + + "github.com/ipfs/go-cid" + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + commcid "github.com/filecoin-project/go-fil-commcid" + commp "github.com/filecoin-project/go-fil-commp-hashhash" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/storiface" +) + +// HandleUploadStatus retrieves and returns the upload status of a deal, including chunk completion details, or reports errors if the process fails. +// @param ID ulid.ULID +// @Return UploadStatusCode + +func (m *MK20) HandleUploadStatus(ctx context.Context, id ulid.ULID, w http.ResponseWriter) { + var exists bool + err := m.DB.QueryRow(ctx, `SELECT EXISTS ( + SELECT 1 + FROM market_mk20_upload_waiting + WHERE id = $1 + AND (chunked IS NULL OR chunked = TRUE) + );`, id.String()).Scan(&exists) + if err != nil { + log.Errorw("failed to check if upload is waiting for data", "deal", id, "error", err) + w.WriteHeader(int(UploadStatusCodeServerError)) + return + } + if !exists { + http.Error(w, "deal not found", int(UploadStatusCodeDealNotFound)) + return + } + + var ret UploadStatus + + err = m.DB.QueryRow(ctx, `SELECT + COUNT(*) AS total, + COUNT(*) FILTER (WHERE complete) AS complete, + COUNT(*) FILTER (WHERE NOT complete) AS missing, + ARRAY_AGG(chunk ORDER BY chunk) FILTER (WHERE complete) AS completed_chunks, + ARRAY_AGG(chunk ORDER BY chunk) FILTER (WHERE NOT complete) AS incomplete_chunks + FROM + market_mk20_deal_chunk + WHERE + id = $1 + GROUP BY + id;`, id.String()).Scan(&ret.TotalChunks, &ret.Uploaded, &ret.Missing, &ret.UploadedChunks, &ret.MissingChunks) + if err != nil { + if !errors.Is(err, pgx.ErrNoRows) { + log.Errorw("failed to get upload status", "deal", id, "error", err) + w.WriteHeader(int(UploadStatusCodeServerError)) + return + } + + http.Error(w, "upload not initiated", int(UploadStatusCodeUploadNotStarted)) + return + } + + data, err := json.Marshal(ret) + if err != nil { + log.Errorw("failed to marshal upload status", "deal", id, "error", err) + w.WriteHeader(int(UploadStatusCodeServerError)) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(int(UploadStatusCodeOk)) + + _, err = w.Write(data) + if err != nil { + log.Errorw("failed to write upload status", "deal", id, "error", err) + } +} + +// HandleUploadStart handles the initialization of a file upload process for a specific deal, validating input and creating database entries. +// @param ID ulid.ULID +// @param upload StartUpload +// @Return UploadStartCode + +func (m *MK20) HandleUploadStart(ctx context.Context, id ulid.ULID, upload StartUpload, w http.ResponseWriter) { + chunkSize := upload.ChunkSize + if upload.RawSize == 0 { + log.Errorw("raw size must be greater than 0", "id", id) + http.Error(w, "raw size must be greater than 0", int(UploadStartCodeBadRequest)) + return + } + + if chunkSize == 0 { + log.Errorw("chunk size must be greater than 0", "id", id) + http.Error(w, "chunk size must be greater than 0", int(UploadStartCodeBadRequest)) + return + } + + // Check if chunk size is a power of 2 + if chunkSize&(chunkSize-1) != 0 { + log.Errorw("chunk size must be a power of 2", "id", id) + http.Error(w, "chunk size must be a power of 2", int(UploadStartCodeBadRequest)) + return + } + + // Check that chunk size align with config + if chunkSize < m.cfg.Market.StorageMarketConfig.MK20.MinimumChunkSize { + log.Errorw("chunk size too small", "id", id) + http.Error(w, "chunk size too small", int(UploadStartCodeBadRequest)) + return + } + if chunkSize > m.cfg.Market.StorageMarketConfig.MK20.MaximumChunkSize { + log.Errorw("chunk size too large", "id", id) + http.Error(w, "chunk size too large", int(UploadStartCodeBadRequest)) + return + } + + // Check if deal exists + var exists bool + + err := m.DB.QueryRow(ctx, `SELECT EXISTS ( + SELECT 1 + FROM market_mk20_upload_waiting + WHERE id = $1 AND chunked IS NULL);`, id.String()).Scan(&exists) + if err != nil { + log.Errorw("failed to check if deal is waiting for upload to start", "deal", id, "error", err) + http.Error(w, "", int(UploadStartCodeServerError)) + return + } + if !exists { + http.Error(w, "deal not found", int(UploadStartCodeDealNotFound)) + return + } + + // Check if we already started the upload + var started bool + err = m.DB.QueryRow(ctx, `SELECT EXISTS ( + SELECT 1 + FROM market_mk20_deal_chunk + WHERE id = $1);`, id.String()).Scan(&started) + if err != nil { + log.Errorw("failed to check if deal upload has started", "deal", id, "error", err) + http.Error(w, "", int(UploadStartCodeServerError)) + return + } + + if started { + http.Error(w, "deal upload has already started", int(UploadStartCodeAlreadyStarted)) + return + } + + deal, err := DealFromDB(ctx, m.DB, id) + if err != nil { + log.Errorw("failed to get deal from db", "deal", id, "error", err) + http.Error(w, "", int(UploadStartCodeServerError)) + return + } + + var rawSize uint64 + + if deal.Data != nil { + rawSize, err = deal.RawSize() + if err != nil { + log.Errorw("failed to get raw size of deal", "deal", id, "error", err) + http.Error(w, "", int(UploadStartCodeServerError)) + return + } + if rawSize != upload.RawSize { + log.Errorw("raw size of deal does not match the one provided in deal", "deal", id, "error", err) + http.Error(w, "", int(UploadStartCodeBadRequest)) + } + } + + numChunks := int(math.Ceil(float64(rawSize) / float64(chunkSize))) + + // Create rows in market_mk20_deal_chunk for each chunk for the ID + comm, err := m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + batch := &pgx.Batch{} + batchSize := 15000 + for i := 1; i <= numChunks; i++ { + if i < numChunks { + batch.Queue(`INSERT INTO market_mk20_deal_chunk (id, chunk, chunk_size, complete) VALUES ($1, $2, $3, FALSE);`, id.String(), i, chunkSize) + } else { + // Calculate the size of last chunk + s := int64(rawSize) - (int64(numChunks-1) * chunkSize) + if s <= 0 || s > chunkSize { + return false, xerrors.Errorf("invalid chunk size") + } + + batch.Queue(`INSERT INTO market_mk20_deal_chunk (id, chunk, chunk_size, complete) VALUES ($1, $2, $3, FALSE);`, id.String(), i, s) + } + if batch.Len() >= batchSize { + res := tx.SendBatch(ctx, batch) + if err := res.Close(); err != nil { + return false, xerrors.Errorf("closing insert chunk batch: %w", err) + } + batch = &pgx.Batch{} + } + } + if batch.Len() > 0 { + res := tx.SendBatch(ctx, batch) + if err := res.Close(); err != nil { + return false, xerrors.Errorf("closing insert chunk batch: %w", err) + } + } + n, err := tx.Exec(`UPDATE market_mk20_upload_waiting SET chunked = TRUE WHERE id = $1`, id.String()) + if err != nil { + return false, xerrors.Errorf("updating chunked flag: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating chunked flag: expected 1 row updated, got %d", n) + } + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + log.Errorw("failed to create chunks for deal", "deal", id, "error", err) + http.Error(w, "", int(UploadStartCodeServerError)) + return + } + if !comm { + log.Errorw("failed to create chunks for deal", "deal", id, "error", err) + http.Error(w, "", int(UploadStartCodeServerError)) + return + } + w.WriteHeader(int(UploadStartCodeOk)) +} + +// HandleUploadChunk processes a single chunk upload for a deal and validates its state. +// It checks if the chunk exists, ensures it's not already uploaded, and stores it if valid. +// The function updates the database with chunk details and manages transaction rolls back on failure. +// @param id ulid.ULID +// @param chunk int +// @param data []byte +// @Return UploadCode + +func (m *MK20) HandleUploadChunk(id ulid.ULID, chunk int, data io.ReadCloser, w http.ResponseWriter) { + if m.maxParallelUploads.Load()+1 > int64(m.cfg.Market.StorageMarketConfig.MK20.MaxParallelChunkUploads) { + log.Errorw("max parallel uploads reached", "deal", id, "chunk", chunk, "error", "max parallel uploads reached") + http.Error(w, "too many parallel uploads for provider", int(UploadRateLimit)) + return + } + + ctx := context.Background() + defer func() { + _ = data.Close() + }() + + if chunk < 1 { + http.Error(w, "chunk must be greater than 0", int(UploadBadRequest)) + return + } + + var chunkDetails []struct { + Chunk int `db:"chunk"` + Size int64 `db:"chunk_size"` + Complete bool `db:"complete"` + RefID sql.NullInt64 `db:"ref_id"` + } + err := m.DB.Select(ctx, &chunkDetails, `SELECT chunk, chunk_size, ref_id, complete + FROM market_mk20_deal_chunk + WHERE id = $1 AND chunk = $2`, id.String(), chunk) + if err != nil { + log.Errorw("failed to check if chunk exists", "deal", id, "chunk", chunk, "error", err) + http.Error(w, "", int(UploadServerError)) + } + + if len(chunkDetails) == 0 { + http.Error(w, "chunk not found", int(UploadNotFound)) + return + } + + if len(chunkDetails) > 1 { + log.Errorw("chunk exists multiple times", "deal", id, "chunk", chunk, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + + if chunkDetails[0].Complete { + http.Error(w, "chunk already uploaded", int(UploadChunkAlreadyUploaded)) + return + } + + if chunkDetails[0].RefID.Valid { + http.Error(w, "chunk already uploaded", int(UploadChunkAlreadyUploaded)) + return + } + + log.Debugw("uploading chunk", "deal", id, "chunk", chunk) + + chunkSize := chunkDetails[0].Size + reader := NewTimeoutLimitReader(data, time.Second*5) + m.maxParallelUploads.Add(1) + defer func() { + m.maxParallelUploads.Add(-1) + }() + + // Generate unique tmp pieceCID and Size for parked_pieces tables + wr := new(commp.Calc) + n, err := fmt.Fprintf(wr, "%s, %d, %d, %s", id.String(), chunk, chunkSize, time.Now().String()) + if err != nil { + log.Errorw("failed to generate unique tmp pieceCID and Size for parked_pieces tables", "deal", id, "chunk", chunk, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + digest, tsize, err := wr.Digest() + if err != nil { + panic(err) + } + + tpcid, err := commcid.DataCommitmentV1ToCID(digest) + if err != nil { + log.Errorw("failed to generate unique tmp pieceCID and Size for parked_pieces tables", "deal", id, "chunk", chunk, "error", err) + http.Error(w, "failed to generate piece cid"+err.Error(), int(UploadServerError)) + return + } + var pnum, refID int64 + + // Generate piece park details with tmp pieceCID and Size + comm, err := m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + err = tx.QueryRow(`SELECT id FROM parked_pieces + WHERE piece_cid = $1 + AND piece_padded_size = $2 + AND piece_raw_size = $3`, tpcid.String(), tsize, n).Scan(&pnum) + + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + err = tx.QueryRow(` + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term, skip) + VALUES ($1, $2, $3, FALSE, TRUE) + ON CONFLICT (piece_cid, piece_padded_size, long_term, cleanup_task_id) DO NOTHING + RETURNING id`, tpcid.String(), tsize, n).Scan(&pnum) + if err != nil { + return false, xerrors.Errorf("inserting new parked piece and getting id: %w", err) + } + } else { + return false, xerrors.Errorf("checking existing parked piece: %w", err) + } + } + + // Add parked_piece_ref + err = tx.QueryRow(`INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, FALSE) RETURNING ref_id`, pnum, "/PUT").Scan(&refID) + if err != nil { + return false, xerrors.Errorf("inserting parked piece ref: %w", err) + } + + return true, nil + }) + + if err != nil { + log.Errorw("failed to update chunk", "deal", id, "chunk", chunk, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + + if !comm { + log.Errorw("failed to update chunk", "deal", id, "chunk", chunk, "error", "failed to commit transaction") + http.Error(w, "", int(UploadServerError)) + return + } + + log.Debugw("tmp piece details generated for the chunk", "deal", id, "chunk", chunk) + + failed := true + defer func() { + if failed { + _, err = m.DB.Exec(ctx, `DELETE FROM parked_piece_refs WHERE ref_id = $1`, refID) + if err != nil { + log.Errorw("failed to delete parked piece ref", "deal", id, "chunk", chunk, "error", err) + } + } + }() + + // Store the piece and generate PieceCID and Size + pi, _, err := m.sc.WriteUploadPiece(ctx, storiface.PieceNumber(pnum), chunkSize, reader, storiface.PathSealing, true) + if err != nil { + log.Errorw("failed to write piece", "deal", id, "chunk", chunk, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + + log.Debugw("piece stored", "deal", id, "chunk", chunk) + + // Update piece park details with correct values + comm, err = m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE parked_pieces SET + piece_cid = $1, + piece_padded_size = $2, + piece_raw_size = $3, + complete = true + WHERE id = $4`, + pi.PieceCID.String(), pi.Size, chunkSize, pnum) + if err != nil { + return false, xerrors.Errorf("updating parked piece: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating parked piece: expected 1 row updated, got %d", n) + } + + n, err = tx.Exec(`UPDATE market_mk20_deal_chunk SET + complete = TRUE, + completed_at = NOW() AT TIME ZONE 'UTC', + ref_id = $1 + WHERE id = $2 + AND chunk = $3 + AND complete = FALSE + AND ref_id IS NULL`, refID, id.String(), chunk) + if err != nil { + return false, xerrors.Errorf("updating chunk url: %w", err) + } + + return n == 1, nil + }) + + if err != nil { + log.Errorw("failed to update chunk", "deal", id, "chunk", chunk, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + + if !comm { + log.Errorw("failed to update chunk", "deal", id, "chunk", chunk, "error", "failed to commit transaction") + http.Error(w, "", int(UploadServerError)) + return + } + + log.Debugw("chunk upload finished", "deal", id, "chunk", chunk) + + failed = false + w.WriteHeader(int(UploadOk)) +} + +// HandleUploadFinalize completes the upload process for a deal by verifying its chunks, updating the deal, and marking the upload as finalized. +// @param id ulid.ULID +// @param deal *Deal [optional] +// @Return DealCode + +func (m *MK20) HandleUploadFinalize(id ulid.ULID, deal *Deal, w http.ResponseWriter, auth string) { + ctx := context.Background() + var exists bool + err := m.DB.QueryRow(ctx, `SELECT EXISTS ( + SELECT 1 + FROM market_mk20_deal_chunk + WHERE id = $1 AND complete = FALSE OR complete IS NULL + )`, id.String()).Scan(&exists) + if err != nil { + log.Errorw("failed to check if deal upload has started", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + + if exists { + http.Error(w, "deal upload has not finished", http.StatusBadRequest) + return + } + + ddeal, err := DealFromDB(ctx, m.DB, id) + if err != nil { + log.Errorw("failed to get deal from db", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + + if ddeal.Data == nil && deal == nil { + log.Errorw("cannot finalize deal with missing data source", "deal", id) + http.Error(w, "cannot finalize deal with missing data source", int(ErrBadProposal)) + return + } + + var rawSize uint64 + var newDeal *Deal + var dealUpdated bool + + if deal != nil { + // This is a deal where DataSource was not set - we should update the deal + code, ndeal, _, err := m.updateDealDetails(id, deal, auth) + if err != nil { + log.Errorw("failed to update deal details", "deal", id, "error", err) + if code == ErrServerInternalError { + http.Error(w, "", int(ErrServerInternalError)) + } else { + http.Error(w, err.Error(), int(code)) + } + return + } + rawSize, err = ndeal.RawSize() + if err != nil { + log.Errorw("failed to get raw size of deal", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + newDeal = ndeal + dealUpdated = true + } else { + rawSize, err = ddeal.RawSize() + if err != nil { + log.Errorw("failed to get raw size of deal", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + newDeal = ddeal + } + + var valid bool + + err = m.DB.QueryRow(ctx, `SELECT SUM(chunk_size) = $2 AS valid + FROM market_mk20_deal_chunk + WHERE id = $1;`, id.String(), rawSize).Scan(&valid) + if err != nil { + log.Errorw("failed to check if deal upload has started", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if !valid { + log.Errorw("deal upload finalize failed", "deal", id, "error", "deal raw size does not match the sum of chunks") + http.Error(w, "deal raw size does not match the sum of chunks", int(ErrBadProposal)) + return + } + + if newDeal.Products.DDOV1 != nil { + rej, err := m.sanitizeDDODeal(ctx, newDeal) + if err != nil { + log.Errorw("failed to sanitize DDO deal", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if rej != nil { + if rej.HTTPCode == 500 { + log.Errorw("failed to sanitize DDO deal", "deal", id, "error", rej.Reason) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if rej.HTTPCode != 500 { + log.Errorw("failed to sanitize DDO deal", "deal", id, "error", rej.Reason) + http.Error(w, rej.Reason, int(rej.HTTPCode)) + return + } + } + } + + if newDeal.Products.PDPV1 != nil { + rej, err := m.sanitizePDPDeal(ctx, newDeal) + if err != nil { + log.Errorw("failed to sanitize PDP deal", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if rej != nil { + if rej.HTTPCode == 500 { + log.Errorw("failed to sanitize PDP deal", "deal", id, "error", rej.Reason) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if rej.HTTPCode != 500 { + log.Errorw("failed to sanitize PDP deal", "deal", id, "error", rej.Reason) + http.Error(w, rej.Reason, int(rej.HTTPCode)) + return + } + } + } + + comm, err := m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // Now update the upload status to trigger the correct pipeline + n, err := tx.Exec(`UPDATE market_mk20_deal_chunk SET finalize = TRUE where id = $1`, id.String()) + if err != nil { + log.Errorw("failed to finalize deal upload", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + + if n == 0 { + return false, xerrors.Errorf("expected to update %d rows, got 0", n) + } + + _, err = tx.Exec(`DELETE FROM market_mk20_upload_waiting WHERE id = $1`, id.String()) + if err != nil { + return false, xerrors.Errorf("failed to delete upload waiting: %w", err) + } + + if dealUpdated { + // Save the updated deal to DB + err = newDeal.UpdateDeal(tx) + if err != nil { + return false, xerrors.Errorf("failed to update deal: %w", err) + } + } + return true, nil + }) + + if err != nil { + log.Errorw("failed to finalize deal upload", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + + if !comm { + log.Errorw("failed to finalize deal upload", "deal", id, "error", "failed to commit transaction") + http.Error(w, "", int(ErrServerInternalError)) + return + } + + w.WriteHeader(int(Ok)) +} + +func (m *MK20) updateDealDetails(id ulid.ULID, deal *Deal, auth string) (DealCode, *Deal, []ProductName, error) { + ctx := context.Background() // Let's not use request context to avoid DB inconsistencies + + if deal.Identifier.Compare(id) != 0 { + return ErrBadProposal, nil, nil, xerrors.Errorf("deal ID and proposal ID do not match") + } + + if deal.Data == nil { + return ErrBadProposal, nil, nil, xerrors.Errorf("deal data is nil") + } + + // Validate the deal + code, err := deal.Validate(m.DB, &m.cfg.Market.StorageMarketConfig.MK20, auth) + if err != nil { + return code, nil, nil, err + } + + log.Debugw("deal validated", "deal", deal.Identifier.String()) + + // Verify we have a deal is DB + var exists bool + err = m.DB.QueryRow(ctx, `SELECT EXISTS (SELECT 1 FROM market_mk20_deal WHERE id = $1)`, id.String()).Scan(&exists) + if err != nil { + return ErrServerInternalError, nil, nil, xerrors.Errorf("failed to check if deal exists: %w", err) + } + + if !exists { + return ErrDealNotFound, nil, nil, xerrors.Errorf("deal not found") + } + + // Get updated deal + ndeal, code, np, err := UpdateDealDetails(ctx, m.DB, id, deal, &m.cfg.Market.StorageMarketConfig.MK20, auth) + if err != nil { + return code, nil, nil, err + } + + return Ok, ndeal, np, nil +} + +func (m *MK20) HandleSerialUpload(id ulid.ULID, body io.Reader, w http.ResponseWriter) { + if m.maxParallelUploads.Load()+1 > int64(m.cfg.Market.StorageMarketConfig.MK20.MaxParallelChunkUploads) { + log.Errorw("max parallel uploads reached", "deal", id, "error", "max parallel uploads reached") + http.Error(w, "too many parallel uploads for provider", int(UploadRateLimit)) + return + } + + ctx := context.Background() + var exists bool + err := m.DB.QueryRow(ctx, `SELECT EXISTS ( + SELECT 1 + FROM market_mk20_upload_waiting + WHERE id = $1 AND chunked IS NULL);`, id.String()).Scan(&exists) + if err != nil { + log.Errorw("failed to check if upload is waiting for data", "deal", id, "error", err) + w.WriteHeader(int(UploadServerError)) + return + } + if !exists { + http.Error(w, "deal not found", int(UploadStartCodeDealNotFound)) + return + } + + reader := NewTimeoutLimitReader(body, time.Second*5) + m.maxParallelUploads.Add(1) + defer func() { + m.maxParallelUploads.Add(-1) + }() + + // Generate unique tmp pieceCID and Size for parked_pieces tables + wr := new(commp.Calc) + trs, err := fmt.Fprintf(wr, "%s, %s", id.String(), time.Now().String()) + if err != nil { + log.Errorw("failed to generate unique tmp pieceCID and Size for parked_pieces tables", "deal", id, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + digest, tsize, err := wr.Digest() + if err != nil { + panic(err) + } + + trSize := uint64(trs) + + tpcid, err := commcid.DataCommitmentV1ToCID(digest) + if err != nil { + log.Errorw("failed to generate tmp pieceCID", "deal", id, "error", err) + http.Error(w, "failed to generate piece cid"+err.Error(), int(UploadServerError)) + return + } + + deal, err := DealFromDB(ctx, m.DB, id) + if err != nil { + log.Errorw("failed to get deal from db", "deal", id, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + + var havePInfo bool + var pinfo *PieceInfo + + if deal.Data != nil { + pi, err := deal.PieceInfo() + if err != nil { + log.Errorw("failed to get piece info from deal", "deal", id, "error", err) + http.Error(w, "", int(UploadServerError)) + } + + tpcid = pi.PieceCIDV1 + tsize = uint64(pi.Size) + trSize = pi.RawSize + havePInfo = true + pinfo = pi + } + + var pnum, refID int64 + pieceExists := true + + // Generate piece park details with tmp pieceCID and Size + comm, err := m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + err = tx.QueryRow(`SELECT id FROM parked_pieces + WHERE piece_cid = $1 + AND piece_padded_size = $2 + AND piece_raw_size = $3 + AND complete = true`, tpcid.String(), tsize, trSize).Scan(&pnum) + + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + err = tx.QueryRow(` + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term, skip) + VALUES ($1, $2, $3, TRUE, TRUE) + ON CONFLICT (piece_cid, piece_padded_size, long_term, cleanup_task_id) DO NOTHING + RETURNING id`, tpcid.String(), tsize, trSize).Scan(&pnum) + if err != nil { + return false, xerrors.Errorf("inserting new parked piece and getting id: %w", err) + } + pieceExists = false + } else { + return false, xerrors.Errorf("checking existing parked piece: %w", err) + } + } + + // Add parked_piece_ref + err = tx.QueryRow(`INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, TRUE) RETURNING ref_id`, pnum, "/PUT").Scan(&refID) + if err != nil { + return false, xerrors.Errorf("inserting parked piece ref: %w", err) + } + + // Mark upload as started to prevent someone else from using chunk upload + n, err := tx.Exec(`UPDATE market_mk20_upload_waiting SET chunked = FALSE WHERE id = $1`, id.String()) + if err != nil { + return false, xerrors.Errorf("updating upload waiting: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating upload waiting: expected 1 row updated, got %d", n) + } + + return true, nil + }) + + if err != nil { + log.Errorw("failed to update chunk", "deal", id, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + + if !comm { + log.Errorw("failed to update chunk", "deal", id, "error", "failed to commit transaction") + http.Error(w, "", int(UploadServerError)) + return + } + + // If we know the piece details and already have it then let's return early + if pieceExists && havePInfo { + w.WriteHeader(int(UploadOk)) + } + + if !havePInfo { + log.Debugw("tmp piece details generated for the chunk", "deal", id) + } + + failed := true + defer func() { + if failed { + _, serr := m.DB.Exec(ctx, `DELETE FROM parked_piece_refs WHERE ref_id = $1`, refID) + if serr != nil { + log.Errorw("failed to delete parked piece ref", "deal", id, "error", serr) + } + + _, serr = m.DB.Exec(ctx, `UPDATE market_mk20_upload_waiting SET chunked = NULL WHERE id = $1`, id.String()) + if serr != nil { + log.Errorw("failed to update upload waiting", "deal", id, "error", serr) + } + } + }() + + // Store the piece and generate PieceCID and Size + pi, rawSize, err := m.sc.WriteUploadPiece(ctx, storiface.PieceNumber(pnum), UploadSizeLimit, reader, storiface.PathSealing, false) + if err != nil { + log.Errorw("failed to write piece", "deal", id, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + + if havePInfo { + if rawSize != pinfo.RawSize { + log.Errorw("piece raw size does not match", "deal", id, "supplied", pinfo.RawSize, "written", rawSize, "error", "piece raw size does not match") + http.Error(w, "piece raw size does not match", int(UploadBadRequest)) + return + } + + if !pi.PieceCID.Equals(pinfo.PieceCIDV1) { + log.Errorw("piece CID does not match", "deal", id, "error", "piece CID does not match") + http.Error(w, "piece CID does not match", int(UploadBadRequest)) + return + } + if pi.Size != pinfo.Size { + log.Errorw("piece size does not match", "deal", id, "error", "piece size does not match") + http.Error(w, "piece size does not match", int(UploadBadRequest)) + return + } + } + + log.Debugw("piece stored", "deal", id) + + // Update piece park details with correct values + comm, err = m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + if havePInfo { + n, err := tx.Exec(`UPDATE parked_pieces SET complete = true WHERE id = $1`, pnum) + if err != nil { + return false, xerrors.Errorf("updating parked piece: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating parked piece: expected 1 row updated, got %d", n) + } + } else { + var pid int64 + var complete bool + // Check if we already have the piece, if found then verify access and skip rest of the processing + err = tx.QueryRow(`SELECT id, complete FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2 AND long_term = TRUE`, pi.PieceCID.String(), pi.Size).Scan(&pid, &complete) + if err == nil { + if complete { + // If piece exists then check if we can access the data + pr, err := m.sc.PieceReader(ctx, storiface.PieceNumber(pid)) + if err != nil { + // We should fail here because any subsequent operation which requires access to data will also fail + // till this error is fixed + if !errors.Is(err, storiface.ErrSectorNotFound) { + return false, fmt.Errorf("failed to get piece reader: %w", err) + } + + // If piece does not exist then we update piece park table to work with new tmpID + // Update ref table's reference to tmp id + _, err = tx.Exec(`UPDATE parked_piece_refs SET piece_id = $1 WHERE piece_id = $2`, pnum, pid) + if err != nil { + return false, xerrors.Errorf("updating parked piece ref: %w", err) + } + + // Now delete the original piece which has 404 error + _, err = tx.Exec(`DELETE FROM parked_pieces WHERE id = $1`, pid) + if err != nil { + return false, xerrors.Errorf("deleting parked piece: %w", err) + } + + // Update the tmp entry with correct details + n, err := tx.Exec(`UPDATE parked_pieces SET + piece_cid = $1, + piece_padded_size = $2, + piece_raw_size = $3, + complete = true + WHERE id = $4`, + pi.PieceCID.String(), pi.Size, rawSize, pnum) + if err != nil { + return false, xerrors.Errorf("updating parked piece: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating parked piece: expected 1 row updated, got %d", n) + } + } else { + defer func() { + _ = pr.Close() + }() + // Add parked_piece_ref if no errors + var newRefID int64 + err = tx.QueryRow(`INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, FALSE) RETURNING ref_id`, pid, "/PUT").Scan(&newRefID) + if err != nil { + return false, xerrors.Errorf("inserting parked piece ref: %w", err) + } + + // Remove the tmp refs. This will also delete the new tmp parked_pieces entry + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = $1`, refID) + if err != nil { + return false, xerrors.Errorf("deleting tmp parked piece ref: %w", err) + } + // Update refID to be used later + refID = newRefID + } + } else { + n, err := tx.Exec(`UPDATE parked_pieces SET complete = true WHERE id = $1`, pid) + if err != nil { + return false, xerrors.Errorf("updating parked piece: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating parked piece: expected 1 row updated, got %d", n) + } + } + } else { + if !errors.Is(err, pgx.ErrNoRows) { + return false, fmt.Errorf("failed to check if piece already exists: %w", err) + } + // If piece does not exist then let's update the tmp one + n, err := tx.Exec(`UPDATE parked_pieces SET + piece_cid = $1, + piece_padded_size = $2, + piece_raw_size = $3, + complete = true + WHERE id = $4`, + pi.PieceCID.String(), pi.Size, rawSize, pnum) + if err != nil { + return false, xerrors.Errorf("updating parked piece: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating parked piece: expected 1 row updated, got %d", n) + } + } + } + + n, err := tx.Exec(`UPDATE market_mk20_upload_waiting SET chunked = FALSE, ref_id = $2 WHERE id = $1`, id.String(), refID) + if err != nil { + return false, xerrors.Errorf("updating upload waiting: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating upload waiting: expected 1 row updated, got %d", n) + } + return true, nil + }) + + if err != nil { + log.Errorw("failed to update chunk", "deal", id, "error", err) + http.Error(w, "", int(UploadServerError)) + return + } + + if !comm { + log.Errorw("failed to update chunk", "deal", id, "error", "failed to commit transaction") + http.Error(w, "", int(UploadServerError)) + return + } + + log.Debugw("chunk upload finished", "deal", id) + + failed = false + w.WriteHeader(int(UploadOk)) +} + +func (m *MK20) HandleSerialUploadFinalize(id ulid.ULID, deal *Deal, w http.ResponseWriter, auth string) { + defer func() { + if r := recover(); r != nil { + trace := make([]byte, 1<<16) + n := runtime.Stack(trace, false) + log.Errorf("panic occurred: %v\n%s", r, trace[:n]) + debug.PrintStack() + } + }() + + ctx := context.Background() + var exists bool + err := m.DB.QueryRow(ctx, `SELECT EXISTS ( + SELECT 1 + FROM market_mk20_upload_waiting + WHERE id = $1 AND chunked = FALSE AND ref_id IS NOT NULL);`, id.String()).Scan(&exists) + if err != nil { + log.Errorw("failed to check if upload is waiting for data", "deal", id, "error", err) + w.WriteHeader(int(ErrServerInternalError)) + return + } + + if !exists { + http.Error(w, "deal not found", int(ErrDealNotFound)) + return + } + + ddeal, err := DealFromDB(ctx, m.DB, id) + if err != nil { + log.Errorw("failed to get deal from db", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + + if ddeal.Data == nil && deal == nil { + log.Errorw("cannot finalize deal with missing data source", "deal", id) + http.Error(w, "cannot finalize deal with missing data source", int(ErrBadProposal)) + return + } + + var pcidStr string + var rawSize, refID, pid, pieceSize int64 + + err = m.DB.QueryRow(ctx, `SELECT r.ref_id, p.piece_cid, p.piece_padded_size, p.piece_raw_size, p.id + FROM market_mk20_upload_waiting u + JOIN parked_piece_refs r ON u.ref_id = r.ref_id + JOIN parked_pieces p ON r.piece_id = p.id + WHERE u.id = $1 + AND p.complete = TRUE + AND p.long_term = TRUE;`, id.String()).Scan(&refID, &pcidStr, &pieceSize, &rawSize, &pid) + if err != nil { + log.Errorw("failed to get piece details", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + pcid, err := cid.Parse(pcidStr) + if err != nil { + log.Errorw("failed to parse piece cid", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + } + + var uDeal *Deal + var dealUpdated bool + + if deal != nil { + // This is a deal where DataSource was not set - we should update the deal + code, ndeal, _, err := m.updateDealDetails(id, deal, auth) + if err != nil { + log.Errorw("failed to update deal details", "deal", id, "error", err) + if code == ErrServerInternalError { + http.Error(w, "", int(ErrServerInternalError)) + } else { + http.Error(w, err.Error(), int(code)) + } + return + } + uDeal = ndeal + dealUpdated = true + } else { + uDeal = ddeal + } + + pi, err := uDeal.PieceInfo() + if err != nil { + log.Errorw("failed to get piece info", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + + if !pi.PieceCIDV1.Equals(pcid) { + log.Errorw("piece cid mismatch", "deal", id, "expected", pcid, "actual", pi.PieceCIDV1) + http.Error(w, "piece cid mismatch", int(ErrBadProposal)) + return + } + + if pi.Size != abi.PaddedPieceSize(pieceSize) { + log.Errorw("piece size mismatch", "deal", id, "expected", pi.Size, "actual", pieceSize) + http.Error(w, "piece size mismatch", int(ErrBadProposal)) + return + } + + if pi.RawSize != uint64(rawSize) { + log.Errorw("piece raw size mismatch", "deal", id, "expected", pi.RawSize, "actual", rawSize) + http.Error(w, "piece raw size mismatch", int(ErrBadProposal)) + return + } + + if uDeal.Products.DDOV1 != nil { + rej, err := m.sanitizeDDODeal(ctx, uDeal) + if err != nil { + log.Errorw("failed to sanitize DDO deal", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if rej != nil { + if rej.HTTPCode == 500 { + log.Errorw("failed to sanitize DDO deal", "deal", id, "error", rej.Reason) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if rej.HTTPCode != 500 { + log.Errorw("failed to sanitize DDO deal", "deal", id, "error", rej.Reason) + http.Error(w, rej.Reason, int(rej.HTTPCode)) + return + } + } + } + + if uDeal.Products.PDPV1 != nil { + rej, err := m.sanitizePDPDeal(ctx, uDeal) + if err != nil { + log.Errorw("failed to sanitize PDP deal", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if rej != nil { + if rej.HTTPCode == 500 { + log.Errorw("failed to sanitize PDP deal", "deal", id, "error", rej.Reason) + http.Error(w, "", int(ErrServerInternalError)) + return + } + if rej.HTTPCode != 500 { + log.Errorw("failed to sanitize PDP deal", "deal", id, "error", rej.Reason) + http.Error(w, rej.Reason, int(rej.HTTPCode)) + return + } + } + } + + comm, err := m.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + _, err = tx.Exec(`DELETE FROM market_mk20_upload_waiting WHERE id = $1`, id.String()) + if err != nil { + return false, xerrors.Errorf("failed to delete upload waiting: %w", err) + } + + if dealUpdated { + // Save the updated deal to DB + err = uDeal.UpdateDeal(tx) + if err != nil { + return false, xerrors.Errorf("failed to update deal: %w", err) + } + } + + retv := uDeal.Products.RetrievalV1 + data := uDeal.Data + + aggregation := 0 + if data.Format.Aggregate != nil { + aggregation = int(data.Format.Aggregate.Type) + } + + var refUsed bool + + if uDeal.Products.DDOV1 != nil { + ddo := uDeal.Products.DDOV1 + spid, err := address.IDFromAddress(ddo.Provider) + if err != nil { + return false, fmt.Errorf("getting provider ID: %w", err) + } + + pieceIDUrl := url.URL{ + Scheme: "pieceref", + Opaque: fmt.Sprintf("%d", refID), + } + + var allocationID interface{} + if ddo.AllocationId != nil { + allocationID = *ddo.AllocationId + } else { + allocationID = nil + } + + n, err := tx.Exec(`INSERT INTO market_mk20_pipeline ( + id, sp_id, contract, client, piece_cid_v2, piece_cid, + piece_size, raw_size, url, offline, indexing, announce, + allocation_id, duration, piece_aggregation, deal_aggregation, started, downloaded, after_commp) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, TRUE, TRUE, TRUE)`, + id.String(), spid, ddo.ContractAddress, uDeal.Client, data.PieceCID.String(), pi.PieceCIDV1.String(), + pi.Size, pi.RawSize, pieceIDUrl.String(), false, retv.Indexing, retv.AnnouncePayload, + allocationID, ddo.Duration, aggregation, aggregation) + + if err != nil { + return false, xerrors.Errorf("inserting mk20 pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting mk20 pipeline: %d rows affected", n) + } + + log.Debugw("mk20 pipeline created", "deal", id) + + refUsed = true + } + + if uDeal.Products.PDPV1 != nil { + pdp := uDeal.Products.PDPV1 + // Insert the PDP pipeline + if refUsed { + err = tx.QueryRow(` + INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, TRUE) RETURNING ref_id + `, pid, "/PUT").Scan(&refID) + if err != nil { + return false, fmt.Errorf("failed to create parked_piece_refs entry: %w", err) + } + } + + n, err := tx.Exec(`INSERT INTO pdp_pipeline ( + id, client, piece_cid_v2, data_set_id, + extra_data, piece_ref, downloaded, deal_aggregation, aggr_index, indexing, announce, announce_payload, after_commp) + VALUES ($1, $2, $3, $4, $5, $6, TRUE, $7, 0, $8, $9, $10, TRUE)`, + id.String(), uDeal.Client, uDeal.Data.PieceCID.String(), *pdp.DataSetID, + pdp.ExtraData, refID, aggregation, retv.Indexing, retv.AnnouncePiece, retv.AnnouncePayload) + if err != nil { + return false, xerrors.Errorf("inserting in PDP pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting in PDP pipeline: %d rows affected", n) + } + log.Debugw("PDP pipeline created", "deal", id) + } + + return true, nil + }) + + if err != nil { + log.Errorw("failed to finalize deal upload", "deal", id, "error", err) + http.Error(w, "", int(ErrServerInternalError)) + return + } + + if !comm { + log.Errorw("failed to finalize deal upload", "deal", id, "error", "failed to commit transaction") + http.Error(w, "", int(ErrServerInternalError)) + return + } + + w.WriteHeader(int(Ok)) +} + +func removeNotFinalizedUploads(ctx context.Context, db *harmonydb.DB) { + rm := func(ctx context.Context, db *harmonydb.DB) { + var deals []struct { + ID string `db:"id"` + Chunked bool `db:"chunked"` + RefID sql.NullInt64 `db:"ref_id"` + ReadyAt time.Time `db:"ready_at"` + } + + err := db.Select(ctx, &deals, `SELECT id, chunked, ref_id, ready_at + FROM market_mk20_upload_waiting + WHERE chunked IS NOT NULL + AND ready_at <= NOW() AT TIME ZONE 'UTC' - INTERVAL '60 minutes';`) + if err != nil { + log.Errorw("failed to get not finalized uploads", "error", err) + } + + for _, deal := range deals { + if deal.Chunked { + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + _, err = tx.Exec(`DELETE FROM parked_piece_refs p + USING ( + SELECT DISTINCT ref_id + FROM market_mk20_deal_chunk + WHERE id = $1 AND ref_id IS NOT NULL + ) c + WHERE p.ref_id = c.ref_id; + `, deal.ID) + if err != nil { + return false, xerrors.Errorf("deleting piece refs: %w", err) + } + + _, err = tx.Exec(`DELETE FROM market_mk20_deal_chunk WHERE id = $1`, deal.ID) + if err != nil { + return false, xerrors.Errorf("deleting deal chunks: %w", err) + } + + n, err := tx.Exec(`UPDATE market_mk20_upload_waiting + SET chunked = NULL, + ref_id = NULL, + ready_at = NULL + WHERE id = $1;`, deal.ID) + + if err != nil { + return false, xerrors.Errorf("updating upload waiting: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating upload waiting: expected 1 row updated, got %d", n) + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + log.Errorw("failed to delete not finalized uploads", "deal", deal.ID, "error", err) + } + if !comm { + log.Errorw("failed to delete not finalized uploads", "deal", deal.ID, "error", "failed to commit transaction") + } + } else { + if deal.RefID.Valid { + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = $1`, deal.RefID.Int64) + if err != nil { + return false, xerrors.Errorf("deleting piece refs: %w", err) + } + + n, err := tx.Exec(`UPDATE market_mk20_upload_waiting + SET chunked = NULL, + ref_id = NULL, + ready_at = NULL + WHERE id = $1;`, deal.ID) + + if err != nil { + return false, xerrors.Errorf("updating upload waiting: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updating upload waiting: expected 1 row updated, got %d", n) + } + + return true, nil + }) + if err != nil { + log.Errorw("failed to delete not finalized uploads", "deal", deal.ID, "error", err) + } + if !comm { + log.Errorw("failed to delete not finalized uploads", "deal", deal.ID, "error", "failed to commit transaction") + } + } + log.Errorw("removing not finalized upload", "deal", deal.ID, "error", "ref_id not found") + } + } + } + + ticker := time.NewTicker(time.Minute * 5) + defer ticker.Stop() + for { + select { + case <-ticker.C: + rm(ctx, db) + case <-ctx.Done(): + return + } + } +} diff --git a/market/mk20/mk20_utils.go b/market/mk20/mk20_utils.go new file mode 100644 index 000000000..bc708e229 --- /dev/null +++ b/market/mk20/mk20_utils.go @@ -0,0 +1,335 @@ +package mk20 + +import ( + "context" + "database/sql" + "errors" + "fmt" + "io" + "net/http" + "time" + + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" +) + +// DealStatus retrieves the status of a specific deal by querying the database and determining the current state for both PDP and DDO processing. +// @param id [ulid.ULID] +// @Return http.StatusNotFound +// @Return http.StatusInternalServerError +// @Return *DealProductStatusResponse + +func (m *MK20) DealStatus(ctx context.Context, id ulid.ULID) *DealStatus { + var pdp_complete, ddo_complete sql.NullBool + var pdp_error, ddo_error sql.NullString + + err := m.DB.QueryRow(ctx, `SELECT + (pdp_v1->>'complete')::boolean AS pdp_complete, + (pdp_v1->>'error')::text AS pdp_error, + (ddo_v1->>'complete')::boolean AS ddo_complete, + (ddo_v1->>'error')::text AS ddo_error + FROM market_mk20_deal + WHERE id = $1;`, id.String()).Scan(&pdp_complete, &pdp_error, &ddo_complete, &ddo_error) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return &DealStatus{ + HTTPCode: http.StatusNotFound, + } + } + log.Errorw("failed to query the db for deal status", "deal", id.String(), "err", err) + return &DealStatus{ + HTTPCode: http.StatusInternalServerError, + } + } + + deal, err := DealFromDB(ctx, m.DB, id) + if err != nil { + log.Errorw("failed to get deal from db", "deal", id, "error", err) + return &DealStatus{ + HTTPCode: http.StatusInternalServerError, + } + } + + isPDP := deal.Products.PDPV1 != nil + isDDO := deal.Products.DDOV1 != nil + + // If only PDP is defined + if isPDP && !isDDO { + ret := &DealStatus{ + HTTPCode: http.StatusOK, + Response: &DealProductStatusResponse{ + PDPV1: &DealStatusResponse{ + State: DealStateAccepted, + }, + }, + } + if pdp_complete.Bool { + ret.Response.PDPV1.State = DealStateComplete + } + if pdp_error.Valid && pdp_error.String != "" { + ret.Response.PDPV1.State = DealStateFailed + ret.Response.PDPV1.ErrorMsg = pdp_error.String + } + + if !pdp_complete.Bool { + pdp := deal.Products.PDPV1 + if pdp.AddPiece { + if deal.Data != nil { + // Check if deal is uploaded + var yes bool + err = m.DB.QueryRow(ctx, `SELECT EXISTS (SELECT 1 FROM market_mk20_upload_waiting WHERE id = $1)`, id.String()).Scan(&yes) + if err != nil { + log.Errorw("failed to query the db for deal status", "deal", id.String(), "err", err) + return &DealStatus{ + HTTPCode: http.StatusInternalServerError, + } + } + if yes { + ret.Response.PDPV1.State = DealStateAwaitingUpload + } else { + ret.Response.PDPV1.State = DealStateProcessing + } + } else { + ret.Response.PDPV1.State = DealStateAccepted + } + } + + if pdp.CreateDataSet || pdp.DeleteDataSet || pdp.DeletePiece { + ret.Response.PDPV1.State = DealStateProcessing + } + } + + return ret + } + + // If only DDO is defined + if isDDO && !isPDP { + ret := &DealStatus{ + HTTPCode: http.StatusOK, + Response: &DealProductStatusResponse{ + DDOV1: &DealStatusResponse{ + State: DealStateAccepted, + }, + }, + } + if ddo_complete.Bool { + ret.Response.DDOV1.State = DealStateComplete + } + if ddo_error.Valid && ddo_error.String != "" { + ret.Response.DDOV1.State = DealStateFailed + ret.Response.DDOV1.ErrorMsg = ddo_error.String + } + + if !ddo_complete.Bool { + state, err := m.getDDOStatus(ctx, id) + if err != nil { + log.Errorw("failed to get DDO status", "deal", id.String(), "error", err) + return &DealStatus{ + HTTPCode: http.StatusInternalServerError, + } + } + ret.Response.DDOV1.State = state + } + + return ret + } + + // If both PDP and DDO are defined + if isPDP && isDDO { + ret := &DealStatus{ + HTTPCode: http.StatusOK, + } + + if pdp_complete.Bool { + ret.Response.PDPV1.State = DealStateComplete + } + + if pdp_error.Valid { + ret.Response.PDPV1.State = DealStateFailed + ret.Response.PDPV1.ErrorMsg = pdp_error.String + } + + if ddo_complete.Bool { + ret.Response.DDOV1.State = DealStateComplete + } + + if ddo_error.Valid && ddo_error.String != "" { + ret.Response.DDOV1.State = DealStateFailed + ret.Response.DDOV1.ErrorMsg = ddo_error.String + } + + if !pdp_complete.Bool { + pdp := deal.Products.PDPV1 + if pdp.AddPiece { + if deal.Data != nil { + // Check if deal is uploaded + var yes bool + err = m.DB.QueryRow(ctx, `SELECT EXISTS (SELECT 1 FROM market_mk20_upload_waiting WHERE id = $1)`, id.String()).Scan(&yes) + if err != nil { + log.Errorw("failed to query the db for deal status", "deal", id.String(), "err", err) + return &DealStatus{ + HTTPCode: http.StatusInternalServerError, + } + } + if yes { + ret.Response.PDPV1.State = DealStateAwaitingUpload + } else { + ret.Response.PDPV1.State = DealStateProcessing + } + } else { + ret.Response.PDPV1.State = DealStateAccepted + } + } + + if pdp.CreateDataSet || pdp.DeleteDataSet || pdp.DeletePiece { + ret.Response.PDPV1.State = DealStateProcessing + } + } + + if !ddo_complete.Bool { + state, err := m.getDDOStatus(ctx, id) + if err != nil { + log.Errorw("failed to get DDO status", "deal", id.String(), "error", err) + return &DealStatus{ + HTTPCode: http.StatusInternalServerError, + } + } + ret.Response.DDOV1.State = state + } + + return ret + } + + return &DealStatus{ + HTTPCode: http.StatusInternalServerError, + } + +} + +func (m *MK20) getDDOStatus(ctx context.Context, id ulid.ULID) (DealState, error) { + var waitingForPipeline bool + err := m.DB.QueryRow(ctx, `SELECT EXISTS (SELECT 1 FROM market_mk20_pipeline_waiting WHERE id = $1)`, id.String()).Scan(&waitingForPipeline) + if err != nil { + return DealStateAccepted, err + } + if waitingForPipeline { + return DealStateAccepted, nil + } + + var pdeals []struct { + Sector *int `db:"sector"` + Sealed bool `db:"sealed"` + Indexed bool `db:"indexed"` + } + + err = m.DB.Select(ctx, &pdeals, `SELECT + sector, + sealed, + indexed + FROM + market_mk20_pipeline + WHERE + id = $1`, id.String()) + + if err != nil { + return DealStateAccepted, err + } + + if len(pdeals) > 1 { + return DealStateProcessing, nil + } + + // If deal is still in pipeline + if len(pdeals) == 1 { + pdeal := pdeals[0] + if pdeal.Sector == nil { + return DealStateProcessing, nil + } + if !pdeal.Sealed { + return DealStateSealing, nil + } + if !pdeal.Indexed { + return DealStateIndexing, nil + } + } + + return DealStateComplete, nil +} + +// Supported retrieves and returns maps of product names and data source names with their enabled status, or an error if the query fails. +func (m *MK20) Supported(ctx context.Context) (map[string]bool, map[string]bool, error) { + var products []struct { + Name string `db:"name"` + Enabled bool `db:"enabled"` + } + err := m.DB.Select(ctx, &products, `SELECT name, enabled FROM market_mk20_products`) + if err != nil { + return nil, nil, err + } + + productsMap := make(map[string]bool) + + for _, product := range products { + productsMap[product.Name] = product.Enabled + } + + var sources []struct { + Name string `db:"name"` + Enabled bool `db:"enabled"` + } + err = m.DB.Select(ctx, &sources, `SELECT name, enabled FROM market_mk20_data_source`) + if err != nil { + return nil, nil, err + } + sourcesMap := make(map[string]bool) + for _, source := range sources { + sourcesMap[source.Name] = source.Enabled + } + return productsMap, sourcesMap, nil +} + +type TimeoutLimitReader struct { + r io.Reader + timeout time.Duration + totalBytes int64 +} + +func NewTimeoutLimitReader(r io.Reader, timeout time.Duration) *TimeoutLimitReader { + return &TimeoutLimitReader{ + r: r, + timeout: timeout, + totalBytes: 0, + } +} + +const UploadSizeLimit = int64(1 * 1024 * 1024 * 1024) + +func (t *TimeoutLimitReader) Read(p []byte) (int, error) { + deadline := time.Now().Add(t.timeout) + for { + // Attempt to read + n, err := t.r.Read(p) + if t.totalBytes+int64(n) > UploadSizeLimit { + return 0, fmt.Errorf("upload size limit exceeded: %d bytes", UploadSizeLimit) + } else { + t.totalBytes += int64(n) + } + + if err != nil { + return n, err + } + + if n > 0 { + // Otherwise return bytes read and no error + return n, err + } + + // Timeout: If we hit the deadline without making progress, return a timeout error + if time.Now().After(deadline) { + return 0, fmt.Errorf("upload timeout: no progress (duration: %f Seconds)", t.timeout.Seconds()) + } + + // Avoid tight loop by adding a tiny sleep + time.Sleep(100 * time.Millisecond) // Small pause to avoid busy-waiting + } +} diff --git a/market/mk20/mk20gen/gen.go b/market/mk20/mk20gen/gen.go new file mode 100644 index 000000000..b4a11385a --- /dev/null +++ b/market/mk20/mk20gen/gen.go @@ -0,0 +1,965 @@ +package main + +// +//import ( +// "bytes" +// "flag" +// "fmt" +// "go/ast" +// "go/doc" +// "go/token" +// "go/types" +// "log" +// "os" +// "sort" +// "strings" +// +// "golang.org/x/tools/go/packages" +//) +// +//// Note: This file has too many static things. Go parse package is not easy to work with and +//// is a nightmare. Wasting month[s] to build a correct parses does not seem correct use of time. +// +//type StructInfo struct { +// Name string +// Doc string +// Fields []*FieldInfo +//} +// +//type FieldInfo struct { +// Name string +// Type string +// Tag string +// Doc string +// Typ types.Type +//} +// +//type constEntry struct { +// Name string +// Value string +// Doc string +//} +// +//var visited = map[string]bool{} +//var structMap = map[string]*StructInfo{} +//var rendered = map[string]bool{} +//var constMap = map[string][]constEntry{} +// +//var skipTypes = map[string]bool{ +// "ProviderDealRejectionInfo": true, +// "DBDeal": true, +// "dbProduct": true, +// "dbDataSource": true, +// "productAndDataSource": true, +// "MK20": true, +// "DealStatus": true, +//} +// +//var includeConsts = map[string]bool{ +// "DealCode": true, +// "DealState": true, +// "UploadStatusCode": true, +// "UploadStartCode": true, +// "UploadCode": true, +//} +// +////type ParamDoc struct { +//// Name string +//// Type string +//// Optional bool +//// Comment string +////} +////type ReturnDoc struct { +//// Name string +//// Type string +//// Comment string +////} +// +////// FunctionDoc holds extracted param and return comments for a function. +////type FunctionDoc struct { +//// Params []ParamDoc +//// Returns []ReturnDoc +////} +//// +////type handlerInfo struct { +//// Path string +//// Method string +//// FuncName string +//// Calls map[string]bool +//// Types map[string]bool +//// Constants map[string]bool +//// Errors map[string]bool +//// RequestBodyType string +//// ResponseBodyType string +////} +//// +////var allHandlers = map[string]*handlerInfo{} // key = function name +//// +////var httpCodes = map[string]struct { +//// Code string +//// Msg string +////}{ +//// "http.StatusBadRequest": { +//// Code: "400", +//// Msg: "Bad Request - Invalid input or validation error", +//// }, +//// "http.StatusOK": { +//// Code: "200", +//// Msg: "OK - Success", +//// }, +//// "http.StatusInternalServerError": { +//// Code: "500", +//// Msg: "Internal Server Error", +//// }, +////} +//// +////var ( +//// paramRe = regexp.MustCompile(`@param\s+(\w+)\s+([^\s\[]+)(\s+\[optional\])?(.*)`) +//// returnRe = regexp.MustCompile(`@Return\s+(\w+)?\s*([^\s\[]+)?(.*)`) +////) +// +////func ParseFunctionDocsFromComments(pkgPath string) map[string]*FunctionDoc { +//// fset := token.NewFileSet() +//// pkgs, err := parser.ParseDir(fset, pkgPath, nil, parser.ParseComments) +//// if err != nil { +//// panic(err) +//// } +//// +//// funcDocs := map[string]*FunctionDoc{} +//// +//// for _, pkg := range pkgs { +//// for _, file := range pkg.Files { +//// for _, decl := range file.Decls { +//// fn, ok := decl.(*ast.FuncDecl) +//// if !ok || fn.Doc == nil { +//// continue +//// } +//// +//// doc := &FunctionDoc{} +//// for _, c := range fn.Doc.List { +//// txt := strings.TrimSpace(strings.TrimPrefix(c.Text, "//")) +//// if m := paramRe.FindStringSubmatch(txt); m != nil { +//// doc.Params = append(doc.Params, ParamDoc{ +//// Name: m[1], +//// Type: m[2], +//// Optional: strings.Contains(m[3], "optional"), +//// Comment: strings.TrimSpace(m[4]), +//// }) +//// } else if m := returnRe.FindStringSubmatch(txt); m != nil { +//// doc.Returns = append(doc.Returns, ReturnDoc{ +//// Name: m[1], +//// Type: m[2], +//// Comment: strings.TrimSpace(m[3]), +//// }) +//// } +//// } +//// +//// if len(doc.Params) > 0 || len(doc.Returns) > 0 { +//// funcDocs[fn.Name.Name] = doc +//// } +//// } +//// } +//// } +//// return funcDocs +////} +// +//func main() { +// var pkgPath, output string +// flag.StringVar(&pkgPath, "pkg", "./", "Package to scan") +// flag.StringVar(&output, "output", "info.md", "Output file") +// flag.Parse() +// +// //pkgPath := "/Users/lexluthr/github/filecoin-project/curio/market/mk20" +// //routerFile := filepath.Join(pkgPath, "http", "http.go") +// +// cfg := &packages.Config{ +// Mode: packages.NeedSyntax | packages.NeedTypes | packages.NeedTypesInfo | packages.NeedDeps | packages.NeedImports | packages.NeedName | packages.NeedFiles | packages.LoadAllSyntax, +// Fset: token.NewFileSet(), +// } +// +// pkgs, err := packages.Load(cfg, pkgPath) +// if err != nil { +// log.Fatalf("Failed to load package: %v", err) +// } +// +// for _, pkg := range pkgs { +// docPkg, err := doc.NewFromFiles(cfg.Fset, pkg.Syntax, pkg.PkgPath) +// if err != nil { +// log.Fatalf("Failed to parse package: %v", err) +// } +// for _, t := range docPkg.Types { +// if st, ok := t.Decl.Specs[0].(*ast.TypeSpec); ok { +// if structType, ok := st.Type.(*ast.StructType); ok { +// name := st.Name.Name +// if visited[name] || skipTypes[name] { +// continue +// } +// visited[name] = true +// collectStruct(pkg, name, structType, t.Doc) +// } +// } +// } +// for _, file := range pkg.Syntax { +// for _, decl := range file.Decls { +// genDecl, ok := decl.(*ast.GenDecl) +// if !ok || genDecl.Tok != token.CONST { +// continue +// } +// +// for _, spec := range genDecl.Specs { +// vspec := spec.(*ast.ValueSpec) +// for _, name := range vspec.Names { +// obj := pkg.TypesInfo.Defs[name] +// if obj == nil { +// continue +// } +// typ := obj.Type().String() // e.g., "main.ErrCode" +// parts := strings.Split(typ, ".") +// typeName := parts[len(parts)-1] // just "ErrCode" +// +// if !includeConsts[typeName] { +// continue +// } +// +// if !rendered[typeName] { +// constMap[typeName] = []constEntry{} +// rendered[typeName] = true +// } +// +// val := "" +// if con, ok := obj.(*types.Const); ok { +// val = con.Val().ExactString() +// } +// cdoc := strings.TrimSpace(vspec.Doc.Text()) +// constMap[typeName] = append(constMap[typeName], constEntry{ +// Name: name.Name, +// Value: val, +// Doc: cdoc, +// }) +// } +// } +// } +// } +// } +// +// //fm := ParseFunctionDocsFromComments(pkgPath) +// //for fname, doc := range fm { +// // fmt.Printf("Function: %s\n", fname) +// // if len(doc.Params) > 0 { +// // fmt.Println(" Params:") +// // for _, p := range doc.Params { +// // fmt.Printf(" - %s %s", p.Name, p.Type) +// // if p.Optional { +// // fmt.Print(" (optional)") +// // } +// // if p.Comment != "" { +// // fmt.Printf(" -- %s", p.Comment) +// // } +// // fmt.Println() +// // } +// // } +// // if len(doc.Returns) > 0 { +// // fmt.Println(" Returns:") +// // for _, r := range doc.Returns { +// // fmt.Printf(" - Name: %s Type: %s", r.Name, r.Type) +// // if r.Comment != "" { +// // fmt.Printf(" -- Comment: %s", r.Comment) +// // } +// // fmt.Println() +// // } +// // } +// //} +// +// writeOutput(output) +// //parseMux(routerFile) +// //fmt.Println("Done tracing handlers") +// //parseHandlerBodies(routerFile) +// //fmt.Println("Done parsing handler bodies") +// //for k, v := range allHandlers { +// // fmt.Println("------------------") +// // fmt.Println("Name:", k) +// // fmt.Println("Path:", v.Path) +// // fmt.Println("Method:", v.Method) +// // fmt.Println("Constants", v.Constants) +// // fmt.Println("Calls:", v.Calls) +// // fmt.Println("Types:", v.Types) +// // fmt.Println("RequestBody", v.RequestBodyType) +// // fmt.Println("ResponseBody", v.ResponseBodyType) +// // fmt.Println("------------------") +// //} +// //fmt.Println("----------------") +// //fmt.Println("----------------") +// //for k, v := range constMap { +// // fmt.Println("Name:", k) +// // for _, e := range v { +// // fmt.Printf(" - %s: %s\n", e.Name, e.Value) +// // } +// //} +// //fmt.Println("----------------") +// //fmt.Println("----------------") +// //for _, h := range allHandlers { +// // fmt.Printf("%s %s\n", h.Method, h.Path) +// // // Optional: print summary from docs if available +// // // Parameters +// // mainCall := "" +// // for call := range h.Calls { +// // if strings.HasPrefix(call, "mk20.") { +// // mainCall = strings.TrimPrefix(call, "mk20.") +// // break +// // } +// // } +// // if mainCall != "" { +// // fmt.Println("### Parameters") +// // if doc, ok := fm[mainCall]; ok { +// // for _, param := range doc.Params { +// // fmt.Printf("- %s (%s)%s\n", param.Name, param.Type, +// // func() string { +// // if param.Optional { +// // return " [optional]" +// // } +// // return "" +// // }()) +// // } +// // } else if len(h.Types) > 0 { +// // // fallback: print type +// // for typ := range h.Types { +// // fmt.Printf("- body (%s)\n", typ) +// // } +// // } +// // } +// // // Responses +// // fmt.Println("### Possible Responses") +// // for code := range h.Constants { +// // switch code { +// // case "http.StatusBadRequest": +// // fmt.Println("- 400 Bad Request: Invalid input or validation error.") +// // case "http.StatusOK": +// // fmt.Println("- 200 OK: Success.") +// // case "http.StatusInternalServerError": +// // fmt.Println("- 500 Internal Server Error.") +// // // ... add more as needed +// // default: +// // fmt.Printf("- %s\n", code) +// // } +// // } +// // fmt.Println() +// //} +// +// //formatHandlerDocs(fm) +// //generateSwaggoComments(fm) +// +//} +// +////func extractPathParams(path string) []string { +//// var out []string +//// for _, part := range strings.Split(path, "/") { +//// if strings.HasPrefix(part, "{") && strings.HasSuffix(part, "}") { +//// out = append(out, strings.TrimSuffix(strings.TrimPrefix(part, "{"), "}")) +//// } +//// } +//// return out +////} +// +////func generateSwaggoComments(funcDocs map[string]*FunctionDoc) { +//// for _, h := range allHandlers { +//// fmt.Printf("// @Router %s [%s]\n", h.Path, strings.ToLower(h.Method)) +//// +//// // Path parameters from {id}, {chunkNum}, etc. +//// for _, param := range extractPathParams(h.Path) { +//// fmt.Printf("// @Param %s path string true \"%s\"\n", param, param) +//// } +//// +//// // Request body +//// if h.RequestBodyType != "" { +//// fmt.Println("// @accepts json") +//// fmt.Printf("// @Param body body %s true\n", h.RequestBodyType) +//// fmt.Println("// @Accept json\n// @Produce json") +//// } else if h.Method == "PUT" { +//// fmt.Println("// @accepts bytes") +//// fmt.Printf("// @Param body body []byte true \"raw binary\"\n") +//// } +//// +//// // Figure out function called like mk20.Something +//// var mk20Call string +//// for call := range h.Calls { +//// if strings.HasPrefix(call, "mk20.") { +//// mk20Call = strings.TrimPrefix(call, "mk20.") +//// break +//// } +//// } +//// +//// // Return codes (Swagger `@Success` / `@Failure`) +//// hasReturn := false +//// if doc, ok := funcDocs[mk20Call]; ok { +//// for _, ret := range doc.Returns { +//// key := strings.TrimPrefix(ret.Name, "*") +//// key = strings.TrimPrefix(key, "mk20.") +//// if entries, ok := constMap[key]; ok { +//// for _, entry := range entries { +//// msg := strings.TrimSuffix(entry.Doc, ".") +//// tag := "@Failure" +//// if strings.HasPrefix(fmt.Sprintf("%d", entry.Value), "2") { +//// tag = "@Success" +//// hasReturn = true +//// } else { +//// fmt.Printf("// %s %s {object} %s \"%s\"\n", tag, entry.Value, key, msg) +//// } +//// } +//// } +//// } +//// // Fallback to direct http constants if nothing above +//// for k := range h.Constants { +//// if msg, ok := httpCodes[k]; ok { +//// tag := "@Failure" +//// if strings.HasPrefix(fmt.Sprintf("%d", msg.Code), "2") { +//// tag = "@Success" +//// hasReturn = true +//// } else { +//// fmt.Printf("// %s %s {string} string \"%s\"\n", tag, msg.Code, msg.Msg) +//// } +//// +//// } +//// } +//// +//// // If known response type +//// if h.ResponseBodyType != "" && hasReturn { +//// fmt.Println("// @produce json") +//// fmt.Printf("// @Success 200 {object} %s\n", h.ResponseBodyType) +//// } +//// } else { +//// // Fallback to direct http constants if nothing above +//// for k := range h.Constants { +//// if msg, ok := httpCodes[k]; ok { +//// tag := "@Failure" +//// if strings.HasPrefix(fmt.Sprintf("%d", msg.Code), "2") { +//// tag = "@Success" +//// hasReturn = true +//// } else { +//// fmt.Printf("// %s %s {string} string \"%s\"\n", tag, msg.Code, msg.Msg) +//// } +//// //fmt.Printf("// %s %s {string} string \"%s\"\n", tag, msg.Code, msg.Msg) +//// } +//// } +//// +//// // If known response type +//// if h.ResponseBodyType != "" && hasReturn { +//// fmt.Println("// @produce json") +//// fmt.Printf("// @Success 200 {object} %s\n", h.ResponseBodyType) +//// } +//// } +//// +//// fmt.Println() +//// } +////} +//// +////func formatHandlerDocs(funcDocs map[string]*FunctionDoc) { +//// for _, h := range allHandlers { +//// fmt.Printf("%s %s\n", h.Method, h.Path) +//// +//// // 1. Find the mk20 call +//// var mk20Call string +//// for call := range h.Calls { +//// if strings.HasPrefix(call, "mk20.") { +//// mk20Call = strings.TrimPrefix(call, "mk20.") +//// //fmt.Println("mk20Call: ", mk20Call) +//// break +//// } +//// } +//// +//// // 2. Look up params and returns +//// doc, ok := funcDocs[mk20Call] +//// if ok { +//// if h.RequestBodyType != "" { +//// fmt.Printf("### Request Body\n- %s\n", h.RequestBodyType) +//// } +//// if h.RequestBodyType == "" && h.Method == "PUT" { +//// fmt.Printf("### Request Body\n- bytes\n") +//// } +//// +//// // 3. Lookup constMap based on return types +//// fmt.Println("### Possible Responses") +//// for _, ret := range doc.Returns { +//// key := strings.TrimPrefix(ret.Name, "*") +//// key = strings.TrimPrefix(key, "mk20.") +//// if entries, ok := constMap[key]; ok { +//// for _, entry := range entries { +//// comment := entry.Doc +//// comment = strings.TrimSuffix(comment, ".") +//// if comment == "" { +//// fmt.Printf("- %s: %s\n", entry.Value, entry.Name) +//// } else { +//// fmt.Printf("- %s: %s - %s\n", entry.Value, entry.Name, comment) +//// } +//// } +//// } +//// } +//// for k, _ := range h.Constants { +//// fmt.Printf("- %s\n", httpCodes[k]) +//// } +//// if h.ResponseBodyType != "" { +//// fmt.Printf("### Response Body\n- %s\n", h.ResponseBodyType) +//// } +//// } else { +//// //fmt.Println("### Parameters") +//// if h.RequestBodyType != "" { +//// fmt.Printf("### Request Body\n- %s\n", h.RequestBodyType) +//// } +//// if h.RequestBodyType == "" && h.Method == "PUT" { +//// fmt.Printf("### Request Body\n- bytes\n") +//// } +//// fmt.Println("### Possible Responses") +//// for k, _ := range h.Constants { +//// fmt.Printf("- %s\n", httpCodes[k]) +//// } +//// if h.ResponseBodyType != "" { +//// fmt.Printf("### Response Body\n- %s\n", h.ResponseBodyType) +//// } +//// } +//// fmt.Println() +//// } +////} +// +//func collectStruct(pkg *packages.Package, name string, structType *ast.StructType, docText string) { +// info := StructInfo{ +// Name: name, +// Doc: strings.TrimSpace(docText), +// } +// +// for _, field := range structType.Fields.List { +// var fieldName string +// if len(field.Names) > 0 { +// fieldName = field.Names[0].Name +// } else { +// fieldName = fmt.Sprintf("%s", field.Type) +// } +// +// var fieldType string +// var typ types.Type +// if t := pkg.TypesInfo.TypeOf(field.Type); t != nil { +// typ = t +// fieldType = types.TypeString(t, func(p *types.Package) string { +// return p.Name() +// }) +// } +// +// fieldTag := "" +// if field.Tag != nil { +// fieldTag = field.Tag.Value +// } +// +// var fieldDoc string +// if field.Doc != nil { +// lines := strings.Split(field.Doc.Text(), "\n") +// for i := range lines { +// lines[i] = strings.TrimSpace(lines[i]) +// } +// fieldDoc = strings.Join(lines, " ") +// } +// +// info.Fields = append(info.Fields, &FieldInfo{ +// Name: fieldName, +// Type: fieldType, +// Tag: fieldTag, +// Doc: fieldDoc, +// Typ: typ, +// }) +// +// baseType := fieldType +// +// baseType = strings.TrimPrefix(baseType, "*") +// +// baseType = strings.TrimPrefix(baseType, "[]") +// baseType = strings.Split(baseType, ".")[0] +// if skipTypes[baseType] { +// continue +// } +// if !visited[baseType] { +// visited[baseType] = true +// collectFromImports(baseType) +// } +// } +// +// structMap[name] = &info +//} +// +//func collectFromImports(typeName string) { +// // future: support nested imports with doc.New(...) +//} +// +//func writeOutput(path string) { +// var buf bytes.Buffer +// +// buf.WriteString("# Storage Market Interface\n\n") +// buf.WriteString("This document describes the storage market types and supported HTTP methods for making deals with Curio Storage Provider.\n\n") +// +// buf.WriteString("## \U0001F4E1 MK20 HTTP API Overview\n\n") +// buf.WriteString("The MK20 storage market module provides a set of HTTP endpoints under `/market/mk20` that allow clients to submit, track, and finalize storage deals with storage providers. This section documents all available routes and their expected behavior.\n\n") +// +// buf.WriteString("### Base URL\n\n" + +// "The base URL for all MK20 endpoints is: \n\n" + +// "```\n\n/market/mk20\n\n```" + +// "\n\n") +// +// buf.WriteString("### 🔄 POST /store\n\n") +// buf.WriteString("Submit a new MK20 deal.\n\n") +// buf.WriteString("- **Content-Type**: N/A\n") +// buf.WriteString("- **Body**: N/A\n") +// buf.WriteString("- **Query Parameters**: N/A\n") +// buf.WriteString("- **Response**:\n") +// buf.WriteString(" - `200 OK`: Deal accepted\n") +// buf.WriteString(" - Other [HTTP codes](#constants-for-errorcode) indicate validation failure, rejection, or system errors\n\n") +// +// buf.WriteString("### 🧾 GET /status?id=\n\n") +// buf.WriteString("Retrieve the current status of a deal.\n\n") +// buf.WriteString("- **Content-Type**: `application/json`\n") +// buf.WriteString("- **Body**: N/A\n") +// buf.WriteString("- **Query Parameters**:\n") +// buf.WriteString(" - `id`: Deal identifier in [ULID](https://github.com/ulid/spec) format\n") +// buf.WriteString("- **Response**:\n") +// buf.WriteString(" - `200 OK`: JSON-encoded [deal status](#dealstatusresponse) information\n") +// buf.WriteString(" - `400 Bad Request`: Missing or invalid ID\n") +// buf.WriteString(" - `500 Internal Server Error`: If backend fails to respond\n\n") +// +// buf.WriteString("### 📜 GET /contracts\n\n") +// buf.WriteString("- **Content-Type**: N/A\n") +// buf.WriteString("- **Body**: N/A\n") +// buf.WriteString("- **Query Parameters**: N/A\n") +// buf.WriteString("Return the list of contract addresses supported by the provider.\n\n") +// buf.WriteString("- **Response**:\n") +// buf.WriteString(" - `200 OK`: [JSON array of contract addresses](#supportedcontracts)\n") +// buf.WriteString(" - `500 Internal Server Error`: Query or serialization failure\n\n") +// +// buf.WriteString("### 🗂 PUT /data?id=\n\n") +// buf.WriteString("Upload deal data after the deal has been accepted.\n\n") +// buf.WriteString("- **Content-Type**: `application/octet-stream`\n") +// buf.WriteString("- **Body**: Deal data bytes\n") +// buf.WriteString("- **Query Parameter**:\n -`id`: Deal identifier in [ULID](https://github.com/ulid/spec) format\n") +// buf.WriteString("- **Headers**:\n") +// buf.WriteString(" - `Content-Length`: must be deal's raw size\n") +// buf.WriteString("- **Response**:\n") +// buf.WriteString(" - `200 OK`: if data is successfully streamed\n") +// buf.WriteString(" - `400`, `413`, or `415`: on validation failures\n\n") +// +// buf.WriteString("### 🧠 GET /info\n\n") +// buf.WriteString("- **Content-Type**: N/A\n") +// buf.WriteString("- **Body**: N/A\n") +// buf.WriteString("- **Query Parameters**: N/A\n") +// buf.WriteString("Fetch markdown-formatted documentation that describes the supported deal schema, products, and data sources.\n\n") +// buf.WriteString("- **Response**:\n") +// buf.WriteString(" - `200 OK`: with markdown content of the info file\n") +// buf.WriteString(" - `500 Internal Server Error`: if file is not found or cannot be read\n\n") +// +// buf.WriteString("### 🧰 GET /products\n\n") +// buf.WriteString("- **Content-Type**: N/A\n") +// buf.WriteString("- **Body**: N/A\n") +// buf.WriteString("- **Query Parameters**: N/A\n") +// buf.WriteString("Fetch json list of the supported products.\n\n") +// buf.WriteString("- **Response**:\n") +// buf.WriteString(" - `200 OK`: with json content\n") +// buf.WriteString(" - `500 Internal Server Error`: if info cannot be read\n\n") +// +// buf.WriteString("### 🌐 GET /sources\n\n") +// buf.WriteString("- **Content-Type**: N/A\n") +// buf.WriteString("- **Body**: N/A\n") +// buf.WriteString("- **Query Parameters**: N/A\n") +// buf.WriteString("Fetch json list of the supported data sources.\n\n") +// buf.WriteString("- **Response**:\n") +// buf.WriteString(" - `200 OK`: with json content\n") +// buf.WriteString(" - `500 Internal Server Error`: if info cannot be read\n\n") +// +// buf.WriteString("## Supported Deal Types\n\n") +// buf.WriteString("This document lists the data types and fields supported in the new storage market interface. It defines the deal structure, accepted data sources, and optional product extensions. Clients should use these definitions to format and validate their deals before submission.\n\n") +// +// ordered := []string{"Deal", "DataSource", "Products"} +// var rest []string +// for k := range structMap { +// if k != "Deal" && k != "DataSource" && k != "Products" { +// rest = append(rest, k) +// } +// } +// sort.Strings(rest) +// keys := append(ordered, rest...) +// +// for _, k := range keys { +// s, ok := structMap[k] +// if !ok { +// continue +// } +// buf.WriteString(fmt.Sprintf("### %s\n\n", s.Name)) +// if s.Doc != "" { +// buf.WriteString(s.Doc + "\n\n") +// } +// buf.WriteString("| Field | Type | Tag | Description |\n") +// buf.WriteString("|-------|------|-----|-------------|\n") +// for _, f := range s.Fields { +// typeName := f.Type +// linkTarget := "" +// +// // Strip common wrappers like pointer/star and slice +// trimmed := strings.TrimPrefix(typeName, "*") +// trimmed = strings.TrimPrefix(trimmed, "[]") +// parts := strings.Split(trimmed, ".") +// baseType := parts[len(parts)-1] +// +// if _, ok := structMap[baseType]; ok { +// linkTarget = fmt.Sprintf("[%s](#%s)", f.Type, strings.ToLower(baseType)) +// } else if _, ok := constMap[baseType]; ok { +// linkTarget = fmt.Sprintf("[%s](#constants-for-%s)", f.Type, strings.ToLower(baseType)) +// } else { +// typ := f.Typ +// if ptr, ok := typ.(*types.Pointer); ok { +// typ = ptr.Elem() +// } +// if named, ok := typ.(*types.Named); ok && named.Obj() != nil && named.Obj().Pkg() != nil { +// +// pkgPath := named.Obj().Pkg().Path() +// objName := named.Obj().Name() +// linkTarget = fmt.Sprintf("[%s](https://pkg.go.dev/%s#%s)", typeName, pkgPath, objName) +// } else if typ != nil && typ.String() == baseType { +// linkTarget = fmt.Sprintf("[%s](https://pkg.go.dev/builtin#%s)", typeName, baseType) +// } else if slice, ok := typ.(*types.Slice); ok { +// elem := slice.Elem() +// if basic, ok := elem.(*types.Basic); ok { +// linkTarget = fmt.Sprintf("[%s](https://pkg.go.dev/builtin#%s)", typeName, basic.Name()) +// } else { +// linkTarget = typeName +// } +// } else { +// linkTarget = typeName +// } +// } +// +// buf.WriteString(fmt.Sprintf("| %s | %s | %s | %s |\n", +// f.Name, linkTarget, strings.Trim(f.Tag, "`"), f.Doc)) +// } +// buf.WriteString("\n") +// } +// +// // Render constants with sort order +// for k, v := range constMap { +// if len(v) == 0 { +// continue +// } +// buf.WriteString(fmt.Sprintf("### Constants for %s\n\n", k)) +// buf.WriteString("| Constant | Code | Description |\n") +// buf.WriteString("|----------|------|-------------|\n") +// for _, c := range v { +// buf.WriteString(fmt.Sprintf("| %s | %s | %s |\n", c.Name, c.Value, c.Doc)) +// } +// buf.WriteString("\n") +// } +// +// os.Stdout.WriteString(buf.String()) +// +// err := os.WriteFile(path, buf.Bytes(), 0644) +// if err != nil { +// log.Fatalf("Failed to write output: %v", err) +// } +//} +// +////func parseMux(path string) { +//// fset := token.NewFileSet() +//// +//// node, err := parser.ParseFile(fset, path, nil, 0) +//// if err != nil { +//// log.Fatalf("Parse error: %v", err) +//// } +//// +//// ast.Inspect(node, func(n ast.Node) bool { +//// call, ok := n.(*ast.CallExpr) +//// if !ok || len(call.Args) < 2 { +//// return true +//// } +//// +//// sel, ok := call.Fun.(*ast.SelectorExpr) +//// if !ok { +//// return true +//// } +//// +//// method := sel.Sel.Name +//// var path string +//// var fnName string +//// +//// switch method { +//// case "Get", "Post", "Put", "Delete": +//// if len(call.Args) != 2 { +//// return true +//// } +//// pathLit, ok := call.Args[0].(*ast.BasicLit) +//// if !ok || pathLit.Kind != token.STRING { +//// return true +//// } +//// method = strings.ToUpper(method) +//// path = strings.Trim(pathLit.Value, "\"") +//// fnName = call.Args[1].(*ast.SelectorExpr).Sel.Name +//// +//// case "Method": +//// if len(call.Args) != 3 { +//// return true +//// } +//// methodLit, ok := call.Args[0].(*ast.BasicLit) +//// if !ok || methodLit.Kind != token.STRING { +//// return true +//// } +//// method = strings.Trim(methodLit.Value, "\"") +//// +//// pathLit, ok := call.Args[1].(*ast.BasicLit) +//// if !ok || pathLit.Kind != token.STRING { +//// return true +//// } +//// path = strings.Trim(pathLit.Value, "\"") +//// fnName = extractHandlerFunc(call.Args[2]) +//// +//// default: +//// return true +//// } +//// +//// allHandlers[fnName] = &handlerInfo{ +//// Path: path, +//// Method: method, +//// FuncName: fnName, +//// Errors: map[string]bool{}, +//// } +//// return true +//// }) +////} +// +////func extractHandlerFunc(expr ast.Expr) string { +//// call, ok := expr.(*ast.CallExpr) +//// if !ok { +//// return "unknown" +//// } +//// +//// switch fun := call.Fun.(type) { +//// case *ast.SelectorExpr: +//// if fun.Sel.Name == "TimeoutHandler" && len(call.Args) > 0 { +//// return extractHandlerFunc(call.Args[0]) +//// } +//// if fun.Sel.Name == "HandlerFunc" && len(call.Args) > 0 { +//// if sel, ok := call.Args[0].(*ast.SelectorExpr); ok { +//// return sel.Sel.Name +//// } +//// } +//// } +//// return "unknown" +////} +// +////func parseHandlerBodies(path string) { +//// fset := token.NewFileSet() +//// file, err := parser.ParseFile(fset, path, nil, parser.AllErrors|parser.ParseComments) +//// if err != nil { +//// log.Fatalf("Parse error: %v", err) +//// } +//// for _, decl := range file.Decls { +//// fn, ok := decl.(*ast.FuncDecl) +//// if !ok || fn.Body == nil { +//// continue +//// } +//// name := fn.Name.Name +//// handler, exists := allHandlers[name] +//// if !exists { +//// continue +//// } +//// +//// calls := map[string]bool{} +//// types := map[string]bool{} +//// constants := map[string]bool{} +//// var reqType string +//// var respType string +//// +//// ast.Inspect(fn.Body, func(n ast.Node) bool { +//// switch node := n.(type) { +//// case *ast.CallExpr: +//// if sel, ok := node.Fun.(*ast.SelectorExpr); ok { +//// // http.WriteHeader or http.Error +//// if ident, ok := sel.X.(*ast.Ident); ok && ident.Name == "http" { +//// if sel.Sel.Name == "WriteHeader" || sel.Sel.Name == "Error" { +//// calls["http."+sel.Sel.Name] = true +//// } +//// } +//// // mdh.dm.MK20Handler. +//// if x1, ok := sel.X.(*ast.SelectorExpr); ok { +//// if x2, ok := x1.X.(*ast.SelectorExpr); ok { +//// if x2.X.(*ast.Ident).Name == "mdh" && +//// x2.Sel.Name == "dm" && +//// x1.Sel.Name == "MK20Handler" { +//// calls["mk20."+sel.Sel.Name] = true +//// } +//// } +//// } +//// // Detect json.Unmarshal(b, &type) +//// if sel.Sel.Name == "Unmarshal" && len(node.Args) == 2 { +//// if unary, ok := node.Args[1].(*ast.UnaryExpr); ok { +//// if ident, ok := unary.X.(*ast.Ident); ok { +//// reqType = findVarType(fn, ident.Name) +//// } +//// } +//// } +//// // Detect json.Marshal(type) +//// if sel.Sel.Name == "Marshal" && len(node.Args) == 1 { +//// if ident, ok := node.Args[0].(*ast.Ident); ok { +//// respType = findVarType(fn, ident.Name) +//// } +//// } +//// } +//// case *ast.AssignStmt: +//// for _, rhs := range node.Rhs { +//// if ce, ok := rhs.(*ast.CallExpr); ok { +//// if sel, ok := ce.Fun.(*ast.SelectorExpr); ok { +//// if ident, ok := sel.X.(*ast.Ident); ok && ident.Name == "http" { +//// if strings.HasPrefix(sel.Sel.Name, "Status") { +//// constants["http."+sel.Sel.Name] = true +//// } +//// } +//// } +//// } +//// } +//// case *ast.ValueSpec: +//// if node.Type != nil { +//// if se, ok := node.Type.(*ast.SelectorExpr); ok { +//// if ident, ok := se.X.(*ast.Ident); ok && ident.Name == "mk20" { +//// types["mk20."+se.Sel.Name] = true +//// } +//// } +//// } +//// case *ast.SelectorExpr: +//// if ident, ok := node.X.(*ast.Ident); ok && ident.Name == "http" { +//// if strings.HasPrefix(node.Sel.Name, "Status") { +//// constants["http."+node.Sel.Name] = true +//// } +//// } +//// } +//// return true +//// }) +//// +//// handler.Calls = calls +//// handler.Types = types +//// handler.Constants = constants +//// handler.RequestBodyType = reqType +//// handler.ResponseBodyType = respType +//// } +////} +//// +////// Helper to find type of variable declared in function scope +////func findVarType(fn *ast.FuncDecl, name string) string { +//// for _, stmt := range fn.Body.List { +//// if ds, ok := stmt.(*ast.DeclStmt); ok { +//// if gd, ok := ds.Decl.(*ast.GenDecl); ok { +//// for _, spec := range gd.Specs { +//// if vs, ok := spec.(*ast.ValueSpec); ok { +//// for _, ident := range vs.Names { +//// if ident.Name == name { +//// if se, ok := vs.Type.(*ast.SelectorExpr); ok { +//// if x, ok := se.X.(*ast.Ident); ok { +//// return x.Name + "." + se.Sel.Name +//// } +//// } +//// } +//// } +//// } +//// } +//// } +//// } +//// } +//// return "" +////} diff --git a/market/mk20/pdp_v1.go b/market/mk20/pdp_v1.go new file mode 100644 index 000000000..e18950939 --- /dev/null +++ b/market/mk20/pdp_v1.go @@ -0,0 +1,149 @@ +package mk20 + +import ( + "context" + + "github.com/ethereum/go-ethereum/common" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" +) + +// PDPV1 represents configuration for product-specific PDP version 1 deals. +type PDPV1 struct { + // CreateDataSet indicated that this deal is meant to create a new DataSet for the client by storage provider. + CreateDataSet bool `json:"create_data_set"` + + // DeleteDataSet indicated that this deal is meant to delete an existing DataSet created by SP for the client. + // DataSetID must be defined. + DeleteDataSet bool `json:"delete_data_set"` + + // AddPiece indicated that this deal is meant to add Piece to a given DataSet. DataSetID must be defined. + AddPiece bool `json:"add_piece"` + + // DeletePiece indicates whether the Piece of the data should be deleted. DataSetID must be defined. + DeletePiece bool `json:"delete_piece"` + + // DataSetID is PDP verified contract dataset ID. It must be defined for all deals except when CreateDataSet is true. + DataSetID *uint64 `json:"data_set_id,omitempty"` + + // RecordKeeper specifies the record keeper contract address for the new PDP dataset. + RecordKeeper string `json:"record_keeper"` + + // PieceIDs is a list of Piece ids in a proof set. + PieceIDs []uint64 `json:"piece_ids,omitempty"` + + // ExtraData can be used to send additional information to service contract when Verifier action like AddPiece, DeletePiece, etc. are performed. + ExtraData []byte `json:"extra_data,omitempty"` +} + +func (p *PDPV1) Validate(db *harmonydb.DB, cfg *config.MK20Config) (DealCode, error) { + code, err := IsProductEnabled(db, p.ProductName()) + if err != nil { + return code, err + } + + if ok := p.CreateDataSet || p.DeleteDataSet || p.AddPiece || p.DeletePiece; !ok { + return ErrBadProposal, xerrors.Errorf("deal must have one of the following flags set: create_data_set, delete_data_set, add_piece, delete_piece") + } + + var existingAddress bool + + err = db.QueryRow(context.Background(), `SELECT EXISTS(SELECT 1 FROM eth_keys WHERE role = 'pdp')`).Scan(&existingAddress) + if err != nil { + return ErrServerInternalError, xerrors.Errorf("checking if pdp address exists: %w", err) + } + + if !existingAddress { + return ErrServiceMaintenance, xerrors.Errorf("pdp key not configured by storage provider") + } + + if p.CreateDataSet { + if p.DataSetID != nil { + return ErrBadProposal, xerrors.Errorf("create_proof_set cannot be set with data_set_id") + } + if p.RecordKeeper == "" { + return ErrBadProposal, xerrors.Errorf("record_keeper must be defined for create_proof_set") + } + if !common.IsHexAddress(p.RecordKeeper) { + return ErrBadProposal, xerrors.Errorf("record_keeper must be a valid address") + } + } + + // Only 1 action is allowed per deal + if btoi(p.CreateDataSet)+btoi(p.DeleteDataSet)+btoi(p.AddPiece)+btoi(p.DeletePiece) > 1 { + return ErrBadProposal, xerrors.Errorf("only one action is allowed per deal") + } + + ctx := context.Background() + + if p.DeleteDataSet { + if p.DataSetID == nil { + return ErrBadProposal, xerrors.Errorf("delete_proof_set must have data_set_id defined") + } + pid := *p.DataSetID + var exists bool + err := db.QueryRow(ctx, `SELECT EXISTS(SELECT 1 FROM pdp_data_set WHERE id = $1 AND removed = FALSE)`, pid).Scan(&exists) + if err != nil { + return ErrServerInternalError, xerrors.Errorf("checking if dataset exists: %w", err) + } + if !exists { + return ErrBadProposal, xerrors.Errorf("dataset does not exist for the client") + } + } + + if p.AddPiece { + if p.DataSetID == nil { + return ErrBadProposal, xerrors.Errorf("add_piece must have data_set_id defined") + } + pid := *p.DataSetID + var exists bool + err := db.QueryRow(ctx, `SELECT EXISTS(SELECT 1 FROM pdp_data_set WHERE id = $1 AND removed = FALSE)`, pid).Scan(&exists) + if err != nil { + return ErrServerInternalError, xerrors.Errorf("checking if dataset exists: %w", err) + } + if !exists { + return ErrBadProposal, xerrors.Errorf("dataset does not exist for the client") + } + } + + if p.DeletePiece { + if p.DataSetID == nil { + return ErrBadProposal, xerrors.Errorf("delete_piece must have data_set_id defined") + } + pid := *p.DataSetID + if len(p.PieceIDs) == 0 { + return ErrBadProposal, xerrors.Errorf("piece_ids must be defined for delete_proof_set") + } + var exists bool + err := db.QueryRow(ctx, `SELECT COUNT(*) = cardinality($2::BIGINT[]) AS all_exist_and_active + FROM pdp_dataset_piece r + JOIN pdp_data_set s ON r.data_set_id = s.id + WHERE r.data_set_id = $1 + AND r.piece = ANY($2) + AND r.removed = FALSE + AND s.removed = FALSE;`, pid, p.PieceIDs).Scan(&exists) + if err != nil { + return ErrServerInternalError, xerrors.Errorf("checking if dataset and pieces exists: %w", err) + } + if !exists { + return ErrBadProposal, xerrors.Errorf("dataset or one of the pieces does not exist for the client") + } + } + + return Ok, nil +} + +func btoi(b bool) int { + if b { + return 1 + } + return 0 +} + +func (p *PDPV1) ProductName() ProductName { + return ProductNamePDPV1 +} + +var _ product = &PDPV1{} diff --git a/market/mk20/retrieval_v1.go b/market/mk20/retrieval_v1.go new file mode 100644 index 000000000..5fa69ac9f --- /dev/null +++ b/market/mk20/retrieval_v1.go @@ -0,0 +1,39 @@ +package mk20 + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" +) + +// RetrievalV1 defines a structure for managing retrieval settings +type RetrievalV1 struct { + // Indexing indicates if the deal is to be indexed in the provider's system to support CIDs based retrieval + Indexing bool `json:"indexing"` + + // AnnouncePayload indicates whether the payload should be announced to IPNI. + AnnouncePayload bool `json:"announce_payload"` + + // AnnouncePiece indicates whether the piece information should be announced to IPNI. + AnnouncePiece bool `json:"announce_piece"` +} + +func (r *RetrievalV1) Validate(db *harmonydb.DB, cfg *config.MK20Config) (DealCode, error) { + code, err := IsProductEnabled(db, r.ProductName()) + if err != nil { + return code, err + } + + if !r.Indexing && r.AnnouncePayload { + return ErrProductValidationFailed, xerrors.Errorf("deal cannot be announced to IPNI without indexing") + } + + return Ok, nil +} + +func (r *RetrievalV1) ProductName() ProductName { + return ProductNameRetrievalV1 +} + +var _ product = &RetrievalV1{} diff --git a/market/mk20/types.go b/market/mk20/types.go new file mode 100644 index 000000000..9014f123f --- /dev/null +++ b/market/mk20/types.go @@ -0,0 +1,274 @@ +package mk20 + +import ( + "net/http" + + "github.com/ipfs/go-cid" + "github.com/oklog/ulid" + + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" +) + +// Deal represents a structure defining the details and components of a specific deal in the system. +type Deal struct { + + // Identifier represents a unique identifier for the deal in ULID format. + Identifier ulid.ULID `json:"identifier" swaggertype:"string" format:"ulid" example:"01ARZ3NDEKTSV4RRFFQ69G5FAV"` + + // Client wallet string for the deal + Client string `json:"client"` + + // Data represents the source of piece data and associated metadata. + Data *DataSource `json:"data,omitempty"` + + // Products represents a collection of product-specific information associated with a deal + Products Products `json:"products"` +} + +type Products struct { + // DDOV1 represents a product v1 configuration for Direct Data Onboarding (DDO) + DDOV1 *DDOV1 `json:"ddo_v1,omitempty"` + + // RetrievalV1 represents configuration for retrieval settings in the system, including indexing and announcement flags. + RetrievalV1 *RetrievalV1 `json:"retrieval_v1,omitempty"` + + // PDPV1 represents product-specific configuration for PDP version 1 deals. + PDPV1 *PDPV1 `json:"pdp_v1,omitempty"` +} + +// DataSource represents the source of piece data, including metadata and optional methods to fetch or describe the data origin. +type DataSource struct { + + // PieceCID represents the unique identifier (pieceCID V2) for a piece of data, stored as a CID object. + PieceCID cid.Cid `json:"piece_cid" swaggertype:"object,string" example:"/:bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pq"` + + // Format defines the format of the piece data, which can include CAR, Aggregate, or Raw formats. + Format PieceDataFormat `json:"format"` + + // SourceHTTP represents the HTTP-based source of piece data within a deal, including raw size and URLs for retrieval. + SourceHTTP *DataSourceHTTP `json:"source_http,omitempty"` + + // SourceAggregate represents an aggregated source, comprising multiple data sources as pieces. + SourceAggregate *DataSourceAggregate `json:"source_aggregate,omitempty"` + + // SourceOffline defines the data source for offline pieces, including raw size information. + SourceOffline *DataSourceOffline `json:"source_offline,omitempty"` + + // SourceHttpPut allow clients to push piece data after deal is accepted + SourceHttpPut *DataSourceHttpPut `json:"source_http_put,omitempty"` +} + +// PieceDataFormat represents various formats in which piece data can be defined, including CAR files, aggregate formats, or raw byte data. +type PieceDataFormat struct { + + // Car represents the optional CAR file format. + Car *FormatCar `json:"car,omitempty"` + + // Aggregate holds a reference to the aggregated format of piece data. + Aggregate *FormatAggregate `json:"aggregate,omitempty"` + + // Raw represents the raw format of the piece data, encapsulated as bytes. + Raw *FormatBytes `json:"raw,omitempty"` +} + +// FormatCar represents the CAR (Content Addressable archive) format for piece data serialization. +type FormatCar struct{} + +// FormatAggregate represents the aggregated format for piece data, identified by its type. +type FormatAggregate struct { + + // Type specifies the type of aggregation for data pieces, represented by an AggregateType value. + Type AggregateType `json:"type"` + + // Sub holds a slice of DataSource, representing details of sub pieces aggregated under this format. + // The order must be same as segment index to avoid incorrect indexing of sub pieces in an aggregate + Sub []DataSource `json:"sub"` +} + +// FormatBytes defines the raw byte representation of data as a format. +type FormatBytes struct{} + +// DataSourceOffline represents the data source for offline pieces. +type DataSourceOffline struct{} + +// DataSourceAggregate represents an aggregated data source containing multiple individual DataSource pieces. +type DataSourceAggregate struct { + Pieces []DataSource `json:"pieces"` +} + +// DataSourceHTTP represents an HTTP-based data source for retrieving piece data, including associated URLs. +type DataSourceHTTP struct { + // URLs lists the HTTP endpoints where the piece data can be fetched. + URLs []HttpUrl `json:"urls"` +} + +// HttpUrl represents an HTTP endpoint configuration for fetching piece data. +type HttpUrl struct { + + // URL specifies the HTTP endpoint where the piece data can be fetched. + URL string `json:"url"` + + // HTTPHeaders represents the HTTP headers associated with the URL. + Headers http.Header `json:"headers"` + + // Priority indicates the order preference for using the URL in requests, with lower values having higher priority. + Priority int `json:"priority"` + + // Fallback indicates whether this URL serves as a fallback option when other URLs fail. + Fallback bool `json:"fallback"` +} + +// DataSourceHttpPut represents a data source allowing clients to push piece data after a deal is accepted. +type DataSourceHttpPut struct{} + +// AggregateType represents an unsigned integer used to define the type of aggregation for data pieces in the system. +type AggregateType int + +const ( + + // AggregateTypeNone represents the default aggregation type, indicating no specific aggregation is applied. + AggregateTypeNone AggregateType = iota + + // AggregateTypeV1 represents the first version of the aggregate type in the system. This is current PODSI aggregation + // based on https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0058.md + AggregateTypeV1 +) + +// DealCode represents an error code as an integer value +type DealCode int + +const ( + + // Ok represents a successful operation with an HTTP status code of 200. + Ok DealCode = 200 + + // ErrUnAuthorized represents an error indicating unauthorized access with the code 401. + ErrUnAuthorized DealCode = 401 + + // ErrBadProposal represents a validation error that indicates an invalid or malformed proposal input in the context of validation logic. + ErrBadProposal DealCode = 400 + + // ErrDealNotFound indicates that the specified deal could not be found, corresponding to the HTTP status code 404. + ErrDealNotFound DealCode = 404 + + // ErrMalformedDataSource indicates that the provided data source is incorrectly formatted or contains invalid data. + ErrMalformedDataSource DealCode = 430 + + // ErrUnsupportedDataSource indicates the specified data source is not supported or disabled for use in the current context. + ErrUnsupportedDataSource DealCode = 422 + + // ErrUnsupportedProduct indicates that the requested product is not supported by the provider. + ErrUnsupportedProduct DealCode = 423 + + // ErrProductNotEnabled indicates that the requested product is not enabled on the provider. + ErrProductNotEnabled DealCode = 424 + + // ErrProductValidationFailed indicates a failure during product-specific validation due to invalid or missing data. + ErrProductValidationFailed DealCode = 425 + + // ErrDealRejectedByMarket indicates that a proposed deal was rejected by the market for not meeting its acceptance criteria or rules. + ErrDealRejectedByMarket DealCode = 426 + + // ErrServerInternalError indicates an internal server error with a corresponding error code of 500. + ErrServerInternalError DealCode = 500 + + // ErrServiceMaintenance indicates that the service is temporarily unavailable due to maintenance, corresponding to HTTP status code 503. + ErrServiceMaintenance DealCode = 503 + + // ErrServiceOverloaded indicates that the service is overloaded and cannot process the request at the moment. + ErrServiceOverloaded DealCode = 429 + + // ErrMarketNotEnabled indicates that the market is not enabled for the requested operation. + ErrMarketNotEnabled DealCode = 440 + + // ErrDurationTooShort indicates that the provided duration value does not meet the minimum required threshold. + ErrDurationTooShort DealCode = 441 +) + +// ProductName represents a type for defining the product name identifier used in various operations and validations. +type ProductName string + +const ( + // ProductNameDDOV1 represents the identifier for the "ddo_v1" product used in contract operations and validations. + ProductNameDDOV1 ProductName = "ddo_v1" + ProductNamePDPV1 ProductName = "pdp_v1" + ProductNameRetrievalV1 ProductName = "retrieval_v1" +) + +type DataSourceName string + +const ( + DataSourceNameHTTP DataSourceName = "http" + DataSourceNameAggregate DataSourceName = "aggregate" + DataSourceNameOffline DataSourceName = "offline" + DataSourceNamePut DataSourceName = "put" +) + +type product interface { + Validate(db *harmonydb.DB, cfg *config.MK20Config) (DealCode, error) + ProductName() ProductName +} + +// UploadStatusCode defines the return codes for the upload status +type UploadStatusCode int + +const ( + + // UploadStatusCodeOk represents a successful upload operation with status code 200. + UploadStatusCodeOk UploadStatusCode = 200 + + // UploadStatusCodeDealNotFound indicates that the requested deal was not found, corresponding to status code 404. + UploadStatusCodeDealNotFound UploadStatusCode = 404 + + // UploadStatusCodeUploadNotStarted indicates that the upload process has not started yet. + UploadStatusCodeUploadNotStarted UploadStatusCode = 425 + + // UploadStatusCodeServerError indicates an internal server error occurred during the upload process, corresponding to status code 500. + UploadStatusCodeServerError UploadStatusCode = 500 +) + +// UploadStartCode represents an integer type for return codes related to the upload start process. +type UploadStartCode int + +const ( + + // UploadStartCodeOk indicates a successful upload start request with status code 200. + UploadStartCodeOk UploadStartCode = 200 + + // UploadStartCodeBadRequest indicates a bad upload start request error with status code 400. + UploadStartCodeBadRequest UploadStartCode = 400 + + // UploadStartCodeDealNotFound represents a 404 status indicating the deal was not found during the upload start process. + UploadStartCodeDealNotFound UploadStartCode = 404 + + // UploadStartCodeAlreadyStarted indicates that the upload process has already been initiated and cannot be started again. + UploadStartCodeAlreadyStarted UploadStartCode = 409 + + // UploadStartCodeServerError indicates an error occurred on the server while processing an upload start request. + UploadStartCodeServerError UploadStartCode = 500 +) + +// UploadCode represents return codes related to upload operations, typically based on HTTP status codes. +type UploadCode int + +const ( + + // UploadOk indicates a successful upload operation, represented by the HTTP status code 200. + UploadOk UploadCode = 200 + + // UploadBadRequest represents a bad request error with an HTTP status code of 400. + UploadBadRequest UploadCode = 400 + + // UploadNotFound represents an error where the requested upload chunk could not be found, typically corresponding to HTTP status 404. + UploadNotFound UploadCode = 404 + + // UploadChunkAlreadyUploaded indicates that the chunk has already been uploaded and cannot be re-uploaded. + UploadChunkAlreadyUploaded UploadCode = 409 + + // UploadServerError indicates a server-side error occurred during the upload process, represented by the HTTP status code 500. + UploadServerError UploadCode = 500 + + // UploadRateLimit indicates that the upload operation is being rate-limited, corresponding to the HTTP status code 429. + UploadRateLimit UploadCode = 429 +) diff --git a/market/mk20/types_test.go b/market/mk20/types_test.go new file mode 100644 index 000000000..aecdbcb0b --- /dev/null +++ b/market/mk20/types_test.go @@ -0,0 +1,321 @@ +package mk20 + +import ( + "encoding/json" + "net/http" + "reflect" + "testing" + + "github.com/ipfs/go-cid" + "github.com/oklog/ulid" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/builtin/v16/verifreg" +) + +func mustCID(t *testing.T, s string) cid.Cid { + t.Helper() + c, err := cid.Parse(s) + if err != nil { + t.Fatalf("parse cid: %v", err) + } + return c +} + +func mustULID(t *testing.T, s string) ulid.ULID { + t.Helper() + id, err := ulid.Parse(s) + if err != nil { + t.Fatalf("parse ulid: %v", err) + } + return id +} + +func TestDeal_MarshalUnmarshal_Minimal(t *testing.T) { + orig := Deal{ + Identifier: mustULID(t, "01ARZ3NDEKTSV4RRFFQ69G5FAV"), + Client: "f1abcclient", + // Data omitted (omitempty) + // Products is empty struct; inner fields are omitempty + } + + b, err := json.Marshal(orig) + if err != nil { + t.Fatalf("marshal: %v", err) + } + + // Expect "data" to be absent and "products" to be an empty object + var m map[string]any + if err := json.Unmarshal(b, &m); err != nil { + t.Fatalf("unmarshal into map: %v", err) + } + if _, ok := m["data"]; ok { + t.Fatalf("expected 'data' to be omitted, found present") + } + if p, ok := m["products"]; !ok { + t.Fatalf("expected 'products' present") + } else if obj, ok := p.(map[string]any); !ok || len(obj) != 0 { + t.Fatalf("expected 'products' to be empty object, got: %#v", p) + } + + var round Deal + if err := json.Unmarshal(b, &round); err != nil { + t.Fatalf("round unmarshal: %v", err) + } + + if !reflect.DeepEqual(orig, round) { + t.Fatalf("round trip mismatch:\norig: %#v\nround:%#v", orig, round) + } +} + +func TestHttpHeaderRoundTrip(t *testing.T) { + orig := http.Header{ + "X-Trace-Id": []string{"abc123"}, + "Cache-Control": []string{"no-cache", "private"}, + } + b, err := json.Marshal(orig) + if err != nil { + t.Fatalf("marshal: %v", err) + } + t.Logf("marshaled JSON: %s", string(b)) + + var round http.Header + if err := json.Unmarshal(b, &round); err != nil { + t.Fatalf("unmarshal: %v", err) + } + t.Logf("unmarshaled Struct: %+v", round) + v := round.Values("Cache-Control") + require.Equal(t, 2, len(v)) + require.Equal(t, "no-cache", v[0]) + require.Equal(t, "private", v[1]) + v = round.Values("X-Trace-Id") + require.Equal(t, 1, len(v)) + require.Equal(t, "abc123", v[0]) +} + +func TestDeal_HTTPSourceWithHeaders(t *testing.T) { + addr, err := address.NewFromString("t01000") + require.NoError(t, err) + x := uint64(1234) + v := verifreg.AllocationId(x) + + orig := Deal{ + Identifier: mustULID(t, "01ARZ3NDEKTSV4RRFFQ69G5FAV"), + Client: "f1client", + Data: &DataSource{ + PieceCID: mustCID(t, "bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pq"), + Format: PieceDataFormat{Car: &FormatCar{}}, + SourceHTTP: &DataSourceHTTP{ + URLs: []HttpUrl{ + { + URL: "https://example.com/piece/xyz", + Headers: http.Header{"X-Trace-Id": []string{"abc123"}, "Cache-Control": []string{"no-cache", "private"}}, + Priority: 10, + Fallback: false, + }, + { + URL: "http://127.0.0.1:8080/piece/xyz", + Headers: http.Header{}, // empty headers should round-trip + Priority: 20, + Fallback: true, + }, + }, + }, + }, + Products: Products{ + PDPV1: &PDPV1{ + CreateDataSet: true, + RecordKeeper: "0x158c8f05A616403589b99BE5d82d756860363A92", + ExtraData: []byte("extra data"), + PieceIDs: []uint64{0, 1}, + DataSetID: &x, + }, + DDOV1: &DDOV1{ + Provider: addr, + PieceManager: addr, + AllocationId: &v, + ContractVerifyMethodParams: []byte("contract verify method params"), + }, + }, + } + + b, err := json.Marshal(orig) + if err != nil { + t.Fatalf("marshal: %v", err) + } + + t.Logf("marshaled JSON: %s", string(b)) + + var round Deal + if err := json.Unmarshal(b, &round); err != nil { + t.Fatalf("unmarshal: %v", err) + } + + if !reflect.DeepEqual(orig, round) { + t.Fatalf("round trip mismatch:\norig: %#v\nround:%#v", orig, round) + } + + // Spot-check headers survived correctly + gotHdr := round.Data.SourceHTTP.URLs[0].Headers + if v := gotHdr.Get("X-Trace-ID"); v != "abc123" { + t.Fatalf("expected X-Trace-ID=abc123, got %q", v) + } +} + +func TestDeal_Aggregate_NoSub_vs_EmptySub(t *testing.T) { + // Case A: Aggregate.Sub is nil (no omitempty on Sub), expected to marshal as "sub": null + withNil := Deal{ + Identifier: mustULID(t, "01ARZ3NDEKTSV4RRFFQ69G5FAV"), + Client: "f1client", + Data: &DataSource{ + PieceCID: mustCID(t, "bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pq"), + Format: PieceDataFormat{ + Aggregate: &FormatAggregate{ + Type: AggregateTypeV1, + Sub: nil, // important + }, + }, + }, + } + + bNil, err := json.Marshal(withNil) + if err != nil { + t.Fatalf("marshal nil-sub: %v", err) + } + var objNil map[string]any + _ = json.Unmarshal(bNil, &objNil) // ignore error; presence check is all we need + // Navigate: data.format.aggregate.sub should be null + dataMap := objNil["data"].(map[string]any) + format := dataMap["format"].(map[string]any) + agg := format["aggregate"].(map[string]any) + if _, ok := agg["sub"]; !ok { + t.Fatalf("expected aggregate.sub to be present (as null) when Sub == nil") + } + if agg["sub"] != nil { + t.Fatalf("expected aggregate.sub == null; got: %#v", agg["sub"]) + } + + // Case B: Aggregate.Sub is empty slice, expected to marshal as "sub": [] + withEmpty := withNil + withEmpty.Data.Format.Aggregate.Sub = []DataSource{} + + bEmpty, err := json.Marshal(withEmpty) + if err != nil { + t.Fatalf("marshal empty-sub: %v", err) + } + var objEmpty map[string]any + _ = json.Unmarshal(bEmpty, &objEmpty) + dataMap = objEmpty["data"].(map[string]any) + format = dataMap["format"].(map[string]any) + agg = format["aggregate"].(map[string]any) + arr, ok := agg["sub"].([]any) + if !ok { + t.Fatalf("expected aggregate.sub to be [] when Sub == empty slice; got %#v", agg["sub"]) + } + if len(arr) != 0 { + t.Fatalf("expected empty array for sub; got len=%d", len(arr)) + } +} + +func TestDeal_Aggregate_WithSubpieces_RoundTrip(t *testing.T) { + // Two subpieces: one Raw, one Car + sub1 := DataSource{ + PieceCID: mustCID(t, "bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pq"), + Format: PieceDataFormat{Raw: &FormatBytes{}}, + SourceOffline: &DataSourceOffline{}, // ensure additional fields survive + } + sub2 := DataSource{ + PieceCID: mustCID(t, "bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pd"), + Format: PieceDataFormat{Car: &FormatCar{}}, + } + + orig := Deal{ + Identifier: mustULID(t, "01ARZ3NDEKTSV4RRFFQ69G5FAV"), + Client: "f1client", + Data: &DataSource{ + PieceCID: mustCID(t, "bafkzcibfxx3meais3xzh6qn56y6hiasmrufhegoweu3o5ccofs74nfdfr4yn76pqz4pe"), + Format: PieceDataFormat{ + Aggregate: &FormatAggregate{ + Type: AggregateTypeV1, + Sub: []DataSource{sub1, sub2}, + }, + }, + SourceAggregate: &DataSourceAggregate{Pieces: []DataSource{sub1, sub2}}, + }, + Products: Products{ + // exercise omitempty pointers: all nil + }, + } + + b, err := json.Marshal(orig) + if err != nil { + t.Fatalf("marshal: %v", err) + } + + var round Deal + if err := json.Unmarshal(b, &round); err != nil { + t.Fatalf("unmarshal: %v", err) + } + + // Order must be preserved + if len(round.Data.Format.Aggregate.Sub) != 2 { + t.Fatalf("expected 2 subpieces, got %d", len(round.Data.Format.Aggregate.Sub)) + } + if round.Data.Format.Aggregate.Sub[0].PieceCID.String() != sub1.PieceCID.String() { + t.Fatalf("subpiece[0] order changed") + } + + if !reflect.DeepEqual(orig, round) { + t.Fatalf("round trip mismatch:\norig: %#v\nround:%#v", orig, round) + } +} + +func TestDeal_Products_OmitEmptyInnerFields(t *testing.T) { + // All product pointers nil -> products should marshal as {} + orig := Deal{ + Identifier: mustULID(t, "01ARZ3NDEKTSV4RRFFQ69G5FAV"), + Client: "f1client", + Products: Products{}, + } + + b, err := json.Marshal(orig) + if err != nil { + t.Fatalf("marshal: %v", err) + } + var m map[string]any + if err := json.Unmarshal(b, &m); err != nil { + t.Fatalf("unmarshal map: %v", err) + } + p, ok := m["products"] + if !ok { + t.Fatalf("products missing") + } + if obj, ok := p.(map[string]any); !ok || len(obj) != 0 { + t.Fatalf("expected products to be {}, got %#v", p) + } + + var round Deal + if err := json.Unmarshal(b, &round); err != nil { + t.Fatalf("round unmarshal: %v", err) + } + if !reflect.DeepEqual(orig.Products, round.Products) { + t.Fatalf("products changed on round trip: %#v -> %#v", orig.Products, round.Products) + } +} + +func TestPartialUnmarshal(t *testing.T) { + iString := "{\"client\":\"t1k7ctd3hvmwwjdpb2ipd3kr7n4vk3xzfvzbbdrai\",\"data\":{\"format\":{\"raw\":{}},\"piece_cid\":{\"/\": \"bafkzcibfxx3meais7dgqlg24253d7s2unmxkczzlrnsoni6zmvjy6vi636nslfyggu3q\"},\"source_http_put\":{}},\"identifier\":\"01K4R3EK6QEPASQH8KFPKVBNWR\",\"products\":{\"pdp_v1\":{\"add_piece\":true,\"delete_data_set\":false,\"delete_piece\":false,\"extra_data\":[],\"record_keeper\":\"0x158c8f05A616403589b99BE5d82d756860363A92\"},\"retrieval_v1\":{\"announce_payload\":true,\"announce_piece\":true,\"indexing\":true}}}" + var deal Deal + if err := json.Unmarshal([]byte(iString), &deal); err != nil { + t.Fatal(err) + } + require.NotNil(t, deal) + require.NotNil(t, deal.Products) + require.NotNil(t, deal.Products.PDPV1) + require.Equal(t, false, deal.Products.PDPV1.CreateDataSet) + require.Equal(t, true, deal.Products.PDPV1.AddPiece) + require.Equal(t, "0x158c8f05A616403589b99BE5d82d756860363A92", deal.Products.PDPV1.RecordKeeper) + require.True(t, deal.Data.PieceCID.Defined()) + require.NotNil(t, deal.Data.SourceHttpPut) +} diff --git a/market/mk20/utils.go b/market/mk20/utils.go new file mode 100644 index 000000000..f34ce5515 --- /dev/null +++ b/market/mk20/utils.go @@ -0,0 +1,1005 @@ +package mk20 + +import ( + "bytes" + "context" + "crypto/ed25519" + "crypto/rand" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/url" + "runtime" + "runtime/debug" + "strings" + "time" + + "github.com/ipfs/go-cid" + "github.com/mr-tron/base58" + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-padreader" + "github.com/filecoin-project/go-state-types/abi" + fcrypto "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" + + "github.com/filecoin-project/lotus/lib/sigs" +) + +func (d *Deal) Validate(db *harmonydb.DB, cfg *config.MK20Config, Auth string) (DealCode, error) { + defer func() { + if r := recover(); r != nil { + trace := make([]byte, 1<<16) + n := runtime.Stack(trace, false) + log.Errorf("panic occurred in validation: %v\n%s", r, trace[:n]) + debug.PrintStack() + } + }() + + err := validateClient(d.Client, Auth) + if err != nil { + return ErrBadProposal, err + } + + code, err := d.Products.Validate(db, cfg) + if err != nil { + return code, xerrors.Errorf("products validation failed: %w", err) + } + + // Validate data if present + if d.Data != nil { + return d.Data.Validate(db) + } + + // Return without validating data for initial phase of /Put deals or PDP Delete deals + return Ok, nil +} + +func validateClient(client string, auth string) error { + if client == "" { + return xerrors.Errorf("client is empty") + } + + keyType, pubKey, _, err := parseCustomAuth(auth) + if err != nil { + return xerrors.Errorf("parsing auth header: %w", err) + } + + switch keyType { + case "ed25519": + kStr, err := ED25519ToString(pubKey) + if err != nil { + return xerrors.Errorf("invalid public key for auth header: %w", err) + } + if client != kStr { + return xerrors.Errorf("client in deal does not match client in auth header") + } + return nil + case "secp256k1", "bls", "delegated": + addr, err := address.NewFromBytes(pubKey) + if err != nil { + return xerrors.Errorf("invalid public key for auth header: %w", err) + } + if client != addr.String() { + return xerrors.Errorf("client in deal does not match client in auth header") + } + return nil + default: + return fmt.Errorf("unsupported key type: %s", keyType) + } +} + +func (d DataSource) Validate(db *harmonydb.DB) (DealCode, error) { + + err := ValidatePieceCID(d.PieceCID) + if err != nil { + return ErrBadProposal, err + } + + if d.SourceOffline != nil && d.SourceHTTP != nil && d.SourceAggregate != nil && d.SourceHttpPut != nil { + return ErrBadProposal, xerrors.Errorf("multiple sources defined for data source") + } + + if d.SourceOffline == nil && d.SourceHTTP == nil && d.SourceAggregate == nil && d.SourceHttpPut == nil { + return ErrBadProposal, xerrors.Errorf("no source defined for data source") + } + + var fcar, fagg, fraw bool + + if d.Format.Car != nil { + fcar = true + } + + if d.Format.Aggregate != nil { + fagg = true + + if d.Format.Aggregate.Type != AggregateTypeV1 { + return ErrMalformedDataSource, xerrors.Errorf("aggregate type not supported") + } + + // If client will supply individual pieces + if d.SourceAggregate != nil { + code, err := IsDataSourceEnabled(db, d.SourceAggregate.Name()) + if err != nil { + return code, err + } + + if len(d.SourceAggregate.Pieces) == 0 { + return ErrMalformedDataSource, xerrors.Errorf("no pieces in aggregate") + } + + if len(d.SourceAggregate.Pieces) == 1 { + return ErrMalformedDataSource, xerrors.Errorf("aggregate must have at least 2 pieces") + } + + for _, p := range d.SourceAggregate.Pieces { + err := ValidatePieceCID(p.PieceCID) + if err != nil { + return ErrMalformedDataSource, xerrors.Errorf("invalid piece cid") + } + + var ifcar, ifraw bool + + if p.Format.Car != nil { + ifcar = true + } + + if p.Format.Aggregate != nil { + return ErrMalformedDataSource, xerrors.Errorf("aggregate of aggregate is not supported") + } + + if p.Format.Raw != nil { + ifraw = true + } + + if !ifcar && !ifraw { + return ErrMalformedDataSource, xerrors.Errorf("no format defined for sub piece in aggregate") + } + + if ifcar && ifraw { + return ErrMalformedDataSource, xerrors.Errorf("multiple formats defined for sub piece in aggregate") + } + + if p.SourceAggregate != nil { + return ErrMalformedDataSource, xerrors.Errorf("aggregate of aggregate is not supported") + } + + if p.SourceOffline == nil && p.SourceHTTP == nil { + return ErrMalformedDataSource, xerrors.Errorf("no source defined for sub piece in aggregate") + } + + if p.SourceOffline != nil && p.SourceHTTP != nil { + return ErrMalformedDataSource, xerrors.Errorf("multiple sources defined for sub piece in aggregate") + } + + if p.SourceHTTP != nil { + if len(p.SourceHTTP.URLs) == 0 { + return ErrMalformedDataSource, xerrors.Errorf("no urls defined for sub piece in aggregate") + } + + for _, u := range p.SourceHTTP.URLs { + _, err := url.Parse(u.URL) + if err != nil { + return ErrMalformedDataSource, xerrors.Errorf("invalid url") + } + } + } + } + if len(d.Format.Aggregate.Sub) > 0 { + return ErrMalformedDataSource, xerrors.Errorf("sub pieces cannot be defined when dataSource is aggregate") + } + } else { + // If client will supply pre-aggregated piece + if len(d.Format.Aggregate.Sub) == 0 { + return ErrMalformedDataSource, xerrors.Errorf("no sub pieces defined under aggregate") + } + for _, p := range d.Format.Aggregate.Sub { + err := ValidatePieceCID(p.PieceCID) + if err != nil { + return ErrMalformedDataSource, xerrors.Errorf("invalid piece cid") + } + var ifcar, ifraw bool + if p.Format.Car != nil { + ifcar = true + } + + if p.Format.Aggregate != nil { + return ErrMalformedDataSource, xerrors.Errorf("aggregate of aggregate is not supported") + } + + if p.Format.Raw != nil { + ifraw = true + } + if !ifcar && !ifraw { + return ErrMalformedDataSource, xerrors.Errorf("no format defined for sub piece in aggregate") + } + if ifcar && ifraw { + return ErrMalformedDataSource, xerrors.Errorf("multiple formats defined for sub piece in aggregate") + } + if p.SourceAggregate != nil || p.SourceOffline != nil || p.SourceHTTP != nil || p.SourceHttpPut != nil { + return ErrMalformedDataSource, xerrors.Errorf("sub piece of pre-aggregated piece cannot have source defined") + } + } + } + } + + if d.Format.Raw != nil { + fraw = true + } + + if !fcar && !fagg && !fraw { + return ErrBadProposal, xerrors.Errorf("no format defined") + } + + if fcar && fagg || fcar && fraw || fagg && fraw { + return ErrBadProposal, xerrors.Errorf("multiple formats defined") + } + + if d.SourceHTTP != nil { + code, err := IsDataSourceEnabled(db, d.SourceHTTP.Name()) + if err != nil { + return code, err + } + + if len(d.SourceHTTP.URLs) == 0 { + return ErrMalformedDataSource, xerrors.Errorf("no urls defined") + } + + for _, u := range d.SourceHTTP.URLs { + _, err := url.Parse(u.URL) + if err != nil { + return ErrMalformedDataSource, xerrors.Errorf("invalid url") + } + } + } + + if d.SourceOffline != nil { + code, err := IsDataSourceEnabled(db, d.SourceOffline.Name()) + if err != nil { + return code, err + } + } + + if d.SourceHttpPut != nil { + code, err := IsDataSourceEnabled(db, d.SourceHttpPut.Name()) + if err != nil { + return code, err + } + } + + return Ok, nil +} + +func ValidatePieceCID(c cid.Cid) error { + if !c.Defined() { + return xerrors.Errorf("piece cid is not defined") + } + + if c.Prefix().Codec != cid.Raw { + return xerrors.Errorf("piece cid is not raw") + } + + _, rawSize, err := commcid.PieceCidV1FromV2(c) + if err != nil { + return xerrors.Errorf("invalid piece cid: %w", err) + } + + if rawSize == 0 { + return xerrors.Errorf("payload size is 0") + } + + return nil +} + +type PieceInfo struct { + PieceCIDV1 cid.Cid `json:"piece_cid"` + Size abi.PaddedPieceSize `json:"size"` + RawSize uint64 `json:"raw_size"` +} + +func (d *Deal) RawSize() (uint64, error) { + if d.Data == nil { + return 0, xerrors.Errorf("no data") + } + _, rawSize, err := commcid.PieceCidV1FromV2(d.Data.PieceCID) + if err != nil { + return 0, xerrors.Errorf("invalid piece cid: %w", err) + } + return rawSize, nil +} + +func (d *Deal) Size() (abi.PaddedPieceSize, error) { + if d.Data == nil { + return 0, xerrors.Errorf("no data") + } + _, rawSize, err := commcid.PieceCidV1FromV2(d.Data.PieceCID) + if err != nil { + return 0, xerrors.Errorf("invalid piece cid: %w", err) + } + return padreader.PaddedSize(rawSize).Padded(), nil +} + +func (d *Deal) PieceInfo() (*PieceInfo, error) { + return GetPieceInfo(d.Data.PieceCID) +} + +func GetPieceInfo(c cid.Cid) (*PieceInfo, error) { + pieceCid, rawSize, err := commcid.PieceCidV1FromV2(c) + if err != nil { + return nil, xerrors.Errorf("invalid piece cid: %w", err) + } + return &PieceInfo{ + PieceCIDV1: pieceCid, + Size: padreader.PaddedSize(rawSize).Padded(), + RawSize: rawSize, + }, nil +} + +func (d Products) Validate(db *harmonydb.DB, cfg *config.MK20Config) (DealCode, error) { + var nproducts int + if d.DDOV1 != nil { + nproducts++ + code, err := d.DDOV1.Validate(db, cfg) + if err != nil { + return code, err + } + if d.RetrievalV1 == nil { + return ErrProductValidationFailed, xerrors.Errorf("retrieval v1 is required for ddo v1") + } + if d.RetrievalV1.AnnouncePiece { + return ErrProductValidationFailed, xerrors.Errorf("announce piece is not supported for ddo v1") + } + } + if d.RetrievalV1 != nil { + code, err := d.RetrievalV1.Validate(db, cfg) + if err != nil { + return code, err + } + } + if d.PDPV1 != nil { + nproducts++ + code, err := d.PDPV1.Validate(db, cfg) + if err != nil { + return code, err + } + } + + if nproducts == 0 { + return ErrProductValidationFailed, xerrors.Errorf("no products defined") + } + + if d.DDOV1 != nil && d.PDPV1 != nil { + return ErrProductValidationFailed, xerrors.Errorf("ddo_v1 and pdp_v1 are mutually exclusive") + } + + return Ok, nil +} + +type DBDDOV1 struct { + DDO *DDOV1 `json:"ddo"` + DealID int64 `json:"deal_id"` + Complete bool `json:"complete"` + Error string `json:"error"` +} + +type DBPDPV1 struct { + PDP *PDPV1 `json:"pdp"` + Complete bool `json:"complete"` + Error string `json:"error"` +} + +type DBDeal struct { + Identifier string `db:"id"` + Client string `db:"client"` + PieceCIDV2 string `db:"piece_cid_v2"` + Data json.RawMessage `db:"data"` + DDOv1 json.RawMessage `db:"ddo_v1"` + RetrievalV1 json.RawMessage `db:"retrieval_v1"` + PDPV1 json.RawMessage `db:"pdp_v1"` +} + +func (d *Deal) ToDBDeal() (*DBDeal, error) { + ddeal := DBDeal{ + Identifier: d.Identifier.String(), + Client: d.Client, + } + + if d.Data != nil { + dataBytes, err := json.Marshal(d.Data) + if err != nil { + return nil, fmt.Errorf("marshal data: %w", err) + } + ddeal.PieceCIDV2 = d.Data.PieceCID.String() + ddeal.Data = dataBytes + } else { + ddeal.Data = []byte("null") + } + + if d.Products.DDOV1 != nil { + dddov1 := DBDDOV1{ + DDO: d.Products.DDOV1, + } + ddov1, err := json.Marshal(dddov1) + if err != nil { + return nil, fmt.Errorf("marshal ddov1: %w", err) + } + ddeal.DDOv1 = ddov1 + } else { + ddeal.DDOv1 = []byte("null") + } + + if d.Products.RetrievalV1 != nil { + rev, err := json.Marshal(d.Products.RetrievalV1) + if err != nil { + return nil, fmt.Errorf("marshal retrievalv1: %w", err) + } + ddeal.RetrievalV1 = rev + } else { + ddeal.RetrievalV1 = []byte("null") + } + + if d.Products.PDPV1 != nil { + dbpdpv1 := DBPDPV1{ + PDP: d.Products.PDPV1, + } + pdpv1, err := json.Marshal(dbpdpv1) + if err != nil { + return nil, fmt.Errorf("marshal pdpv1: %w", err) + } + ddeal.PDPV1 = pdpv1 + } else { + ddeal.PDPV1 = []byte("null") + } + + return &ddeal, nil +} + +func (d *Deal) SaveToDB(tx *harmonydb.Tx) error { + dbDeal, err := d.ToDBDeal() + if err != nil { + return xerrors.Errorf("to db deal: %w", err) + } + + var pieceCid interface{} + + if dbDeal.PieceCIDV2 != "" { + pieceCid = dbDeal.PieceCIDV2 + } else { + pieceCid = nil + } + + n, err := tx.Exec(`INSERT INTO market_mk20_deal (id, client, piece_cid_v2, data, ddo_v1, retrieval_v1, pdp_v1) + VALUES ($1, $2, $3, $4, $5, $6, $7)`, + dbDeal.Identifier, + dbDeal.Client, + pieceCid, + dbDeal.Data, + dbDeal.DDOv1, + dbDeal.RetrievalV1, + dbDeal.PDPV1) + if err != nil { + return xerrors.Errorf("insert deal: %w", err) + } + if n != 1 { + return xerrors.Errorf("insert deal: expected 1 row affected, got %d", n) + } + return nil +} + +func (d *Deal) UpdateDealWithTx(tx *harmonydb.Tx) error { + dbDeal, err := d.ToDBDeal() + if err != nil { + return xerrors.Errorf("to db deal: %w", err) + } + + var pieceCid interface{} + + if dbDeal.PieceCIDV2 != "" { + pieceCid = dbDeal.PieceCIDV2 + } else { + pieceCid = nil + } + + n, err := tx.Exec(`UPDATE market_mk20_deal SET + piece_cid_v2 = $1, + data = $2, + ddo_v1 = $3, + retrieval_v1 = $4, + pdp_v1 = $5 + WHERE id = $6`, pieceCid, dbDeal.Data, dbDeal.DDOv1, dbDeal.RetrievalV1, dbDeal.PDPV1, d.Identifier.String()) + if err != nil { + return xerrors.Errorf("update deal: %w", err) + } + if n != 1 { + return xerrors.Errorf("update deal: expected 1 row affected, got %d", n) + } + return nil +} + +func (d *Deal) UpdateDeal(tx *harmonydb.Tx) error { + dbDeal, err := d.ToDBDeal() + if err != nil { + return xerrors.Errorf("to db deal: %w", err) + } + + var pieceCid interface{} + + if dbDeal.PieceCIDV2 != "" { + pieceCid = dbDeal.PieceCIDV2 + } else { + pieceCid = nil + } + + n, err := tx.Exec(`UPDATE market_mk20_deal SET + piece_cid_v2 = $1, + data = $2, + ddo_v1 = $3, + retrieval_v1 = $4, + pdp_v1 = $5 + WHERE id = $6`, pieceCid, dbDeal.Data, dbDeal.DDOv1, dbDeal.RetrievalV1, dbDeal.PDPV1, d.Identifier.String()) + if err != nil { + return xerrors.Errorf("update deal: %w", err) + } + if n != 1 { + return xerrors.Errorf("update deal: expected 1 row affected, got %d", n) + } + return nil +} + +func DealFromTX(tx *harmonydb.Tx, id ulid.ULID) (*Deal, error) { + var dbDeal []DBDeal + err := tx.Select(&dbDeal, `SELECT + id, + client, + data, + ddo_v1, + retrieval_v1, + pdp_v1 FROM market_mk20_deal WHERE id = $1`, id.String()) + if err != nil { + return nil, xerrors.Errorf("getting deal from DB: %w", err) + } + if len(dbDeal) != 1 { + return nil, xerrors.Errorf("expected 1 deal, got %d", len(dbDeal)) + } + return dbDeal[0].ToDeal() +} + +func DealFromDB(ctx context.Context, db *harmonydb.DB, id ulid.ULID) (*Deal, error) { + var dbDeal []DBDeal + err := db.Select(ctx, &dbDeal, `SELECT + id, + client, + data, + ddo_v1, + retrieval_v1, + pdp_v1 FROM market_mk20_deal WHERE id = $1`, id.String()) + if err != nil { + return nil, xerrors.Errorf("getting deal from DB: %w", err) + } + if len(dbDeal) != 1 { + return nil, xerrors.Errorf("expected 1 deal, got %d", len(dbDeal)) + } + return dbDeal[0].ToDeal() +} + +func (d *DBDeal) ToDeal() (*Deal, error) { + var deal Deal + + if len(d.Data) > 0 && string(d.Data) != "null" { + var ds DataSource + if err := json.Unmarshal(d.Data, &ds); err != nil { + return nil, fmt.Errorf("unmarshal data: %w", err) + } + deal.Data = &ds + } + + if len(d.DDOv1) > 0 && string(d.DDOv1) != "null" { + var dddov1 DBDDOV1 + if err := json.Unmarshal(d.DDOv1, &dddov1); err != nil { + return nil, fmt.Errorf("unmarshal ddov1: %w", err) + } + deal.Products.DDOV1 = dddov1.DDO + } + + if len(d.RetrievalV1) > 0 && string(d.RetrievalV1) != "null" { + var rev RetrievalV1 + if err := json.Unmarshal(d.RetrievalV1, &rev); err != nil { + return nil, fmt.Errorf("unmarshal retrievalv1: %w", err) + } + deal.Products.RetrievalV1 = &rev + } + + if len(d.PDPV1) > 0 && string(d.PDPV1) != "null" { + var dddov1 DBPDPV1 + if err := json.Unmarshal(d.PDPV1, &dddov1); err != nil { + return nil, fmt.Errorf("unmarshal pdpv1: %w", err) + } + deal.Products.PDPV1 = dddov1.PDP + } + + id, err := ulid.Parse(d.Identifier) + if err != nil { + return nil, fmt.Errorf("parse id: %w", err) + } + deal.Identifier = id + + deal.Client = d.Client + + return &deal, nil +} + +func DBDealsToDeals(deals []*DBDeal) ([]*Deal, error) { + var result []*Deal + for _, d := range deals { + deal, err := d.ToDeal() + if err != nil { + return nil, err + } + result = append(result, deal) + } + return result, nil +} + +type ProviderDealRejectionInfo struct { + HTTPCode DealCode + Reason string +} + +// DealStatusResponse represents the response of a deal's status, including its current state and an optional error message. +type DealStatusResponse struct { + + // State indicates the current processing state of the deal as a DealState value. + State DealState `json:"status"` + + // ErrorMsg is an optional field containing error details associated with the deal's current state if an error occurred. + ErrorMsg string `json:"errorMsg"` +} + +// DealProductStatusResponse represents the status response for deal products with their respective deal statuses. +type DealProductStatusResponse struct { + + // DDOV1 holds the DealStatusResponse for product "ddo_v1". + DDOV1 *DealStatusResponse `json:"ddo_v1,omitempty"` + + // PDPV1 represents the DealStatusResponse for the product pdp_v1. + PDPV1 *DealStatusResponse `json:"pdp_v1,omitempty"` +} + +// DealStatus represents the status of a deal, including the HTTP code and an optional response detailing the deal's state and error message. +type DealStatus struct { + + // Response provides details about the deal's per product status, such as its current state and any associated error messages, if available. + Response *DealProductStatusResponse + + // HTTPCode represents the HTTP status code providing additional context about the deal status or possible errors. + HTTPCode int +} + +// DealState represents the current status of a deal in the system as a string value. +type DealState string + +const ( + + // DealStateAccepted represents the state where a deal has been accepted and is pending further processing in the system. + DealStateAccepted DealState = "accepted" + + // DealStateAwaitingUpload represents the state where a deal is awaiting file upload to proceed further in the process. + DealStateAwaitingUpload DealState = "uploading" + + // DealStateProcessing represents the state of a deal currently being processed in the pipeline. + DealStateProcessing DealState = "processing" + + // DealStateSealing indicates that the deal is currently being sealed in the system. + DealStateSealing DealState = "sealing" + + // DealStateIndexing represents the state where a deal is undergoing indexing in the system. + DealStateIndexing DealState = "indexing" + + // DealStateFailed indicates that the deal has failed due to an error during processing, sealing, or indexing. + DealStateFailed DealState = "failed" + + // DealStateComplete indicates that the deal has successfully completed all processing and is finalized in the system. + DealStateComplete DealState = "complete" +) + +// SupportedContracts represents a collection of contract addresses supported by a system or application. +type SupportedContracts struct { + // Contracts represents a list of supported contract addresses in string format. + Contracts []string `json:"contracts"` +} + +func NewULID() (ulid.ULID, error) { + return ulid.New(ulid.Timestamp(time.Now()), rand.Reader) +} + +func (dsh *DataSourceHTTP) Name() DataSourceName { + return DataSourceNameHTTP +} + +func (dso *DataSourceOffline) Name() DataSourceName { + return DataSourceNameOffline +} + +func (dsa *DataSourceAggregate) Name() DataSourceName { + return DataSourceNameAggregate +} + +func (dsh *DataSourceHttpPut) Name() DataSourceName { + return DataSourceNamePut +} + +func IsDataSourceEnabled(db *harmonydb.DB, name DataSourceName) (DealCode, error) { + var enabled bool + + err := db.QueryRow(context.Background(), `SELECT enabled FROM market_mk20_data_source WHERE name = $1`, name).Scan(&enabled) + if err != nil { + if !errors.Is(err, pgx.ErrNoRows) { + return http.StatusInternalServerError, xerrors.Errorf("data source %s is not enabled", name) + } + } + if !enabled { + return ErrUnsupportedDataSource, xerrors.Errorf("data source %s is not enabled", name) + } + return Ok, nil +} + +func IsProductEnabled(db *harmonydb.DB, name ProductName) (DealCode, error) { + var enabled bool + + err := db.QueryRow(context.Background(), `SELECT enabled FROM market_mk20_products WHERE name = $1`, name).Scan(&enabled) + if err != nil { + if !errors.Is(err, pgx.ErrNoRows) { + return http.StatusInternalServerError, xerrors.Errorf("data source %s is not enabled", name) + } + return ErrUnsupportedProduct, xerrors.Errorf("product %s is not supported by the provider", name) + } + if !enabled { + return ErrProductNotEnabled, xerrors.Errorf("product %s is not enabled", name) + } + return Ok, nil +} + +// SupportedProducts represents array of products supported by the SP. +type SupportedProducts struct { + // Contracts represents a list of supported contract addresses in string format. + Products []string `json:"products"` +} + +// SupportedDataSources represents array of dats sources supported by the SP. +type SupportedDataSources struct { + // Contracts represents a list of supported contract addresses in string format. + Sources []string `json:"sources"` +} + +// StartUpload represents metadata for initiating an upload operation. +type StartUpload struct { + + // RawSize indicates the total size of the data to be uploaded in bytes. + RawSize uint64 `json:"raw_size"` + + // ChunkSize defines the size of each data chunk to be used during the upload process. + ChunkSize int64 `json:"chunk_size"` +} + +// UploadStatus represents the status of a file upload process, including progress and missing chunks. +type UploadStatus struct { + + // TotalChunks represents the total number of chunks required for the upload. + TotalChunks int `json:"total_chunks"` + + // Uploaded represents the number of chunks successfully uploaded. + Uploaded int `json:"uploaded"` + + // Missing represents the number of chunks that are not yet uploaded. + Missing int `json:"missing"` + + // UploadedChunks is a slice containing the indices of successfully uploaded chunks. + UploadedChunks []int `json:"uploaded_chunks"` + + //MissingChunks is a slice containing the indices of missing chunks. + MissingChunks []int `json:"missing_chunks"` +} + +func UpdateDealDetails(ctx context.Context, db *harmonydb.DB, id ulid.ULID, deal *Deal, cfg *config.MK20Config, auth string) (*Deal, DealCode, []ProductName, error) { + ddeal, err := DealFromDB(ctx, db, id) + if err != nil { + return nil, ErrServerInternalError, nil, xerrors.Errorf("getting deal from DB: %w", err) + } + + // Run the following checks + // If Data details exist, do not update them + // If DDOV1 is defined then no update to it + // If PDPV1 is defined then no update to it + // If PDPv1 is defined by DDOV1 is not, then allow updating it + // If DDOV1 is defined then don't allow PDPv1 yet + + // TODO: Remove this once DDO is live + if ddeal.Products.PDPV1 != nil { + if ddeal.Data == nil { + ddeal.Data = deal.Data + } + return ddeal, Ok, nil, nil + } + + if ddeal.Data == nil { + ddeal.Data = deal.Data + } + + var newProducts []ProductName + + if ddeal.Products.DDOV1 == nil || deal.Products.DDOV1 != nil { + ddeal.Products.DDOV1 = deal.Products.DDOV1 + newProducts = append(newProducts, ProductNameDDOV1) + } + + if ddeal.Products.RetrievalV1 == nil || deal.Products.RetrievalV1 != nil { + ddeal.Products.RetrievalV1 = deal.Products.RetrievalV1 + newProducts = append(newProducts, ProductNameRetrievalV1) + } + + code, err := ddeal.Validate(db, cfg, auth) + if err != nil { + return nil, code, nil, xerrors.Errorf("validate deal: %w", err) + } + return ddeal, Ok, newProducts, nil +} + +func AuthenticateClient(db *harmonydb.DB, id, client string) (bool, error) { + var allowed bool + err := db.QueryRow(context.Background(), `SELECT EXISTS (SELECT 1 FROM market_mk20_deal WHERE id = $1 AND client = $2)`, id, client).Scan(&allowed) + if err != nil { + return false, xerrors.Errorf("querying client: %w", err) + } + return allowed, nil +} + +func clientAllowed(ctx context.Context, db *harmonydb.DB, client string, cfg *config.CurioConfig) (bool, error) { + var allowed bool + err := db.QueryRow(ctx, `SELECT allowed FROM market_mk20_clients WHERE client = $1`, client).Scan(&allowed) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + // Client is not in the database + return !cfg.Market.StorageMarketConfig.MK20.DenyUnknownClients, nil + } + return false, xerrors.Errorf("querying client: %w", err) + } + + return allowed, nil +} + +const Authprefix = "CurioAuth " + +// Auth verifies the custom authentication header by parsing its contents and validating the signature using the provided database connection. +func Auth(header string, db *harmonydb.DB, cfg *config.CurioConfig) (bool, string, error) { + keyType, pubKey, sig, err := parseCustomAuth(header) + if err != nil { + return false, "", xerrors.Errorf("parsing auth header: %w", err) + } + return verifySignature(db, keyType, pubKey, sig, cfg) +} + +func parseCustomAuth(header string) (keyType string, pubKey, sig []byte, err error) { + + if !strings.HasPrefix(header, Authprefix) { + return "", nil, nil, errors.New("missing CustomAuth prefix") + } + + parts := strings.SplitN(strings.TrimPrefix(header, Authprefix), ":", 3) + if len(parts) != 3 { + return "", nil, nil, errors.New("invalid auth format") + } + + keyType = parts[0] + pubKey, err = base64.StdEncoding.DecodeString(parts[1]) + if err != nil { + return "", nil, nil, fmt.Errorf("invalid pubkey base64: %w", err) + } + + if len(pubKey) == 0 { + return "", nil, nil, fmt.Errorf("invalid pubkey") + } + + sig, err = base64.StdEncoding.DecodeString(parts[2]) + if err != nil { + return "", nil, nil, fmt.Errorf("invalid signature base64: %w", err) + } + + if len(sig) == 0 { + return "", nil, nil, fmt.Errorf("invalid signature") + } + + return keyType, pubKey, sig, nil +} + +func verifySignature(db *harmonydb.DB, keyType string, pubKey, signature []byte, cfg *config.CurioConfig) (bool, string, error) { + now := time.Now().Truncate(time.Hour) + minus1 := now.Add(-59 * time.Minute) + plus1 := now.Add(59 * time.Minute) + timeStamps := []time.Time{now, minus1, plus1} + var msgs [][32]byte + + for _, t := range timeStamps { + msgs = append(msgs, sha256.Sum256(bytes.Join([][]byte{pubKey, []byte(t.Format(time.RFC3339))}, []byte{}))) + } + + switch keyType { + case "ed25519": + if len(pubKey) != ed25519.PublicKeySize || len(signature) != ed25519.SignatureSize { + return false, "", errors.New("invalid ed25519 sizes") + } + keyStr, err := ED25519ToString(pubKey) + if err != nil { + return false, "", xerrors.Errorf("invalid ed25519 pubkey: %w", err) + } + + allowed, err := clientAllowed(context.Background(), db, keyStr, cfg) + if err != nil { + return false, "", xerrors.Errorf("checking client allowed: %w", err) + } + if !allowed { + return false, "", nil + } + + for _, m := range msgs { + ok := ed25519.Verify(pubKey, m[:], signature) + if ok { + return true, keyStr, nil + } + } + return false, "", errors.New("invalid ed25519 signature") + + case "secp256k1", "bls", "delegated": + return verifyFilSignature(db, pubKey, signature, msgs, cfg) + default: + return false, "", fmt.Errorf("unsupported key type: %s", keyType) + } +} + +func verifyFilSignature(db *harmonydb.DB, pubKey, signature []byte, msgs [][32]byte, cfg *config.CurioConfig) (bool, string, error) { + signs := &fcrypto.Signature{} + err := signs.UnmarshalBinary(signature) + if err != nil { + return false, "", xerrors.Errorf("invalid signature") + } + addr, err := address.NewFromBytes(pubKey) + if err != nil { + return false, "", xerrors.Errorf("invalid filecoin pubkey") + } + + allowed, err := clientAllowed(context.Background(), db, addr.String(), cfg) + if err != nil { + return false, "", xerrors.Errorf("checking client allowed: %w", err) + } + if !allowed { + return false, "", nil + } + + for _, m := range msgs { + err = sigs.Verify(signs, addr, m[:]) + if err == nil { + return true, addr.String(), nil + } + } + + return false, "", errors.New("invalid signature") +} + +func ED25519ToString(pubKey []byte) (string, error) { + if len(pubKey) != ed25519.PublicKeySize { + return "", errors.New("invalid ed25519 pubkey size") + } + return base58.FastBase58Encoding(pubKey), nil +} + +func StringToED25519(addr string) ([]byte, error) { + return base58.FastBase58Decoding(addr) +} diff --git a/market/retrieval/piecehandler.go b/market/retrieval/piecehandler.go index 26f7c1c3b..2d0fb01bc 100644 --- a/market/retrieval/piecehandler.go +++ b/market/retrieval/piecehandler.go @@ -12,8 +12,6 @@ import ( "github.com/ipfs/go-cid" "go.opencensus.io/stats" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/curio/lib/cachedreader" "github.com/filecoin-project/curio/market/retrieval/remoteblockstore" ) @@ -47,7 +45,7 @@ func (rp *Provider) handleByPieceCid(w http.ResponseWriter, r *http.Request) { } // Get a reader over the piece - reader, size, err := rp.cpr.GetSharedPieceReader(ctx, pieceCid) + reader, size, err := rp.cpr.GetSharedPieceReader(ctx, pieceCid, true) if err != nil { log.Errorf("server error getting content for piece CID %s: %s", pieceCid, err) if errors.Is(err, cachedreader.ErrNoDeal) { @@ -73,15 +71,17 @@ func (rp *Provider) handleByPieceCid(w http.ResponseWriter, r *http.Request) { return } - setHeaders(w, pieceCid, contentType) - serveContent(w, r, size, reader) + setHeaders(w, pieceCid, contentType, int64(size)) + serveContent(w, r, reader) stats.Record(ctx, remoteblockstore.HttpPieceByCid200ResponseCount.M(1)) stats.Record(ctx, remoteblockstore.HttpPieceByCidRequestDuration.M(float64(time.Since(startTime).Milliseconds()))) + } -func setHeaders(w http.ResponseWriter, pieceCid cid.Cid, contentType string) { +func setHeaders(w http.ResponseWriter, pieceCid cid.Cid, contentType string, size int64) { w.Header().Set("Vary", "Accept-Encoding") + w.Header().Set("Content-Length", fmt.Sprintf("%d", size)) w.Header().Set("Cache-Control", "public, max-age=29030400, immutable") w.Header().Set("Content-Type", contentType) if contentType != "application/octet-stream" { @@ -98,7 +98,7 @@ func setHeaders(w http.ResponseWriter, pieceCid cid.Cid, contentType string) { } -func serveContent(res http.ResponseWriter, req *http.Request, size abi.UnpaddedPieceSize, content io.ReadSeeker) { +func serveContent(res http.ResponseWriter, req *http.Request, content io.ReadSeeker) { // Note that the last modified time is a constant value because the data // in a piece identified by a cid will never change. @@ -109,6 +109,5 @@ func serveContent(res http.ResponseWriter, req *http.Request, size abi.UnpaddedP } // Send the content - res.Header().Set("Content-Length", fmt.Sprintf("%d", size)) http.ServeContent(res, req, "", lastModified, content) } diff --git a/market/retrieval/remoteblockstore/metric.go b/market/retrieval/remoteblockstore/metric.go index 5734a92a1..355a87b43 100644 --- a/market/retrieval/remoteblockstore/metric.go +++ b/market/retrieval/remoteblockstore/metric.go @@ -36,13 +36,20 @@ var defaultMillisecondsDistribution = view.Distribution( var ( RetrievalInfo = stats.Int64("retrieval_info", "Arbitrary counter to tag node info to", stats.UnitDimensionless) - // piece + // piece (including PDP and sub pieces) HttpPieceByCidRequestCount = stats.Int64("http/piece_by_cid_request_count", "Counter of /piece/ requests", stats.UnitDimensionless) HttpPieceByCidRequestDuration = stats.Float64("http/piece_by_cid_request_duration_ms", "Time spent retrieving a piece by cid", stats.UnitMilliseconds) HttpPieceByCid200ResponseCount = stats.Int64("http/piece_by_cid_200_response_count", "Counter of /piece/ 200 responses", stats.UnitDimensionless) HttpPieceByCid400ResponseCount = stats.Int64("http/piece_by_cid_400_response_count", "Counter of /piece/ 400 responses", stats.UnitDimensionless) HttpPieceByCid404ResponseCount = stats.Int64("http/piece_by_cid_404_response_count", "Counter of /piece/ 404 responses", stats.UnitDimensionless) HttpPieceByCid500ResponseCount = stats.Int64("http/piece_by_cid_500_response_count", "Counter of /piece/ 500 responses", stats.UnitDimensionless) + + // pdp + PDPPieceByCidRequestCount = stats.Int64("pdp/piece_by_cid_request_count", "Counter of /piece/ requests for PDP", stats.UnitDimensionless) + PDPPieceByCidRequestDuration = stats.Float64("pdp/piece_by_cid_request_duration_ms", "Time spent retrieving a piece by cid for PDP", stats.UnitMilliseconds) + PDPPieceByCid200ResponseCount = stats.Int64("pdp/piece_by_cid_200_response_count", "Counter of /piece/ 200 responses for PDP", stats.UnitDimensionless) + PDPPieceBytesServedCount = stats.Int64("pdp/piece_bytes_served_count", "Counter of the number of bytes served by PDP since startup", stats.UnitBytes) + // Gateway HttpRblsGetRequestCount = stats.Int64("http/rbls_get_request_count", "Counter of RemoteBlockstore Get requests", stats.UnitDimensionless) HttpRblsGetSuccessResponseCount = stats.Int64("http/rbls_get_success_response_count", "Counter of successful RemoteBlockstore Get responses", stats.UnitDimensionless) @@ -90,6 +97,26 @@ var ( Aggregation: view.Count(), } + PDPPieceByCidRequestCountView = &view.View{ + Measure: PDPPieceByCidRequestCount, + Aggregation: view.Count(), + } + + PDPPieceByCidRequestDurationView = &view.View{ + Measure: PDPPieceByCidRequestDuration, + Aggregation: defaultMillisecondsDistribution, + } + + PDPPieceByCid200ResponseCountView = &view.View{ + Measure: PDPPieceByCid200ResponseCount, + Aggregation: view.Count(), + } + + PDPPieceBytesServedCountView = &view.View{ + Measure: PDPPieceBytesServedCount, + Aggregation: view.Count(), + } + HttpRblsGetRequestCountView = &view.View{ Measure: HttpRblsGetRequestCount, Aggregation: view.Count(), @@ -160,7 +187,7 @@ var ( } ) -// CacheViews groups all cache-related default views. +// RetrievalViews groups all retrieval-related default views. func init() { err := view.Register( HttpPieceByCidRequestCountView, @@ -169,6 +196,10 @@ func init() { HttpPieceByCid400ResponseCountView, HttpPieceByCid404ResponseCountView, HttpPieceByCid500ResponseCountView, + PDPPieceByCidRequestCountView, + PDPPieceByCidRequestDurationView, + PDPPieceByCid200ResponseCountView, + PDPPieceBytesServedCountView, HttpRblsGetRequestCountView, HttpRblsGetSuccessResponseCountView, HttpRblsGetFailResponseCountView, diff --git a/market/retrieval/remoteblockstore/remoteblockstore.go b/market/retrieval/remoteblockstore/remoteblockstore.go index 82c6540fe..7da6b31a7 100644 --- a/market/retrieval/remoteblockstore/remoteblockstore.go +++ b/market/retrieval/remoteblockstore/remoteblockstore.go @@ -31,7 +31,7 @@ var log = logging.Logger("remote-blockstore") type idxAPI interface { PiecesContainingMultihash(ctx context.Context, m multihash.Multihash) ([]indexstore.PieceInfo, error) - GetOffset(ctx context.Context, pieceCid cid.Cid, hash multihash.Multihash) (uint64, error) + GetOffset(ctx context.Context, pieceCidv2 cid.Cid, hash multihash.Multihash) (uint64, error) } // RemoteBlockstore is a read-only blockstore over all cids across all pieces on a provider. @@ -115,8 +115,7 @@ func (ro *RemoteBlockstore) Get(ctx context.Context, c cid.Cid) (b blocks.Block, var merr error for _, piece := range pieces { data, err := func() ([]byte, error) { - // Get a reader over the piece data - reader, _, err := ro.cpr.GetSharedPieceReader(ctx, piece.PieceCid) + reader, _, err := ro.cpr.GetSharedPieceReader(ctx, piece.PieceCid, true) if err != nil { return nil, fmt.Errorf("getting piece reader: %w", err) } @@ -125,7 +124,7 @@ func (ro *RemoteBlockstore) Get(ctx context.Context, c cid.Cid) (b blocks.Block, }(reader) // Get the offset of the block within the piece (CAR file) - offset, err := ro.idxApi.GetOffset(ctx, piece.PieceCid, c.Hash()) + offset, err := ro.idxApi.GetOffset(ctx, piece.PieceCid, c.Hash()) // This can be pieceCidV2 or pieceCidV1, but we don't care because we are feeding back the db output if err != nil { return nil, fmt.Errorf("getting offset/size for cid %s in piece %s: %w", c, piece.PieceCid, err) } diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index 8652cc860..4d670aa58 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -36,9 +36,9 @@ var activeRequestCounters sync.Map // map[string]*atomic.Int64 const maxParallelRequests = 256 var ( - ipfsRequestLimiter = make(chan struct{}, maxParallelRequests) - ipfsHeadRequestLimiter = make(chan struct{}, maxParallelRequests/2) - pieceRequestLimiter = make(chan struct{}, maxParallelRequests) + ipfsRequestLimiter = make(chan struct{}, maxParallelRequests) + ipfsHeadRequestLimiter = make(chan struct{}, maxParallelRequests/2) + pieceRequestLimiter = make(chan struct{}, maxParallelRequests) ) type Provider struct { diff --git a/market/storageingest/deal_ingest_seal.go b/market/storageingest/deal_ingest_seal.go index 7c62cd4bd..1e7a370b9 100644 --- a/market/storageingest/deal_ingest_seal.go +++ b/market/storageingest/deal_ingest_seal.go @@ -85,7 +85,7 @@ type PieceIngester struct { addToID map[address.Address]int64 idToAddr map[abi.ActorID]address.Address minerDetails map[int64]*mdetails - maxWaitTime time.Duration + maxWaitTime *config.Dynamic[time.Duration] expectedSealDuration abi.ChainEpoch } @@ -190,7 +190,7 @@ func (p *PieceIngester) Seal() error { log.Debugf("start sealing sector %d of miner %s: %s", sector.number, p.idToAddr[sector.miner].String(), "sector full") return true } - if time.Since(*sector.openedAt) > p.maxWaitTime { + if time.Since(*sector.openedAt) > p.maxWaitTime.Get() { log.Debugf("start sealing sector %d of miner %s: %s", sector.number, p.idToAddr[sector.miner].String(), "MaxWaitTime reached") return true } @@ -254,6 +254,11 @@ func (p *PieceIngester) AllocatePieceToSector(ctx context.Context, tx *harmonydb psize = piece.DealProposal.PieceSize } + // check raw size + if psize != padreader.PaddedSize(uint64(rawSize)).Padded() { + return nil, nil, xerrors.Errorf("raw size doesn't match padded piece size") + } + var propJson []byte dataHdrJson, err := json.Marshal(header) @@ -310,11 +315,6 @@ func (p *PieceIngester) AllocatePieceToSector(ctx context.Context, tx *harmonydb return nil, nil, xerrors.Errorf("miner not found") } - // Reject incorrect sized online deals except verified deal less than 1 MiB because verified deals can be 1 MiB minimum even if rawSize is much lower - if psize != padreader.PaddedSize(uint64(rawSize)).Padded() && (!vd.isVerified || psize > abi.PaddedPieceSize(1<<20)) { - return nil, nil, xerrors.Errorf("raw size doesn't match padded piece size") - } - // Try to allocate the piece to an open sector allocated, ret, err := p.allocateToExisting(tx, maddr, piece, psize, rawSize, source, dataHdrJson, propJson, vd) if err != nil { diff --git a/market/storageingest/deal_ingest_snap.go b/market/storageingest/deal_ingest_snap.go index 7bdd4cae5..8a3a220d6 100644 --- a/market/storageingest/deal_ingest_snap.go +++ b/market/storageingest/deal_ingest_snap.go @@ -47,7 +47,7 @@ type PieceIngesterSnap struct { addToID map[address.Address]int64 idToAddr map[abi.ActorID]address.Address minerDetails map[int64]*mdetails - maxWaitTime time.Duration + maxWaitTime *config.Dynamic[time.Duration] expectedSnapDuration abi.ChainEpoch } @@ -146,7 +146,7 @@ func (p *PieceIngesterSnap) Seal() error { log.Debugf("start sealing sector %d of miner %s: %s", sector.number, p.idToAddr[sector.miner].String(), "sector full") return true } - if time.Since(*sector.openedAt) > p.maxWaitTime { + if time.Since(*sector.openedAt) > p.maxWaitTime.Get() { log.Debugf("start sealing sector %d of miner %s: %s", sector.number, p.idToAddr[sector.miner].String(), "MaxWaitTime reached") return true } @@ -211,6 +211,11 @@ func (p *PieceIngesterSnap) AllocatePieceToSector(ctx context.Context, tx *harmo psize = piece.DealProposal.PieceSize } + // check raw size + if psize != padreader.PaddedSize(uint64(rawSize)).Padded() { + return nil, nil, xerrors.Errorf("raw size doesn't match padded piece size") + } + var propJson []byte dataHdrJson, err := json.Marshal(header) @@ -300,11 +305,6 @@ func (p *PieceIngesterSnap) AllocatePieceToSector(ctx context.Context, tx *harmo return nil, nil, xerrors.Errorf("json.Marshal(piece.PieceActivationManifest): %w", err) } - // Reject incorrect sized online deals except verified deal less than 1 MiB because verified deals can be 1 MiB minimum even if rawSize is much lower - if psize != padreader.PaddedSize(uint64(rawSize)).Padded() && (!vd.isVerified || psize > abi.PaddedPieceSize(1<<20)) { - return nil, nil, xerrors.Errorf("raw size doesn't match padded piece size") - } - // Try to allocate the piece to an open sector allocated, ret, sp, err := p.allocateToExisting(ctx, tx, maddr, piece, psize, rawSize, source, dataHdrJson, propJson, vd) if err != nil { diff --git a/pdp/contract/IPDPProvingSchedule.abi b/pdp/contract/IPDPProvingSchedule.abi index df191dd6d..cab2b5656 100644 --- a/pdp/contract/IPDPProvingSchedule.abi +++ b/pdp/contract/IPDPProvingSchedule.abi @@ -1,59 +1,35 @@ [ { "type": "function", - "name": "challengeWindow", + "name": "getPDPConfig", "inputs": [], "outputs": [ { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "getChallengesPerProof", - "inputs": [], - "outputs": [ - { - "name": "", + "name": "maxProvingPeriod", "type": "uint64", "internalType": "uint64" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "getMaxProvingPeriod", - "inputs": [], - "outputs": [ + }, { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "initChallengeWindowStart", - "inputs": [], - "outputs": [ + "name": "challengeWindow", + "type": "uint256", + "internalType": "uint256" + }, { - "name": "", + "name": "challengesPerProof", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "initChallengeWindowStart", "type": "uint256", "internalType": "uint256" } ], - "stateMutability": "pure" + "stateMutability": "view" }, { "type": "function", - "name": "nextChallengeWindowStart", + "name": "nextPDPChallengeWindowStart", "inputs": [ { "name": "setId", diff --git a/pdp/contract/IPDPProvingSchedule.json b/pdp/contract/IPDPProvingSchedule.json index b1fbe4526..97afead93 100644 --- a/pdp/contract/IPDPProvingSchedule.json +++ b/pdp/contract/IPDPProvingSchedule.json @@ -1 +1 @@ -{"abi":[{"type":"function","name":"challengeWindow","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"type":"function","name":"getChallengesPerProof","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"pure"},{"type":"function","name":"getMaxProvingPeriod","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"pure"},{"type":"function","name":"initChallengeWindowStart","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"type":"function","name":"nextChallengeWindowStart","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"challengeWindow()":"861a1412","getChallengesPerProof()":"47d3dfe7","getMaxProvingPeriod()":"f2f12333","initChallengeWindowStart()":"21918cea","nextChallengeWindowStart(uint256)":"8bf96d28"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"challengeWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChallengesPerProof\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxProvingPeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initChallengeWindowStart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"nextChallengeWindowStart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"challengeWindow()\":{\"returns\":{\"_0\":\"Challenge window size in epochs\"}},\"getChallengesPerProof()\":{\"returns\":{\"_0\":\"Number of challenges required per proof\"}},\"getMaxProvingPeriod()\":{\"returns\":{\"_0\":\"Maximum proving period in epochs\"}},\"nextChallengeWindowStart(uint256)\":{\"params\":{\"setId\":\"The ID of the proof set\"},\"returns\":{\"_0\":\"The block number when the next challenge window starts\"}}},\"title\":\"IPDPProvingWindow\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"challengeWindow()\":{\"notice\":\"Returns the number of epochs at the end of a proving period during which proofs can be submitted\"},\"getChallengesPerProof()\":{\"notice\":\"Returns the required number of challenges/merkle inclusion proofs per proof set\"},\"getMaxProvingPeriod()\":{\"notice\":\"Returns the number of epochs allowed before challenges must be resampled\"},\"initChallengeWindowStart()\":{\"notice\":\"Value for initializing the challenge window start for any proof set assuming proving period starts now\"},\"nextChallengeWindowStart(uint256)\":{\"notice\":\"Calculates the start of the next challenge window for a given proof set\"}},\"notice\":\"Interface for PDP Service SLA specifications\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/IPDPProvingSchedule.sol\":\"IPDPProvingSchedule\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@pythnetwork/pyth-sdk-solidity/=node_modules/@pythnetwork/pyth-sdk-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"src/IPDPProvingSchedule.sol\":{\"keccak256\":\"0x6fc7848345c358a7a18e43ad9d93c1ea5fecf9d3f0daca721576d6de96d797b2\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://ab29f0b39894650cf74b6a771e50bc50c91d54f6ba6e5a1b11c7cb1d7878d0cf\",\"dweb:/ipfs/QmawGZjCfua9dbJsqCzN6J9v3kLsE4oRLwMhbbcE4RYUNh\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.23+commit.f704f362"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"pure","type":"function","name":"challengeWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"getChallengesPerProof","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"getMaxProvingPeriod","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"initChallengeWindowStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"nextChallengeWindowStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"challengeWindow()":{"returns":{"_0":"Challenge window size in epochs"}},"getChallengesPerProof()":{"returns":{"_0":"Number of challenges required per proof"}},"getMaxProvingPeriod()":{"returns":{"_0":"Maximum proving period in epochs"}},"nextChallengeWindowStart(uint256)":{"params":{"setId":"The ID of the proof set"},"returns":{"_0":"The block number when the next challenge window starts"}}},"version":1},"userdoc":{"kind":"user","methods":{"challengeWindow()":{"notice":"Returns the number of epochs at the end of a proving period during which proofs can be submitted"},"getChallengesPerProof()":{"notice":"Returns the required number of challenges/merkle inclusion proofs per proof set"},"getMaxProvingPeriod()":{"notice":"Returns the number of epochs allowed before challenges must be resampled"},"initChallengeWindowStart()":{"notice":"Value for initializing the challenge window start for any proof set assuming proving period starts now"},"nextChallengeWindowStart(uint256)":{"notice":"Calculates the start of the next challenge window for a given proof set"}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@pythnetwork/pyth-sdk-solidity/=node_modules/@pythnetwork/pyth-sdk-solidity/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/IPDPProvingSchedule.sol":"IPDPProvingSchedule"},"evmVersion":"shanghai","libraries":{}},"sources":{"src/IPDPProvingSchedule.sol":{"keccak256":"0x6fc7848345c358a7a18e43ad9d93c1ea5fecf9d3f0daca721576d6de96d797b2","urls":["bzz-raw://ab29f0b39894650cf74b6a771e50bc50c91d54f6ba6e5a1b11c7cb1d7878d0cf","dweb:/ipfs/QmawGZjCfua9dbJsqCzN6J9v3kLsE4oRLwMhbbcE4RYUNh"],"license":"UNLICENSED"}},"version":1},"id":0} \ No newline at end of file +{"abi":[{"type":"function","name":"getPDPConfig","inputs":[],"outputs":[{"name":"maxProvingPeriod","type":"uint64","internalType":"uint64"},{"name":"challengeWindow","type":"uint256","internalType":"uint256"},{"name":"challengesPerProof","type":"uint256","internalType":"uint256"},{"name":"initChallengeWindowStart","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"nextPDPChallengeWindowStart","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"getPDPConfig()":"ea0f9354","nextPDPChallengeWindowStart(uint256)":"11d41294"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"getPDPConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"maxProvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"challengeWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"challengesPerProof\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initChallengeWindowStart\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"nextPDPChallengeWindowStart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getPDPConfig()\":{\"returns\":{\"challengeWindow\":\"Number of epochs for the challenge window\",\"challengesPerProof\":\"Number of challenges required per proof\",\"initChallengeWindowStart\":\"Initial challenge window start for new data sets assuming proving period starts now\",\"maxProvingPeriod\":\"Maximum number of epochs between proofs\"}},\"nextPDPChallengeWindowStart(uint256)\":{\"params\":{\"setId\":\"The ID of the data set\"},\"returns\":{\"_0\":\"The block number when the next challenge window starts\"}}},\"title\":\"IPDPProvingSchedule\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getPDPConfig()\":{\"notice\":\"Returns PDP configuration values\"},\"nextPDPChallengeWindowStart(uint256)\":{\"notice\":\"Returns the start of the next challenge window for a data set\"}},\"notice\":\"Interface for PDP Service SLA specifications\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/IPDPProvingSchedule.sol\":\"IPDPProvingSchedule\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@pythnetwork/pyth-sdk-solidity/=lib/pyth-sdk-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":pyth-sdk-solidity/=lib/pyth-sdk-solidity/\"],\"viaIR\":true},\"sources\":{\"src/IPDPProvingSchedule.sol\":{\"keccak256\":\"0x18f592eda642914eab092c28ae9527e20571a2a7191c82f475a432660c6a5417\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://142048503986dbb34905b03c99fed970d50dc0d088f2dc4274cc9e8c343ce83f\",\"dweb:/ipfs/QmbWYFT3ZuoefmSHmTrR64dinzxACfLKh9u3zHqRd1jETS\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.23+commit.f704f362"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"view","type":"function","name":"getPDPConfig","outputs":[{"internalType":"uint64","name":"maxProvingPeriod","type":"uint64"},{"internalType":"uint256","name":"challengeWindow","type":"uint256"},{"internalType":"uint256","name":"challengesPerProof","type":"uint256"},{"internalType":"uint256","name":"initChallengeWindowStart","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"nextPDPChallengeWindowStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getPDPConfig()":{"returns":{"challengeWindow":"Number of epochs for the challenge window","challengesPerProof":"Number of challenges required per proof","initChallengeWindowStart":"Initial challenge window start for new data sets assuming proving period starts now","maxProvingPeriod":"Maximum number of epochs between proofs"}},"nextPDPChallengeWindowStart(uint256)":{"params":{"setId":"The ID of the data set"},"returns":{"_0":"The block number when the next challenge window starts"}}},"version":1},"userdoc":{"kind":"user","methods":{"getPDPConfig()":{"notice":"Returns PDP configuration values"},"nextPDPChallengeWindowStart(uint256)":{"notice":"Returns the start of the next challenge window for a data set"}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@pythnetwork/pyth-sdk-solidity/=lib/pyth-sdk-solidity/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","pyth-sdk-solidity/=lib/pyth-sdk-solidity/"],"optimizer":{"enabled":true,"runs":1000000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/IPDPProvingSchedule.sol":"IPDPProvingSchedule"},"evmVersion":"shanghai","libraries":{},"viaIR":true},"sources":{"src/IPDPProvingSchedule.sol":{"keccak256":"0x18f592eda642914eab092c28ae9527e20571a2a7191c82f475a432660c6a5417","urls":["bzz-raw://142048503986dbb34905b03c99fed970d50dc0d088f2dc4274cc9e8c343ce83f","dweb:/ipfs/QmbWYFT3ZuoefmSHmTrR64dinzxACfLKh9u3zHqRd1jETS"],"license":"Apache-2.0 OR MIT"}},"version":1},"id":48} \ No newline at end of file diff --git a/pdp/contract/ListenerServiceWithViewContract.abi b/pdp/contract/ListenerServiceWithViewContract.abi new file mode 100644 index 000000000..5040222da --- /dev/null +++ b/pdp/contract/ListenerServiceWithViewContract.abi @@ -0,0 +1,15 @@ +[ + { + "type": "function", + "name": "viewContractAddress", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + } +] \ No newline at end of file diff --git a/pdp/contract/ListenerServiceWithViewContract.go b/pdp/contract/ListenerServiceWithViewContract.go new file mode 100644 index 000000000..44ec65320 --- /dev/null +++ b/pdp/contract/ListenerServiceWithViewContract.go @@ -0,0 +1,212 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ListenerServiceWithViewContractMetaData contains all meta data concerning the ListenerServiceWithViewContract contract. +var ListenerServiceWithViewContractMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"viewContractAddress\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"}]", +} + +// ListenerServiceWithViewContractABI is the input ABI used to generate the binding from. +// Deprecated: Use ListenerServiceWithViewContractMetaData.ABI instead. +var ListenerServiceWithViewContractABI = ListenerServiceWithViewContractMetaData.ABI + +// ListenerServiceWithViewContract is an auto generated Go binding around an Ethereum contract. +type ListenerServiceWithViewContract struct { + ListenerServiceWithViewContractCaller // Read-only binding to the contract + ListenerServiceWithViewContractTransactor // Write-only binding to the contract + ListenerServiceWithViewContractFilterer // Log filterer for contract events +} + +// ListenerServiceWithViewContractCaller is an auto generated read-only Go binding around an Ethereum contract. +type ListenerServiceWithViewContractCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ListenerServiceWithViewContractTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ListenerServiceWithViewContractTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ListenerServiceWithViewContractFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ListenerServiceWithViewContractFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ListenerServiceWithViewContractSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ListenerServiceWithViewContractSession struct { + Contract *ListenerServiceWithViewContract // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ListenerServiceWithViewContractCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ListenerServiceWithViewContractCallerSession struct { + Contract *ListenerServiceWithViewContractCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ListenerServiceWithViewContractTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ListenerServiceWithViewContractTransactorSession struct { + Contract *ListenerServiceWithViewContractTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ListenerServiceWithViewContractRaw is an auto generated low-level Go binding around an Ethereum contract. +type ListenerServiceWithViewContractRaw struct { + Contract *ListenerServiceWithViewContract // Generic contract binding to access the raw methods on +} + +// ListenerServiceWithViewContractCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ListenerServiceWithViewContractCallerRaw struct { + Contract *ListenerServiceWithViewContractCaller // Generic read-only contract binding to access the raw methods on +} + +// ListenerServiceWithViewContractTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ListenerServiceWithViewContractTransactorRaw struct { + Contract *ListenerServiceWithViewContractTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewListenerServiceWithViewContract creates a new instance of ListenerServiceWithViewContract, bound to a specific deployed contract. +func NewListenerServiceWithViewContract(address common.Address, backend bind.ContractBackend) (*ListenerServiceWithViewContract, error) { + contract, err := bindListenerServiceWithViewContract(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ListenerServiceWithViewContract{ListenerServiceWithViewContractCaller: ListenerServiceWithViewContractCaller{contract: contract}, ListenerServiceWithViewContractTransactor: ListenerServiceWithViewContractTransactor{contract: contract}, ListenerServiceWithViewContractFilterer: ListenerServiceWithViewContractFilterer{contract: contract}}, nil +} + +// NewListenerServiceWithViewContractCaller creates a new read-only instance of ListenerServiceWithViewContract, bound to a specific deployed contract. +func NewListenerServiceWithViewContractCaller(address common.Address, caller bind.ContractCaller) (*ListenerServiceWithViewContractCaller, error) { + contract, err := bindListenerServiceWithViewContract(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ListenerServiceWithViewContractCaller{contract: contract}, nil +} + +// NewListenerServiceWithViewContractTransactor creates a new write-only instance of ListenerServiceWithViewContract, bound to a specific deployed contract. +func NewListenerServiceWithViewContractTransactor(address common.Address, transactor bind.ContractTransactor) (*ListenerServiceWithViewContractTransactor, error) { + contract, err := bindListenerServiceWithViewContract(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ListenerServiceWithViewContractTransactor{contract: contract}, nil +} + +// NewListenerServiceWithViewContractFilterer creates a new log filterer instance of ListenerServiceWithViewContract, bound to a specific deployed contract. +func NewListenerServiceWithViewContractFilterer(address common.Address, filterer bind.ContractFilterer) (*ListenerServiceWithViewContractFilterer, error) { + contract, err := bindListenerServiceWithViewContract(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ListenerServiceWithViewContractFilterer{contract: contract}, nil +} + +// bindListenerServiceWithViewContract binds a generic wrapper to an already deployed contract. +func bindListenerServiceWithViewContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ListenerServiceWithViewContractMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ListenerServiceWithViewContract.Contract.ListenerServiceWithViewContractCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ListenerServiceWithViewContract.Contract.ListenerServiceWithViewContractTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ListenerServiceWithViewContract.Contract.ListenerServiceWithViewContractTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ListenerServiceWithViewContract.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ListenerServiceWithViewContract.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ListenerServiceWithViewContract.Contract.contract.Transact(opts, method, params...) +} + +// ViewContractAddress is a free data retrieval call binding the contract method 0x7a9ebc15. +// +// Solidity: function viewContractAddress() view returns(address) +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractCaller) ViewContractAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ListenerServiceWithViewContract.contract.Call(opts, &out, "viewContractAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ViewContractAddress is a free data retrieval call binding the contract method 0x7a9ebc15. +// +// Solidity: function viewContractAddress() view returns(address) +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractSession) ViewContractAddress() (common.Address, error) { + return _ListenerServiceWithViewContract.Contract.ViewContractAddress(&_ListenerServiceWithViewContract.CallOpts) +} + +// ViewContractAddress is a free data retrieval call binding the contract method 0x7a9ebc15. +// +// Solidity: function viewContractAddress() view returns(address) +func (_ListenerServiceWithViewContract *ListenerServiceWithViewContractCallerSession) ViewContractAddress() (common.Address, error) { + return _ListenerServiceWithViewContract.Contract.ViewContractAddress(&_ListenerServiceWithViewContract.CallOpts) +} diff --git a/pdp/contract/PDPVerifier.abi b/pdp/contract/PDPVerifier.abi index 93aabc8db..069b9a0bb 100644 --- a/pdp/contract/PDPVerifier.abi +++ b/pdp/contract/PDPVerifier.abi @@ -71,7 +71,7 @@ }, { "type": "function", - "name": "MAX_ROOT_SIZE", + "name": "MAX_PIECE_SIZE_LOG2", "inputs": [], "outputs": [ { @@ -162,7 +162,20 @@ }, { "type": "function", - "name": "addRoots", + "name": "VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addPieces", "inputs": [ { "name": "setId", @@ -170,26 +183,14 @@ "internalType": "uint256" }, { - "name": "rootData", + "name": "pieceData", "type": "tuple[]", - "internalType": "struct PDPVerifier.RootData[]", + "internalType": "struct Cids.Cid[]", "components": [ { - "name": "root", - "type": "tuple", - "internalType": "struct Cids.Cid", - "components": [ - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "rawSize", - "type": "uint256", - "internalType": "uint256" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] }, @@ -234,12 +235,17 @@ }, { "type": "function", - "name": "claimProofSetOwnership", + "name": "claimDataSetStorageProvider", "inputs": [ { "name": "setId", "type": "uint256", "internalType": "uint256" + }, + { + "name": "extraData", + "type": "bytes", + "internalType": "bytes" } ], "outputs": [], @@ -247,7 +253,7 @@ }, { "type": "function", - "name": "createProofSet", + "name": "createDataSet", "inputs": [ { "name": "listenerAddr", @@ -271,7 +277,26 @@ }, { "type": "function", - "name": "deleteProofSet", + "name": "dataSetLive", + "inputs": [ + { + "name": "setId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "deleteDataSet", "inputs": [ { "name": "setId", @@ -289,7 +314,7 @@ }, { "type": "function", - "name": "findRootIds", + "name": "findPieceIds", "inputs": [ { "name": "setId", @@ -306,10 +331,10 @@ { "name": "", "type": "tuple[]", - "internalType": "struct PDPVerifier.RootIdAndOffset[]", + "internalType": "struct IPDPTypes.PieceIdAndOffset[]", "components": [ { - "name": "rootId", + "name": "pieceId", "type": "uint256", "internalType": "uint256" }, @@ -325,11 +350,17 @@ }, { "type": "function", - "name": "getChallengeFinality", - "inputs": [], + "name": "getActivePieceCount", + "inputs": [ + { + "name": "setId", + "type": "uint256", + "internalType": "uint256" + } + ], "outputs": [ { - "name": "", + "name": "activeCount", "type": "uint256", "internalType": "uint256" } @@ -338,44 +369,71 @@ }, { "type": "function", - "name": "getChallengeRange", + "name": "getActivePieces", "inputs": [ { "name": "setId", "type": "uint256", "internalType": "uint256" + }, + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" } ], "outputs": [ { - "name": "", - "type": "uint256", - "internalType": "uint256" + "name": "pieces", + "type": "tuple[]", + "internalType": "struct Cids.Cid[]", + "components": [ + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "pieceIds", + "type": "uint256[]", + "internalType": "uint256[]" + }, + { + "name": "rawSizes", + "type": "uint256[]", + "internalType": "uint256[]" + }, + { + "name": "hasMore", + "type": "bool", + "internalType": "bool" } ], "stateMutability": "view" }, { "type": "function", - "name": "getFILUSDPrice", + "name": "getChallengeFinality", "inputs": [], "outputs": [ { "name": "", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "", - "type": "int32", - "internalType": "int32" + "type": "uint256", + "internalType": "uint256" } ], "stateMutability": "view" }, { "type": "function", - "name": "getNextChallengeEpoch", + "name": "getChallengeRange", "inputs": [ { "name": "setId", @@ -394,20 +452,7 @@ }, { "type": "function", - "name": "getNextProofSetId", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNextRootId", + "name": "getDataSetLastProvenEpoch", "inputs": [ { "name": "setId", @@ -426,7 +471,7 @@ }, { "type": "function", - "name": "getProofSetLastProvenEpoch", + "name": "getDataSetLeafCount", "inputs": [ { "name": "setId", @@ -445,7 +490,7 @@ }, { "type": "function", - "name": "getProofSetLeafCount", + "name": "getDataSetListener", "inputs": [ { "name": "setId", @@ -456,15 +501,15 @@ "outputs": [ { "name": "", - "type": "uint256", - "internalType": "uint256" + "type": "address", + "internalType": "address" } ], "stateMutability": "view" }, { "type": "function", - "name": "getProofSetListener", + "name": "getDataSetStorageProvider", "inputs": [ { "name": "setId", @@ -477,13 +522,36 @@ "name": "", "type": "address", "internalType": "address" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getFILUSDPrice", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "", + "type": "int32", + "internalType": "int32" } ], "stateMutability": "view" }, { "type": "function", - "name": "getProofSetOwner", + "name": "getNextChallengeEpoch", "inputs": [ { "name": "setId", @@ -494,23 +562,31 @@ "outputs": [ { "name": "", - "type": "address", - "internalType": "address" - }, + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNextDataSetId", + "inputs": [], + "outputs": [ { "name": "", - "type": "address", - "internalType": "address" + "type": "uint64", + "internalType": "uint64" } ], "stateMutability": "view" }, { "type": "function", - "name": "getRandomness", + "name": "getNextPieceId", "inputs": [ { - "name": "epoch", + "name": "setId", "type": "uint256", "internalType": "uint256" } @@ -526,7 +602,7 @@ }, { "type": "function", - "name": "getRootCid", + "name": "getPieceCid", "inputs": [ { "name": "setId", @@ -534,7 +610,7 @@ "internalType": "uint256" }, { - "name": "rootId", + "name": "pieceId", "type": "uint256", "internalType": "uint256" } @@ -557,7 +633,7 @@ }, { "type": "function", - "name": "getRootLeafCount", + "name": "getPieceLeafCount", "inputs": [ { "name": "setId", @@ -565,7 +641,26 @@ "internalType": "uint256" }, { - "name": "rootId", + "name": "pieceId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRandomness", + "inputs": [ + { + "name": "epoch", "type": "uint256", "internalType": "uint256" } @@ -611,6 +706,13 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "migrate", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "nextProvingPeriod", @@ -649,12 +751,17 @@ }, { "type": "function", - "name": "proofSetLive", + "name": "pieceChallengable", "inputs": [ { "name": "setId", "type": "uint256", "internalType": "uint256" + }, + { + "name": "pieceId", + "type": "uint256", + "internalType": "uint256" } ], "outputs": [ @@ -668,7 +775,7 @@ }, { "type": "function", - "name": "proposeProofSetOwner", + "name": "pieceLive", "inputs": [ { "name": "setId", @@ -676,7 +783,31 @@ "internalType": "uint256" }, { - "name": "newOwner", + "name": "pieceId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proposeDataSetStorageProvider", + "inputs": [ + { + "name": "setId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "newStorageProvider", "type": "address", "internalType": "address" } @@ -696,7 +827,7 @@ { "name": "proofs", "type": "tuple[]", - "internalType": "struct PDPVerifier.Proof[]", + "internalType": "struct IPDPTypes.Proof[]", "components": [ { "name": "leaf", @@ -736,55 +867,7 @@ }, { "type": "function", - "name": "rootChallengable", - "inputs": [ - { - "name": "setId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rootId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "rootLive", - "inputs": [ - { - "name": "setId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rootId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "scheduleRemovals", + "name": "schedulePieceDeletions", "inputs": [ { "name": "setId", @@ -792,7 +875,7 @@ "internalType": "uint256" }, { - "name": "rootIds", + "name": "pieceIds", "type": "uint256[]", "internalType": "uint256[]" }, @@ -838,16 +921,54 @@ }, { "type": "event", - "name": "Debug", + "name": "ContractUpgraded", "inputs": [ { - "name": "message", + "name": "version", "type": "string", "indexed": false, "internalType": "string" }, { - "name": "value", + "name": "implementation", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DataSetCreated", + "inputs": [ + { + "name": "setId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "storageProvider", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DataSetDeleted", + "inputs": [ + { + "name": "setId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "deletedLeafCount", "type": "uint256", "indexed": false, "internalType": "uint256" @@ -855,6 +976,19 @@ ], "anonymous": false }, + { + "type": "event", + "name": "DataSetEmpty", + "inputs": [ + { + "name": "setId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, { "type": "event", "name": "Initialized", @@ -914,7 +1048,7 @@ }, { "type": "event", - "name": "PossessionProven", + "name": "PiecesAdded", "inputs": [ { "name": "setId", @@ -923,20 +1057,21 @@ "internalType": "uint256" }, { - "name": "challenges", + "name": "pieceIds", + "type": "uint256[]", + "indexed": false, + "internalType": "uint256[]" + }, + { + "name": "pieceCids", "type": "tuple[]", "indexed": false, - "internalType": "struct PDPVerifier.RootIdAndOffset[]", + "internalType": "struct Cids.Cid[]", "components": [ { - "name": "rootId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "offset", - "type": "uint256", - "internalType": "uint256" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } @@ -945,7 +1080,7 @@ }, { "type": "event", - "name": "ProofFeePaid", + "name": "PiecesRemoved", "inputs": [ { "name": "setId", @@ -954,29 +1089,17 @@ "internalType": "uint256" }, { - "name": "fee", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "price", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "expo", - "type": "int32", + "name": "pieceIds", + "type": "uint256[]", "indexed": false, - "internalType": "int32" + "internalType": "uint256[]" } ], "anonymous": false }, { "type": "event", - "name": "ProofSetCreated", + "name": "PossessionProven", "inputs": [ { "name": "setId", @@ -985,17 +1108,29 @@ "internalType": "uint256" }, { - "name": "owner", - "type": "address", - "indexed": true, - "internalType": "address" + "name": "challenges", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IPDPTypes.PieceIdAndOffset[]", + "components": [ + { + "name": "pieceId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + } + ] } ], "anonymous": false }, { "type": "event", - "name": "ProofSetDeleted", + "name": "ProofFeePaid", "inputs": [ { "name": "setId", @@ -1004,30 +1139,29 @@ "internalType": "uint256" }, { - "name": "deletedLeafCount", + "name": "fee", "type": "uint256", "indexed": false, "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ProofSetEmpty", - "inputs": [ + }, { - "name": "setId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" + "name": "price", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "expo", + "type": "int32", + "indexed": false, + "internalType": "int32" } ], "anonymous": false }, { "type": "event", - "name": "ProofSetOwnerChanged", + "name": "StorageProviderChanged", "inputs": [ { "name": "setId", @@ -1036,13 +1170,13 @@ "internalType": "uint256" }, { - "name": "oldOwner", + "name": "oldStorageProvider", "type": "address", "indexed": true, "internalType": "address" }, { - "name": "newOwner", + "name": "newStorageProvider", "type": "address", "indexed": true, "internalType": "address" @@ -1050,44 +1184,6 @@ ], "anonymous": false }, - { - "type": "event", - "name": "RootsAdded", - "inputs": [ - { - "name": "setId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "rootIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RootsRemoved", - "inputs": [ - { - "name": "setId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "rootIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, { "type": "event", "name": "Upgraded", diff --git a/pdp/contract/PDPVerifier.json b/pdp/contract/PDPVerifier.json index 4288a174e..049cf67fa 100644 --- a/pdp/contract/PDPVerifier.json +++ b/pdp/contract/PDPVerifier.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"BURN_ACTOR","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"EXTRA_DATA_MAX_SIZE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"FIL_USD_PRICE_FEED_ID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"LEAF_SIZE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_ENQUEUED_REMOVALS","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_ROOT_SIZE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"NO_CHALLENGE_SCHEDULED","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"NO_PROVEN_EPOCH","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PYTH","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPyth"}],"stateMutability":"view"},{"type":"function","name":"RANDOMNESS_PRECOMPILE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"SECONDS_IN_DAY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"addRoots","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"rootData","type":"tuple[]","internalType":"struct PDPVerifier.RootData[]","components":[{"name":"root","type":"tuple","internalType":"struct Cids.Cid","components":[{"name":"data","type":"bytes","internalType":"bytes"}]},{"name":"rawSize","type":"uint256","internalType":"uint256"}]},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"calculateProofFee","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"estimatedGasFee","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"claimProofSetOwnership","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createProofSet","inputs":[{"name":"listenerAddr","type":"address","internalType":"address"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"deleteProofSet","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"findRootIds","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"leafIndexs","type":"uint256[]","internalType":"uint256[]"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct PDPVerifier.RootIdAndOffset[]","components":[{"name":"rootId","type":"uint256","internalType":"uint256"},{"name":"offset","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getChallengeFinality","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getChallengeRange","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getFILUSDPrice","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"},{"name":"","type":"int32","internalType":"int32"}],"stateMutability":"view"},{"type":"function","name":"getNextChallengeEpoch","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNextProofSetId","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getNextRootId","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getProofSetLastProvenEpoch","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getProofSetLeafCount","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getProofSetListener","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getProofSetOwner","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRandomness","inputs":[{"name":"epoch","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRootCid","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"rootId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Cids.Cid","components":[{"name":"data","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"getRootLeafCount","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"rootId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getScheduledRemovals","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_challengeFinality","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"nextProvingPeriod","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"challengeEpoch","type":"uint256","internalType":"uint256"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proofSetLive","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"proposeProofSetOwner","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"provePossession","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"proofs","type":"tuple[]","internalType":"struct PDPVerifier.Proof[]","components":[{"name":"leaf","type":"bytes32","internalType":"bytes32"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}]}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"rootChallengable","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"rootId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"rootLive","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"rootId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"scheduleRemovals","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"rootIds","type":"uint256[]","internalType":"uint256[]"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Debug","inputs":[{"name":"message","type":"string","indexed":false,"internalType":"string"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"NextProvingPeriod","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"challengeEpoch","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"leafCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PossessionProven","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"challenges","type":"tuple[]","indexed":false,"internalType":"struct PDPVerifier.RootIdAndOffset[]","components":[{"name":"rootId","type":"uint256","internalType":"uint256"},{"name":"offset","type":"uint256","internalType":"uint256"}]}],"anonymous":false},{"type":"event","name":"ProofFeePaid","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"price","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"expo","type":"int32","indexed":false,"internalType":"int32"}],"anonymous":false},{"type":"event","name":"ProofSetCreated","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"owner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProofSetDeleted","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"deletedLeafCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ProofSetEmpty","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ProofSetOwnerChanged","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RootsAdded","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"rootIds","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"RootsRemoved","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"rootIds","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"IndexedError","inputs":[{"name":"idx","type":"uint256","internalType":"uint256"},{"name":"msg","type":"string","internalType":"string"}]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b608051617d10620001eb5f395f8181613de901528181613e3e0152613ff80152617d105ff3fe608060405260043610610271575f3560e01c806367e406d51161014e5780639f8cb3bd116100c0578063f2fde38b11610079578063f2fde38b146109c5578063f58f952b146109ed578063f5cac1ba14610a09578063f83758fe14610a45578063faa6716314610a6f578063fe4b84df14610aab57610271565b80639f8cb3bd146108b9578063ad3cb1cc146108e3578063c0e159491461090d578063d49245c114610937578063ee3dac6514610973578063f178b1be1461099b57610271565b806371cf2a161161011257806371cf2a1614610789578063847d1d06146107c557806389208ba9146107ed5780638da5cb5b146108295780638ea417e5146108535780639153e64b1461087d57610271565b806367e406d5146106a95780636ba4608f146106d35780636cb55c161461070f5780636fa4469214610737578063715018a61461077357610271565b80633f84135f116101e757806347331050116101ab57806347331050146105965780634903704a146105d25780634f1ef2861461060e5780634fa279201461062a57806352d1902d1461065557806361a52a361461067f57610271565b80633f84135f1461048f578063453f4f62146104cb57806345c0b92d14610507578063462dd4491461052f5780634726075b1461055957610271565b806315b175701161023957806315b175701461037157806316e2bcd51461039b57806319c75950146103c557806331601226146103ef5780633b68e4e91461042b5780633b7ae9131461045357610271565b8063029b4646146102755780630528a55b1461029f5780630a4d7932146102db5780630a6a63f11461030b57806311c0ee4a14610335575b5f80fd5b348015610280575f80fd5b50610289610ad3565b6040516102969190614f24565b60405180910390f35b3480156102aa575f80fd5b506102c560048036038101906102c09190614fd9565b610ad9565b6040516102d2919061511a565b60405180910390f35b6102f560048036038101906102f091906151e9565b610bc8565b6040516103029190614f24565b60405180910390f35b348015610316575f80fd5b5061031f610ee8565b60405161032c9190615255565b60405180910390f35b348015610340575f80fd5b5061035b600480360381019061035691906152c3565b610f00565b6040516103689190614f24565b60405180910390f35b34801561037c575f80fd5b506103856112a4565b6040516103929190615255565b60405180910390f35b3480156103a6575f80fd5b506103af6112bc565b6040516103bc9190614f24565b60405180910390f35b3480156103d0575f80fd5b506103d96112c7565b6040516103e6919061536c565b60405180910390f35b3480156103fa575f80fd5b5061041560048036038101906104109190615385565b6112ed565b6040516104229190615255565b60405180910390f35b348015610436575f80fd5b50610451600480360381019061044c91906153b0565b61136e565b005b34801561045e575f80fd5b5061047960048036038101906104749190615441565b6116b6565b6040516104869190615530565b60405180910390f35b34801561049a575f80fd5b506104b560048036038101906104b09190615385565b6117c8565b6040516104c29190614f24565b60405180910390f35b3480156104d6575f80fd5b506104f160048036038101906104ec9190615385565b61182a565b6040516104fe9190614f24565b60405180910390f35b348015610512575f80fd5b5061052d60048036038101906105289190615550565b611924565b005b34801561053a575f80fd5b50610543611e04565b6040516105509190614f24565b60405180910390f35b348015610564575f80fd5b5061057f600480360381019061057a9190615385565b611e08565b60405161058d9291906155c1565b60405180910390f35b3480156105a1575f80fd5b506105bc60048036038101906105b79190615441565b611ebd565b6040516105c99190615602565b60405180910390f35b3480156105dd575f80fd5b506105f860048036038101906105f39190615441565b611f16565b6040516106059190614f24565b60405180910390f35b61062860048036038101906106239190615743565b611f7a565b005b348015610635575f80fd5b5061063e611f99565b60405161064c9291906157da565b60405180910390f35b348015610660575f80fd5b506106696120ab565b604051610676919061536c565b60405180910390f35b34801561068a575f80fd5b506106936120dc565b6040516106a09190614f24565b60405180910390f35b3480156106b4575f80fd5b506106bd6120e3565b6040516106ca919061585c565b60405180910390f35b3480156106de575f80fd5b506106f960048036038101906106f49190615385565b6120fb565b6040516107069190614f24565b60405180910390f35b34801561071a575f80fd5b5061073560048036038101906107309190615875565b61215d565b005b348015610742575f80fd5b5061075d60048036038101906107589190615385565b612307565b60405161076a919061595b565b60405180910390f35b34801561077e575f80fd5b50610787612416565b005b348015610794575f80fd5b506107af60048036038101906107aa9190615441565b612429565b6040516107bc9190615602565b60405180910390f35b3480156107d0575f80fd5b506107eb60048036038101906107e6919061597b565b612517565b005b3480156107f8575f80fd5b50610813600480360381019061080e9190615385565b612817565b6040516108209190614f24565b60405180910390f35b348015610834575f80fd5b5061083d612879565b60405161084a9190615255565b60405180910390f35b34801561085e575f80fd5b506108676128ae565b60405161087491906159d8565b60405180910390f35b348015610888575f80fd5b506108a3600480360381019061089e9190615441565b6128ca565b6040516108b09190614f24565b60405180910390f35b3480156108c4575f80fd5b506108cd61293c565b6040516108da9190614f24565b60405180910390f35b3480156108ee575f80fd5b506108f7612942565b6040516109049190615a43565b60405180910390f35b348015610918575f80fd5b5061092161297b565b60405161092e9190614f24565b60405180910390f35b348015610942575f80fd5b5061095d60048036038101906109589190615385565b612980565b60405161096a9190614f24565b60405180910390f35b34801561097e575f80fd5b5061099960048036038101906109949190615385565b6129e2565b005b3480156109a6575f80fd5b506109af612bdd565b6040516109bc9190614f24565b60405180910390f35b3480156109d0575f80fd5b506109eb60048036038101906109e69190615a63565b612be1565b005b610a076004803603810190610a029190615ae3565b612c65565b005b348015610a14575f80fd5b50610a2f6004803603810190610a2a9190615385565b613215565b604051610a3c9190615602565b60405180910390f35b348015610a50575f80fd5b50610a596132a7565b604051610a669190614f24565b60405180910390f35b348015610a7a575f80fd5b50610a956004803603810190610a909190615385565b6132af565b604051610aa29190614f24565b60405180910390f35b348015610ab6575f80fd5b50610ad16004803603810190610acc9190615385565b613311565b005b61080081565b60605f610af660055f8781526020019081526020015f20546134a0565b610100610b039190615b6d565b90505f8484905067ffffffffffffffff811115610b2357610b2261561f565b5b604051908082528060200260200182016040528015610b5c57816020015b610b49614e89565b815260200190600190039081610b415790505b5090505f5b85859050811015610bbb57610b9087878784818110610b8357610b82615ba0565b5b90506020020135856135c9565b828281518110610ba357610ba2615ba0565b5b60200260200101819052508080600101915050610b61565b5080925050509392505050565b5f610800838390501115610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890615c17565b60405180910390fd5b5f610c1a6137d4565b905080341015610c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5690615c7f565b60405180910390fd5b610c68816137fb565b80341115610cc0573373ffffffffffffffffffffffffffffffffffffffff166108fc8234610c969190615b6d565b90811502906040515f60405180830381858888f19350505050158015610cbe573d5f803e3d5ffd5b505b5f60015f81819054906101000a900467ffffffffffffffff1680929190610ce690615c9d565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555067ffffffffffffffff1690505f60065f8381526020019081526020015f20819055505f60075f8381526020019081526020015f208190555033600b5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600d5f8381526020019081526020015f20819055505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e98578573ffffffffffffffffffffffffffffffffffffffff166394d41b36823388886040518563ffffffff1660e01b8152600401610e6a9493929190615d08565b5f604051808303815f87803b158015610e81575f80fd5b505af1158015610e93573d5f803e3d5ffd5b505050505b3373ffffffffffffffffffffffffffffffffffffffff16817f017f0b33d96e8f9968590172013032c2346cf047787a5e17a44b0a1bb3cd0f0160405160405180910390a380925050509392505050565b73ff0000000000000000000000000000000000006381565b5f610800838390501115610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090615c17565b60405180910390fd5b610f5286613215565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890615d90565b60405180910390fd5b5f8585905011610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90615df8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b5f8881526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b90615e60565b60405180910390fd5b5f60055f8881526020019081526020015f205490505f8686905067ffffffffffffffff8111156110a7576110a661561f565b5b6040519080825280602002602001820160405280156110d55781602001602082028036833780820191505090505b5090505f5b878790508110156111845761114b89828a8a858181106110fd576110fc615ba0565b5b905060200281019061110f9190615e8a565b805f019061111d9190615eb1565b8b8b868181106111305761112f615ba0565b5b90506020028101906111429190615e8a565b602001356138fe565b5080836111589190615ed8565b82828151811061116b5761116a615ba0565b5b60200260200101818152505080806001019150506110da565b50877f5ce51a8003915c377679ba533d9dafa0792058b254965697e674272f13f4fdd3826040516111b5919061595b565b60405180910390a25f60085f8a81526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611295578073ffffffffffffffffffffffffffffffffffffffff166312d5d66f8a858b8b8b8b6040518763ffffffff1660e01b81526004016112679695949392919061612e565b5f604051808303815f87803b15801561127e575f80fd5b505af1158015611290573d5f803e3d5ffd5b505050505b82935050505095945050505050565b73fe0000000000000000000000000000000000000681565b660400000000000081565b7f150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e5f1b81565b5f6112f782613215565b611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d90615d90565b60405180910390fd5b60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6108008282905011156113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad90615c17565b60405180910390fd5b6113bf85613215565b6113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590615d90565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b5f8781526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461149c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611493906161f3565b60405180910390fd5b6107d0600a5f8781526020019081526020015f2080549050858590506114c29190615ed8565b1115611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90616281565b60405180910390fd5b5f5b848490508110156115d75760055f8781526020019081526020015f205485858381811061153557611534615ba0565b5b905060200201351061157c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115739061630f565b60405180910390fd5b600a5f8781526020019081526020015f208585838181106115a05761159f615ba0565b5b90506020020135908060018154018082558091505060019003905f5260205f20015f90919091909150558080600101915050611505565b505f60085f8781526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116ae578073ffffffffffffffffffffffffffffffffffffffff16634af7d1d287878787876040518663ffffffff1660e01b8152600401611680959493929190616395565b5f604051808303815f87803b158015611697575f80fd5b505af11580156116a9573d5f803e3d5ffd5b505050505b505050505050565b6116be614ea1565b6116c783613215565b611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90615d90565b60405180910390fd5b60025f8481526020019081526020015f205f8381526020019081526020015f206040518060200160405290815f8201805461174090616409565b80601f016020809104026020016040519081016040528092919081815260200182805461176c90616409565b80156117b75780601f1061178e576101008083540402835291602001916117b7565b820191905f5260205f20905b81548152906001019060200180831161179a57829003601f168201915b505050505081525050905092915050565b5f6117d282613215565b611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890615d90565b60405180910390fd5b60065f8381526020019081526020015f20549050919050565b5f805f73fe0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16846040516020016118699190616459565b60405160208183030381529060405260405161188591906164ad565b5f60405180830381855afa9150503d805f81146118bd576040519150601f19603f3d011682016040523d82523d5f602084013e6118c2565b606091505b509150915081611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90616533565b60405180910390fd5b8080602001905181019061191b9190616565565b92505050919050565b61080082829050111561196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390615c17565b60405180910390fd5b600b5f8581526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190616600565b60405180910390fd5b5f60065f8681526020019081526020015f205411611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a549061668e565b60405180910390fd5b5f600d5f8681526020019081526020015f205403611a8c5743600d5f8681526020019081526020015f20819055505b5f600a5f8681526020019081526020015f2090505f818054905067ffffffffffffffff811115611abf57611abe61561f565b5b604051908082528060200260200182016040528015611aed5781602001602082028036833780820191505090505b5090505f5b8151811015611b77578260018480549050611b0d9190615b6d565b81548110611b1e57611b1d615ba0565b5b905f5260205f200154828281518110611b3a57611b39615ba0565b5b60200260200101818152505082805480611b5757611b566166ac565b5b600190038181905f5260205f20015f905590558080600101915050611af2565b50611b828682613aab565b857fd22bb0ee05b8ca92312459c76223d3b9bc1bd96fb6c9b18e637ededf92d8117482604051611bb2919061595b565b60405180910390a260065f8781526020019081526020015f205460095f8881526020019081526020015f20819055505f5443611bee9190615ed8565b851015611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c279061676f565b60405180910390fd5b8460075f8881526020019081526020015f20819055505f60065f8881526020019081526020015f205403611cb857857f323c29bc8d678a5d987b90a321982d10b9a91bcad071a9e445879497bf0e68e760405160405180910390a25f600d5f8881526020019081526020015f20819055505f60075f8881526020019081526020015f20819055505b5f60085f8881526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611db0578073ffffffffffffffffffffffffffffffffffffffff1663aa27ebcc8860075f8b81526020019081526020015f205460065f8c81526020019081526020015f205489896040518663ffffffff1660e01b8152600401611d8295949392919061678d565b5f604051808303815f87803b158015611d99575f80fd5b505af1158015611dab573d5f803e3d5ffd5b505050505b867fc099ffec4e3e773644a4d1dda368c46af853a0eeb15babde217f53a657396e1e8760065f8b81526020019081526020015f2054604051611df39291906167d9565b60405180910390a250505050505050565b5f81565b5f80611e1383613215565b611e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4990615d90565b60405180910390fd5b600b5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c5f8581526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509150915091565b5f611ec783613215565b8015611ee3575060055f8481526020019081526020015f205482105b8015611f0e57505f60035f8581526020019081526020015f205f8481526020019081526020015f2054115b905092915050565b5f8060095f8581526020019081526020015f20546020611f369190616800565b90505f80611f42611f99565b91509150611f6f85838386600d5f8c81526020019081526020015f205443611f6a9190615b6d565b613b6a565b935050505092915050565b611f82613de7565b611f8b82613ecd565b611f958282613ed8565b5050565b5f805f73a2aa501b19aff244d90cc15a4cf739d2725b572973ffffffffffffffffffffffffffffffffffffffff1663a4ae35e07f150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e5f1b620151806040518363ffffffff1660e01b8152600401612010929190616841565b608060405180830381865afa15801561202b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204f919061696b565b90505f815f015160070b13612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090616a06565b60405180910390fd5b805f0151816040015192509250509091565b5f6120b4613ff6565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b6201518081565b73a2aa501b19aff244d90cc15a4cf739d2725b572981565b5f61210582613215565b612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90615d90565b60405180910390fd5b60075f8381526020019081526020015f20549050919050565b61216682613215565b6121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90615d90565b60405180910390fd5b5f600b5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90616a94565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122b257600c5f8481526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055612302565b81600c5f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b606061231282613215565b612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890615d90565b60405180910390fd5b5f600a5f8481526020019081526020015f2090505f818054905067ffffffffffffffff8111156123845761238361561f565b5b6040519080825280602002602001820160405280156123b25781602001602082028036833780820191505090505b5090505f5b828054905081101561240b578281815481106123d6576123d5615ba0565b5b905f5260205f2001548282815181106123f2576123f1615ba0565b5b60200260200101818152505080806001019150506123b7565b508092505050919050565b61241e61407d565b6124275f614104565b565b5f8061244560055f8681526020019081526020015f20546134a0565b6101006124529190615b6d565b90505f61247d85600160095f8981526020019081526020015f20546124779190615b6d565b846135c9565b9050600160035f8781526020019081526020015f205f835f015181526020019081526020015f20546124af9190615b6d565b8160200151146124f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124eb90616b22565b60405180910390fd5b6124fe8585611ebd565b801561250d5750805f01518411155b9250505092915050565b61080082829050111561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690615c17565b60405180910390fd5b60015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1683106125c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b790616b8a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b5f8581526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590616c18565b60405180910390fd5b5f60065f8581526020019081526020015f205490505f60065f8681526020019081526020015f20819055505f600b5f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60075f8681526020019081526020015f20819055505f600d5f8681526020019081526020015f20819055505f60085f8681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127d8578073ffffffffffffffffffffffffffffffffffffffff166326c249e3868487876040518563ffffffff1660e01b81526004016127aa9493929190616c36565b5f604051808303815f87803b1580156127c1575f80fd5b505af11580156127d3573d5f803e3d5ffd5b505050505b847f589e9a441b5bddda77c4ab647b0108764a9cc1a7f655aa9b7bc50b8bdfab8673836040516128089190614f24565b60405180910390a25050505050565b5f61282182613215565b612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790615d90565b60405180910390fd5b60095f8381526020019081526020015f20549050919050565b5f806128836141d5565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f60015f9054906101000a900467ffffffffffffffff16905090565b5f6128d483613215565b612913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290a90615d90565b60405180910390fd5b60035f8481526020019081526020015f205f8381526020019081526020015f2054905092915050565b6107d081565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b602081565b5f61298a82613215565b6129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c090615d90565b60405180910390fd5b60055f8381526020019081526020015f20549050919050565b6129eb81613215565b612a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2190615d90565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf90616ce4565b60405180910390fd5b5f600b5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905033600b5f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c5f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690553373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837fd3273037b635678293ef0c076bd77af13760e75e12806d1db237616d03c3a76660405160405180910390a45050565b5f81565b612be961407d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c59575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612c509190615255565b60405180910390fd5b612c6281614104565b50565b5f5a9050600b5f8581526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90616600565b60405180910390fd5b5f60075f8681526020019081526020015f2054905080431015612d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5690616d4c565b60405180910390fd5b5f8484905011612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9b90616db4565b60405180910390fd5b5f8103612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd90616e1c565b60405180910390fd5b5f8484905067ffffffffffffffff811115612e0457612e0361561f565b5b604051908082528060200260200182016040528015612e3d57816020015b612e2a614e89565b815260200190600190039081612e225790505b5090505f612e4a876141fc565b90505f60095f8981526020019081526020015f205490505f612e7c60055f8b81526020019081526020015f20546134a0565b610100612e899190615b6d565b90505f5b888890508167ffffffffffffffff16101561308b575f848b83604051602001612eb893929190616e6e565b60405160208183030381529060405290505f8482805190602001205f1c612edf9190616ed7565b9050612eec8c82866135c9565b878467ffffffffffffffff1681518110612f0957612f08615ba0565b5b60200260200101819052505f612f4e612f498e8a8767ffffffffffffffff1681518110612f3957612f38615ba0565b5b60200260200101515f01516116b6565b61421e565b90505f6130328d8d8767ffffffffffffffff16818110612f7157612f70615ba0565b5b9050602002810190612f839190616f07565b8060200190612f929190616f2e565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050838f8f8967ffffffffffffffff16818110612fef57612fee615ba0565b5b90506020028101906130019190616f07565b5f01358c8967ffffffffffffffff168151811061302157613020615ba0565b5b602002602001015160200151614360565b905080613074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306b90616fda565b60405180910390fd5b50505050808061308390615c9d565b915050612e8d565b505f610514602061309c8b8b614378565b6130a69190615ed8565b6130b09190616800565b5a886130bc9190615b6d565b6130c69190615ed8565b90506130d28a826143fd565b5f60085f8c81526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146131ba578073ffffffffffffffffffffffffffffffffffffffff1663356de02b8c60065f8f81526020019081526020015f2054888e8e90506040518563ffffffff1660e01b815260040161318c9493929190616ff8565b5f604051808303815f87803b1580156131a3575f80fd5b505af11580156131b5573d5f803e3d5ffd5b505050505b43600d5f8d81526020019081526020015f20819055508a7f1acf7df9f0c1b0208c23be6178950c0273f89b766805a2c0bd1e53d25c700e5087604051613200919061511a565b60405180910390a25050505050505050505050565b5f60015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16821080156132a057505f73ffffffffffffffffffffffffffffffffffffffff16600b5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b5f8054905090565b5f6132b982613215565b6132f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ef90615d90565b60405180910390fd5b600d5f8381526020019081526020015f20549050919050565b5f61331a61450d565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff161480156133625750825b90505f60018367ffffffffffffffff1614801561339557505f3073ffffffffffffffffffffffffffffffffffffffff163b145b9050811580156133a3575080155b156133da576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315613427576001855f0160086101000a81548160ff0219169083151502179055505b61343033614534565b613438614548565b855f819055508315613498575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2600160405161348f9190617074565b60405180910390a15b505050505050565b5f8061010090505f608084901c90505f81146134c9576080826134c39190615b6d565b91508093505b604084901c90505f81146134ea576040826134e49190615b6d565b91508093505b602084901c90505f811461350b576020826135059190615b6d565b91508093505b601084901c90505f811461352c576010826135269190615b6d565b91508093505b600884901c90505f811461354d576008826135479190615b6d565b91508093505b600484901c90505f811461356e576004826135689190615b6d565b91508093505b600284901c90505f811461358f576002826135899190615b6d565b91508093505b600184901c90505f81146135b3576002826135aa9190615b6d565b925050506135c4565b83826135bf9190615b6d565b925050505b919050565b6135d1614e89565b60065f8581526020019081526020015f20548310613624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361b906170d7565b60405180910390fd5b5f6001836001901b6136369190615b6d565b90505f80808590505b5f81111561373b5760055f8981526020019081526020015f205484106136825760018161366c9190615b6d565b6001901b8461367b9190615b6d565b9350613728565b60045f8981526020019081526020015f205f8581526020019081526020015f2054836136ae9190615ed8565b91508682116137085760045f8981526020019081526020015f205f8581526020019081526020015f2054836136e39190615ed8565b92506001816136f29190615b6d565b6001901b846137019190615ed8565b9350613727565b6001816137159190615b6d565b6001901b846137249190615b6d565b93505b5b8080613733906170f5565b91505061363f565b5060045f8881526020019081526020015f205f8481526020019081526020015f2054826137689190615ed8565b90508581116137a75760405180604001604052806001856137899190615ed8565b8152602001828861379a9190615b6d565b81525093505050506137cd565b604051806040016040528084815260200183886137c49190615b6d565b81525093505050505b9392505050565b5f600a6001670de0b6b3a76400006137ec9190616800565b6137f6919061711c565b905090565b8034101561383e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383590617196565b60405180910390fd5b5f73ff0000000000000000000000000000000000006373ffffffffffffffffffffffffffffffffffffffff1682604051613877906171d7565b5f6040518083038185875af1925050503d805f81146138b1576040519150601f19603f3d011682016040523d82523d5f602084013e6138b6565b606091505b50509050806138fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f190617235565b60405180910390fd5b5050565b5f8060208361390d9190616ed7565b1461394f57836040517fc7b67cf3000000000000000000000000000000000000000000000000000000008152600401613946919061729d565b60405180910390fd5b5f820361399357836040517fc7b67cf300000000000000000000000000000000000000000000000000000000815260040161398a9190617313565b60405180910390fd5b66040000000000008211156139df57836040517fc7b67cf30000000000000000000000000000000000000000000000000000000081526004016139d69190617389565b60405180910390fd5b5f6020836139ed919061711c565b90505f60055f8881526020019081526020015f205f815480929190613a11906173b5565b919050559050613a22878383614552565b8460025f8981526020019081526020015f205f8381526020019081526020015f208181613a4f91906176fc565b9050508160035f8981526020019081526020015f205f8381526020019081526020015f20819055508160065f8981526020019081526020015f205f828254613a979190615ed8565b925050819055508092505050949350505050565b613ab482613215565b613af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aea90615d90565b60405180910390fd5b5f805b8251811015613b3d57613b2384848381518110613b1657613b15615ba0565b5b60200260200101516145ed565b82613b2e9190615ed8565b91508080600101915050613af6565b508060065f8581526020019081526020015f205f828254613b5e9190615b6d565b92505081905550505050565b5f80861180613b7857505f48145b613bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bae9061777a565b60405180910390fd5b5f8567ffffffffffffffff1611613c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfa90617808565b60405180910390fd5b5f8311613c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3c90617896565b60405180910390fd5b5f808560030b12613cc35784600a613c5d91906179f2565b8667ffffffffffffffff166201518065010000000000613c7d9190616800565b613c879190616800565b613c919190616800565b6001670de0b6b3a7640000613ca69190616800565b6002613cb29190616800565b613cbc919061711c565b9050613d3b565b8567ffffffffffffffff166201518065010000000000613ce39190616800565b613ced9190616800565b85613cf790617a3c565b600a613d0391906179f2565b6001670de0b6b3a7640000613d189190616800565b6002613d249190616800565b613d2e9190616800565b613d38919061711c565b90505b5f848483613d499190616800565b613d539190616800565b90505f6064600583613d659190616800565b613d6f919061711c565b90505f6064600484613d819190616800565b613d8b919061711c565b9050818a10613da0575f945050505050613dde565b808a10613dbe578982613db39190615b6d565b945050505050613dde565b6064600184613dcd9190616800565b613dd7919061711c565b9450505050505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480613e9457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613e7b61467b565b73ffffffffffffffffffffffffffffffffffffffff1614155b15613ecb576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b613ed561407d565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613f4057506040513d601f19601f82011682018060405250810190613f3d9190617aac565b60015b613f8157816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613f789190615255565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114613fe757806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401613fde919061536c565b60405180910390fd5b613ff183836146ce565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461407b576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b614085614740565b73ffffffffffffffffffffffffffffffffffffffff166140a3612879565b73ffffffffffffffffffffffffffffffffffffffff1614614102576140c6614740565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016140f99190615255565b60405180910390fd5b565b5f61410d6141d5565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f61421760075f8481526020019081526020015f205461182a565b9050919050565b5f6020825f0151511015614267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161425e90617b21565b60405180910390fd5b5f602067ffffffffffffffff8111156142835761428261561f565b5b6040519080825280601f01601f1916602001820160405280156142b55781602001600182028036833780820191505090505b5090505f5b602081101561434d57835f0151816020865f0151516142d99190615b6d565b6142e39190615ed8565b815181106142f4576142f3615ba0565b5b602001015160f81c60f81b82828151811061431257614311615ba0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080806001019150506142ba565b508061435890617b62565b915050919050565b5f8361436d868585614747565b149050949350505050565b5f805f90505f5b848490508110156143f257602085858381811061439f5761439e615ba0565b5b90506020028101906143b19190616f07565b80602001906143c09190616f2e565b90506143cc9190616800565b60406143d89190615ed8565b826143e39190615ed8565b9150808060010191505061437f565b508091505092915050565b5f488261440a9190616800565b90505f60095f8581526020019081526020015f2054602061442b9190616800565b90505f80614437611f99565b915091505f61446585848487600d5f8d81526020019081526020015f2054436144609190615b6d565b613b6a565b9050614470816137fb565b803411156144c8573373ffffffffffffffffffffffffffffffffffffffff166108fc823461449e9190615b6d565b90811502906040515f60405180830381858888f193505050501580156144c6573d5f803e3d5ffd5b505b867f928bbf5188022bf8b9a0e59f5e81e179d0a4c729bdba2856ac971af2063fbf2b8285856040516144fc93929190617bc8565b60405180910390a250505050505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b61453c6147cf565b6145458161480f565b50565b6145506147cf565b565b5f8190505f61456082614893565b90505f8490505f5b828110156145bf575f816001901b856145819190615b6d565b905060045f8981526020019081526020015f205f8281526020019081526020015f2054836145af9190615ed8565b9250508080600101915050614568565b508060045f8881526020019081526020015f205f8681526020019081526020015f2081905550505050505050565b5f8060035f8581526020019081526020015f205f8481526020019081526020015f2054905061461d8484836148b0565b60035f8581526020019081526020015f205f8481526020019081526020015f205f905560025f8581526020019081526020015f205f8481526020019081526020015f205f8082015f61466f9190614eb4565b50508091505092915050565b5f6146a77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61496b565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6146d782614974565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156147335761472d8282614a3d565b5061473c565b61473b614abd565b5b5050565b5f33905090565b5f808390505f5b85518110156147c3575f86828151811061476b5761476a615ba0565b5b602002602001015190505f6002866147839190616ed7565b03614799576147928382614af9565b92506147a6565b6147a38184614af9565b92505b6002856147b3919061711c565b945050808060010191505061474e565b50809150509392505050565b6147d7614b0c565b61480d576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6148176147cf565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614887575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161487e9190615255565b60405180910390fd5b61489081614104565b50565b5f6148a96001836148a49190615ed8565b614b2a565b9050919050565b5f6148cb60055f8681526020019081526020015f20546134a0565b6101006148d89190615b6d565b90505f6148e484614893565b90505b818111158015614907575060055f8681526020019081526020015f205484105b15614964578260045f8781526020019081526020015f205f8681526020019081526020015f205f82825461493b9190615b6d565b92505081905550806001901b846149529190615ed8565b935061495d84614893565b90506148e7565b5050505050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b036149cf57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016149c69190615255565b60405180910390fd5b806149fb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61496b565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051614a6691906164ad565b5f60405180830381855af49150503d805f8114614a9e576040519150601f19603f3d011682016040523d82523d5f602084013e614aa3565b606091505b5091509150614ab3858383614d6f565b9250505092915050565b5f341115614af7576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f614b048383614dfc565b905092915050565b5f614b1561450d565b5f0160089054906101000a900460ff16905090565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115614b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b8590617c6d565b60405180910390fd5b5f61010090505f83614b9f90617c94565b905083811690505f8114614bbc578180614bb8906170f5565b9250505b5f6fffffffffffffffffffffffffffffffff821614614be557608082614be29190615b6d565b91505b5f77ffffffffffffffff0000000000000000ffffffffffffffff821614614c1657604082614c139190615b6d565b91505b5f7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff821614614c4b57602082614c489190615b6d565b91505b5f7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff821614614c8257601082614c7f9190615b6d565b91505b5f7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff821614614cba57600882614cb79190615b6d565b91505b5f7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f821614614cf357600482614cf09190615b6d565b91505b5f7f3333333333333333333333333333333333333333333333333333333333333333821614614d2c57600282614d299190615b6d565b91505b5f7f5555555555555555555555555555555555555555555555555555555555555555821614614d6557600182614d629190615b6d565b91505b8192505050919050565b606082614d8457614d7f82614e45565b614df4565b5f8251148015614daa57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15614dec57836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401614de39190615255565b60405180910390fd5b819050614df5565b5b9392505050565b5f825f528160205260205f60405f60025afa614e16575f80fd5b5f5190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f8116905092915050565b5f81511115614e575780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052805f81526020015f81525090565b6040518060200160405280606081525090565b508054614ec090616409565b5f825580601f10614ed15750614eee565b601f0160209004905f5260205f2090810190614eed9190614ef1565b5b50565b5b80821115614f08575f815f905550600101614ef2565b5090565b5f819050919050565b614f1e81614f0c565b82525050565b5f602082019050614f375f830184614f15565b92915050565b5f604051905090565b5f80fd5b5f80fd5b614f5781614f0c565b8114614f61575f80fd5b50565b5f81359050614f7281614f4e565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112614f9957614f98614f78565b5b8235905067ffffffffffffffff811115614fb657614fb5614f7c565b5b602083019150836020820283011115614fd257614fd1614f80565b5b9250929050565b5f805f60408486031215614ff057614fef614f46565b5b5f614ffd86828701614f64565b935050602084013567ffffffffffffffff81111561501e5761501d614f4a565b5b61502a86828701614f84565b92509250509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61506881614f0c565b82525050565b604082015f8201516150825f85018261505f565b506020820151615095602085018261505f565b50505050565b5f6150a6838361506e565b60408301905092915050565b5f602082019050919050565b5f6150c882615036565b6150d28185615040565b93506150dd83615050565b805f5b8381101561510d5781516150f4888261509b565b97506150ff836150b2565b9250506001810190506150e0565b5085935050505092915050565b5f6020820190508181035f83015261513281846150be565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6151638261513a565b9050919050565b61517381615159565b811461517d575f80fd5b50565b5f8135905061518e8161516a565b92915050565b5f8083601f8401126151a9576151a8614f78565b5b8235905067ffffffffffffffff8111156151c6576151c5614f7c565b5b6020830191508360018202830111156151e2576151e1614f80565b5b9250929050565b5f805f60408486031215615200576151ff614f46565b5b5f61520d86828701615180565b935050602084013567ffffffffffffffff81111561522e5761522d614f4a565b5b61523a86828701615194565b92509250509250925092565b61524f81615159565b82525050565b5f6020820190506152685f830184615246565b92915050565b5f8083601f84011261528357615282614f78565b5b8235905067ffffffffffffffff8111156152a05761529f614f7c565b5b6020830191508360208202830111156152bc576152bb614f80565b5b9250929050565b5f805f805f606086880312156152dc576152db614f46565b5b5f6152e988828901614f64565b955050602086013567ffffffffffffffff81111561530a57615309614f4a565b5b6153168882890161526e565b9450945050604086013567ffffffffffffffff81111561533957615338614f4a565b5b61534588828901615194565b92509250509295509295909350565b5f819050919050565b61536681615354565b82525050565b5f60208201905061537f5f83018461535d565b92915050565b5f6020828403121561539a57615399614f46565b5b5f6153a784828501614f64565b91505092915050565b5f805f805f606086880312156153c9576153c8614f46565b5b5f6153d688828901614f64565b955050602086013567ffffffffffffffff8111156153f7576153f6614f4a565b5b61540388828901614f84565b9450945050604086013567ffffffffffffffff81111561542657615425614f4a565b5b61543288828901615194565b92509250509295509295909350565b5f806040838503121561545757615456614f46565b5b5f61546485828601614f64565b925050602061547585828601614f64565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156154b657808201518184015260208101905061549b565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6154db8261547f565b6154e58185615489565b93506154f5818560208601615499565b6154fe816154c1565b840191505092915050565b5f602083015f8301518482035f86015261552382826154d1565b9150508091505092915050565b5f6020820190508181035f8301526155488184615509565b905092915050565b5f805f806060858703121561556857615567614f46565b5b5f61557587828801614f64565b945050602061558687828801614f64565b935050604085013567ffffffffffffffff8111156155a7576155a6614f4a565b5b6155b387828801615194565b925092505092959194509250565b5f6040820190506155d45f830185615246565b6155e16020830184615246565b9392505050565b5f8115159050919050565b6155fc816155e8565b82525050565b5f6020820190506156155f8301846155f3565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b615655826154c1565b810181811067ffffffffffffffff821117156156745761567361561f565b5b80604052505050565b5f615686614f3d565b9050615692828261564c565b919050565b5f67ffffffffffffffff8211156156b1576156b061561f565b5b6156ba826154c1565b9050602081019050919050565b828183375f83830152505050565b5f6156e76156e284615697565b61567d565b9050828152602081018484840111156157035761570261561b565b5b61570e8482856156c7565b509392505050565b5f82601f83011261572a57615729614f78565b5b813561573a8482602086016156d5565b91505092915050565b5f806040838503121561575957615758614f46565b5b5f61576685828601615180565b925050602083013567ffffffffffffffff81111561578757615786614f4a565b5b61579385828601615716565b9150509250929050565b5f67ffffffffffffffff82169050919050565b6157b98161579d565b82525050565b5f8160030b9050919050565b6157d4816157bf565b82525050565b5f6040820190506157ed5f8301856157b0565b6157fa60208301846157cb565b9392505050565b5f819050919050565b5f61582461581f61581a8461513a565b615801565b61513a565b9050919050565b5f6158358261580a565b9050919050565b5f6158468261582b565b9050919050565b6158568161583c565b82525050565b5f60208201905061586f5f83018461584d565b92915050565b5f806040838503121561588b5761588a614f46565b5b5f61589885828601614f64565b92505060206158a985828601615180565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6158e7838361505f565b60208301905092915050565b5f602082019050919050565b5f615909826158b3565b61591381856158bd565b935061591e836158cd565b805f5b8381101561594e57815161593588826158dc565b9750615940836158f3565b925050600181019050615921565b5085935050505092915050565b5f6020820190508181035f83015261597381846158ff565b905092915050565b5f805f6040848603121561599257615991614f46565b5b5f61599f86828701614f64565b935050602084013567ffffffffffffffff8111156159c0576159bf614f4a565b5b6159cc86828701615194565b92509250509250925092565b5f6020820190506159eb5f8301846157b0565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f615a15826159f1565b615a1f81856159fb565b9350615a2f818560208601615499565b615a38816154c1565b840191505092915050565b5f6020820190508181035f830152615a5b8184615a0b565b905092915050565b5f60208284031215615a7857615a77614f46565b5b5f615a8584828501615180565b91505092915050565b5f8083601f840112615aa357615aa2614f78565b5b8235905067ffffffffffffffff811115615ac057615abf614f7c565b5b602083019150836020820283011115615adc57615adb614f80565b5b9250929050565b5f805f60408486031215615afa57615af9614f46565b5b5f615b0786828701614f64565b935050602084013567ffffffffffffffff811115615b2857615b27614f4a565b5b615b3486828701615a8e565b92509250509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f615b7782614f0c565b9150615b8283614f0c565b9250828203905081811115615b9a57615b99615b40565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4578747261206461746120746f6f206c617267650000000000000000000000005f82015250565b5f615c016014836159fb565b9150615c0c82615bcd565b602082019050919050565b5f6020820190508181035f830152615c2e81615bf5565b9050919050565b7f737962696c20666565206e6f74206d65740000000000000000000000000000005f82015250565b5f615c696011836159fb565b9150615c7482615c35565b602082019050919050565b5f6020820190508181035f830152615c9681615c5d565b9050919050565b5f615ca78261579d565b915067ffffffffffffffff8203615cc157615cc0615b40565b5b600182019050919050565b5f82825260208201905092915050565b5f615ce78385615ccc565b9350615cf48385846156c7565b615cfd836154c1565b840190509392505050565b5f606082019050615d1b5f830187614f15565b615d286020830186615246565b8181036040830152615d3b818486615cdc565b905095945050505050565b7f50726f6f6620736574206e6f74206c69766500000000000000000000000000005f82015250565b5f615d7a6012836159fb565b9150615d8582615d46565b602082019050919050565b5f6020820190508181035f830152615da781615d6e565b9050919050565b7f4d75737420616464206174206c65617374206f6e6520726f6f740000000000005f82015250565b5f615de2601a836159fb565b9150615ded82615dae565b602082019050919050565b5f6020820190508181035f830152615e0f81615dd6565b9050919050565b7f4f6e6c7920746865206f776e65722063616e2061646420726f6f7473000000005f82015250565b5f615e4a601c836159fb565b9150615e5582615e16565b602082019050919050565b5f6020820190508181035f830152615e7781615e3e565b9050919050565b5f80fd5b5f80fd5b5f80fd5b5f82356001604003833603038112615ea557615ea4615e7e565b5b80830191505092915050565b5f82356001602003833603038112615ecc57615ecb615e7e565b5b80830191505092915050565b5f615ee282614f0c565b9150615eed83614f0c565b9250828201905080821115615f0557615f04615b40565b5b92915050565b5f82825260208201905092915050565b5f819050919050565b5f80fd5b5f82356001602003833603038112615f4357615f42615f24565b5b82810191505092915050565b5f80fd5b5f80fd5b5f8083356001602003843603038112615f7357615f72615f24565b5b83810192508235915060208301925067ffffffffffffffff821115615f9b57615f9a615f4f565b5b600182023603831315615fb157615fb0615f53565b5b509250929050565b5f615fc48385615489565b9350615fd18385846156c7565b615fda836154c1565b840190509392505050565b5f60208301615ff65f840184615f57565b8583035f870152616008838284615fb9565b925050508091505092915050565b5f6160246020840184614f64565b905092915050565b5f6040830161603d5f840184615f28565b8482035f86015261604e8282615fe5565b91505061605e6020840184616016565b61606b602086018261505f565b508091505092915050565b5f616081838361602c565b905092915050565b5f823560016040038336030381126160a4576160a3615f24565b5b82810191505092915050565b5f602082019050919050565b5f6160c78385615f0b565b9350836020840285016160d984615f1b565b805f5b8781101561611c5784840389526160f38284616089565b6160fd8582616076565b9450616108836160b0565b925060208a019950506001810190506160dc565b50829750879450505050509392505050565b5f6080820190506161415f830189614f15565b61614e6020830188614f15565b81810360408301526161618186886160bc565b90508181036060830152616176818486615cdc565b9050979650505050505050565b7f4f6e6c7920746865206f776e65722063616e207363686564756c652072656d6f5f8201527f76616c206f6620726f6f74730000000000000000000000000000000000000000602082015250565b5f6161dd602c836159fb565b91506161e882616183565b604082019050919050565b5f6020820190508181035f83015261620a816161d1565b9050919050565b7f546f6f206d616e792072656d6f76616c73207761697420666f72206e657874205f8201527f70726f76696e6720706572696f6420746f207363686564756c65000000000000602082015250565b5f61626b603a836159fb565b915061627682616211565b604082019050919050565b5f6020820190508181035f8301526162988161625f565b9050919050565b7f43616e206f6e6c79207363686564756c652072656d6f76616c206f66206578695f8201527f7374696e6720726f6f7473000000000000000000000000000000000000000000602082015250565b5f6162f9602b836159fb565b91506163048261629f565b604082019050919050565b5f6020820190508181035f830152616326816162ed565b9050919050565b5f80fd5b82818337505050565b5f61634583856158bd565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156163785761637761632d565b5b602083029250616389838584616331565b82840190509392505050565b5f6060820190506163a85f830188614f15565b81810360208301526163bb81868861633a565b905081810360408301526163d0818486615cdc565b90509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061642057607f821691505b602082108103616433576164326163dc565b5b50919050565b5f819050919050565b61645361644e82614f0c565b616439565b82525050565b5f6164648284616442565b60208201915081905092915050565b5f81905092915050565b5f6164878261547f565b6164918185616473565b93506164a1818560208601615499565b80840191505092915050565b5f6164b8828461647d565b915081905092915050565b7f52616e646f6d6e65737320707265636f6d70696c652063616c6c206661696c655f8201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b5f61651d6021836159fb565b9150616528826164c3565b604082019050919050565b5f6020820190508181035f83015261654a81616511565b9050919050565b5f8151905061655f81614f4e565b92915050565b5f6020828403121561657a57616579614f46565b5b5f61658784828501616551565b91505092915050565b7f6f6e6c7920746865206f776e65722063616e206d6f766520746f206e657874205f8201527f70726f76696e6720706572696f64000000000000000000000000000000000000602082015250565b5f6165ea602e836159fb565b91506165f582616590565b604082019050919050565b5f6020820190508181035f830152616617816165de565b9050919050565b7f63616e206f6e6c792073746172742070726f76696e67206f6e6365206c6561765f8201527f6573206172652061646465640000000000000000000000000000000000000000602082015250565b5f616678602c836159fb565b91506166838261661e565b604082019050919050565b5f6020820190508181035f8301526166a58161666c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f6368616c6c656e67652065706f6368206d757374206265206174206c656173745f8201527f206368616c6c656e676546696e616c6974792065706f63687320696e2074686560208201527f2066757475726500000000000000000000000000000000000000000000000000604082015250565b5f6167596047836159fb565b9150616764826166d9565b606082019050919050565b5f6020820190508181035f8301526167868161674d565b9050919050565b5f6080820190506167a05f830188614f15565b6167ad6020830187614f15565b6167ba6040830186614f15565b81810360608301526167cd818486615cdc565b90509695505050505050565b5f6040820190506167ec5f830185614f15565b6167f96020830184614f15565b9392505050565b5f61680a82614f0c565b915061681583614f0c565b925082820261682381614f0c565b9150828204841483151761683a57616839615b40565b5b5092915050565b5f6040820190506168545f83018561535d565b6168616020830184614f15565b9392505050565b5f80fd5b5f8160070b9050919050565b6168818161686c565b811461688b575f80fd5b50565b5f8151905061689c81616878565b92915050565b6168ab8161579d565b81146168b5575f80fd5b50565b5f815190506168c6816168a2565b92915050565b6168d5816157bf565b81146168df575f80fd5b50565b5f815190506168f0816168cc565b92915050565b5f6080828403121561690b5761690a616868565b5b616915608061567d565b90505f6169248482850161688e565b5f830152506020616937848285016168b8565b602083015250604061694b848285016168e2565b604083015250606061695f84828501616551565b60608301525092915050565b5f608082840312156169805761697f614f46565b5b5f61698d848285016168f6565b91505092915050565b7f6661696c656420746f2076616c69646174653a207072696365206d75737420625f8201527f652067726561746572207468616e203000000000000000000000000000000000602082015250565b5f6169f06030836159fb565b91506169fb82616996565b604082019050919050565b5f6020820190508181035f830152616a1d816169e4565b9050919050565b7f4f6e6c79207468652063757272656e74206f776e65722063616e2070726f706f5f8201527f73652061206e6577206f776e6572000000000000000000000000000000000000602082015250565b5f616a7e602e836159fb565b9150616a8982616a24565b604082019050919050565b5f6020820190508181035f830152616aab81616a72565b9050919050565b7f6368616c6c656e676552616e6765202d312073686f756c6420616c69676e20775f8201527f697468207468652076657279206c617374206c656166206f66206120726f6f74602082015250565b5f616b0c6040836159fb565b9150616b1782616ab2565b604082019050919050565b5f6020820190508181035f830152616b3981616b00565b9050919050565b7f70726f6f6620736574206964206f7574206f6620626f756e64730000000000005f82015250565b5f616b74601a836159fb565b9150616b7f82616b40565b602082019050919050565b5f6020820190508181035f830152616ba181616b68565b9050919050565b7f4f6e6c7920746865206f776e65722063616e2064656c6574652070726f6f66205f8201527f7365747300000000000000000000000000000000000000000000000000000000602082015250565b5f616c026024836159fb565b9150616c0d82616ba8565b604082019050919050565b5f6020820190508181035f830152616c2f81616bf6565b9050919050565b5f606082019050616c495f830187614f15565b616c566020830186614f15565b8181036040830152616c69818486615cdc565b905095945050505050565b7f4f6e6c79207468652070726f706f736564206f776e65722063616e20636c61695f8201527f6d206f776e657273686970000000000000000000000000000000000000000000602082015250565b5f616cce602b836159fb565b9150616cd982616c74565b604082019050919050565b5f6020820190508181035f830152616cfb81616cc2565b9050919050565b7f7072656d61747572652070726f6f6600000000000000000000000000000000005f82015250565b5f616d36600f836159fb565b9150616d4182616d02565b602082019050919050565b5f6020820190508181035f830152616d6381616d2a565b9050919050565b7f656d7074792070726f6f660000000000000000000000000000000000000000005f82015250565b5f616d9e600b836159fb565b9150616da982616d6a565b602082019050919050565b5f6020820190508181035f830152616dcb81616d92565b9050919050565b7f6e6f206368616c6c656e6765207363686564756c6564000000000000000000005f82015250565b5f616e066016836159fb565b9150616e1182616dd2565b602082019050919050565b5f6020820190508181035f830152616e3381616dfa565b9050919050565b5f8160c01b9050919050565b5f616e5082616e3a565b9050919050565b616e68616e638261579d565b616e46565b82525050565b5f616e798286616442565b602082019150616e898285616442565b602082019150616e998284616e57565b600882019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f616ee182614f0c565b9150616eec83614f0c565b925082616efc57616efb616eaa565b5b828206905092915050565b5f82356001604003833603038112616f2257616f21615e7e565b5b80830191505092915050565b5f8083356001602003843603038112616f4a57616f49615e7e565b5b80840192508235915067ffffffffffffffff821115616f6c57616f6b615e82565b5b602083019250602082023603831315616f8857616f87615e86565b5b509250929050565b7f70726f6f6620646964206e6f74207665726966790000000000000000000000005f82015250565b5f616fc46014836159fb565b9150616fcf82616f90565b602082019050919050565b5f6020820190508181035f830152616ff181616fb8565b9050919050565b5f60808201905061700b5f830187614f15565b6170186020830186614f15565b6170256040830185614f15565b6170326060830184614f15565b95945050505050565b5f819050919050565b5f61705e6170596170548461703b565b615801565b61579d565b9050919050565b61706e81617044565b82525050565b5f6020820190506170875f830184617065565b92915050565b7f4c65616620696e646578206f7574206f6620626f756e647300000000000000005f82015250565b5f6170c16018836159fb565b91506170cc8261708d565b602082019050919050565b5f6020820190508181035f8301526170ee816170b5565b9050919050565b5f6170ff82614f0c565b91505f820361711157617110615b40565b5b600182039050919050565b5f61712682614f0c565b915061713183614f0c565b92508261714157617140616eaa565b5b828204905092915050565b7f496e636f72726563742066656520616d6f756e740000000000000000000000005f82015250565b5f6171806014836159fb565b915061718b8261714c565b602082019050919050565b5f6020820190508181035f8301526171ad81617174565b9050919050565b50565b5f6171c25f83616473565b91506171cd826171b4565b5f82019050919050565b5f6171e1826171b7565b9150819050919050565b7f4275726e206661696c65640000000000000000000000000000000000000000005f82015250565b5f61721f600b836159fb565b915061722a826171eb565b602082019050919050565b5f6020820190508181035f83015261724c81617213565b9050919050565b7f53697a65206d7573742062652061206d756c7469706c65206f662033320000005f82015250565b5f617287601d836159fb565b915061729282617253565b602082019050919050565b5f6040820190506172b05f830184614f15565b81810360208301526172c18161727b565b905092915050565b7f53697a65206d7573742062652067726561746572207468616e203000000000005f82015250565b5f6172fd601b836159fb565b9150617308826172c9565b602082019050919050565b5f6040820190506173265f830184614f15565b8181036020830152617337816172f1565b905092915050565b7f526f6f742073697a65206d757374206265206c657373207468616e20325e35305f82015250565b5f6173736020836159fb565b915061737e8261733f565b602082019050919050565b5f60408201905061739c5f830184614f15565b81810360208301526173ad81617367565b905092915050565b5f6173bf82614f0c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036173f1576173f0615b40565b5b600182019050919050565b5f808335600160200384360303811261741857617417615e7e565b5b80840192508235915067ffffffffffffffff82111561743a57617439615e82565b5b60208301925060018202360383131561745657617455615e86565b5b509250929050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026174c47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617489565b6174ce8683617489565b95508019841693508086168417925050509392505050565b5f6175006174fb6174f684614f0c565b615801565b614f0c565b9050919050565b5f819050919050565b617519836174e6565b61752d61752582617507565b848454617495565b825550505050565b5f90565b617541617535565b61754c818484617510565b505050565b5b8181101561756f576175645f82617539565b600181019050617552565b5050565b601f8211156175b45761758581617468565b61758e8461747a565b8101602085101561759d578190505b6175b16175a98561747a565b830182617551565b50505b505050565b5f82821c905092915050565b5f6175d45f19846008026175b9565b1980831691505092915050565b5f6175ec83836175c5565b9150826002028217905092915050565b617606838361745e565b67ffffffffffffffff81111561761f5761761e61561f565b5b6176298254616409565b617634828285617573565b5f601f831160018114617661575f841561764f578287013590505b61765985826175e1565b8655506176c0565b601f19841661766f86617468565b5f5b8281101561769657848901358255600182019150602085019450602081019050617671565b868310156176b357848901356176af601f8916826175c5565b8355505b6001600288020188555050505b50505050505050565b6176d48383836175fc565b505050565b5f81015f83016176e981856173fc565b6176f48183866176c9565b505050505050565b61770682826176d9565b5050565b7f6661696c656420746f2076616c69646174653a20657374696d617465642067615f8201527f7320666565206d7573742062652067726561746572207468616e203000000000602082015250565b5f617764603c836159fb565b915061776f8261770a565b604082019050919050565b5f6020820190508181035f83015261779181617758565b9050919050565b7f6661696c656420746f2076616c69646174653a204174746f46494c20707269635f8201527f65206d7573742062652067726561746572207468616e20300000000000000000602082015250565b5f6177f26038836159fb565b91506177fd82617798565b604082019050919050565b5f6020820190508181035f83015261781f816177e6565b9050919050565b7f6661696c656420746f2076616c69646174653a207261772073697a65206d75735f8201527f742062652067726561746572207468616e203000000000000000000000000000602082015250565b5f6178806033836159fb565b915061788b82617826565b604082019050919050565b5f6020820190508181035f8301526178ad81617874565b9050919050565b5f8160011c9050919050565b5f808291508390505b6001851115617909578086048111156178e5576178e4615b40565b5b60018516156178f45780820291505b8081029050617902856178b4565b94506178c9565b94509492505050565b5f8261792157600190506179dc565b8161792e575f90506179dc565b8160018114617944576002811461794e5761797d565b60019150506179dc565b60ff8411156179605761795f615b40565b5b8360020a91508482111561797757617976615b40565b5b506179dc565b5060208310610133831016604e8410600b84101617156179b25782820a9050838111156179ad576179ac615b40565b5b6179dc565b6179bf84848460016178c0565b925090508184048111156179d6576179d5615b40565b5b81810290505b9392505050565b5f63ffffffff82169050919050565b5f6179fc82614f0c565b9150617a07836179e3565b9250617a347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484617912565b905092915050565b5f617a46826157bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000008203617a7857617a77615b40565b5b815f039050919050565b617a8b81615354565b8114617a95575f80fd5b50565b5f81519050617aa681617a82565b92915050565b5f60208284031215617ac157617ac0614f46565b5b5f617ace84828501617a98565b91505092915050565b7f436964206461746120697320746f6f2073686f727400000000000000000000005f82015250565b5f617b0b6015836159fb565b9150617b1682617ad7565b602082019050919050565b5f6020820190508181035f830152617b3881617aff565b9050919050565b5f819050602082019050919050565b5f617b598251615354565b80915050919050565b5f617b6c8261547f565b82617b7684617b3f565b9050617b8181617b4e565b92506020821015617bc157617bbc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802617489565b831692505b5050919050565b5f606082019050617bdb5f830186614f15565b617be860208301856157b0565b617bf560408301846157cb565b949350505050565b7f496e7075742065786365656473206d6178696d756d20696e743235362076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f617c576022836159fb565b9150617c6282617bfd565b604082019050919050565b5f6020820190508181035f830152617c8481617c4b565b9050919050565b5f819050919050565b5f617c9e82617c8b565b91507f80000000000000000000000000000000000000000000000000000000000000008203617cd057617ccf615b40565b5b815f03905091905056fea264697066735822122033620393606d94f1c8d591222f06f6214eafe22531657caf6478a039d4cfa51864736f6c63430008170033","sourceMap":"1708:31540:17:-:0;;;1171:4:2;1128:48;;;;;;;;;7213:50:17;;;;;;;;;;7234:22;:20;;;:22;;:::i;:::-;1708:31540;;7711:422:1;7826:30;7859:26;:24;;;:26;;:::i;:::-;7826:59;;7900:1;:15;;;;;;;;;;;;7896:76;;;7938:23;;;;;;;;;;;;;;7896:76;8003:16;7985:34;;:1;:14;;;;;;;;;;;;:34;;;7981:146;;8052:16;8035:1;:14;;;:33;;;;;;;;;;;;;;;;;;8087:29;8099:16;8087:29;;;;;;:::i;:::-;;;;;;;;7981:146;7760:373;7711:422::o;8737:170::-;8795:30;8870:21;8860:31;;8737:170;:::o;7:101:20:-;43:7;83:18;76:5;72:30;61:41;;7:101;;;:::o;114:115::-;199:23;216:5;199:23;:::i;:::-;194:3;187:36;114:115;;:::o;235:218::-;326:4;364:2;353:9;349:18;341:26;;377:69;443:1;432:9;428:17;419:6;377:69;:::i;:::-;235:218;;;;:::o;1708:31540:17:-;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610271575f3560e01c806367e406d51161014e5780639f8cb3bd116100c0578063f2fde38b11610079578063f2fde38b146109c5578063f58f952b146109ed578063f5cac1ba14610a09578063f83758fe14610a45578063faa6716314610a6f578063fe4b84df14610aab57610271565b80639f8cb3bd146108b9578063ad3cb1cc146108e3578063c0e159491461090d578063d49245c114610937578063ee3dac6514610973578063f178b1be1461099b57610271565b806371cf2a161161011257806371cf2a1614610789578063847d1d06146107c557806389208ba9146107ed5780638da5cb5b146108295780638ea417e5146108535780639153e64b1461087d57610271565b806367e406d5146106a95780636ba4608f146106d35780636cb55c161461070f5780636fa4469214610737578063715018a61461077357610271565b80633f84135f116101e757806347331050116101ab57806347331050146105965780634903704a146105d25780634f1ef2861461060e5780634fa279201461062a57806352d1902d1461065557806361a52a361461067f57610271565b80633f84135f1461048f578063453f4f62146104cb57806345c0b92d14610507578063462dd4491461052f5780634726075b1461055957610271565b806315b175701161023957806315b175701461037157806316e2bcd51461039b57806319c75950146103c557806331601226146103ef5780633b68e4e91461042b5780633b7ae9131461045357610271565b8063029b4646146102755780630528a55b1461029f5780630a4d7932146102db5780630a6a63f11461030b57806311c0ee4a14610335575b5f80fd5b348015610280575f80fd5b50610289610ad3565b6040516102969190614f24565b60405180910390f35b3480156102aa575f80fd5b506102c560048036038101906102c09190614fd9565b610ad9565b6040516102d2919061511a565b60405180910390f35b6102f560048036038101906102f091906151e9565b610bc8565b6040516103029190614f24565b60405180910390f35b348015610316575f80fd5b5061031f610ee8565b60405161032c9190615255565b60405180910390f35b348015610340575f80fd5b5061035b600480360381019061035691906152c3565b610f00565b6040516103689190614f24565b60405180910390f35b34801561037c575f80fd5b506103856112a4565b6040516103929190615255565b60405180910390f35b3480156103a6575f80fd5b506103af6112bc565b6040516103bc9190614f24565b60405180910390f35b3480156103d0575f80fd5b506103d96112c7565b6040516103e6919061536c565b60405180910390f35b3480156103fa575f80fd5b5061041560048036038101906104109190615385565b6112ed565b6040516104229190615255565b60405180910390f35b348015610436575f80fd5b50610451600480360381019061044c91906153b0565b61136e565b005b34801561045e575f80fd5b5061047960048036038101906104749190615441565b6116b6565b6040516104869190615530565b60405180910390f35b34801561049a575f80fd5b506104b560048036038101906104b09190615385565b6117c8565b6040516104c29190614f24565b60405180910390f35b3480156104d6575f80fd5b506104f160048036038101906104ec9190615385565b61182a565b6040516104fe9190614f24565b60405180910390f35b348015610512575f80fd5b5061052d60048036038101906105289190615550565b611924565b005b34801561053a575f80fd5b50610543611e04565b6040516105509190614f24565b60405180910390f35b348015610564575f80fd5b5061057f600480360381019061057a9190615385565b611e08565b60405161058d9291906155c1565b60405180910390f35b3480156105a1575f80fd5b506105bc60048036038101906105b79190615441565b611ebd565b6040516105c99190615602565b60405180910390f35b3480156105dd575f80fd5b506105f860048036038101906105f39190615441565b611f16565b6040516106059190614f24565b60405180910390f35b61062860048036038101906106239190615743565b611f7a565b005b348015610635575f80fd5b5061063e611f99565b60405161064c9291906157da565b60405180910390f35b348015610660575f80fd5b506106696120ab565b604051610676919061536c565b60405180910390f35b34801561068a575f80fd5b506106936120dc565b6040516106a09190614f24565b60405180910390f35b3480156106b4575f80fd5b506106bd6120e3565b6040516106ca919061585c565b60405180910390f35b3480156106de575f80fd5b506106f960048036038101906106f49190615385565b6120fb565b6040516107069190614f24565b60405180910390f35b34801561071a575f80fd5b5061073560048036038101906107309190615875565b61215d565b005b348015610742575f80fd5b5061075d60048036038101906107589190615385565b612307565b60405161076a919061595b565b60405180910390f35b34801561077e575f80fd5b50610787612416565b005b348015610794575f80fd5b506107af60048036038101906107aa9190615441565b612429565b6040516107bc9190615602565b60405180910390f35b3480156107d0575f80fd5b506107eb60048036038101906107e6919061597b565b612517565b005b3480156107f8575f80fd5b50610813600480360381019061080e9190615385565b612817565b6040516108209190614f24565b60405180910390f35b348015610834575f80fd5b5061083d612879565b60405161084a9190615255565b60405180910390f35b34801561085e575f80fd5b506108676128ae565b60405161087491906159d8565b60405180910390f35b348015610888575f80fd5b506108a3600480360381019061089e9190615441565b6128ca565b6040516108b09190614f24565b60405180910390f35b3480156108c4575f80fd5b506108cd61293c565b6040516108da9190614f24565b60405180910390f35b3480156108ee575f80fd5b506108f7612942565b6040516109049190615a43565b60405180910390f35b348015610918575f80fd5b5061092161297b565b60405161092e9190614f24565b60405180910390f35b348015610942575f80fd5b5061095d60048036038101906109589190615385565b612980565b60405161096a9190614f24565b60405180910390f35b34801561097e575f80fd5b5061099960048036038101906109949190615385565b6129e2565b005b3480156109a6575f80fd5b506109af612bdd565b6040516109bc9190614f24565b60405180910390f35b3480156109d0575f80fd5b506109eb60048036038101906109e69190615a63565b612be1565b005b610a076004803603810190610a029190615ae3565b612c65565b005b348015610a14575f80fd5b50610a2f6004803603810190610a2a9190615385565b613215565b604051610a3c9190615602565b60405180910390f35b348015610a50575f80fd5b50610a596132a7565b604051610a669190614f24565b60405180910390f35b348015610a7a575f80fd5b50610a956004803603810190610a909190615385565b6132af565b604051610aa29190614f24565b60405180910390f35b348015610ab6575f80fd5b50610ad16004803603810190610acc9190615385565b613311565b005b61080081565b60605f610af660055f8781526020019081526020015f20546134a0565b610100610b039190615b6d565b90505f8484905067ffffffffffffffff811115610b2357610b2261561f565b5b604051908082528060200260200182016040528015610b5c57816020015b610b49614e89565b815260200190600190039081610b415790505b5090505f5b85859050811015610bbb57610b9087878784818110610b8357610b82615ba0565b5b90506020020135856135c9565b828281518110610ba357610ba2615ba0565b5b60200260200101819052508080600101915050610b61565b5080925050509392505050565b5f610800838390501115610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890615c17565b60405180910390fd5b5f610c1a6137d4565b905080341015610c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5690615c7f565b60405180910390fd5b610c68816137fb565b80341115610cc0573373ffffffffffffffffffffffffffffffffffffffff166108fc8234610c969190615b6d565b90811502906040515f60405180830381858888f19350505050158015610cbe573d5f803e3d5ffd5b505b5f60015f81819054906101000a900467ffffffffffffffff1680929190610ce690615c9d565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555067ffffffffffffffff1690505f60065f8381526020019081526020015f20819055505f60075f8381526020019081526020015f208190555033600b5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600d5f8381526020019081526020015f20819055505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e98578573ffffffffffffffffffffffffffffffffffffffff166394d41b36823388886040518563ffffffff1660e01b8152600401610e6a9493929190615d08565b5f604051808303815f87803b158015610e81575f80fd5b505af1158015610e93573d5f803e3d5ffd5b505050505b3373ffffffffffffffffffffffffffffffffffffffff16817f017f0b33d96e8f9968590172013032c2346cf047787a5e17a44b0a1bb3cd0f0160405160405180910390a380925050509392505050565b73ff0000000000000000000000000000000000006381565b5f610800838390501115610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090615c17565b60405180910390fd5b610f5286613215565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890615d90565b60405180910390fd5b5f8585905011610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90615df8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b5f8881526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b90615e60565b60405180910390fd5b5f60055f8881526020019081526020015f205490505f8686905067ffffffffffffffff8111156110a7576110a661561f565b5b6040519080825280602002602001820160405280156110d55781602001602082028036833780820191505090505b5090505f5b878790508110156111845761114b89828a8a858181106110fd576110fc615ba0565b5b905060200281019061110f9190615e8a565b805f019061111d9190615eb1565b8b8b868181106111305761112f615ba0565b5b90506020028101906111429190615e8a565b602001356138fe565b5080836111589190615ed8565b82828151811061116b5761116a615ba0565b5b60200260200101818152505080806001019150506110da565b50877f5ce51a8003915c377679ba533d9dafa0792058b254965697e674272f13f4fdd3826040516111b5919061595b565b60405180910390a25f60085f8a81526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611295578073ffffffffffffffffffffffffffffffffffffffff166312d5d66f8a858b8b8b8b6040518763ffffffff1660e01b81526004016112679695949392919061612e565b5f604051808303815f87803b15801561127e575f80fd5b505af1158015611290573d5f803e3d5ffd5b505050505b82935050505095945050505050565b73fe0000000000000000000000000000000000000681565b660400000000000081565b7f150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e5f1b81565b5f6112f782613215565b611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d90615d90565b60405180910390fd5b60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6108008282905011156113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad90615c17565b60405180910390fd5b6113bf85613215565b6113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590615d90565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b5f8781526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461149c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611493906161f3565b60405180910390fd5b6107d0600a5f8781526020019081526020015f2080549050858590506114c29190615ed8565b1115611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90616281565b60405180910390fd5b5f5b848490508110156115d75760055f8781526020019081526020015f205485858381811061153557611534615ba0565b5b905060200201351061157c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115739061630f565b60405180910390fd5b600a5f8781526020019081526020015f208585838181106115a05761159f615ba0565b5b90506020020135908060018154018082558091505060019003905f5260205f20015f90919091909150558080600101915050611505565b505f60085f8781526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116ae578073ffffffffffffffffffffffffffffffffffffffff16634af7d1d287878787876040518663ffffffff1660e01b8152600401611680959493929190616395565b5f604051808303815f87803b158015611697575f80fd5b505af11580156116a9573d5f803e3d5ffd5b505050505b505050505050565b6116be614ea1565b6116c783613215565b611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90615d90565b60405180910390fd5b60025f8481526020019081526020015f205f8381526020019081526020015f206040518060200160405290815f8201805461174090616409565b80601f016020809104026020016040519081016040528092919081815260200182805461176c90616409565b80156117b75780601f1061178e576101008083540402835291602001916117b7565b820191905f5260205f20905b81548152906001019060200180831161179a57829003601f168201915b505050505081525050905092915050565b5f6117d282613215565b611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890615d90565b60405180910390fd5b60065f8381526020019081526020015f20549050919050565b5f805f73fe0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16846040516020016118699190616459565b60405160208183030381529060405260405161188591906164ad565b5f60405180830381855afa9150503d805f81146118bd576040519150601f19603f3d011682016040523d82523d5f602084013e6118c2565b606091505b509150915081611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90616533565b60405180910390fd5b8080602001905181019061191b9190616565565b92505050919050565b61080082829050111561196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390615c17565b60405180910390fd5b600b5f8581526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190616600565b60405180910390fd5b5f60065f8681526020019081526020015f205411611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a549061668e565b60405180910390fd5b5f600d5f8681526020019081526020015f205403611a8c5743600d5f8681526020019081526020015f20819055505b5f600a5f8681526020019081526020015f2090505f818054905067ffffffffffffffff811115611abf57611abe61561f565b5b604051908082528060200260200182016040528015611aed5781602001602082028036833780820191505090505b5090505f5b8151811015611b77578260018480549050611b0d9190615b6d565b81548110611b1e57611b1d615ba0565b5b905f5260205f200154828281518110611b3a57611b39615ba0565b5b60200260200101818152505082805480611b5757611b566166ac565b5b600190038181905f5260205f20015f905590558080600101915050611af2565b50611b828682613aab565b857fd22bb0ee05b8ca92312459c76223d3b9bc1bd96fb6c9b18e637ededf92d8117482604051611bb2919061595b565b60405180910390a260065f8781526020019081526020015f205460095f8881526020019081526020015f20819055505f5443611bee9190615ed8565b851015611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c279061676f565b60405180910390fd5b8460075f8881526020019081526020015f20819055505f60065f8881526020019081526020015f205403611cb857857f323c29bc8d678a5d987b90a321982d10b9a91bcad071a9e445879497bf0e68e760405160405180910390a25f600d5f8881526020019081526020015f20819055505f60075f8881526020019081526020015f20819055505b5f60085f8881526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611db0578073ffffffffffffffffffffffffffffffffffffffff1663aa27ebcc8860075f8b81526020019081526020015f205460065f8c81526020019081526020015f205489896040518663ffffffff1660e01b8152600401611d8295949392919061678d565b5f604051808303815f87803b158015611d99575f80fd5b505af1158015611dab573d5f803e3d5ffd5b505050505b867fc099ffec4e3e773644a4d1dda368c46af853a0eeb15babde217f53a657396e1e8760065f8b81526020019081526020015f2054604051611df39291906167d9565b60405180910390a250505050505050565b5f81565b5f80611e1383613215565b611e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4990615d90565b60405180910390fd5b600b5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c5f8581526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509150915091565b5f611ec783613215565b8015611ee3575060055f8481526020019081526020015f205482105b8015611f0e57505f60035f8581526020019081526020015f205f8481526020019081526020015f2054115b905092915050565b5f8060095f8581526020019081526020015f20546020611f369190616800565b90505f80611f42611f99565b91509150611f6f85838386600d5f8c81526020019081526020015f205443611f6a9190615b6d565b613b6a565b935050505092915050565b611f82613de7565b611f8b82613ecd565b611f958282613ed8565b5050565b5f805f73a2aa501b19aff244d90cc15a4cf739d2725b572973ffffffffffffffffffffffffffffffffffffffff1663a4ae35e07f150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e5f1b620151806040518363ffffffff1660e01b8152600401612010929190616841565b608060405180830381865afa15801561202b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204f919061696b565b90505f815f015160070b13612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090616a06565b60405180910390fd5b805f0151816040015192509250509091565b5f6120b4613ff6565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b6201518081565b73a2aa501b19aff244d90cc15a4cf739d2725b572981565b5f61210582613215565b612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90615d90565b60405180910390fd5b60075f8381526020019081526020015f20549050919050565b61216682613215565b6121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90615d90565b60405180910390fd5b5f600b5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90616a94565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122b257600c5f8481526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055612302565b81600c5f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b606061231282613215565b612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890615d90565b60405180910390fd5b5f600a5f8481526020019081526020015f2090505f818054905067ffffffffffffffff8111156123845761238361561f565b5b6040519080825280602002602001820160405280156123b25781602001602082028036833780820191505090505b5090505f5b828054905081101561240b578281815481106123d6576123d5615ba0565b5b905f5260205f2001548282815181106123f2576123f1615ba0565b5b60200260200101818152505080806001019150506123b7565b508092505050919050565b61241e61407d565b6124275f614104565b565b5f8061244560055f8681526020019081526020015f20546134a0565b6101006124529190615b6d565b90505f61247d85600160095f8981526020019081526020015f20546124779190615b6d565b846135c9565b9050600160035f8781526020019081526020015f205f835f015181526020019081526020015f20546124af9190615b6d565b8160200151146124f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124eb90616b22565b60405180910390fd5b6124fe8585611ebd565b801561250d5750805f01518411155b9250505092915050565b61080082829050111561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690615c17565b60405180910390fd5b60015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1683106125c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b790616b8a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b5f8581526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590616c18565b60405180910390fd5b5f60065f8581526020019081526020015f205490505f60065f8681526020019081526020015f20819055505f600b5f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60075f8681526020019081526020015f20819055505f600d5f8681526020019081526020015f20819055505f60085f8681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127d8578073ffffffffffffffffffffffffffffffffffffffff166326c249e3868487876040518563ffffffff1660e01b81526004016127aa9493929190616c36565b5f604051808303815f87803b1580156127c1575f80fd5b505af11580156127d3573d5f803e3d5ffd5b505050505b847f589e9a441b5bddda77c4ab647b0108764a9cc1a7f655aa9b7bc50b8bdfab8673836040516128089190614f24565b60405180910390a25050505050565b5f61282182613215565b612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790615d90565b60405180910390fd5b60095f8381526020019081526020015f20549050919050565b5f806128836141d5565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f60015f9054906101000a900467ffffffffffffffff16905090565b5f6128d483613215565b612913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290a90615d90565b60405180910390fd5b60035f8481526020019081526020015f205f8381526020019081526020015f2054905092915050565b6107d081565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b602081565b5f61298a82613215565b6129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c090615d90565b60405180910390fd5b60055f8381526020019081526020015f20549050919050565b6129eb81613215565b612a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2190615d90565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf90616ce4565b60405180910390fd5b5f600b5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905033600b5f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c5f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690553373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837fd3273037b635678293ef0c076bd77af13760e75e12806d1db237616d03c3a76660405160405180910390a45050565b5f81565b612be961407d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c59575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612c509190615255565b60405180910390fd5b612c6281614104565b50565b5f5a9050600b5f8581526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90616600565b60405180910390fd5b5f60075f8681526020019081526020015f2054905080431015612d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5690616d4c565b60405180910390fd5b5f8484905011612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9b90616db4565b60405180910390fd5b5f8103612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd90616e1c565b60405180910390fd5b5f8484905067ffffffffffffffff811115612e0457612e0361561f565b5b604051908082528060200260200182016040528015612e3d57816020015b612e2a614e89565b815260200190600190039081612e225790505b5090505f612e4a876141fc565b90505f60095f8981526020019081526020015f205490505f612e7c60055f8b81526020019081526020015f20546134a0565b610100612e899190615b6d565b90505f5b888890508167ffffffffffffffff16101561308b575f848b83604051602001612eb893929190616e6e565b60405160208183030381529060405290505f8482805190602001205f1c612edf9190616ed7565b9050612eec8c82866135c9565b878467ffffffffffffffff1681518110612f0957612f08615ba0565b5b60200260200101819052505f612f4e612f498e8a8767ffffffffffffffff1681518110612f3957612f38615ba0565b5b60200260200101515f01516116b6565b61421e565b90505f6130328d8d8767ffffffffffffffff16818110612f7157612f70615ba0565b5b9050602002810190612f839190616f07565b8060200190612f929190616f2e565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050838f8f8967ffffffffffffffff16818110612fef57612fee615ba0565b5b90506020028101906130019190616f07565b5f01358c8967ffffffffffffffff168151811061302157613020615ba0565b5b602002602001015160200151614360565b905080613074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306b90616fda565b60405180910390fd5b50505050808061308390615c9d565b915050612e8d565b505f610514602061309c8b8b614378565b6130a69190615ed8565b6130b09190616800565b5a886130bc9190615b6d565b6130c69190615ed8565b90506130d28a826143fd565b5f60085f8c81526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146131ba578073ffffffffffffffffffffffffffffffffffffffff1663356de02b8c60065f8f81526020019081526020015f2054888e8e90506040518563ffffffff1660e01b815260040161318c9493929190616ff8565b5f604051808303815f87803b1580156131a3575f80fd5b505af11580156131b5573d5f803e3d5ffd5b505050505b43600d5f8d81526020019081526020015f20819055508a7f1acf7df9f0c1b0208c23be6178950c0273f89b766805a2c0bd1e53d25c700e5087604051613200919061511a565b60405180910390a25050505050505050505050565b5f60015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16821080156132a057505f73ffffffffffffffffffffffffffffffffffffffff16600b5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b5f8054905090565b5f6132b982613215565b6132f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ef90615d90565b60405180910390fd5b600d5f8381526020019081526020015f20549050919050565b5f61331a61450d565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff161480156133625750825b90505f60018367ffffffffffffffff1614801561339557505f3073ffffffffffffffffffffffffffffffffffffffff163b145b9050811580156133a3575080155b156133da576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315613427576001855f0160086101000a81548160ff0219169083151502179055505b61343033614534565b613438614548565b855f819055508315613498575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2600160405161348f9190617074565b60405180910390a15b505050505050565b5f8061010090505f608084901c90505f81146134c9576080826134c39190615b6d565b91508093505b604084901c90505f81146134ea576040826134e49190615b6d565b91508093505b602084901c90505f811461350b576020826135059190615b6d565b91508093505b601084901c90505f811461352c576010826135269190615b6d565b91508093505b600884901c90505f811461354d576008826135479190615b6d565b91508093505b600484901c90505f811461356e576004826135689190615b6d565b91508093505b600284901c90505f811461358f576002826135899190615b6d565b91508093505b600184901c90505f81146135b3576002826135aa9190615b6d565b925050506135c4565b83826135bf9190615b6d565b925050505b919050565b6135d1614e89565b60065f8581526020019081526020015f20548310613624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361b906170d7565b60405180910390fd5b5f6001836001901b6136369190615b6d565b90505f80808590505b5f81111561373b5760055f8981526020019081526020015f205484106136825760018161366c9190615b6d565b6001901b8461367b9190615b6d565b9350613728565b60045f8981526020019081526020015f205f8581526020019081526020015f2054836136ae9190615ed8565b91508682116137085760045f8981526020019081526020015f205f8581526020019081526020015f2054836136e39190615ed8565b92506001816136f29190615b6d565b6001901b846137019190615ed8565b9350613727565b6001816137159190615b6d565b6001901b846137249190615b6d565b93505b5b8080613733906170f5565b91505061363f565b5060045f8881526020019081526020015f205f8481526020019081526020015f2054826137689190615ed8565b90508581116137a75760405180604001604052806001856137899190615ed8565b8152602001828861379a9190615b6d565b81525093505050506137cd565b604051806040016040528084815260200183886137c49190615b6d565b81525093505050505b9392505050565b5f600a6001670de0b6b3a76400006137ec9190616800565b6137f6919061711c565b905090565b8034101561383e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383590617196565b60405180910390fd5b5f73ff0000000000000000000000000000000000006373ffffffffffffffffffffffffffffffffffffffff1682604051613877906171d7565b5f6040518083038185875af1925050503d805f81146138b1576040519150601f19603f3d011682016040523d82523d5f602084013e6138b6565b606091505b50509050806138fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f190617235565b60405180910390fd5b5050565b5f8060208361390d9190616ed7565b1461394f57836040517fc7b67cf3000000000000000000000000000000000000000000000000000000008152600401613946919061729d565b60405180910390fd5b5f820361399357836040517fc7b67cf300000000000000000000000000000000000000000000000000000000815260040161398a9190617313565b60405180910390fd5b66040000000000008211156139df57836040517fc7b67cf30000000000000000000000000000000000000000000000000000000081526004016139d69190617389565b60405180910390fd5b5f6020836139ed919061711c565b90505f60055f8881526020019081526020015f205f815480929190613a11906173b5565b919050559050613a22878383614552565b8460025f8981526020019081526020015f205f8381526020019081526020015f208181613a4f91906176fc565b9050508160035f8981526020019081526020015f205f8381526020019081526020015f20819055508160065f8981526020019081526020015f205f828254613a979190615ed8565b925050819055508092505050949350505050565b613ab482613215565b613af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aea90615d90565b60405180910390fd5b5f805b8251811015613b3d57613b2384848381518110613b1657613b15615ba0565b5b60200260200101516145ed565b82613b2e9190615ed8565b91508080600101915050613af6565b508060065f8581526020019081526020015f205f828254613b5e9190615b6d565b92505081905550505050565b5f80861180613b7857505f48145b613bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bae9061777a565b60405180910390fd5b5f8567ffffffffffffffff1611613c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfa90617808565b60405180910390fd5b5f8311613c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3c90617896565b60405180910390fd5b5f808560030b12613cc35784600a613c5d91906179f2565b8667ffffffffffffffff166201518065010000000000613c7d9190616800565b613c879190616800565b613c919190616800565b6001670de0b6b3a7640000613ca69190616800565b6002613cb29190616800565b613cbc919061711c565b9050613d3b565b8567ffffffffffffffff166201518065010000000000613ce39190616800565b613ced9190616800565b85613cf790617a3c565b600a613d0391906179f2565b6001670de0b6b3a7640000613d189190616800565b6002613d249190616800565b613d2e9190616800565b613d38919061711c565b90505b5f848483613d499190616800565b613d539190616800565b90505f6064600583613d659190616800565b613d6f919061711c565b90505f6064600484613d819190616800565b613d8b919061711c565b9050818a10613da0575f945050505050613dde565b808a10613dbe578982613db39190615b6d565b945050505050613dde565b6064600184613dcd9190616800565b613dd7919061711c565b9450505050505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480613e9457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613e7b61467b565b73ffffffffffffffffffffffffffffffffffffffff1614155b15613ecb576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b613ed561407d565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613f4057506040513d601f19601f82011682018060405250810190613f3d9190617aac565b60015b613f8157816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613f789190615255565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114613fe757806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401613fde919061536c565b60405180910390fd5b613ff183836146ce565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461407b576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b614085614740565b73ffffffffffffffffffffffffffffffffffffffff166140a3612879565b73ffffffffffffffffffffffffffffffffffffffff1614614102576140c6614740565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016140f99190615255565b60405180910390fd5b565b5f61410d6141d5565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f61421760075f8481526020019081526020015f205461182a565b9050919050565b5f6020825f0151511015614267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161425e90617b21565b60405180910390fd5b5f602067ffffffffffffffff8111156142835761428261561f565b5b6040519080825280601f01601f1916602001820160405280156142b55781602001600182028036833780820191505090505b5090505f5b602081101561434d57835f0151816020865f0151516142d99190615b6d565b6142e39190615ed8565b815181106142f4576142f3615ba0565b5b602001015160f81c60f81b82828151811061431257614311615ba0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080806001019150506142ba565b508061435890617b62565b915050919050565b5f8361436d868585614747565b149050949350505050565b5f805f90505f5b848490508110156143f257602085858381811061439f5761439e615ba0565b5b90506020028101906143b19190616f07565b80602001906143c09190616f2e565b90506143cc9190616800565b60406143d89190615ed8565b826143e39190615ed8565b9150808060010191505061437f565b508091505092915050565b5f488261440a9190616800565b90505f60095f8581526020019081526020015f2054602061442b9190616800565b90505f80614437611f99565b915091505f61446585848487600d5f8d81526020019081526020015f2054436144609190615b6d565b613b6a565b9050614470816137fb565b803411156144c8573373ffffffffffffffffffffffffffffffffffffffff166108fc823461449e9190615b6d565b90811502906040515f60405180830381858888f193505050501580156144c6573d5f803e3d5ffd5b505b867f928bbf5188022bf8b9a0e59f5e81e179d0a4c729bdba2856ac971af2063fbf2b8285856040516144fc93929190617bc8565b60405180910390a250505050505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b61453c6147cf565b6145458161480f565b50565b6145506147cf565b565b5f8190505f61456082614893565b90505f8490505f5b828110156145bf575f816001901b856145819190615b6d565b905060045f8981526020019081526020015f205f8281526020019081526020015f2054836145af9190615ed8565b9250508080600101915050614568565b508060045f8881526020019081526020015f205f8681526020019081526020015f2081905550505050505050565b5f8060035f8581526020019081526020015f205f8481526020019081526020015f2054905061461d8484836148b0565b60035f8581526020019081526020015f205f8481526020019081526020015f205f905560025f8581526020019081526020015f205f8481526020019081526020015f205f8082015f61466f9190614eb4565b50508091505092915050565b5f6146a77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61496b565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6146d782614974565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156147335761472d8282614a3d565b5061473c565b61473b614abd565b5b5050565b5f33905090565b5f808390505f5b85518110156147c3575f86828151811061476b5761476a615ba0565b5b602002602001015190505f6002866147839190616ed7565b03614799576147928382614af9565b92506147a6565b6147a38184614af9565b92505b6002856147b3919061711c565b945050808060010191505061474e565b50809150509392505050565b6147d7614b0c565b61480d576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6148176147cf565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614887575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161487e9190615255565b60405180910390fd5b61489081614104565b50565b5f6148a96001836148a49190615ed8565b614b2a565b9050919050565b5f6148cb60055f8681526020019081526020015f20546134a0565b6101006148d89190615b6d565b90505f6148e484614893565b90505b818111158015614907575060055f8681526020019081526020015f205484105b15614964578260045f8781526020019081526020015f205f8681526020019081526020015f205f82825461493b9190615b6d565b92505081905550806001901b846149529190615ed8565b935061495d84614893565b90506148e7565b5050505050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b036149cf57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016149c69190615255565b60405180910390fd5b806149fb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61496b565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051614a6691906164ad565b5f60405180830381855af49150503d805f8114614a9e576040519150601f19603f3d011682016040523d82523d5f602084013e614aa3565b606091505b5091509150614ab3858383614d6f565b9250505092915050565b5f341115614af7576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f614b048383614dfc565b905092915050565b5f614b1561450d565b5f0160089054906101000a900460ff16905090565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115614b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b8590617c6d565b60405180910390fd5b5f61010090505f83614b9f90617c94565b905083811690505f8114614bbc578180614bb8906170f5565b9250505b5f6fffffffffffffffffffffffffffffffff821614614be557608082614be29190615b6d565b91505b5f77ffffffffffffffff0000000000000000ffffffffffffffff821614614c1657604082614c139190615b6d565b91505b5f7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff821614614c4b57602082614c489190615b6d565b91505b5f7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff821614614c8257601082614c7f9190615b6d565b91505b5f7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff821614614cba57600882614cb79190615b6d565b91505b5f7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f821614614cf357600482614cf09190615b6d565b91505b5f7f3333333333333333333333333333333333333333333333333333333333333333821614614d2c57600282614d299190615b6d565b91505b5f7f5555555555555555555555555555555555555555555555555555555555555555821614614d6557600182614d629190615b6d565b91505b8192505050919050565b606082614d8457614d7f82614e45565b614df4565b5f8251148015614daa57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15614dec57836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401614de39190615255565b60405180910390fd5b819050614df5565b5b9392505050565b5f825f528160205260205f60405f60025afa614e16575f80fd5b5f5190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f8116905092915050565b5f81511115614e575780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052805f81526020015f81525090565b6040518060200160405280606081525090565b508054614ec090616409565b5f825580601f10614ed15750614eee565b601f0160209004905f5260205f2090810190614eed9190614ef1565b5b50565b5b80821115614f08575f815f905550600101614ef2565b5090565b5f819050919050565b614f1e81614f0c565b82525050565b5f602082019050614f375f830184614f15565b92915050565b5f604051905090565b5f80fd5b5f80fd5b614f5781614f0c565b8114614f61575f80fd5b50565b5f81359050614f7281614f4e565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112614f9957614f98614f78565b5b8235905067ffffffffffffffff811115614fb657614fb5614f7c565b5b602083019150836020820283011115614fd257614fd1614f80565b5b9250929050565b5f805f60408486031215614ff057614fef614f46565b5b5f614ffd86828701614f64565b935050602084013567ffffffffffffffff81111561501e5761501d614f4a565b5b61502a86828701614f84565b92509250509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61506881614f0c565b82525050565b604082015f8201516150825f85018261505f565b506020820151615095602085018261505f565b50505050565b5f6150a6838361506e565b60408301905092915050565b5f602082019050919050565b5f6150c882615036565b6150d28185615040565b93506150dd83615050565b805f5b8381101561510d5781516150f4888261509b565b97506150ff836150b2565b9250506001810190506150e0565b5085935050505092915050565b5f6020820190508181035f83015261513281846150be565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6151638261513a565b9050919050565b61517381615159565b811461517d575f80fd5b50565b5f8135905061518e8161516a565b92915050565b5f8083601f8401126151a9576151a8614f78565b5b8235905067ffffffffffffffff8111156151c6576151c5614f7c565b5b6020830191508360018202830111156151e2576151e1614f80565b5b9250929050565b5f805f60408486031215615200576151ff614f46565b5b5f61520d86828701615180565b935050602084013567ffffffffffffffff81111561522e5761522d614f4a565b5b61523a86828701615194565b92509250509250925092565b61524f81615159565b82525050565b5f6020820190506152685f830184615246565b92915050565b5f8083601f84011261528357615282614f78565b5b8235905067ffffffffffffffff8111156152a05761529f614f7c565b5b6020830191508360208202830111156152bc576152bb614f80565b5b9250929050565b5f805f805f606086880312156152dc576152db614f46565b5b5f6152e988828901614f64565b955050602086013567ffffffffffffffff81111561530a57615309614f4a565b5b6153168882890161526e565b9450945050604086013567ffffffffffffffff81111561533957615338614f4a565b5b61534588828901615194565b92509250509295509295909350565b5f819050919050565b61536681615354565b82525050565b5f60208201905061537f5f83018461535d565b92915050565b5f6020828403121561539a57615399614f46565b5b5f6153a784828501614f64565b91505092915050565b5f805f805f606086880312156153c9576153c8614f46565b5b5f6153d688828901614f64565b955050602086013567ffffffffffffffff8111156153f7576153f6614f4a565b5b61540388828901614f84565b9450945050604086013567ffffffffffffffff81111561542657615425614f4a565b5b61543288828901615194565b92509250509295509295909350565b5f806040838503121561545757615456614f46565b5b5f61546485828601614f64565b925050602061547585828601614f64565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156154b657808201518184015260208101905061549b565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6154db8261547f565b6154e58185615489565b93506154f5818560208601615499565b6154fe816154c1565b840191505092915050565b5f602083015f8301518482035f86015261552382826154d1565b9150508091505092915050565b5f6020820190508181035f8301526155488184615509565b905092915050565b5f805f806060858703121561556857615567614f46565b5b5f61557587828801614f64565b945050602061558687828801614f64565b935050604085013567ffffffffffffffff8111156155a7576155a6614f4a565b5b6155b387828801615194565b925092505092959194509250565b5f6040820190506155d45f830185615246565b6155e16020830184615246565b9392505050565b5f8115159050919050565b6155fc816155e8565b82525050565b5f6020820190506156155f8301846155f3565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b615655826154c1565b810181811067ffffffffffffffff821117156156745761567361561f565b5b80604052505050565b5f615686614f3d565b9050615692828261564c565b919050565b5f67ffffffffffffffff8211156156b1576156b061561f565b5b6156ba826154c1565b9050602081019050919050565b828183375f83830152505050565b5f6156e76156e284615697565b61567d565b9050828152602081018484840111156157035761570261561b565b5b61570e8482856156c7565b509392505050565b5f82601f83011261572a57615729614f78565b5b813561573a8482602086016156d5565b91505092915050565b5f806040838503121561575957615758614f46565b5b5f61576685828601615180565b925050602083013567ffffffffffffffff81111561578757615786614f4a565b5b61579385828601615716565b9150509250929050565b5f67ffffffffffffffff82169050919050565b6157b98161579d565b82525050565b5f8160030b9050919050565b6157d4816157bf565b82525050565b5f6040820190506157ed5f8301856157b0565b6157fa60208301846157cb565b9392505050565b5f819050919050565b5f61582461581f61581a8461513a565b615801565b61513a565b9050919050565b5f6158358261580a565b9050919050565b5f6158468261582b565b9050919050565b6158568161583c565b82525050565b5f60208201905061586f5f83018461584d565b92915050565b5f806040838503121561588b5761588a614f46565b5b5f61589885828601614f64565b92505060206158a985828601615180565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6158e7838361505f565b60208301905092915050565b5f602082019050919050565b5f615909826158b3565b61591381856158bd565b935061591e836158cd565b805f5b8381101561594e57815161593588826158dc565b9750615940836158f3565b925050600181019050615921565b5085935050505092915050565b5f6020820190508181035f83015261597381846158ff565b905092915050565b5f805f6040848603121561599257615991614f46565b5b5f61599f86828701614f64565b935050602084013567ffffffffffffffff8111156159c0576159bf614f4a565b5b6159cc86828701615194565b92509250509250925092565b5f6020820190506159eb5f8301846157b0565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f615a15826159f1565b615a1f81856159fb565b9350615a2f818560208601615499565b615a38816154c1565b840191505092915050565b5f6020820190508181035f830152615a5b8184615a0b565b905092915050565b5f60208284031215615a7857615a77614f46565b5b5f615a8584828501615180565b91505092915050565b5f8083601f840112615aa357615aa2614f78565b5b8235905067ffffffffffffffff811115615ac057615abf614f7c565b5b602083019150836020820283011115615adc57615adb614f80565b5b9250929050565b5f805f60408486031215615afa57615af9614f46565b5b5f615b0786828701614f64565b935050602084013567ffffffffffffffff811115615b2857615b27614f4a565b5b615b3486828701615a8e565b92509250509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f615b7782614f0c565b9150615b8283614f0c565b9250828203905081811115615b9a57615b99615b40565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4578747261206461746120746f6f206c617267650000000000000000000000005f82015250565b5f615c016014836159fb565b9150615c0c82615bcd565b602082019050919050565b5f6020820190508181035f830152615c2e81615bf5565b9050919050565b7f737962696c20666565206e6f74206d65740000000000000000000000000000005f82015250565b5f615c696011836159fb565b9150615c7482615c35565b602082019050919050565b5f6020820190508181035f830152615c9681615c5d565b9050919050565b5f615ca78261579d565b915067ffffffffffffffff8203615cc157615cc0615b40565b5b600182019050919050565b5f82825260208201905092915050565b5f615ce78385615ccc565b9350615cf48385846156c7565b615cfd836154c1565b840190509392505050565b5f606082019050615d1b5f830187614f15565b615d286020830186615246565b8181036040830152615d3b818486615cdc565b905095945050505050565b7f50726f6f6620736574206e6f74206c69766500000000000000000000000000005f82015250565b5f615d7a6012836159fb565b9150615d8582615d46565b602082019050919050565b5f6020820190508181035f830152615da781615d6e565b9050919050565b7f4d75737420616464206174206c65617374206f6e6520726f6f740000000000005f82015250565b5f615de2601a836159fb565b9150615ded82615dae565b602082019050919050565b5f6020820190508181035f830152615e0f81615dd6565b9050919050565b7f4f6e6c7920746865206f776e65722063616e2061646420726f6f7473000000005f82015250565b5f615e4a601c836159fb565b9150615e5582615e16565b602082019050919050565b5f6020820190508181035f830152615e7781615e3e565b9050919050565b5f80fd5b5f80fd5b5f80fd5b5f82356001604003833603038112615ea557615ea4615e7e565b5b80830191505092915050565b5f82356001602003833603038112615ecc57615ecb615e7e565b5b80830191505092915050565b5f615ee282614f0c565b9150615eed83614f0c565b9250828201905080821115615f0557615f04615b40565b5b92915050565b5f82825260208201905092915050565b5f819050919050565b5f80fd5b5f82356001602003833603038112615f4357615f42615f24565b5b82810191505092915050565b5f80fd5b5f80fd5b5f8083356001602003843603038112615f7357615f72615f24565b5b83810192508235915060208301925067ffffffffffffffff821115615f9b57615f9a615f4f565b5b600182023603831315615fb157615fb0615f53565b5b509250929050565b5f615fc48385615489565b9350615fd18385846156c7565b615fda836154c1565b840190509392505050565b5f60208301615ff65f840184615f57565b8583035f870152616008838284615fb9565b925050508091505092915050565b5f6160246020840184614f64565b905092915050565b5f6040830161603d5f840184615f28565b8482035f86015261604e8282615fe5565b91505061605e6020840184616016565b61606b602086018261505f565b508091505092915050565b5f616081838361602c565b905092915050565b5f823560016040038336030381126160a4576160a3615f24565b5b82810191505092915050565b5f602082019050919050565b5f6160c78385615f0b565b9350836020840285016160d984615f1b565b805f5b8781101561611c5784840389526160f38284616089565b6160fd8582616076565b9450616108836160b0565b925060208a019950506001810190506160dc565b50829750879450505050509392505050565b5f6080820190506161415f830189614f15565b61614e6020830188614f15565b81810360408301526161618186886160bc565b90508181036060830152616176818486615cdc565b9050979650505050505050565b7f4f6e6c7920746865206f776e65722063616e207363686564756c652072656d6f5f8201527f76616c206f6620726f6f74730000000000000000000000000000000000000000602082015250565b5f6161dd602c836159fb565b91506161e882616183565b604082019050919050565b5f6020820190508181035f83015261620a816161d1565b9050919050565b7f546f6f206d616e792072656d6f76616c73207761697420666f72206e657874205f8201527f70726f76696e6720706572696f6420746f207363686564756c65000000000000602082015250565b5f61626b603a836159fb565b915061627682616211565b604082019050919050565b5f6020820190508181035f8301526162988161625f565b9050919050565b7f43616e206f6e6c79207363686564756c652072656d6f76616c206f66206578695f8201527f7374696e6720726f6f7473000000000000000000000000000000000000000000602082015250565b5f6162f9602b836159fb565b91506163048261629f565b604082019050919050565b5f6020820190508181035f830152616326816162ed565b9050919050565b5f80fd5b82818337505050565b5f61634583856158bd565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156163785761637761632d565b5b602083029250616389838584616331565b82840190509392505050565b5f6060820190506163a85f830188614f15565b81810360208301526163bb81868861633a565b905081810360408301526163d0818486615cdc565b90509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061642057607f821691505b602082108103616433576164326163dc565b5b50919050565b5f819050919050565b61645361644e82614f0c565b616439565b82525050565b5f6164648284616442565b60208201915081905092915050565b5f81905092915050565b5f6164878261547f565b6164918185616473565b93506164a1818560208601615499565b80840191505092915050565b5f6164b8828461647d565b915081905092915050565b7f52616e646f6d6e65737320707265636f6d70696c652063616c6c206661696c655f8201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b5f61651d6021836159fb565b9150616528826164c3565b604082019050919050565b5f6020820190508181035f83015261654a81616511565b9050919050565b5f8151905061655f81614f4e565b92915050565b5f6020828403121561657a57616579614f46565b5b5f61658784828501616551565b91505092915050565b7f6f6e6c7920746865206f776e65722063616e206d6f766520746f206e657874205f8201527f70726f76696e6720706572696f64000000000000000000000000000000000000602082015250565b5f6165ea602e836159fb565b91506165f582616590565b604082019050919050565b5f6020820190508181035f830152616617816165de565b9050919050565b7f63616e206f6e6c792073746172742070726f76696e67206f6e6365206c6561765f8201527f6573206172652061646465640000000000000000000000000000000000000000602082015250565b5f616678602c836159fb565b91506166838261661e565b604082019050919050565b5f6020820190508181035f8301526166a58161666c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f6368616c6c656e67652065706f6368206d757374206265206174206c656173745f8201527f206368616c6c656e676546696e616c6974792065706f63687320696e2074686560208201527f2066757475726500000000000000000000000000000000000000000000000000604082015250565b5f6167596047836159fb565b9150616764826166d9565b606082019050919050565b5f6020820190508181035f8301526167868161674d565b9050919050565b5f6080820190506167a05f830188614f15565b6167ad6020830187614f15565b6167ba6040830186614f15565b81810360608301526167cd818486615cdc565b90509695505050505050565b5f6040820190506167ec5f830185614f15565b6167f96020830184614f15565b9392505050565b5f61680a82614f0c565b915061681583614f0c565b925082820261682381614f0c565b9150828204841483151761683a57616839615b40565b5b5092915050565b5f6040820190506168545f83018561535d565b6168616020830184614f15565b9392505050565b5f80fd5b5f8160070b9050919050565b6168818161686c565b811461688b575f80fd5b50565b5f8151905061689c81616878565b92915050565b6168ab8161579d565b81146168b5575f80fd5b50565b5f815190506168c6816168a2565b92915050565b6168d5816157bf565b81146168df575f80fd5b50565b5f815190506168f0816168cc565b92915050565b5f6080828403121561690b5761690a616868565b5b616915608061567d565b90505f6169248482850161688e565b5f830152506020616937848285016168b8565b602083015250604061694b848285016168e2565b604083015250606061695f84828501616551565b60608301525092915050565b5f608082840312156169805761697f614f46565b5b5f61698d848285016168f6565b91505092915050565b7f6661696c656420746f2076616c69646174653a207072696365206d75737420625f8201527f652067726561746572207468616e203000000000000000000000000000000000602082015250565b5f6169f06030836159fb565b91506169fb82616996565b604082019050919050565b5f6020820190508181035f830152616a1d816169e4565b9050919050565b7f4f6e6c79207468652063757272656e74206f776e65722063616e2070726f706f5f8201527f73652061206e6577206f776e6572000000000000000000000000000000000000602082015250565b5f616a7e602e836159fb565b9150616a8982616a24565b604082019050919050565b5f6020820190508181035f830152616aab81616a72565b9050919050565b7f6368616c6c656e676552616e6765202d312073686f756c6420616c69676e20775f8201527f697468207468652076657279206c617374206c656166206f66206120726f6f74602082015250565b5f616b0c6040836159fb565b9150616b1782616ab2565b604082019050919050565b5f6020820190508181035f830152616b3981616b00565b9050919050565b7f70726f6f6620736574206964206f7574206f6620626f756e64730000000000005f82015250565b5f616b74601a836159fb565b9150616b7f82616b40565b602082019050919050565b5f6020820190508181035f830152616ba181616b68565b9050919050565b7f4f6e6c7920746865206f776e65722063616e2064656c6574652070726f6f66205f8201527f7365747300000000000000000000000000000000000000000000000000000000602082015250565b5f616c026024836159fb565b9150616c0d82616ba8565b604082019050919050565b5f6020820190508181035f830152616c2f81616bf6565b9050919050565b5f606082019050616c495f830187614f15565b616c566020830186614f15565b8181036040830152616c69818486615cdc565b905095945050505050565b7f4f6e6c79207468652070726f706f736564206f776e65722063616e20636c61695f8201527f6d206f776e657273686970000000000000000000000000000000000000000000602082015250565b5f616cce602b836159fb565b9150616cd982616c74565b604082019050919050565b5f6020820190508181035f830152616cfb81616cc2565b9050919050565b7f7072656d61747572652070726f6f6600000000000000000000000000000000005f82015250565b5f616d36600f836159fb565b9150616d4182616d02565b602082019050919050565b5f6020820190508181035f830152616d6381616d2a565b9050919050565b7f656d7074792070726f6f660000000000000000000000000000000000000000005f82015250565b5f616d9e600b836159fb565b9150616da982616d6a565b602082019050919050565b5f6020820190508181035f830152616dcb81616d92565b9050919050565b7f6e6f206368616c6c656e6765207363686564756c6564000000000000000000005f82015250565b5f616e066016836159fb565b9150616e1182616dd2565b602082019050919050565b5f6020820190508181035f830152616e3381616dfa565b9050919050565b5f8160c01b9050919050565b5f616e5082616e3a565b9050919050565b616e68616e638261579d565b616e46565b82525050565b5f616e798286616442565b602082019150616e898285616442565b602082019150616e998284616e57565b600882019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f616ee182614f0c565b9150616eec83614f0c565b925082616efc57616efb616eaa565b5b828206905092915050565b5f82356001604003833603038112616f2257616f21615e7e565b5b80830191505092915050565b5f8083356001602003843603038112616f4a57616f49615e7e565b5b80840192508235915067ffffffffffffffff821115616f6c57616f6b615e82565b5b602083019250602082023603831315616f8857616f87615e86565b5b509250929050565b7f70726f6f6620646964206e6f74207665726966790000000000000000000000005f82015250565b5f616fc46014836159fb565b9150616fcf82616f90565b602082019050919050565b5f6020820190508181035f830152616ff181616fb8565b9050919050565b5f60808201905061700b5f830187614f15565b6170186020830186614f15565b6170256040830185614f15565b6170326060830184614f15565b95945050505050565b5f819050919050565b5f61705e6170596170548461703b565b615801565b61579d565b9050919050565b61706e81617044565b82525050565b5f6020820190506170875f830184617065565b92915050565b7f4c65616620696e646578206f7574206f6620626f756e647300000000000000005f82015250565b5f6170c16018836159fb565b91506170cc8261708d565b602082019050919050565b5f6020820190508181035f8301526170ee816170b5565b9050919050565b5f6170ff82614f0c565b91505f820361711157617110615b40565b5b600182039050919050565b5f61712682614f0c565b915061713183614f0c565b92508261714157617140616eaa565b5b828204905092915050565b7f496e636f72726563742066656520616d6f756e740000000000000000000000005f82015250565b5f6171806014836159fb565b915061718b8261714c565b602082019050919050565b5f6020820190508181035f8301526171ad81617174565b9050919050565b50565b5f6171c25f83616473565b91506171cd826171b4565b5f82019050919050565b5f6171e1826171b7565b9150819050919050565b7f4275726e206661696c65640000000000000000000000000000000000000000005f82015250565b5f61721f600b836159fb565b915061722a826171eb565b602082019050919050565b5f6020820190508181035f83015261724c81617213565b9050919050565b7f53697a65206d7573742062652061206d756c7469706c65206f662033320000005f82015250565b5f617287601d836159fb565b915061729282617253565b602082019050919050565b5f6040820190506172b05f830184614f15565b81810360208301526172c18161727b565b905092915050565b7f53697a65206d7573742062652067726561746572207468616e203000000000005f82015250565b5f6172fd601b836159fb565b9150617308826172c9565b602082019050919050565b5f6040820190506173265f830184614f15565b8181036020830152617337816172f1565b905092915050565b7f526f6f742073697a65206d757374206265206c657373207468616e20325e35305f82015250565b5f6173736020836159fb565b915061737e8261733f565b602082019050919050565b5f60408201905061739c5f830184614f15565b81810360208301526173ad81617367565b905092915050565b5f6173bf82614f0c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036173f1576173f0615b40565b5b600182019050919050565b5f808335600160200384360303811261741857617417615e7e565b5b80840192508235915067ffffffffffffffff82111561743a57617439615e82565b5b60208301925060018202360383131561745657617455615e86565b5b509250929050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026174c47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617489565b6174ce8683617489565b95508019841693508086168417925050509392505050565b5f6175006174fb6174f684614f0c565b615801565b614f0c565b9050919050565b5f819050919050565b617519836174e6565b61752d61752582617507565b848454617495565b825550505050565b5f90565b617541617535565b61754c818484617510565b505050565b5b8181101561756f576175645f82617539565b600181019050617552565b5050565b601f8211156175b45761758581617468565b61758e8461747a565b8101602085101561759d578190505b6175b16175a98561747a565b830182617551565b50505b505050565b5f82821c905092915050565b5f6175d45f19846008026175b9565b1980831691505092915050565b5f6175ec83836175c5565b9150826002028217905092915050565b617606838361745e565b67ffffffffffffffff81111561761f5761761e61561f565b5b6176298254616409565b617634828285617573565b5f601f831160018114617661575f841561764f578287013590505b61765985826175e1565b8655506176c0565b601f19841661766f86617468565b5f5b8281101561769657848901358255600182019150602085019450602081019050617671565b868310156176b357848901356176af601f8916826175c5565b8355505b6001600288020188555050505b50505050505050565b6176d48383836175fc565b505050565b5f81015f83016176e981856173fc565b6176f48183866176c9565b505050505050565b61770682826176d9565b5050565b7f6661696c656420746f2076616c69646174653a20657374696d617465642067615f8201527f7320666565206d7573742062652067726561746572207468616e203000000000602082015250565b5f617764603c836159fb565b915061776f8261770a565b604082019050919050565b5f6020820190508181035f83015261779181617758565b9050919050565b7f6661696c656420746f2076616c69646174653a204174746f46494c20707269635f8201527f65206d7573742062652067726561746572207468616e20300000000000000000602082015250565b5f6177f26038836159fb565b91506177fd82617798565b604082019050919050565b5f6020820190508181035f83015261781f816177e6565b9050919050565b7f6661696c656420746f2076616c69646174653a207261772073697a65206d75735f8201527f742062652067726561746572207468616e203000000000000000000000000000602082015250565b5f6178806033836159fb565b915061788b82617826565b604082019050919050565b5f6020820190508181035f8301526178ad81617874565b9050919050565b5f8160011c9050919050565b5f808291508390505b6001851115617909578086048111156178e5576178e4615b40565b5b60018516156178f45780820291505b8081029050617902856178b4565b94506178c9565b94509492505050565b5f8261792157600190506179dc565b8161792e575f90506179dc565b8160018114617944576002811461794e5761797d565b60019150506179dc565b60ff8411156179605761795f615b40565b5b8360020a91508482111561797757617976615b40565b5b506179dc565b5060208310610133831016604e8410600b84101617156179b25782820a9050838111156179ad576179ac615b40565b5b6179dc565b6179bf84848460016178c0565b925090508184048111156179d6576179d5615b40565b5b81810290505b9392505050565b5f63ffffffff82169050919050565b5f6179fc82614f0c565b9150617a07836179e3565b9250617a347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484617912565b905092915050565b5f617a46826157bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000008203617a7857617a77615b40565b5b815f039050919050565b617a8b81615354565b8114617a95575f80fd5b50565b5f81519050617aa681617a82565b92915050565b5f60208284031215617ac157617ac0614f46565b5b5f617ace84828501617a98565b91505092915050565b7f436964206461746120697320746f6f2073686f727400000000000000000000005f82015250565b5f617b0b6015836159fb565b9150617b1682617ad7565b602082019050919050565b5f6020820190508181035f830152617b3881617aff565b9050919050565b5f819050602082019050919050565b5f617b598251615354565b80915050919050565b5f617b6c8261547f565b82617b7684617b3f565b9050617b8181617b4e565b92506020821015617bc157617bbc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802617489565b831692505b5050919050565b5f606082019050617bdb5f830186614f15565b617be860208301856157b0565b617bf560408301846157cb565b949350505050565b7f496e7075742065786365656473206d6178696d756d20696e743235362076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f617c576022836159fb565b9150617c6282617bfd565b604082019050919050565b5f6020820190508181035f830152617c8481617c4b565b9050919050565b5f819050919050565b5f617c9e82617c8b565b91507f80000000000000000000000000000000000000000000000000000000000000008203617cd057617ccf615b40565b5b815f03905091905056fea264697066735822122033620393606d94f1c8d591222f06f6214eafe22531657caf6478a039d4cfa51864736f6c63430008170033","sourceMap":"1708:31540:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2142:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31969:511;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13160:1027;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1806:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15412:981;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2046:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1935:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2390:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9892:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17418:922;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10634:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9181:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23615:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25066:2013;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2510:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10149:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;8404:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22003:452;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4161:214:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32769:477:17;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3708:134:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2198:46:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2250:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9649:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12021:517;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11506:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3155:101:0;;;;;;;;;;;;;:::i;:::-;;8689:441:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14259:848;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11220:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2441:144:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7976:96:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10905:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1988:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1819:58:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1891:38:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9418:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12544:430;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2566:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3405:215:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18696:3301:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8149:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7830:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10371:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7269:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2142:50;2188:4;2142:50;:::o;31969:511::-;32057:24;32183:11;32203:29;32214:10;:17;32225:5;32214:17;;;;;;;;;;;;32203:10;:29::i;:::-;32197:3;:35;;;;:::i;:::-;32183:49;;32242:31;32298:10;;:17;;32276:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;32242:74;;32331:9;32326:125;32350:10;;:17;;32346:1;:21;32326:125;;;32400:40;32414:5;32421:10;;32432:1;32421:13;;;;;;;:::i;:::-;;;;;;;;32436:3;32400:13;:40::i;:::-;32388:6;32395:1;32388:9;;;;;;;;:::i;:::-;;;;;;;:52;;;;32369:3;;;;;;;32326:125;;;;32467:6;32460:13;;;;31969:511;;;;;:::o;13160:1027::-;13256:7;2188:4;13283:9;;:16;;:39;;13275:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;13357:16;13376:18;:16;:18::i;:::-;13357:37;;13425:8;13412:9;:21;;13404:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;13465:17;13473:8;13465:7;:17::i;:::-;13508:8;13496:9;:20;13492:139;;;13578:10;13570:28;;:50;13611:8;13599:9;:20;;;;:::i;:::-;13570:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13492:139;13641:13;13657:14;;:16;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13641:32;;;;13710:1;13683:17;:24;13701:5;13683:24;;;;;;;;;;;:28;;;;2559:1;13721:18;:25;13740:5;13721:25;;;;;;;;;;;:50;;;;13855:10;13832:13;:20;13846:5;13832:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;13901:12;13875:16;:23;13892:5;13875:23;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;2608:1;13923:23;:30;13947:5;13923:30;;;;;;;;;;;:48;;;;14010:1;13986:26;;:12;:26;;;13982:128;;14040:12;14028:41;;;14070:5;14077:10;14089:9;;14028:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13982:128;14147:10;14124:34;;14140:5;14124:34;;;;;;;;;;14175:5;14168:12;;;;13160:1027;;;;;:::o;1806:79::-;1843:42;1806:79;:::o;15412:981::-;15517:7;2188:4;15544:9;;:16;;:39;;15536:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15626:19;15639:5;15626:12;:19::i;:::-;15618:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;15704:1;15686:8;;:15;;:19;15678:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;15778:10;15754:34;;:13;:20;15768:5;15754:20;;;;;;;;;;;;;;;;;;;;;:34;;;15746:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;15831:18;15852:10;:17;15863:5;15852:17;;;;;;;;;;;;15831:38;;15879:24;15920:8;;:15;;15906:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15879:57;;15953:9;15948:171;15972:8;;:15;;15968:1;:19;15948:171;;;16008:59;16019:5;16026:1;16029:8;;16038:1;16029:11;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:16;;;;;;;;:::i;:::-;16047:8;;16056:1;16047:11;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:19;;;16008:10;:59::i;:::-;;16107:1;16094:10;:14;;;;:::i;:::-;16081:7;16089:1;16081:10;;;;;;;;:::i;:::-;;;;;;;:27;;;;;15989:3;;;;;;;15948:171;;;;16144:5;16133:26;16151:7;16133:26;;;;;;:::i;:::-;;;;;;;;16170:20;16193:16;:23;16210:5;16193:23;;;;;;;;;;;;;;;;;;;;;16170:46;;16254:1;16230:26;;:12;:26;;;16226:133;;16284:12;16272:36;;;16309:5;16316:10;16328:8;;16338:9;;16272:76;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16226:133;16376:10;16369:17;;;;;15412:981;;;;;;;:::o;2046:90::-;2094:42;2046:90;:::o;1935:47::-;1975:7;1935:47;:::o;2390:114::-;2438:66;2390:114;;;:::o;9892:181::-;9957:7;9984:19;9997:5;9984:12;:19::i;:::-;9976:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;10043:16;:23;10060:5;10043:23;;;;;;;;;;;;;;;;;;;;;10036:30;;9892:181;;;:::o;17418:922::-;2188:4;17538:9;;:16;;:39;;17530:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;17620:19;17633:5;17620:12;:19::i;:::-;17612:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;17704:10;17680:34;;:13;:20;17694:5;17680:20;;;;;;;;;;;;;;;;;;;;;:34;;;17672:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;2036:4;17798:17;:24;17816:5;17798:24;;;;;;;;;;;:31;;;;17781:7;;:14;;:48;;;;:::i;:::-;:73;;17773:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;17933:9;17928:210;17952:7;;:14;;17948:1;:18;17928:210;;;18007:10;:17;18018:5;18007:17;;;;;;;;;;;;17994:7;;18002:1;17994:10;;;;;;;:::i;:::-;;;;;;;;:30;17986:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;18086:17;:24;18104:5;18086:24;;;;;;;;;;;18116:7;;18124:1;18116:10;;;;;;;:::i;:::-;;;;;;;;18086:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17968:3;;;;;;;17928:210;;;;18148:20;18171:16;:23;18188:5;18171:23;;;;;;;;;;;;;;;;;;;;;18148:46;;18232:1;18208:26;;:12;:26;;;18204:130;;18262:12;18250:46;;;18297:5;18304:7;;18313:9;;18250:73;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18204:130;17520:820;17418:922;;;;;:::o;10634:196::-;10706:15;;:::i;:::-;10741:19;10754:5;10741:12;:19::i;:::-;10733:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;10800:8;:15;10809:5;10800:15;;;;;;;;;;;:23;10816:6;10800:23;;;;;;;;;;;10793:30;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10634:196;;;;:::o;9181:183::-;9247:7;9274:19;9287:5;9274:12;:19::i;:::-;9266:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;9333:17;:24;9351:5;9333:24;;;;;;;;;;;;9326:31;;9181:183;;;:::o;23615:406::-;23674:7;23725:12;23739:19;2094:42;23762:32;;23812:5;23795:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;23762:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23724:95;;;;23882:7;23874:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;23996:6;23985:29;;;;;;;;;;;;:::i;:::-;23978:36;;;;23615:406;;;:::o;25066:2013::-;2188:4;25183:9;;:16;;:39;;25175:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;25279:13;:20;25293:5;25279:20;;;;;;;;;;;;;;;;;;;;;25265:34;;:10;:34;;;25257:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;25395:1;25368:17;:24;25386:5;25368:24;;;;;;;;;;;;:28;25360:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;2608:1;25468:23;:30;25492:5;25468:30;;;;;;;;;;;;:49;25464:125;;25566:12;25533:23;:30;25557:5;25533:30;;;;;;;;;;;:45;;;;25464:125;25648:26;25677:17;:24;25695:5;25677:24;;;;;;;;;;;25648:53;;25711:34;25762:8;:15;;;;25748:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25711:67;;25794:9;25789:160;25813:17;:24;25809:1;:28;25789:160;;;25881:8;25908:1;25890:8;:15;;;;:19;;;;:::i;:::-;25881:29;;;;;;;;:::i;:::-;;;;;;;;;;25858:17;25876:1;25858:20;;;;;;;;:::i;:::-;;;;;;;:52;;;;;25924:8;:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25839:3;;;;;;;25789:160;;;;25959:37;25971:5;25978:17;25959:11;:37::i;:::-;26024:5;26011:38;26031:17;26011:38;;;;;;:::i;:::-;;;;;;;;26138:17;:24;26156:5;26138:24;;;;;;;;;;;;26114:14;:21;26129:5;26114:21;;;;;;;;;;;:48;;;;26208:17;;26193:12;:32;;;;:::i;:::-;26176:14;:49;26172:161;;;26241:81;;;;;;;;;;:::i;:::-;;;;;;;;26172:161;26370:14;26342:18;:25;26361:5;26342:25;;;;;;;;;;;:42;;;;26576:1;26548:17;:24;26566:5;26548:24;;;;;;;;;;;;:29;26544:211;;26612:5;26598:20;;;;;;;;;;2608:1;26632:23;:30;26656:5;26632:30;;;;;;;;;;;:48;;;;2559:1;26694:18;:25;26713:5;26694:25;;;;;;;;;;;:50;;;;26544:211;26765:20;26788:16;:23;26805:5;26788:23;;;;;;;;;;;;;;;;;;;;;26765:46;;26849:1;26825:26;;:12;:26;;;26821:171;;26879:12;26867:43;;;26911:5;26918:18;:25;26937:5;26918:25;;;;;;;;;;;;26945:17;:24;26963:5;26945:24;;;;;;;;;;;;26971:9;;26867:114;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26821:171;27024:5;27006:66;27031:14;27047:17;:24;27065:5;27047:24;;;;;;;;;;;;27006:66;;;;;;;:::i;:::-;;;;;;;;25165:1914;;;25066:2013;;;;:::o;2510:50::-;2559:1;2510:50;:::o;10149:216::-;10211:7;10220;10247:19;10260:5;10247:12;:19::i;:::-;10239:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;10307:13;:20;10321:5;10307:20;;;;;;;;;;;;;;;;;;;;;10329:21;:28;10351:5;10329:28;;;;;;;;;;;;;;;;;;;;;10299:59;;;;10149:216;;;:::o;8404:186::-;8474:4;8497:19;8510:5;8497:12;:19::i;:::-;:49;;;;;8529:10;:17;8540:5;8529:17;;;;;;;;;;;;8520:6;:26;8497:49;:86;;;;;8582:1;8550:14;:21;8565:5;8550:21;;;;;;;;;;;:29;8572:6;8550:29;;;;;;;;;;;;:33;8497:86;8490:93;;8404:186;;;;:::o;22003:452::-;22091:7;22110:15;22133:14;:21;22148:5;22133:21;;;;;;;;;;;;22128:2;:26;;;;:::i;:::-;22110:44;;22165:18;22185:21;22210:16;:14;:16::i;:::-;22164:62;;;;22244:204;22289:15;22318:11;22343:15;22372:7;22408:23;:30;22432:5;22408:30;;;;;;;;;;;;22393:12;:45;;;;:::i;:::-;22244:31;:204::i;:::-;22237:211;;;;;22003:452;;;;:::o;4161:214:2:-;2655:13;:11;:13::i;:::-;4276:36:::1;4294:17;4276;:36::i;:::-;4322:46;4344:17;4363:4;4322:21;:46::i;:::-;4161:214:::0;;:::o;32769:477:17:-;32816:6;32824:5;32890:34;2285:42;32927:24;;;2438:66;32965:21;;2239:5;32927:97;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32890:134;;33060:1;33042:9;:15;;;:19;;;33034:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;33206:9;:15;;;33224:9;:14;;;33191:48;;;;;32769:477;;:::o;3708:134:2:-;3777:7;2926:20;:18;:20::i;:::-;811:66:6::1;3803:32:2;;3796:39;;3708:134:::0;:::o;2198:46:17:-;2239:5;2198:46;:::o;2250:78::-;2285:42;2250:78;:::o;9649:185::-;9716:7;9743:19;9756:5;9743:12;:19::i;:::-;9735:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;9802:18;:25;9821:5;9802:25;;;;;;;;;;;;9795:32;;9649:185;;;:::o;12021:517::-;12109:19;12122:5;12109:12;:19::i;:::-;12101:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;12161:13;12177;:20;12191:5;12177:20;;;;;;;;;;;;;;;;;;;;;12161:36;;12224:10;12215:19;;:5;:19;;;12207:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;12308:8;12299:17;;:5;:17;;;12295:237;;12423:21;:28;12445:5;12423:28;;;;;;;;;;;;12416:35;;;;;;;;;;;12295:237;;;12513:8;12482:21;:28;12504:5;12482:28;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;12295:237;12091:447;12021:517;;:::o;11506:406::-;11572:16;11608:19;11621:5;11608:12;:19::i;:::-;11600:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;11660:26;11689:17;:24;11707:5;11689:24;;;;;;;;;;;11660:53;;11723:23;11763:8;:15;;;;11749:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11723:56;;11794:9;11789:94;11813:8;:15;;;;11809:1;:19;11789:94;;;11861:8;11870:1;11861:11;;;;;;;;:::i;:::-;;;;;;;;;;11849:6;11856:1;11849:9;;;;;;;;:::i;:::-;;;;;;;:23;;;;;11830:3;;;;;;;11789:94;;;;11899:6;11892:13;;;;11506:406;;;:::o;3155:101:0:-;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;:::-;3155:101::o:0;8689:441:17:-;8767:4;8783:11;8803:29;8814:10;:17;8825:5;8814:17;;;;;;;;;;;;8803:10;:29::i;:::-;8797:3;:35;;;;:::i;:::-;8783:49;;8842:26;8871:50;8885:5;8914:1;8892:14;:21;8907:5;8892:21;;;;;;;;;;;;:23;;;;:::i;:::-;8917:3;8871:13;:50::i;:::-;8842:79;;8989:1;8953:14;:21;8968:5;8953:21;;;;;;;;;;;:33;8975:3;:10;;;8953:33;;;;;;;;;;;;:37;;;;:::i;:::-;8939:3;:10;;;:51;8931:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;9076:23;9085:5;9092:6;9076:8;:23::i;:::-;:47;;;;;9113:3;:10;;;9103:6;:20;;9076:47;9069:54;;;;8689:441;;;;:::o;14259:848::-;2188:4;14349:9;;:16;;:39;;14341:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;14436:14;;;;;;;;;;;14427:23;;:5;:23;14423:90;;14466:36;;;;;;;;;;:::i;:::-;;;;;;;;14423:90;14555:10;14531:34;;:13;:20;14545:5;14531:20;;;;;;;;;;;;;;;;;;;;;:34;;;14523:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;14616:24;14643:17;:24;14661:5;14643:24;;;;;;;;;;;;14616:51;;14704:1;14677:17;:24;14695:5;14677:24;;;;;;;;;;;:28;;;;14746:1;14715:13;:20;14729:5;14715:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14786:1;14758:18;:25;14777:5;14758:25;;;;;;;;;;;:29;;;;2608:1;14797:23;:30;14821:5;14797:30;;;;;;;;;;;:48;;;;14856:20;14879:16;:23;14896:5;14879:23;;;;;;;;;;;;;;;;;;;;;14856:46;;14940:1;14916:26;;:12;:26;;;14912:134;;14970:12;14958:41;;;15000:5;15007:16;15025:9;;14958:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14912:134;15076:5;15060:40;15083:16;15060:40;;;;;;:::i;:::-;;;;;;;;14331:776;;14259:848;;;:::o;11220:177::-;11283:7;11310:19;11323:5;11310:12;:19::i;:::-;11302:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;11369:14;:21;11384:5;11369:21;;;;;;;;;;;;11362:28;;11220:177;;;:::o;2441:144:0:-;2487:7;2506:24;2533:20;:18;:20::i;:::-;2506:47;;2570:1;:8;;;;;;;;;;;;2563:15;;;2441:144;:::o;7976:96:17:-;8026:6;8051:14;;;;;;;;;;;8044:21;;7976:96;:::o;10905:200::-;10983:7;11010:19;11023:5;11010:12;:19::i;:::-;11002:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;11069:14;:21;11084:5;11069:21;;;;;;;;;;;:29;11091:6;11069:29;;;;;;;;;;;;11062:36;;10905:200;;;;:::o;1988:52::-;2036:4;1988:52;:::o;1819:58:2:-;;;;;;;;;;;;;;;;;;;:::o;1891:38:17:-;1927:2;1891:38;:::o;9418:169::-;9477:7;9504:19;9517:5;9504:12;:19::i;:::-;9496:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;9563:10;:17;9574:5;9563:17;;;;;;;;;;;;9556:24;;9418:169;;;:::o;12544:430::-;12616:19;12629:5;12616:12;:19::i;:::-;12608:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;12708:10;12676:42;;:21;:28;12698:5;12676:28;;;;;;;;;;;;;;;;;;;;;:42;;;12668:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;12776:16;12795:13;:20;12809:5;12795:20;;;;;;;;;;;;;;;;;;;;;12776:39;;12848:10;12825:13;:20;12839:5;12825:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;12875:21;:28;12897:5;12875:28;;;;;;;;;;;;12868:35;;;;;;;;;;;12956:10;12918:49;;12946:8;12918:49;;12939:5;12918:49;;;;;;;;;;12598:376;12544:430;:::o;2566:43::-;2608:1;2566:43;:::o;3405:215:0:-;2334:13;:11;:13::i;:::-;3509:1:::1;3489:22;;:8;:22;;::::0;3485:91:::1;;3562:1;3534:31;;;;;;;;;;;:::i;:::-;;;;;;;;3485:91;3585:28;3604:8;3585:18;:28::i;:::-;3405:215:::0;:::o;18696:3301:17:-;18785:18;18806:9;18785:30;;18847:13;:20;18861:5;18847:20;;;;;;;;;;;;;;;;;;;;;18833:34;;:10;:34;;;18825:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;18928:22;18953:18;:25;18972:5;18953:25;;;;;;;;;;;;18928:50;;19012:14;18996:12;:30;;18988:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;19080:1;19064:6;;:13;;:17;19056:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2559:1;19115:14;:40;19107:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;19192:35;19252:6;;:13;;19230:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;19192:74;;19285:12;19300:24;19318:5;19300:17;:24::i;:::-;19285:39;;19334:17;19354:14;:21;19369:5;19354:21;;;;;;;;;;;;19334:41;;19385:18;19412:29;19423:10;:17;19434:5;19423:17;;;;;;;;;;;;19412:10;:29::i;:::-;19406:3;:35;;;;:::i;:::-;19385:56;;19456:8;19451:1695;19474:6;;:13;;19470:1;:17;;;19451:1695;;;20584:20;20624:4;20630:5;20637:1;20607:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20584:55;;20653:20;20706:9;20694:7;20684:18;;;;;;20676:27;;:39;;;;:::i;:::-;20653:62;;20840:46;20854:5;20861:12;20875:10;20840:13;:46::i;:::-;20824:10;20835:1;20824:13;;;;;;;;;;:::i;:::-;;;;;;;:62;;;;20900:16;20919:59;20938:39;20949:5;20956:10;20967:1;20956:13;;;;;;;;;;:::i;:::-;;;;;;;;:20;;;20938:10;:39::i;:::-;20919:18;:59::i;:::-;20900:78;;20992:7;21002:84;21022:6;;21029:1;21022:9;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:15;;;;;;;;:::i;:::-;21002:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21039:8;21049:6;;21056:1;21049:9;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:14;;;21065:10;21076:1;21065:13;;;;;;;;;;:::i;:::-;;;;;;;;:20;;;21002:19;:84::i;:::-;20992:94;;21108:2;21100:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;19494:1652;;;;19489:3;;;;;:::i;:::-;;;;19451:1695;;;;21526:15;21611:4;21605:2;21573:29;21595:6;;21573:21;:29::i;:::-;:34;;;;:::i;:::-;21572:43;;;;:::i;:::-;21558:9;21545:10;:22;;;;:::i;:::-;21544:72;;;;:::i;:::-;21526:90;;21626:40;21651:5;21658:7;21626:24;:40::i;:::-;21677:20;21700:16;:23;21717:5;21700:23;;;;;;;;;;;;;;;;;;;;;21677:46;;21761:1;21737:26;;:12;:26;;;21733:153;;21791:12;21779:42;;;21822:5;21829:17;:24;21847:5;21829:24;;;;;;;;;;;;21855:4;21861:6;;:13;;21779:96;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21733:153;21928:12;21895:23;:30;21919:5;21895:30;;;;;;;;;;;:45;;;;21972:5;21955:35;21979:10;21955:35;;;;;;:::i;:::-;;;;;;;;18775:3222;;;;;;;;18696:3301;;;:::o;8149:148::-;8207:4;8238:14;;;;;;;;;;;8230:22;;:5;:22;:60;;;;;8288:1;8256:34;;:13;:20;8270:5;8256:20;;;;;;;;;;;;;;;;;;;;;:34;;;;8230:60;8223:67;;8149:148;;;:::o;7830:103::-;7883:7;7909:17;;7902:24;;7830:103;:::o;10371:195::-;10443:7;10470:19;10483:5;10470:12;:19::i;:::-;10462:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;10529:23;:30;10553:5;10529:30;;;;;;;;;;;;10522:37;;10371:195;;;:::o;7269:192::-;4158:30:1;4191:26;:24;:26::i;:::-;4158:59;;4279:19;4302:1;:15;;;;;;;;;;;;4301:16;4279:38;;4327:18;4348:1;:14;;;;;;;;;;;;4327:35;;4706:17;4741:1;4726:11;:16;;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4805:1;4790:11;:16;;;:50;;;;;4839:1;4818:4;4810:25;;;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;;;;;;;;;;;;;4851:91;4968:1;4951;:14;;;:18;;;;;;;;;;;;;;;;;;4983:14;4979:67;;;5031:4;5013:1;:15;;;:22;;;;;;;;;;;;;;;;;;4979:67;7346:26:17::1;7361:10;7346:14;:26::i;:::-;7382:24;:22;:24::i;:::-;7436:18;7416:17;:38;;;;5070:14:1::0;5066:101;;;5118:5;5100:1;:15;;;:23;;;;;;;;;;;;;;;;;;5142:14;5154:1;5142:14;;;;;;:::i;:::-;;;;;;;;5066:101;4092:1081;;;;;7269:192:17;:::o;189:563:14:-;236:7;255:9;267:3;255:15;;280:9;309:3;304:1;:8;;300:12;;323:1;318;:6;314:32;;333:3;328:8;;;;;:::i;:::-;;;342:1;338:5;;314:32;364:2;359:1;:7;;355:11;;378:1;373;:6;369:32;;388:2;383:7;;;;;:::i;:::-;;;397:1;393:5;;369:32;419:2;414:1;:7;;410:11;;433:1;428;:6;424:32;;443:2;438:7;;;;;:::i;:::-;;;452:1;448:5;;424:32;474:2;469:1;:7;;465:11;;488:1;483;:6;479:32;;498:2;493:7;;;;;:::i;:::-;;;507:1;503:5;;479:32;529:1;524;:6;;520:10;;543:1;538;:6;534:32;;553:1;548:6;;;;;:::i;:::-;;;562:1;558:5;;534:32;584:1;579;:6;;575:10;;598:1;593;:6;589:32;;608:1;603:6;;;;;:::i;:::-;;;617:1;613:5;;589:32;639:1;634;:6;;630:10;;653:1;648;:6;644:32;;663:1;658:6;;;;;:::i;:::-;;;672:1;668:5;;644:32;694:1;689;:6;;685:10;;708:1;703;:6;699:24;;722:1;718;:5;;;;:::i;:::-;711:12;;;;;;699:24;744:1;740;:5;;;;:::i;:::-;733:12;;;;189:563;;;;:::o;30599:1307:17:-;30692:22;;:::i;:::-;30746:17;:24;30764:5;30746:24;;;;;;;;;;;;30734:9;:36;30726:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30809:17;30842:1;30835:3;30830:1;:8;;30829:14;;;;:::i;:::-;30809:34;;30853:11;30973:17;31005:9;31017:3;31005:15;;31000:616;31026:1;31022;:5;31000:616;;;31169:10;:17;31180:5;31169:17;;;;;;;;;;;;31156:9;:30;31152:120;;31229:1;31225;:5;;;;:::i;:::-;31219:1;:12;;31206:25;;;;;:::i;:::-;;;31249:8;;31152:120;31304:13;:20;31318:5;31304:20;;;;;;;;;;;:31;31325:9;31304:31;;;;;;;;;;;;31298:3;:37;;;;:::i;:::-;31286:49;;31390:9;31377;:22;31373:233;;31426:13;:20;31440:5;31426:20;;;;;;;;;;;:31;31447:9;31426:31;;;;;;;;;;;;31419:38;;;;;:::i;:::-;;;31498:1;31494;:5;;;;:::i;:::-;31488:1;:12;;31475:25;;;;;:::i;:::-;;;31373:233;;;31589:1;31585;:5;;;;:::i;:::-;31579:1;:12;;31566:25;;;;;:::i;:::-;;;31373:233;31000:616;31029:3;;;;;:::i;:::-;;;;31000:616;;;;31643:13;:20;31657:5;31643:20;;;;;;;;;;;:31;31664:9;31643:31;;;;;;;;;;;;31637:3;:37;;;;:::i;:::-;31625:49;;31701:9;31688;:22;31684:141;;31761:53;;;;;;;;31789:1;31777:9;:13;;;;:::i;:::-;31761:53;;;;31804:9;31792;:21;;;;:::i;:::-;31761:53;;;31754:60;;;;;;;31684:141;31856:43;;;;;;;;31872:9;31856:43;;;;31895:3;31883:9;:15;;;;:::i;:::-;31856:43;;;31849:50;;;;;30599:1307;;;;;;:::o;3623:85:16:-;3666:7;354:2;228:1;270:4;:15;;;;:::i;:::-;336:20;;;;:::i;:::-;3685:16;;3623:85;:::o;7557:215:17:-;7630:6;7617:9;:19;;7609:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;7672:12;1843:42;7690:15;;7713:6;7690:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7671:53;;;7742:7;7734:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;7599:173;7557:215;:::o;16449:793::-;16560:7;16606:1;1927:2;16583:7;:19;;;;:::i;:::-;:24;16579:116;;16643:7;16630:54;;;;;;;;;;;:::i;:::-;;;;;;;;16579:116;16719:1;16708:7;:12;16704:102;;16756:7;16743:52;;;;;;;;;;;:::i;:::-;;;;;;;;16704:102;1975:7;16819;:23;16815:118;;;16878:7;16865:57;;;;;;;;;;;:::i;:::-;;;;;;;;16815:118;16943:17;1927:2;16963:7;:19;;;;:::i;:::-;16943:39;;16992:14;17009:10;:17;17020:5;17009:17;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;16992:36;;17038;17049:5;17056:9;17067:6;17038:10;:36::i;:::-;17110:4;17084:8;:15;17093:5;17084:15;;;;;;;;;;;:23;17100:6;17084:23;;;;;;;;;;;:30;;;;;;:::i;:::-;;;;17156:9;17124:14;:21;17139:5;17124:21;;;;;;;;;;;:29;17146:6;17124:29;;;;;;;;;;;:41;;;;17203:9;17175:17;:24;17193:5;17175:24;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;17229:6;17222:13;;;;16449:793;;;;;;:::o;27132:342::-;27221:19;27234:5;27221:12;:19::i;:::-;27213:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;27273:18;27310:9;27305:115;27329:7;:14;27325:1;:18;27305:115;;;27377:32;27391:5;27398:7;27406:1;27398:10;;;;;;;;:::i;:::-;;;;;;;;27377:13;:32::i;:::-;27363:46;;;;;:::i;:::-;;;27345:3;;;;;;;27305:115;;;;27457:10;27429:17;:24;27447:5;27429:24;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;27203:271;27132:342;;:::o;1662:1834:16:-;1885:7;1938:1;1920:15;:19;:41;;;;1960:1;1943:13;:18;1920:41;1912:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;2058:1;2044:11;:15;;;2036:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;2148:1;2138:7;:11;2130:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2276:29;2338:1;2319:15;:20;;;2315:452;;2522:15;2509:2;:29;;;;:::i;:::-;2494:11;2460:45;;1018:5;903:7;2460:31;;;;:::i;:::-;:45;;;;:::i;:::-;:79;;;;:::i;:::-;228:1;270:4;:15;;;;:::i;:::-;496:1;2380:58;;;;:::i;:::-;2379:161;;;;:::i;:::-;2355:185;;2315:452;;;2744:11;2710:45;;1018:5;903:7;2710:31;;;;:::i;:::-;:45;;;;:::i;:::-;2672:15;2671:16;;;:::i;:::-;2658:2;:30;;;;:::i;:::-;228:1;270:4;:15;;;;:::i;:::-;496:1;2596:58;;;;:::i;:::-;:93;;;;:::i;:::-;2595:161;;;;:::i;:::-;2571:185;;2315:452;2834:30;2906:7;2891:12;2867:21;:36;;;;:::i;:::-;:46;;;;:::i;:::-;2834:79;;2956:21;3036:3;792:1;2981:22;:51;;;;:::i;:::-;2980:59;;;;:::i;:::-;2956:83;;3049:20;3127:3;682:1;3073:22;:50;;;;:::i;:::-;3072:58;;;;:::i;:::-;3049:81;;3164:13;3145:15;:32;3141:349;;3200:1;3193:8;;;;;;;;3141:349;3289:12;3270:15;:31;3266:224;;3340:15;3324:13;:31;;;;:::i;:::-;3317:38;;;;;;;;3266:224;3476:3;574:1;3427:22;:45;;;;:::i;:::-;3426:53;;;;:::i;:::-;3419:60;;;;;;1662:1834;;;;;;;;:::o;4603:312:2:-;4692:6;4675:23;;4683:4;4675:23;;;:120;;;;4789:6;4753:42;;:32;:30;:32::i;:::-;:42;;;;4675:120;4658:251;;;4869:29;;;;;;;;;;;;;;4658:251;4603:312::o;7467:84:17:-;2334:13:0;:11;:13::i;:::-;7467:84:17;:::o;6057:538:2:-;6174:17;6156:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;6152:437;;6560:17;6518:60;;;;;;;;;;;:::i;:::-;;;;;;;;6152:437;811:66:6;6258:32:2;;6250:4;:40;6246:120;;6346:4;6317:34;;;;;;;;;;;:::i;:::-;;;;;;;;6246:120;6379:54;6409:17;6428:4;6379:29;:54::i;:::-;6209:235;6057:538;;:::o;5032:213::-;5115:6;5098:23;;5106:4;5098:23;;;5094:145;;5199:29;;;;;;;;;;;;;;5094:145;5032:213::o;2658:162:0:-;2728:12;:10;:12::i;:::-;2717:23;;:7;:5;:7::i;:::-;:23;;;2713:101;;2790:12;:10;:12::i;:::-;2763:40;;;;;;;;;;;:::i;:::-;;;;;;;;2713:101;2658:162::o;3774:248::-;3847:24;3874:20;:18;:20::i;:::-;3847:47;;3904:16;3923:1;:8;;;;;;;;;;;;3904:27;;3952:8;3941:1;:8;;;:19;;;;;;;;;;;;;;;;;;4006:8;3975:40;;3996:8;3975:40;;;;;;;;;;;;3837:185;;3774:248;:::o;1192:159::-;1244:24;1313:22;1303:32;;1192:159;:::o;24028:138:17:-;24093:7;24119:40;24133:18;:25;24152:5;24133:25;;;;;;;;;;;;24119:13;:40::i;:::-;24112:47;;24028:138;;;:::o;274:339:15:-;336:7;382:2;363:3;:8;;;:15;:21;;355:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;420:22;455:2;445:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;420:38;;473:6;468:104;489:2;485:1;:6;468:104;;;527:3;:8;;;559:1;554:2;536:3;:8;;;:15;:20;;;;:::i;:::-;:24;;;;:::i;:::-;527:34;;;;;;;;:::i;:::-;;;;;;;;;;512:9;522:1;512:12;;;;;;;;:::i;:::-;;;;;:49;;;;;;;;;;;493:3;;;;;;;468:104;;;;596:9;588:18;;;:::i;:::-;581:25;;;274:339;;;:::o;951:188:18:-;1060:4;1128;1083:41;1102:5;1109:4;1115:8;1083:18;:41::i;:::-;:49;1076:56;;951:188;;;;;;:::o;23225:384:17:-;23304:7;23323:20;23346:1;23323:24;;23362:9;23357:217;23381:6;;:13;;23377:1;:17;23357:217;;;23560:2;23535:6;;23542:1;23535:9;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:15;;;;;;;;:::i;:::-;:22;;:27;;;;:::i;:::-;23529:2;:34;;;;:::i;:::-;23513:50;;;;;:::i;:::-;;;23396:3;;;;;;;23357:217;;;;23590:12;23583:19;;;23225:384;;;;:::o;22461:758::-;22546:23;22582:13;22572:7;:23;;;;:::i;:::-;22546:49;;22605:15;22628:14;:21;22643:5;22628:21;;;;;;;;;;;;22623:2;:26;;;;:::i;:::-;22605:44;;22660:18;22680:21;22705:16;:14;:16::i;:::-;22659:62;;;;22732:16;22751:204;22796:15;22825:11;22850:15;22879:7;22915:23;:30;22939:5;22915:30;;;;;;;;;;;;22900:12;:45;;;;:::i;:::-;22751:31;:204::i;:::-;22732:223;;22973:17;22981:8;22973:7;:17::i;:::-;23016:8;23004:9;:20;23000:139;;;23086:10;23078:28;;:50;23119:8;23107:9;:20;;;;:::i;:::-;23078:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23000:139;23166:5;23153:59;23173:8;23183:11;23196:15;23153:59;;;;;;;;:::i;:::-;;;;;;;;22536:683;;;;;22461:758;;:::o;8737:170:1:-;8795:30;8870:21;8860:31;;8737:170;:::o;1847:127:0:-;6931:20:1;:18;:20::i;:::-;1929:38:0::1;1954:12;1929:24;:38::i;:::-;1847:127:::0;:::o;2970:67:2:-;6931:20:1;:18;:20::i;:::-;2970:67:2:o;29480:420:17:-;29565:13;29581:6;29565:22;;29597:9;29609:22;29625:5;29609:15;:22::i;:::-;29597:34;;29642:11;29656:5;29642:19;;29726:9;29721:129;29745:1;29741;:5;29721:129;;;29767:9;29793:1;29788;:6;;29779:5;:16;;;;:::i;:::-;29767:28;;29816:13;:20;29830:5;29816:20;;;;;;;;;;;:23;29837:1;29816:23;;;;;;;;;;;;29809:30;;;;;:::i;:::-;;;29753:97;29748:3;;;;;;;29721:129;;;;29890:3;29859:13;:20;29873:5;29859:20;;;;;;;;;;;:28;29880:6;29859:28;;;;;;;;;;;:34;;;;29555:345;;;29480:420;;;:::o;27648:296::-;27720:7;27739:13;27755:14;:21;27770:5;27755:21;;;;;;;;;;;:29;27777:6;27755:29;;;;;;;;;;;;27739:45;;27794:35;27808:5;27815:6;27823:5;27794:13;:35::i;:::-;27846:14;:21;27861:5;27846:21;;;;;;;;;;;:29;27868:6;27846:29;;;;;;;;;;;27839:36;;;27892:8;:15;27901:5;27892:15;;;;;;;;;;;:23;27908:6;27892:23;;;;;;;;;;;;27885:30;;;;;;;;:::i;:::-;;;27932:5;27925:12;;;27648:296;;;;:::o;1441:138:6:-;1493:7;1519:47;811:66;1546:19;;1519:26;:47::i;:::-;:53;;;;;;;;;;;;1512:60;;1441:138;:::o;2264:344::-;2355:37;2374:17;2355:18;:37::i;:::-;2425:17;2407:36;;;;;;;;;;;;2472:1;2458:4;:11;:15;2454:148;;;2489:53;2518:17;2537:4;2489:28;:53::i;:::-;;2454:148;;;2573:18;:16;:18::i;:::-;2454:148;2264:344;;:::o;887:96:3:-;940:7;966:10;959:17;;887:96;:::o;1422:633:18:-;1529:7;1548:20;1571:4;1548:27;;1590:9;1585:435;1609:5;:12;1605:1;:16;1585:435;;;1736:15;1754:5;1760:1;1754:8;;;;;;;;:::i;:::-;;;;;;;;1736:26;;1796:1;1791;1780:8;:12;;;;:::i;:::-;:17;1776:207;;1832:41;1851:12;1865:7;1832:18;:41::i;:::-;1817:56;;1776:207;;;1927:41;1946:7;1955:12;1927:18;:41::i;:::-;1912:56;;1776:207;2008:1;1996:13;;;;;:::i;:::-;;;1628:392;1623:3;;;;;;;1585:435;;;;2036:12;2029:19;;;1422:633;;;;;:::o;7084:141:1:-;7151:17;:15;:17::i;:::-;7146:73;;7191:17;;;;;;;;;;;;;;7146:73;7084:141::o;1980:235:0:-;6931:20:1;:18;:20::i;:::-;2100:1:0::1;2076:26;;:12;:26;;::::0;2072:95:::1;;2153:1;2125:31;;;;;;;;;;;:::i;:::-;;;;;;;;2072:95;2176:32;2195:12;2176:18;:32::i;:::-;1980:235:::0;:::o;32605:117:17:-;32668:7;32694:21;32713:1;32705:5;:9;;;;:::i;:::-;32694:10;:21::i;:::-;32687:28;;32605:117;;;:::o;29944:537::-;30031:11;30059:29;30070:10;:17;30081:5;30070:17;;;;;;;;;;;;30059:10;:29::i;:::-;30053:3;:35;;;;:::i;:::-;30031:58;;30099:9;30119:22;30135:5;30119:15;:22::i;:::-;30099:43;;30299:176;30311:3;30306:1;:8;;:37;;;;;30326:10;:17;30337:5;30326:17;;;;;;;;;;;;30318:5;:25;30306:37;30299:176;;;30390:5;30359:13;:20;30373:5;30359:20;;;;;;;;;;;:27;30380:5;30359:27;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;30423:1;30418;:6;;30409:15;;;;;:::i;:::-;;;30442:22;30458:5;30442:15;:22::i;:::-;30438:26;;30299:176;;;30021:460;;29944:537;;;:::o;1899:163:10:-;1960:21;2042:4;2032:14;;1899:163;;;:::o;1671:281:6:-;1781:1;1748:17;:29;;;:34;1744:119;;1834:17;1805:47;;;;;;;;;;;:::i;:::-;;;;;;;;1744:119;1928:17;1872:47;811:66;1899:19;;1872:26;:47::i;:::-;:53;;;:73;;;;;;;;;;;;;;;;;;1671:281;:::o;3900:253:8:-;3983:12;4008;4022:23;4049:6;:19;;4069:4;4049:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4007:67;;;;4091:55;4118:6;4126:7;4135:10;4091:26;:55::i;:::-;4084:62;;;;3900:253;;;;:::o;6113:122:6:-;6175:1;6163:9;:13;6159:70;;;6199:19;;;;;;;;;;;;;;6159:70;6113:122::o;11407:121:18:-;11473:7;11499:22;11516:1;11519;11499:16;:22::i;:::-;11492:29;;11407:121;;;;:::o;8487:120:1:-;8537:4;8560:26;:24;:26::i;:::-;:40;;;;;;;;;;;;8553:47;;8487:120;:::o;1606:793:14:-;1653:7;1693:16;1680:1;:30;;1672:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:9;1771:3;1759:15;;1786:8;1805:1;1797:10;;;:::i;:::-;1786:21;;1832:1;1821;:13;1817:17;;1853:1;1848;:6;1844:40;;1870:3;;;;;:::i;:::-;;;;1844:40;1912:1;784:66;1897:1;:11;:16;1893:55;;1934:3;1929:8;;;;;:::i;:::-;;;1893:55;1975:1;881:66;1961:1;:10;:15;1957:53;;1997:2;1992:7;;;;;:::i;:::-;;;1957:53;2037:1;978:66;2023:1;:10;:15;2019:53;;2059:2;2054:7;;;;;:::i;:::-;;;2019:53;2099:1;1075:66;2085:1;:10;:15;2081:53;;2121:2;2116:7;;;;;:::i;:::-;;;2081:53;2160:1;1171:66;2147:1;:9;:14;2143:51;;2182:1;2177:6;;;;;:::i;:::-;;;2143:51;2220:1;1267:66;2207:1;:9;:14;2203:51;;2242:1;2237:6;;;;;:::i;:::-;;;2203:51;2280:1;1363:66;2267:1;:9;:14;2263:51;;2302:1;2297:6;;;;;:::i;:::-;;;2263:51;2340:1;1459:66;2327:1;:9;:14;2323:51;;2362:1;2357:6;;;;;:::i;:::-;;;2323:51;2391:1;2384:8;;;;1606:793;;;:::o;4421:582:8:-;4565:12;4594:7;4589:408;;4617:19;4625:10;4617:7;:19::i;:::-;4589:408;;;4862:1;4841:10;:17;:22;:49;;;;;4889:1;4867:6;:18;;;:23;4841:49;4837:119;;;4934:6;4917:24;;;;;;;;;;;:::i;:::-;;;;;;;;4837:119;4976:10;4969:17;;;;4589:408;4421:582;;;;;;:::o;11645:532:18:-;11715:13;11792:1;11786:4;11779:15;11820:1;11814:4;11807:15;11941:4;11935;11929;11923;11918:3;11911:5;11900:46;11890:102;;11976:1;11973;11966:12;11890:102;12033:4;12027:11;12018:20;;12149:11;12142:5;12138:23;12129:32;;11645:532;;;;:::o;5543:487:8:-;5694:1;5674:10;:17;:21;5670:354;;;5871:10;5865:17;5927:15;5914:10;5910:2;5906:19;5899:44;5670:354;5994:19;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:20:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:117::-;1151:1;1148;1141:12;1165:117;1274:1;1271;1264:12;1288:117;1397:1;1394;1387:12;1428:568;1501:8;1511:6;1561:3;1554:4;1546:6;1542:17;1538:27;1528:122;;1569:79;;:::i;:::-;1528:122;1682:6;1669:20;1659:30;;1712:18;1704:6;1701:30;1698:117;;;1734:79;;:::i;:::-;1698:117;1848:4;1840:6;1836:17;1824:29;;1902:3;1894:4;1886:6;1882:17;1872:8;1868:32;1865:41;1862:128;;;1909:79;;:::i;:::-;1862:128;1428:568;;;;;:::o;2002:704::-;2097:6;2105;2113;2162:2;2150:9;2141:7;2137:23;2133:32;2130:119;;;2168:79;;:::i;:::-;2130:119;2288:1;2313:53;2358:7;2349:6;2338:9;2334:22;2313:53;:::i;:::-;2303:63;;2259:117;2443:2;2432:9;2428:18;2415:32;2474:18;2466:6;2463:30;2460:117;;;2496:79;;:::i;:::-;2460:117;2609:80;2681:7;2672:6;2661:9;2657:22;2609:80;:::i;:::-;2591:98;;;;2386:313;2002:704;;;;;:::o;2712:147::-;2812:6;2846:5;2840:12;2830:22;;2712:147;;;:::o;2865:217::-;2997:11;3031:6;3026:3;3019:19;3071:4;3066:3;3062:14;3047:29;;2865:217;;;;:::o;3088:165::-;3188:4;3211:3;3203:11;;3241:4;3236:3;3232:14;3224:22;;3088:165;;;:::o;3259:108::-;3336:24;3354:5;3336:24;:::i;:::-;3331:3;3324:37;3259:108;;:::o;3453:517::-;3606:4;3601:3;3597:14;3695:4;3688:5;3684:16;3678:23;3714:63;3771:4;3766:3;3762:14;3748:12;3714:63;:::i;:::-;3621:166;3871:4;3864:5;3860:16;3854:23;3890:63;3947:4;3942:3;3938:14;3924:12;3890:63;:::i;:::-;3797:166;3575:395;3453:517;;:::o;3976:311::-;4111:10;4132:112;4240:3;4232:6;4132:112;:::i;:::-;4276:4;4271:3;4267:14;4253:28;;3976:311;;;;:::o;4293:146::-;4396:4;4428;4423:3;4419:14;4411:22;;4293:146;;;:::o;4529:996::-;4714:3;4743:87;4824:5;4743:87;:::i;:::-;4846:119;4958:6;4953:3;4846:119;:::i;:::-;4839:126;;4989:89;5072:5;4989:89;:::i;:::-;5101:7;5132:1;5117:383;5142:6;5139:1;5136:13;5117:383;;;5218:6;5212:13;5245:129;5370:3;5355:13;5245:129;:::i;:::-;5238:136;;5397:93;5483:6;5397:93;:::i;:::-;5387:103;;5177:323;5164:1;5161;5157:9;5152:14;;5117:383;;;5121:14;5516:3;5509:10;;4719:806;;;4529:996;;;;:::o;5531:505::-;5740:4;5778:2;5767:9;5763:18;5755:26;;5827:9;5821:4;5817:20;5813:1;5802:9;5798:17;5791:47;5855:174;6024:4;6015:6;5855:174;:::i;:::-;5847:182;;5531:505;;;;:::o;6042:126::-;6079:7;6119:42;6112:5;6108:54;6097:65;;6042:126;;;:::o;6174:96::-;6211:7;6240:24;6258:5;6240:24;:::i;:::-;6229:35;;6174:96;;;:::o;6276:122::-;6349:24;6367:5;6349:24;:::i;:::-;6342:5;6339:35;6329:63;;6388:1;6385;6378:12;6329:63;6276:122;:::o;6404:139::-;6450:5;6488:6;6475:20;6466:29;;6504:33;6531:5;6504:33;:::i;:::-;6404:139;;;;:::o;6562:552::-;6619:8;6629:6;6679:3;6672:4;6664:6;6660:17;6656:27;6646:122;;6687:79;;:::i;:::-;6646:122;6800:6;6787:20;6777:30;;6830:18;6822:6;6819:30;6816:117;;;6852:79;;:::i;:::-;6816:117;6966:4;6958:6;6954:17;6942:29;;7020:3;7012:4;7004:6;7000:17;6990:8;6986:32;6983:41;6980:128;;;7027:79;;:::i;:::-;6980:128;6562:552;;;;;:::o;7120:672::-;7199:6;7207;7215;7264:2;7252:9;7243:7;7239:23;7235:32;7232:119;;;7270:79;;:::i;:::-;7232:119;7390:1;7415:53;7460:7;7451:6;7440:9;7436:22;7415:53;:::i;:::-;7405:63;;7361:117;7545:2;7534:9;7530:18;7517:32;7576:18;7568:6;7565:30;7562:117;;;7598:79;;:::i;:::-;7562:117;7711:64;7767:7;7758:6;7747:9;7743:22;7711:64;:::i;:::-;7693:82;;;;7488:297;7120:672;;;;;:::o;7798:118::-;7885:24;7903:5;7885:24;:::i;:::-;7880:3;7873:37;7798:118;;:::o;7922:222::-;8015:4;8053:2;8042:9;8038:18;8030:26;;8066:71;8134:1;8123:9;8119:17;8110:6;8066:71;:::i;:::-;7922:222;;;;:::o;8187:596::-;8288:8;8298:6;8348:3;8341:4;8333:6;8329:17;8325:27;8315:122;;8356:79;;:::i;:::-;8315:122;8469:6;8456:20;8446:30;;8499:18;8491:6;8488:30;8485:117;;;8521:79;;:::i;:::-;8485:117;8635:4;8627:6;8623:17;8611:29;;8689:3;8681:4;8673:6;8669:17;8659:8;8655:32;8652:41;8649:128;;;8696:79;;:::i;:::-;8649:128;8187:596;;;;;:::o;8789:1103::-;8932:6;8940;8948;8956;8964;9013:2;9001:9;8992:7;8988:23;8984:32;8981:119;;;9019:79;;:::i;:::-;8981:119;9139:1;9164:53;9209:7;9200:6;9189:9;9185:22;9164:53;:::i;:::-;9154:63;;9110:117;9294:2;9283:9;9279:18;9266:32;9325:18;9317:6;9314:30;9311:117;;;9347:79;;:::i;:::-;9311:117;9460:108;9560:7;9551:6;9540:9;9536:22;9460:108;:::i;:::-;9442:126;;;;9237:341;9645:2;9634:9;9630:18;9617:32;9676:18;9668:6;9665:30;9662:117;;;9698:79;;:::i;:::-;9662:117;9811:64;9867:7;9858:6;9847:9;9843:22;9811:64;:::i;:::-;9793:82;;;;9588:297;8789:1103;;;;;;;;:::o;9898:77::-;9935:7;9964:5;9953:16;;9898:77;;;:::o;9981:118::-;10068:24;10086:5;10068:24;:::i;:::-;10063:3;10056:37;9981:118;;:::o;10105:222::-;10198:4;10236:2;10225:9;10221:18;10213:26;;10249:71;10317:1;10306:9;10302:17;10293:6;10249:71;:::i;:::-;10105:222;;;;:::o;10333:329::-;10392:6;10441:2;10429:9;10420:7;10416:23;10412:32;10409:119;;;10447:79;;:::i;:::-;10409:119;10567:1;10592:53;10637:7;10628:6;10617:9;10613:22;10592:53;:::i;:::-;10582:63;;10538:117;10333:329;;;;:::o;10668:1047::-;10783:6;10791;10799;10807;10815;10864:2;10852:9;10843:7;10839:23;10835:32;10832:119;;;10870:79;;:::i;:::-;10832:119;10990:1;11015:53;11060:7;11051:6;11040:9;11036:22;11015:53;:::i;:::-;11005:63;;10961:117;11145:2;11134:9;11130:18;11117:32;11176:18;11168:6;11165:30;11162:117;;;11198:79;;:::i;:::-;11162:117;11311:80;11383:7;11374:6;11363:9;11359:22;11311:80;:::i;:::-;11293:98;;;;11088:313;11468:2;11457:9;11453:18;11440:32;11499:18;11491:6;11488:30;11485:117;;;11521:79;;:::i;:::-;11485:117;11634:64;11690:7;11681:6;11670:9;11666:22;11634:64;:::i;:::-;11616:82;;;;11411:297;10668:1047;;;;;;;;:::o;11721:474::-;11789:6;11797;11846:2;11834:9;11825:7;11821:23;11817:32;11814:119;;;11852:79;;:::i;:::-;11814:119;11972:1;11997:53;12042:7;12033:6;12022:9;12018:22;11997:53;:::i;:::-;11987:63;;11943:117;12099:2;12125:53;12170:7;12161:6;12150:9;12146:22;12125:53;:::i;:::-;12115:63;;12070:118;11721:474;;;;;:::o;12201:98::-;12252:6;12286:5;12280:12;12270:22;;12201:98;;;:::o;12305:158::-;12378:11;12412:6;12407:3;12400:19;12452:4;12447:3;12443:14;12428:29;;12305:158;;;;:::o;12469:246::-;12550:1;12560:113;12574:6;12571:1;12568:13;12560:113;;;12659:1;12654:3;12650:11;12644:18;12640:1;12635:3;12631:11;12624:39;12596:2;12593:1;12589:10;12584:15;;12560:113;;;12707:1;12698:6;12693:3;12689:16;12682:27;12531:184;12469:246;;;:::o;12721:102::-;12762:6;12813:2;12809:7;12804:2;12797:5;12793:14;12789:28;12779:38;;12721:102;;;:::o;12829:353::-;12905:3;12933:38;12965:5;12933:38;:::i;:::-;12987:60;13040:6;13035:3;12987:60;:::i;:::-;12980:67;;13056:65;13114:6;13109:3;13102:4;13095:5;13091:16;13056:65;:::i;:::-;13146:29;13168:6;13146:29;:::i;:::-;13141:3;13137:39;13130:46;;12909:273;12829:353;;;;:::o;13230:422::-;13341:3;13377:4;13372:3;13368:14;13464:4;13457:5;13453:16;13447:23;13517:3;13511:4;13507:14;13500:4;13495:3;13491:14;13484:38;13543:71;13609:4;13595:12;13543:71;:::i;:::-;13535:79;;13392:233;13642:4;13635:11;;13346:306;13230:422;;;;:::o;13658:357::-;13793:4;13831:2;13820:9;13816:18;13808:26;;13880:9;13874:4;13870:20;13866:1;13855:9;13851:17;13844:47;13908:100;14003:4;13994:6;13908:100;:::i;:::-;13900:108;;13658:357;;;;:::o;14021:817::-;14109:6;14117;14125;14133;14182:2;14170:9;14161:7;14157:23;14153:32;14150:119;;;14188:79;;:::i;:::-;14150:119;14308:1;14333:53;14378:7;14369:6;14358:9;14354:22;14333:53;:::i;:::-;14323:63;;14279:117;14435:2;14461:53;14506:7;14497:6;14486:9;14482:22;14461:53;:::i;:::-;14451:63;;14406:118;14591:2;14580:9;14576:18;14563:32;14622:18;14614:6;14611:30;14608:117;;;14644:79;;:::i;:::-;14608:117;14757:64;14813:7;14804:6;14793:9;14789:22;14757:64;:::i;:::-;14739:82;;;;14534:297;14021:817;;;;;;;:::o;14844:332::-;14965:4;15003:2;14992:9;14988:18;14980:26;;15016:71;15084:1;15073:9;15069:17;15060:6;15016:71;:::i;:::-;15097:72;15165:2;15154:9;15150:18;15141:6;15097:72;:::i;:::-;14844:332;;;;;:::o;15182:90::-;15216:7;15259:5;15252:13;15245:21;15234:32;;15182:90;;;:::o;15278:109::-;15359:21;15374:5;15359:21;:::i;:::-;15354:3;15347:34;15278:109;;:::o;15393:210::-;15480:4;15518:2;15507:9;15503:18;15495:26;;15531:65;15593:1;15582:9;15578:17;15569:6;15531:65;:::i;:::-;15393:210;;;;:::o;15609:117::-;15718:1;15715;15708:12;15732:180;15780:77;15777:1;15770:88;15877:4;15874:1;15867:15;15901:4;15898:1;15891:15;15918:281;16001:27;16023:4;16001:27;:::i;:::-;15993:6;15989:40;16131:6;16119:10;16116:22;16095:18;16083:10;16080:34;16077:62;16074:88;;;16142:18;;:::i;:::-;16074:88;16182:10;16178:2;16171:22;15961:238;15918:281;;:::o;16205:129::-;16239:6;16266:20;;:::i;:::-;16256:30;;16295:33;16323:4;16315:6;16295:33;:::i;:::-;16205:129;;;:::o;16340:307::-;16401:4;16491:18;16483:6;16480:30;16477:56;;;16513:18;;:::i;:::-;16477:56;16551:29;16573:6;16551:29;:::i;:::-;16543:37;;16635:4;16629;16625:15;16617:23;;16340:307;;;:::o;16653:146::-;16750:6;16745:3;16740;16727:30;16791:1;16782:6;16777:3;16773:16;16766:27;16653:146;;;:::o;16805:423::-;16882:5;16907:65;16923:48;16964:6;16923:48;:::i;:::-;16907:65;:::i;:::-;16898:74;;16995:6;16988:5;16981:21;17033:4;17026:5;17022:16;17071:3;17062:6;17057:3;17053:16;17050:25;17047:112;;;17078:79;;:::i;:::-;17047:112;17168:54;17215:6;17210:3;17205;17168:54;:::i;:::-;16888:340;16805:423;;;;;:::o;17247:338::-;17302:5;17351:3;17344:4;17336:6;17332:17;17328:27;17318:122;;17359:79;;:::i;:::-;17318:122;17476:6;17463:20;17501:78;17575:3;17567:6;17560:4;17552:6;17548:17;17501:78;:::i;:::-;17492:87;;17308:277;17247:338;;;;:::o;17591:652::-;17668:6;17676;17725:2;17713:9;17704:7;17700:23;17696:32;17693:119;;;17731:79;;:::i;:::-;17693:119;17851:1;17876:53;17921:7;17912:6;17901:9;17897:22;17876:53;:::i;:::-;17866:63;;17822:117;18006:2;17995:9;17991:18;17978:32;18037:18;18029:6;18026:30;18023:117;;;18059:79;;:::i;:::-;18023:117;18164:62;18218:7;18209:6;18198:9;18194:22;18164:62;:::i;:::-;18154:72;;17949:287;17591:652;;;;;:::o;18249:101::-;18285:7;18325:18;18318:5;18314:30;18303:41;;18249:101;;;:::o;18356:115::-;18441:23;18458:5;18441:23;:::i;:::-;18436:3;18429:36;18356:115;;:::o;18477:90::-;18512:7;18555:5;18552:1;18541:20;18530:31;;18477:90;;;:::o;18573:112::-;18656:22;18672:5;18656:22;:::i;:::-;18651:3;18644:35;18573:112;;:::o;18691:320::-;18806:4;18844:2;18833:9;18829:18;18821:26;;18857:69;18923:1;18912:9;18908:17;18899:6;18857:69;:::i;:::-;18936:68;19000:2;18989:9;18985:18;18976:6;18936:68;:::i;:::-;18691:320;;;;;:::o;19017:60::-;19045:3;19066:5;19059:12;;19017:60;;;:::o;19083:142::-;19133:9;19166:53;19184:34;19193:24;19211:5;19193:24;:::i;:::-;19184:34;:::i;:::-;19166:53;:::i;:::-;19153:66;;19083:142;;;:::o;19231:126::-;19281:9;19314:37;19345:5;19314:37;:::i;:::-;19301:50;;19231:126;;;:::o;19363:140::-;19427:9;19460:37;19491:5;19460:37;:::i;:::-;19447:50;;19363:140;;;:::o;19509:159::-;19610:51;19655:5;19610:51;:::i;:::-;19605:3;19598:64;19509:159;;:::o;19674:250::-;19781:4;19819:2;19808:9;19804:18;19796:26;;19832:85;19914:1;19903:9;19899:17;19890:6;19832:85;:::i;:::-;19674:250;;;;:::o;19930:474::-;19998:6;20006;20055:2;20043:9;20034:7;20030:23;20026:32;20023:119;;;20061:79;;:::i;:::-;20023:119;20181:1;20206:53;20251:7;20242:6;20231:9;20227:22;20206:53;:::i;:::-;20196:63;;20152:117;20308:2;20334:53;20379:7;20370:6;20359:9;20355:22;20334:53;:::i;:::-;20324:63;;20279:118;19930:474;;;;;:::o;20410:114::-;20477:6;20511:5;20505:12;20495:22;;20410:114;;;:::o;20530:184::-;20629:11;20663:6;20658:3;20651:19;20703:4;20698:3;20694:14;20679:29;;20530:184;;;;:::o;20720:132::-;20787:4;20810:3;20802:11;;20840:4;20835:3;20831:14;20823:22;;20720:132;;;:::o;20858:179::-;20927:10;20948:46;20990:3;20982:6;20948:46;:::i;:::-;21026:4;21021:3;21017:14;21003:28;;20858:179;;;;:::o;21043:113::-;21113:4;21145;21140:3;21136:14;21128:22;;21043:113;;;:::o;21192:732::-;21311:3;21340:54;21388:5;21340:54;:::i;:::-;21410:86;21489:6;21484:3;21410:86;:::i;:::-;21403:93;;21520:56;21570:5;21520:56;:::i;:::-;21599:7;21630:1;21615:284;21640:6;21637:1;21634:13;21615:284;;;21716:6;21710:13;21743:63;21802:3;21787:13;21743:63;:::i;:::-;21736:70;;21829:60;21882:6;21829:60;:::i;:::-;21819:70;;21675:224;21662:1;21659;21655:9;21650:14;;21615:284;;;21619:14;21915:3;21908:10;;21316:608;;;21192:732;;;;:::o;21930:373::-;22073:4;22111:2;22100:9;22096:18;22088:26;;22160:9;22154:4;22150:20;22146:1;22135:9;22131:17;22124:47;22188:108;22291:4;22282:6;22188:108;:::i;:::-;22180:116;;21930:373;;;;:::o;22309:672::-;22388:6;22396;22404;22453:2;22441:9;22432:7;22428:23;22424:32;22421:119;;;22459:79;;:::i;:::-;22421:119;22579:1;22604:53;22649:7;22640:6;22629:9;22625:22;22604:53;:::i;:::-;22594:63;;22550:117;22734:2;22723:9;22719:18;22706:32;22765:18;22757:6;22754:30;22751:117;;;22787:79;;:::i;:::-;22751:117;22900:64;22956:7;22947:6;22936:9;22932:22;22900:64;:::i;:::-;22882:82;;;;22677:297;22309:672;;;;;:::o;22987:218::-;23078:4;23116:2;23105:9;23101:18;23093:26;;23129:69;23195:1;23184:9;23180:17;23171:6;23129:69;:::i;:::-;22987:218;;;;:::o;23211:99::-;23263:6;23297:5;23291:12;23281:22;;23211:99;;;:::o;23316:169::-;23400:11;23434:6;23429:3;23422:19;23474:4;23469:3;23465:14;23450:29;;23316:169;;;;:::o;23491:377::-;23579:3;23607:39;23640:5;23607:39;:::i;:::-;23662:71;23726:6;23721:3;23662:71;:::i;:::-;23655:78;;23742:65;23800:6;23795:3;23788:4;23781:5;23777:16;23742:65;:::i;:::-;23832:29;23854:6;23832:29;:::i;:::-;23827:3;23823:39;23816:46;;23583:285;23491:377;;;;:::o;23874:313::-;23987:4;24025:2;24014:9;24010:18;24002:26;;24074:9;24068:4;24064:20;24060:1;24049:9;24045:17;24038:47;24102:78;24175:4;24166:6;24102:78;:::i;:::-;24094:86;;23874:313;;;;:::o;24193:329::-;24252:6;24301:2;24289:9;24280:7;24276:23;24272:32;24269:119;;;24307:79;;:::i;:::-;24269:119;24427:1;24452:53;24497:7;24488:6;24477:9;24473:22;24452:53;:::i;:::-;24442:63;;24398:117;24193:329;;;;:::o;24562:593::-;24660:8;24670:6;24720:3;24713:4;24705:6;24701:17;24697:27;24687:122;;24728:79;;:::i;:::-;24687:122;24841:6;24828:20;24818:30;;24871:18;24863:6;24860:30;24857:117;;;24893:79;;:::i;:::-;24857:117;25007:4;24999:6;24995:17;24983:29;;25061:3;25053:4;25045:6;25041:17;25031:8;25027:32;25024:41;25021:128;;;25068:79;;:::i;:::-;25021:128;24562:593;;;;;:::o;25161:754::-;25281:6;25289;25297;25346:2;25334:9;25325:7;25321:23;25317:32;25314:119;;;25352:79;;:::i;:::-;25314:119;25472:1;25497:53;25542:7;25533:6;25522:9;25518:22;25497:53;:::i;:::-;25487:63;;25443:117;25627:2;25616:9;25612:18;25599:32;25658:18;25650:6;25647:30;25644:117;;;25680:79;;:::i;:::-;25644:117;25793:105;25890:7;25881:6;25870:9;25866:22;25793:105;:::i;:::-;25775:123;;;;25570:338;25161:754;;;;;:::o;25921:180::-;25969:77;25966:1;25959:88;26066:4;26063:1;26056:15;26090:4;26087:1;26080:15;26107:194;26147:4;26167:20;26185:1;26167:20;:::i;:::-;26162:25;;26201:20;26219:1;26201:20;:::i;:::-;26196:25;;26245:1;26242;26238:9;26230:17;;26269:1;26263:4;26260:11;26257:37;;;26274:18;;:::i;:::-;26257:37;26107:194;;;;:::o;26307:180::-;26355:77;26352:1;26345:88;26452:4;26449:1;26442:15;26476:4;26473:1;26466:15;26493:170;26633:22;26629:1;26621:6;26617:14;26610:46;26493:170;:::o;26669:366::-;26811:3;26832:67;26896:2;26891:3;26832:67;:::i;:::-;26825:74;;26908:93;26997:3;26908:93;:::i;:::-;27026:2;27021:3;27017:12;27010:19;;26669:366;;;:::o;27041:419::-;27207:4;27245:2;27234:9;27230:18;27222:26;;27294:9;27288:4;27284:20;27280:1;27269:9;27265:17;27258:47;27322:131;27448:4;27322:131;:::i;:::-;27314:139;;27041:419;;;:::o;27466:167::-;27606:19;27602:1;27594:6;27590:14;27583:43;27466:167;:::o;27639:366::-;27781:3;27802:67;27866:2;27861:3;27802:67;:::i;:::-;27795:74;;27878:93;27967:3;27878:93;:::i;:::-;27996:2;27991:3;27987:12;27980:19;;27639:366;;;:::o;28011:419::-;28177:4;28215:2;28204:9;28200:18;28192:26;;28264:9;28258:4;28254:20;28250:1;28239:9;28235:17;28228:47;28292:131;28418:4;28292:131;:::i;:::-;28284:139;;28011:419;;;:::o;28436:183::-;28474:3;28497:23;28514:5;28497:23;:::i;:::-;28488:32;;28542:18;28535:5;28532:29;28529:55;;28564:18;;:::i;:::-;28529:55;28611:1;28604:5;28600:13;28593:20;;28436:183;;;:::o;28625:168::-;28708:11;28742:6;28737:3;28730:19;28782:4;28777:3;28773:14;28758:29;;28625:168;;;;:::o;28821:314::-;28917:3;28938:70;29001:6;28996:3;28938:70;:::i;:::-;28931:77;;29018:56;29067:6;29062:3;29055:5;29018:56;:::i;:::-;29099:29;29121:6;29099:29;:::i;:::-;29094:3;29090:39;29083:46;;28821:314;;;;;:::o;29141:549::-;29318:4;29356:2;29345:9;29341:18;29333:26;;29369:71;29437:1;29426:9;29422:17;29413:6;29369:71;:::i;:::-;29450:72;29518:2;29507:9;29503:18;29494:6;29450:72;:::i;:::-;29569:9;29563:4;29559:20;29554:2;29543:9;29539:18;29532:48;29597:86;29678:4;29669:6;29661;29597:86;:::i;:::-;29589:94;;29141:549;;;;;;;:::o;29696:168::-;29836:20;29832:1;29824:6;29820:14;29813:44;29696:168;:::o;29870:366::-;30012:3;30033:67;30097:2;30092:3;30033:67;:::i;:::-;30026:74;;30109:93;30198:3;30109:93;:::i;:::-;30227:2;30222:3;30218:12;30211:19;;29870:366;;;:::o;30242:419::-;30408:4;30446:2;30435:9;30431:18;30423:26;;30495:9;30489:4;30485:20;30481:1;30470:9;30466:17;30459:47;30523:131;30649:4;30523:131;:::i;:::-;30515:139;;30242:419;;;:::o;30667:176::-;30807:28;30803:1;30795:6;30791:14;30784:52;30667:176;:::o;30849:366::-;30991:3;31012:67;31076:2;31071:3;31012:67;:::i;:::-;31005:74;;31088:93;31177:3;31088:93;:::i;:::-;31206:2;31201:3;31197:12;31190:19;;30849:366;;;:::o;31221:419::-;31387:4;31425:2;31414:9;31410:18;31402:26;;31474:9;31468:4;31464:20;31460:1;31449:9;31445:17;31438:47;31502:131;31628:4;31502:131;:::i;:::-;31494:139;;31221:419;;;:::o;31646:178::-;31786:30;31782:1;31774:6;31770:14;31763:54;31646:178;:::o;31830:366::-;31972:3;31993:67;32057:2;32052:3;31993:67;:::i;:::-;31986:74;;32069:93;32158:3;32069:93;:::i;:::-;32187:2;32182:3;32178:12;32171:19;;31830:366;;;:::o;32202:419::-;32368:4;32406:2;32395:9;32391:18;32383:26;;32455:9;32449:4;32445:20;32441:1;32430:9;32426:17;32419:47;32483:131;32609:4;32483:131;:::i;:::-;32475:139;;32202:419;;;:::o;32627:117::-;32736:1;32733;32726:12;32750:117;32859:1;32856;32849:12;32873:117;32982:1;32979;32972:12;32996:394;33090:4;33144:11;33131:25;33244:1;33238:4;33234:12;33223:8;33207:14;33203:29;33199:48;33179:18;33175:73;33165:168;;33252:79;;:::i;:::-;33165:168;33364:18;33354:8;33350:33;33342:41;;33095:295;32996:394;;;;:::o;33396:389::-;33485:4;33539:11;33526:25;33639:1;33633:4;33629:12;33618:8;33602:14;33598:29;33594:48;33574:18;33570:73;33560:168;;33647:79;;:::i;:::-;33560:168;33759:18;33749:8;33745:33;33737:41;;33490:295;33396:389;;;;:::o;33791:191::-;33831:3;33850:20;33868:1;33850:20;:::i;:::-;33845:25;;33884:20;33902:1;33884:20;:::i;:::-;33879:25;;33927:1;33924;33920:9;33913:16;;33948:3;33945:1;33942:10;33939:36;;;33955:18;;:::i;:::-;33939:36;33791:191;;;;:::o;33988:210::-;34113:11;34147:6;34142:3;34135:19;34187:4;34182:3;34178:14;34163:29;;33988:210;;;;:::o;34204:130::-;34301:4;34324:3;34316:11;;34204:130;;;:::o;34340:117::-;34449:1;34446;34439:12;34463:370;34539:5;34594:3;34581:17;34686:1;34680:4;34676:12;34665:8;34649:14;34645:29;34641:48;34621:18;34617:73;34607:168;;34694:79;;:::i;:::-;34607:168;34817:8;34797:18;34793:33;34784:42;;34545:288;34463:370;;;;:::o;34839:117::-;34948:1;34945;34938:12;34962:117;35071:1;35068;35061:12;35085:711;35149:5;35156:6;35212:3;35199:17;35304:1;35298:4;35294:12;35283:8;35267:14;35263:29;35259:48;35239:18;35235:73;35225:168;;35312:79;;:::i;:::-;35225:168;35435:8;35415:18;35411:33;35402:42;;35477:5;35464:19;35454:29;;35512:4;35505:5;35501:16;35492:25;;35540:18;35532:6;35529:30;35526:117;;;35562:79;;:::i;:::-;35526:117;35698:4;35690:6;35686:17;35670:14;35666:38;35659:5;35655:50;35652:137;;;35708:79;;:::i;:::-;35652:137;35163:633;35085:711;;;;;:::o;35824:294::-;35910:3;35931:60;35984:6;35979:3;35931:60;:::i;:::-;35924:67;;36001:56;36050:6;36045:3;36038:5;36001:56;:::i;:::-;36082:29;36104:6;36082:29;:::i;:::-;36077:3;36073:39;36066:46;;35824:294;;;;;:::o;36166:482::-;36269:3;36305:4;36300:3;36296:14;36389:61;36444:4;36437:5;36433:16;36426:5;36389:61;:::i;:::-;36497:3;36491:4;36487:14;36480:4;36475:3;36471:14;36464:38;36523:87;36605:4;36591:12;36577;36523:87;:::i;:::-;36515:95;;36320:301;;36638:4;36631:11;;36274:374;36166:482;;;;:::o;36654:122::-;36706:5;36731:39;36766:2;36761:3;36757:12;36752:3;36731:39;:::i;:::-;36722:48;;36654:122;;;;:::o;36848:704::-;36961:3;36997:4;36992:3;36988:14;37067:73;37134:4;37127:5;37123:16;37116:5;37067:73;:::i;:::-;37187:3;37181:4;37177:14;37170:4;37165:3;37161:14;37154:38;37213:97;37305:4;37291:12;37213:97;:::i;:::-;37205:105;;37012:309;37389:50;37433:4;37426:5;37422:16;37415:5;37389:50;:::i;:::-;37452:63;37509:4;37504:3;37500:14;37486:12;37452:63;:::i;:::-;37331:194;37542:4;37535:11;;36966:586;36848:704;;;;:::o;37558:264::-;37681:10;37716:100;37812:3;37804:6;37716:100;:::i;:::-;37702:114;;37558:264;;;;:::o;37828:375::-;37909:5;37964:3;37951:17;38056:1;38050:4;38046:12;38035:8;38019:14;38015:29;38011:48;37991:18;37987:73;37977:168;;38064:79;;:::i;:::-;37977:168;38187:8;38167:18;38163:33;38154:42;;37915:288;37828:375;;;;:::o;38209:143::-;38309:4;38341;38336:3;38332:14;38324:22;;38209:143;;;:::o;38428:1096::-;38611:3;38634:112;38739:6;38734:3;38634:112;:::i;:::-;38627:119;;38772:3;38817:4;38809:6;38805:17;38800:3;38796:27;38847:86;38927:5;38847:86;:::i;:::-;38956:7;38987:1;38972:507;38997:6;38994:1;38991:13;38972:507;;;39068:9;39062:4;39058:20;39053:3;39046:33;39113:70;39176:6;39167:7;39113:70;:::i;:::-;39204:118;39317:4;39302:13;39204:118;:::i;:::-;39196:126;;39345:90;39428:6;39345:90;:::i;:::-;39335:100;;39464:4;39459:3;39455:14;39448:21;;39032:447;39019:1;39016;39012:9;39007:14;;38972:507;;;38976:14;39495:4;39488:11;;39515:3;39508:10;;38616:908;;;;38428:1096;;;;;:::o;39530:939::-;39849:4;39887:3;39876:9;39872:19;39864:27;;39901:71;39969:1;39958:9;39954:17;39945:6;39901:71;:::i;:::-;39982:72;40050:2;40039:9;40035:18;40026:6;39982:72;:::i;:::-;40101:9;40095:4;40091:20;40086:2;40075:9;40071:18;40064:48;40129:172;40296:4;40287:6;40279;40129:172;:::i;:::-;40121:180;;40348:9;40342:4;40338:20;40333:2;40322:9;40318:18;40311:48;40376:86;40457:4;40448:6;40440;40376:86;:::i;:::-;40368:94;;39530:939;;;;;;;;;:::o;40475:231::-;40615:34;40611:1;40603:6;40599:14;40592:58;40684:14;40679:2;40671:6;40667:15;40660:39;40475:231;:::o;40712:366::-;40854:3;40875:67;40939:2;40934:3;40875:67;:::i;:::-;40868:74;;40951:93;41040:3;40951:93;:::i;:::-;41069:2;41064:3;41060:12;41053:19;;40712:366;;;:::o;41084:419::-;41250:4;41288:2;41277:9;41273:18;41265:26;;41337:9;41331:4;41327:20;41323:1;41312:9;41308:17;41301:47;41365:131;41491:4;41365:131;:::i;:::-;41357:139;;41084:419;;;:::o;41509:245::-;41649:34;41645:1;41637:6;41633:14;41626:58;41718:28;41713:2;41705:6;41701:15;41694:53;41509:245;:::o;41760:366::-;41902:3;41923:67;41987:2;41982:3;41923:67;:::i;:::-;41916:74;;41999:93;42088:3;41999:93;:::i;:::-;42117:2;42112:3;42108:12;42101:19;;41760:366;;;:::o;42132:419::-;42298:4;42336:2;42325:9;42321:18;42313:26;;42385:9;42379:4;42375:20;42371:1;42360:9;42356:17;42349:47;42413:131;42539:4;42413:131;:::i;:::-;42405:139;;42132:419;;;:::o;42557:230::-;42697:34;42693:1;42685:6;42681:14;42674:58;42766:13;42761:2;42753:6;42749:15;42742:38;42557:230;:::o;42793:366::-;42935:3;42956:67;43020:2;43015:3;42956:67;:::i;:::-;42949:74;;43032:93;43121:3;43032:93;:::i;:::-;43150:2;43145:3;43141:12;43134:19;;42793:366;;;:::o;43165:419::-;43331:4;43369:2;43358:9;43354:18;43346:26;;43418:9;43412:4;43408:20;43404:1;43393:9;43389:17;43382:47;43446:131;43572:4;43446:131;:::i;:::-;43438:139;;43165:419;;;:::o;43590:117::-;43699:1;43696;43689:12;43713:98;43797:6;43792:3;43787;43774:30;43713:98;;;:::o;43847:537::-;43975:3;43996:86;44075:6;44070:3;43996:86;:::i;:::-;43989:93;;44106:66;44098:6;44095:78;44092:165;;;44176:79;;:::i;:::-;44092:165;44288:4;44280:6;44276:17;44266:27;;44303:43;44339:6;44334:3;44327:5;44303:43;:::i;:::-;44371:6;44366:3;44362:16;44355:23;;43847:537;;;;;:::o;44390:720::-;44627:4;44665:2;44654:9;44650:18;44642:26;;44678:71;44746:1;44735:9;44731:17;44722:6;44678:71;:::i;:::-;44796:9;44790:4;44786:20;44781:2;44770:9;44766:18;44759:48;44824:118;44937:4;44928:6;44920;44824:118;:::i;:::-;44816:126;;44989:9;44983:4;44979:20;44974:2;44963:9;44959:18;44952:48;45017:86;45098:4;45089:6;45081;45017:86;:::i;:::-;45009:94;;44390:720;;;;;;;;:::o;45116:180::-;45164:77;45161:1;45154:88;45261:4;45258:1;45251:15;45285:4;45282:1;45275:15;45302:320;45346:6;45383:1;45377:4;45373:12;45363:22;;45430:1;45424:4;45420:12;45451:18;45441:81;;45507:4;45499:6;45495:17;45485:27;;45441:81;45569:2;45561:6;45558:14;45538:18;45535:38;45532:84;;45588:18;;:::i;:::-;45532:84;45353:269;45302:320;;;:::o;45628:79::-;45667:7;45696:5;45685:16;;45628:79;;;:::o;45713:157::-;45818:45;45838:24;45856:5;45838:24;:::i;:::-;45818:45;:::i;:::-;45813:3;45806:58;45713:157;;:::o;45876:256::-;45988:3;46003:75;46074:3;46065:6;46003:75;:::i;:::-;46103:2;46098:3;46094:12;46087:19;;46123:3;46116:10;;45876:256;;;;:::o;46138:147::-;46239:11;46276:3;46261:18;;46138:147;;;;:::o;46291:386::-;46395:3;46423:38;46455:5;46423:38;:::i;:::-;46477:88;46558:6;46553:3;46477:88;:::i;:::-;46470:95;;46574:65;46632:6;46627:3;46620:4;46613:5;46609:16;46574:65;:::i;:::-;46664:6;46659:3;46655:16;46648:23;;46399:278;46291:386;;;;:::o;46683:271::-;46813:3;46835:93;46924:3;46915:6;46835:93;:::i;:::-;46828:100;;46945:3;46938:10;;46683:271;;;;:::o;46960:220::-;47100:34;47096:1;47088:6;47084:14;47077:58;47169:3;47164:2;47156:6;47152:15;47145:28;46960:220;:::o;47186:366::-;47328:3;47349:67;47413:2;47408:3;47349:67;:::i;:::-;47342:74;;47425:93;47514:3;47425:93;:::i;:::-;47543:2;47538:3;47534:12;47527:19;;47186:366;;;:::o;47558:419::-;47724:4;47762:2;47751:9;47747:18;47739:26;;47811:9;47805:4;47801:20;47797:1;47786:9;47782:17;47775:47;47839:131;47965:4;47839:131;:::i;:::-;47831:139;;47558:419;;;:::o;47983:143::-;48040:5;48071:6;48065:13;48056:22;;48087:33;48114:5;48087:33;:::i;:::-;47983:143;;;;:::o;48132:351::-;48202:6;48251:2;48239:9;48230:7;48226:23;48222:32;48219:119;;;48257:79;;:::i;:::-;48219:119;48377:1;48402:64;48458:7;48449:6;48438:9;48434:22;48402:64;:::i;:::-;48392:74;;48348:128;48132:351;;;;:::o;48489:233::-;48629:34;48625:1;48617:6;48613:14;48606:58;48698:16;48693:2;48685:6;48681:15;48674:41;48489:233;:::o;48728:366::-;48870:3;48891:67;48955:2;48950:3;48891:67;:::i;:::-;48884:74;;48967:93;49056:3;48967:93;:::i;:::-;49085:2;49080:3;49076:12;49069:19;;48728:366;;;:::o;49100:419::-;49266:4;49304:2;49293:9;49289:18;49281:26;;49353:9;49347:4;49343:20;49339:1;49328:9;49324:17;49317:47;49381:131;49507:4;49381:131;:::i;:::-;49373:139;;49100:419;;;:::o;49525:231::-;49665:34;49661:1;49653:6;49649:14;49642:58;49734:14;49729:2;49721:6;49717:15;49710:39;49525:231;:::o;49762:366::-;49904:3;49925:67;49989:2;49984:3;49925:67;:::i;:::-;49918:74;;50001:93;50090:3;50001:93;:::i;:::-;50119:2;50114:3;50110:12;50103:19;;49762:366;;;:::o;50134:419::-;50300:4;50338:2;50327:9;50323:18;50315:26;;50387:9;50381:4;50377:20;50373:1;50362:9;50358:17;50351:47;50415:131;50541:4;50415:131;:::i;:::-;50407:139;;50134:419;;;:::o;50559:180::-;50607:77;50604:1;50597:88;50704:4;50701:1;50694:15;50728:4;50725:1;50718:15;50745:295;50885:34;50881:1;50873:6;50869:14;50862:58;50954:34;50949:2;50941:6;50937:15;50930:59;51023:9;51018:2;51010:6;51006:15;50999:34;50745:295;:::o;51046:366::-;51188:3;51209:67;51273:2;51268:3;51209:67;:::i;:::-;51202:74;;51285:93;51374:3;51285:93;:::i;:::-;51403:2;51398:3;51394:12;51387:19;;51046:366;;;:::o;51418:419::-;51584:4;51622:2;51611:9;51607:18;51599:26;;51671:9;51665:4;51661:20;51657:1;51646:9;51642:17;51635:47;51699:131;51825:4;51699:131;:::i;:::-;51691:139;;51418:419;;;:::o;51843:660::-;52048:4;52086:3;52075:9;52071:19;52063:27;;52100:71;52168:1;52157:9;52153:17;52144:6;52100:71;:::i;:::-;52181:72;52249:2;52238:9;52234:18;52225:6;52181:72;:::i;:::-;52263;52331:2;52320:9;52316:18;52307:6;52263:72;:::i;:::-;52382:9;52376:4;52372:20;52367:2;52356:9;52352:18;52345:48;52410:86;52491:4;52482:6;52474;52410:86;:::i;:::-;52402:94;;51843:660;;;;;;;;:::o;52509:332::-;52630:4;52668:2;52657:9;52653:18;52645:26;;52681:71;52749:1;52738:9;52734:17;52725:6;52681:71;:::i;:::-;52762:72;52830:2;52819:9;52815:18;52806:6;52762:72;:::i;:::-;52509:332;;;;;:::o;52847:410::-;52887:7;52910:20;52928:1;52910:20;:::i;:::-;52905:25;;52944:20;52962:1;52944:20;:::i;:::-;52939:25;;52999:1;52996;52992:9;53021:30;53039:11;53021:30;:::i;:::-;53010:41;;53200:1;53191:7;53187:15;53184:1;53181:22;53161:1;53154:9;53134:83;53111:139;;53230:18;;:::i;:::-;53111:139;52895:362;52847:410;;;;:::o;53263:332::-;53384:4;53422:2;53411:9;53407:18;53399:26;;53435:71;53503:1;53492:9;53488:17;53479:6;53435:71;:::i;:::-;53516:72;53584:2;53573:9;53569:18;53560:6;53516:72;:::i;:::-;53263:332;;;;;:::o;53601:117::-;53710:1;53707;53700:12;53847:90;53882:7;53925:5;53922:1;53911:20;53900:31;;53847:90;;;:::o;53943:118::-;54014:22;54030:5;54014:22;:::i;:::-;54007:5;54004:33;53994:61;;54051:1;54048;54041:12;53994:61;53943:118;:::o;54067:139::-;54122:5;54153:6;54147:13;54138:22;;54169:31;54194:5;54169:31;:::i;:::-;54067:139;;;;:::o;54212:120::-;54284:23;54301:5;54284:23;:::i;:::-;54277:5;54274:34;54264:62;;54322:1;54319;54312:12;54264:62;54212:120;:::o;54338:141::-;54394:5;54425:6;54419:13;54410:22;;54441:32;54467:5;54441:32;:::i;:::-;54338:141;;;;:::o;54485:118::-;54556:22;54572:5;54556:22;:::i;:::-;54549:5;54546:33;54536:61;;54593:1;54590;54583:12;54536:61;54485:118;:::o;54609:139::-;54664:5;54695:6;54689:13;54680:22;;54711:31;54736:5;54711:31;:::i;:::-;54609:139;;;;:::o;54786:952::-;54869:5;54913:4;54901:9;54896:3;54892:19;54888:30;54885:117;;;54921:79;;:::i;:::-;54885:117;55020:21;55036:4;55020:21;:::i;:::-;55011:30;;55101:1;55141:58;55195:3;55186:6;55175:9;55171:22;55141:58;:::i;:::-;55134:4;55127:5;55123:16;55116:84;55051:160;55270:2;55311:59;55366:3;55357:6;55346:9;55342:22;55311:59;:::i;:::-;55304:4;55297:5;55293:16;55286:85;55221:161;55441:2;55482:58;55536:3;55527:6;55516:9;55512:22;55482:58;:::i;:::-;55475:4;55468:5;55464:16;55457:84;55392:160;55618:2;55659:60;55715:3;55706:6;55695:9;55691:22;55659:60;:::i;:::-;55652:4;55645:5;55641:16;55634:86;55562:169;54786:952;;;;:::o;55744:398::-;55837:6;55886:3;55874:9;55865:7;55861:23;55857:33;55854:120;;;55893:79;;:::i;:::-;55854:120;56013:1;56038:87;56117:7;56108:6;56097:9;56093:22;56038:87;:::i;:::-;56028:97;;55984:151;55744:398;;;;:::o;56148:235::-;56288:34;56284:1;56276:6;56272:14;56265:58;56357:18;56352:2;56344:6;56340:15;56333:43;56148:235;:::o;56389:366::-;56531:3;56552:67;56616:2;56611:3;56552:67;:::i;:::-;56545:74;;56628:93;56717:3;56628:93;:::i;:::-;56746:2;56741:3;56737:12;56730:19;;56389:366;;;:::o;56761:419::-;56927:4;56965:2;56954:9;56950:18;56942:26;;57014:9;57008:4;57004:20;57000:1;56989:9;56985:17;56978:47;57042:131;57168:4;57042:131;:::i;:::-;57034:139;;56761:419;;;:::o;57186:233::-;57326:34;57322:1;57314:6;57310:14;57303:58;57395:16;57390:2;57382:6;57378:15;57371:41;57186:233;:::o;57425:366::-;57567:3;57588:67;57652:2;57647:3;57588:67;:::i;:::-;57581:74;;57664:93;57753:3;57664:93;:::i;:::-;57782:2;57777:3;57773:12;57766:19;;57425:366;;;:::o;57797:419::-;57963:4;58001:2;57990:9;57986:18;57978:26;;58050:9;58044:4;58040:20;58036:1;58025:9;58021:17;58014:47;58078:131;58204:4;58078:131;:::i;:::-;58070:139;;57797:419;;;:::o;58222:251::-;58362:34;58358:1;58350:6;58346:14;58339:58;58431:34;58426:2;58418:6;58414:15;58407:59;58222:251;:::o;58479:366::-;58621:3;58642:67;58706:2;58701:3;58642:67;:::i;:::-;58635:74;;58718:93;58807:3;58718:93;:::i;:::-;58836:2;58831:3;58827:12;58820:19;;58479:366;;;:::o;58851:419::-;59017:4;59055:2;59044:9;59040:18;59032:26;;59104:9;59098:4;59094:20;59090:1;59079:9;59075:17;59068:47;59132:131;59258:4;59132:131;:::i;:::-;59124:139;;58851:419;;;:::o;59276:176::-;59416:28;59412:1;59404:6;59400:14;59393:52;59276:176;:::o;59458:366::-;59600:3;59621:67;59685:2;59680:3;59621:67;:::i;:::-;59614:74;;59697:93;59786:3;59697:93;:::i;:::-;59815:2;59810:3;59806:12;59799:19;;59458:366;;;:::o;59830:419::-;59996:4;60034:2;60023:9;60019:18;60011:26;;60083:9;60077:4;60073:20;60069:1;60058:9;60054:17;60047:47;60111:131;60237:4;60111:131;:::i;:::-;60103:139;;59830:419;;;:::o;60255:223::-;60395:34;60391:1;60383:6;60379:14;60372:58;60464:6;60459:2;60451:6;60447:15;60440:31;60255:223;:::o;60484:366::-;60626:3;60647:67;60711:2;60706:3;60647:67;:::i;:::-;60640:74;;60723:93;60812:3;60723:93;:::i;:::-;60841:2;60836:3;60832:12;60825:19;;60484:366;;;:::o;60856:419::-;61022:4;61060:2;61049:9;61045:18;61037:26;;61109:9;61103:4;61099:20;61095:1;61084:9;61080:17;61073:47;61137:131;61263:4;61137:131;:::i;:::-;61129:139;;60856:419;;;:::o;61281:549::-;61458:4;61496:2;61485:9;61481:18;61473:26;;61509:71;61577:1;61566:9;61562:17;61553:6;61509:71;:::i;:::-;61590:72;61658:2;61647:9;61643:18;61634:6;61590:72;:::i;:::-;61709:9;61703:4;61699:20;61694:2;61683:9;61679:18;61672:48;61737:86;61818:4;61809:6;61801;61737:86;:::i;:::-;61729:94;;61281:549;;;;;;;:::o;61836:230::-;61976:34;61972:1;61964:6;61960:14;61953:58;62045:13;62040:2;62032:6;62028:15;62021:38;61836:230;:::o;62072:366::-;62214:3;62235:67;62299:2;62294:3;62235:67;:::i;:::-;62228:74;;62311:93;62400:3;62311:93;:::i;:::-;62429:2;62424:3;62420:12;62413:19;;62072:366;;;:::o;62444:419::-;62610:4;62648:2;62637:9;62633:18;62625:26;;62697:9;62691:4;62687:20;62683:1;62672:9;62668:17;62661:47;62725:131;62851:4;62725:131;:::i;:::-;62717:139;;62444:419;;;:::o;62869:165::-;63009:17;63005:1;62997:6;62993:14;62986:41;62869:165;:::o;63040:366::-;63182:3;63203:67;63267:2;63262:3;63203:67;:::i;:::-;63196:74;;63279:93;63368:3;63279:93;:::i;:::-;63397:2;63392:3;63388:12;63381:19;;63040:366;;;:::o;63412:419::-;63578:4;63616:2;63605:9;63601:18;63593:26;;63665:9;63659:4;63655:20;63651:1;63640:9;63636:17;63629:47;63693:131;63819:4;63693:131;:::i;:::-;63685:139;;63412:419;;;:::o;63837:161::-;63977:13;63973:1;63965:6;63961:14;63954:37;63837:161;:::o;64004:366::-;64146:3;64167:67;64231:2;64226:3;64167:67;:::i;:::-;64160:74;;64243:93;64332:3;64243:93;:::i;:::-;64361:2;64356:3;64352:12;64345:19;;64004:366;;;:::o;64376:419::-;64542:4;64580:2;64569:9;64565:18;64557:26;;64629:9;64623:4;64619:20;64615:1;64604:9;64600:17;64593:47;64657:131;64783:4;64657:131;:::i;:::-;64649:139;;64376:419;;;:::o;64801:172::-;64941:24;64937:1;64929:6;64925:14;64918:48;64801:172;:::o;64979:366::-;65121:3;65142:67;65206:2;65201:3;65142:67;:::i;:::-;65135:74;;65218:93;65307:3;65218:93;:::i;:::-;65336:2;65331:3;65327:12;65320:19;;64979:366;;;:::o;65351:419::-;65517:4;65555:2;65544:9;65540:18;65532:26;;65604:9;65598:4;65594:20;65590:1;65579:9;65575:17;65568:47;65632:131;65758:4;65632:131;:::i;:::-;65624:139;;65351:419;;;:::o;65776:96::-;65810:8;65859:5;65854:3;65850:15;65829:36;;65776:96;;;:::o;65878:94::-;65916:7;65945:21;65960:5;65945:21;:::i;:::-;65934:32;;65878:94;;;:::o;65978:153::-;66081:43;66100:23;66117:5;66100:23;:::i;:::-;66081:43;:::i;:::-;66076:3;66069:56;65978:153;;:::o;66137:533::-;66303:3;66318:75;66389:3;66380:6;66318:75;:::i;:::-;66418:2;66413:3;66409:12;66402:19;;66431:75;66502:3;66493:6;66431:75;:::i;:::-;66531:2;66526:3;66522:12;66515:19;;66544:73;66613:3;66604:6;66544:73;:::i;:::-;66642:1;66637:3;66633:11;66626:18;;66661:3;66654:10;;66137:533;;;;;;:::o;66676:180::-;66724:77;66721:1;66714:88;66821:4;66818:1;66811:15;66845:4;66842:1;66835:15;66862:176;66894:1;66911:20;66929:1;66911:20;:::i;:::-;66906:25;;66945:20;66963:1;66945:20;:::i;:::-;66940:25;;66984:1;66974:35;;66989:18;;:::i;:::-;66974:35;67030:1;67027;67023:9;67018:14;;66862:176;;;;:::o;67044:391::-;67135:4;67189:11;67176:25;67289:1;67283:4;67279:12;67268:8;67252:14;67248:29;67244:48;67224:18;67220:73;67210:168;;67297:79;;:::i;:::-;67210:168;67409:18;67399:8;67395:33;67387:41;;67140:295;67044:391;;;;:::o;67441:740::-;67534:4;67540:6;67596:11;67583:25;67696:1;67690:4;67686:12;67675:8;67659:14;67655:29;67651:48;67631:18;67627:73;67617:168;;67704:79;;:::i;:::-;67617:168;67816:18;67806:8;67802:33;67794:41;;67868:4;67855:18;67845:28;;67896:18;67888:6;67885:30;67882:117;;;67918:79;;:::i;:::-;67882:117;68026:2;68020:4;68016:13;68008:21;;68083:4;68075:6;68071:17;68055:14;68051:38;68045:4;68041:49;68038:136;;;68093:79;;:::i;:::-;68038:136;67547:634;67441:740;;;;;:::o;68187:170::-;68327:22;68323:1;68315:6;68311:14;68304:46;68187:170;:::o;68363:366::-;68505:3;68526:67;68590:2;68585:3;68526:67;:::i;:::-;68519:74;;68602:93;68691:3;68602:93;:::i;:::-;68720:2;68715:3;68711:12;68704:19;;68363:366;;;:::o;68735:419::-;68901:4;68939:2;68928:9;68924:18;68916:26;;68988:9;68982:4;68978:20;68974:1;68963:9;68959:17;68952:47;69016:131;69142:4;69016:131;:::i;:::-;69008:139;;68735:419;;;:::o;69160:553::-;69337:4;69375:3;69364:9;69360:19;69352:27;;69389:71;69457:1;69446:9;69442:17;69433:6;69389:71;:::i;:::-;69470:72;69538:2;69527:9;69523:18;69514:6;69470:72;:::i;:::-;69552;69620:2;69609:9;69605:18;69596:6;69552:72;:::i;:::-;69634;69702:2;69691:9;69687:18;69678:6;69634:72;:::i;:::-;69160:553;;;;;;;:::o;69719:85::-;69764:7;69793:5;69782:16;;69719:85;;;:::o;69810:156::-;69867:9;69900:60;69917:42;69926:32;69952:5;69926:32;:::i;:::-;69917:42;:::i;:::-;69900:60;:::i;:::-;69887:73;;69810:156;;;:::o;69972:145::-;70066:44;70104:5;70066:44;:::i;:::-;70061:3;70054:57;69972:145;;:::o;70123:236::-;70223:4;70261:2;70250:9;70246:18;70238:26;;70274:78;70349:1;70338:9;70334:17;70325:6;70274:78;:::i;:::-;70123:236;;;;:::o;70365:174::-;70505:26;70501:1;70493:6;70489:14;70482:50;70365:174;:::o;70545:366::-;70687:3;70708:67;70772:2;70767:3;70708:67;:::i;:::-;70701:74;;70784:93;70873:3;70784:93;:::i;:::-;70902:2;70897:3;70893:12;70886:19;;70545:366;;;:::o;70917:419::-;71083:4;71121:2;71110:9;71106:18;71098:26;;71170:9;71164:4;71160:20;71156:1;71145:9;71141:17;71134:47;71198:131;71324:4;71198:131;:::i;:::-;71190:139;;70917:419;;;:::o;71342:171::-;71381:3;71404:24;71422:5;71404:24;:::i;:::-;71395:33;;71450:4;71443:5;71440:15;71437:41;;71458:18;;:::i;:::-;71437:41;71505:1;71498:5;71494:13;71487:20;;71342:171;;;:::o;71519:185::-;71559:1;71576:20;71594:1;71576:20;:::i;:::-;71571:25;;71610:20;71628:1;71610:20;:::i;:::-;71605:25;;71649:1;71639:35;;71654:18;;:::i;:::-;71639:35;71696:1;71693;71689:9;71684:14;;71519:185;;;;:::o;71710:170::-;71850:22;71846:1;71838:6;71834:14;71827:46;71710:170;:::o;71886:366::-;72028:3;72049:67;72113:2;72108:3;72049:67;:::i;:::-;72042:74;;72125:93;72214:3;72125:93;:::i;:::-;72243:2;72238:3;72234:12;72227:19;;71886:366;;;:::o;72258:419::-;72424:4;72462:2;72451:9;72447:18;72439:26;;72511:9;72505:4;72501:20;72497:1;72486:9;72482:17;72475:47;72539:131;72665:4;72539:131;:::i;:::-;72531:139;;72258:419;;;:::o;72683:114::-;;:::o;72803:398::-;72962:3;72983:83;73064:1;73059:3;72983:83;:::i;:::-;72976:90;;73075:93;73164:3;73075:93;:::i;:::-;73193:1;73188:3;73184:11;73177:18;;72803:398;;;:::o;73207:379::-;73391:3;73413:147;73556:3;73413:147;:::i;:::-;73406:154;;73577:3;73570:10;;73207:379;;;:::o;73592:161::-;73732:13;73728:1;73720:6;73716:14;73709:37;73592:161;:::o;73759:366::-;73901:3;73922:67;73986:2;73981:3;73922:67;:::i;:::-;73915:74;;73998:93;74087:3;73998:93;:::i;:::-;74116:2;74111:3;74107:12;74100:19;;73759:366;;;:::o;74131:419::-;74297:4;74335:2;74324:9;74320:18;74312:26;;74384:9;74378:4;74374:20;74370:1;74359:9;74355:17;74348:47;74412:131;74538:4;74412:131;:::i;:::-;74404:139;;74131:419;;;:::o;74556:179::-;74696:31;74692:1;74684:6;74680:14;74673:55;74556:179;:::o;74741:366::-;74883:3;74904:67;74968:2;74963:3;74904:67;:::i;:::-;74897:74;;74980:93;75069:3;74980:93;:::i;:::-;75098:2;75093:3;75089:12;75082:19;;74741:366;;;:::o;75113:529::-;75307:4;75345:2;75334:9;75330:18;75322:26;;75358:71;75426:1;75415:9;75411:17;75402:6;75358:71;:::i;:::-;75476:9;75470:4;75466:20;75461:2;75450:9;75446:18;75439:48;75504:131;75630:4;75504:131;:::i;:::-;75496:139;;75113:529;;;;:::o;75648:177::-;75788:29;75784:1;75776:6;75772:14;75765:53;75648:177;:::o;75831:366::-;75973:3;75994:67;76058:2;76053:3;75994:67;:::i;:::-;75987:74;;76070:93;76159:3;76070:93;:::i;:::-;76188:2;76183:3;76179:12;76172:19;;75831:366;;;:::o;76203:529::-;76397:4;76435:2;76424:9;76420:18;76412:26;;76448:71;76516:1;76505:9;76501:17;76492:6;76448:71;:::i;:::-;76566:9;76560:4;76556:20;76551:2;76540:9;76536:18;76529:48;76594:131;76720:4;76594:131;:::i;:::-;76586:139;;76203:529;;;;:::o;76738:182::-;76878:34;76874:1;76866:6;76862:14;76855:58;76738:182;:::o;76926:366::-;77068:3;77089:67;77153:2;77148:3;77089:67;:::i;:::-;77082:74;;77165:93;77254:3;77165:93;:::i;:::-;77283:2;77278:3;77274:12;77267:19;;76926:366;;;:::o;77298:529::-;77492:4;77530:2;77519:9;77515:18;77507:26;;77543:71;77611:1;77600:9;77596:17;77587:6;77543:71;:::i;:::-;77661:9;77655:4;77651:20;77646:2;77635:9;77631:18;77624:48;77689:131;77815:4;77689:131;:::i;:::-;77681:139;;77298:529;;;;:::o;77833:233::-;77872:3;77895:24;77913:5;77895:24;:::i;:::-;77886:33;;77941:66;77934:5;77931:77;77928:103;;78011:18;;:::i;:::-;77928:103;78058:1;78051:5;78047:13;78040:20;;77833:233;;;:::o;78258:724::-;78335:4;78341:6;78397:11;78384:25;78497:1;78491:4;78487:12;78476:8;78460:14;78456:29;78452:48;78432:18;78428:73;78418:168;;78505:79;;:::i;:::-;78418:168;78617:18;78607:8;78603:33;78595:41;;78669:4;78656:18;78646:28;;78697:18;78689:6;78686:30;78683:117;;;78719:79;;:::i;:::-;78683:117;78827:2;78821:4;78817:13;78809:21;;78884:4;78876:6;78872:17;78856:14;78852:38;78846:4;78842:49;78839:136;;;78894:79;;:::i;:::-;78839:136;78348:634;78258:724;;;;;:::o;78988:96::-;79046:6;79074:3;79064:13;;78988:96;;;;:::o;79090:140::-;79138:4;79161:3;79153:11;;79184:3;79181:1;79174:14;79218:4;79215:1;79205:18;79197:26;;79090:140;;;:::o;79236:93::-;79273:6;79320:2;79315;79308:5;79304:14;79300:23;79290:33;;79236:93;;;:::o;79335:107::-;79379:8;79429:5;79423:4;79419:16;79398:37;;79335:107;;;;:::o;79448:393::-;79517:6;79567:1;79555:10;79551:18;79590:97;79620:66;79609:9;79590:97;:::i;:::-;79708:39;79738:8;79727:9;79708:39;:::i;:::-;79696:51;;79780:4;79776:9;79769:5;79765:21;79756:30;;79829:4;79819:8;79815:19;79808:5;79805:30;79795:40;;79524:317;;79448:393;;;;;:::o;79847:142::-;79897:9;79930:53;79948:34;79957:24;79975:5;79957:24;:::i;:::-;79948:34;:::i;:::-;79930:53;:::i;:::-;79917:66;;79847:142;;;:::o;79995:75::-;80038:3;80059:5;80052:12;;79995:75;;;:::o;80076:269::-;80186:39;80217:7;80186:39;:::i;:::-;80247:91;80296:41;80320:16;80296:41;:::i;:::-;80288:6;80281:4;80275:11;80247:91;:::i;:::-;80241:4;80234:105;80152:193;80076:269;;;:::o;80351:73::-;80396:3;80351:73;:::o;80430:189::-;80507:32;;:::i;:::-;80548:65;80606:6;80598;80592:4;80548:65;:::i;:::-;80483:136;80430:189;;:::o;80625:186::-;80685:120;80702:3;80695:5;80692:14;80685:120;;;80756:39;80793:1;80786:5;80756:39;:::i;:::-;80729:1;80722:5;80718:13;80709:22;;80685:120;;;80625:186;;:::o;80817:541::-;80917:2;80912:3;80909:11;80906:445;;;80951:37;80982:5;80951:37;:::i;:::-;81034:29;81052:10;81034:29;:::i;:::-;81024:8;81020:44;81217:2;81205:10;81202:18;81199:49;;;81238:8;81223:23;;81199:49;81261:80;81317:22;81335:3;81317:22;:::i;:::-;81307:8;81303:37;81290:11;81261:80;:::i;:::-;80921:430;;80906:445;80817:541;;;:::o;81364:117::-;81418:8;81468:5;81462:4;81458:16;81437:37;;81364:117;;;;:::o;81487:169::-;81531:6;81564:51;81612:1;81608:6;81600:5;81597:1;81593:13;81564:51;:::i;:::-;81560:56;81645:4;81639;81635:15;81625:25;;81538:118;81487:169;;;;:::o;81661:295::-;81737:4;81883:29;81908:3;81902:4;81883:29;:::i;:::-;81875:37;;81945:3;81942:1;81938:11;81932:4;81929:21;81921:29;;81661:295;;;;:::o;81961:1398::-;82083:43;82122:3;82117;82083:43;:::i;:::-;82191:18;82183:6;82180:30;82177:56;;;82213:18;;:::i;:::-;82177:56;82257:38;82289:4;82283:11;82257:38;:::i;:::-;82342:66;82401:6;82393;82387:4;82342:66;:::i;:::-;82435:1;82464:2;82456:6;82453:14;82481:1;82476:631;;;;83151:1;83168:6;83165:84;;;83224:9;83219:3;83215:19;83202:33;83193:42;;83165:84;83275:67;83335:6;83328:5;83275:67;:::i;:::-;83269:4;83262:81;83124:229;82446:907;;82476:631;82528:4;82524:9;82516:6;82512:22;82562:36;82593:4;82562:36;:::i;:::-;82620:1;82634:215;82648:7;82645:1;82642:14;82634:215;;;82734:9;82729:3;82725:19;82712:33;82704:6;82697:49;82785:1;82777:6;82773:14;82763:24;;82832:2;82821:9;82817:18;82804:31;;82671:4;82668:1;82664:12;82659:17;;82634:215;;;82877:6;82868:7;82865:19;82862:186;;;82942:9;82937:3;82933:19;82920:33;82985:48;83027:4;83019:6;83015:17;83004:9;82985:48;:::i;:::-;82977:6;82970:64;82885:163;82862:186;83094:1;83090;83082:6;83078:14;83074:22;83068:4;83061:36;82483:624;;;82446:907;;82058:1301;;;81961:1398;;;:::o;83365:214::-;83478:95;83565:7;83556;83550:4;83478:95;:::i;:::-;83365:214;;;:::o;83585:483::-;83753:1;83747:4;83743:12;83799:1;83792:5;83788:13;83864:62;83913:12;83906:5;83864:62;:::i;:::-;83940:110;84036:13;84021;84009:10;83940:110;:::i;:::-;83710:351;;;;83585:483;;:::o;84074:240::-;84202:106;84300:7;84294:4;84202:106;:::i;:::-;84074:240;;:::o;84320:247::-;84460:34;84456:1;84448:6;84444:14;84437:58;84529:30;84524:2;84516:6;84512:15;84505:55;84320:247;:::o;84573:366::-;84715:3;84736:67;84800:2;84795:3;84736:67;:::i;:::-;84729:74;;84812:93;84901:3;84812:93;:::i;:::-;84930:2;84925:3;84921:12;84914:19;;84573:366;;;:::o;84945:419::-;85111:4;85149:2;85138:9;85134:18;85126:26;;85198:9;85192:4;85188:20;85184:1;85173:9;85169:17;85162:47;85226:131;85352:4;85226:131;:::i;:::-;85218:139;;84945:419;;;:::o;85370:243::-;85510:34;85506:1;85498:6;85494:14;85487:58;85579:26;85574:2;85566:6;85562:15;85555:51;85370:243;:::o;85619:366::-;85761:3;85782:67;85846:2;85841:3;85782:67;:::i;:::-;85775:74;;85858:93;85947:3;85858:93;:::i;:::-;85976:2;85971:3;85967:12;85960:19;;85619:366;;;:::o;85991:419::-;86157:4;86195:2;86184:9;86180:18;86172:26;;86244:9;86238:4;86234:20;86230:1;86219:9;86215:17;86208:47;86272:131;86398:4;86272:131;:::i;:::-;86264:139;;85991:419;;;:::o;86416:238::-;86556:34;86552:1;86544:6;86540:14;86533:58;86625:21;86620:2;86612:6;86608:15;86601:46;86416:238;:::o;86660:366::-;86802:3;86823:67;86887:2;86882:3;86823:67;:::i;:::-;86816:74;;86899:93;86988:3;86899:93;:::i;:::-;87017:2;87012:3;87008:12;87001:19;;86660:366;;;:::o;87032:419::-;87198:4;87236:2;87225:9;87221:18;87213:26;;87285:9;87279:4;87275:20;87271:1;87260:9;87256:17;87249:47;87313:131;87439:4;87313:131;:::i;:::-;87305:139;;87032:419;;;:::o;87457:102::-;87499:8;87546:5;87543:1;87539:13;87518:34;;87457:102;;;:::o;87565:848::-;87626:5;87633:4;87657:6;87648:15;;87681:5;87672:14;;87695:712;87716:1;87706:8;87703:15;87695:712;;;87811:4;87806:3;87802:14;87796:4;87793:24;87790:50;;;87820:18;;:::i;:::-;87790:50;87870:1;87860:8;87856:16;87853:451;;;88285:4;88278:5;88274:16;88265:25;;87853:451;88335:4;88329;88325:15;88317:23;;88365:32;88388:8;88365:32;:::i;:::-;88353:44;;87695:712;;;87565:848;;;;;;;:::o;88419:1073::-;88473:5;88664:8;88654:40;;88685:1;88676:10;;88687:5;;88654:40;88713:4;88703:36;;88730:1;88721:10;;88732:5;;88703:36;88799:4;88847:1;88842:27;;;;88883:1;88878:191;;;;88792:277;;88842:27;88860:1;88851:10;;88862:5;;;88878:191;88923:3;88913:8;88910:17;88907:43;;;88930:18;;:::i;:::-;88907:43;88979:8;88976:1;88972:16;88963:25;;89014:3;89007:5;89004:14;89001:40;;;89021:18;;:::i;:::-;89001:40;89054:5;;;88792:277;;89178:2;89168:8;89165:16;89159:3;89153:4;89150:13;89146:36;89128:2;89118:8;89115:16;89110:2;89104:4;89101:12;89097:35;89081:111;89078:246;;;89234:8;89228:4;89224:19;89215:28;;89269:3;89262:5;89259:14;89256:40;;;89276:18;;:::i;:::-;89256:40;89309:5;;89078:246;89349:42;89387:3;89377:8;89371:4;89368:1;89349:42;:::i;:::-;89334:57;;;;89423:4;89418:3;89414:14;89407:5;89404:25;89401:51;;;89432:18;;:::i;:::-;89401:51;89481:4;89474:5;89470:16;89461:25;;88419:1073;;;;;;:::o;89498:93::-;89534:7;89574:10;89567:5;89563:22;89552:33;;89498:93;;;:::o;89597:283::-;89656:5;89680:23;89698:4;89680:23;:::i;:::-;89672:31;;89724:26;89741:8;89724:26;:::i;:::-;89712:38;;89769:104;89806:66;89796:8;89790:4;89769:104;:::i;:::-;89760:113;;89597:283;;;;:::o;89886:226::-;89920:3;89943:22;89959:5;89943:22;:::i;:::-;89934:31;;89987:66;89980:5;89977:77;89974:103;;90057:18;;:::i;:::-;89974:103;90100:5;90097:1;90093:13;90086:20;;89886:226;;;:::o;90118:122::-;90191:24;90209:5;90191:24;:::i;:::-;90184:5;90181:35;90171:63;;90230:1;90227;90220:12;90171:63;90118:122;:::o;90246:143::-;90303:5;90334:6;90328:13;90319:22;;90350:33;90377:5;90350:33;:::i;:::-;90246:143;;;;:::o;90395:351::-;90465:6;90514:2;90502:9;90493:7;90489:23;90485:32;90482:119;;;90520:79;;:::i;:::-;90482:119;90640:1;90665:64;90721:7;90712:6;90701:9;90697:22;90665:64;:::i;:::-;90655:74;;90611:128;90395:351;;;;:::o;90752:171::-;90892:23;90888:1;90880:6;90876:14;90869:47;90752:171;:::o;90929:366::-;91071:3;91092:67;91156:2;91151:3;91092:67;:::i;:::-;91085:74;;91168:93;91257:3;91168:93;:::i;:::-;91286:2;91281:3;91277:12;91270:19;;90929:366;;;:::o;91301:419::-;91467:4;91505:2;91494:9;91490:18;91482:26;;91554:9;91548:4;91544:20;91540:1;91529:9;91525:17;91518:47;91582:131;91708:4;91582:131;:::i;:::-;91574:139;;91301:419;;;:::o;91726:116::-;91777:4;91800:3;91792:11;;91830:4;91825:3;91821:14;91813:22;;91726:116;;;:::o;91848:154::-;91891:11;91927:29;91951:3;91945:10;91927:29;:::i;:::-;91990:5;91966:29;;91903:99;91848:154;;;:::o;92008:594::-;92092:5;92123:38;92155:5;92123:38;:::i;:::-;92186:5;92213:40;92247:5;92213:40;:::i;:::-;92201:52;;92272:35;92298:8;92272:35;:::i;:::-;92263:44;;92331:2;92323:6;92320:14;92317:278;;;92402:169;92487:66;92457:6;92453:2;92449:15;92446:1;92442:23;92402:169;:::i;:::-;92379:5;92358:227;92349:236;;92317:278;92098:504;;92008:594;;;:::o;92608:430::-;92751:4;92789:2;92778:9;92774:18;92766:26;;92802:71;92870:1;92859:9;92855:17;92846:6;92802:71;:::i;:::-;92883:70;92949:2;92938:9;92934:18;92925:6;92883:70;:::i;:::-;92963:68;93027:2;93016:9;93012:18;93003:6;92963:68;:::i;:::-;92608:430;;;;;;:::o;93044:221::-;93184:34;93180:1;93172:6;93168:14;93161:58;93253:4;93248:2;93240:6;93236:15;93229:29;93044:221;:::o;93271:366::-;93413:3;93434:67;93498:2;93493:3;93434:67;:::i;:::-;93427:74;;93510:93;93599:3;93510:93;:::i;:::-;93628:2;93623:3;93619:12;93612:19;;93271:366;;;:::o;93643:419::-;93809:4;93847:2;93836:9;93832:18;93824:26;;93896:9;93890:4;93886:20;93882:1;93871:9;93867:17;93860:47;93924:131;94050:4;93924:131;:::i;:::-;93916:139;;93643:419;;;:::o;94068:76::-;94104:7;94133:5;94122:16;;94068:76;;;:::o;94150:228::-;94185:3;94208:23;94225:5;94208:23;:::i;:::-;94199:32;;94253:66;94246:5;94243:77;94240:103;;94323:18;;:::i;:::-;94240:103;94366:5;94363:1;94359:13;94352:20;;94150:228;;;:::o","linkReferences":{},"immutableReferences":{"468":[{"start":15849,"length":32},{"start":15934,"length":32},{"start":16376,"length":32}]}},"methodIdentifiers":{"BURN_ACTOR()":"0a6a63f1","EXTRA_DATA_MAX_SIZE()":"029b4646","FIL_USD_PRICE_FEED_ID()":"19c75950","LEAF_SIZE()":"c0e15949","MAX_ENQUEUED_REMOVALS()":"9f8cb3bd","MAX_ROOT_SIZE()":"16e2bcd5","NO_CHALLENGE_SCHEDULED()":"462dd449","NO_PROVEN_EPOCH()":"f178b1be","PYTH()":"67e406d5","RANDOMNESS_PRECOMPILE()":"15b17570","SECONDS_IN_DAY()":"61a52a36","UPGRADE_INTERFACE_VERSION()":"ad3cb1cc","addRoots(uint256,((bytes),uint256)[],bytes)":"11c0ee4a","calculateProofFee(uint256,uint256)":"4903704a","claimProofSetOwnership(uint256)":"ee3dac65","createProofSet(address,bytes)":"0a4d7932","deleteProofSet(uint256,bytes)":"847d1d06","findRootIds(uint256,uint256[])":"0528a55b","getChallengeFinality()":"f83758fe","getChallengeRange(uint256)":"89208ba9","getFILUSDPrice()":"4fa27920","getNextChallengeEpoch(uint256)":"6ba4608f","getNextProofSetId()":"8ea417e5","getNextRootId(uint256)":"d49245c1","getProofSetLastProvenEpoch(uint256)":"faa67163","getProofSetLeafCount(uint256)":"3f84135f","getProofSetListener(uint256)":"31601226","getProofSetOwner(uint256)":"4726075b","getRandomness(uint256)":"453f4f62","getRootCid(uint256,uint256)":"3b7ae913","getRootLeafCount(uint256,uint256)":"9153e64b","getScheduledRemovals(uint256)":"6fa44692","initialize(uint256)":"fe4b84df","nextProvingPeriod(uint256,uint256,bytes)":"45c0b92d","owner()":"8da5cb5b","proofSetLive(uint256)":"f5cac1ba","proposeProofSetOwner(uint256,address)":"6cb55c16","provePossession(uint256,(bytes32,bytes32[])[])":"f58f952b","proxiableUUID()":"52d1902d","renounceOwnership()":"715018a6","rootChallengable(uint256,uint256)":"71cf2a16","rootLive(uint256,uint256)":"47331050","scheduleRemovals(uint256,uint256[],bytes)":"3b68e4e9","transferOwnership(address)":"f2fde38b","upgradeToAndCall(address,bytes)":"4f1ef286"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"msg\",\"type\":\"string\"}],\"name\":\"IndexedError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Debug\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"leafCount\",\"type\":\"uint256\"}],\"name\":\"NextProvingPeriod\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"rootId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"struct PDPVerifier.RootIdAndOffset[]\",\"name\":\"challenges\",\"type\":\"tuple[]\"}],\"name\":\"PossessionProven\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"price\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"}],\"name\":\"ProofFeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ProofSetCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deletedLeafCount\",\"type\":\"uint256\"}],\"name\":\"ProofSetDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"ProofSetEmpty\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"ProofSetOwnerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"rootIds\",\"type\":\"uint256[]\"}],\"name\":\"RootsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"rootIds\",\"type\":\"uint256[]\"}],\"name\":\"RootsRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BURN_ACTOR\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTRA_DATA_MAX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FIL_USD_PRICE_FEED_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LEAF_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ENQUEUED_REMOVALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ROOT_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NO_CHALLENGE_SCHEDULED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NO_PROVEN_EPOCH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PYTH\",\"outputs\":[{\"internalType\":\"contract IPyth\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RANDOMNESS_PRECOMPILE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SECONDS_IN_DAY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Cids.Cid\",\"name\":\"root\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"rawSize\",\"type\":\"uint256\"}],\"internalType\":\"struct PDPVerifier.RootData[]\",\"name\":\"rootData\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"addRoots\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"estimatedGasFee\",\"type\":\"uint256\"}],\"name\":\"calculateProofFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"claimProofSetOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"listenerAddr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"createProofSet\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"deleteProofSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"leafIndexs\",\"type\":\"uint256[]\"}],\"name\":\"findRootIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"rootId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"}],\"internalType\":\"struct PDPVerifier.RootIdAndOffset[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChallengeFinality\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getChallengeRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFILUSDPrice\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"\",\"type\":\"int32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getNextChallengeEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextProofSetId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getNextRootId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getProofSetLastProvenEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getProofSetLeafCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getProofSetListener\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getProofSetOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"getRandomness\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rootId\",\"type\":\"uint256\"}],\"name\":\"getRootCid\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Cids.Cid\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rootId\",\"type\":\"uint256\"}],\"name\":\"getRootLeafCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getScheduledRemovals\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_challengeFinality\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"challengeEpoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"nextProvingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"proofSetLive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"proposeProofSetOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"leaf\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct PDPVerifier.Proof[]\",\"name\":\"proofs\",\"type\":\"tuple[]\"}],\"name\":\"provePossession\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rootId\",\"type\":\"uint256\"}],\"name\":\"rootChallengable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rootId\",\"type\":\"uint256\"}],\"name\":\"rootLive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"rootIds\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"scheduleRemovals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/PDPVerifier.sol\":\"PDPVerifier\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@pythnetwork/pyth-sdk-solidity/=node_modules/@pythnetwork/pyth-sdk-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x8816653b632f8f634b78885c35112232b44acbf6033ec9e5065d2dd94946b15a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c16be456b19a1dbaaff7e89b9f6f5c92a02544d5d5f89222a9f57b5a8cfc2f0\",\"dweb:/ipfs/QmS4aeG6paPRwAM1puekhkyGR4mHuMUzFz3riVDv7fbvvB\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"keccak256\":\"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d\",\"dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7\"]},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196\",\"dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA\"]},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x02caa0e5f7bade9a0d8ad6058467d641cb67697cd4678c7b1c170686bafe9128\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33b42a434f5d5fdc5071be05238059b9d8938bdab510071a5c300a975abc405a\",\"dweb:/ipfs/QmaThmoD3JMdHGhn4GUJbEGnKcojUG8PWMFoC7DFcQoeCw\"]},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0x9d8da059267bac779a2dbbb9a26c2acf00ca83085e105d62d5d4ef96054a47f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c78e2aa4313323cecd1ef12a8d6265b96beee1a199923abf55d9a2a9e291ad23\",\"dweb:/ipfs/QmUTs2KStXucZezzFo3EYeqYu47utu56qrF7jj1Gue65vb\"]},\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"node_modules/@pythnetwork/pyth-sdk-solidity/IPyth.sol\":{\"keccak256\":\"0x217532ece69b8e472a6260b740c34aebfb5a299bbfed6392cf0458ed368be7ab\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://02d1b71006ccdfd6402a2b72ea197babbd1b54c26a70ebb76a114f0ae8352f08\",\"dweb:/ipfs/QmbqfuvwriG3AEwYEwupUaQKgfxRYK6Qui99o6wQysPoP3\"]},\"node_modules/@pythnetwork/pyth-sdk-solidity/IPythEvents.sol\":{\"keccak256\":\"0x7ca8e03315d4516d6833c425a52c43e8cacf2077492074d2d36ae5c17899c9c8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ad1c69d157eccb09ce248e1ec021f2e58b61dd36160f5be3973a7bea4a899f64\",\"dweb:/ipfs/QmW1yXsDrMsuQKxtZanSZXpyUW2QwnCKVoCjS5fC3NoSVY\"]},\"node_modules/@pythnetwork/pyth-sdk-solidity/PythStructs.sol\":{\"keccak256\":\"0xade221177dda98ebd194c363f264ceea125bde0e6a7a72f7b54da3ac60316894\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a404dbbc64183995326c345cae27601d37c783b3d9030c8dc0ab4943fa2bf1da\",\"dweb:/ipfs/QmfNFesQffYisafmJFbKHxVFSD8fY49X1z9f8N7qtfW8AX\"]},\"src/BitOps.sol\":{\"keccak256\":\"0x55fc8272df01302eba6fde6174e691ec86f791c39ac9b1c6a5e4ca1792439ca4\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://1e4de6ed5f6e6180261728a590eeb629de65db443f4f279801c03a1bc14201d7\",\"dweb:/ipfs/QmeCcCjy88QJwCkZoGbeZVjxksePwTcmhKevtA2F3kRXaT\"]},\"src/Cids.sol\":{\"keccak256\":\"0x4085c3a55cdf809251a469829bae218d03db4afd9455dab674a8a2ab3b7451dc\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://93406cf5db1b0fa908c306ab6c4d42f69990e9fd08c781de871724c525097803\",\"dweb:/ipfs/QmXkXwjhEo929M6qBXkHKBT3DowiVYcLEe5oUkFnjFJMy2\"]},\"src/Fees.sol\":{\"keccak256\":\"0x74945bddcdd334715c9fab53deba13867f17855976ae64c33abdc84dc439feb0\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://8c7ee756cc406b4192220c54c3e66908a32887c32519461e2dbae8eff144691c\",\"dweb:/ipfs/Qmdy23cwyFG2xbv1htf8FCGwFPfY98rfoKFJ9G6zcWiRkk\"]},\"src/PDPVerifier.sol\":{\"keccak256\":\"0x281e77ce7e1f0eef0d3db9be6116ed71cee92c3b8181dc3c47ff582878ca7fb7\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://63b491e882199f57ce1c5f06ce57b257e40d9c6d38eb62be61d9eba4c7103fe3\",\"dweb:/ipfs/QmQr7NGETKtAcbHJhQ6ZxwB5yoHAwukjVjZwQQGd836KRk\"]},\"src/Proofs.sol\":{\"keccak256\":\"0xf8d27dd91086ba2b4521f36227d92aae35c9f8dfcb117c775e2417166e15a737\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8db46f122470a14d2c084655c6fada18c966accca05feae92923b1ace7a9f86b\",\"dweb:/ipfs/QmQWGxWUcpejzJt28gwbKfq5C3LLiB5HrHdXMja6HHYxbj\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.23+commit.f704f362"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ERC1967InvalidImplementation"},{"inputs":[],"type":"error","name":"ERC1967NonPayable"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"string","name":"msg","type":"string"}],"type":"error","name":"IndexedError"},{"inputs":[],"type":"error","name":"InvalidInitialization"},{"inputs":[],"type":"error","name":"NotInitializing"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"UUPSUnauthorizedCallContext"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"type":"error","name":"UUPSUnsupportedProxiableUUID"},{"inputs":[{"internalType":"string","name":"message","type":"string","indexed":false},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Debug","anonymous":false},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256","name":"challengeEpoch","type":"uint256","indexed":false},{"internalType":"uint256","name":"leafCount","type":"uint256","indexed":false}],"type":"event","name":"NextProvingPeriod","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"struct PDPVerifier.RootIdAndOffset[]","name":"challenges","type":"tuple[]","components":[{"internalType":"uint256","name":"rootId","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"}],"indexed":false}],"type":"event","name":"PossessionProven","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256","name":"fee","type":"uint256","indexed":false},{"internalType":"uint64","name":"price","type":"uint64","indexed":false},{"internalType":"int32","name":"expo","type":"int32","indexed":false}],"type":"event","name":"ProofFeePaid","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true}],"type":"event","name":"ProofSetCreated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256","name":"deletedLeafCount","type":"uint256","indexed":false}],"type":"event","name":"ProofSetDeleted","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true}],"type":"event","name":"ProofSetEmpty","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"address","name":"oldOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"ProofSetOwnerChanged","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256[]","name":"rootIds","type":"uint256[]","indexed":false}],"type":"event","name":"RootsAdded","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256[]","name":"rootIds","type":"uint256[]","indexed":false}],"type":"event","name":"RootsRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"BURN_ACTOR","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"EXTRA_DATA_MAX_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"FIL_USD_PRICE_FEED_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"LEAF_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_ENQUEUED_REMOVALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_ROOT_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"NO_CHALLENGE_SCHEDULED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"NO_PROVEN_EPOCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PYTH","outputs":[{"internalType":"contract IPyth","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RANDOMNESS_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"SECONDS_IN_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"struct PDPVerifier.RootData[]","name":"rootData","type":"tuple[]","components":[{"internalType":"struct Cids.Cid","name":"root","type":"tuple","components":[{"internalType":"bytes","name":"data","type":"bytes"}]},{"internalType":"uint256","name":"rawSize","type":"uint256"}]},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"addRoots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"estimatedGasFee","type":"uint256"}],"stateMutability":"view","type":"function","name":"calculateProofFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"claimProofSetOwnership"},{"inputs":[{"internalType":"address","name":"listenerAddr","type":"address"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"createProofSet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"deleteProofSet"},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256[]","name":"leafIndexs","type":"uint256[]"}],"stateMutability":"view","type":"function","name":"findRootIds","outputs":[{"internalType":"struct PDPVerifier.RootIdAndOffset[]","name":"","type":"tuple[]","components":[{"internalType":"uint256","name":"rootId","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getChallengeFinality","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getChallengeRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getFILUSDPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"int32","name":"","type":"int32"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getNextChallengeEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getNextProofSetId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getNextRootId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getProofSetLastProvenEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getProofSetLeafCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getProofSetListener","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getProofSetOwner","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRandomness","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"rootId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRootCid","outputs":[{"internalType":"struct Cids.Cid","name":"","type":"tuple","components":[{"internalType":"bytes","name":"data","type":"bytes"}]}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"rootId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRootLeafCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getScheduledRemovals","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"uint256","name":"_challengeFinality","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"challengeEpoch","type":"uint256"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"nextProvingPeriod"},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"proofSetLive","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"proposeProofSetOwner"},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"struct PDPVerifier.Proof[]","name":"proofs","type":"tuple[]","components":[{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}]}],"stateMutability":"payable","type":"function","name":"provePossession"},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"rootId","type":"uint256"}],"stateMutability":"view","type":"function","name":"rootChallengable","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"rootId","type":"uint256"}],"stateMutability":"view","type":"function","name":"rootLive","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256[]","name":"rootIds","type":"uint256[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"scheduleRemovals"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"}],"devdoc":{"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"owner()":{"details":"Returns the address of the current owner."},"proxiableUUID()":{"details":"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@pythnetwork/pyth-sdk-solidity/=node_modules/@pythnetwork/pyth-sdk-solidity/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/PDPVerifier.sol":"PDPVerifier"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a","urls":["bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6","dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x8816653b632f8f634b78885c35112232b44acbf6033ec9e5065d2dd94946b15a","urls":["bzz-raw://6c16be456b19a1dbaaff7e89b9f6f5c92a02544d5d5f89222a9f57b5a8cfc2f0","dweb:/ipfs/QmS4aeG6paPRwAM1puekhkyGR4mHuMUzFz3riVDv7fbvvB"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol":{"keccak256":"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486","urls":["bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d","dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d","urls":["bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196","dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x02caa0e5f7bade9a0d8ad6058467d641cb67697cd4678c7b1c170686bafe9128","urls":["bzz-raw://33b42a434f5d5fdc5071be05238059b9d8938bdab510071a5c300a975abc405a","dweb:/ipfs/QmaThmoD3JMdHGhn4GUJbEGnKcojUG8PWMFoC7DFcQoeCw"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0x9d8da059267bac779a2dbbb9a26c2acf00ca83085e105d62d5d4ef96054a47f5","urls":["bzz-raw://c78e2aa4313323cecd1ef12a8d6265b96beee1a199923abf55d9a2a9e291ad23","dweb:/ipfs/QmUTs2KStXucZezzFo3EYeqYu47utu56qrF7jj1Gue65vb"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"},"node_modules/@pythnetwork/pyth-sdk-solidity/IPyth.sol":{"keccak256":"0x217532ece69b8e472a6260b740c34aebfb5a299bbfed6392cf0458ed368be7ab","urls":["bzz-raw://02d1b71006ccdfd6402a2b72ea197babbd1b54c26a70ebb76a114f0ae8352f08","dweb:/ipfs/QmbqfuvwriG3AEwYEwupUaQKgfxRYK6Qui99o6wQysPoP3"],"license":"Apache-2.0"},"node_modules/@pythnetwork/pyth-sdk-solidity/IPythEvents.sol":{"keccak256":"0x7ca8e03315d4516d6833c425a52c43e8cacf2077492074d2d36ae5c17899c9c8","urls":["bzz-raw://ad1c69d157eccb09ce248e1ec021f2e58b61dd36160f5be3973a7bea4a899f64","dweb:/ipfs/QmW1yXsDrMsuQKxtZanSZXpyUW2QwnCKVoCjS5fC3NoSVY"],"license":"Apache-2.0"},"node_modules/@pythnetwork/pyth-sdk-solidity/PythStructs.sol":{"keccak256":"0xade221177dda98ebd194c363f264ceea125bde0e6a7a72f7b54da3ac60316894","urls":["bzz-raw://a404dbbc64183995326c345cae27601d37c783b3d9030c8dc0ab4943fa2bf1da","dweb:/ipfs/QmfNFesQffYisafmJFbKHxVFSD8fY49X1z9f8N7qtfW8AX"],"license":"Apache-2.0"},"src/BitOps.sol":{"keccak256":"0x55fc8272df01302eba6fde6174e691ec86f791c39ac9b1c6a5e4ca1792439ca4","urls":["bzz-raw://1e4de6ed5f6e6180261728a590eeb629de65db443f4f279801c03a1bc14201d7","dweb:/ipfs/QmeCcCjy88QJwCkZoGbeZVjxksePwTcmhKevtA2F3kRXaT"],"license":"UNLICENSED"},"src/Cids.sol":{"keccak256":"0x4085c3a55cdf809251a469829bae218d03db4afd9455dab674a8a2ab3b7451dc","urls":["bzz-raw://93406cf5db1b0fa908c306ab6c4d42f69990e9fd08c781de871724c525097803","dweb:/ipfs/QmXkXwjhEo929M6qBXkHKBT3DowiVYcLEe5oUkFnjFJMy2"],"license":"UNLICENSED"},"src/Fees.sol":{"keccak256":"0x74945bddcdd334715c9fab53deba13867f17855976ae64c33abdc84dc439feb0","urls":["bzz-raw://8c7ee756cc406b4192220c54c3e66908a32887c32519461e2dbae8eff144691c","dweb:/ipfs/Qmdy23cwyFG2xbv1htf8FCGwFPfY98rfoKFJ9G6zcWiRkk"],"license":"UNLICENSED"},"src/PDPVerifier.sol":{"keccak256":"0x281e77ce7e1f0eef0d3db9be6116ed71cee92c3b8181dc3c47ff582878ca7fb7","urls":["bzz-raw://63b491e882199f57ce1c5f06ce57b257e40d9c6d38eb62be61d9eba4c7103fe3","dweb:/ipfs/QmQr7NGETKtAcbHJhQ6ZxwB5yoHAwukjVjZwQQGd836KRk"],"license":"UNLICENSED"},"src/Proofs.sol":{"keccak256":"0xf8d27dd91086ba2b4521f36227d92aae35c9f8dfcb117c775e2417166e15a737","urls":["bzz-raw://8db46f122470a14d2c084655c6fada18c966accca05feae92923b1ace7a9f86b","dweb:/ipfs/QmQWGxWUcpejzJt28gwbKfq5C3LLiB5HrHdXMja6HHYxbj"],"license":"MIT"}},"version":1},"id":17} \ No newline at end of file +{"abi":[{"type":"function","name":"addPieces","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"pieceData","type":"tuple[]","internalType":"struct Cids.Cid[]","components":[{"name":"data","type":"bytes","internalType":"bytes"}]},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"claimDataSetStorageProvider","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createDataSet","inputs":[{"name":"listenerAddr","type":"address","internalType":"address"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"dataSetLive","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"deleteDataSet","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"findPieceIds","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"leafIndexs","type":"uint256[]","internalType":"uint256[]"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IPDPTypes.PieceIdAndOffset[]","components":[{"name":"pieceId","type":"uint256","internalType":"uint256"},{"name":"offset","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getChallengeFinality","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getChallengeRange","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getDataSetLastProvenEpoch","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getDataSetLeafCount","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getDataSetListener","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getDataSetStorageProvider","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getNextChallengeEpoch","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNextDataSetId","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getNextPieceId","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getPieceCid","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"pieceId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getPieceLeafCount","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"pieceId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getScheduledRemovals","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"nextProvingPeriod","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"challengeEpoch","type":"uint256","internalType":"uint256"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pieceChallengable","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"pieceId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pieceLive","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"pieceId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"proposeDataSetStorageProvider","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"newStorageProvider","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"provePossession","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"proofs","type":"tuple[]","internalType":"struct IPDPTypes.Proof[]","components":[{"name":"leaf","type":"bytes32","internalType":"bytes32"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}]}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"schedulePieceDeletions","inputs":[{"name":"setId","type":"uint256","internalType":"uint256"},{"name":"pieceIds","type":"uint256[]","internalType":"uint256[]"},{"name":"extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"ContractUpgraded","inputs":[{"name":"version","type":"string","indexed":false,"internalType":"string"},{"name":"newImplementation","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"DataSetCreated","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"storageProvider","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"DataSetDeleted","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"deletedLeafCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DataSetEmpty","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NextProvingPeriod","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"challengeEpoch","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"leafCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PiecesAdded","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pieceIds","type":"uint256[]","indexed":false,"internalType":"uint256[]"},{"name":"pieceCids","type":"tuple[]","indexed":false,"internalType":"struct Cids.Cid[]","components":[{"name":"data","type":"bytes","internalType":"bytes"}]}],"anonymous":false},{"type":"event","name":"PiecesRemoved","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pieceIds","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"PossessionProven","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"challenges","type":"tuple[]","indexed":false,"internalType":"struct IPDPTypes.PieceIdAndOffset[]","components":[{"name":"pieceId","type":"uint256","internalType":"uint256"},{"name":"offset","type":"uint256","internalType":"uint256"}]}],"anonymous":false},{"type":"event","name":"ProofFeePaid","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"price","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"expo","type":"int32","indexed":false,"internalType":"int32"}],"anonymous":false},{"type":"event","name":"StorageProviderChanged","inputs":[{"name":"setId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldStorageProvider","type":"address","indexed":true,"internalType":"address"},{"name":"newStorageProvider","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"addPieces(uint256,(bytes)[],bytes)":"306fc8be","claimDataSetStorageProvider(uint256,bytes)":"df0f3248","createDataSet(address,bytes)":"bbae41cb","dataSetLive(uint256)":"ca759f27","deleteDataSet(uint256,bytes)":"7a1e2990","findPieceIds(uint256,uint256[])":"349c9179","getChallengeFinality()":"f83758fe","getChallengeRange(uint256)":"89208ba9","getDataSetLastProvenEpoch(uint256)":"04595c1a","getDataSetLeafCount(uint256)":"a531998c","getDataSetListener(uint256)":"2b3129bb","getDataSetStorageProvider(uint256)":"21b7cd1c","getNextChallengeEpoch(uint256)":"6ba4608f","getNextDataSetId()":"442cded3","getNextPieceId(uint256)":"1c5ae80f","getPieceCid(uint256,uint256)":"25bbbedf","getPieceLeafCount(uint256,uint256)":"0cd7b880","getScheduledRemovals(uint256)":"6fa44692","nextProvingPeriod(uint256,uint256,bytes)":"45c0b92d","pieceChallengable(uint256,uint256)":"dc635266","pieceLive(uint256,uint256)":"1a271225","proposeDataSetStorageProvider(uint256,address)":"43186080","provePossession(uint256,(bytes32,bytes32[])[])":"f58f952b","schedulePieceDeletions(uint256,uint256[],bytes)":"0c292024"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ContractUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"storageProvider\",\"type\":\"address\"}],\"name\":\"DataSetCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deletedLeafCount\",\"type\":\"uint256\"}],\"name\":\"DataSetDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"DataSetEmpty\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"leafCount\",\"type\":\"uint256\"}],\"name\":\"NextProvingPeriod\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"pieceIds\",\"type\":\"uint256[]\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct Cids.Cid[]\",\"name\":\"pieceCids\",\"type\":\"tuple[]\"}],\"name\":\"PiecesAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"pieceIds\",\"type\":\"uint256[]\"}],\"name\":\"PiecesRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"pieceId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"struct IPDPTypes.PieceIdAndOffset[]\",\"name\":\"challenges\",\"type\":\"tuple[]\"}],\"name\":\"PossessionProven\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"price\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"}],\"name\":\"ProofFeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldStorageProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newStorageProvider\",\"type\":\"address\"}],\"name\":\"StorageProviderChanged\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Cids.Cid[]\",\"name\":\"pieceData\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"addPieces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"claimDataSetStorageProvider\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"listenerAddr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"createDataSet\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"dataSetLive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"deleteDataSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"leafIndexs\",\"type\":\"uint256[]\"}],\"name\":\"findPieceIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"pieceId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"}],\"internalType\":\"struct IPDPTypes.PieceIdAndOffset[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChallengeFinality\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getChallengeRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getDataSetLastProvenEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getDataSetLeafCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getDataSetListener\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getDataSetStorageProvider\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getNextChallengeEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextDataSetId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getNextPieceId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pieceId\",\"type\":\"uint256\"}],\"name\":\"getPieceCid\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pieceId\",\"type\":\"uint256\"}],\"name\":\"getPieceLeafCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"}],\"name\":\"getScheduledRemovals\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"challengeEpoch\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"nextProvingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pieceId\",\"type\":\"uint256\"}],\"name\":\"pieceChallengable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pieceId\",\"type\":\"uint256\"}],\"name\":\"pieceLive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newStorageProvider\",\"type\":\"address\"}],\"name\":\"proposeDataSetStorageProvider\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"leaf\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"internalType\":\"struct IPDPTypes.Proof[]\",\"name\":\"proofs\",\"type\":\"tuple[]\"}],\"name\":\"provePossession\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"setId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"pieceIds\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"schedulePieceDeletions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"IPDPVerifier\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Main interface for the PDPVerifier contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/interfaces/IPDPVerifier.sol\":\"IPDPVerifier\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@pythnetwork/pyth-sdk-solidity/=lib/pyth-sdk-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":pyth-sdk-solidity/=lib/pyth-sdk-solidity/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0x9e82c00fb176503860139c6bbf593b1a954ee7ff97ab2969656571382b9b58a2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://34b4eb157b44d4441315db65561ba7cf0fe909dc598c2cfd7080d203077d5b57\",\"dweb:/ipfs/QmcNdvK3kDUAUr48urHxoeHd1TqVDya4YfZTM66i4goEJn\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x2c33f654cefbbe80a9b436b5792cfe8bda2e87f139f110073c99762558db252f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc7ebd80046a52f28978cf46a24ff3e4c8568264ab6bb138038951c75d576167\",\"dweb:/ipfs/QmQQjXVr4CbDR3DXd8GHEqn3JSJYTnbBHMJp9tvc29yXrc\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"src/BitOps.sol\":{\"keccak256\":\"0xe6447477342b60f948cb1785c7a723af7da96360887be0e23525604f960f69dc\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://fe79487c0972995f4cf66c3c0c772777270ffd2faf3fdfcc2e5a974f953f6b04\",\"dweb:/ipfs/QmPNrVcbPYr7kLQjczra7CicTvHijPjrvYBFCBEucKYppM\"]},\"src/Cids.sol\":{\"keccak256\":\"0x4a58ce512bbf6ba57a445b6887c8fb244ba1762d0ccc58e88eb25c13448074f9\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://76a20f52425df5023d58eda12d8ddb7fc28839c75213e3275fb7eca4985bbd3d\",\"dweb:/ipfs/QmcY1hevEnzUAN4nbNM2t2j8Hv284Ue9bB6fjQjktE1y6j\"]},\"src/interfaces/IPDPEvents.sol\":{\"keccak256\":\"0xbf68ec912762eea46e7121f579e1b9c8c04f2769a8535c012764db823450d356\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://02523a2fee16374e5c180e309cb91229cb822c8ac0beeeaae9501803d80e361a\",\"dweb:/ipfs/QmVgdVzjHJr77T7hRTqDcASpRHbfzH188743zNZmRSM5aQ\"]},\"src/interfaces/IPDPTypes.sol\":{\"keccak256\":\"0x1c5c9eb660a639c30b8b3cc09cc4d4c646935467440281b8c668365e237b6846\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91c470447e2922976856129e75670c9a4c64dd34c62442fa85a99a67a2add77f\",\"dweb:/ipfs/QmNUXEUnhRRkfKzENo5dR1a1YWsytL7jMkGvxd913mat8t\"]},\"src/interfaces/IPDPVerifier.sol\":{\"keccak256\":\"0x9a315b3ac2d8700a75033f948a9f8234fd825ee970eda093dfac1ef920dc2437\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8de054dd020f346e35cdaff03e7944184e5272a78f80c801b3f879dba2f27dc3\",\"dweb:/ipfs/QmdiVw2f9NmgdDukYfpWmnDPPJvHPikGdMWFzXJiFxRMcc\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.23+commit.f704f362"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"version","type":"string","indexed":false},{"internalType":"address","name":"newImplementation","type":"address","indexed":false}],"type":"event","name":"ContractUpgraded","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"address","name":"storageProvider","type":"address","indexed":true}],"type":"event","name":"DataSetCreated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256","name":"deletedLeafCount","type":"uint256","indexed":false}],"type":"event","name":"DataSetDeleted","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true}],"type":"event","name":"DataSetEmpty","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256","name":"challengeEpoch","type":"uint256","indexed":false},{"internalType":"uint256","name":"leafCount","type":"uint256","indexed":false}],"type":"event","name":"NextProvingPeriod","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256[]","name":"pieceIds","type":"uint256[]","indexed":false},{"internalType":"struct Cids.Cid[]","name":"pieceCids","type":"tuple[]","components":[{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false}],"type":"event","name":"PiecesAdded","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256[]","name":"pieceIds","type":"uint256[]","indexed":false}],"type":"event","name":"PiecesRemoved","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"struct IPDPTypes.PieceIdAndOffset[]","name":"challenges","type":"tuple[]","components":[{"internalType":"uint256","name":"pieceId","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"}],"indexed":false}],"type":"event","name":"PossessionProven","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"uint256","name":"fee","type":"uint256","indexed":false},{"internalType":"uint64","name":"price","type":"uint64","indexed":false},{"internalType":"int32","name":"expo","type":"int32","indexed":false}],"type":"event","name":"ProofFeePaid","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256","indexed":true},{"internalType":"address","name":"oldStorageProvider","type":"address","indexed":true},{"internalType":"address","name":"newStorageProvider","type":"address","indexed":true}],"type":"event","name":"StorageProviderChanged","anonymous":false},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"struct Cids.Cid[]","name":"pieceData","type":"tuple[]","components":[{"internalType":"bytes","name":"data","type":"bytes"}]},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"addPieces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"claimDataSetStorageProvider"},{"inputs":[{"internalType":"address","name":"listenerAddr","type":"address"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"createDataSet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"dataSetLive","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"deleteDataSet"},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256[]","name":"leafIndexs","type":"uint256[]"}],"stateMutability":"view","type":"function","name":"findPieceIds","outputs":[{"internalType":"struct IPDPTypes.PieceIdAndOffset[]","name":"","type":"tuple[]","components":[{"internalType":"uint256","name":"pieceId","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getChallengeFinality","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getChallengeRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getDataSetLastProvenEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getDataSetLeafCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getDataSetListener","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getDataSetStorageProvider","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getNextChallengeEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getNextDataSetId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getNextPieceId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"pieceId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPieceCid","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"pieceId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPieceLeafCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getScheduledRemovals","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"challengeEpoch","type":"uint256"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"nextProvingPeriod"},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"pieceId","type":"uint256"}],"stateMutability":"view","type":"function","name":"pieceChallengable","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256","name":"pieceId","type":"uint256"}],"stateMutability":"view","type":"function","name":"pieceLive","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"address","name":"newStorageProvider","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"proposeDataSetStorageProvider"},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"struct IPDPTypes.Proof[]","name":"proofs","type":"tuple[]","components":[{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}]}],"stateMutability":"payable","type":"function","name":"provePossession"},{"inputs":[{"internalType":"uint256","name":"setId","type":"uint256"},{"internalType":"uint256[]","name":"pieceIds","type":"uint256[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"schedulePieceDeletions"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@pythnetwork/pyth-sdk-solidity/=lib/pyth-sdk-solidity/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","pyth-sdk-solidity/=lib/pyth-sdk-solidity/"],"optimizer":{"enabled":true,"runs":1000000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/interfaces/IPDPVerifier.sol":"IPDPVerifier"},"evmVersion":"shanghai","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"keccak256":"0x9e82c00fb176503860139c6bbf593b1a954ee7ff97ab2969656571382b9b58a2","urls":["bzz-raw://34b4eb157b44d4441315db65561ba7cf0fe909dc598c2cfd7080d203077d5b57","dweb:/ipfs/QmcNdvK3kDUAUr48urHxoeHd1TqVDya4YfZTM66i4goEJn"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x2c33f654cefbbe80a9b436b5792cfe8bda2e87f139f110073c99762558db252f","urls":["bzz-raw://dc7ebd80046a52f28978cf46a24ff3e4c8568264ab6bb138038951c75d576167","dweb:/ipfs/QmQQjXVr4CbDR3DXd8GHEqn3JSJYTnbBHMJp9tvc29yXrc"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"],"license":"MIT"},"src/BitOps.sol":{"keccak256":"0xe6447477342b60f948cb1785c7a723af7da96360887be0e23525604f960f69dc","urls":["bzz-raw://fe79487c0972995f4cf66c3c0c772777270ffd2faf3fdfcc2e5a974f953f6b04","dweb:/ipfs/QmPNrVcbPYr7kLQjczra7CicTvHijPjrvYBFCBEucKYppM"],"license":"Apache-2.0 OR MIT"},"src/Cids.sol":{"keccak256":"0x4a58ce512bbf6ba57a445b6887c8fb244ba1762d0ccc58e88eb25c13448074f9","urls":["bzz-raw://76a20f52425df5023d58eda12d8ddb7fc28839c75213e3275fb7eca4985bbd3d","dweb:/ipfs/QmcY1hevEnzUAN4nbNM2t2j8Hv284Ue9bB6fjQjktE1y6j"],"license":"Apache-2.0 OR MIT"},"src/interfaces/IPDPEvents.sol":{"keccak256":"0xbf68ec912762eea46e7121f579e1b9c8c04f2769a8535c012764db823450d356","urls":["bzz-raw://02523a2fee16374e5c180e309cb91229cb822c8ac0beeeaae9501803d80e361a","dweb:/ipfs/QmVgdVzjHJr77T7hRTqDcASpRHbfzH188743zNZmRSM5aQ"],"license":"MIT"},"src/interfaces/IPDPTypes.sol":{"keccak256":"0x1c5c9eb660a639c30b8b3cc09cc4d4c646935467440281b8c668365e237b6846","urls":["bzz-raw://91c470447e2922976856129e75670c9a4c64dd34c62442fa85a99a67a2add77f","dweb:/ipfs/QmNUXEUnhRRkfKzENo5dR1a1YWsytL7jMkGvxd913mat8t"],"license":"MIT"},"src/interfaces/IPDPVerifier.sol":{"keccak256":"0x9a315b3ac2d8700a75033f948a9f8234fd825ee970eda093dfac1ef920dc2437","urls":["bzz-raw://8de054dd020f346e35cdaff03e7944184e5272a78f80c801b3f879dba2f27dc3","dweb:/ipfs/QmdiVw2f9NmgdDukYfpWmnDPPJvHPikGdMWFzXJiFxRMcc"],"license":"MIT"}},"version":1},"id":54} \ No newline at end of file diff --git a/pdp/contract/README.md b/pdp/contract/README.md new file mode 100644 index 000000000..489519b2d --- /dev/null +++ b/pdp/contract/README.md @@ -0,0 +1,110 @@ +# Guide for Generating Go Bindings Using `abigen` + +This guide explains how to use the `abigen` tool to generate Go bindings for Ethereum smart contracts. These bindings allow you to interact with contracts in Go programs. The smart contract ABIs (Application Binary Interfaces) are retrieved from the source repository and updated after being processed with `make build`. + +--- + +## Prerequisites + +1. **Install `abigen`:** + Install `abigen` from the Go Ethereum (geth) toolset. You can install it via the following command: + + ```bash + go install github.com/ethereum/go-ethereum/cmd/abigen@latest + ``` + +2. **Ensure Forge (`foundry`) is Installed:** + The `make build` step requires the Forge tool (from Foundry). Install it via: + + ```bash + curl -L https://foundry.paradigm.xyz | bash + foundryup + ``` + +3. **Clone the Repository:** + Clone the repository where the smart contract code resides: + + ```bash + git clone https://github.com/FilOzone/pdp.git + cd pdp + ``` + +--- + +## Steps to Generate Go Bindings + +### Step 1: Build the Contracts using `make build` + +In the root of the cloned repository, run: + +```bash +make build +``` + +This command will create the `out/` directory containing the compiled contract artifacts, such as `IPDPProvingSchedule.json` and `PDPVerifier.json`. + +--- + +### Step 2: Extract ABIs from Compiled Artifacts + +Navigate to the `out/` directory and extract the ABI from the compiled JSON files for the required contracts. Use the `jq` tool: + +#### For `IPDPProvingSchedule` ABI: + +Run: + +```bash +jq '.abi' out/IPDPProvingSchedule.sol/IPDPProvingSchedule.json > pdp/contract/IPDPProvingSchedule.abi +``` + +#### For `PDPVerifier` ABI: + +Run: + +```bash +jq '.abi' out/PDPVerifier.sol/PDPVerifier.json > pdp/contract/PDPVerifier.abi +``` + +Ensure that the respective `.abi` files are updated in the `pdp/contract/` directory. + +--- + +### Step 3: Generate Go Bindings Using `abigen` + +Use the `abigen` command-line tool to generate the Go bindings for the parsed ABIs. + +#### For `IPDPProvingSchedule` Contract: + +Run: + +```bash +abigen --abi pdp/contract/IPDPProvingSchedule.abi --pkg contract --type IPDPProvingSchedule --out pdp/contract/pdp_proving_schedule.go +``` + +- `--abi`: Path to the `.abi` file for the contract. +- `--pkg`: Package name in the generated Go code (use the relevant package name, e.g., `contract` in this case). +- `--type`: The Go struct type for this contract (use descriptive names like `IPDPProvingSchedule`). +- `--out`: Output file path for the generated Go file (e.g., `pdp_proving_schedule.go`). + +--- + +#### For `PDPVerifier` Contract: + +Run: + +```bash +abigen --abi pdp/contract/PDPVerifier.abi --pkg contract --type PDPVerifier --out pdp/contract/pdp_verifier.go +``` + +--- + +### Step 4: Verify the Outputs + +After running the `abigen` commands, the Go files (`pdp_proving_schedule.go` and `pdp_verifier.go`) will be generated in the `pdp/contract/` directory. These files contain the Go bindings that can be used in Go applications to interact with the corresponding smart contracts. + +--- + +### Notes + +- **ABI Files:** Ensure that the `.abi` files are correct and up to date by extracting them directly from the compiled JSON artifacts. +- **Code Organization:** Keep both the generated Go files and ABI files in a structured directory layout for easier maintenance (e.g., under `pdp/contract/`). \ No newline at end of file diff --git a/pdp/contract/ServiceProviderRegistry.abi b/pdp/contract/ServiceProviderRegistry.abi new file mode 100644 index 000000000..4ca288cf8 --- /dev/null +++ b/pdp/contract/ServiceProviderRegistry.abi @@ -0,0 +1,1693 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "BURN_ACTOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_CAPABILITIES", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_CAPABILITY_KEY_LENGTH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_CAPABILITY_VALUE_LENGTH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REGISTRATION_FEE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "activeProductTypeProviderCount", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "activeProviderCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addProduct", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addressToProviderId", + "inputs": [ + { + "name": "providerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decodePDPOffering", + "inputs": [ + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PDPOffering", + "components": [ + { + "name": "serviceURL", + "type": "string", + "internalType": "string" + }, + { + "name": "minPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ipniPiece", + "type": "bool", + "internalType": "bool" + }, + { + "name": "ipniIpfs", + "type": "bool", + "internalType": "bool" + }, + { + "name": "storagePricePerTibPerMonth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minProvingPeriodInEpochs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "location", + "type": "string", + "internalType": "string" + }, + { + "name": "paymentTokenAddress", + "type": "address", + "internalType": "contract IERC20" + } + ] + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "encodePDPOffering", + "inputs": [ + { + "name": "pdpOffering", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PDPOffering", + "components": [ + { + "name": "serviceURL", + "type": "string", + "internalType": "string" + }, + { + "name": "minPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ipniPiece", + "type": "bool", + "internalType": "bool" + }, + { + "name": "ipniIpfs", + "type": "bool", + "internalType": "bool" + }, + { + "name": "storagePricePerTibPerMonth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minProvingPeriodInEpochs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "location", + "type": "string", + "internalType": "string" + }, + { + "name": "paymentTokenAddress", + "type": "address", + "internalType": "contract IERC20" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "getActiveProvidersByProductType", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "result", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PaginatedProviders", + "components": [ + { + "name": "providers", + "type": "tuple[]", + "internalType": "struct ServiceProviderRegistryStorage.ProviderWithProduct[]", + "components": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "providerInfo", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProviderInfo", + "components": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "product", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProduct", + "components": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ] + } + ] + }, + { + "name": "hasMore", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllActiveProviders", + "inputs": [ + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "providerIds", + "type": "uint256[]", + "internalType": "uint256[]" + }, + { + "name": "hasMore", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNextProviderId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPDPService", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "pdpOffering", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PDPOffering", + "components": [ + { + "name": "serviceURL", + "type": "string", + "internalType": "string" + }, + { + "name": "minPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ipniPiece", + "type": "bool", + "internalType": "bool" + }, + { + "name": "ipniIpfs", + "type": "bool", + "internalType": "bool" + }, + { + "name": "storagePricePerTibPerMonth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minProvingPeriodInEpochs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "location", + "type": "string", + "internalType": "string" + }, + { + "name": "paymentTokenAddress", + "type": "address", + "internalType": "contract IERC20" + } + ] + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProduct", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProductCapabilities", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "keys", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [ + { + "name": "exists", + "type": "bool[]", + "internalType": "bool[]" + }, + { + "name": "values", + "type": "string[]", + "internalType": "string[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProductCapability", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "key", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "value", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProvider", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "info", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProviderInfo", + "components": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProviderByAddress", + "inputs": [ + { + "name": "providerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "info", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProviderInfo", + "components": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProviderCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProviderIdByAddress", + "inputs": [ + { + "name": "providerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProvidersByProductType", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "result", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PaginatedProviders", + "components": [ + { + "name": "providers", + "type": "tuple[]", + "internalType": "struct ServiceProviderRegistryStorage.ProviderWithProduct[]", + "components": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "providerInfo", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProviderInfo", + "components": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "product", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProduct", + "components": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ] + } + ] + }, + { + "name": "hasMore", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isProviderActive", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isRegisteredProvider", + "inputs": [ + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "migrate", + "inputs": [ + { + "name": "newVersion", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "productCapabilities", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "key", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "value", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "productTypeProviderCount", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providerHasProduct", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providerProducts", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providers", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerProvider", + "inputs": [ + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "removeProduct", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeProvider", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updatePDPServiceWithCapabilities", + "inputs": [ + { + "name": "pdpOffering", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PDPOffering", + "components": [ + { + "name": "serviceURL", + "type": "string", + "internalType": "string" + }, + { + "name": "minPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ipniPiece", + "type": "bool", + "internalType": "bool" + }, + { + "name": "ipniIpfs", + "type": "bool", + "internalType": "bool" + }, + { + "name": "storagePricePerTibPerMonth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minProvingPeriodInEpochs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "location", + "type": "string", + "internalType": "string" + }, + { + "name": "paymentTokenAddress", + "type": "address", + "internalType": "contract IERC20" + } + ] + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateProduct", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateProviderInfo", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "ContractUpgraded", + "inputs": [ + { + "name": "version", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "implementation", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProductAdded", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "indexed": true, + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "serviceUrl", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "serviceProvider", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "indexed": false, + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "indexed": false, + "internalType": "string[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProductRemoved", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "indexed": true, + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProductUpdated", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "indexed": true, + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "serviceUrl", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "serviceProvider", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "indexed": false, + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "indexed": false, + "internalType": "string[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProviderInfoUpdated", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProviderRegistered", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "serviceProvider", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProviderRemoved", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "FailedCall", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] \ No newline at end of file diff --git a/pdp/contract/ServiceProviderRegistry.go b/pdp/contract/ServiceProviderRegistry.go new file mode 100644 index 000000000..c498290ad --- /dev/null +++ b/pdp/contract/ServiceProviderRegistry.go @@ -0,0 +1,3319 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ServiceProviderRegistryStoragePDPOffering is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStoragePDPOffering struct { + ServiceURL string + MinPieceSizeInBytes *big.Int + MaxPieceSizeInBytes *big.Int + IpniPiece bool + IpniIpfs bool + StoragePricePerTibPerMonth *big.Int + MinProvingPeriodInEpochs *big.Int + Location string + PaymentTokenAddress common.Address +} + +// ServiceProviderRegistryStoragePaginatedProviders is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStoragePaginatedProviders struct { + Providers []ServiceProviderRegistryStorageProviderWithProduct + HasMore bool +} + +// ServiceProviderRegistryStorageProviderWithProduct is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStorageProviderWithProduct struct { + ProviderId *big.Int + ProviderInfo ServiceProviderRegistryStorageServiceProviderInfo + Product ServiceProviderRegistryStorageServiceProduct +} + +// ServiceProviderRegistryStorageServiceProduct is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStorageServiceProduct struct { + ProductType uint8 + ProductData []byte + CapabilityKeys []string + IsActive bool +} + +// ServiceProviderRegistryStorageServiceProviderInfo is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStorageServiceProviderInfo struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +} + +// ServiceProviderRegistryMetaData contains all meta data concerning the ServiceProviderRegistry contract. +var ServiceProviderRegistryMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BURN_ACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_CAPABILITIES\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_CAPABILITY_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_CAPABILITY_VALUE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REGISTRATION_FEE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeProductTypeProviderCount\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeProviderCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addProduct\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressToProviderId\",\"inputs\":[{\"name\":\"providerAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decodePDPOffering\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PDPOffering\",\"components\":[{\"name\":\"serviceURL\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ipniPiece\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"ipniIpfs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"location\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"paymentTokenAddress\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"encodePDPOffering\",\"inputs\":[{\"name\":\"pdpOffering\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PDPOffering\",\"components\":[{\"name\":\"serviceURL\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ipniPiece\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"ipniIpfs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"location\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"paymentTokenAddress\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getActiveProvidersByProductType\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PaginatedProviders\",\"components\":[{\"name\":\"providers\",\"type\":\"tuple[]\",\"internalType\":\"structServiceProviderRegistryStorage.ProviderWithProduct[]\",\"components\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"providerInfo\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProviderInfo\",\"components\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"product\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProduct\",\"components\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"hasMore\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllActiveProviders\",\"inputs\":[{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"providerIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"hasMore\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextProviderId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPDPService\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"pdpOffering\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PDPOffering\",\"components\":[{\"name\":\"serviceURL\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ipniPiece\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"ipniIpfs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"location\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"paymentTokenAddress\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}]},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProduct\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProductCapabilities\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"keys\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"},{\"name\":\"values\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProductCapability\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"key\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"value\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProvider\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"info\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProviderInfo\",\"components\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderByAddress\",\"inputs\":[{\"name\":\"providerAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"info\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProviderInfo\",\"components\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderIdByAddress\",\"inputs\":[{\"name\":\"providerAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProvidersByProductType\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PaginatedProviders\",\"components\":[{\"name\":\"providers\",\"type\":\"tuple[]\",\"internalType\":\"structServiceProviderRegistryStorage.ProviderWithProduct[]\",\"components\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"providerInfo\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProviderInfo\",\"components\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"product\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProduct\",\"components\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"hasMore\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProviderActive\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRegisteredProvider\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrate\",\"inputs\":[{\"name\":\"newVersion\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"productCapabilities\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"key\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"value\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"productTypeProviderCount\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerHasProduct\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerProducts\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providers\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerProvider\",\"inputs\":[{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"removeProduct\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeProvider\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updatePDPServiceWithCapabilities\",\"inputs\":[{\"name\":\"pdpOffering\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PDPOffering\",\"components\":[{\"name\":\"serviceURL\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ipniPiece\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"ipniIpfs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"location\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"paymentTokenAddress\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}]},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateProduct\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateProviderInfo\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"ContractUpgraded\",\"inputs\":[{\"name\":\"version\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProductAdded\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"serviceUrl\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"serviceProvider\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProductRemoved\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProductUpdated\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"serviceUrl\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"serviceProvider\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderInfoUpdated\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistered\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"serviceProvider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRemoved\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", +} + +// ServiceProviderRegistryABI is the input ABI used to generate the binding from. +// Deprecated: Use ServiceProviderRegistryMetaData.ABI instead. +var ServiceProviderRegistryABI = ServiceProviderRegistryMetaData.ABI + +// ServiceProviderRegistry is an auto generated Go binding around an Ethereum contract. +type ServiceProviderRegistry struct { + ServiceProviderRegistryCaller // Read-only binding to the contract + ServiceProviderRegistryTransactor // Write-only binding to the contract + ServiceProviderRegistryFilterer // Log filterer for contract events +} + +// ServiceProviderRegistryCaller is an auto generated read-only Go binding around an Ethereum contract. +type ServiceProviderRegistryCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ServiceProviderRegistryTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ServiceProviderRegistryFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistrySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ServiceProviderRegistrySession struct { + Contract *ServiceProviderRegistry // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ServiceProviderRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ServiceProviderRegistryCallerSession struct { + Contract *ServiceProviderRegistryCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ServiceProviderRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ServiceProviderRegistryTransactorSession struct { + Contract *ServiceProviderRegistryTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ServiceProviderRegistryRaw is an auto generated low-level Go binding around an Ethereum contract. +type ServiceProviderRegistryRaw struct { + Contract *ServiceProviderRegistry // Generic contract binding to access the raw methods on +} + +// ServiceProviderRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ServiceProviderRegistryCallerRaw struct { + Contract *ServiceProviderRegistryCaller // Generic read-only contract binding to access the raw methods on +} + +// ServiceProviderRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ServiceProviderRegistryTransactorRaw struct { + Contract *ServiceProviderRegistryTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewServiceProviderRegistry creates a new instance of ServiceProviderRegistry, bound to a specific deployed contract. +func NewServiceProviderRegistry(address common.Address, backend bind.ContractBackend) (*ServiceProviderRegistry, error) { + contract, err := bindServiceProviderRegistry(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ServiceProviderRegistry{ServiceProviderRegistryCaller: ServiceProviderRegistryCaller{contract: contract}, ServiceProviderRegistryTransactor: ServiceProviderRegistryTransactor{contract: contract}, ServiceProviderRegistryFilterer: ServiceProviderRegistryFilterer{contract: contract}}, nil +} + +// NewServiceProviderRegistryCaller creates a new read-only instance of ServiceProviderRegistry, bound to a specific deployed contract. +func NewServiceProviderRegistryCaller(address common.Address, caller bind.ContractCaller) (*ServiceProviderRegistryCaller, error) { + contract, err := bindServiceProviderRegistry(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryCaller{contract: contract}, nil +} + +// NewServiceProviderRegistryTransactor creates a new write-only instance of ServiceProviderRegistry, bound to a specific deployed contract. +func NewServiceProviderRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*ServiceProviderRegistryTransactor, error) { + contract, err := bindServiceProviderRegistry(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryTransactor{contract: contract}, nil +} + +// NewServiceProviderRegistryFilterer creates a new log filterer instance of ServiceProviderRegistry, bound to a specific deployed contract. +func NewServiceProviderRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*ServiceProviderRegistryFilterer, error) { + contract, err := bindServiceProviderRegistry(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryFilterer{contract: contract}, nil +} + +// bindServiceProviderRegistry binds a generic wrapper to an already deployed contract. +func bindServiceProviderRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ServiceProviderRegistry *ServiceProviderRegistryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ServiceProviderRegistry.Contract.ServiceProviderRegistryCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ServiceProviderRegistry *ServiceProviderRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.ServiceProviderRegistryTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ServiceProviderRegistry *ServiceProviderRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.ServiceProviderRegistryTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ServiceProviderRegistry.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.contract.Transact(opts, method, params...) +} + +// BURNACTOR is a free data retrieval call binding the contract method 0x0a6a63f1. +// +// Solidity: function BURN_ACTOR() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) BURNACTOR(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "BURN_ACTOR") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// BURNACTOR is a free data retrieval call binding the contract method 0x0a6a63f1. +// +// Solidity: function BURN_ACTOR() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) BURNACTOR() (common.Address, error) { + return _ServiceProviderRegistry.Contract.BURNACTOR(&_ServiceProviderRegistry.CallOpts) +} + +// BURNACTOR is a free data retrieval call binding the contract method 0x0a6a63f1. +// +// Solidity: function BURN_ACTOR() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) BURNACTOR() (common.Address, error) { + return _ServiceProviderRegistry.Contract.BURNACTOR(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITIES is a free data retrieval call binding the contract method 0x6e36e974. +// +// Solidity: function MAX_CAPABILITIES() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) MAXCAPABILITIES(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "MAX_CAPABILITIES") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXCAPABILITIES is a free data retrieval call binding the contract method 0x6e36e974. +// +// Solidity: function MAX_CAPABILITIES() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) MAXCAPABILITIES() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITIES(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITIES is a free data retrieval call binding the contract method 0x6e36e974. +// +// Solidity: function MAX_CAPABILITIES() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) MAXCAPABILITIES() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITIES(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITYKEYLENGTH is a free data retrieval call binding the contract method 0x7f657567. +// +// Solidity: function MAX_CAPABILITY_KEY_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) MAXCAPABILITYKEYLENGTH(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "MAX_CAPABILITY_KEY_LENGTH") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXCAPABILITYKEYLENGTH is a free data retrieval call binding the contract method 0x7f657567. +// +// Solidity: function MAX_CAPABILITY_KEY_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) MAXCAPABILITYKEYLENGTH() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITYKEYLENGTH(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITYKEYLENGTH is a free data retrieval call binding the contract method 0x7f657567. +// +// Solidity: function MAX_CAPABILITY_KEY_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) MAXCAPABILITYKEYLENGTH() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITYKEYLENGTH(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITYVALUELENGTH is a free data retrieval call binding the contract method 0xdcea1c6f. +// +// Solidity: function MAX_CAPABILITY_VALUE_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) MAXCAPABILITYVALUELENGTH(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "MAX_CAPABILITY_VALUE_LENGTH") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXCAPABILITYVALUELENGTH is a free data retrieval call binding the contract method 0xdcea1c6f. +// +// Solidity: function MAX_CAPABILITY_VALUE_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) MAXCAPABILITYVALUELENGTH() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITYVALUELENGTH(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITYVALUELENGTH is a free data retrieval call binding the contract method 0xdcea1c6f. +// +// Solidity: function MAX_CAPABILITY_VALUE_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) MAXCAPABILITYVALUELENGTH() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITYVALUELENGTH(&_ServiceProviderRegistry.CallOpts) +} + +// REGISTRATIONFEE is a free data retrieval call binding the contract method 0x64b4f751. +// +// Solidity: function REGISTRATION_FEE() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) REGISTRATIONFEE(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "REGISTRATION_FEE") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// REGISTRATIONFEE is a free data retrieval call binding the contract method 0x64b4f751. +// +// Solidity: function REGISTRATION_FEE() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) REGISTRATIONFEE() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.REGISTRATIONFEE(&_ServiceProviderRegistry.CallOpts) +} + +// REGISTRATIONFEE is a free data retrieval call binding the contract method 0x64b4f751. +// +// Solidity: function REGISTRATION_FEE() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) REGISTRATIONFEE() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.REGISTRATIONFEE(&_ServiceProviderRegistry.CallOpts) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) UPGRADEINTERFACEVERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "UPGRADE_INTERFACE_VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UPGRADEINTERFACEVERSION() (string, error) { + return _ServiceProviderRegistry.Contract.UPGRADEINTERFACEVERSION(&_ServiceProviderRegistry.CallOpts) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) UPGRADEINTERFACEVERSION() (string, error) { + return _ServiceProviderRegistry.Contract.UPGRADEINTERFACEVERSION(&_ServiceProviderRegistry.CallOpts) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) VERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) VERSION() (string, error) { + return _ServiceProviderRegistry.Contract.VERSION(&_ServiceProviderRegistry.CallOpts) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) VERSION() (string, error) { + return _ServiceProviderRegistry.Contract.VERSION(&_ServiceProviderRegistry.CallOpts) +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ActiveProductTypeProviderCount(opts *bind.CallOpts, productType uint8) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "activeProductTypeProviderCount", productType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ActiveProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ActiveProductTypeProviderCount(&_ServiceProviderRegistry.CallOpts, productType) +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ActiveProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ActiveProductTypeProviderCount(&_ServiceProviderRegistry.CallOpts, productType) +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ActiveProviderCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "activeProviderCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ActiveProviderCount() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ActiveProviderCount(&_ServiceProviderRegistry.CallOpts) +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ActiveProviderCount() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ActiveProviderCount(&_ServiceProviderRegistry.CallOpts) +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) AddressToProviderId(opts *bind.CallOpts, providerAddress common.Address) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "addressToProviderId", providerAddress) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) AddressToProviderId(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.AddressToProviderId(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) AddressToProviderId(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.AddressToProviderId(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// DecodePDPOffering is a free data retrieval call binding the contract method 0xdeb0e462. +// +// Solidity: function decodePDPOffering(bytes data) pure returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address)) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) DecodePDPOffering(opts *bind.CallOpts, data []byte) (ServiceProviderRegistryStoragePDPOffering, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "decodePDPOffering", data) + + if err != nil { + return *new(ServiceProviderRegistryStoragePDPOffering), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStoragePDPOffering)).(*ServiceProviderRegistryStoragePDPOffering) + + return out0, err + +} + +// DecodePDPOffering is a free data retrieval call binding the contract method 0xdeb0e462. +// +// Solidity: function decodePDPOffering(bytes data) pure returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address)) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) DecodePDPOffering(data []byte) (ServiceProviderRegistryStoragePDPOffering, error) { + return _ServiceProviderRegistry.Contract.DecodePDPOffering(&_ServiceProviderRegistry.CallOpts, data) +} + +// DecodePDPOffering is a free data retrieval call binding the contract method 0xdeb0e462. +// +// Solidity: function decodePDPOffering(bytes data) pure returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address)) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) DecodePDPOffering(data []byte) (ServiceProviderRegistryStoragePDPOffering, error) { + return _ServiceProviderRegistry.Contract.DecodePDPOffering(&_ServiceProviderRegistry.CallOpts, data) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) Eip712Domain(opts *bind.CallOpts) (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "eip712Domain") + + outstruct := new(struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.Fields = *abi.ConvertType(out[0], new([1]byte)).(*[1]byte) + outstruct.Name = *abi.ConvertType(out[1], new(string)).(*string) + outstruct.Version = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.ChainId = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) + outstruct.VerifyingContract = *abi.ConvertType(out[4], new(common.Address)).(*common.Address) + outstruct.Salt = *abi.ConvertType(out[5], new([32]byte)).(*[32]byte) + outstruct.Extensions = *abi.ConvertType(out[6], new([]*big.Int)).(*[]*big.Int) + + return *outstruct, err + +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _ServiceProviderRegistry.Contract.Eip712Domain(&_ServiceProviderRegistry.CallOpts) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _ServiceProviderRegistry.Contract.Eip712Domain(&_ServiceProviderRegistry.CallOpts) +} + +// EncodePDPOffering is a free data retrieval call binding the contract method 0x82ee4b34. +// +// Solidity: function encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering) pure returns(bytes) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) EncodePDPOffering(opts *bind.CallOpts, pdpOffering ServiceProviderRegistryStoragePDPOffering) ([]byte, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "encodePDPOffering", pdpOffering) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// EncodePDPOffering is a free data retrieval call binding the contract method 0x82ee4b34. +// +// Solidity: function encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering) pure returns(bytes) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) EncodePDPOffering(pdpOffering ServiceProviderRegistryStoragePDPOffering) ([]byte, error) { + return _ServiceProviderRegistry.Contract.EncodePDPOffering(&_ServiceProviderRegistry.CallOpts, pdpOffering) +} + +// EncodePDPOffering is a free data retrieval call binding the contract method 0x82ee4b34. +// +// Solidity: function encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering) pure returns(bytes) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) EncodePDPOffering(pdpOffering ServiceProviderRegistryStoragePDPOffering) ([]byte, error) { + return _ServiceProviderRegistry.Contract.EncodePDPOffering(&_ServiceProviderRegistry.CallOpts, pdpOffering) +} + +// GetActiveProvidersByProductType is a free data retrieval call binding the contract method 0x213c63b1. +// +// Solidity: function getActiveProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetActiveProvidersByProductType(opts *bind.CallOpts, productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getActiveProvidersByProductType", productType, offset, limit) + + if err != nil { + return *new(ServiceProviderRegistryStoragePaginatedProviders), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStoragePaginatedProviders)).(*ServiceProviderRegistryStoragePaginatedProviders) + + return out0, err + +} + +// GetActiveProvidersByProductType is a free data retrieval call binding the contract method 0x213c63b1. +// +// Solidity: function getActiveProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetActiveProvidersByProductType(productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + return _ServiceProviderRegistry.Contract.GetActiveProvidersByProductType(&_ServiceProviderRegistry.CallOpts, productType, offset, limit) +} + +// GetActiveProvidersByProductType is a free data retrieval call binding the contract method 0x213c63b1. +// +// Solidity: function getActiveProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetActiveProvidersByProductType(productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + return _ServiceProviderRegistry.Contract.GetActiveProvidersByProductType(&_ServiceProviderRegistry.CallOpts, productType, offset, limit) +} + +// GetAllActiveProviders is a free data retrieval call binding the contract method 0x2f67c065. +// +// Solidity: function getAllActiveProviders(uint256 offset, uint256 limit) view returns(uint256[] providerIds, bool hasMore) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetAllActiveProviders(opts *bind.CallOpts, offset *big.Int, limit *big.Int) (struct { + ProviderIds []*big.Int + HasMore bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getAllActiveProviders", offset, limit) + + outstruct := new(struct { + ProviderIds []*big.Int + HasMore bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProviderIds = *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int) + outstruct.HasMore = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +// GetAllActiveProviders is a free data retrieval call binding the contract method 0x2f67c065. +// +// Solidity: function getAllActiveProviders(uint256 offset, uint256 limit) view returns(uint256[] providerIds, bool hasMore) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetAllActiveProviders(offset *big.Int, limit *big.Int) (struct { + ProviderIds []*big.Int + HasMore bool +}, error) { + return _ServiceProviderRegistry.Contract.GetAllActiveProviders(&_ServiceProviderRegistry.CallOpts, offset, limit) +} + +// GetAllActiveProviders is a free data retrieval call binding the contract method 0x2f67c065. +// +// Solidity: function getAllActiveProviders(uint256 offset, uint256 limit) view returns(uint256[] providerIds, bool hasMore) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetAllActiveProviders(offset *big.Int, limit *big.Int) (struct { + ProviderIds []*big.Int + HasMore bool +}, error) { + return _ServiceProviderRegistry.Contract.GetAllActiveProviders(&_ServiceProviderRegistry.CallOpts, offset, limit) +} + +// GetNextProviderId is a free data retrieval call binding the contract method 0xd1329d4e. +// +// Solidity: function getNextProviderId() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetNextProviderId(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getNextProviderId") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetNextProviderId is a free data retrieval call binding the contract method 0xd1329d4e. +// +// Solidity: function getNextProviderId() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetNextProviderId() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetNextProviderId(&_ServiceProviderRegistry.CallOpts) +} + +// GetNextProviderId is a free data retrieval call binding the contract method 0xd1329d4e. +// +// Solidity: function getNextProviderId() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetNextProviderId() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetNextProviderId(&_ServiceProviderRegistry.CallOpts) +} + +// GetPDPService is a free data retrieval call binding the contract method 0xc439fd57. +// +// Solidity: function getPDPService(uint256 providerId) view returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetPDPService(opts *bind.CallOpts, providerId *big.Int) (struct { + PdpOffering ServiceProviderRegistryStoragePDPOffering + CapabilityKeys []string + IsActive bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getPDPService", providerId) + + outstruct := new(struct { + PdpOffering ServiceProviderRegistryStoragePDPOffering + CapabilityKeys []string + IsActive bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.PdpOffering = *abi.ConvertType(out[0], new(ServiceProviderRegistryStoragePDPOffering)).(*ServiceProviderRegistryStoragePDPOffering) + outstruct.CapabilityKeys = *abi.ConvertType(out[1], new([]string)).(*[]string) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + + return *outstruct, err + +} + +// GetPDPService is a free data retrieval call binding the contract method 0xc439fd57. +// +// Solidity: function getPDPService(uint256 providerId) view returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetPDPService(providerId *big.Int) (struct { + PdpOffering ServiceProviderRegistryStoragePDPOffering + CapabilityKeys []string + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.GetPDPService(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// GetPDPService is a free data retrieval call binding the contract method 0xc439fd57. +// +// Solidity: function getPDPService(uint256 providerId) view returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetPDPService(providerId *big.Int) (struct { + PdpOffering ServiceProviderRegistryStoragePDPOffering + CapabilityKeys []string + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.GetPDPService(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// GetProduct is a free data retrieval call binding the contract method 0xaca0988f. +// +// Solidity: function getProduct(uint256 providerId, uint8 productType) view returns(bytes productData, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProduct(opts *bind.CallOpts, providerId *big.Int, productType uint8) (struct { + ProductData []byte + CapabilityKeys []string + IsActive bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProduct", providerId, productType) + + outstruct := new(struct { + ProductData []byte + CapabilityKeys []string + IsActive bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProductData = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.CapabilityKeys = *abi.ConvertType(out[1], new([]string)).(*[]string) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + + return *outstruct, err + +} + +// GetProduct is a free data retrieval call binding the contract method 0xaca0988f. +// +// Solidity: function getProduct(uint256 providerId, uint8 productType) view returns(bytes productData, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProduct(providerId *big.Int, productType uint8) (struct { + ProductData []byte + CapabilityKeys []string + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.GetProduct(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// GetProduct is a free data retrieval call binding the contract method 0xaca0988f. +// +// Solidity: function getProduct(uint256 providerId, uint8 productType) view returns(bytes productData, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProduct(providerId *big.Int, productType uint8) (struct { + ProductData []byte + CapabilityKeys []string + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.GetProduct(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// GetProductCapabilities is a free data retrieval call binding the contract method 0xa6433240. +// +// Solidity: function getProductCapabilities(uint256 providerId, uint8 productType, string[] keys) view returns(bool[] exists, string[] values) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProductCapabilities(opts *bind.CallOpts, providerId *big.Int, productType uint8, keys []string) (struct { + Exists []bool + Values []string +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProductCapabilities", providerId, productType, keys) + + outstruct := new(struct { + Exists []bool + Values []string + }) + if err != nil { + return *outstruct, err + } + + outstruct.Exists = *abi.ConvertType(out[0], new([]bool)).(*[]bool) + outstruct.Values = *abi.ConvertType(out[1], new([]string)).(*[]string) + + return *outstruct, err + +} + +// GetProductCapabilities is a free data retrieval call binding the contract method 0xa6433240. +// +// Solidity: function getProductCapabilities(uint256 providerId, uint8 productType, string[] keys) view returns(bool[] exists, string[] values) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProductCapabilities(providerId *big.Int, productType uint8, keys []string) (struct { + Exists []bool + Values []string +}, error) { + return _ServiceProviderRegistry.Contract.GetProductCapabilities(&_ServiceProviderRegistry.CallOpts, providerId, productType, keys) +} + +// GetProductCapabilities is a free data retrieval call binding the contract method 0xa6433240. +// +// Solidity: function getProductCapabilities(uint256 providerId, uint8 productType, string[] keys) view returns(bool[] exists, string[] values) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProductCapabilities(providerId *big.Int, productType uint8, keys []string) (struct { + Exists []bool + Values []string +}, error) { + return _ServiceProviderRegistry.Contract.GetProductCapabilities(&_ServiceProviderRegistry.CallOpts, providerId, productType, keys) +} + +// GetProductCapability is a free data retrieval call binding the contract method 0x1e35bdde. +// +// Solidity: function getProductCapability(uint256 providerId, uint8 productType, string key) view returns(bool exists, string value) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProductCapability(opts *bind.CallOpts, providerId *big.Int, productType uint8, key string) (struct { + Exists bool + Value string +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProductCapability", providerId, productType, key) + + outstruct := new(struct { + Exists bool + Value string + }) + if err != nil { + return *outstruct, err + } + + outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Value = *abi.ConvertType(out[1], new(string)).(*string) + + return *outstruct, err + +} + +// GetProductCapability is a free data retrieval call binding the contract method 0x1e35bdde. +// +// Solidity: function getProductCapability(uint256 providerId, uint8 productType, string key) view returns(bool exists, string value) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProductCapability(providerId *big.Int, productType uint8, key string) (struct { + Exists bool + Value string +}, error) { + return _ServiceProviderRegistry.Contract.GetProductCapability(&_ServiceProviderRegistry.CallOpts, providerId, productType, key) +} + +// GetProductCapability is a free data retrieval call binding the contract method 0x1e35bdde. +// +// Solidity: function getProductCapability(uint256 providerId, uint8 productType, string key) view returns(bool exists, string value) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProductCapability(providerId *big.Int, productType uint8, key string) (struct { + Exists bool + Value string +}, error) { + return _ServiceProviderRegistry.Contract.GetProductCapability(&_ServiceProviderRegistry.CallOpts, providerId, productType, key) +} + +// GetProvider is a free data retrieval call binding the contract method 0x5c42d079. +// +// Solidity: function getProvider(uint256 providerId) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProvider(opts *bind.CallOpts, providerId *big.Int) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProvider", providerId) + + if err != nil { + return *new(ServiceProviderRegistryStorageServiceProviderInfo), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStorageServiceProviderInfo)).(*ServiceProviderRegistryStorageServiceProviderInfo) + + return out0, err + +} + +// GetProvider is a free data retrieval call binding the contract method 0x5c42d079. +// +// Solidity: function getProvider(uint256 providerId) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProvider(providerId *big.Int) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + return _ServiceProviderRegistry.Contract.GetProvider(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// GetProvider is a free data retrieval call binding the contract method 0x5c42d079. +// +// Solidity: function getProvider(uint256 providerId) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProvider(providerId *big.Int) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + return _ServiceProviderRegistry.Contract.GetProvider(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// GetProviderByAddress is a free data retrieval call binding the contract method 0x2335bde0. +// +// Solidity: function getProviderByAddress(address providerAddress) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProviderByAddress(opts *bind.CallOpts, providerAddress common.Address) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProviderByAddress", providerAddress) + + if err != nil { + return *new(ServiceProviderRegistryStorageServiceProviderInfo), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStorageServiceProviderInfo)).(*ServiceProviderRegistryStorageServiceProviderInfo) + + return out0, err + +} + +// GetProviderByAddress is a free data retrieval call binding the contract method 0x2335bde0. +// +// Solidity: function getProviderByAddress(address providerAddress) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProviderByAddress(providerAddress common.Address) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + return _ServiceProviderRegistry.Contract.GetProviderByAddress(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// GetProviderByAddress is a free data retrieval call binding the contract method 0x2335bde0. +// +// Solidity: function getProviderByAddress(address providerAddress) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProviderByAddress(providerAddress common.Address) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + return _ServiceProviderRegistry.Contract.GetProviderByAddress(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// GetProviderCount is a free data retrieval call binding the contract method 0x46ce4175. +// +// Solidity: function getProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProviderCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProviderCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetProviderCount is a free data retrieval call binding the contract method 0x46ce4175. +// +// Solidity: function getProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProviderCount() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetProviderCount(&_ServiceProviderRegistry.CallOpts) +} + +// GetProviderCount is a free data retrieval call binding the contract method 0x46ce4175. +// +// Solidity: function getProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProviderCount() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetProviderCount(&_ServiceProviderRegistry.CallOpts) +} + +// GetProviderIdByAddress is a free data retrieval call binding the contract method 0x93ecb91e. +// +// Solidity: function getProviderIdByAddress(address providerAddress) view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProviderIdByAddress(opts *bind.CallOpts, providerAddress common.Address) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProviderIdByAddress", providerAddress) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetProviderIdByAddress is a free data retrieval call binding the contract method 0x93ecb91e. +// +// Solidity: function getProviderIdByAddress(address providerAddress) view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProviderIdByAddress(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetProviderIdByAddress(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// GetProviderIdByAddress is a free data retrieval call binding the contract method 0x93ecb91e. +// +// Solidity: function getProviderIdByAddress(address providerAddress) view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProviderIdByAddress(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetProviderIdByAddress(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// GetProvidersByProductType is a free data retrieval call binding the contract method 0xfc260f7b. +// +// Solidity: function getProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProvidersByProductType(opts *bind.CallOpts, productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProvidersByProductType", productType, offset, limit) + + if err != nil { + return *new(ServiceProviderRegistryStoragePaginatedProviders), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStoragePaginatedProviders)).(*ServiceProviderRegistryStoragePaginatedProviders) + + return out0, err + +} + +// GetProvidersByProductType is a free data retrieval call binding the contract method 0xfc260f7b. +// +// Solidity: function getProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProvidersByProductType(productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + return _ServiceProviderRegistry.Contract.GetProvidersByProductType(&_ServiceProviderRegistry.CallOpts, productType, offset, limit) +} + +// GetProvidersByProductType is a free data retrieval call binding the contract method 0xfc260f7b. +// +// Solidity: function getProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProvidersByProductType(productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + return _ServiceProviderRegistry.Contract.GetProvidersByProductType(&_ServiceProviderRegistry.CallOpts, productType, offset, limit) +} + +// IsProviderActive is a free data retrieval call binding the contract method 0x83df54a5. +// +// Solidity: function isProviderActive(uint256 providerId) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) IsProviderActive(opts *bind.CallOpts, providerId *big.Int) (bool, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "isProviderActive", providerId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsProviderActive is a free data retrieval call binding the contract method 0x83df54a5. +// +// Solidity: function isProviderActive(uint256 providerId) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) IsProviderActive(providerId *big.Int) (bool, error) { + return _ServiceProviderRegistry.Contract.IsProviderActive(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// IsProviderActive is a free data retrieval call binding the contract method 0x83df54a5. +// +// Solidity: function isProviderActive(uint256 providerId) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) IsProviderActive(providerId *big.Int) (bool, error) { + return _ServiceProviderRegistry.Contract.IsProviderActive(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// IsRegisteredProvider is a free data retrieval call binding the contract method 0x51ca236f. +// +// Solidity: function isRegisteredProvider(address provider) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) IsRegisteredProvider(opts *bind.CallOpts, provider common.Address) (bool, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "isRegisteredProvider", provider) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsRegisteredProvider is a free data retrieval call binding the contract method 0x51ca236f. +// +// Solidity: function isRegisteredProvider(address provider) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) IsRegisteredProvider(provider common.Address) (bool, error) { + return _ServiceProviderRegistry.Contract.IsRegisteredProvider(&_ServiceProviderRegistry.CallOpts, provider) +} + +// IsRegisteredProvider is a free data retrieval call binding the contract method 0x51ca236f. +// +// Solidity: function isRegisteredProvider(address provider) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) IsRegisteredProvider(provider common.Address) (bool, error) { + return _ServiceProviderRegistry.Contract.IsRegisteredProvider(&_ServiceProviderRegistry.CallOpts, provider) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Owner() (common.Address, error) { + return _ServiceProviderRegistry.Contract.Owner(&_ServiceProviderRegistry.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) Owner() (common.Address, error) { + return _ServiceProviderRegistry.Contract.Owner(&_ServiceProviderRegistry.CallOpts) +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProductCapabilities(opts *bind.CallOpts, providerId *big.Int, productType uint8, key string) (string, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "productCapabilities", providerId, productType, key) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProductCapabilities(providerId *big.Int, productType uint8, key string) (string, error) { + return _ServiceProviderRegistry.Contract.ProductCapabilities(&_ServiceProviderRegistry.CallOpts, providerId, productType, key) +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProductCapabilities(providerId *big.Int, productType uint8, key string) (string, error) { + return _ServiceProviderRegistry.Contract.ProductCapabilities(&_ServiceProviderRegistry.CallOpts, providerId, productType, key) +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProductTypeProviderCount(opts *bind.CallOpts, productType uint8) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "productTypeProviderCount", productType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ProductTypeProviderCount(&_ServiceProviderRegistry.CallOpts, productType) +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ProductTypeProviderCount(&_ServiceProviderRegistry.CallOpts, productType) +} + +// ProviderHasProduct is a free data retrieval call binding the contract method 0xcde24beb. +// +// Solidity: function providerHasProduct(uint256 providerId, uint8 productType) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProviderHasProduct(opts *bind.CallOpts, providerId *big.Int, productType uint8) (bool, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "providerHasProduct", providerId, productType) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// ProviderHasProduct is a free data retrieval call binding the contract method 0xcde24beb. +// +// Solidity: function providerHasProduct(uint256 providerId, uint8 productType) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProviderHasProduct(providerId *big.Int, productType uint8) (bool, error) { + return _ServiceProviderRegistry.Contract.ProviderHasProduct(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// ProviderHasProduct is a free data retrieval call binding the contract method 0xcde24beb. +// +// Solidity: function providerHasProduct(uint256 providerId, uint8 productType) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProviderHasProduct(providerId *big.Int, productType uint8) (bool, error) { + return _ServiceProviderRegistry.Contract.ProviderHasProduct(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProviderProducts(opts *bind.CallOpts, providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "providerProducts", providerId, productType) + + outstruct := new(struct { + ProductType uint8 + ProductData []byte + IsActive bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProductType = *abi.ConvertType(out[0], new(uint8)).(*uint8) + outstruct.ProductData = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + + return *outstruct, err + +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProviderProducts(providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.ProviderProducts(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProviderProducts(providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.ProviderProducts(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) Providers(opts *bind.CallOpts, providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "providers", providerId) + + outstruct := new(struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.ServiceProvider = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.Payee = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.Name = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.Description = *abi.ConvertType(out[3], new(string)).(*string) + outstruct.IsActive = *abi.ConvertType(out[4], new(bool)).(*bool) + outstruct.ProviderId = *abi.ConvertType(out[5], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Providers(providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + return _ServiceProviderRegistry.Contract.Providers(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) Providers(providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + return _ServiceProviderRegistry.Contract.Providers(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "proxiableUUID") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProxiableUUID() ([32]byte, error) { + return _ServiceProviderRegistry.Contract.ProxiableUUID(&_ServiceProviderRegistry.CallOpts) +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProxiableUUID() ([32]byte, error) { + return _ServiceProviderRegistry.Contract.ProxiableUUID(&_ServiceProviderRegistry.CallOpts) +} + +// AddProduct is a paid mutator transaction binding the contract method 0x02ff8437. +// +// Solidity: function addProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) AddProduct(opts *bind.TransactOpts, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "addProduct", productType, productData, capabilityKeys, capabilityValues) +} + +// AddProduct is a paid mutator transaction binding the contract method 0x02ff8437. +// +// Solidity: function addProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) AddProduct(productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.AddProduct(&_ServiceProviderRegistry.TransactOpts, productType, productData, capabilityKeys, capabilityValues) +} + +// AddProduct is a paid mutator transaction binding the contract method 0x02ff8437. +// +// Solidity: function addProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) AddProduct(productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.AddProduct(&_ServiceProviderRegistry.TransactOpts, productType, productData, capabilityKeys, capabilityValues) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "initialize") +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Initialize() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.Initialize(&_ServiceProviderRegistry.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) Initialize() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.Initialize(&_ServiceProviderRegistry.TransactOpts) +} + +// Migrate is a paid mutator transaction binding the contract method 0xc9c5b5b4. +// +// Solidity: function migrate(string newVersion) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) Migrate(opts *bind.TransactOpts, newVersion string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "migrate", newVersion) +} + +// Migrate is a paid mutator transaction binding the contract method 0xc9c5b5b4. +// +// Solidity: function migrate(string newVersion) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Migrate(newVersion string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.Migrate(&_ServiceProviderRegistry.TransactOpts, newVersion) +} + +// Migrate is a paid mutator transaction binding the contract method 0xc9c5b5b4. +// +// Solidity: function migrate(string newVersion) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) Migrate(newVersion string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.Migrate(&_ServiceProviderRegistry.TransactOpts, newVersion) +} + +// RegisterProvider is a paid mutator transaction binding the contract method 0xb47be8ab. +// +// Solidity: function registerProvider(address payee, string name, string description, uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) payable returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) RegisterProvider(opts *bind.TransactOpts, payee common.Address, name string, description string, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "registerProvider", payee, name, description, productType, productData, capabilityKeys, capabilityValues) +} + +// RegisterProvider is a paid mutator transaction binding the contract method 0xb47be8ab. +// +// Solidity: function registerProvider(address payee, string name, string description, uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) payable returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) RegisterProvider(payee common.Address, name string, description string, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RegisterProvider(&_ServiceProviderRegistry.TransactOpts, payee, name, description, productType, productData, capabilityKeys, capabilityValues) +} + +// RegisterProvider is a paid mutator transaction binding the contract method 0xb47be8ab. +// +// Solidity: function registerProvider(address payee, string name, string description, uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) payable returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) RegisterProvider(payee common.Address, name string, description string, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RegisterProvider(&_ServiceProviderRegistry.TransactOpts, payee, name, description, productType, productData, capabilityKeys, capabilityValues) +} + +// RemoveProduct is a paid mutator transaction binding the contract method 0xa9d239b6. +// +// Solidity: function removeProduct(uint8 productType) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) RemoveProduct(opts *bind.TransactOpts, productType uint8) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "removeProduct", productType) +} + +// RemoveProduct is a paid mutator transaction binding the contract method 0xa9d239b6. +// +// Solidity: function removeProduct(uint8 productType) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) RemoveProduct(productType uint8) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RemoveProduct(&_ServiceProviderRegistry.TransactOpts, productType) +} + +// RemoveProduct is a paid mutator transaction binding the contract method 0xa9d239b6. +// +// Solidity: function removeProduct(uint8 productType) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) RemoveProduct(productType uint8) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RemoveProduct(&_ServiceProviderRegistry.TransactOpts, productType) +} + +// RemoveProvider is a paid mutator transaction binding the contract method 0xb6363b99. +// +// Solidity: function removeProvider() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) RemoveProvider(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "removeProvider") +} + +// RemoveProvider is a paid mutator transaction binding the contract method 0xb6363b99. +// +// Solidity: function removeProvider() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) RemoveProvider() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RemoveProvider(&_ServiceProviderRegistry.TransactOpts) +} + +// RemoveProvider is a paid mutator transaction binding the contract method 0xb6363b99. +// +// Solidity: function removeProvider() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) RemoveProvider() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RemoveProvider(&_ServiceProviderRegistry.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) RenounceOwnership() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RenounceOwnership(&_ServiceProviderRegistry.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RenounceOwnership(&_ServiceProviderRegistry.TransactOpts) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.TransferOwnership(&_ServiceProviderRegistry.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.TransferOwnership(&_ServiceProviderRegistry.TransactOpts, newOwner) +} + +// UpdatePDPServiceWithCapabilities is a paid mutator transaction binding the contract method 0x0b5c0125. +// +// Solidity: function updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) UpdatePDPServiceWithCapabilities(opts *bind.TransactOpts, pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "updatePDPServiceWithCapabilities", pdpOffering, capabilityKeys, capabilityValues) +} + +// UpdatePDPServiceWithCapabilities is a paid mutator transaction binding the contract method 0x0b5c0125. +// +// Solidity: function updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UpdatePDPServiceWithCapabilities(pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdatePDPServiceWithCapabilities(&_ServiceProviderRegistry.TransactOpts, pdpOffering, capabilityKeys, capabilityValues) +} + +// UpdatePDPServiceWithCapabilities is a paid mutator transaction binding the contract method 0x0b5c0125. +// +// Solidity: function updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) UpdatePDPServiceWithCapabilities(pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdatePDPServiceWithCapabilities(&_ServiceProviderRegistry.TransactOpts, pdpOffering, capabilityKeys, capabilityValues) +} + +// UpdateProduct is a paid mutator transaction binding the contract method 0x8c9a7b56. +// +// Solidity: function updateProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) UpdateProduct(opts *bind.TransactOpts, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "updateProduct", productType, productData, capabilityKeys, capabilityValues) +} + +// UpdateProduct is a paid mutator transaction binding the contract method 0x8c9a7b56. +// +// Solidity: function updateProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UpdateProduct(productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdateProduct(&_ServiceProviderRegistry.TransactOpts, productType, productData, capabilityKeys, capabilityValues) +} + +// UpdateProduct is a paid mutator transaction binding the contract method 0x8c9a7b56. +// +// Solidity: function updateProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) UpdateProduct(productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdateProduct(&_ServiceProviderRegistry.TransactOpts, productType, productData, capabilityKeys, capabilityValues) +} + +// UpdateProviderInfo is a paid mutator transaction binding the contract method 0xd1c21b5b. +// +// Solidity: function updateProviderInfo(string name, string description) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) UpdateProviderInfo(opts *bind.TransactOpts, name string, description string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "updateProviderInfo", name, description) +} + +// UpdateProviderInfo is a paid mutator transaction binding the contract method 0xd1c21b5b. +// +// Solidity: function updateProviderInfo(string name, string description) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UpdateProviderInfo(name string, description string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdateProviderInfo(&_ServiceProviderRegistry.TransactOpts, name, description) +} + +// UpdateProviderInfo is a paid mutator transaction binding the contract method 0xd1c21b5b. +// +// Solidity: function updateProviderInfo(string name, string description) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) UpdateProviderInfo(name string, description string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdateProviderInfo(&_ServiceProviderRegistry.TransactOpts, name, description) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpgradeToAndCall(&_ServiceProviderRegistry.TransactOpts, newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpgradeToAndCall(&_ServiceProviderRegistry.TransactOpts, newImplementation, data) +} + +// ServiceProviderRegistryContractUpgradedIterator is returned from FilterContractUpgraded and is used to iterate over the raw logs and unpacked data for ContractUpgraded events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryContractUpgradedIterator struct { + Event *ServiceProviderRegistryContractUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryContractUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryContractUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryContractUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryContractUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryContractUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryContractUpgraded represents a ContractUpgraded event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryContractUpgraded struct { + Version string + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterContractUpgraded is a free log retrieval operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. +// +// Solidity: event ContractUpgraded(string version, address implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterContractUpgraded(opts *bind.FilterOpts) (*ServiceProviderRegistryContractUpgradedIterator, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ContractUpgraded") + if err != nil { + return nil, err + } + return &ServiceProviderRegistryContractUpgradedIterator{contract: _ServiceProviderRegistry.contract, event: "ContractUpgraded", logs: logs, sub: sub}, nil +} + +// WatchContractUpgraded is a free log subscription operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. +// +// Solidity: event ContractUpgraded(string version, address implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchContractUpgraded(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryContractUpgraded) (event.Subscription, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ContractUpgraded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryContractUpgraded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ContractUpgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseContractUpgraded is a log parse operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. +// +// Solidity: event ContractUpgraded(string version, address implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseContractUpgraded(log types.Log) (*ServiceProviderRegistryContractUpgraded, error) { + event := new(ServiceProviderRegistryContractUpgraded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ContractUpgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryEIP712DomainChangedIterator is returned from FilterEIP712DomainChanged and is used to iterate over the raw logs and unpacked data for EIP712DomainChanged events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryEIP712DomainChangedIterator struct { + Event *ServiceProviderRegistryEIP712DomainChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryEIP712DomainChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryEIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryEIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryEIP712DomainChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryEIP712DomainChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryEIP712DomainChanged represents a EIP712DomainChanged event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryEIP712DomainChanged struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEIP712DomainChanged is a free log retrieval operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterEIP712DomainChanged(opts *bind.FilterOpts) (*ServiceProviderRegistryEIP712DomainChangedIterator, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return &ServiceProviderRegistryEIP712DomainChangedIterator{contract: _ServiceProviderRegistry.contract, event: "EIP712DomainChanged", logs: logs, sub: sub}, nil +} + +// WatchEIP712DomainChanged is a free log subscription operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchEIP712DomainChanged(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryEIP712DomainChanged) (event.Subscription, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryEIP712DomainChanged) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEIP712DomainChanged is a log parse operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseEIP712DomainChanged(log types.Log) (*ServiceProviderRegistryEIP712DomainChanged, error) { + event := new(ServiceProviderRegistryEIP712DomainChanged) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryInitializedIterator struct { + Event *ServiceProviderRegistryInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryInitialized represents a Initialized event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterInitialized(opts *bind.FilterOpts) (*ServiceProviderRegistryInitializedIterator, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ServiceProviderRegistryInitializedIterator{contract: _ServiceProviderRegistry.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryInitialized) (event.Subscription, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryInitialized) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseInitialized(log types.Log) (*ServiceProviderRegistryInitialized, error) { + event := new(ServiceProviderRegistryInitialized) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryOwnershipTransferredIterator struct { + Event *ServiceProviderRegistryOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryOwnershipTransferred represents a OwnershipTransferred event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ServiceProviderRegistryOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryOwnershipTransferredIterator{contract: _ServiceProviderRegistry.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryOwnershipTransferred) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseOwnershipTransferred(log types.Log) (*ServiceProviderRegistryOwnershipTransferred, error) { + event := new(ServiceProviderRegistryOwnershipTransferred) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProductAddedIterator is returned from FilterProductAdded and is used to iterate over the raw logs and unpacked data for ProductAdded events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductAddedIterator struct { + Event *ServiceProviderRegistryProductAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProductAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProductAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProductAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProductAdded represents a ProductAdded event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductAdded struct { + ProviderId *big.Int + ProductType uint8 + ServiceUrl string + ServiceProvider common.Address + CapabilityKeys []string + CapabilityValues []string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProductAdded is a free log retrieval operation binding the contract event 0x93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717. +// +// Solidity: event ProductAdded(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProductAdded(opts *bind.FilterOpts, providerId []*big.Int, productType []uint8) (*ServiceProviderRegistryProductAddedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProductAdded", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProductAddedIterator{contract: _ServiceProviderRegistry.contract, event: "ProductAdded", logs: logs, sub: sub}, nil +} + +// WatchProductAdded is a free log subscription operation binding the contract event 0x93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717. +// +// Solidity: event ProductAdded(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProductAdded(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProductAdded, providerId []*big.Int, productType []uint8) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProductAdded", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProductAdded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProductAdded is a log parse operation binding the contract event 0x93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717. +// +// Solidity: event ProductAdded(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProductAdded(log types.Log) (*ServiceProviderRegistryProductAdded, error) { + event := new(ServiceProviderRegistryProductAdded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProductRemovedIterator is returned from FilterProductRemoved and is used to iterate over the raw logs and unpacked data for ProductRemoved events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductRemovedIterator struct { + Event *ServiceProviderRegistryProductRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProductRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProductRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProductRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProductRemoved represents a ProductRemoved event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductRemoved struct { + ProviderId *big.Int + ProductType uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProductRemoved is a free log retrieval operation binding the contract event 0x4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d. +// +// Solidity: event ProductRemoved(uint256 indexed providerId, uint8 indexed productType) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProductRemoved(opts *bind.FilterOpts, providerId []*big.Int, productType []uint8) (*ServiceProviderRegistryProductRemovedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProductRemoved", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProductRemovedIterator{contract: _ServiceProviderRegistry.contract, event: "ProductRemoved", logs: logs, sub: sub}, nil +} + +// WatchProductRemoved is a free log subscription operation binding the contract event 0x4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d. +// +// Solidity: event ProductRemoved(uint256 indexed providerId, uint8 indexed productType) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProductRemoved(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProductRemoved, providerId []*big.Int, productType []uint8) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProductRemoved", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProductRemoved) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProductRemoved is a log parse operation binding the contract event 0x4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d. +// +// Solidity: event ProductRemoved(uint256 indexed providerId, uint8 indexed productType) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProductRemoved(log types.Log) (*ServiceProviderRegistryProductRemoved, error) { + event := new(ServiceProviderRegistryProductRemoved) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProductUpdatedIterator is returned from FilterProductUpdated and is used to iterate over the raw logs and unpacked data for ProductUpdated events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductUpdatedIterator struct { + Event *ServiceProviderRegistryProductUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProductUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProductUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProductUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProductUpdated represents a ProductUpdated event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductUpdated struct { + ProviderId *big.Int + ProductType uint8 + ServiceUrl string + ServiceProvider common.Address + CapabilityKeys []string + CapabilityValues []string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProductUpdated is a free log retrieval operation binding the contract event 0xc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6. +// +// Solidity: event ProductUpdated(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProductUpdated(opts *bind.FilterOpts, providerId []*big.Int, productType []uint8) (*ServiceProviderRegistryProductUpdatedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProductUpdated", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProductUpdatedIterator{contract: _ServiceProviderRegistry.contract, event: "ProductUpdated", logs: logs, sub: sub}, nil +} + +// WatchProductUpdated is a free log subscription operation binding the contract event 0xc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6. +// +// Solidity: event ProductUpdated(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProductUpdated(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProductUpdated, providerId []*big.Int, productType []uint8) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProductUpdated", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProductUpdated) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProductUpdated is a log parse operation binding the contract event 0xc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6. +// +// Solidity: event ProductUpdated(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProductUpdated(log types.Log) (*ServiceProviderRegistryProductUpdated, error) { + event := new(ServiceProviderRegistryProductUpdated) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProviderInfoUpdatedIterator is returned from FilterProviderInfoUpdated and is used to iterate over the raw logs and unpacked data for ProviderInfoUpdated events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderInfoUpdatedIterator struct { + Event *ServiceProviderRegistryProviderInfoUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProviderInfoUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderInfoUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderInfoUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProviderInfoUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProviderInfoUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProviderInfoUpdated represents a ProviderInfoUpdated event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderInfoUpdated struct { + ProviderId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProviderInfoUpdated is a free log retrieval operation binding the contract event 0xae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f76. +// +// Solidity: event ProviderInfoUpdated(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProviderInfoUpdated(opts *bind.FilterOpts, providerId []*big.Int) (*ServiceProviderRegistryProviderInfoUpdatedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProviderInfoUpdated", providerIdRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProviderInfoUpdatedIterator{contract: _ServiceProviderRegistry.contract, event: "ProviderInfoUpdated", logs: logs, sub: sub}, nil +} + +// WatchProviderInfoUpdated is a free log subscription operation binding the contract event 0xae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f76. +// +// Solidity: event ProviderInfoUpdated(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProviderInfoUpdated(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProviderInfoUpdated, providerId []*big.Int) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProviderInfoUpdated", providerIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProviderInfoUpdated) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderInfoUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProviderInfoUpdated is a log parse operation binding the contract event 0xae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f76. +// +// Solidity: event ProviderInfoUpdated(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProviderInfoUpdated(log types.Log) (*ServiceProviderRegistryProviderInfoUpdated, error) { + event := new(ServiceProviderRegistryProviderInfoUpdated) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderInfoUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProviderRegisteredIterator is returned from FilterProviderRegistered and is used to iterate over the raw logs and unpacked data for ProviderRegistered events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderRegisteredIterator struct { + Event *ServiceProviderRegistryProviderRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProviderRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProviderRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProviderRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProviderRegistered represents a ProviderRegistered event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderRegistered struct { + ProviderId *big.Int + ServiceProvider common.Address + Payee common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProviderRegistered is a free log retrieval operation binding the contract event 0xaff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a5. +// +// Solidity: event ProviderRegistered(uint256 indexed providerId, address indexed serviceProvider, address indexed payee) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProviderRegistered(opts *bind.FilterOpts, providerId []*big.Int, serviceProvider []common.Address, payee []common.Address) (*ServiceProviderRegistryProviderRegisteredIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var serviceProviderRule []interface{} + for _, serviceProviderItem := range serviceProvider { + serviceProviderRule = append(serviceProviderRule, serviceProviderItem) + } + var payeeRule []interface{} + for _, payeeItem := range payee { + payeeRule = append(payeeRule, payeeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProviderRegistered", providerIdRule, serviceProviderRule, payeeRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProviderRegisteredIterator{contract: _ServiceProviderRegistry.contract, event: "ProviderRegistered", logs: logs, sub: sub}, nil +} + +// WatchProviderRegistered is a free log subscription operation binding the contract event 0xaff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a5. +// +// Solidity: event ProviderRegistered(uint256 indexed providerId, address indexed serviceProvider, address indexed payee) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProviderRegistered(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProviderRegistered, providerId []*big.Int, serviceProvider []common.Address, payee []common.Address) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var serviceProviderRule []interface{} + for _, serviceProviderItem := range serviceProvider { + serviceProviderRule = append(serviceProviderRule, serviceProviderItem) + } + var payeeRule []interface{} + for _, payeeItem := range payee { + payeeRule = append(payeeRule, payeeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProviderRegistered", providerIdRule, serviceProviderRule, payeeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProviderRegistered) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProviderRegistered is a log parse operation binding the contract event 0xaff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a5. +// +// Solidity: event ProviderRegistered(uint256 indexed providerId, address indexed serviceProvider, address indexed payee) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProviderRegistered(log types.Log) (*ServiceProviderRegistryProviderRegistered, error) { + event := new(ServiceProviderRegistryProviderRegistered) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProviderRemovedIterator is returned from FilterProviderRemoved and is used to iterate over the raw logs and unpacked data for ProviderRemoved events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderRemovedIterator struct { + Event *ServiceProviderRegistryProviderRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProviderRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProviderRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProviderRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProviderRemoved represents a ProviderRemoved event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderRemoved struct { + ProviderId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProviderRemoved is a free log retrieval operation binding the contract event 0x452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc4. +// +// Solidity: event ProviderRemoved(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProviderRemoved(opts *bind.FilterOpts, providerId []*big.Int) (*ServiceProviderRegistryProviderRemovedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProviderRemoved", providerIdRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProviderRemovedIterator{contract: _ServiceProviderRegistry.contract, event: "ProviderRemoved", logs: logs, sub: sub}, nil +} + +// WatchProviderRemoved is a free log subscription operation binding the contract event 0x452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc4. +// +// Solidity: event ProviderRemoved(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProviderRemoved(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProviderRemoved, providerId []*big.Int) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProviderRemoved", providerIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProviderRemoved) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProviderRemoved is a log parse operation binding the contract event 0x452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc4. +// +// Solidity: event ProviderRemoved(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProviderRemoved(log types.Log) (*ServiceProviderRegistryProviderRemoved, error) { + event := new(ServiceProviderRegistryProviderRemoved) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryUpgradedIterator struct { + Event *ServiceProviderRegistryUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryUpgraded represents a Upgraded event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*ServiceProviderRegistryUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryUpgradedIterator{contract: _ServiceProviderRegistry.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryUpgraded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseUpgraded(log types.Log) (*ServiceProviderRegistryUpgraded, error) { + event := new(ServiceProviderRegistryUpgraded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pdp/contract/ServiceProviderRegistry.json b/pdp/contract/ServiceProviderRegistry.json new file mode 100644 index 000000000..ec2bb6260 --- /dev/null +++ b/pdp/contract/ServiceProviderRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"BURN_ACTOR","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MAX_CAPABILITIES","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_CAPABILITY_KEY_LENGTH","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_CAPABILITY_VALUE_LENGTH","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"REGISTRATION_FEE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"activeProductTypeProviderCount","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"activeProviderCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addProduct","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"capabilityValues","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addressToProviderId","inputs":[{"name":"providerAddress","type":"address","internalType":"address"}],"outputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decodePDPOffering","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PDPOffering","components":[{"name":"serviceURL","type":"string","internalType":"string"},{"name":"minPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"maxPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"ipniPiece","type":"bool","internalType":"bool"},{"name":"ipniIpfs","type":"bool","internalType":"bool"},{"name":"storagePricePerTibPerMonth","type":"uint256","internalType":"uint256"},{"name":"minProvingPeriodInEpochs","type":"uint256","internalType":"uint256"},{"name":"location","type":"string","internalType":"string"},{"name":"paymentTokenAddress","type":"address","internalType":"contract IERC20"}]}],"stateMutability":"pure"},{"type":"function","name":"eip712Domain","inputs":[],"outputs":[{"name":"fields","type":"bytes1","internalType":"bytes1"},{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"verifyingContract","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"extensions","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"encodePDPOffering","inputs":[{"name":"pdpOffering","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PDPOffering","components":[{"name":"serviceURL","type":"string","internalType":"string"},{"name":"minPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"maxPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"ipniPiece","type":"bool","internalType":"bool"},{"name":"ipniIpfs","type":"bool","internalType":"bool"},{"name":"storagePricePerTibPerMonth","type":"uint256","internalType":"uint256"},{"name":"minProvingPeriodInEpochs","type":"uint256","internalType":"uint256"},{"name":"location","type":"string","internalType":"string"},{"name":"paymentTokenAddress","type":"address","internalType":"contract IERC20"}]}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"function","name":"getActiveProvidersByProductType","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"result","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PaginatedProviders","components":[{"name":"providers","type":"tuple[]","internalType":"struct ServiceProviderRegistryStorage.ProviderWithProduct[]","components":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"providerInfo","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","components":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}]},{"name":"product","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProduct","components":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"isActive","type":"bool","internalType":"bool"}]}]},{"name":"hasMore","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"getAllActiveProviders","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"providerIds","type":"uint256[]","internalType":"uint256[]"},{"name":"hasMore","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getNextProviderId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getPDPService","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"pdpOffering","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PDPOffering","components":[{"name":"serviceURL","type":"string","internalType":"string"},{"name":"minPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"maxPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"ipniPiece","type":"bool","internalType":"bool"},{"name":"ipniIpfs","type":"bool","internalType":"bool"},{"name":"storagePricePerTibPerMonth","type":"uint256","internalType":"uint256"},{"name":"minProvingPeriodInEpochs","type":"uint256","internalType":"uint256"},{"name":"location","type":"string","internalType":"string"},{"name":"paymentTokenAddress","type":"address","internalType":"contract IERC20"}]},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getProduct","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getProductCapabilities","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"keys","type":"string[]","internalType":"string[]"}],"outputs":[{"name":"exists","type":"bool[]","internalType":"bool[]"},{"name":"values","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"getProductCapability","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"exists","type":"bool","internalType":"bool"},{"name":"value","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"getProvider","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"info","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","components":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getProviderByAddress","inputs":[{"name":"providerAddress","type":"address","internalType":"address"}],"outputs":[{"name":"info","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","components":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getProviderCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getProviderIdByAddress","inputs":[{"name":"providerAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getProvidersByProductType","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"result","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PaginatedProviders","components":[{"name":"providers","type":"tuple[]","internalType":"struct ServiceProviderRegistryStorage.ProviderWithProduct[]","components":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"providerInfo","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","components":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}]},{"name":"product","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProduct","components":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"isActive","type":"bool","internalType":"bool"}]}]},{"name":"hasMore","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isProviderActive","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isRegisteredProvider","inputs":[{"name":"provider","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"migrate","inputs":[{"name":"newVersion","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"productCapabilities","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"productTypeProviderCount","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"providerHasProduct","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"providerProducts","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"providers","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"registerProvider","inputs":[{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"capabilityValues","type":"string[]","internalType":"string[]"}],"outputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"removeProduct","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeProvider","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updatePDPServiceWithCapabilities","inputs":[{"name":"pdpOffering","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PDPOffering","components":[{"name":"serviceURL","type":"string","internalType":"string"},{"name":"minPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"maxPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"ipniPiece","type":"bool","internalType":"bool"},{"name":"ipniIpfs","type":"bool","internalType":"bool"},{"name":"storagePricePerTibPerMonth","type":"uint256","internalType":"uint256"},{"name":"minProvingPeriodInEpochs","type":"uint256","internalType":"uint256"},{"name":"location","type":"string","internalType":"string"},{"name":"paymentTokenAddress","type":"address","internalType":"contract IERC20"}]},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"capabilityValues","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateProduct","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"capabilityValues","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateProviderInfo","inputs":[{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"ContractUpgraded","inputs":[{"name":"version","type":"string","indexed":false,"internalType":"string"},{"name":"implementation","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProductAdded","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"productType","type":"uint8","indexed":true,"internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"serviceUrl","type":"string","indexed":false,"internalType":"string"},{"name":"serviceProvider","type":"address","indexed":false,"internalType":"address"},{"name":"capabilityKeys","type":"string[]","indexed":false,"internalType":"string[]"},{"name":"capabilityValues","type":"string[]","indexed":false,"internalType":"string[]"}],"anonymous":false},{"type":"event","name":"ProductRemoved","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"productType","type":"uint8","indexed":true,"internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"anonymous":false},{"type":"event","name":"ProductUpdated","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"productType","type":"uint8","indexed":true,"internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"serviceUrl","type":"string","indexed":false,"internalType":"string"},{"name":"serviceProvider","type":"address","indexed":false,"internalType":"address"},{"name":"capabilityKeys","type":"string[]","indexed":false,"internalType":"string[]"},{"name":"capabilityValues","type":"string[]","indexed":false,"internalType":"string[]"}],"anonymous":false},{"type":"event","name":"ProviderInfoUpdated","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ProviderRegistered","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"serviceProvider","type":"address","indexed":true,"internalType":"address"},{"name":"payee","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProviderRemoved","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x60a080604052346100c257306080525f51602061523c5f395f51905f525460ff8160401c166100b3576002600160401b03196001600160401b03821601610060575b60405161517590816100c78239608051818181612561015261494b0152f35b6001600160401b0319166001600160401b039081175f51602061523c5f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80610041565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806302ff8437146131c65780630a6a63f1146131a45780630b5c012514612a485780631e35bdde14612983578063213c63b1146129695780632335bde01461291d5780632f67c065146128db5780634368bafb1461285857806346ce41751461283c5780634f1ef286146126c357806350f3fc811461261357806351ca236f146125b557806352d1902d1461254f5780635c42d079146124c957806364b4f751146124a75780636bf6d74f146124385780636e36e9741461241d578063715018a6146123b65780637f6575671461239c5780638129fc1c14611eff57806382ee4b3414611eb057806383df54a514611e3f57806384b0196e14611b9c5780638bdc774714611b745780638c9a7b561461165f5780638da5cb5b1461162b57806393ecb91e146102d0578063a643324014611430578063a9d239b6146112a1578063aca0988f14611201578063ad3cb1cc146111ba578063b47be8ab14610b85578063b6363b9914610992578063c439fd57146108ac578063c9c5b5b41461070a578063cde24beb14610698578063d1329d4e1461065c578063d1c21b5b146103a3578063dcea1c6f14610388578063deb0e46214610339578063e459382f14610308578063e835440e146102d0578063f08bbda0146102b3578063f2fde38b14610288578063fc260f7b146102625763ffa1ad7414610213575f80fd5b3461025e575f36600319011261025e5761025a604051610234604082613491565b6005815264302e302e3160d81b6020820152604051918291602083526020830190613690565b0390f35b5f80fd5b3461025e5761025a61027c610276366136b4565b9161460b565b60405191829182613749565b3461025e57602036600319011261025e576102b16102a461386d565b6102ac61499f565b61459a565b005b3461025e575f36600319011261025e576020600754604051908152f35b3461025e57602036600319011261025e576001600160a01b036102f161386d565b165f526003602052602060405f2054604051908152f35b3461025e57602036600319011261025e57600435600181101561025e576103306020916138cd565b54604051908152f35b3461025e57602036600319011261025e576004356001600160401b03811161025e5761037461036f61025a923690600401613503565b61457e565b604051918291602083526020830190613a2a565b3461025e575f36600319011261025e57602060405160808152f35b3461025e57604036600319011261025e576004356001600160401b03811161025e576103d3903690600401613347565b6024356001600160401b03811161025e576103f2903690600401613347565b9092335f52600360205260405f20549283151561040e81613b09565b80610651575b61041d90613b55565b5f8481526001602052604090205461043f906001600160a01b03161515613ba1565b835f52600160205261045a60ff600460405f20015416614407565b610467608082111561422d565b610475610100841115614269565b835f526001602052600260405f2001916001600160401b0382116105ce576104a7826104a185546138fa565b856142c2565b5f90601f83116001146105ed576104d592915f91836105e2575b50508160011b915f199060031b1c19161790565b90555b815f526001602052600360405f2001906001600160401b0381116105ce5761050a8161050484546138fa565b846142c2565b5f601f821160011461056c5781906105389394955f926105615750508160011b915f199060031b1c19161790565b90555b7fae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f765f80a2005b0135905085806104c1565b601f19821694835f5260205f20915f5b8781106105b657508360019596971061059d575b505050811b01905561053b565b01355f19600384901b60f8161c19169055848080610590565b9092602060018192868601358155019401910161057c565b634e487b7160e01b5f52604160045260245ffd5b0135905087806104c1565b601f19831691845f5260205f20925f5b8181106106395750908460019594939210610620575b505050811b0190556104d8565b01355f19600384901b60f8161c19169055868080610613565b919360206001819287870135815501950192016105fd565b505f54841115610414565b3461025e575f36600319011261025e575f546001810180911161068457602090604051908152f35b634e487b7160e01b5f52601160045260245ffd5b3461025e57602060ff60036106f26106af366139b3565b90801515806106ff575b6106c290613b55565b5f8181526001875260409020546106e3906001600160a01b03161515613ba1565b5f526002855260405f206138e4565b0154166040519015158152f35b505f548111156106b9565b3461025e57602036600319011261025e576004356001600160401b03811161025e5761073a903690600401613503565b610742614941565b5f5160206151205f395f51905f525460ff8160401c16908115610897575b506108885760026001600160401b03195f5160206151205f395f51905f525416175f5160206151205f395f51905f525560ff60401b195f5160206151205f395f51905f52541690303303610843576107fe7f2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c39160018060a01b035f5160206151005f395f51905f525416604051928392604084526040840190613690565b9060208301520390a15f5160206151205f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160028152a1005b60405162461bcd60e51b815260206004820152601a60248201527f4f6e6c792073656c662063616e2063616c6c206d6967726174650000000000006044820152606490fd5b63f92ee8a960e01b5f5260045ffd5b600291506001600160401b0316101582610760565b3461025e57602036600319011261025e576109476004356108cb6143c2565b81151580610987575b6108dd90613b55565b5f828152600160205260409020546108ff906001600160a01b03161515613ba1565b9060605f915f52600260205260405f205f805260205261092160405f20613dfe565b60208101518051610961575b505061095590604051948594606086526060860190613a2a565b9084820360208601526139d2565b90151560408301520390f35b9150925061096f915061457e565b9061095560606040830151920151151591908561092d565b505f548211156108d4565b3461025e575f36600319011261025e57335f52600360205260405f20548015156109bb81613b09565b80610b7a575b6109ca90613b55565b5f818152600160205260409020546109ec906001600160a01b03161515613ba1565b805f526001602052610a0760ff600460405f20015416614407565b5f81815260016020526040902054610a29906001600160a01b0316331461473c565b805f526001602052600460405f200160ff198154169055610a4b6007546149d2565b600755805f52600260205260405f205f8052602052610a70600160405f2001546138fa565b610abd575b805f52600160205260018060a01b0360405f2054165f5260036020525f60408120557f452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc45f80a2005b805f52600260205260405f205f805260205260405f206003810160ff815416610b3f575b90825f52600460205260405f205f805260205260405f209260025f9201915b8254811015610b2e5780610b28610b2387610b1d60019588614841565b50614856565b6148db565b01610b00565b5092505060ff198154169055610a75565b5f805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f88054610b73906149d2565b9055610ae1565b505f548111156109c1565b60e036600319011261025e57610b9961386d565b6024356001600160401b03811161025e57610bb8903690600401613347565b6044929192356001600160401b03811161025e57610bda903690600401613347565b93909160643591600183101561025e576084356001600160401b03811161025e57610c09903690600401613347565b929060a4356001600160401b03811161025e57610c2a903690600401613374565b909760c4356001600160401b03811161025e57610c4b903690600401613374565b949095610c588915613aab565b6001600160a01b0383161561117557335f52600360205260405f205461113057674563918244f4000034036110f457610c94608083111561422d565b610ca26101008d1115614269565b5f54610cad90613d6b565b998a5f556040519c8d92610cc084613424565b3384526001600160a01b0386166020850190815294610ce1913691906134cd565b926040019283523690610cf3926134cd565b60608d01908152600160808e0181905260a08e018c90525f8c81526020829052604090208e5181546001600160a01b03199081166001600160a01b03928316178355955192820180549096169216919091179093559051805160028401916001600160401b0382116105ce57610d6d826104a185546138fa565b602090601f831160011461109157610d9b92915f918361100d5750508160011b915f199060031b1c19161790565b90555b519a8b519b6001600160401b038d116105ce578c90610dcd82610dc460038701546138fa565b600387016142c2565b601f602092116001146110185791610e058e8d9e9f60a0949d9e9d6005965f9261100d5750508160011b915f199060031b1c19161790565b60038501555b610e2a60808201511515600486019060ff801983541691151516179055565b0151910155335f5260036020528660405f2055610e48600754613d6b565b6007556001600160a01b031633877faff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a55f80a4610ea6610e883687856134cd565b610e9336848d61360a565b610e9e36878961360a565b918a8a6149de565b6020988992604051610eb88582613491565b5f8152968915610f9f575b505092610f2e610f3c93610f1d96937f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af71798968a5f526001835260018060a01b0360405f205416604051998a9960808b5260808b0190613690565b9389015287830360408901526142fc565b9184830360608601526142fc565b0390a35f808080674563918244f40000606360ff60981b015af1610f5e614393565b5015610f6c57604051908152f35b60405162461bcd60e51b815260048101839052600b60248201526a109d5c9b8819985a5b195960aa1b6044820152606490fd5b929597509250929450810194888287031261025e578135946001600160401b03861161025e57610f2e8a610f1d96610ffe8c9a7f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af7179a610f3c980161352e565b51985093965093949194610ec3565b015190505f806104c1565b908d91600385015f52815f20925f905b601f1916811061107857508e8d9e9f93600595939d9e9d60019360a096601f19811610611060575b505050811b016003850155610e0b565b01515f1960f88460031b161c191690555f8080611050565b818301518455600190930192602092830192018f611028565b90601f19831691845f52815f20925f5b8181106110dc57509084600195949392106110c4575b505050811b019055610d9e565b01515f1960f88460031b161c191690558f80806110b7565b929360206001819287860151815501950193016110a1565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0819995948185b5bdd5b9d60621b6044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920726567697374657265640000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f50617965652063616e6e6f74206265207a65726f2061646472657373000000006044820152606490fd5b3461025e575f36600319011261025e5761025a6040516111db604082613491565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613690565b3461025e5761094761126261125d611218366139b3565b9080151580611296575b61122b90613b55565b5f8181526001602052604090205461124d906001600160a01b03161515613ba1565b5f52600260205260405f206138e4565b613dfe565b60208101519061128c60606040830151920151151591604051948594606086526060860190613690565b9060408301520390f35b505f54811115611222565b3461025e57602036600319011261025e57600435600181101561025e576112c88115613aab565b335f52600360205260405f20548015156112e181613b09565b80611425575b6112f090613b55565b5f81815260016020526040902054611312906001600160a01b03161515613ba1565b805f52600160205261132d60ff600460405f20015416614407565b5f8181526001602052604090205461134f906001600160a01b0316331461473c565b805f52600260205261137360ff600361136b8560405f206138e4565b0154166147e4565b805f5260026020526113888260405f206138e4565b815f52600460205261139d8360405f206138e4565b9260025f9201915b82548110156113c857806113c2610b2387610b1d60019588614841565b016113a5565b5082805f52600260205260036113e18360405f206138e4565b01805460ff191690556113f3826138b6565b6113fd81546149d2565b90557f4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d5f80a3005b505f548111156112e7565b3461025e57606036600319011261025e57600435602435600181101561025e576044356001600160401b03811161025e5761146f903690600401613374565b9083151580611620575b61148590939293613b55565b5f848152600160205260409020546114a7906001600160a01b03161515613ba1565b6114b0836135f3565b916114be6040519384613491565b8383526114ca846135f3565b602084019190601f19013683376114e0856135f3565b956114ee6040519788613491565b858752601f196114fd876135f3565b015f5b81811061160d5750509061151e915f52600460205260405f206138e4565b9136819003601e1901915f5b868110156115be578060051b8301358481121561025e578301908135916001600160401b03831161025e5760200191803603831361025e576115886115758861158193600196613be2565b60405192838092613932565b0382613491565b8051611596575b500161152a565b826115a1838a613ea9565b526115ac828b613ea9565b526115b7818a613ea9565b508961158f565b50848760405191604083019060408452518091526060830193905f5b8181106115f557848061025a888783820360208501526139d2565b825115158652602095860195909201916001016115da565b60606020828b0181019190915201611500565b505f54841115611479565b3461025e575f36600319011261025e575f5160206150c05f395f51905f52546040516001600160a01b039091168152602090f35b3461025e5761166d366133a4565b9293906001871015611b60576116c1906116b988159661168c88613aab565b335f5260036020526116b160405f2054998a1515966116aa88613b09565b36916134cd565b95369161360a565b94369161360a565b9080611b55575b6116d490969596613b55565b5f868152600160205260409020546116f6906001600160a01b03161515613ba1565b855f52600160205261171160ff600460405f20015416614407565b5f86815260016020526040902054611733906001600160a01b0316331461473c565b855f5260026020526117488560405f206138e4565b94600386019661175b60ff8954166147e4565b6117658483614d9f565b61176f8386614e4f565b805f5260046020526117848260405f206138e4565b955f9860028901995b8a548110156117b157806117ab610b238b610b1d8f95600196614841565b0161178d565b508960018a999798996117c48782614929565b0188516001600160401b0381116105ce576117e38161050484546138fa565b6020601f8211600114611af3579080611810925f91611ae8575b508160011b915f199060031b1c19161790565b90555b8851600160401b81116105ce578154818355808210611abb575b5060208a01915f5260205f20915f905b8282106119e65750505050600160ff198254161790555f5b875181101561195c576118688186613ea9565b51602080611876848c613ea9565b51604051928184925191829101835e81018a815203019020908051906001600160401b0382116105ce576118ae826104a185546138fa565b602090601f83116001146118f55791806118e19260019695945f926118ea5750508160011b915f199060031b1c19161790565b90555b01611855565b015190508d806104c1565b90601f19831691845f52815f20925f5b81811061194457509160019695949291838895931061192c575b505050811b0190556118e4565b01515f1960f88460031b161c191690558c808061191f565b92936020600181928786015181550195019301611905565b50867fc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6918588604051611990602082613491565b5f8152926119c5575b506119c090855f52600160205260018060a01b0360405f205416936040519485948561479d565b0390a3005b6119c0919250806020806119de9351830101910161449f565b519190611999565b80518051906001600160401b0382116105ce57611a0d82611a0788546138fa565b886142c2565b602090601f8311600114611a525792611a43836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b0194019101909261183d565b90601f19831691875f52815f20925f5b818110611aa35750936020936001969387969383889510611a8b575b505050811b018755611a46565b01515f1960f88460031b161c191690555f8080611a7e565b92936020600181928786015181550195019301611a62565b825f528160205f2091820191015b818110611ad6575061182d565b80611ae26001926148db565b01611ac9565b90508b01518d6117fd565b601f19821690835f52805f20915f5b8d828210611b3d5750509083600194939210611b25575b5050811b019055611813565b8c01515f1960f88460031b161c191690558c80611b19565b60018495602093958493015181550194019201611b02565b505f548511156116c8565b634e487b7160e01b5f52602160045260245ffd5b3461025e57602036600319011261025e57600435600181101561025e576103306020916138b6565b3461025e575f36600319011261025e577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580611e16575b15611dd9576040515f5160206150a05f395f51905f5254815f611bf7836138fa565b8083529260018116908115611dba5750600114611d4f575b611c1b92500382613491565b604051905f5f5160206150e05f395f51905f5254611c38816138fa565b8085529060018116908115611d2d5750600114611cc9575b5082611c64611c9b9461025a930382613491565b611ca960405191611c76602084613491565b5f83525f368137604051958695600f60f81b875260e0602088015260e0870190613690565b908582036040870152613690565b904660608501523060808501525f60a085015283820360c0850152613883565b5f5160206150e05f395f51905f525f90815291507f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b818310611d13575050820160200182611c50565b600181602092949394548385890101520191019190611cff565b60ff191660208087019190915291151560051b85019091019150839050611c50565b505f5160206150a05f395f51905f525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b818310611d9e575050906020611c1b92820101611c0f565b6020919350806001915483858801015201910190918392611d86565b60209250611c1b94915060ff191682840152151560051b820101611c0f565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415611bd5565b3461025e57602036600319011261025e5760043580151580611ea5575b611e6590613b55565b5f81815260016020526040902054611e87906001600160a01b03161515613ba1565b5f526001602052602060ff600460405f200154166040519015158152f35b505f54811115611e5c565b3461025e57602036600319011261025e576004356001600160401b03811161025e57611eeb611ee661025a92369060040161352e565b614202565b604051918291602083526020830190613690565b3461025e575f36600319011261025e575f5160206151205f395f51905f52546001600160401b0360ff8260401c1615911680159081612394575b600114908161238a575b159081612381575b50610888578060016001600160401b03195f5160206151205f395f51905f525416175f5160206151205f395f51905f5255612351575b611f89615016565b611f91615016565b611f9a3361459a565b611fa2615016565b604090815191611fb28184613491565b601783527f5365727669636550726f766964657252656769737472790000000000000000006020840152805191611fe98284613491565b60018352603160f81b6020840152611fff615016565b612007615016565b83516001600160401b0381116105ce5761202e5f5160206150a05f395f51905f52546138fa565b601f81116122f7575b50602094601f821160011461227c576120699293949582915f926122715750508160011b915f199060031b1c19161790565b5f5160206150a05f395f51905f52555b82516001600160401b0381116105ce576120a05f5160206150e05f395f51905f52546138fa565b601f811161220c575b506020601f82116001146121915781906120d99394955f926121865750508160011b915f199060031b1c19161790565b5f5160206150e05f395f51905f52555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015561213557005b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29160ff60401b195f5160206151205f395f51905f5254165f5160206151205f395f51905f52555160018152a1005b0151905085806104c1565b601f198216905f5160206150e05f395f51905f525f52805f20915f5b8181106121f4575095836001959697106121dc575b505050811b015f5160206150e05f395f51905f52556120e9565b01515f1960f88460031b161c191690558480806121c2565b9192602060018192868b0151815501940192016121ad565b5f5160206150e05f395f51905f525f52612261907f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510612267575b601f0160051c01906142ac565b846120a9565b9091508190612254565b0151905086806104c1565b601f198216955f5160206150a05f395f51905f525f52805f20915f5b8881106122df575083600195969798106122c7575b505050811b015f5160206150a05f395f51905f5255612079565b01515f1960f88460031b161c191690558580806122ad565b91926020600181928685015181550194019201612298565b5f5160206150a05f395f51905f525f5261234b907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c8101916020851061226757601f0160051c01906142ac565b85612037565b600160401b60ff60401b195f5160206151205f395f51905f525416175f5160206151205f395f51905f5255611f81565b90501582611f4b565b303b159150611f43565b829150611f39565b3461025e575f36600319011261025e576020604051818152f35b3461025e575f36600319011261025e576123ce61499f565b5f5160206150c05f395f51905f5280546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461025e575f36600319011261025e576020604051600a8152f35b3461025e5761249661245d61244c366139b3565b905f52600260205260405f206138e4565b60ff8154169061095560ff6003604051936124868561247f8160018501613932565b0386613491565b015416916040519485809561373c565b606060208501526060840190613690565b3461025e575f36600319011261025e576020604051674563918244f400008152f35b3461025e57602036600319011261025e576004356124e5613c24565b5080151580612544575b6124f890613b55565b5f8181526001602052604090205461251a906001600160a01b03161515613ba1565b5f52600160205261025a61253060405f20613d79565b6040519182916020835260208301906136d7565b505f548111156124ef565b3461025e575f36600319011261025e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036125a65760206040515f5160206151005f395f51905f528152f35b63703e46dd60e11b5f5260045ffd5b3461025e57602036600319011261025e576001600160a01b036125d661386d565b165f52600360205260405f2054801515806125f9575b6020906040519015158152f35b505f526001602052602060ff600460405f200154166125ec565b3461025e57602036600319011261025e576004355f52600160205260405f2060018060a01b0381541660018060a01b036001830154169160405161265e816115818160028601613932565b6126b2604051612675816115818160038801613932565b6126a4600560ff600487015416950154936040519788978852602088015260c0604088015260c0870190613690565b908582036060870152613690565b911515608084015260a08301520390f35b604036600319011261025e576126d761386d565b6024356001600160401b03811161025e576126f6903690600401613503565b6126fe614941565b61270661499f565b6040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f9181612808575b506127485783634c9c8ce360e01b5f5260045260245ffd5b805f5160206151005f395f51905f528592036127f65750813b156127e4575f5160206151005f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156127cc575f808360206102b195519101845af46127c6614393565b91615041565b5050346127d557005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011612834575b8161282460209383613491565b8101031261025e57519085612730565b3d9150612817565b3461025e575f36600319011261025e5760205f54604051908152f35b3461025e57606036600319011261025e57602435600181101561025e57604435906001600160401b03821161025e57611eeb602080611581936128b86128a561025a973690600401613503565b916004355f526004845260405f206138e4565b604051938285935191829101845e82019081520301902060405192838092613932565b3461025e57604036600319011261025e576129116128fd6024356004356140b3565b604051928392604084526040840190613883565b90151560208301520390f35b3461025e57602036600319011261025e5761293661386d565b61293e613c24565b5060018060a01b03165f52600360205260405f20545f52600160205261025a61253060405f20613d79565b3461025e5761025a61027c61297d366136b4565b91613ed1565b3461025e57606036600319011261025e57600435602435600181101561025e576044356001600160401b03811161025e5761158192612a1d92612a176129d0611575943690600401613347565b92909380151580612a3d575b6129e590613b55565b5f81815260016020526040902054612a07906001600160a01b03161515613ba1565b5f52600460205260405f206138e4565b91613be2565b8051151561025a6040519283928352604060208401526040830190613690565b505f548111156129dc565b3461025e57606036600319011261025e576004356001600160401b03811161025e57612a7890369060040161352e565b6024356001600160401b03811161025e57612a97903690600401613675565b6044356001600160401b03811161025e57612ab6903690600401613675565b90335f52600360205260405f205490612ad582151594611ee686613b09565b9380613199575b612ae590613b55565b5f82815260016020526040902054612b07906001600160a01b03161515613ba1565b815f526001602052612b2260ff600460405f20015416614407565b5f82815260016020526040902054612b44906001600160a01b0316331461473c565b815f52600260205260405f205f805260205260405f20936003850193612b6d60ff8654166147e4565b815193612b826020808501968501018661449f565b80515115613154576101008151511161311857602081018051156130c557604082015190511161306f5760c0810151156130185760e00180515115612fd357608090515111612f9a57612bd88285989798614e4f565b805f52600460205260405f205f805260205260405f20945f9760028801985b8954811015612c1a5780612c14610b238a610b1d6001958f614841565b01612bf7565b50886001899896979860ff1981541681550187516001600160401b0381116105ce57612c4a8161050484546138fa565b6020601f8211600114612f38579080612c76925f91612f2d57508160011b915f199060031b1c19161790565b90555b8751600160401b81116105ce578154818355808210612f00575b5060208901915f5260205f20915f905b828210612e315750505050600160ff198254161790555f5b8651811015612dc257612cce8185613ea9565b51602080612cdc848b613ea9565b51604051928184925191829101835e810189815203019020908051906001600160401b0382116105ce57612d14826104a185546138fa565b602090601f8311600114612d5b579180612d479260019695945f92612d505750508160011b915f199060031b1c19161790565b90555b01612cbb565b015190508c806104c1565b90601f19831691845f52815f20925f5b818110612daa575091600196959492918388959310612d92575b505050811b019055612d4a565b01515f1960f88460031b161c191690558b8080612d85565b92936020600181928786015181550195019301612d6b565b50855f936119c0612e0a7fc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed69460208a89604051612dff8482613491565b52805101019061449f565b51858752600160205260408088205490519485949290916001600160a01b0316908561479d565b80518051906001600160401b0382116105ce57612e5282611a0788546138fa565b602090601f8311600114612e975792612e88836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b01940191019092612ca3565b90601f19831691875f52815f20925f5b818110612ee85750936020936001969387969383889510612ed0575b505050811b018755612e8b565b01515f1960f88460031b161c191690555f8080612ec3565b92936020600181928786015181550195019301612ea7565b825f528160205f2091820191015b818110612f1b5750612c93565b80612f276001926148db565b01612f0e565b90508a01518c6117fd565b601f19821690835f52805f20915f5b8c828210612f825750509083600194939210612f6a575b5050811b019055612c79565b8b01515f1960f88460031b161c191690558b80612f5e565b60018495602093958493015181550194019201612f47565b60405162461bcd60e51b81526020600482015260116024820152704c6f636174696f6e20746f6f206c6f6e6760781b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f4c6f636174696f6e2063616e6e6f7420626520656d70747900000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152602960248201527f4d696e2070726f76696e6720706572696f64206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602860248201527f4d61782070696563652073697a65206d757374206265203e3d206d696e2070696044820152676563652073697a6560c01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f4d696e2070696563652073697a65206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526014602482015273536572766963652055524c20746f6f206c6f6e6760601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601b60248201527f536572766963652055524c2063616e6e6f7420626520656d70747900000000006044820152606490fd5b505f54821115612adc565b3461025e575f36600319011261025e57604051606360ff60981b018152602090f35b3461025e576131d4366133a4565b929193906001871015611b605761321a906116b98815946131f486613aab565b335f52600360205261321260405f2054998a1515966116aa88613b09565b97369161360a565b908061333c575b61322a90613b55565b5f8581526001602052604090205461324c906001600160a01b03161515613ba1565b845f52600160205261326760ff600460405f20015416614407565b5f85815260016020526040902054613289906001600160a01b0316331461473c565b845f52600260205260ff60036132a28860405f206138e4565b0154166132e657836132d882857f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717978a8a6149de565b604051611990602082613491565b60405162461bcd60e51b815260206004820152602860248201527f50726f6475637420616c72656164792065786973747320666f72207468697320604482015267383937bb34b232b960c11b6064820152608490fd5b505f54851115613221565b9181601f8401121561025e578235916001600160401b03831161025e576020838186019501011161025e57565b9181601f8401121561025e578235916001600160401b03831161025e576020808501948460051b01011161025e57565b90608060031983011261025e57600435600181101561025e57916024356001600160401b03811161025e57816133dc91600401613347565b929092916044356001600160401b03811161025e57816133fe91600401613374565b92909291606435906001600160401b03821161025e5761342091600401613374565b9091565b60c081019081106001600160401b038211176105ce57604052565b61012081019081106001600160401b038211176105ce57604052565b606081019081106001600160401b038211176105ce57604052565b608081019081106001600160401b038211176105ce57604052565b90601f801991011681019081106001600160401b038211176105ce57604052565b6001600160401b0381116105ce57601f01601f191660200190565b9291926134d9826134b2565b916134e76040519384613491565b82948184528183011161025e578281602093845f960137010152565b9080601f8301121561025e5781602061351e933591016134cd565b90565b3590811515820361025e57565b91906101208382031261025e57604051906135488261343f565b819380356001600160401b03811161025e5782613566918301613503565b8352602081013560208401526040810135604084015261358860608201613521565b606084015261359960808201613521565b608084015260a081013560a084015260c081013560c084015260e08101356001600160401b03811161025e57610100926135d4918301613503565b60e08401520135906001600160a01b038216820361025e576101000152565b6001600160401b0381116105ce5760051b60200190565b929190613616816135f3565b936136246040519586613491565b602085838152019160051b81019183831161025e5781905b83821061364a575050505050565b81356001600160401b03811161025e5760209161366a8784938701613503565b81520191019061363c565b9080601f8301121561025e5781602061351e9335910161360a565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b606090600319011261025e57600435600181101561025e57906024359060443590565b9060018060a01b03825116815260018060a01b03602083015116602082015260a080613727613715604086015160c0604087015260c0860190613690565b60608601518582036060870152613690565b93608081015115156080850152015191015290565b906001821015611b605752565b6020815260608101918051926040602084015283518091526080830190602060808260051b8601019501915f905b828210613791575050505060206040910151151591015290565b90919295607f1986820301825286518051825260406137bf60208301516060602086015260608501906136d7565b9101519160408183039101526137d681835161373c565b6137ef6020830151608060208401526080830190613690565b916040810151928281036040840152835180825260208201906020808260051b8501019601925f5b8281106138425750505050606091820151151591909201525095602090810193926001019101613777565b9091929396602080613860600193601f198782030189528b51613690565b9901950193929101613817565b600435906001600160a01b038216820361025e57565b90602080835192838152019201905f5b8181106138a05750505090565b8251845260209384019390920191600101613893565b6001811015611b60575f52600660205260405f2090565b6001811015611b60575f52600560205260405f2090565b906001811015611b60575f5260205260405f2090565b90600182811c92168015613928575b602083101461391457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613909565b5f9291815491613941836138fa565b8083529260018116908115613996575060011461395d57505050565b5f9081526020812093945091925b83831061397c575060209250010190565b60018160209294939454838587010152019101919061396b565b915050602093945060ff929192191683830152151560051b010190565b604090600319011261025e5760043590602435600181101561025e5790565b9080602083519182815201916020808360051b8301019401925f915b8383106139fd57505050505090565b9091929394602080613a1b600193601f198682030187528951613690565b970193019301919392906139ee565b90610100613a98613a4684516101208552610120850190613690565b602085015160208501526040850151604085015260608501511515606085015260808501511515608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152613690565b928101516001600160a01b031691015290565b15613ab257565b60405162461bcd60e51b815260206004820152602960248201527f4f6e6c79205044502070726f6475637420747970652063757272656e746c79206044820152681cdd5c1c1bdc9d195960ba1b6064820152608490fd5b15613b1057565b60405162461bcd60e51b815260206004820152601760248201527f50726f7669646572206e6f7420726567697374657265640000000000000000006044820152606490fd5b15613b5c57565b60405162461bcd60e51b815260206004820152601760248201527f50726f766964657220646f6573206e6f742065786973740000000000000000006044820152606490fd5b15613ba857565b60405162461bcd60e51b8152602060048201526012602482015271141c9bdd9a59195c881b9bdd08199bdd5b9960721b6044820152606490fd5b6020919283604051948593843782019081520301902090565b60405190604082018281106001600160401b038211176105ce576040525f602083606081520152565b60405190613c3182613424565b5f60a083828152826020820152606060408201526060808201528260808201520152565b60405190613c64602083613491565b5f80835282815b828110613c7757505050565b602090604051613c868161345b565b5f8152613c91613c24565b83820152604051613ca181613476565b5f8152606084820152606060408201525f6060820152604082015282828501015201613c6b565b90613cd2826135f3565b613cdf6040519182613491565b8281528092613cf0601f19916135f3565b01905f5b828110613d0057505050565b602090604051613d0f8161345b565b5f8152613d1a613c24565b83820152604051613d2a81613476565b5f8152606084820152606060408201525f6060820152604082015282828501015201613cf4565b9190820180921161068457565b9190820391821161068457565b5f1981146106845760010190565b90604051613d8681613424565b82546001600160a01b03908116825260018401541660208201526040519092839160a091600591613dbe816115818160028601613932565b6040850152604051613dd7816115818160038601613932565b606085015260ff600482015416151560808501520154910152565b6001821015611b605752565b90604051613e0b81613476565b8092613e1b60ff82541683613df2565b604051613e2f816115818160018601613932565b6020830152600281018054613e43816135f3565b91613e516040519384613491565b81835260208301905f5260205f205f915b838310613e845750505050600360609260ff9260408601520154161515910152565b600160208192604051613e9b816115818189613932565b815201920192019190613e62565b8051821015613ebd5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b92919092613edd613bfb565b613ee6826138b6565b548086108015906140ab575b6140925780613f018588613d51565b11614080575b613f1084613cc8565b8252613f1c8487613d51565b1060208201525f915f906001955f54965b8781111580614077575b1561406c57805f52600160205260ff600460405f200154168061404a575b80614021575b613f6e575b613f6990613d6b565b613f2d565b94888110158061400f575b613f92575b613f8a613f6991613d6b565b959050613f60565b92613f8a614006613f6992885f526001602052614000818a613fe860405f20825f526002602052613fde613fc98c60405f206138e4565b9160405194613fd78661345b565b8552613d79565b6020840152613dfe565b60408201528a5190613ffa8383613ea9565b52613ea9565b50613d6b565b94915050613f7e565b5061401a878a613d51565b8110613f79565b50805f526002602052614043600161403c8560405f206138e4565b01546138fa565b1515613f5b565b50805f52600260205260ff60036140648560405f206138e4565b015416613f55565b509550505093505050565b50868410613f37565b925061408c8584613d5e565b92613f07565b5092935050506140a0613c55565b81525f602082015290565b508315613ef2565b91906007548084108015906141fa575b6141dc57806140d28386613d51565b116141ca575b6140e1826135f3565b936140ef6040519586613491565b828552601f196140fe846135f3565b0136602087013784916141118483613d51565b10905f925f926001965f54975b88811115806141c1575b156141b557805f52600160205260ff600460405f20015416614153575b61414e90613d6b565b61411e565b95898786831015806141a3575b61417b575b505061417361414e91613d6b565b969050614145565b9161414e9261419889614192614173959b91613d6b565b9a613ea9565b529150508987614165565b506141ae8a88613d51565b8310614160565b50955095509550505050565b50878610614128565b90506141d68382613d5e565b906140d8565b505090506040516141ee602082613491565b5f81525f368137905f90565b5081156140c3565b61351e61421f916040519283916020808401526040830190613a2a565b03601f198101835282613491565b1561423457565b60405162461bcd60e51b815260206004820152600d60248201526c4e616d6520746f6f206c6f6e6760981b6044820152606490fd5b1561427057565b60405162461bcd60e51b81526020600482015260146024820152734465736372697074696f6e20746f6f206c6f6e6760601b6044820152606490fd5b8181106142b7575050565b5f81556001016142ac565b9190601f81116142d157505050565b6142fa925f5260205f20906020601f840160051c8301931061226757601f0160051c01906142ac565b565b90602083828152019060208160051b85010193835f915b8383106143235750505050505090565b909192939495601f198282030186528635601e198436030181121561025e57830190602082359201916001600160401b03811161025e57803603831361025e576020828280600196849695859652848401375f828201840152601f01601f19160101980196019493019190614313565b3d156143bd573d906143a4826134b2565b916143b26040519384613491565b82523d5f602084013e565b606090565b604051906143cf8261343f565b5f61010083606081528260208201528260408201528260608201528260808201528260a08201528260c0820152606060e08201520152565b1561440e57565b60405162461bcd60e51b815260206004820152601660248201527550726f7669646572206973206e6f742061637469766560501b6044820152606490fd5b81601f8201121561025e57805190614463826134b2565b926144716040519485613491565b8284526020838301011161025e57815f9260208093018386015e8301015290565b5190811515820361025e57565b60208183031261025e578051906001600160401b03821161025e5701906101208282031261025e57604051916144d48361343f565b80516001600160401b03811161025e57826144f091830161444c565b8352602081015160208401526040810151604084015261451260608201614492565b606084015261452360808201614492565b608084015260a081015160a084015260c081015160c084015260e08101516001600160401b03811161025e576101009261455e91830161444c565b60e084015201516001600160a01b038116810361025e5761010082015290565b61351e9061458a6143c2565b506020808251830101910161449f565b6001600160a01b031680156145f8575f5160206150c05f395f51905f5280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b631e4fbdf760e01b5f525f60045260245ffd5b92919092614617613bfb565b614620826138cd565b54808610801590614734575b614092578061463b8588613d51565b11614722575b61464a84613cc8565b82526146568487613d51565b1060208201525f915f906001955f54965b8781111580614719575b1561406c57805f526002602052614690600161403c8560405f206138e4565b6146a3575b61469e90613d6b565b614667565b948881101580614707575b6146c7575b6146bf61469e91613d6b565b959050614695565b926146bf6146fe61469e92885f526001602052614000818a613fe860405f20825f526002602052613fde613fc98c60405f206138e4565b949150506146b3565b50614712878a613d51565b81106146ae565b50868410614671565b925061472e8584613d5e565b92614641565b50831561462c565b1561474357565b60405162461bcd60e51b815260206004820152602c60248201527f4f6e6c7920736572766963652070726f76696465722063616e2063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608490fd5b929161351e94926147b96147d693608087526080870190613690565b6001600160a01b03909216602086015284820360408601526139d2565b9160608184039101526139d2565b156147eb57565b60405162461bcd60e51b815260206004820152602860248201527f50726f6475637420646f6573206e6f7420657869737420666f72207468697320604482015267383937bb34b232b960c11b6064820152608490fd5b8054821015613ebd575f5260205f2001905f90565b9060405180925f9080549061486a826138fa565b91600181169081156148c3575060011461488d575b505060209281520301902090565b9091505f5260205f205f905b8282106148ac575050810160205f61487f565b805482870152859350602090910190600101614899565b60ff191685525050801515028201905060205f61487f565b6148e581546138fa565b90816148ef575050565b81601f5f9311600114614900575055565b8183526020832061491c91601f0160051c8101906001016142ac565b8082528160208120915555565b906001811015611b605760ff80198354169116179055565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630811490811561497d575b506125a657565b5f5160206151005f395f51905f52546001600160a01b0316141590505f614976565b5f5160206150c05f395f51905f52546001600160a01b031633036149bf57565b63118cdaa760e01b5f523360045260245ffd5b8015610684575f190190565b9093919492946149ee8186614d9f565b6149f88387614e4f565b60405190614a0582613476565b614a0f8683613df2565b6020820190815260408201878152606083019160018352845f526002602052614a3b8860405f206138e4565b93516001811015611b6057614a509085614929565b51805160018501916001600160401b0382116105ce57614a74826104a185546138fa565b602090601f8311600114614d3c57614aa292915f918361100d5750508160011b915f199060031b1c19161790565b90555b5180516002840191600160401b82116105ce578254828455808310614d0f575b50602001915f5260205f20915f905b828210614c405750505050906003614afc9251151591019060ff801983541691151516179055565b5f526004602052614b108360405f206138e4565b915f5b8551811015614c0f57614b268184613ea9565b51602080614b34848a613ea9565b51604051928184925191829101835e810188815203019020908051906001600160401b0382116105ce57614b6c826104a185546138fa565b602090601f8311600114614ba8579180614b9f9260019695945f9261100d5750508160011b915f199060031b1c19161790565b90555b01614b13565b90601f19831691845f52815f20925f5b818110614bf7575091600196959492918388959310614bdf575b505050811b019055614ba2565b01515f1960f88460031b161c191690555f8080614bd2565b92936020600181928786015181550195019301614bb8565b5093505050614c3290614c21816138cd565b614c2b8154613d6b565b90556138b6565b614c3c8154613d6b565b9055565b80518051906001600160401b0382116105ce57614c6182611a0788546138fa565b602090601f8311600114614ca65792614c97836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b01940191019092614ad4565b90601f19831691875f52815f20925f5b818110614cf75750936020936001969387969383889510614cdf575b505050811b018755614c9a565b01515f1960f88460031b161c191690555f8080614cd2565b92936020600181928786015181550195019301614cb6565b835f528260205f2091820191015b818110614d2a5750614ac5565b80614d366001926148db565b01614d1d565b90601f19831691845f52815f20925f5b818110614d875750908460019594939210614d6f575b505050811b019055614aa5565b01515f1960f88460031b161c191690555f8080614d62565b92936020600181928786015181550195019301614d4c565b6001811015611b6057614e0a5780602080614dbf9351830101910161449f565b80515115613154576101008151511161311857602081018051156130c557604082015190511161306f5760c0810151156130185760e00180515115612fd357608090515111612f9a57565b60405162461bcd60e51b815260206004820152601860248201527f556e737570706f727465642070726f64756374207479706500000000000000006044820152606490fd5b8051825103614fbc57600a815111614f7f575f5b8151811015614f7a57614e768183613ea9565b515115614f35576020614e898284613ea9565b515111614ef0576080614e9c8285613ea9565b515111614eab57600101614e63565b60405162461bcd60e51b815260206004820152601960248201527f4361706162696c6974792076616c756520746f6f206c6f6e67000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f4361706162696c697479206b657920746f6f206c6f6e670000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f4361706162696c697479206b65792063616e6e6f7420626520656d70747900006044820152606490fd5b505050565b60405162461bcd60e51b8152602060048201526015602482015274546f6f206d616e79206361706162696c697469657360581b6044820152606490fd5b60405162461bcd60e51b815260206004820152602c60248201527f4b65797320616e642076616c75657320617272617973206d757374206861766560448201526b040e6c2daca40d8cadccee8d60a31b6064820152608490fd5b60ff5f5160206151205f395f51905f525460401c161561503257565b631afcd79f60e31b5f5260045ffd5b90615065575080511561505657602081519101fd5b63d6bda27560e01b5f5260045ffd5b81511580615096575b615076575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561506e56fea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a264697066735822122071a54ea79f0e6c1c8b857225dc7d3b55847595ea2f126934b557dbf2437ea48064736f6c634300081e0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00","sourceMap":"714:32647:85:-:0;;;;;;;1171:4:25;1163:13;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;;7894:76:24;;-1:-1:-1;;;;;;;;;;;714:32647:85;;7983:34:24;7979:146;;-1:-1:-1;714:32647:85;;;;;;;;1163:13:25;714:32647:85;;;;;;;;;;;7979:146:24;-1:-1:-1;;;;;;714:32647:85;-1:-1:-1;;;;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;8085:29:24;;714:32647:85;;8085:29:24;7979:146;;;;7894:76;7936:23;;;-1:-1:-1;7936:23:24;;-1:-1:-1;7936:23:24;714:32647:85;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806302ff8437146131c65780630a6a63f1146131a45780630b5c012514612a485780631e35bdde14612983578063213c63b1146129695780632335bde01461291d5780632f67c065146128db5780634368bafb1461285857806346ce41751461283c5780634f1ef286146126c357806350f3fc811461261357806351ca236f146125b557806352d1902d1461254f5780635c42d079146124c957806364b4f751146124a75780636bf6d74f146124385780636e36e9741461241d578063715018a6146123b65780637f6575671461239c5780638129fc1c14611eff57806382ee4b3414611eb057806383df54a514611e3f57806384b0196e14611b9c5780638bdc774714611b745780638c9a7b561461165f5780638da5cb5b1461162b57806393ecb91e146102d0578063a643324014611430578063a9d239b6146112a1578063aca0988f14611201578063ad3cb1cc146111ba578063b47be8ab14610b85578063b6363b9914610992578063c439fd57146108ac578063c9c5b5b41461070a578063cde24beb14610698578063d1329d4e1461065c578063d1c21b5b146103a3578063dcea1c6f14610388578063deb0e46214610339578063e459382f14610308578063e835440e146102d0578063f08bbda0146102b3578063f2fde38b14610288578063fc260f7b146102625763ffa1ad7414610213575f80fd5b3461025e575f36600319011261025e5761025a604051610234604082613491565b6005815264302e302e3160d81b6020820152604051918291602083526020830190613690565b0390f35b5f80fd5b3461025e5761025a61027c610276366136b4565b9161460b565b60405191829182613749565b3461025e57602036600319011261025e576102b16102a461386d565b6102ac61499f565b61459a565b005b3461025e575f36600319011261025e576020600754604051908152f35b3461025e57602036600319011261025e576001600160a01b036102f161386d565b165f526003602052602060405f2054604051908152f35b3461025e57602036600319011261025e57600435600181101561025e576103306020916138cd565b54604051908152f35b3461025e57602036600319011261025e576004356001600160401b03811161025e5761037461036f61025a923690600401613503565b61457e565b604051918291602083526020830190613a2a565b3461025e575f36600319011261025e57602060405160808152f35b3461025e57604036600319011261025e576004356001600160401b03811161025e576103d3903690600401613347565b6024356001600160401b03811161025e576103f2903690600401613347565b9092335f52600360205260405f20549283151561040e81613b09565b80610651575b61041d90613b55565b5f8481526001602052604090205461043f906001600160a01b03161515613ba1565b835f52600160205261045a60ff600460405f20015416614407565b610467608082111561422d565b610475610100841115614269565b835f526001602052600260405f2001916001600160401b0382116105ce576104a7826104a185546138fa565b856142c2565b5f90601f83116001146105ed576104d592915f91836105e2575b50508160011b915f199060031b1c19161790565b90555b815f526001602052600360405f2001906001600160401b0381116105ce5761050a8161050484546138fa565b846142c2565b5f601f821160011461056c5781906105389394955f926105615750508160011b915f199060031b1c19161790565b90555b7fae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f765f80a2005b0135905085806104c1565b601f19821694835f5260205f20915f5b8781106105b657508360019596971061059d575b505050811b01905561053b565b01355f19600384901b60f8161c19169055848080610590565b9092602060018192868601358155019401910161057c565b634e487b7160e01b5f52604160045260245ffd5b0135905087806104c1565b601f19831691845f5260205f20925f5b8181106106395750908460019594939210610620575b505050811b0190556104d8565b01355f19600384901b60f8161c19169055868080610613565b919360206001819287870135815501950192016105fd565b505f54841115610414565b3461025e575f36600319011261025e575f546001810180911161068457602090604051908152f35b634e487b7160e01b5f52601160045260245ffd5b3461025e57602060ff60036106f26106af366139b3565b90801515806106ff575b6106c290613b55565b5f8181526001875260409020546106e3906001600160a01b03161515613ba1565b5f526002855260405f206138e4565b0154166040519015158152f35b505f548111156106b9565b3461025e57602036600319011261025e576004356001600160401b03811161025e5761073a903690600401613503565b610742614941565b5f5160206151205f395f51905f525460ff8160401c16908115610897575b506108885760026001600160401b03195f5160206151205f395f51905f525416175f5160206151205f395f51905f525560ff60401b195f5160206151205f395f51905f52541690303303610843576107fe7f2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c39160018060a01b035f5160206151005f395f51905f525416604051928392604084526040840190613690565b9060208301520390a15f5160206151205f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160028152a1005b60405162461bcd60e51b815260206004820152601a60248201527f4f6e6c792073656c662063616e2063616c6c206d6967726174650000000000006044820152606490fd5b63f92ee8a960e01b5f5260045ffd5b600291506001600160401b0316101582610760565b3461025e57602036600319011261025e576109476004356108cb6143c2565b81151580610987575b6108dd90613b55565b5f828152600160205260409020546108ff906001600160a01b03161515613ba1565b9060605f915f52600260205260405f205f805260205261092160405f20613dfe565b60208101518051610961575b505061095590604051948594606086526060860190613a2a565b9084820360208601526139d2565b90151560408301520390f35b9150925061096f915061457e565b9061095560606040830151920151151591908561092d565b505f548211156108d4565b3461025e575f36600319011261025e57335f52600360205260405f20548015156109bb81613b09565b80610b7a575b6109ca90613b55565b5f818152600160205260409020546109ec906001600160a01b03161515613ba1565b805f526001602052610a0760ff600460405f20015416614407565b5f81815260016020526040902054610a29906001600160a01b0316331461473c565b805f526001602052600460405f200160ff198154169055610a4b6007546149d2565b600755805f52600260205260405f205f8052602052610a70600160405f2001546138fa565b610abd575b805f52600160205260018060a01b0360405f2054165f5260036020525f60408120557f452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc45f80a2005b805f52600260205260405f205f805260205260405f206003810160ff815416610b3f575b90825f52600460205260405f205f805260205260405f209260025f9201915b8254811015610b2e5780610b28610b2387610b1d60019588614841565b50614856565b6148db565b01610b00565b5092505060ff198154169055610a75565b5f805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f88054610b73906149d2565b9055610ae1565b505f548111156109c1565b60e036600319011261025e57610b9961386d565b6024356001600160401b03811161025e57610bb8903690600401613347565b6044929192356001600160401b03811161025e57610bda903690600401613347565b93909160643591600183101561025e576084356001600160401b03811161025e57610c09903690600401613347565b929060a4356001600160401b03811161025e57610c2a903690600401613374565b909760c4356001600160401b03811161025e57610c4b903690600401613374565b949095610c588915613aab565b6001600160a01b0383161561117557335f52600360205260405f205461113057674563918244f4000034036110f457610c94608083111561422d565b610ca26101008d1115614269565b5f54610cad90613d6b565b998a5f556040519c8d92610cc084613424565b3384526001600160a01b0386166020850190815294610ce1913691906134cd565b926040019283523690610cf3926134cd565b60608d01908152600160808e0181905260a08e018c90525f8c81526020829052604090208e5181546001600160a01b03199081166001600160a01b03928316178355955192820180549096169216919091179093559051805160028401916001600160401b0382116105ce57610d6d826104a185546138fa565b602090601f831160011461109157610d9b92915f918361100d5750508160011b915f199060031b1c19161790565b90555b519a8b519b6001600160401b038d116105ce578c90610dcd82610dc460038701546138fa565b600387016142c2565b601f602092116001146110185791610e058e8d9e9f60a0949d9e9d6005965f9261100d5750508160011b915f199060031b1c19161790565b60038501555b610e2a60808201511515600486019060ff801983541691151516179055565b0151910155335f5260036020528660405f2055610e48600754613d6b565b6007556001600160a01b031633877faff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a55f80a4610ea6610e883687856134cd565b610e9336848d61360a565b610e9e36878961360a565b918a8a6149de565b6020988992604051610eb88582613491565b5f8152968915610f9f575b505092610f2e610f3c93610f1d96937f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af71798968a5f526001835260018060a01b0360405f205416604051998a9960808b5260808b0190613690565b9389015287830360408901526142fc565b9184830360608601526142fc565b0390a35f808080674563918244f40000606360ff60981b015af1610f5e614393565b5015610f6c57604051908152f35b60405162461bcd60e51b815260048101839052600b60248201526a109d5c9b8819985a5b195960aa1b6044820152606490fd5b929597509250929450810194888287031261025e578135946001600160401b03861161025e57610f2e8a610f1d96610ffe8c9a7f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af7179a610f3c980161352e565b51985093965093949194610ec3565b015190505f806104c1565b908d91600385015f52815f20925f905b601f1916811061107857508e8d9e9f93600595939d9e9d60019360a096601f19811610611060575b505050811b016003850155610e0b565b01515f1960f88460031b161c191690555f8080611050565b818301518455600190930192602092830192018f611028565b90601f19831691845f52815f20925f5b8181106110dc57509084600195949392106110c4575b505050811b019055610d9e565b01515f1960f88460031b161c191690558f80806110b7565b929360206001819287860151815501950193016110a1565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0819995948185b5bdd5b9d60621b6044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920726567697374657265640000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f50617965652063616e6e6f74206265207a65726f2061646472657373000000006044820152606490fd5b3461025e575f36600319011261025e5761025a6040516111db604082613491565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613690565b3461025e5761094761126261125d611218366139b3565b9080151580611296575b61122b90613b55565b5f8181526001602052604090205461124d906001600160a01b03161515613ba1565b5f52600260205260405f206138e4565b613dfe565b60208101519061128c60606040830151920151151591604051948594606086526060860190613690565b9060408301520390f35b505f54811115611222565b3461025e57602036600319011261025e57600435600181101561025e576112c88115613aab565b335f52600360205260405f20548015156112e181613b09565b80611425575b6112f090613b55565b5f81815260016020526040902054611312906001600160a01b03161515613ba1565b805f52600160205261132d60ff600460405f20015416614407565b5f8181526001602052604090205461134f906001600160a01b0316331461473c565b805f52600260205261137360ff600361136b8560405f206138e4565b0154166147e4565b805f5260026020526113888260405f206138e4565b815f52600460205261139d8360405f206138e4565b9260025f9201915b82548110156113c857806113c2610b2387610b1d60019588614841565b016113a5565b5082805f52600260205260036113e18360405f206138e4565b01805460ff191690556113f3826138b6565b6113fd81546149d2565b90557f4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d5f80a3005b505f548111156112e7565b3461025e57606036600319011261025e57600435602435600181101561025e576044356001600160401b03811161025e5761146f903690600401613374565b9083151580611620575b61148590939293613b55565b5f848152600160205260409020546114a7906001600160a01b03161515613ba1565b6114b0836135f3565b916114be6040519384613491565b8383526114ca846135f3565b602084019190601f19013683376114e0856135f3565b956114ee6040519788613491565b858752601f196114fd876135f3565b015f5b81811061160d5750509061151e915f52600460205260405f206138e4565b9136819003601e1901915f5b868110156115be578060051b8301358481121561025e578301908135916001600160401b03831161025e5760200191803603831361025e576115886115758861158193600196613be2565b60405192838092613932565b0382613491565b8051611596575b500161152a565b826115a1838a613ea9565b526115ac828b613ea9565b526115b7818a613ea9565b508961158f565b50848760405191604083019060408452518091526060830193905f5b8181106115f557848061025a888783820360208501526139d2565b825115158652602095860195909201916001016115da565b60606020828b0181019190915201611500565b505f54841115611479565b3461025e575f36600319011261025e575f5160206150c05f395f51905f52546040516001600160a01b039091168152602090f35b3461025e5761166d366133a4565b9293906001871015611b60576116c1906116b988159661168c88613aab565b335f5260036020526116b160405f2054998a1515966116aa88613b09565b36916134cd565b95369161360a565b94369161360a565b9080611b55575b6116d490969596613b55565b5f868152600160205260409020546116f6906001600160a01b03161515613ba1565b855f52600160205261171160ff600460405f20015416614407565b5f86815260016020526040902054611733906001600160a01b0316331461473c565b855f5260026020526117488560405f206138e4565b94600386019661175b60ff8954166147e4565b6117658483614d9f565b61176f8386614e4f565b805f5260046020526117848260405f206138e4565b955f9860028901995b8a548110156117b157806117ab610b238b610b1d8f95600196614841565b0161178d565b508960018a999798996117c48782614929565b0188516001600160401b0381116105ce576117e38161050484546138fa565b6020601f8211600114611af3579080611810925f91611ae8575b508160011b915f199060031b1c19161790565b90555b8851600160401b81116105ce578154818355808210611abb575b5060208a01915f5260205f20915f905b8282106119e65750505050600160ff198254161790555f5b875181101561195c576118688186613ea9565b51602080611876848c613ea9565b51604051928184925191829101835e81018a815203019020908051906001600160401b0382116105ce576118ae826104a185546138fa565b602090601f83116001146118f55791806118e19260019695945f926118ea5750508160011b915f199060031b1c19161790565b90555b01611855565b015190508d806104c1565b90601f19831691845f52815f20925f5b81811061194457509160019695949291838895931061192c575b505050811b0190556118e4565b01515f1960f88460031b161c191690558c808061191f565b92936020600181928786015181550195019301611905565b50867fc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6918588604051611990602082613491565b5f8152926119c5575b506119c090855f52600160205260018060a01b0360405f205416936040519485948561479d565b0390a3005b6119c0919250806020806119de9351830101910161449f565b519190611999565b80518051906001600160401b0382116105ce57611a0d82611a0788546138fa565b886142c2565b602090601f8311600114611a525792611a43836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b0194019101909261183d565b90601f19831691875f52815f20925f5b818110611aa35750936020936001969387969383889510611a8b575b505050811b018755611a46565b01515f1960f88460031b161c191690555f8080611a7e565b92936020600181928786015181550195019301611a62565b825f528160205f2091820191015b818110611ad6575061182d565b80611ae26001926148db565b01611ac9565b90508b01518d6117fd565b601f19821690835f52805f20915f5b8d828210611b3d5750509083600194939210611b25575b5050811b019055611813565b8c01515f1960f88460031b161c191690558c80611b19565b60018495602093958493015181550194019201611b02565b505f548511156116c8565b634e487b7160e01b5f52602160045260245ffd5b3461025e57602036600319011261025e57600435600181101561025e576103306020916138b6565b3461025e575f36600319011261025e577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580611e16575b15611dd9576040515f5160206150a05f395f51905f5254815f611bf7836138fa565b8083529260018116908115611dba5750600114611d4f575b611c1b92500382613491565b604051905f5f5160206150e05f395f51905f5254611c38816138fa565b8085529060018116908115611d2d5750600114611cc9575b5082611c64611c9b9461025a930382613491565b611ca960405191611c76602084613491565b5f83525f368137604051958695600f60f81b875260e0602088015260e0870190613690565b908582036040870152613690565b904660608501523060808501525f60a085015283820360c0850152613883565b5f5160206150e05f395f51905f525f90815291507f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b818310611d13575050820160200182611c50565b600181602092949394548385890101520191019190611cff565b60ff191660208087019190915291151560051b85019091019150839050611c50565b505f5160206150a05f395f51905f525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b818310611d9e575050906020611c1b92820101611c0f565b6020919350806001915483858801015201910190918392611d86565b60209250611c1b94915060ff191682840152151560051b820101611c0f565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415611bd5565b3461025e57602036600319011261025e5760043580151580611ea5575b611e6590613b55565b5f81815260016020526040902054611e87906001600160a01b03161515613ba1565b5f526001602052602060ff600460405f200154166040519015158152f35b505f54811115611e5c565b3461025e57602036600319011261025e576004356001600160401b03811161025e57611eeb611ee661025a92369060040161352e565b614202565b604051918291602083526020830190613690565b3461025e575f36600319011261025e575f5160206151205f395f51905f52546001600160401b0360ff8260401c1615911680159081612394575b600114908161238a575b159081612381575b50610888578060016001600160401b03195f5160206151205f395f51905f525416175f5160206151205f395f51905f5255612351575b611f89615016565b611f91615016565b611f9a3361459a565b611fa2615016565b604090815191611fb28184613491565b601783527f5365727669636550726f766964657252656769737472790000000000000000006020840152805191611fe98284613491565b60018352603160f81b6020840152611fff615016565b612007615016565b83516001600160401b0381116105ce5761202e5f5160206150a05f395f51905f52546138fa565b601f81116122f7575b50602094601f821160011461227c576120699293949582915f926122715750508160011b915f199060031b1c19161790565b5f5160206150a05f395f51905f52555b82516001600160401b0381116105ce576120a05f5160206150e05f395f51905f52546138fa565b601f811161220c575b506020601f82116001146121915781906120d99394955f926121865750508160011b915f199060031b1c19161790565b5f5160206150e05f395f51905f52555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015561213557005b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29160ff60401b195f5160206151205f395f51905f5254165f5160206151205f395f51905f52555160018152a1005b0151905085806104c1565b601f198216905f5160206150e05f395f51905f525f52805f20915f5b8181106121f4575095836001959697106121dc575b505050811b015f5160206150e05f395f51905f52556120e9565b01515f1960f88460031b161c191690558480806121c2565b9192602060018192868b0151815501940192016121ad565b5f5160206150e05f395f51905f525f52612261907f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510612267575b601f0160051c01906142ac565b846120a9565b9091508190612254565b0151905086806104c1565b601f198216955f5160206150a05f395f51905f525f52805f20915f5b8881106122df575083600195969798106122c7575b505050811b015f5160206150a05f395f51905f5255612079565b01515f1960f88460031b161c191690558580806122ad565b91926020600181928685015181550194019201612298565b5f5160206150a05f395f51905f525f5261234b907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c8101916020851061226757601f0160051c01906142ac565b85612037565b600160401b60ff60401b195f5160206151205f395f51905f525416175f5160206151205f395f51905f5255611f81565b90501582611f4b565b303b159150611f43565b829150611f39565b3461025e575f36600319011261025e576020604051818152f35b3461025e575f36600319011261025e576123ce61499f565b5f5160206150c05f395f51905f5280546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461025e575f36600319011261025e576020604051600a8152f35b3461025e5761249661245d61244c366139b3565b905f52600260205260405f206138e4565b60ff8154169061095560ff6003604051936124868561247f8160018501613932565b0386613491565b015416916040519485809561373c565b606060208501526060840190613690565b3461025e575f36600319011261025e576020604051674563918244f400008152f35b3461025e57602036600319011261025e576004356124e5613c24565b5080151580612544575b6124f890613b55565b5f8181526001602052604090205461251a906001600160a01b03161515613ba1565b5f52600160205261025a61253060405f20613d79565b6040519182916020835260208301906136d7565b505f548111156124ef565b3461025e575f36600319011261025e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036125a65760206040515f5160206151005f395f51905f528152f35b63703e46dd60e11b5f5260045ffd5b3461025e57602036600319011261025e576001600160a01b036125d661386d565b165f52600360205260405f2054801515806125f9575b6020906040519015158152f35b505f526001602052602060ff600460405f200154166125ec565b3461025e57602036600319011261025e576004355f52600160205260405f2060018060a01b0381541660018060a01b036001830154169160405161265e816115818160028601613932565b6126b2604051612675816115818160038801613932565b6126a4600560ff600487015416950154936040519788978852602088015260c0604088015260c0870190613690565b908582036060870152613690565b911515608084015260a08301520390f35b604036600319011261025e576126d761386d565b6024356001600160401b03811161025e576126f6903690600401613503565b6126fe614941565b61270661499f565b6040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f9181612808575b506127485783634c9c8ce360e01b5f5260045260245ffd5b805f5160206151005f395f51905f528592036127f65750813b156127e4575f5160206151005f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156127cc575f808360206102b195519101845af46127c6614393565b91615041565b5050346127d557005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011612834575b8161282460209383613491565b8101031261025e57519085612730565b3d9150612817565b3461025e575f36600319011261025e5760205f54604051908152f35b3461025e57606036600319011261025e57602435600181101561025e57604435906001600160401b03821161025e57611eeb602080611581936128b86128a561025a973690600401613503565b916004355f526004845260405f206138e4565b604051938285935191829101845e82019081520301902060405192838092613932565b3461025e57604036600319011261025e576129116128fd6024356004356140b3565b604051928392604084526040840190613883565b90151560208301520390f35b3461025e57602036600319011261025e5761293661386d565b61293e613c24565b5060018060a01b03165f52600360205260405f20545f52600160205261025a61253060405f20613d79565b3461025e5761025a61027c61297d366136b4565b91613ed1565b3461025e57606036600319011261025e57600435602435600181101561025e576044356001600160401b03811161025e5761158192612a1d92612a176129d0611575943690600401613347565b92909380151580612a3d575b6129e590613b55565b5f81815260016020526040902054612a07906001600160a01b03161515613ba1565b5f52600460205260405f206138e4565b91613be2565b8051151561025a6040519283928352604060208401526040830190613690565b505f548111156129dc565b3461025e57606036600319011261025e576004356001600160401b03811161025e57612a7890369060040161352e565b6024356001600160401b03811161025e57612a97903690600401613675565b6044356001600160401b03811161025e57612ab6903690600401613675565b90335f52600360205260405f205490612ad582151594611ee686613b09565b9380613199575b612ae590613b55565b5f82815260016020526040902054612b07906001600160a01b03161515613ba1565b815f526001602052612b2260ff600460405f20015416614407565b5f82815260016020526040902054612b44906001600160a01b0316331461473c565b815f52600260205260405f205f805260205260405f20936003850193612b6d60ff8654166147e4565b815193612b826020808501968501018661449f565b80515115613154576101008151511161311857602081018051156130c557604082015190511161306f5760c0810151156130185760e00180515115612fd357608090515111612f9a57612bd88285989798614e4f565b805f52600460205260405f205f805260205260405f20945f9760028801985b8954811015612c1a5780612c14610b238a610b1d6001958f614841565b01612bf7565b50886001899896979860ff1981541681550187516001600160401b0381116105ce57612c4a8161050484546138fa565b6020601f8211600114612f38579080612c76925f91612f2d57508160011b915f199060031b1c19161790565b90555b8751600160401b81116105ce578154818355808210612f00575b5060208901915f5260205f20915f905b828210612e315750505050600160ff198254161790555f5b8651811015612dc257612cce8185613ea9565b51602080612cdc848b613ea9565b51604051928184925191829101835e810189815203019020908051906001600160401b0382116105ce57612d14826104a185546138fa565b602090601f8311600114612d5b579180612d479260019695945f92612d505750508160011b915f199060031b1c19161790565b90555b01612cbb565b015190508c806104c1565b90601f19831691845f52815f20925f5b818110612daa575091600196959492918388959310612d92575b505050811b019055612d4a565b01515f1960f88460031b161c191690558b8080612d85565b92936020600181928786015181550195019301612d6b565b50855f936119c0612e0a7fc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed69460208a89604051612dff8482613491565b52805101019061449f565b51858752600160205260408088205490519485949290916001600160a01b0316908561479d565b80518051906001600160401b0382116105ce57612e5282611a0788546138fa565b602090601f8311600114612e975792612e88836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b01940191019092612ca3565b90601f19831691875f52815f20925f5b818110612ee85750936020936001969387969383889510612ed0575b505050811b018755612e8b565b01515f1960f88460031b161c191690555f8080612ec3565b92936020600181928786015181550195019301612ea7565b825f528160205f2091820191015b818110612f1b5750612c93565b80612f276001926148db565b01612f0e565b90508a01518c6117fd565b601f19821690835f52805f20915f5b8c828210612f825750509083600194939210612f6a575b5050811b019055612c79565b8b01515f1960f88460031b161c191690558b80612f5e565b60018495602093958493015181550194019201612f47565b60405162461bcd60e51b81526020600482015260116024820152704c6f636174696f6e20746f6f206c6f6e6760781b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f4c6f636174696f6e2063616e6e6f7420626520656d70747900000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152602960248201527f4d696e2070726f76696e6720706572696f64206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602860248201527f4d61782070696563652073697a65206d757374206265203e3d206d696e2070696044820152676563652073697a6560c01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f4d696e2070696563652073697a65206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526014602482015273536572766963652055524c20746f6f206c6f6e6760601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601b60248201527f536572766963652055524c2063616e6e6f7420626520656d70747900000000006044820152606490fd5b505f54821115612adc565b3461025e575f36600319011261025e57604051606360ff60981b018152602090f35b3461025e576131d4366133a4565b929193906001871015611b605761321a906116b98815946131f486613aab565b335f52600360205261321260405f2054998a1515966116aa88613b09565b97369161360a565b908061333c575b61322a90613b55565b5f8581526001602052604090205461324c906001600160a01b03161515613ba1565b845f52600160205261326760ff600460405f20015416614407565b5f85815260016020526040902054613289906001600160a01b0316331461473c565b845f52600260205260ff60036132a28860405f206138e4565b0154166132e657836132d882857f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717978a8a6149de565b604051611990602082613491565b60405162461bcd60e51b815260206004820152602860248201527f50726f6475637420616c72656164792065786973747320666f72207468697320604482015267383937bb34b232b960c11b6064820152608490fd5b505f54851115613221565b9181601f8401121561025e578235916001600160401b03831161025e576020838186019501011161025e57565b9181601f8401121561025e578235916001600160401b03831161025e576020808501948460051b01011161025e57565b90608060031983011261025e57600435600181101561025e57916024356001600160401b03811161025e57816133dc91600401613347565b929092916044356001600160401b03811161025e57816133fe91600401613374565b92909291606435906001600160401b03821161025e5761342091600401613374565b9091565b60c081019081106001600160401b038211176105ce57604052565b61012081019081106001600160401b038211176105ce57604052565b606081019081106001600160401b038211176105ce57604052565b608081019081106001600160401b038211176105ce57604052565b90601f801991011681019081106001600160401b038211176105ce57604052565b6001600160401b0381116105ce57601f01601f191660200190565b9291926134d9826134b2565b916134e76040519384613491565b82948184528183011161025e578281602093845f960137010152565b9080601f8301121561025e5781602061351e933591016134cd565b90565b3590811515820361025e57565b91906101208382031261025e57604051906135488261343f565b819380356001600160401b03811161025e5782613566918301613503565b8352602081013560208401526040810135604084015261358860608201613521565b606084015261359960808201613521565b608084015260a081013560a084015260c081013560c084015260e08101356001600160401b03811161025e57610100926135d4918301613503565b60e08401520135906001600160a01b038216820361025e576101000152565b6001600160401b0381116105ce5760051b60200190565b929190613616816135f3565b936136246040519586613491565b602085838152019160051b81019183831161025e5781905b83821061364a575050505050565b81356001600160401b03811161025e5760209161366a8784938701613503565b81520191019061363c565b9080601f8301121561025e5781602061351e9335910161360a565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b606090600319011261025e57600435600181101561025e57906024359060443590565b9060018060a01b03825116815260018060a01b03602083015116602082015260a080613727613715604086015160c0604087015260c0860190613690565b60608601518582036060870152613690565b93608081015115156080850152015191015290565b906001821015611b605752565b6020815260608101918051926040602084015283518091526080830190602060808260051b8601019501915f905b828210613791575050505060206040910151151591015290565b90919295607f1986820301825286518051825260406137bf60208301516060602086015260608501906136d7565b9101519160408183039101526137d681835161373c565b6137ef6020830151608060208401526080830190613690565b916040810151928281036040840152835180825260208201906020808260051b8501019601925f5b8281106138425750505050606091820151151591909201525095602090810193926001019101613777565b9091929396602080613860600193601f198782030189528b51613690565b9901950193929101613817565b600435906001600160a01b038216820361025e57565b90602080835192838152019201905f5b8181106138a05750505090565b8251845260209384019390920191600101613893565b6001811015611b60575f52600660205260405f2090565b6001811015611b60575f52600560205260405f2090565b906001811015611b60575f5260205260405f2090565b90600182811c92168015613928575b602083101461391457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613909565b5f9291815491613941836138fa565b8083529260018116908115613996575060011461395d57505050565b5f9081526020812093945091925b83831061397c575060209250010190565b60018160209294939454838587010152019101919061396b565b915050602093945060ff929192191683830152151560051b010190565b604090600319011261025e5760043590602435600181101561025e5790565b9080602083519182815201916020808360051b8301019401925f915b8383106139fd57505050505090565b9091929394602080613a1b600193601f198682030187528951613690565b970193019301919392906139ee565b90610100613a98613a4684516101208552610120850190613690565b602085015160208501526040850151604085015260608501511515606085015260808501511515608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152613690565b928101516001600160a01b031691015290565b15613ab257565b60405162461bcd60e51b815260206004820152602960248201527f4f6e6c79205044502070726f6475637420747970652063757272656e746c79206044820152681cdd5c1c1bdc9d195960ba1b6064820152608490fd5b15613b1057565b60405162461bcd60e51b815260206004820152601760248201527f50726f7669646572206e6f7420726567697374657265640000000000000000006044820152606490fd5b15613b5c57565b60405162461bcd60e51b815260206004820152601760248201527f50726f766964657220646f6573206e6f742065786973740000000000000000006044820152606490fd5b15613ba857565b60405162461bcd60e51b8152602060048201526012602482015271141c9bdd9a59195c881b9bdd08199bdd5b9960721b6044820152606490fd5b6020919283604051948593843782019081520301902090565b60405190604082018281106001600160401b038211176105ce576040525f602083606081520152565b60405190613c3182613424565b5f60a083828152826020820152606060408201526060808201528260808201520152565b60405190613c64602083613491565b5f80835282815b828110613c7757505050565b602090604051613c868161345b565b5f8152613c91613c24565b83820152604051613ca181613476565b5f8152606084820152606060408201525f6060820152604082015282828501015201613c6b565b90613cd2826135f3565b613cdf6040519182613491565b8281528092613cf0601f19916135f3565b01905f5b828110613d0057505050565b602090604051613d0f8161345b565b5f8152613d1a613c24565b83820152604051613d2a81613476565b5f8152606084820152606060408201525f6060820152604082015282828501015201613cf4565b9190820180921161068457565b9190820391821161068457565b5f1981146106845760010190565b90604051613d8681613424565b82546001600160a01b03908116825260018401541660208201526040519092839160a091600591613dbe816115818160028601613932565b6040850152604051613dd7816115818160038601613932565b606085015260ff600482015416151560808501520154910152565b6001821015611b605752565b90604051613e0b81613476565b8092613e1b60ff82541683613df2565b604051613e2f816115818160018601613932565b6020830152600281018054613e43816135f3565b91613e516040519384613491565b81835260208301905f5260205f205f915b838310613e845750505050600360609260ff9260408601520154161515910152565b600160208192604051613e9b816115818189613932565b815201920192019190613e62565b8051821015613ebd5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b92919092613edd613bfb565b613ee6826138b6565b548086108015906140ab575b6140925780613f018588613d51565b11614080575b613f1084613cc8565b8252613f1c8487613d51565b1060208201525f915f906001955f54965b8781111580614077575b1561406c57805f52600160205260ff600460405f200154168061404a575b80614021575b613f6e575b613f6990613d6b565b613f2d565b94888110158061400f575b613f92575b613f8a613f6991613d6b565b959050613f60565b92613f8a614006613f6992885f526001602052614000818a613fe860405f20825f526002602052613fde613fc98c60405f206138e4565b9160405194613fd78661345b565b8552613d79565b6020840152613dfe565b60408201528a5190613ffa8383613ea9565b52613ea9565b50613d6b565b94915050613f7e565b5061401a878a613d51565b8110613f79565b50805f526002602052614043600161403c8560405f206138e4565b01546138fa565b1515613f5b565b50805f52600260205260ff60036140648560405f206138e4565b015416613f55565b509550505093505050565b50868410613f37565b925061408c8584613d5e565b92613f07565b5092935050506140a0613c55565b81525f602082015290565b508315613ef2565b91906007548084108015906141fa575b6141dc57806140d28386613d51565b116141ca575b6140e1826135f3565b936140ef6040519586613491565b828552601f196140fe846135f3565b0136602087013784916141118483613d51565b10905f925f926001965f54975b88811115806141c1575b156141b557805f52600160205260ff600460405f20015416614153575b61414e90613d6b565b61411e565b95898786831015806141a3575b61417b575b505061417361414e91613d6b565b969050614145565b9161414e9261419889614192614173959b91613d6b565b9a613ea9565b529150508987614165565b506141ae8a88613d51565b8310614160565b50955095509550505050565b50878610614128565b90506141d68382613d5e565b906140d8565b505090506040516141ee602082613491565b5f81525f368137905f90565b5081156140c3565b61351e61421f916040519283916020808401526040830190613a2a565b03601f198101835282613491565b1561423457565b60405162461bcd60e51b815260206004820152600d60248201526c4e616d6520746f6f206c6f6e6760981b6044820152606490fd5b1561427057565b60405162461bcd60e51b81526020600482015260146024820152734465736372697074696f6e20746f6f206c6f6e6760601b6044820152606490fd5b8181106142b7575050565b5f81556001016142ac565b9190601f81116142d157505050565b6142fa925f5260205f20906020601f840160051c8301931061226757601f0160051c01906142ac565b565b90602083828152019060208160051b85010193835f915b8383106143235750505050505090565b909192939495601f198282030186528635601e198436030181121561025e57830190602082359201916001600160401b03811161025e57803603831361025e576020828280600196849695859652848401375f828201840152601f01601f19160101980196019493019190614313565b3d156143bd573d906143a4826134b2565b916143b26040519384613491565b82523d5f602084013e565b606090565b604051906143cf8261343f565b5f61010083606081528260208201528260408201528260608201528260808201528260a08201528260c0820152606060e08201520152565b1561440e57565b60405162461bcd60e51b815260206004820152601660248201527550726f7669646572206973206e6f742061637469766560501b6044820152606490fd5b81601f8201121561025e57805190614463826134b2565b926144716040519485613491565b8284526020838301011161025e57815f9260208093018386015e8301015290565b5190811515820361025e57565b60208183031261025e578051906001600160401b03821161025e5701906101208282031261025e57604051916144d48361343f565b80516001600160401b03811161025e57826144f091830161444c565b8352602081015160208401526040810151604084015261451260608201614492565b606084015261452360808201614492565b608084015260a081015160a084015260c081015160c084015260e08101516001600160401b03811161025e576101009261455e91830161444c565b60e084015201516001600160a01b038116810361025e5761010082015290565b61351e9061458a6143c2565b506020808251830101910161449f565b6001600160a01b031680156145f8575f5160206150c05f395f51905f5280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b631e4fbdf760e01b5f525f60045260245ffd5b92919092614617613bfb565b614620826138cd565b54808610801590614734575b614092578061463b8588613d51565b11614722575b61464a84613cc8565b82526146568487613d51565b1060208201525f915f906001955f54965b8781111580614719575b1561406c57805f526002602052614690600161403c8560405f206138e4565b6146a3575b61469e90613d6b565b614667565b948881101580614707575b6146c7575b6146bf61469e91613d6b565b959050614695565b926146bf6146fe61469e92885f526001602052614000818a613fe860405f20825f526002602052613fde613fc98c60405f206138e4565b949150506146b3565b50614712878a613d51565b81106146ae565b50868410614671565b925061472e8584613d5e565b92614641565b50831561462c565b1561474357565b60405162461bcd60e51b815260206004820152602c60248201527f4f6e6c7920736572766963652070726f76696465722063616e2063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608490fd5b929161351e94926147b96147d693608087526080870190613690565b6001600160a01b03909216602086015284820360408601526139d2565b9160608184039101526139d2565b156147eb57565b60405162461bcd60e51b815260206004820152602860248201527f50726f6475637420646f6573206e6f7420657869737420666f72207468697320604482015267383937bb34b232b960c11b6064820152608490fd5b8054821015613ebd575f5260205f2001905f90565b9060405180925f9080549061486a826138fa565b91600181169081156148c3575060011461488d575b505060209281520301902090565b9091505f5260205f205f905b8282106148ac575050810160205f61487f565b805482870152859350602090910190600101614899565b60ff191685525050801515028201905060205f61487f565b6148e581546138fa565b90816148ef575050565b81601f5f9311600114614900575055565b8183526020832061491c91601f0160051c8101906001016142ac565b8082528160208120915555565b906001811015611b605760ff80198354169116179055565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630811490811561497d575b506125a657565b5f5160206151005f395f51905f52546001600160a01b0316141590505f614976565b5f5160206150c05f395f51905f52546001600160a01b031633036149bf57565b63118cdaa760e01b5f523360045260245ffd5b8015610684575f190190565b9093919492946149ee8186614d9f565b6149f88387614e4f565b60405190614a0582613476565b614a0f8683613df2565b6020820190815260408201878152606083019160018352845f526002602052614a3b8860405f206138e4565b93516001811015611b6057614a509085614929565b51805160018501916001600160401b0382116105ce57614a74826104a185546138fa565b602090601f8311600114614d3c57614aa292915f918361100d5750508160011b915f199060031b1c19161790565b90555b5180516002840191600160401b82116105ce578254828455808310614d0f575b50602001915f5260205f20915f905b828210614c405750505050906003614afc9251151591019060ff801983541691151516179055565b5f526004602052614b108360405f206138e4565b915f5b8551811015614c0f57614b268184613ea9565b51602080614b34848a613ea9565b51604051928184925191829101835e810188815203019020908051906001600160401b0382116105ce57614b6c826104a185546138fa565b602090601f8311600114614ba8579180614b9f9260019695945f9261100d5750508160011b915f199060031b1c19161790565b90555b01614b13565b90601f19831691845f52815f20925f5b818110614bf7575091600196959492918388959310614bdf575b505050811b019055614ba2565b01515f1960f88460031b161c191690555f8080614bd2565b92936020600181928786015181550195019301614bb8565b5093505050614c3290614c21816138cd565b614c2b8154613d6b565b90556138b6565b614c3c8154613d6b565b9055565b80518051906001600160401b0382116105ce57614c6182611a0788546138fa565b602090601f8311600114614ca65792614c97836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b01940191019092614ad4565b90601f19831691875f52815f20925f5b818110614cf75750936020936001969387969383889510614cdf575b505050811b018755614c9a565b01515f1960f88460031b161c191690555f8080614cd2565b92936020600181928786015181550195019301614cb6565b835f528260205f2091820191015b818110614d2a5750614ac5565b80614d366001926148db565b01614d1d565b90601f19831691845f52815f20925f5b818110614d875750908460019594939210614d6f575b505050811b019055614aa5565b01515f1960f88460031b161c191690555f8080614d62565b92936020600181928786015181550195019301614d4c565b6001811015611b6057614e0a5780602080614dbf9351830101910161449f565b80515115613154576101008151511161311857602081018051156130c557604082015190511161306f5760c0810151156130185760e00180515115612fd357608090515111612f9a57565b60405162461bcd60e51b815260206004820152601860248201527f556e737570706f727465642070726f64756374207479706500000000000000006044820152606490fd5b8051825103614fbc57600a815111614f7f575f5b8151811015614f7a57614e768183613ea9565b515115614f35576020614e898284613ea9565b515111614ef0576080614e9c8285613ea9565b515111614eab57600101614e63565b60405162461bcd60e51b815260206004820152601960248201527f4361706162696c6974792076616c756520746f6f206c6f6e67000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f4361706162696c697479206b657920746f6f206c6f6e670000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f4361706162696c697479206b65792063616e6e6f7420626520656d70747900006044820152606490fd5b505050565b60405162461bcd60e51b8152602060048201526015602482015274546f6f206d616e79206361706162696c697469657360581b6044820152606490fd5b60405162461bcd60e51b815260206004820152602c60248201527f4b65797320616e642076616c75657320617272617973206d757374206861766560448201526b040e6c2daca40d8cadccee8d60a31b6064820152608490fd5b60ff5f5160206151205f395f51905f525460401c161561503257565b631afcd79f60e31b5f5260045ffd5b90615065575080511561505657602081519101fd5b63d6bda27560e01b5f5260045ffd5b81511580615096575b615076575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561506e56fea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a264697066735822122071a54ea79f0e6c1c8b857225dc7d3b55847595ea2f126934b557dbf2437ea48064736f6c634300081e0033","sourceMap":"714:32647:85:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1408:2;714:32647;1408:2;;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;2357:1:23;714:32647:85;;:::i;:::-;2303:62:23;;:::i;:::-;2357:1;:::i;:::-;714:32647:85;;;;;;;-1:-1:-1;;714:32647:85;;;;;3722:34:86;714:32647:85;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;-1:-1:-1;;;;;714:32647:85;;:::i;:::-;;;;3050:81:86;714:32647:85;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;3429:81:86;714:32647:85;3429:81:86;;:::i;:::-;714:32647:85;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;1524:3;714:32647;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;16454:10;;;714:32647;;16434:19;714:32647;;;;;;16483:15;;;;16475:51;;;:::i;:::-;16544:44;;;714:32647;16536:80;;;:::i;:::-;714:32647;;;;16634:9;714:32647;;;;;;16626:82;;-1:-1:-1;;;;;714:32647:85;16634:51;;16626:82;:::i;:::-;714:32647;;;16634:9;714:32647;;16718:65;714:32647;;;;;16726:30;714:32647;;16718:65;:::i;:::-;16851:63;1524:3;16859:37;;;16851:63;:::i;:::-;16957:84;1193:3;16965:51;;;16957:84;:::i;:::-;714:32647;;;16634:9;714:32647;;17091:26;714:32647;;;17091:26;714:32647;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;;;;16634:9;714:32647;;16434:19;714:32647;;;17134:33;714:32647;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;17219:31;714:32647;17219:31;;714:32647;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;16634:9;714:32647;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16434:19:85;1193:3;;;;;714:32647;1193:3;;714:32647;;;;;;;;;;;16634:9;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:9;714:32647;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16434:19:85;1193:3;;;;;714:32647;1193:3;;714:32647;;;;;;;;;;;16634:9;714:32647;;;;;;;;;;;;;;;16544:44;-1:-1:-1;714:32647:85;;16562:26;;;16544:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;28124:1;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24910:50;:41;714:32647;;;:::i;:::-;3657:14;;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;24910:16;714:32647;;;;;24910:41;:::i;:::-;:50;714:32647;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;2624:62:25;;:::i;:::-;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;;6429:44:24;;;;;714:32647:85;6425:105:24;;;33196:1:85;-1:-1:-1;;;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;-1:-1:-1;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;33239:4;;33217:10;:27;714:32647;;;33290:62;714:32647;;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;;;;;;;;;;;:::i;:::-;;;;;;33290:62;;;-1:-1:-1;;;;;;;;;;;714:32647:85;6654:20:24;714:32647:85;;;33196:1;714:32647;;6654:20:24;714:32647:85;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;6425:105:24;4906:23;;;714:32647:85;6496:23:24;714:32647:85;;6496:23:24;6429:44;33196:1:85;714:32647;;-1:-1:-1;;;;;714:32647:85;6448:25:24;;6429:44;;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;:::i;:::-;3657:14;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;20292:519;714:32647;;;;;20542:16;714:32647;;;;;;;;;;;;;;;:::i;:::-;;20602:19;;;714:32647;;20598:207;;714:32647;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;20598:207;20662:38;;;;;;;;:::i;:::-;20731:22;714:32647;;;20731:22;;;20778:16;;714:32647;;;20598:207;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;17408:10;714:32647;;17388:19;714:32647;;;;;;17437:15;;;17429:51;;;:::i;:::-;3657:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;3747:9;714:32647;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;17408:10;3427:51;3419:108;:::i;:::-;714:32647;;;3747:9;714:32647;;;;;;17811:30;1854:42;1193:3;;;;;;17860:21;;714:32647;17860:21;:::i;:::-;;1193:3;714:32647;;;18012:16;714:32647;;;;;-1:-1:-1;714:32647:85;;;;;3747:9;714:32647;-1:-1:-1;714:32647:85;18012:57;714:32647;;:::i;:::-;18008:704;;714:32647;;;;3747:9;714:32647;;;;;;;;;;;;;;17388:19;714:32647;;;;;;1193:3;18858:27;714:32647;18858:27;;714:32647;18008:704;714:32647;;;18012:16;714:32647;;;;;-1:-1:-1;714:32647:85;;;;;-1:-1:-1;714:32647:85;17388:19;18253:16;;714:32647;;;;18249:104;;18008:704;714:32647;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;-1:-1:-1;714:32647:85;18530:13;18012:16;714:32647;18549:22;;18525:139;18580:3;714:32647;;18545:33;;;;;18623:25;18603:46;714:32647;18623:25;;3747:9;18623:25;;;:::i;:::-;714:32647;;:::i;:::-;18603:46;:::i;:::-;714:32647;18530:13;;18545:33;;;;;1854:42;1193:3;;;;;;18008:704;;18249:104;714:32647;;;18289:30;714:32647;;;;;18289:49;;;:::i;:::-;1193:3;;18249:104;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;-1:-1:-1;;714:32647:85;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;5582:84;5590:30;;5582:84;:::i;:::-;-1:-1:-1;;;;;714:32647:85;;5719:19;714:32647;;5860:10;714:32647;;5840:19;714:32647;;;;;;;;2018:4;5990:9;:29;714:32647;;6112:63;714:32647;6120:37;;;6112:63;:::i;:::-;6218:84;1193:3;6226:51;;;6218:84;:::i;:::-;714:32647;;6356:14;;;:::i;:::-;1193:3;;714:32647;1193:3;714:32647;;;;;;;;:::i;:::-;5860:10;714:32647;;-1:-1:-1;;;;;714:32647:85;;;6436:224;;714:32647;;;6436:224;1193:3;;714:32647;;;1193:3;:::i;:::-;6436:224;714:32647;6436:224;714:32647;;;;1193:3;;;;:::i;:::-;714:32647;6436:224;;714:32647;;;;;6436:224;;714:32647;;;;6436:224;;714:32647;;;-1:-1:-1;714:32647:85;;;;;;;;;;1193:3;;;;-1:-1:-1;;;;;;1193:3:85;;;-1:-1:-1;;;;;714:32647:85;;;1193:3;;;;;;;;;;;;;714:32647;;1193:3;;;;;;;714:32647;;;;1193:3;;;;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;714:32647;1193:3;;;;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;5840:19;1193:3;;;;:::i;:::-;5840:19;1193:3;;;:::i;:::-;;714:32647;1193:3;;;;;;;;;;;;714:32647;1193:3;;;;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;5840:19;1193:3;;;;;714:32647;6436:224;;714:32647;;;;1193:3;;;;;;;;;714:32647;;;1193:3;;;;;;6436:224;1193:3;;;;5860:10;714:32647;;5840:19;714:32647;;;;;;1193:3;6760:21;;714:32647;6760:21;:::i;:::-;;1193:3;-1:-1:-1;;;;;714:32647:85;5860:10;6841:49;;714:32647;;6841:49;6955:96;714:32647;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;6955:96;;;;:::i;:::-;714:32647;;;;;;;;;;:::i;:::-;;;;;5590:30;;7141:181;;1193:3;714:32647;;;1193:3;;714:32647;1193:3;714:32647;;7337:144;714:32647;;;;;;;;;;;;;;;;;;;;1193:3;;;714:32647;1193:3;;714:32647;1193:3;;;;:::i;:::-;;;;714:32647;1193:3;;;714:32647;1193:3;;;;:::i;:::-;;;;;714:32647;1193:3;;;;:::i;:::-;7337:144;;;714:32647;;;;2018:4;-1:-1:-1;;;;;7551:44:85;;;;:::i;:::-;;1193:3;;;714:32647;;;;;;1193:3;714:32647;;-1:-1:-1;;;1193:3:85;;714:32647;1193:3;;;;;;714:32647;1193:3;;714:32647;-1:-1:-1;;;714:32647:85;;;1193:3;714:32647;;1193:3;7141:181;7224:38;;;;;;;;;;;;714:32647;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;1193:3;714:32647;1193:3;714:32647;;;;7337:144;714:32647;1193:3;714:32647;;;:::i;:::-;7289:22;7141:181;;;;;;;;;;;1193:3;;;;-1:-1:-1;1193:3:85;;;;;;;;5840:19;1193:3;;714:32647;;;;;1193:3;714:32647;1193:3;;-1:-1:-1;;1193:3:85;;;;;714:32647;;;;;;1193:3;714:32647;;;;;;;;;;;1193:3;;;;;;;;;;;;5840:19;1193:3;;;;;;;;;;;;5840:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;;;;;714:32647;1193:3;;;;714:32647;1193:3;;;;;;;;;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;;714:32647;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;5840:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;;;;714:32647;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;19853:41;714:32647;;;:::i;:::-;3657:14;;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;19853:16;714:32647;;;;;19853:41;:::i;:::-;714:32647;:::i;:::-;;19912:19;;;19933:22;714:32647;;;19933:22;;;19957:16;;714:32647;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;13998:84;14006:30;;13998:84;:::i;:::-;14134:10;714:32647;;14114:19;714:32647;;;;;;14163:15;;;14155:51;;;:::i;:::-;3657:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;;;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;14134:10;3427:51;3419:108;:::i;:::-;714:32647;;;14572:16;714:32647;;14564:103;714:32647;14114:19;14572:41;714:32647;;;;14572:41;:::i;:::-;:50;714:32647;;14564:103;:::i;:::-;714:32647;;;14572:16;714:32647;;14754:41;714:32647;;;;14754:41;:::i;:::-;714:32647;;;;;;14854:44;714:32647;;;;14854:44;:::i;:::-;14913:13;14572:16;714:32647;14932:22;;14908:131;14963:3;714:32647;;14928:33;;;;;15002:25;14982:46;714:32647;15002:25;;714:32647;15002:25;;;:::i;14982:46::-;714:32647;14913:13;;14928:33;;;714:32647;;;14572:16;714:32647;;14114:19;15085:41;714:32647;;;;15085:41;:::i;:::-;:50;1193:3;;-1:-1:-1;;1193:3:85;;;15210:43;;;:::i;:::-;:45;714:32647;;15210:45;:::i;:::-;1193:3;;15293:39;714:32647;15293:39;;714:32647;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;3657:14;;;;:44;;;714:32647;3649:80;;;;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;714:32647:85;;;:::i;:::-;;;;;;;;;;;;28956:44;714:32647;;;;;;;;;28956:44;:::i;:::-;29016:13;714:32647;;;;-1:-1:-1;;714:32647:85;;;29048:3;29031:15;;;;;;714:32647;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;29124:113;;29048:3;;714:32647;29016:13;;29124:113;29171:16;;;;;:::i;:::-;714:32647;29205:17;;;;:::i;:::-;;;;;;:::i;:::-;;29124:113;;;29031:15;;;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;11545:30;714:32647;11545:30;;11537:84;;;;:::i;:::-;11673:10;714:32647;;11653:19;714:32647;;;;;;;11702:15;;;;11694:51;;;;:::i;:::-;714:32647;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;3657:44;;;;714:32647;3649:80;;;;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;;;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;11673:10;3427:51;3419:108;:::i;:::-;714:32647;;;12296:16;714:32647;;12296:41;714:32647;;;;12296:41;:::i;:::-;12388:16;11653:19;12388:16;;714:32647;12380:69;714:32647;;;;12380:69;:::i;:::-;12527:11;;;;:::i;:::-;12629:16;;;;:::i;:::-;714:32647;;;;;;12753:44;714:32647;;;;12753:44;:::i;:::-;12812:13;714:32647;12831:22;12296:16;12831:22;;12807:131;12862:3;714:32647;;12827:33;;;;;12901:25;12881:46;714:32647;12901:25;;;;714:32647;12901:25;;:::i;12881:46::-;714:32647;12812:13;;12827:33;;;714:32647;12827:33;;;;;12974;;;;:::i;:::-;13017:19;714:32647;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;;;;714:32647;1854:42;1193:3;;;;;;;714:32647;13240:3;714:32647;;13213:25;;;;;13293:19;;;;:::i;:::-;;714:32647;13272:17;;;;;:::i;:::-;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;;714:32647;1193:3;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;13198:13;;1193:3;;;;-1:-1:-1;1193:3:85;;;;;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;714:32647;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11653:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;;;;13213:25;;;13630:146;13213:25;;;714:32647;;;;;;:::i;:::-;;;;;13412:181;;13193:130;714:32647;13630:146;714:32647;;;;;;;;;;;;;;;;;;;;13630:146;;;;;:::i;:::-;;;;714:32647;13412:181;13630:146;714:32647;;;;;;13495:38;714:32647;;13495:38;;;;;;:::i;:::-;13560:22;13412:181;;;;714:32647;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;;;:::i;:::-;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;714:32647;1193:3;;714:32647;1193:3;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;;;;;;;;;1193:3;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;714:32647;1193:3;714:32647;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11653:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;;;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;;;;11653:19;1193:3;;714:32647;1193:3;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;3586:87:86;714:32647:85;3586:87:86;;:::i;714:32647:85:-;;;;;;-1:-1:-1;;714:32647:85;;;;2692:64:27;714:32647:85;5647:18:27;:43;;;714:32647:85;;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;5835:13:27;;714:32647:85;;;;5870:4:27;714:32647:85;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;-1:-1:-1;714:32647:85;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1193:3:85;;-1:-1:-1;714:32647:85;;;-1:-1:-1;;;;;;;;;;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;;714:32647;1193:3;;;1854:42;1193:3;714:32647;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;5647:43:27;714:32647:85;5669:16:27;714:32647:85;5669:21:27;5647:43;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;;;3657:14;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;;;;;;25984:30;714:32647;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;-1:-1:-1;;;;;714:32647:85;;;;;4301:16:24;714:32647:85;;4724:16:24;;:34;;;;714:32647:85;4803:1:24;4788:16;:50;;;;714:32647:85;4853:13:24;:30;;;;714:32647:85;4849:91:24;;;714:32647:85;4803:1:24;-1:-1:-1;;;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;4977:67:24;;714:32647:85;6891:76:24;;:::i;:::-;;;:::i;:::-;6959:1;4496:10:85;6959:1:24;:::i;:::-;6891:76;;:::i;:::-;714:32647:85;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;4803:1:24;714:32647:85;;-1:-1:-1;;;714:32647:85;;;;6891:76:24;;:::i;:::-;;;:::i;:::-;714:32647:85;;-1:-1:-1;;;;;1193:3:85;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;:::i;:::-;714:32647;1193:3;;;;714:32647;1193:3;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;;;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;714:32647;;-1:-1:-1;;;;;1193:3:85;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;:::i;:::-;714:32647;1193:3;;;;;;714:32647;;1193:3;;;714:32647;;;1193:3;;;;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;714:32647;2692:64:27;1193:3:85;714:32647;3788:16:27;1193:3:85;5064:101:24;;714:32647:85;5064:101:24;714:32647:85;5140:14:24;714:32647:85;-1:-1:-1;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;-1:-1:-1;;;;;;;;;;;714:32647:85;;4803:1:24;714:32647:85;;5140:14:24;714:32647:85;1193:3;;;;-1:-1:-1;1193:3:85;;;;;714:32647;;1193:3;;714:32647;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;1193:3;714:32647;1193:3;;;;;;;;;4803:1:24;1193:3:85;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;;;;;;;;;3676:10:27;1193:3:85;;714:32647;1193:3;;;;;;;;;;;;714:32647;4803:1:24;1193:3:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;1193:3;;714:32647;;1193:3;;;;;;;714:32647;1193:3;;;;;714:32647;1193:3;;;;;;:::i;:::-;;;;;;;-1:-1:-1;1193:3:85;;;;;;;;-1:-1:-1;1193:3:85;;;;;714:32647;;1193:3;;714:32647;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;1193:3;714:32647;1193:3;;;;;;;;4803:1:24;1193:3:85;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;;;;714:32647;4803:1:24;1193:3:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;1193:3;;714:32647;;1193:3;;;;;;;714:32647;1193:3;;;;714:32647;1193:3;;;;;;:::i;:::-;;;;4977:67:24;-1:-1:-1;;;;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;4977:67:24;;4853:30;4870:13;;;4853:30;;;4788:50;4816:4;4808:25;:30;;-1:-1:-1;4788:50:24;;4724:34;;;-1:-1:-1;4724:34:24;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;1408:2;714:32647;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;2303:62:23;;:::i;:::-;-1:-1:-1;;;;;;;;;;;714:32647:85;;-1:-1:-1;;;;;;1193:3:85;;;;;714:32647;;-1:-1:-1;;;;;714:32647:85;3975:40:23;714:32647:85;;3975:40:23;714:32647:85;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;1650:2;714:32647;;;;;;;;2892:105:86;714:32647:85;;;:::i;:::-;;;;2892:105:86;714:32647:85;;;;;2892:105:86;:::i;:::-;714:32647:85;;;;;;;2892:105:86;714:32647:85;;2892:105:86;714:32647:85;2892:105:86;714:32647:85;2892:105:86;;;;714:32647:85;:::i;:::-;;;;:::i;:::-;2892:105:86;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;2018:4;714:32647;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;:::i;:::-;;3657:14;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;3657:44::-;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;5090:6:25;-1:-1:-1;;;;;714:32647:85;5081:4:25;5073:23;5069:145;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;5069:145:25;5174:29;;;714:32647:85;5174:29:25;714:32647:85;;5174:29:25;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;-1:-1:-1;;;;;714:32647:85;;:::i;:::-;;;;27809:19;714:32647;;;;;;27855:15;;;:49;;;714:32647;;;;;;;;;;;27855:49;714:32647;;;27874:9;714:32647;;;;;;;;27874:30;714:32647;;27855:49;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;2736:67:86;;714:32647:85;;;;;;2736:67:86;714:32647:85;2736:67:86;;;;714:32647:85;:::i;:::-;;;;;2736:67:86;714:32647:85;2736:67:86;;;;714:32647:85;:::i;:::-;;2736:67:86;714:32647:85;;2736:67:86;;714:32647:85;;2736:67:86;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;2624:62:25;;:::i;:::-;2303::23;;:::i;:::-;714:32647:85;;-1:-1:-1;;;6131:52:25;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;6131:52:25;;714:32647:85;;6131:52:25;;;714:32647:85;-1:-1:-1;6127:437:25;;1805:47:35;;;;714:32647:85;6493:60:25;714:32647:85;;;;6493:60:25;6127:437;6225:40;-1:-1:-1;;;;;;;;;;;6225:40:25;;;6221:120;;1748:29:35;;;:34;1744:119;;-1:-1:-1;;;;;;;;;;;1193:3:85;;-1:-1:-1;;;;;;1193:3:85;;;;;2407:36:35;-1:-1:-1;;2407:36:35;714:32647:85;;2458:15:35;:11;;714:32647:85;4065:25:42;;714:32647:85;4107:55:42;4065:25;;;;;;;;;:::i;:::-;4107:55;;:::i;2454:148:35:-;6163:9;;;6159:70;;714:32647:85;6159:70:35;6199:19;;;714:32647:85;6199:19:35;714:32647:85;;6199:19:35;1744:119;1805:47;;;714:32647:85;1805:47:35;714:32647:85;;;;1805:47:35;6221:120:25;6292:34;;;714:32647:85;6292:34:25;714:32647:85;;;;6292:34:25;6131:52;;;;714:32647:85;6131:52:25;;714:32647:85;6131:52:25;;;;;;714:32647:85;6131:52:25;;;:::i;:::-;;;714:32647:85;;;;;6131:52:25;;;;;;;-1:-1:-1;6131:52:25;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;3202:137:86;714:32647:85;;;;;;;;:::i;:::-;;;;;;;;;;;;3202:137:86;:::i;:::-;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;25306:19;714:32647;;;;;;;;25359:9;714:32647;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;29870:44;714:32647;;;;;;;;:::i;:::-;3657:14;;;;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;;;29870:44;:::i;:::-;714:32647;;:::i;:::-;;;29938:23;;714:32647;;;;;;;;;;;;;;;;;;:::i;3657:44::-;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;15886:10;;714:32647;;15866:19;714:32647;;;;;;15915:15;15996:30;15915:15;;;15907:51;;;;:::i;15996:30::-;3657:44;;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;3747:9;714:32647;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;15886:10;3427:51;3419:108;:::i;:::-;714:32647;;;12296:16;714:32647;;;;;-1:-1:-1;714:32647:85;;;;;-1:-1:-1;714:32647:85;12388:16;15866:19;12388:16;;714:32647;12380:69;714:32647;;;;12380:69;:::i;:::-;714:32647;;30320:38;;714:32647;30320:38;;;;;;;;;:::i;:::-;30630:22;;714:32647;30624:40;714:32647;;1193:3;30720:22;;714:32647;30714:62;1077:3;;714:32647;30819:31;;1193:3;;30819:35;1077:3;;714:32647;30927:31;;1193:3;;;-1:-1:-1;1077:3:85;;31108:36;;;1193:3;31108:40;1077:3;;714:32647;31218:20;;;714:32647;31212:38;1077:3;;1524;31303:20;;714:32647;31297:57;1756:3;;12629:16;;;;;;;:::i;:::-;714:32647;;;;;;;;;-1:-1:-1;714:32647:85;;;;;-1:-1:-1;714:32647:85;12812:13;714:32647;12831:22;12296:16;12831:22;;12807:131;12862:3;714:32647;;12827:33;;;;;12901:25;12881:46;714:32647;12901:25;;3747:9;12901:25;;;:::i;12881:46::-;714:32647;12812:13;;12827:33;;;3747:9;12827:33;;;;;1854:42;1193:3;714:32647;;1193:3;714:32647;;13017:19;714:32647;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;;;;3747:9;1854:42;1193:3;;;;;;;714:32647;13240:3;714:32647;;13213:25;;;;;13293:19;;;;:::i;:::-;;714:32647;13272:17;;;;;:::i;:::-;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;;3747:9;1193:3;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;13198:13;;1193:3;;;;-1:-1:-1;1193:3:85;;;;;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;3747:9;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15866:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;3747:9;1193:3;;;;;;;;;;;;;;;13213:25;;;714:32647;13213:25;13630:146;13495:38;13630:146;13213:25;714:32647;13213:25;714:32647;;;;;;;:::i;:::-;;;;13495:38;;;;:::i;:::-;13560:22;714:32647;;;3747:9;714:32647;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;13630:146;:::i;714:32647::-;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;3747:9;1193:3;;714:32647;1193:3;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;;;;;;;;;1193:3;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;714:32647;1193:3;3747:9;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15866:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;3747:9;1193:3;;;;;;;;;;;;;;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;3747:9;714:32647;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3747:9;714:32647;;;;;;;;;;;;;;;;;;;;1193:3;;;;15866:19;1193:3;;714:32647;1193:3;;714:32647;;;;;;;3747:9;714:32647;;;;;;;;;;;;;;;;;;1756:3;714:32647;;-1:-1:-1;;;1756:3:85;;714:32647;;1756:3;;;;714:32647;1756:3;;714:32647;-1:-1:-1;;;714:32647:85;;;1756:3;;;;1077;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;1077:3;714:32647;;;1077:3;;;;;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;1077:3;714:32647;;;1077:3;-1:-1:-1;;;1077:3:85;;;;;;;;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;1077:3;714:32647;;;1077:3;-1:-1:-1;;;1077:3:85;;;;;;;;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;1077:3;714:32647;;;1077:3;-1:-1:-1;;;1077:3:85;;;;;;;;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;-1:-1:-1;;;714:32647:85;;;1077:3;;;;714:32647;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;8258:30;714:32647;8258:30;;8250:84;;;;:::i;:::-;8386:10;714:32647;;8366:19;714:32647;;;;;;;8415:15;;;;8407:51;;;;:::i;714:32647::-;;;;;:::i;:::-;3657:44;;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;;;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;8386:10;3427:51;3419:108;:::i;:::-;714:32647;;;8996:16;714:32647;;;8366:19;8996:41;714:32647;;;;8996:41;:::i;:::-;:50;714:32647;;;;9219:16;;;;9544:144;9219:16;;;;:::i;:::-;714:32647;;;;;;:::i;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;-1:-1:-1;;;;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;714:32647:85;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;-1:-1:-1;;714:32647:85;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;3586:87:86;714:32647:85;;;-1:-1:-1;714:32647:85;;:::o;:::-;;;;;;;-1:-1:-1;714:32647:85;3429:81:86;714:32647:85;;;-1:-1:-1;714:32647:85;;:::o;:::-;;;;;;;;-1:-1:-1;714:32647:85;;;;-1:-1:-1;714:32647:85;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;714:32647:85;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;1193:3;;;714:32647;1193:3;;;1854:42;1193:3;;;;714:32647;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;714:32647:85;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;-1:-1:-1;714:32647:85;;;;;;;:::o;:::-;;;;;;;:::i;:::-;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;23332:1;714:32647;;;;23332:1;714:32647;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;23332:1;714:32647;;;;:::i;:::-;;;;;;;;;;:::i;:::-;23332:1;714:32647;;;;;;;;;;;;23332:1;714:32647;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;714:32647:85;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;-1:-1:-1;714:32647:85;;;;:::i;:::-;;;;;;;;;;:::i;:::-;-1:-1:-1;714:32647:85;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;-1:-1:-1;;714:32647:85;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;22937:1554;;;;;714:32647;;:::i;:::-;23150:43;;;:::i;:::-;714:32647;23237:20;;;;;:34;;;22937:1554;23233:175;;23466:14;;;;;:::i;:::-;:27;23462:85;;22937:1554;23576:32;;;:::i;:::-;23557:51;;23636:14;;;;:::i;:::-;23635:29;23618:14;;;714:32647;-1:-1:-1;23745:23:85;-1:-1:-1;23784:13:85;23796:1;714:32647;-1:-1:-1;714:32647:85;23779:706;23841:3;23799:17;;;;:40;;;23841:3;23799:40;;;714:32647;-1:-1:-1;714:32647:85;23796:1;23618:14;714:32647;;23881:21;714:32647;-1:-1:-1;714:32647:85;23881:21;714:32647;;23881:66;;;23841:3;23881:145;;;23841:3;23860:615;;23841:3;;;;:::i;:::-;23784:13;;23860:615;24063:22;;;;;:55;;;23860:615;24059:370;;23860:615;24446:14;23841:3;24446:14;;:::i;:::-;23860:615;;;;;24059:370;714:32647;24446:14;24397:13;23841:3;714:32647;;-1:-1:-1;714:32647:85;23796:1;23618:14;714:32647;24142:233;714:32647;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;24320:16;23618:14;714:32647;;24320:32;714:32647;;-1:-1:-1;714:32647:85;24320:32;:::i;:::-;714:32647;;;;;;;:::i;:::-;;;;:::i;:::-;23618:14;24174:201;;714:32647;;:::i;:::-;;24174:201;;714:32647;24142:16;;:233;;;;;:::i;:::-;;;:::i;:::-;;24397:13;:::i;:::-;24059:370;;;;;;24063:55;24104:14;;;;;:::i;:::-;24089:29;;24063:55;;23881:145;714:32647;;-1:-1:-1;714:32647:85;23971:16;23618:14;714:32647;;23796:1;23971:32;714:32647;;-1:-1:-1;714:32647:85;23971:32;:::i;:::-;:44;714:32647;;:::i;:::-;23971:55;;23881:145;;:66;714:32647;;-1:-1:-1;714:32647:85;23906:16;23618:14;714:32647;;23906:41;:32;714:32647;;-1:-1:-1;714:32647:85;23906:32;:::i;:::-;:41;714:32647;;23881:66;;23799:40;;;;;;;;;;22937:1554::o;23799:40::-;23820:19;;;;23799:40;;23462:85;23517:19;;;;;;:::i;:::-;23462:85;;;23233:175;23306:28;;;;;;;;:::i;:::-;23287:47;;-1:-1:-1;23348:14:85;;;714:32647;23384:13;:::o;23237:34::-;23261:10;;;23237:34;;26331:972;;;26519:19;714:32647;26553:20;;;;;:34;;;26331:972;26549:167;;26730:14;;;;;:::i;:::-;:27;26726:85;;26331:972;714:32647;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;714:32647:85;;;:::i;:::-;;;;;;;26821:34;26876:14;;;;;:::i;:::-;26875:29;26915:24;714:32647;26949:23;714:32647;26988:13;27000:1;714:32647;;;26983:314;27045:3;27003:17;;;;:40;;;27045:3;27003:40;;;714:32647;;;27000:1;714:32647;;;27068:21;714:32647;;;27068:21;714:32647;;27064:223;;27045:3;;;;:::i;:::-;26988:13;;27064:223;27113:22;;;;;;;:55;;;27064:223;27109:132;;27064:223;27258:14;;;27045:3;27258:14;;:::i;:::-;27064:223;;;;;27109:132;27204:13;27045:3;27204:13;27192:30;27204:13;;27258:14;27204:13;;;;:::i;:::-;27192:30;;:::i;:::-;714:32647;27109:132;;;;;;;27113:55;27154:14;;;;;:::i;:::-;27139:29;;27113:55;;27003:40;;;;;;;;;;;26331:972::o;27003:40::-;27024:19;;;;27003:40;;26726:85;26781:19;;;;;;:::i;:::-;26726:85;;;26549:167;714:32647;;;;;;;;;;:::i;:::-;;;;;;;;26676:29;714:32647;26676:29;:::o;26553:34::-;26577:10;;;26553:34;;32204:141;32315:23;714:32647;32204:141;714:32647;;32315:23;;;;;;;714:32647;;;;;;:::i;:::-;32315:23;714:32647;;32315:23;;;;;;:::i;1295:3::-;;;;:::o;:::-;714:32647;;-1:-1:-1;;;1295:3:85;;;;;;;;;;;714:32647;-1:-1:-1;;;714:32647:85;;;1295:3;;;;1193;;;;:::o;:::-;714:32647;;-1:-1:-1;;;1193:3:85;;;;;;;;;;;714:32647;-1:-1:-1;;;714:32647:85;;;1193:3;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;714:32647;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;1193:3;714:32647;1193:3;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;714:32647;1193:3;714:32647;;;;1193:3;714:32647;1193:3;;;;;;;;-1:-1:-1;1193:3:85;;;;;;;;;;;;;;:::o;:::-;714:32647;;;;;;;;1193:3;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;714:32647;1193:3;;;;;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;;714:32647;;;;1193:3;714:32647;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;-1:-1:-1;;714:32647:85;1193:3;;;714:32647;;1193:3;;;;;;;;;;;;;;714:32647;;;;:::i;:::-;;;;;;;;:::i;:::-;;;1193:3;-1:-1:-1;1193:3:85;;;;:::o;:::-;714:32647;1193:3;:::o;714:32647::-;;;;;;;:::i;:::-;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::o;32398:142::-;32502:31;32398:142;714:32647;;:::i;:::-;;32502:31;714:32647;;;32502:31;;;;;;:::i;3405:215:23:-;-1:-1:-1;;;;;714:32647:85;3489:22:23;;3485:91;;-1:-1:-1;;;;;;;;;;;714:32647:85;;-1:-1:-1;;;;;;1193:3:85;;;;;;;-1:-1:-1;;;;;714:32647:85;3975:40:23;-1:-1:-1;;3975:40:23;3405:215::o;3485:91::-;3534:31;;;3509:1;3534:31;3509:1;3534:31;714:32647:85;;3509:1:23;3534:31;21163:1415:85;;;;;714:32647;;:::i;:::-;21370:37;;;:::i;:::-;714:32647;21451:20;;;;;:34;;;21163:1415;21447:175;;21680:14;;;;;:::i;:::-;:27;21676:85;;21163:1415;21790:32;;;:::i;:::-;21771:51;;21850:14;;;;:::i;:::-;21849:29;21832:14;;;714:32647;-1:-1:-1;21952:23:85;-1:-1:-1;21991:13:85;22003:1;714:32647;-1:-1:-1;714:32647:85;21986:586;22048:3;22006:17;;;;:40;;;22048:3;22006:40;;;714:32647;-1:-1:-1;714:32647:85;22071:16;21832:14;714:32647;;22003:1;22071:32;714:32647;;-1:-1:-1;714:32647:85;22071:32;:::i;714:32647::-;22067:495;;22048:3;;;;:::i;:::-;21991:13;;22067:495;22150:22;;;;;:55;;;22067:495;22146:370;;22067:495;22533:14;22048:3;22533:14;;:::i;:::-;22067:495;;;;;22146:370;714:32647;22533:14;22484:13;22048:3;714:32647;;-1:-1:-1;714:32647:85;22003:1;21832:14;714:32647;22229:233;714:32647;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;22071:16;21832:14;714:32647;;22407:32;714:32647;;-1:-1:-1;714:32647:85;22407:32;:::i;22484:13::-;22146:370;;;;;;22150:55;22191:14;;;;;:::i;:::-;22176:29;;22150:55;;22006:40;22027:19;;;;22006:40;;21676:85;21731:19;;;;;;:::i;:::-;21676:85;;;21451:34;21475:10;;;21451:34;;714:32647;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;;;-1:-1:-1;714:32647:85;:::o;:::-;;;;;;-1:-1:-1;714:32647:85;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;-1:-1:-1;714:32647:85;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;-1:-1:-1;;714:32647:85;;;-1:-1:-1;;714:32647:85;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;;-1:-1:-1;714:32647:85;;;;;;;;:::o;:::-;;;;;;;;;;1193:3;;;714:32647;;;;;;:::i;:::-;;;;;;;;;;;1193:3::o;714:32647::-;;;;;;;;1193:3;;;714:32647;;1193:3;;;;714:32647;;:::o;4578:312:25:-;-1:-1:-1;;;;;4667:6:25;714:32647:85;4658:4:25;4650:23;;;:120;;;;4578:312;4633:251;;;4578:312::o;4650:120::-;-1:-1:-1;;;;;;;;;;;714:32647:85;-1:-1:-1;;;;;714:32647:85;4728:42:25;;;-1:-1:-1;4650:120:25;;;2658:162:23;-1:-1:-1;;;;;;;;;;;714:32647:85;-1:-1:-1;;;;;714:32647:85;966:10:26;2717:23:23;2713:101;;2658:162::o;2713:101::-;2763:40;;;-1:-1:-1;2763:40:23;966:10:26;2763:40:23;714:32647:85;;-1:-1:-1;2763:40:23;714:32647:85;;;;;-1:-1:-1;;714:32647:85;;:::o;9799:1126::-;;;;;;;10101:11;;;;:::i;:::-;10203:16;;;;:::i;:::-;714:32647;;;;;;:::i;:::-;10300:174;;;;:::i;:::-;;;;714:32647;;;;10300:174;;714:32647;;;10300:174;;;714:32647;10459:4;714:32647;;;-1:-1:-1;714:32647:85;10256:16;10300:174;714:32647;10256:41;714:32647;;-1:-1:-1;714:32647:85;10256:41;:::i;:::-;714:32647;;10459:4;714:32647;;;;;;;;;:::i;:::-;;;;10459:4;714:32647;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;10300:174;714:32647;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;;;;10256:16;714:32647;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;10300:174;714:32647;;-1:-1:-1;714:32647:85;10300:174;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;714:32647;;;1193:3;;;;;714:32647;-1:-1:-1;714:32647:85;10580:19;10300:174;714:32647;10580:44;714:32647;;-1:-1:-1;714:32647:85;10580:44;:::i;:::-;10639:13;-1:-1:-1;10681:3:85;714:32647;;10654:25;;;;;10734:19;;;;:::i;:::-;;10300:174;10713:17;;;;;:::i;:::-;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;10300:174;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;;10459:4;1193:3;;;-1:-1:-1;1193:3:85;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;10639:13;;1193:3;714:32647;;;1193:3;;714:32647;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;1193:3;-1:-1:-1;1193:3:85;;;;;;;;10459:4;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;714:32647;1193:3;;714:32647;1193:3;;;;;;;;;;;;10300:174;10459:4;1193:3;;;;;;;;;;;;;;;10654:25;;;;;;10873:43;10654:25;10824:37;;;:::i;:::-;:39;714:32647;;10824:39;:::i;:::-;1193:3;;10873:43;:::i;:::-;:45;714:32647;;10873:45;:::i;:::-;1193:3;;9799:1126::o;714:32647::-;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;10300:174;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;10459:4;1193:3;;10300:174;1193:3;;;-1:-1:-1;1193:3:85;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;;;;;;;;;1193:3;714:32647;;;1193:3;;714:32647;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;1193:3;-1:-1:-1;1193:3:85;;;;;;;;10300:174;1193:3;10459:4;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;;;;10300:174;10459:4;1193:3;;;;;;;;;;;;;;;714:32647;;-1:-1:-1;714:32647:85;;10300:174;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;10459:4;714:32647;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;;;;;;;;;10459:4;714:32647;;;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;714:32647;1193:3;;714:32647;;;;;;;;;;10300:174;10459:4;714:32647;;;;;;;;;;;;;;;30133:354;714:32647;;;;;;30241:30;;714:32647;30320:38;714:32647;30320:38;714:32647;;30320:38;;;;;;:::i;:::-;30630:22;;714:32647;30624:40;714:32647;;1193:3;30720:22;;714:32647;30714:62;1077:3;;30320:38;30819:31;;1193:3;;30819:35;1077:3;;30927:31;;;1193:3;;;-1:-1:-1;1077:3:85;;31108:36;;;1193:3;31108:40;1077:3;;31218:20;;;;714:32647;31212:38;1077:3;;1524;31303:20;;714:32647;31297:57;1756:3;;30133:354::o;30237:244::-;714:32647;;-1:-1:-1;;;30436:34:85;;714:32647;30436:34;;;714:32647;;;;;;;;;;;30436:34;;;31535:618;714:32647;;;;31643:28;714:32647;;1650:2;714:32647;;31738:31;714:32647;;-1:-1:-1;31843:3:85;714:32647;;31826:15;;;;;31876:7;;;;:::i;:::-;;714:32647;31870:25;714:32647;;1408:2;31958:7;;;;:::i;:::-;;714:32647;31952:50;714:32647;;1524:3;32058:9;;;;:::i;:::-;;714:32647;32052:54;714:32647;;;;31811:13;;714:32647;;;-1:-1:-1;;;714:32647:85;;1408:2;714:32647;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;1408:2;714:32647;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;1408:2;714:32647;;;;;;;;;;;;;;;;;31826:15;;;;31535:618::o;714:32647::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;7082:141:24;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;7148:18:24;7144:73;;7082:141::o;7144:73::-;7189:17;;;-1:-1:-1;7189:17:24;;-1:-1:-1;7189:17:24;4437:582:42;;4609:8;;-1:-1:-1;714:32647:85;;5690:21:42;:17;;5815:105;;;;;;5686:301;5957:19;;;5710:1;5957:19;;5710:1;5957:19;4605:408;714:32647:85;;4857:22:42;:49;;;4605:408;4853:119;;4985:17;;:::o;4853:119::-;-1:-1:-1;;;4878:1:42;4933:24;;;-1:-1:-1;;;;;714:32647:85;;;;4933:24:42;714:32647:85;;;4933:24:42;4857:49;4883:18;;;:23;4857:49;","linkReferences":{},"immutableReferences":{"45353":[{"start":9569,"length":32},{"start":18763,"length":32}]}},"methodIdentifiers":{"BURN_ACTOR()":"0a6a63f1","MAX_CAPABILITIES()":"6e36e974","MAX_CAPABILITY_KEY_LENGTH()":"7f657567","MAX_CAPABILITY_VALUE_LENGTH()":"dcea1c6f","REGISTRATION_FEE()":"64b4f751","UPGRADE_INTERFACE_VERSION()":"ad3cb1cc","VERSION()":"ffa1ad74","activeProductTypeProviderCount(uint8)":"8bdc7747","activeProviderCount()":"f08bbda0","addProduct(uint8,bytes,string[],string[])":"02ff8437","addressToProviderId(address)":"e835440e","decodePDPOffering(bytes)":"deb0e462","eip712Domain()":"84b0196e","encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address))":"82ee4b34","getActiveProvidersByProductType(uint8,uint256,uint256)":"213c63b1","getAllActiveProviders(uint256,uint256)":"2f67c065","getNextProviderId()":"d1329d4e","getPDPService(uint256)":"c439fd57","getProduct(uint256,uint8)":"aca0988f","getProductCapabilities(uint256,uint8,string[])":"a6433240","getProductCapability(uint256,uint8,string)":"1e35bdde","getProvider(uint256)":"5c42d079","getProviderByAddress(address)":"2335bde0","getProviderCount()":"46ce4175","getProviderIdByAddress(address)":"93ecb91e","getProvidersByProductType(uint8,uint256,uint256)":"fc260f7b","initialize()":"8129fc1c","isProviderActive(uint256)":"83df54a5","isRegisteredProvider(address)":"51ca236f","migrate(string)":"c9c5b5b4","owner()":"8da5cb5b","productCapabilities(uint256,uint8,string)":"4368bafb","productTypeProviderCount(uint8)":"e459382f","providerHasProduct(uint256,uint8)":"cde24beb","providerProducts(uint256,uint8)":"6bf6d74f","providers(uint256)":"50f3fc81","proxiableUUID()":"52d1902d","registerProvider(address,string,string,uint8,bytes,string[],string[])":"b47be8ab","removeProduct(uint8)":"a9d239b6","removeProvider()":"b6363b99","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])":"0b5c0125","updateProduct(uint8,bytes,string[],string[])":"8c9a7b56","updateProviderInfo(string,string)":"d1c21b5b","upgradeToAndCall(address,bytes)":"4f1ef286"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ContractUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"serviceUrl\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"ProductAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"ProductRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"serviceUrl\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"ProductUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"ProviderInfoUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"ProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"ProviderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BURN_ACTOR\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CAPABILITIES\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CAPABILITY_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CAPABILITY_VALUE_LENGTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTRATION_FEE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"activeProductTypeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"addProduct\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"}],\"name\":\"addressToProviderId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"decodePDPOffering\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"serviceURL\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ipniPiece\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"ipniIpfs\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"paymentTokenAddress\",\"type\":\"address\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PDPOffering\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"serviceURL\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ipniPiece\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"ipniIpfs\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"paymentTokenAddress\",\"type\":\"address\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PDPOffering\",\"name\":\"pdpOffering\",\"type\":\"tuple\"}],\"name\":\"encodePDPOffering\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getActiveProvidersByProductType\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProviderInfo\",\"name\":\"providerInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProduct\",\"name\":\"product\",\"type\":\"tuple\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ProviderWithProduct[]\",\"name\":\"providers\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"hasMore\",\"type\":\"bool\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PaginatedProviders\",\"name\":\"result\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getAllActiveProviders\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"providerIds\",\"type\":\"uint256[]\"},{\"internalType\":\"bool\",\"name\":\"hasMore\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextProviderId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"getPDPService\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"serviceURL\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ipniPiece\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"ipniIpfs\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"paymentTokenAddress\",\"type\":\"address\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PDPOffering\",\"name\":\"pdpOffering\",\"type\":\"tuple\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"getProduct\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"string[]\",\"name\":\"keys\",\"type\":\"string[]\"}],\"name\":\"getProductCapabilities\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"exists\",\"type\":\"bool[]\"},{\"internalType\":\"string[]\",\"name\":\"values\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"getProductCapability\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"getProvider\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProviderInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"}],\"name\":\"getProviderByAddress\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProviderInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"}],\"name\":\"getProviderIdByAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getProvidersByProductType\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProviderInfo\",\"name\":\"providerInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProduct\",\"name\":\"product\",\"type\":\"tuple\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ProviderWithProduct[]\",\"name\":\"providers\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"hasMore\",\"type\":\"bool\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PaginatedProviders\",\"name\":\"result\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"isProviderActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"isRegisteredProvider\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newVersion\",\"type\":\"string\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"productCapabilities\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"productTypeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"providerHasProduct\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"providerProducts\",\"outputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"providers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"registerProvider\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"removeProduct\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"removeProvider\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"serviceURL\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ipniPiece\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"ipniIpfs\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"paymentTokenAddress\",\"type\":\"address\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PDPOffering\",\"name\":\"pdpOffering\",\"type\":\"tuple\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"updatePDPServiceWithCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"updateProduct\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"updateProviderInfo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"addProduct(uint8,bytes,string[],string[])\":{\"params\":{\"capabilityKeys\":\"Array of capability keys (max 32 chars each, max 10 keys)\",\"capabilityValues\":\"Array of capability values (max 128 chars each, max 10 values)\",\"productData\":\"The encoded product configuration data\",\"productType\":\"The type of product to add\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"This ensures the implementation contract cannot be initialized directly\"},\"eip712Domain()\":{\"details\":\"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature.\"},\"getActiveProvidersByProductType(uint8,uint256,uint256)\":{\"params\":{\"limit\":\"Maximum number of results to return\",\"offset\":\"Starting index for pagination (0-based)\",\"productType\":\"The product type to filter by\"},\"returns\":{\"result\":\"Paginated result containing provider details and hasMore flag\"}},\"getAllActiveProviders(uint256,uint256)\":{\"params\":{\"limit\":\"Maximum number of results to return\",\"offset\":\"Starting index for pagination (0-based)\"},\"returns\":{\"hasMore\":\"Whether there are more results after this page\",\"providerIds\":\"Array of active provider IDs\"}},\"getNextProviderId()\":{\"returns\":{\"_0\":\"The next provider ID that will be assigned\"}},\"getPDPService(uint256)\":{\"params\":{\"providerId\":\"The ID of the provider\"},\"returns\":{\"capabilityKeys\":\"Array of capability keys\",\"isActive\":\"Whether the PDP service is active\",\"pdpOffering\":\"The decoded PDP service data\"}},\"getProduct(uint256,uint8)\":{\"params\":{\"productType\":\"The type of product to retrieve\",\"providerId\":\"The ID of the provider\"},\"returns\":{\"capabilityKeys\":\"Array of capability keys\",\"isActive\":\"Whether the product is active\",\"productData\":\"The encoded product data\"}},\"getProductCapabilities(uint256,uint8,string[])\":{\"params\":{\"keys\":\"Array of capability keys to query\",\"productType\":\"The type of product\",\"providerId\":\"The ID of the provider\"},\"returns\":{\"exists\":\"Array of booleans indicating whether each key exists\",\"values\":\"Array of capability values corresponding to the keys (empty string for non-existent keys)\"}},\"getProductCapability(uint256,uint8,string)\":{\"params\":{\"key\":\"The capability key to query\",\"productType\":\"The type of product\",\"providerId\":\"The ID of the provider\"},\"returns\":{\"exists\":\"Whether the capability key exists\",\"value\":\"The capability value (empty string if key doesn't exist)\"}},\"getProvider(uint256)\":{\"params\":{\"providerId\":\"The ID of the provider\"},\"returns\":{\"info\":\"The provider information\"}},\"getProviderByAddress(address)\":{\"params\":{\"providerAddress\":\"The address of the service provider\"},\"returns\":{\"info\":\"The provider information (empty struct if not registered)\"}},\"getProviderCount()\":{\"returns\":{\"_0\":\"The total count of providers\"}},\"getProviderIdByAddress(address)\":{\"params\":{\"providerAddress\":\"The address of the service provider\"},\"returns\":{\"_0\":\"providerId The provider ID (0 if not registered)\"}},\"getProvidersByProductType(uint8,uint256,uint256)\":{\"params\":{\"limit\":\"Maximum number of results to return\",\"offset\":\"Starting index for pagination (0-based)\",\"productType\":\"The product type to filter by\"},\"returns\":{\"result\":\"Paginated result containing provider details and hasMore flag\"}},\"initialize()\":{\"details\":\"Can only be called once during proxy deployment\"},\"isProviderActive(uint256)\":{\"params\":{\"providerId\":\"The ID of the provider\"},\"returns\":{\"_0\":\"Whether the provider is active\"}},\"isRegisteredProvider(address)\":{\"params\":{\"provider\":\"The address to check\"},\"returns\":{\"_0\":\"Whether the address is a registered provider\"}},\"migrate(string)\":{\"details\":\"This function should be called during upgrades to emit version tracking events\",\"params\":{\"newVersion\":\"The version string for the new implementation\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"providerHasProduct(uint256,uint8)\":{\"params\":{\"productType\":\"The product type to check\",\"providerId\":\"The ID of the provider\"},\"returns\":{\"_0\":\"Whether the provider offers this product type\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"registerProvider(address,string,string,uint8,bytes,string[],string[])\":{\"params\":{\"capabilityKeys\":\"Array of capability keys\",\"capabilityValues\":\"Array of capability values\",\"description\":\"Provider description (max 256 chars)\",\"name\":\"Provider name (optional, max 128 chars)\",\"payee\":\"Address that will receive payments (cannot be changed after registration)\",\"productData\":\"The encoded product configuration data\",\"productType\":\"The type of product to register\"},\"returns\":{\"providerId\":\"The unique ID assigned to the provider\"}},\"removeProduct(uint8)\":{\"params\":{\"productType\":\"The type of product to remove\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])\":{\"params\":{\"capabilityKeys\":\"Array of capability keys (max 32 chars each, max 10 keys)\",\"capabilityValues\":\"Array of capability values (max 128 chars each, max 10 values)\",\"pdpOffering\":\"The new PDP service configuration\"}},\"updateProduct(uint8,bytes,string[],string[])\":{\"params\":{\"capabilityKeys\":\"Array of capability keys (max 32 chars each, max 10 keys)\",\"capabilityValues\":\"Array of capability values (max 128 chars each, max 10 values)\",\"productData\":\"The new encoded product configuration data\",\"productType\":\"The type of product to update\"}},\"updateProviderInfo(string,string)\":{\"params\":{\"description\":\"New provider description (max 256 chars)\",\"name\":\"New provider name (optional, max 128 chars)\"}},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"ServiceProviderRegistry\",\"version\":1},\"userdoc\":{\"events\":{\"ContractUpgraded(string,address)\":{\"notice\":\"Emitted when the contract is upgraded\"},\"ProductAdded(uint256,uint8,string,address,string[],string[])\":{\"notice\":\"Emitted when a product is added to an existing provider\"},\"ProductRemoved(uint256,uint8)\":{\"notice\":\"Emitted when a product is removed from a provider\"},\"ProductUpdated(uint256,uint8,string,address,string[],string[])\":{\"notice\":\"Emitted when a product is updated or added\"},\"ProviderInfoUpdated(uint256)\":{\"notice\":\"Emitted when provider info is updated\"},\"ProviderRegistered(uint256,address,address)\":{\"notice\":\"Emitted when a new provider registers\"},\"ProviderRemoved(uint256)\":{\"notice\":\"Emitted when a provider is removed\"}},\"kind\":\"user\",\"methods\":{\"BURN_ACTOR()\":{\"notice\":\"Burn actor address for burning FIL\"},\"MAX_CAPABILITIES()\":{\"notice\":\"Maximum number of capability key-value pairs per product\"},\"MAX_CAPABILITY_KEY_LENGTH()\":{\"notice\":\"Maximum length for capability keys\"},\"MAX_CAPABILITY_VALUE_LENGTH()\":{\"notice\":\"Maximum length for capability values\"},\"REGISTRATION_FEE()\":{\"notice\":\"Registration fee in attoFIL (5 FIL = 5 * 10^18 attoFIL)\"},\"VERSION()\":{\"notice\":\"Version of the contract implementation\"},\"activeProductTypeProviderCount(uint8)\":{\"notice\":\"Count of active providers offering each product type\"},\"activeProviderCount()\":{\"notice\":\"Count of active providers\"},\"addProduct(uint8,bytes,string[],string[])\":{\"notice\":\"Add a new product to an existing provider\"},\"addressToProviderId(address)\":{\"notice\":\"Address to provider ID lookup\"},\"constructor\":{\"notice\":\"Constructor that disables initializers for the implementation contract\"},\"decodePDPOffering(bytes)\":{\"notice\":\"Decode PDP offering from bytes\"},\"encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address))\":{\"notice\":\"Encode PDP offering to bytes\"},\"getActiveProvidersByProductType(uint8,uint256,uint256)\":{\"notice\":\"Get all active providers that offer a specific product type with pagination\"},\"getAllActiveProviders(uint256,uint256)\":{\"notice\":\"Get all active providers with pagination\"},\"getNextProviderId()\":{\"notice\":\"Returns the next available provider ID\"},\"getPDPService(uint256)\":{\"notice\":\"Get PDP service configuration for a provider (convenience function)\"},\"getProduct(uint256,uint8)\":{\"notice\":\"Get product data for a specific product type\"},\"getProductCapabilities(uint256,uint8,string[])\":{\"notice\":\"Get multiple capability values for a product\"},\"getProductCapability(uint256,uint8,string)\":{\"notice\":\"Get a single capability value for a product\"},\"getProvider(uint256)\":{\"notice\":\"Get complete provider information\"},\"getProviderByAddress(address)\":{\"notice\":\"Get provider info by address\"},\"getProviderCount()\":{\"notice\":\"Get total number of registered providers (including inactive)\"},\"getProviderIdByAddress(address)\":{\"notice\":\"Get provider ID by address\"},\"getProvidersByProductType(uint8,uint256,uint256)\":{\"notice\":\"Get all providers that offer a specific product type with pagination\"},\"initialize()\":{\"notice\":\"Initializes the registry contract\"},\"isProviderActive(uint256)\":{\"notice\":\"Check if a provider is active\"},\"isRegisteredProvider(address)\":{\"notice\":\"Check if an address is a registered provider\"},\"migrate(string)\":{\"notice\":\"Migration function for contract upgrades\"},\"productCapabilities(uint256,uint8,string)\":{\"notice\":\"Capability values mapping for efficient lookups\"},\"productTypeProviderCount(uint8)\":{\"notice\":\"Count of providers (including inactive) offering each product type\"},\"providerHasProduct(uint256,uint8)\":{\"notice\":\"Check if a provider offers a specific product type\"},\"providerProducts(uint256,uint8)\":{\"notice\":\"Provider products mapping (extensible for multiple product types)\"},\"providers(uint256)\":{\"notice\":\"Main registry of providers\"},\"registerProvider(address,string,string,uint8,bytes,string[],string[])\":{\"notice\":\"Register as a new service provider with a specific product type\"},\"removeProduct(uint8)\":{\"notice\":\"Remove a product from a provider\"},\"removeProvider()\":{\"notice\":\"Remove provider registration (soft delete)\"},\"updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])\":{\"notice\":\"Update PDP service configuration with capabilities\"},\"updateProduct(uint8,bytes,string[],string[])\":{\"notice\":\"Update an existing product configuration\"},\"updateProviderInfo(string,string)\":{\"notice\":\"Update provider information\"}},\"notice\":\"A registry contract for managing service providers across the Filecoin Services ecosystem\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ServiceProviderRegistry.sol\":\"ServiceProviderRegistry\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@fws-payments/=lib/fws-payments/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@pdp/=lib/pdp/src/\",\":@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/\",\":@session-key-registry/=lib/session-key-registry/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":fws-payments/=lib/fws-payments/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":pdp/=lib/pdp/src/\",\":pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/\",\":session-key-registry/=lib/session-key-registry/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x574a7451e42724f7de29e2855c392a8a5020acd695169466a18459467d719d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5bc189f63b639ee173dd7b6fecc39baf7113bf161776aea22b34c57fdd1872ec\",\"dweb:/ipfs/QmZAf2VtjDLRULqjJkde6LNsxAg12tUqpPqgUQQZbAjgtZ\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/EIP712Upgradeable.sol\":{\"keccak256\":\"0xd5d8ca01aef5be860ca223ddea39bf3c7467ba1a244fe8dcf26bc435e5ca43d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://48ff830d6a98a7e108a2309aff6dac9666b91e4003c2c1857957d7d79c6ac513\",\"dweb:/ipfs/QmNc3u2K11tshKxAmLEqjoxJ6eAFEiPAccwkr1RsWvsF3H\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"keccak256\":\"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d\",\"dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a\",\"dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP\"]},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196\",\"dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA\"]},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x8decfa54cec979c824b044b8128cd91d713f72c71fd7dfa54974624d8c949898\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://271f914261a19d87117a777e0924ada545c16191ef9b00cc40b0134fc14ebc70\",\"dweb:/ipfs/QmdvVNWHGHQrGGPonZJs5NuzTevTjZRM2zayKrDJf7WBA2\"]},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0x06871a0948d0fed9316ae59ee4368527e144911f5e284755312b5bfcde8b27ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3c30e46d061d8a450c561935a1236b1885aa76ffab93a19b26dcb8868c839843\",\"dweb:/ipfs/QmZbWbeDyixTyYkVtJvuiQYfkQz12pS7zxWZF3Ju9PYwGH\"]},\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0x104c579d98591d36dfe190bdad391c79c358d399ee18d76e877c30b94d3c07a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://332ab9adbc9a985195d56832159d09417ed5674adbbd6189db74586110aabc59\",\"dweb:/ipfs/QmZNVeVa4b7iKyFbHjvKir45RGBM93T7Yjgg9ye6Hu2umd\"]},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59\",\"dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"src/Errors.sol\":{\"keccak256\":\"0x27464ca1552086c6a7a7b0b069a66dcb3cb3d1db945570fa1120699ee151104a\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://8b2968e69dbb37a9b63b62196b3a87997a1453a410a0769af77701543061a2ef\",\"dweb:/ipfs/QmVrRCRtZeynQ6wtM9KFRKVQXDSHWUEt8CBo99Hoz5WrGH\"]},\"src/ServiceProviderRegistry.sol\":{\"keccak256\":\"0xfbd35734ef7436df8c3407c4fd64d74bf28a35ddcb427bc300282327034c03b7\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://c843026d23f17f082224ab2d0bd25168c41b1fa74675359f43fb0ac0d2e2152f\",\"dweb:/ipfs/QmNdVVEbhvgYaABPAwMAUtcYRw9zi49bukN2HPuwH7rhRv\"]},\"src/ServiceProviderRegistryStorage.sol\":{\"keccak256\":\"0x8b24b4146fc5220b5f5beb603df1397feb6f54cc7a44c15031ae97b914debe2d\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://453b1930c213530204b8f56ad298610748b2dd81fcf053e672f588722dfea4d9\",\"dweb:/ipfs/QmTGWoNgMYLYLtTv5p9LQMcYWGpdEH2eB7KdpQsm6srM53\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ERC1967InvalidImplementation"},{"inputs":[],"type":"error","name":"ERC1967NonPayable"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"InvalidInitialization"},{"inputs":[],"type":"error","name":"NotInitializing"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"UUPSUnauthorizedCallContext"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"type":"error","name":"UUPSUnsupportedProxiableUUID"},{"inputs":[{"internalType":"string","name":"version","type":"string","indexed":false},{"internalType":"address","name":"implementation","type":"address","indexed":false}],"type":"event","name":"ContractUpgraded","anonymous":false},{"inputs":[],"type":"event","name":"EIP712DomainChanged","anonymous":false},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8","indexed":true},{"internalType":"string","name":"serviceUrl","type":"string","indexed":false},{"internalType":"address","name":"serviceProvider","type":"address","indexed":false},{"internalType":"string[]","name":"capabilityKeys","type":"string[]","indexed":false},{"internalType":"string[]","name":"capabilityValues","type":"string[]","indexed":false}],"type":"event","name":"ProductAdded","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8","indexed":true}],"type":"event","name":"ProductRemoved","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8","indexed":true},{"internalType":"string","name":"serviceUrl","type":"string","indexed":false},{"internalType":"address","name":"serviceProvider","type":"address","indexed":false},{"internalType":"string[]","name":"capabilityKeys","type":"string[]","indexed":false},{"internalType":"string[]","name":"capabilityValues","type":"string[]","indexed":false}],"type":"event","name":"ProductUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true}],"type":"event","name":"ProviderInfoUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true},{"internalType":"address","name":"serviceProvider","type":"address","indexed":true},{"internalType":"address","name":"payee","type":"address","indexed":true}],"type":"event","name":"ProviderRegistered","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true}],"type":"event","name":"ProviderRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"BURN_ACTOR","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_CAPABILITIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_CAPABILITY_KEY_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_CAPABILITY_VALUE_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"REGISTRATION_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"activeProductTypeProviderCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"activeProviderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"string[]","name":"capabilityValues","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"addProduct"},{"inputs":[{"internalType":"address","name":"providerAddress","type":"address"}],"stateMutability":"view","type":"function","name":"addressToProviderId","outputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"pure","type":"function","name":"decodePDPOffering","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.PDPOffering","name":"","type":"tuple","components":[{"internalType":"string","name":"serviceURL","type":"string"},{"internalType":"uint256","name":"minPieceSizeInBytes","type":"uint256"},{"internalType":"uint256","name":"maxPieceSizeInBytes","type":"uint256"},{"internalType":"bool","name":"ipniPiece","type":"bool"},{"internalType":"bool","name":"ipniIpfs","type":"bool"},{"internalType":"uint256","name":"storagePricePerTibPerMonth","type":"uint256"},{"internalType":"uint256","name":"minProvingPeriodInEpochs","type":"uint256"},{"internalType":"string","name":"location","type":"string"},{"internalType":"contract IERC20","name":"paymentTokenAddress","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}]},{"inputs":[{"internalType":"struct ServiceProviderRegistryStorage.PDPOffering","name":"pdpOffering","type":"tuple","components":[{"internalType":"string","name":"serviceURL","type":"string"},{"internalType":"uint256","name":"minPieceSizeInBytes","type":"uint256"},{"internalType":"uint256","name":"maxPieceSizeInBytes","type":"uint256"},{"internalType":"bool","name":"ipniPiece","type":"bool"},{"internalType":"bool","name":"ipniIpfs","type":"bool"},{"internalType":"uint256","name":"storagePricePerTibPerMonth","type":"uint256"},{"internalType":"uint256","name":"minProvingPeriodInEpochs","type":"uint256"},{"internalType":"string","name":"location","type":"string"},{"internalType":"contract IERC20","name":"paymentTokenAddress","type":"address"}]}],"stateMutability":"pure","type":"function","name":"encodePDPOffering","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function","name":"getActiveProvidersByProductType","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.PaginatedProviders","name":"result","type":"tuple","components":[{"internalType":"struct ServiceProviderRegistryStorage.ProviderWithProduct[]","name":"providers","type":"tuple[]","components":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","name":"providerInfo","type":"tuple","components":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"internalType":"struct ServiceProviderRegistryStorage.ServiceProduct","name":"product","type":"tuple","components":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"bool","name":"isActive","type":"bool"}]}]},{"internalType":"bool","name":"hasMore","type":"bool"}]}]},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function","name":"getAllActiveProviders","outputs":[{"internalType":"uint256[]","name":"providerIds","type":"uint256[]"},{"internalType":"bool","name":"hasMore","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getNextProviderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPDPService","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.PDPOffering","name":"pdpOffering","type":"tuple","components":[{"internalType":"string","name":"serviceURL","type":"string"},{"internalType":"uint256","name":"minPieceSizeInBytes","type":"uint256"},{"internalType":"uint256","name":"maxPieceSizeInBytes","type":"uint256"},{"internalType":"bool","name":"ipniPiece","type":"bool"},{"internalType":"bool","name":"ipniIpfs","type":"bool"},{"internalType":"uint256","name":"storagePricePerTibPerMonth","type":"uint256"},{"internalType":"uint256","name":"minProvingPeriodInEpochs","type":"uint256"},{"internalType":"string","name":"location","type":"string"},{"internalType":"contract IERC20","name":"paymentTokenAddress","type":"address"}]},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"bool","name":"isActive","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"getProduct","outputs":[{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"bool","name":"isActive","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"string[]","name":"keys","type":"string[]"}],"stateMutability":"view","type":"function","name":"getProductCapabilities","outputs":[{"internalType":"bool[]","name":"exists","type":"bool[]"},{"internalType":"string[]","name":"values","type":"string[]"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"string","name":"key","type":"string"}],"stateMutability":"view","type":"function","name":"getProductCapability","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"string","name":"value","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getProvider","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","name":"info","type":"tuple","components":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]}]},{"inputs":[{"internalType":"address","name":"providerAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getProviderByAddress","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","name":"info","type":"tuple","components":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getProviderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"providerAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getProviderIdByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function","name":"getProvidersByProductType","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.PaginatedProviders","name":"result","type":"tuple","components":[{"internalType":"struct ServiceProviderRegistryStorage.ProviderWithProduct[]","name":"providers","type":"tuple[]","components":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","name":"providerInfo","type":"tuple","components":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"internalType":"struct ServiceProviderRegistryStorage.ServiceProduct","name":"product","type":"tuple","components":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"bool","name":"isActive","type":"bool"}]}]},{"internalType":"bool","name":"hasMore","type":"bool"}]}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"isProviderActive","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"provider","type":"address"}],"stateMutability":"view","type":"function","name":"isRegisteredProvider","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"string","name":"newVersion","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"migrate"},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"string","name":"key","type":"string"}],"stateMutability":"view","type":"function","name":"productCapabilities","outputs":[{"internalType":"string","name":"value","type":"string"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"productTypeProviderCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"providerHasProduct","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"providerProducts","outputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"bool","name":"isActive","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"providers","outputs":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"string[]","name":"capabilityValues","type":"string[]"}],"stateMutability":"payable","type":"function","name":"registerProvider","outputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"removeProduct"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"removeProvider"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"struct ServiceProviderRegistryStorage.PDPOffering","name":"pdpOffering","type":"tuple","components":[{"internalType":"string","name":"serviceURL","type":"string"},{"internalType":"uint256","name":"minPieceSizeInBytes","type":"uint256"},{"internalType":"uint256","name":"maxPieceSizeInBytes","type":"uint256"},{"internalType":"bool","name":"ipniPiece","type":"bool"},{"internalType":"bool","name":"ipniIpfs","type":"bool"},{"internalType":"uint256","name":"storagePricePerTibPerMonth","type":"uint256"},{"internalType":"uint256","name":"minProvingPeriodInEpochs","type":"uint256"},{"internalType":"string","name":"location","type":"string"},{"internalType":"contract IERC20","name":"paymentTokenAddress","type":"address"}]},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"string[]","name":"capabilityValues","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"updatePDPServiceWithCapabilities"},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"string[]","name":"capabilityValues","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"updateProduct"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateProviderInfo"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"}],"devdoc":{"kind":"dev","methods":{"addProduct(uint8,bytes,string[],string[])":{"params":{"capabilityKeys":"Array of capability keys (max 32 chars each, max 10 keys)","capabilityValues":"Array of capability values (max 128 chars each, max 10 values)","productData":"The encoded product configuration data","productType":"The type of product to add"}},"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor","details":"This ensures the implementation contract cannot be initialized directly"},"eip712Domain()":{"details":"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature."},"getActiveProvidersByProductType(uint8,uint256,uint256)":{"params":{"limit":"Maximum number of results to return","offset":"Starting index for pagination (0-based)","productType":"The product type to filter by"},"returns":{"result":"Paginated result containing provider details and hasMore flag"}},"getAllActiveProviders(uint256,uint256)":{"params":{"limit":"Maximum number of results to return","offset":"Starting index for pagination (0-based)"},"returns":{"hasMore":"Whether there are more results after this page","providerIds":"Array of active provider IDs"}},"getNextProviderId()":{"returns":{"_0":"The next provider ID that will be assigned"}},"getPDPService(uint256)":{"params":{"providerId":"The ID of the provider"},"returns":{"capabilityKeys":"Array of capability keys","isActive":"Whether the PDP service is active","pdpOffering":"The decoded PDP service data"}},"getProduct(uint256,uint8)":{"params":{"productType":"The type of product to retrieve","providerId":"The ID of the provider"},"returns":{"capabilityKeys":"Array of capability keys","isActive":"Whether the product is active","productData":"The encoded product data"}},"getProductCapabilities(uint256,uint8,string[])":{"params":{"keys":"Array of capability keys to query","productType":"The type of product","providerId":"The ID of the provider"},"returns":{"exists":"Array of booleans indicating whether each key exists","values":"Array of capability values corresponding to the keys (empty string for non-existent keys)"}},"getProductCapability(uint256,uint8,string)":{"params":{"key":"The capability key to query","productType":"The type of product","providerId":"The ID of the provider"},"returns":{"exists":"Whether the capability key exists","value":"The capability value (empty string if key doesn't exist)"}},"getProvider(uint256)":{"params":{"providerId":"The ID of the provider"},"returns":{"info":"The provider information"}},"getProviderByAddress(address)":{"params":{"providerAddress":"The address of the service provider"},"returns":{"info":"The provider information (empty struct if not registered)"}},"getProviderCount()":{"returns":{"_0":"The total count of providers"}},"getProviderIdByAddress(address)":{"params":{"providerAddress":"The address of the service provider"},"returns":{"_0":"providerId The provider ID (0 if not registered)"}},"getProvidersByProductType(uint8,uint256,uint256)":{"params":{"limit":"Maximum number of results to return","offset":"Starting index for pagination (0-based)","productType":"The product type to filter by"},"returns":{"result":"Paginated result containing provider details and hasMore flag"}},"initialize()":{"details":"Can only be called once during proxy deployment"},"isProviderActive(uint256)":{"params":{"providerId":"The ID of the provider"},"returns":{"_0":"Whether the provider is active"}},"isRegisteredProvider(address)":{"params":{"provider":"The address to check"},"returns":{"_0":"Whether the address is a registered provider"}},"migrate(string)":{"details":"This function should be called during upgrades to emit version tracking events","params":{"newVersion":"The version string for the new implementation"}},"owner()":{"details":"Returns the address of the current owner."},"providerHasProduct(uint256,uint8)":{"params":{"productType":"The product type to check","providerId":"The ID of the provider"},"returns":{"_0":"Whether the provider offers this product type"}},"proxiableUUID()":{"details":"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"registerProvider(address,string,string,uint8,bytes,string[],string[])":{"params":{"capabilityKeys":"Array of capability keys","capabilityValues":"Array of capability values","description":"Provider description (max 256 chars)","name":"Provider name (optional, max 128 chars)","payee":"Address that will receive payments (cannot be changed after registration)","productData":"The encoded product configuration data","productType":"The type of product to register"},"returns":{"providerId":"The unique ID assigned to the provider"}},"removeProduct(uint8)":{"params":{"productType":"The type of product to remove"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])":{"params":{"capabilityKeys":"Array of capability keys (max 32 chars each, max 10 keys)","capabilityValues":"Array of capability values (max 128 chars each, max 10 values)","pdpOffering":"The new PDP service configuration"}},"updateProduct(uint8,bytes,string[],string[])":{"params":{"capabilityKeys":"Array of capability keys (max 32 chars each, max 10 keys)","capabilityValues":"Array of capability values (max 128 chars each, max 10 values)","productData":"The new encoded product configuration data","productType":"The type of product to update"}},"updateProviderInfo(string,string)":{"params":{"description":"New provider description (max 256 chars)","name":"New provider name (optional, max 128 chars)"}},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{"BURN_ACTOR()":{"notice":"Burn actor address for burning FIL"},"MAX_CAPABILITIES()":{"notice":"Maximum number of capability key-value pairs per product"},"MAX_CAPABILITY_KEY_LENGTH()":{"notice":"Maximum length for capability keys"},"MAX_CAPABILITY_VALUE_LENGTH()":{"notice":"Maximum length for capability values"},"REGISTRATION_FEE()":{"notice":"Registration fee in attoFIL (5 FIL = 5 * 10^18 attoFIL)"},"VERSION()":{"notice":"Version of the contract implementation"},"activeProductTypeProviderCount(uint8)":{"notice":"Count of active providers offering each product type"},"activeProviderCount()":{"notice":"Count of active providers"},"addProduct(uint8,bytes,string[],string[])":{"notice":"Add a new product to an existing provider"},"addressToProviderId(address)":{"notice":"Address to provider ID lookup"},"constructor":{"notice":"Constructor that disables initializers for the implementation contract"},"decodePDPOffering(bytes)":{"notice":"Decode PDP offering from bytes"},"encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address))":{"notice":"Encode PDP offering to bytes"},"getActiveProvidersByProductType(uint8,uint256,uint256)":{"notice":"Get all active providers that offer a specific product type with pagination"},"getAllActiveProviders(uint256,uint256)":{"notice":"Get all active providers with pagination"},"getNextProviderId()":{"notice":"Returns the next available provider ID"},"getPDPService(uint256)":{"notice":"Get PDP service configuration for a provider (convenience function)"},"getProduct(uint256,uint8)":{"notice":"Get product data for a specific product type"},"getProductCapabilities(uint256,uint8,string[])":{"notice":"Get multiple capability values for a product"},"getProductCapability(uint256,uint8,string)":{"notice":"Get a single capability value for a product"},"getProvider(uint256)":{"notice":"Get complete provider information"},"getProviderByAddress(address)":{"notice":"Get provider info by address"},"getProviderCount()":{"notice":"Get total number of registered providers (including inactive)"},"getProviderIdByAddress(address)":{"notice":"Get provider ID by address"},"getProvidersByProductType(uint8,uint256,uint256)":{"notice":"Get all providers that offer a specific product type with pagination"},"initialize()":{"notice":"Initializes the registry contract"},"isProviderActive(uint256)":{"notice":"Check if a provider is active"},"isRegisteredProvider(address)":{"notice":"Check if an address is a registered provider"},"migrate(string)":{"notice":"Migration function for contract upgrades"},"productCapabilities(uint256,uint8,string)":{"notice":"Capability values mapping for efficient lookups"},"productTypeProviderCount(uint8)":{"notice":"Count of providers (including inactive) offering each product type"},"providerHasProduct(uint256,uint8)":{"notice":"Check if a provider offers a specific product type"},"providerProducts(uint256,uint8)":{"notice":"Provider products mapping (extensible for multiple product types)"},"providers(uint256)":{"notice":"Main registry of providers"},"registerProvider(address,string,string,uint8,bytes,string[],string[])":{"notice":"Register as a new service provider with a specific product type"},"removeProduct(uint8)":{"notice":"Remove a product from a provider"},"removeProvider()":{"notice":"Remove provider registration (soft delete)"},"updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])":{"notice":"Update PDP service configuration with capabilities"},"updateProduct(uint8,bytes,string[],string[])":{"notice":"Update an existing product configuration"},"updateProviderInfo(string,string)":{"notice":"Update provider information"}},"version":1}},"settings":{"remappings":["@fws-payments/=lib/fws-payments/src/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@pdp/=lib/pdp/src/","@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/","@session-key-registry/=lib/session-key-registry/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","fws-payments/=lib/fws-payments/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","pdp/=lib/pdp/src/","pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/","session-key-registry/=lib/session-key-registry/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/ServiceProviderRegistry.sol":"ServiceProviderRegistry"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a","urls":["bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6","dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05","urls":["bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08","dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x574a7451e42724f7de29e2855c392a8a5020acd695169466a18459467d719d63","urls":["bzz-raw://5bc189f63b639ee173dd7b6fecc39baf7113bf161776aea22b34c57fdd1872ec","dweb:/ipfs/QmZAf2VtjDLRULqjJkde6LNsxAg12tUqpPqgUQQZbAjgtZ"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/EIP712Upgradeable.sol":{"keccak256":"0xd5d8ca01aef5be860ca223ddea39bf3c7467ba1a244fe8dcf26bc435e5ca43d3","urls":["bzz-raw://48ff830d6a98a7e108a2309aff6dac9666b91e4003c2c1857957d7d79c6ac513","dweb:/ipfs/QmNc3u2K11tshKxAmLEqjoxJ6eAFEiPAccwkr1RsWvsF3H"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol":{"keccak256":"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486","urls":["bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d","dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d","urls":["bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196","dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x8decfa54cec979c824b044b8128cd91d713f72c71fd7dfa54974624d8c949898","urls":["bzz-raw://271f914261a19d87117a777e0924ada545c16191ef9b00cc40b0134fc14ebc70","dweb:/ipfs/QmdvVNWHGHQrGGPonZJs5NuzTevTjZRM2zayKrDJf7WBA2"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7","urls":["bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db","dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0x06871a0948d0fed9316ae59ee4368527e144911f5e284755312b5bfcde8b27ea","urls":["bzz-raw://3c30e46d061d8a450c561935a1236b1885aa76ffab93a19b26dcb8868c839843","dweb:/ipfs/QmZbWbeDyixTyYkVtJvuiQYfkQz12pS7zxWZF3Ju9PYwGH"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"keccak256":"0x104c579d98591d36dfe190bdad391c79c358d399ee18d76e877c30b94d3c07a0","urls":["bzz-raw://332ab9adbc9a985195d56832159d09417ed5674adbbd6189db74586110aabc59","dweb:/ipfs/QmZNVeVa4b7iKyFbHjvKir45RGBM93T7Yjgg9ye6Hu2umd"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631","urls":["bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59","dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6","urls":["bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3","dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"],"license":"MIT"},"src/Errors.sol":{"keccak256":"0x27464ca1552086c6a7a7b0b069a66dcb3cb3d1db945570fa1120699ee151104a","urls":["bzz-raw://8b2968e69dbb37a9b63b62196b3a87997a1453a410a0769af77701543061a2ef","dweb:/ipfs/QmVrRCRtZeynQ6wtM9KFRKVQXDSHWUEt8CBo99Hoz5WrGH"],"license":"Apache-2.0 OR MIT"},"src/ServiceProviderRegistry.sol":{"keccak256":"0xfbd35734ef7436df8c3407c4fd64d74bf28a35ddcb427bc300282327034c03b7","urls":["bzz-raw://c843026d23f17f082224ab2d0bd25168c41b1fa74675359f43fb0ac0d2e2152f","dweb:/ipfs/QmNdVVEbhvgYaABPAwMAUtcYRw9zi49bukN2HPuwH7rhRv"],"license":"Apache-2.0 OR MIT"},"src/ServiceProviderRegistryStorage.sol":{"keccak256":"0x8b24b4146fc5220b5f5beb603df1397feb6f54cc7a44c15031ae97b914debe2d","urls":["bzz-raw://453b1930c213530204b8f56ad298610748b2dd81fcf053e672f588722dfea4d9","dweb:/ipfs/QmTGWoNgMYLYLtTv5p9LQMcYWGpdEH2eB7KdpQsm6srM53"],"license":"Apache-2.0 OR MIT"}},"version":1},"id":85} \ No newline at end of file diff --git a/pdp/contract/ServiceProviderRegistryStorage.abi b/pdp/contract/ServiceProviderRegistryStorage.abi new file mode 100644 index 000000000..9fd2ab3bd --- /dev/null +++ b/pdp/contract/ServiceProviderRegistryStorage.abi @@ -0,0 +1,179 @@ +[ + { + "type": "function", + "name": "activeProductTypeProviderCount", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "activeProviderCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addressToProviderId", + "inputs": [ + { + "name": "providerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "productCapabilities", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "key", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "value", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "productTypeProviderCount", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providerProducts", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providers", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + } +] diff --git a/pdp/contract/ServiceProviderRegistryStorage.go b/pdp/contract/ServiceProviderRegistryStorage.go new file mode 100644 index 000000000..4a79fb23b --- /dev/null +++ b/pdp/contract/ServiceProviderRegistryStorage.go @@ -0,0 +1,451 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ServiceProviderRegistryStorageMetaData contains all meta data concerning the ServiceProviderRegistryStorage contract. +var ServiceProviderRegistryStorageMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"activeProductTypeProviderCount\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeProviderCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressToProviderId\",\"inputs\":[{\"name\":\"providerAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"productCapabilities\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"key\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"value\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"productTypeProviderCount\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerProducts\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providers\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", +} + +// ServiceProviderRegistryStorageABI is the input ABI used to generate the binding from. +// Deprecated: Use ServiceProviderRegistryStorageMetaData.ABI instead. +var ServiceProviderRegistryStorageABI = ServiceProviderRegistryStorageMetaData.ABI + +// ServiceProviderRegistryStorage is an auto generated Go binding around an Ethereum contract. +type ServiceProviderRegistryStorage struct { + ServiceProviderRegistryStorageCaller // Read-only binding to the contract + ServiceProviderRegistryStorageTransactor // Write-only binding to the contract + ServiceProviderRegistryStorageFilterer // Log filterer for contract events +} + +// ServiceProviderRegistryStorageCaller is an auto generated read-only Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryStorageTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ServiceProviderRegistryStorageFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryStorageSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ServiceProviderRegistryStorageSession struct { + Contract *ServiceProviderRegistryStorage // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ServiceProviderRegistryStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ServiceProviderRegistryStorageCallerSession struct { + Contract *ServiceProviderRegistryStorageCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ServiceProviderRegistryStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ServiceProviderRegistryStorageTransactorSession struct { + Contract *ServiceProviderRegistryStorageTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ServiceProviderRegistryStorageRaw is an auto generated low-level Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageRaw struct { + Contract *ServiceProviderRegistryStorage // Generic contract binding to access the raw methods on +} + +// ServiceProviderRegistryStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageCallerRaw struct { + Contract *ServiceProviderRegistryStorageCaller // Generic read-only contract binding to access the raw methods on +} + +// ServiceProviderRegistryStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageTransactorRaw struct { + Contract *ServiceProviderRegistryStorageTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewServiceProviderRegistryStorage creates a new instance of ServiceProviderRegistryStorage, bound to a specific deployed contract. +func NewServiceProviderRegistryStorage(address common.Address, backend bind.ContractBackend) (*ServiceProviderRegistryStorage, error) { + contract, err := bindServiceProviderRegistryStorage(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryStorage{ServiceProviderRegistryStorageCaller: ServiceProviderRegistryStorageCaller{contract: contract}, ServiceProviderRegistryStorageTransactor: ServiceProviderRegistryStorageTransactor{contract: contract}, ServiceProviderRegistryStorageFilterer: ServiceProviderRegistryStorageFilterer{contract: contract}}, nil +} + +// NewServiceProviderRegistryStorageCaller creates a new read-only instance of ServiceProviderRegistryStorage, bound to a specific deployed contract. +func NewServiceProviderRegistryStorageCaller(address common.Address, caller bind.ContractCaller) (*ServiceProviderRegistryStorageCaller, error) { + contract, err := bindServiceProviderRegistryStorage(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryStorageCaller{contract: contract}, nil +} + +// NewServiceProviderRegistryStorageTransactor creates a new write-only instance of ServiceProviderRegistryStorage, bound to a specific deployed contract. +func NewServiceProviderRegistryStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*ServiceProviderRegistryStorageTransactor, error) { + contract, err := bindServiceProviderRegistryStorage(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryStorageTransactor{contract: contract}, nil +} + +// NewServiceProviderRegistryStorageFilterer creates a new log filterer instance of ServiceProviderRegistryStorage, bound to a specific deployed contract. +func NewServiceProviderRegistryStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*ServiceProviderRegistryStorageFilterer, error) { + contract, err := bindServiceProviderRegistryStorage(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryStorageFilterer{contract: contract}, nil +} + +// bindServiceProviderRegistryStorage binds a generic wrapper to an already deployed contract. +func bindServiceProviderRegistryStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ServiceProviderRegistryStorageMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ServiceProviderRegistryStorage.Contract.ServiceProviderRegistryStorageCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistryStorage.Contract.ServiceProviderRegistryStorageTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ServiceProviderRegistryStorage.Contract.ServiceProviderRegistryStorageTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ServiceProviderRegistryStorage.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistryStorage.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ServiceProviderRegistryStorage.Contract.contract.Transact(opts, method, params...) +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ActiveProductTypeProviderCount(opts *bind.CallOpts, productType uint8) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "activeProductTypeProviderCount", productType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ActiveProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ActiveProductTypeProviderCount(&_ServiceProviderRegistryStorage.CallOpts, productType) +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ActiveProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ActiveProductTypeProviderCount(&_ServiceProviderRegistryStorage.CallOpts, productType) +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ActiveProviderCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "activeProviderCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ActiveProviderCount() (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ActiveProviderCount(&_ServiceProviderRegistryStorage.CallOpts) +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ActiveProviderCount() (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ActiveProviderCount(&_ServiceProviderRegistryStorage.CallOpts) +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) AddressToProviderId(opts *bind.CallOpts, providerAddress common.Address) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "addressToProviderId", providerAddress) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) AddressToProviderId(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.AddressToProviderId(&_ServiceProviderRegistryStorage.CallOpts, providerAddress) +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) AddressToProviderId(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.AddressToProviderId(&_ServiceProviderRegistryStorage.CallOpts, providerAddress) +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ProductCapabilities(opts *bind.CallOpts, providerId *big.Int, productType uint8, key string) (string, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "productCapabilities", providerId, productType, key) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ProductCapabilities(providerId *big.Int, productType uint8, key string) (string, error) { + return _ServiceProviderRegistryStorage.Contract.ProductCapabilities(&_ServiceProviderRegistryStorage.CallOpts, providerId, productType, key) +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ProductCapabilities(providerId *big.Int, productType uint8, key string) (string, error) { + return _ServiceProviderRegistryStorage.Contract.ProductCapabilities(&_ServiceProviderRegistryStorage.CallOpts, providerId, productType, key) +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ProductTypeProviderCount(opts *bind.CallOpts, productType uint8) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "productTypeProviderCount", productType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ProductTypeProviderCount(&_ServiceProviderRegistryStorage.CallOpts, productType) +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ProductTypeProviderCount(&_ServiceProviderRegistryStorage.CallOpts, productType) +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ProviderProducts(opts *bind.CallOpts, providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "providerProducts", providerId, productType) + + outstruct := new(struct { + ProductType uint8 + ProductData []byte + IsActive bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProductType = *abi.ConvertType(out[0], new(uint8)).(*uint8) + outstruct.ProductData = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + + return *outstruct, err + +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ProviderProducts(providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + return _ServiceProviderRegistryStorage.Contract.ProviderProducts(&_ServiceProviderRegistryStorage.CallOpts, providerId, productType) +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ProviderProducts(providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + return _ServiceProviderRegistryStorage.Contract.ProviderProducts(&_ServiceProviderRegistryStorage.CallOpts, providerId, productType) +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) Providers(opts *bind.CallOpts, providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "providers", providerId) + + outstruct := new(struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.ServiceProvider = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.Payee = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.Name = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.Description = *abi.ConvertType(out[3], new(string)).(*string) + outstruct.IsActive = *abi.ConvertType(out[4], new(bool)).(*bool) + outstruct.ProviderId = *abi.ConvertType(out[5], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) Providers(providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + return _ServiceProviderRegistryStorage.Contract.Providers(&_ServiceProviderRegistryStorage.CallOpts, providerId) +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) Providers(providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + return _ServiceProviderRegistryStorage.Contract.Providers(&_ServiceProviderRegistryStorage.CallOpts, providerId) +} diff --git a/pdp/contract/ServiceProviderRegistryStorage.json b/pdp/contract/ServiceProviderRegistryStorage.json new file mode 100644 index 000000000..f2a82a96f --- /dev/null +++ b/pdp/contract/ServiceProviderRegistryStorage.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"activeProductTypeProviderCount","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"activeProviderCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addressToProviderId","inputs":[{"name":"providerAddress","type":"address","internalType":"address"}],"outputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"productCapabilities","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"productTypeProviderCount","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"providerProducts","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"providers","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"bytecode":{"object":"0x6080806040523460155761054d908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081634368bafb146102fb5750806350f3fc811461025a5780636bf6d74f1461012c5780638bdc7747146100f9578063e459382f146100c6578063e835440e1461008a5763f08bbda014610069575f80fd5b34610086575f366003190112610086576020600754604051908152f35b5f80fd5b34610086576020366003190112610086576004356001600160a01b03811690819003610086575f526003602052602060405f2054604051908152f35b34610086576020366003190112610086576004356001811015610086575f526005602052602060405f2054604051908152f35b34610086576020366003190112610086576004356001811015610086575f526006602052602060405f2054604051908152f35b3461008657604036600319011261008657602435600181101561008657610160906004355f52600260205260405f20610405565b60ff81541690600181019060405180925f9080549061017e8261041b565b808552916001811690811561023257506001146101f2575b5050916101a960039260ff9403856103e3565b0154166040519260018110156101de5783926101d29184526060602085015260608401906104f3565b90151560408301520390f35b634e487b7160e01b5f52602160045260245ffd5b5f908152602081209092505b81831061021657505081016020016101a96003610196565b60209193508060019154838589010152019101909184926101fe565b60ff191660208087019190915292151560051b850190920192506101a9915060039050610196565b34610086576020366003190112610086576004355f9081526001602081905260409091208054918101546001600160a01b0390811692169061029e60028201610453565b6102ea6102ad60038401610453565b6102dc600560ff600487015416950154936040519788978852602088015260c0604088015260c08701906104f3565b9085820360608701526104f3565b911515608084015260a08301520390f35b34610086576060366003190112610086576024356001811015610086576044359167ffffffffffffffff8311610086573660238401121561008657826004013567ffffffffffffffff81116103cf5761035e601f8201601f1916602001836103e3565b808252602082019136602483870101116100865761039e6103b7945f602085819660246103cb9b018937850101526004355f526004845260405f20610405565b604051938492518091845e820190815203019020610453565b6040519182916020835260208301906104f3565b0390f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176103cf57604052565b9060018110156101de575f5260205260405f2090565b90600182811c92168015610449575b602083101461043557565b634e487b7160e01b5f52602260045260245ffd5b91607f169161042a565b9060405191825f8254926104668461041b565b80845293600181169081156104d1575060011461048d575b5061048b925003836103e3565b565b90505f9291925260205f20905f915b8183106104b557505090602061048b928201015f61047e565b602091935080600191548385890101520191019091849261049c565b90506020925061048b94915060ff191682840152151560051b8201015f61047e565b805180835260209291819084018484015e5f828201840152601f01601f191601019056fea2646970667358221220a0b030b08ca12d83e08e41a5e2c63a011a5c15653efecaea3c75f6fb3b55ec4764736f6c634300081e0033","sourceMap":"341:3418:86:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081634368bafb146102fb5750806350f3fc811461025a5780636bf6d74f1461012c5780638bdc7747146100f9578063e459382f146100c6578063e835440e1461008a5763f08bbda014610069575f80fd5b34610086575f366003190112610086576020600754604051908152f35b5f80fd5b34610086576020366003190112610086576004356001600160a01b03811690819003610086575f526003602052602060405f2054604051908152f35b34610086576020366003190112610086576004356001811015610086575f526005602052602060405f2054604051908152f35b34610086576020366003190112610086576004356001811015610086575f526006602052602060405f2054604051908152f35b3461008657604036600319011261008657602435600181101561008657610160906004355f52600260205260405f20610405565b60ff81541690600181019060405180925f9080549061017e8261041b565b808552916001811690811561023257506001146101f2575b5050916101a960039260ff9403856103e3565b0154166040519260018110156101de5783926101d29184526060602085015260608401906104f3565b90151560408301520390f35b634e487b7160e01b5f52602160045260245ffd5b5f908152602081209092505b81831061021657505081016020016101a96003610196565b60209193508060019154838589010152019101909184926101fe565b60ff191660208087019190915292151560051b850190920192506101a9915060039050610196565b34610086576020366003190112610086576004355f9081526001602081905260409091208054918101546001600160a01b0390811692169061029e60028201610453565b6102ea6102ad60038401610453565b6102dc600560ff600487015416950154936040519788978852602088015260c0604088015260c08701906104f3565b9085820360608701526104f3565b911515608084015260a08301520390f35b34610086576060366003190112610086576024356001811015610086576044359167ffffffffffffffff8311610086573660238401121561008657826004013567ffffffffffffffff81116103cf5761035e601f8201601f1916602001836103e3565b808252602082019136602483870101116100865761039e6103b7945f602085819660246103cb9b018937850101526004355f526004845260405f20610405565b604051938492518091845e820190815203019020610453565b6040519182916020835260208301906104f3565b0390f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176103cf57604052565b9060018110156101de575f5260205260405f2090565b90600182811c92168015610449575b602083101461043557565b634e487b7160e01b5f52602260045260245ffd5b91607f169161042a565b9060405191825f8254926104668461041b565b80845293600181169081156104d1575060011461048d575b5061048b925003836103e3565b565b90505f9291925260205f20905f915b8183106104b557505090602061048b928201015f61047e565b602091935080600191548385890101520191019091849261049c565b90506020925061048b94915060ff191682840152151560051b8201015f61047e565b805180835260209291819084018484015e5f828201840152601f01601f191601019056fea2646970667358221220a0b030b08ca12d83e08e41a5e2c63a011a5c15653efecaea3c75f6fb3b55ec4764736f6c634300081e0033","sourceMap":"341:3418:86:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;3722:34;341:3418;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;-1:-1:-1;;;;;341:3418:86;;;;;;;;;;3050:81;341:3418;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;3429:81;341:3418;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;3586:87;341:3418;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;2892:105;341:3418;;;;;2892:105;341:3418;;;;;2892:105;:::i;:::-;341:3418;;;;2892:105;341:3418;2892:105;;341:3418;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2892:105;341:3418;;;;;;:::i;:::-;2892:105;341:3418;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;341:3418:86;;;;;;-1:-1:-1;;341:3418:86;;;;;2892:105;341:3418;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;;;;;;;-1:-1:-1;341:3418:86;;-1:-1:-1;2892:105:86;;-1:-1:-1;341:3418:86;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;;;;;;;;2736:67;;;341:3418;-1:-1:-1;;;;;341:3418:86;;;;;;2736:67;;;;;:::i;:::-;341:3418;2736:67;;;;;:::i;:::-;341:3418;2736:67;341:3418;;2736:67;;341:3418;;2736:67;;341:3418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3202:137;341:3418;;;;;;;;;;;;;;;;;;;;;;;;;;;3202:137;:::i;:::-;341:3418;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;341:3418:86;;;;-1:-1:-1;341:3418:86;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;341:3418:86;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;341:3418:86;;;;;-1:-1:-1;341:3418:86;;-1:-1:-1;341:3418:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;341:3418:86;;;;;;;;-1:-1:-1;;341:3418:86;;;;:::o","linkReferences":{}},"methodIdentifiers":{"activeProductTypeProviderCount(uint8)":"8bdc7747","activeProviderCount()":"f08bbda0","addressToProviderId(address)":"e835440e","productCapabilities(uint256,uint8,string)":"4368bafb","productTypeProviderCount(uint8)":"e459382f","providerProducts(uint256,uint8)":"6bf6d74f","providers(uint256)":"50f3fc81"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"activeProductTypeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"}],\"name\":\"addressToProviderId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"productCapabilities\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"productTypeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"providerProducts\",\"outputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"providers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"All storage variables are declared here to prevent storage slot collisions during upgrades\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"numProviders\":{\"details\":\"Also used for generating unique provider IDs, where ID 0 is reserved\"}},\"title\":\"ServiceProviderRegistryStorage\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"activeProductTypeProviderCount(uint8)\":{\"notice\":\"Count of active providers offering each product type\"},\"activeProviderCount()\":{\"notice\":\"Count of active providers\"},\"addressToProviderId(address)\":{\"notice\":\"Address to provider ID lookup\"},\"productCapabilities(uint256,uint8,string)\":{\"notice\":\"Capability values mapping for efficient lookups\"},\"productTypeProviderCount(uint8)\":{\"notice\":\"Count of providers (including inactive) offering each product type\"},\"providerProducts(uint256,uint8)\":{\"notice\":\"Provider products mapping (extensible for multiple product types)\"},\"providers(uint256)\":{\"notice\":\"Main registry of providers\"}},\"notice\":\"Centralized storage contract for ServiceProviderRegistry\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ServiceProviderRegistryStorage.sol\":\"ServiceProviderRegistryStorage\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@fws-payments/=lib/fws-payments/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@pdp/=lib/pdp/src/\",\":@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/\",\":@session-key-registry/=lib/session-key-registry/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":fws-payments/=lib/fws-payments/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":pdp/=lib/pdp/src/\",\":pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/\",\":session-key-registry/=lib/session-key-registry/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"src/ServiceProviderRegistryStorage.sol\":{\"keccak256\":\"0x8b24b4146fc5220b5f5beb603df1397feb6f54cc7a44c15031ae97b914debe2d\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://453b1930c213530204b8f56ad298610748b2dd81fcf053e672f588722dfea4d9\",\"dweb:/ipfs/QmTGWoNgMYLYLtTv5p9LQMcYWGpdEH2eB7KdpQsm6srM53\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"activeProductTypeProviderCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"activeProviderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"providerAddress","type":"address"}],"stateMutability":"view","type":"function","name":"addressToProviderId","outputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"string","name":"key","type":"string"}],"stateMutability":"view","type":"function","name":"productCapabilities","outputs":[{"internalType":"string","name":"value","type":"string"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"productTypeProviderCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"providerProducts","outputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"bool","name":"isActive","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"providers","outputs":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"activeProductTypeProviderCount(uint8)":{"notice":"Count of active providers offering each product type"},"activeProviderCount()":{"notice":"Count of active providers"},"addressToProviderId(address)":{"notice":"Address to provider ID lookup"},"productCapabilities(uint256,uint8,string)":{"notice":"Capability values mapping for efficient lookups"},"productTypeProviderCount(uint8)":{"notice":"Count of providers (including inactive) offering each product type"},"providerProducts(uint256,uint8)":{"notice":"Provider products mapping (extensible for multiple product types)"},"providers(uint256)":{"notice":"Main registry of providers"}},"version":1}},"settings":{"remappings":["@fws-payments/=lib/fws-payments/src/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@pdp/=lib/pdp/src/","@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/","@session-key-registry/=lib/session-key-registry/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","fws-payments/=lib/fws-payments/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","pdp/=lib/pdp/src/","pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/","session-key-registry/=lib/session-key-registry/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/ServiceProviderRegistryStorage.sol":"ServiceProviderRegistryStorage"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7","urls":["bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db","dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"],"license":"MIT"},"src/ServiceProviderRegistryStorage.sol":{"keccak256":"0x8b24b4146fc5220b5f5beb603df1397feb6f54cc7a44c15031ae97b914debe2d","urls":["bzz-raw://453b1930c213530204b8f56ad298610748b2dd81fcf053e672f588722dfea4d9","dweb:/ipfs/QmTGWoNgMYLYLtTv5p9LQMcYWGpdEH2eB7KdpQsm6srM53"],"license":"Apache-2.0 OR MIT"}},"version":1},"id":86} \ No newline at end of file diff --git a/pdp/contract/addresses.go b/pdp/contract/addresses.go index 10292f5be..494f38842 100644 --- a/pdp/contract/addresses.go +++ b/pdp/contract/addresses.go @@ -11,20 +11,31 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) +const PDPMainnet = "0x9C65E8E57C98cCc040A3d825556832EA1e9f4Df6" +const PDPCalibnet = "0x4E1e9AB9bf23E9Fe96041E0a2d2f0B99dE27FBb2" +const PDPTestNet = "0x48cFBD69dD996D8e57398d7533d5e5A8d1379225" + type PDPContracts struct { PDPVerifier common.Address } func ContractAddresses() PDPContracts { + return PDPContracts{ + PDPVerifier: ConfigurePDPAddress(), + } +} + +func ConfigurePDPAddress() common.Address { switch build.BuildType { case build.BuildCalibnet: - return PDPContracts{ - PDPVerifier: common.HexToAddress("0x5A23b7df87f59A291C26A2A1d684AD03Ce9B68DC"), - } + return common.HexToAddress(PDPCalibnet) case build.BuildMainnet: - return PDPContracts{ - PDPVerifier: common.HexToAddress("0x9C65E8E57C98cCc040A3d825556832EA1e9f4Df6"), + return common.HexToAddress(PDPMainnet) + case build.Build2k, build.BuildDebug: + if !common.IsHexAddress(PDPTestNet) { + panic("PDPTestNet not set") } + return common.HexToAddress(PDPTestNet) default: panic("pdp contracts unknown for this network") } diff --git a/pdp/contract/pdp_proving_schedule.go b/pdp/contract/pdp_proving_schedule.go index 650cc5bdb..be0456667 100644 --- a/pdp/contract/pdp_proving_schedule.go +++ b/pdp/contract/pdp_proving_schedule.go @@ -31,7 +31,7 @@ var ( // IPDPProvingScheduleMetaData contains all meta data concerning the IPDPProvingSchedule contract. var IPDPProvingScheduleMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"challengeWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getChallengesPerProof\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getMaxProvingPeriod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initChallengeWindowStart\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"nextChallengeWindowStart\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", + ABI: "[{\"type\":\"function\",\"name\":\"getPDPConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"maxProvingPeriod\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"challengeWindow\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"challengesPerProof\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"initChallengeWindowStart\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextPDPChallengeWindowStart\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", } // IPDPProvingScheduleABI is the input ABI used to generate the binding from. @@ -180,136 +180,67 @@ func (_IPDPProvingSchedule *IPDPProvingScheduleTransactorRaw) Transact(opts *bin return _IPDPProvingSchedule.Contract.contract.Transact(opts, method, params...) } -// ChallengeWindow is a free data retrieval call binding the contract method 0x861a1412. +// GetPDPConfig is a free data retrieval call binding the contract method 0xea0f9354. // -// Solidity: function challengeWindow() pure returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleCaller) ChallengeWindow(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function getPDPConfig() view returns(uint64 maxProvingPeriod, uint256 challengeWindow, uint256 challengesPerProof, uint256 initChallengeWindowStart) +func (_IPDPProvingSchedule *IPDPProvingScheduleCaller) GetPDPConfig(opts *bind.CallOpts) (struct { + MaxProvingPeriod uint64 + ChallengeWindow *big.Int + ChallengesPerProof *big.Int + InitChallengeWindowStart *big.Int +}, error) { var out []interface{} - err := _IPDPProvingSchedule.contract.Call(opts, &out, "challengeWindow") - + err := _IPDPProvingSchedule.contract.Call(opts, &out, "getPDPConfig") + + outstruct := new(struct { + MaxProvingPeriod uint64 + ChallengeWindow *big.Int + ChallengesPerProof *big.Int + InitChallengeWindowStart *big.Int + }) if err != nil { - return *new(*big.Int), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} + outstruct.MaxProvingPeriod = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.ChallengeWindow = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + outstruct.ChallengesPerProof = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + outstruct.InitChallengeWindowStart = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) -// ChallengeWindow is a free data retrieval call binding the contract method 0x861a1412. -// -// Solidity: function challengeWindow() pure returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleSession) ChallengeWindow() (*big.Int, error) { - return _IPDPProvingSchedule.Contract.ChallengeWindow(&_IPDPProvingSchedule.CallOpts) -} - -// ChallengeWindow is a free data retrieval call binding the contract method 0x861a1412. -// -// Solidity: function challengeWindow() pure returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleCallerSession) ChallengeWindow() (*big.Int, error) { - return _IPDPProvingSchedule.Contract.ChallengeWindow(&_IPDPProvingSchedule.CallOpts) -} - -// GetChallengesPerProof is a free data retrieval call binding the contract method 0x47d3dfe7. -// -// Solidity: function getChallengesPerProof() pure returns(uint64) -func (_IPDPProvingSchedule *IPDPProvingScheduleCaller) GetChallengesPerProof(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _IPDPProvingSchedule.contract.Call(opts, &out, "getChallengesPerProof") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// GetChallengesPerProof is a free data retrieval call binding the contract method 0x47d3dfe7. -// -// Solidity: function getChallengesPerProof() pure returns(uint64) -func (_IPDPProvingSchedule *IPDPProvingScheduleSession) GetChallengesPerProof() (uint64, error) { - return _IPDPProvingSchedule.Contract.GetChallengesPerProof(&_IPDPProvingSchedule.CallOpts) -} - -// GetChallengesPerProof is a free data retrieval call binding the contract method 0x47d3dfe7. -// -// Solidity: function getChallengesPerProof() pure returns(uint64) -func (_IPDPProvingSchedule *IPDPProvingScheduleCallerSession) GetChallengesPerProof() (uint64, error) { - return _IPDPProvingSchedule.Contract.GetChallengesPerProof(&_IPDPProvingSchedule.CallOpts) -} - -// GetMaxProvingPeriod is a free data retrieval call binding the contract method 0xf2f12333. -// -// Solidity: function getMaxProvingPeriod() pure returns(uint64) -func (_IPDPProvingSchedule *IPDPProvingScheduleCaller) GetMaxProvingPeriod(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _IPDPProvingSchedule.contract.Call(opts, &out, "getMaxProvingPeriod") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// GetMaxProvingPeriod is a free data retrieval call binding the contract method 0xf2f12333. -// -// Solidity: function getMaxProvingPeriod() pure returns(uint64) -func (_IPDPProvingSchedule *IPDPProvingScheduleSession) GetMaxProvingPeriod() (uint64, error) { - return _IPDPProvingSchedule.Contract.GetMaxProvingPeriod(&_IPDPProvingSchedule.CallOpts) -} - -// GetMaxProvingPeriod is a free data retrieval call binding the contract method 0xf2f12333. -// -// Solidity: function getMaxProvingPeriod() pure returns(uint64) -func (_IPDPProvingSchedule *IPDPProvingScheduleCallerSession) GetMaxProvingPeriod() (uint64, error) { - return _IPDPProvingSchedule.Contract.GetMaxProvingPeriod(&_IPDPProvingSchedule.CallOpts) -} - -// InitChallengeWindowStart is a free data retrieval call binding the contract method 0x21918cea. -// -// Solidity: function initChallengeWindowStart() pure returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleCaller) InitChallengeWindowStart(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _IPDPProvingSchedule.contract.Call(opts, &out, "initChallengeWindowStart") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err + return *outstruct, err } -// InitChallengeWindowStart is a free data retrieval call binding the contract method 0x21918cea. +// GetPDPConfig is a free data retrieval call binding the contract method 0xea0f9354. // -// Solidity: function initChallengeWindowStart() pure returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleSession) InitChallengeWindowStart() (*big.Int, error) { - return _IPDPProvingSchedule.Contract.InitChallengeWindowStart(&_IPDPProvingSchedule.CallOpts) +// Solidity: function getPDPConfig() view returns(uint64 maxProvingPeriod, uint256 challengeWindow, uint256 challengesPerProof, uint256 initChallengeWindowStart) +func (_IPDPProvingSchedule *IPDPProvingScheduleSession) GetPDPConfig() (struct { + MaxProvingPeriod uint64 + ChallengeWindow *big.Int + ChallengesPerProof *big.Int + InitChallengeWindowStart *big.Int +}, error) { + return _IPDPProvingSchedule.Contract.GetPDPConfig(&_IPDPProvingSchedule.CallOpts) } -// InitChallengeWindowStart is a free data retrieval call binding the contract method 0x21918cea. +// GetPDPConfig is a free data retrieval call binding the contract method 0xea0f9354. // -// Solidity: function initChallengeWindowStart() pure returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleCallerSession) InitChallengeWindowStart() (*big.Int, error) { - return _IPDPProvingSchedule.Contract.InitChallengeWindowStart(&_IPDPProvingSchedule.CallOpts) +// Solidity: function getPDPConfig() view returns(uint64 maxProvingPeriod, uint256 challengeWindow, uint256 challengesPerProof, uint256 initChallengeWindowStart) +func (_IPDPProvingSchedule *IPDPProvingScheduleCallerSession) GetPDPConfig() (struct { + MaxProvingPeriod uint64 + ChallengeWindow *big.Int + ChallengesPerProof *big.Int + InitChallengeWindowStart *big.Int +}, error) { + return _IPDPProvingSchedule.Contract.GetPDPConfig(&_IPDPProvingSchedule.CallOpts) } -// NextChallengeWindowStart is a free data retrieval call binding the contract method 0x8bf96d28. +// NextPDPChallengeWindowStart is a free data retrieval call binding the contract method 0x11d41294. // -// Solidity: function nextChallengeWindowStart(uint256 setId) view returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleCaller) NextChallengeWindowStart(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { +// Solidity: function nextPDPChallengeWindowStart(uint256 setId) view returns(uint256) +func (_IPDPProvingSchedule *IPDPProvingScheduleCaller) NextPDPChallengeWindowStart(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { var out []interface{} - err := _IPDPProvingSchedule.contract.Call(opts, &out, "nextChallengeWindowStart", setId) + err := _IPDPProvingSchedule.contract.Call(opts, &out, "nextPDPChallengeWindowStart", setId) if err != nil { return *new(*big.Int), err @@ -321,16 +252,16 @@ func (_IPDPProvingSchedule *IPDPProvingScheduleCaller) NextChallengeWindowStart( } -// NextChallengeWindowStart is a free data retrieval call binding the contract method 0x8bf96d28. +// NextPDPChallengeWindowStart is a free data retrieval call binding the contract method 0x11d41294. // -// Solidity: function nextChallengeWindowStart(uint256 setId) view returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleSession) NextChallengeWindowStart(setId *big.Int) (*big.Int, error) { - return _IPDPProvingSchedule.Contract.NextChallengeWindowStart(&_IPDPProvingSchedule.CallOpts, setId) +// Solidity: function nextPDPChallengeWindowStart(uint256 setId) view returns(uint256) +func (_IPDPProvingSchedule *IPDPProvingScheduleSession) NextPDPChallengeWindowStart(setId *big.Int) (*big.Int, error) { + return _IPDPProvingSchedule.Contract.NextPDPChallengeWindowStart(&_IPDPProvingSchedule.CallOpts, setId) } -// NextChallengeWindowStart is a free data retrieval call binding the contract method 0x8bf96d28. +// NextPDPChallengeWindowStart is a free data retrieval call binding the contract method 0x11d41294. // -// Solidity: function nextChallengeWindowStart(uint256 setId) view returns(uint256) -func (_IPDPProvingSchedule *IPDPProvingScheduleCallerSession) NextChallengeWindowStart(setId *big.Int) (*big.Int, error) { - return _IPDPProvingSchedule.Contract.NextChallengeWindowStart(&_IPDPProvingSchedule.CallOpts, setId) +// Solidity: function nextPDPChallengeWindowStart(uint256 setId) view returns(uint256) +func (_IPDPProvingSchedule *IPDPProvingScheduleCallerSession) NextPDPChallengeWindowStart(setId *big.Int) (*big.Int, error) { + return _IPDPProvingSchedule.Contract.NextPDPChallengeWindowStart(&_IPDPProvingSchedule.CallOpts, setId) } diff --git a/pdp/contract/pdp_verifier.go b/pdp/contract/pdp_verifier.go index 64855170e..e1957bdf0 100644 --- a/pdp/contract/pdp_verifier.go +++ b/pdp/contract/pdp_verifier.go @@ -34,27 +34,21 @@ type CidsCid struct { Data []byte } -// PDPVerifierProof is an auto generated low-level Go binding around an user-defined struct. -type PDPVerifierProof struct { - Leaf [32]byte - Proof [][32]byte -} - -// PDPVerifierRootData is an auto generated low-level Go binding around an user-defined struct. -type PDPVerifierRootData struct { - Root CidsCid - RawSize *big.Int +// IPDPTypesPieceIdAndOffset is an auto generated low-level Go binding around an user-defined struct. +type IPDPTypesPieceIdAndOffset struct { + PieceId *big.Int + Offset *big.Int } -// PDPVerifierRootIdAndOffset is an auto generated low-level Go binding around an user-defined struct. -type PDPVerifierRootIdAndOffset struct { - RootId *big.Int - Offset *big.Int +// IPDPTypesProof is an auto generated low-level Go binding around an user-defined struct. +type IPDPTypesProof struct { + Leaf [32]byte + Proof [][32]byte } // PDPVerifierMetaData contains all meta data concerning the PDPVerifier contract. var PDPVerifierMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BURN_ACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EXTRA_DATA_MAX_SIZE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FIL_USD_PRICE_FEED_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"LEAF_SIZE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_ENQUEUED_REMOVALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_ROOT_SIZE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NO_CHALLENGE_SCHEDULED\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NO_PROVEN_EPOCH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PYTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPyth\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RANDOMNESS_PRECOMPILE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_DAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addRoots\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rootData\",\"type\":\"tuple[]\",\"internalType\":\"structPDPVerifier.RootData[]\",\"components\":[{\"name\":\"root\",\"type\":\"tuple\",\"internalType\":\"structCids.Cid\",\"components\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"rawSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateProofFee\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"estimatedGasFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimProofSetOwnership\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createProofSet\",\"inputs\":[{\"name\":\"listenerAddr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"deleteProofSet\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"findRootIds\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"leafIndexs\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structPDPVerifier.RootIdAndOffset[]\",\"components\":[{\"name\":\"rootId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChallengeFinality\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChallengeRange\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFILUSDPrice\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"int32\",\"internalType\":\"int32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextChallengeEpoch\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextProofSetId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextRootId\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProofSetLastProvenEpoch\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProofSetLeafCount\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProofSetListener\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProofSetOwner\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRandomness\",\"inputs\":[{\"name\":\"epoch\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootCid\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rootId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structCids.Cid\",\"components\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootLeafCount\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rootId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getScheduledRemovals\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_challengeFinality\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nextProvingPeriod\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"challengeEpoch\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSetLive\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeProofSetOwner\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provePossession\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structPDPVerifier.Proof[]\",\"components\":[{\"name\":\"leaf\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rootChallengable\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rootId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rootLive\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rootId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"scheduleRemovals\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rootIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"Debug\",\"inputs\":[{\"name\":\"message\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NextProvingPeriod\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challengeEpoch\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"leafCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PossessionProven\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenges\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structPDPVerifier.RootIdAndOffset[]\",\"components\":[{\"name\":\"rootId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofFeePaid\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"price\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"expo\",\"type\":\"int32\",\"indexed\":false,\"internalType\":\"int32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSetCreated\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSetDeleted\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"deletedLeafCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSetEmpty\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSetOwnerChanged\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"oldOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RootsAdded\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rootIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RootsRemoved\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rootIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IndexedError\",\"inputs\":[{\"name\":\"idx\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"msg\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BURN_ACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EXTRA_DATA_MAX_SIZE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FIL_USD_PRICE_FEED_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"LEAF_SIZE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_ENQUEUED_REMOVALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_PIECE_SIZE_LOG2\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NO_CHALLENGE_SCHEDULED\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NO_PROVEN_EPOCH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PYTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPyth\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RANDOMNESS_PRECOMPILE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_DAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addPieces\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pieceData\",\"type\":\"tuple[]\",\"internalType\":\"structCids.Cid[]\",\"components\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateProofFee\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"estimatedGasFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDataSetStorageProvider\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createDataSet\",\"inputs\":[{\"name\":\"listenerAddr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"dataSetLive\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteDataSet\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"findPieceIds\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"leafIndexs\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIPDPTypes.PieceIdAndOffset[]\",\"components\":[{\"name\":\"pieceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getActivePieceCount\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"activeCount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getActivePieces\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"pieces\",\"type\":\"tuple[]\",\"internalType\":\"structCids.Cid[]\",\"components\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"pieceIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"rawSizes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"hasMore\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChallengeFinality\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChallengeRange\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDataSetLastProvenEpoch\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDataSetLeafCount\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDataSetListener\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDataSetStorageProvider\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFILUSDPrice\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"int32\",\"internalType\":\"int32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextChallengeEpoch\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextDataSetId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextPieceId\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPieceCid\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pieceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structCids.Cid\",\"components\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPieceLeafCount\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pieceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRandomness\",\"inputs\":[{\"name\":\"epoch\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getScheduledRemovals\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_challengeFinality\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"migrate\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nextProvingPeriod\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"challengeEpoch\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pieceChallengable\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pieceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pieceLive\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pieceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeDataSetStorageProvider\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newStorageProvider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provePossession\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structIPDPTypes.Proof[]\",\"components\":[{\"name\":\"leaf\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"schedulePieceDeletions\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pieceIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"ContractUpgraded\",\"inputs\":[{\"name\":\"version\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DataSetCreated\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"storageProvider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DataSetDeleted\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"deletedLeafCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DataSetEmpty\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NextProvingPeriod\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challengeEpoch\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"leafCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PiecesAdded\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"pieceIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"pieceCids\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structCids.Cid[]\",\"components\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PiecesRemoved\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"pieceIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PossessionProven\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenges\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structIPDPTypes.PieceIdAndOffset[]\",\"components\":[{\"name\":\"pieceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofFeePaid\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"price\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"expo\",\"type\":\"int32\",\"indexed\":false,\"internalType\":\"int32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StorageProviderChanged\",\"inputs\":[{\"name\":\"setId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"oldStorageProvider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newStorageProvider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IndexedError\",\"inputs\":[{\"name\":\"idx\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"msg\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", } // PDPVerifierABI is the input ABI used to generate the binding from. @@ -358,12 +352,12 @@ func (_PDPVerifier *PDPVerifierCallerSession) MAXENQUEUEDREMOVALS() (*big.Int, e return _PDPVerifier.Contract.MAXENQUEUEDREMOVALS(&_PDPVerifier.CallOpts) } -// MAXROOTSIZE is a free data retrieval call binding the contract method 0x16e2bcd5. +// MAXPIECESIZELOG2 is a free data retrieval call binding the contract method 0xf8eb8276. // -// Solidity: function MAX_ROOT_SIZE() view returns(uint256) -func (_PDPVerifier *PDPVerifierCaller) MAXROOTSIZE(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function MAX_PIECE_SIZE_LOG2() view returns(uint256) +func (_PDPVerifier *PDPVerifierCaller) MAXPIECESIZELOG2(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "MAX_ROOT_SIZE") + err := _PDPVerifier.contract.Call(opts, &out, "MAX_PIECE_SIZE_LOG2") if err != nil { return *new(*big.Int), err @@ -375,18 +369,18 @@ func (_PDPVerifier *PDPVerifierCaller) MAXROOTSIZE(opts *bind.CallOpts) (*big.In } -// MAXROOTSIZE is a free data retrieval call binding the contract method 0x16e2bcd5. +// MAXPIECESIZELOG2 is a free data retrieval call binding the contract method 0xf8eb8276. // -// Solidity: function MAX_ROOT_SIZE() view returns(uint256) -func (_PDPVerifier *PDPVerifierSession) MAXROOTSIZE() (*big.Int, error) { - return _PDPVerifier.Contract.MAXROOTSIZE(&_PDPVerifier.CallOpts) +// Solidity: function MAX_PIECE_SIZE_LOG2() view returns(uint256) +func (_PDPVerifier *PDPVerifierSession) MAXPIECESIZELOG2() (*big.Int, error) { + return _PDPVerifier.Contract.MAXPIECESIZELOG2(&_PDPVerifier.CallOpts) } -// MAXROOTSIZE is a free data retrieval call binding the contract method 0x16e2bcd5. +// MAXPIECESIZELOG2 is a free data retrieval call binding the contract method 0xf8eb8276. // -// Solidity: function MAX_ROOT_SIZE() view returns(uint256) -func (_PDPVerifier *PDPVerifierCallerSession) MAXROOTSIZE() (*big.Int, error) { - return _PDPVerifier.Contract.MAXROOTSIZE(&_PDPVerifier.CallOpts) +// Solidity: function MAX_PIECE_SIZE_LOG2() view returns(uint256) +func (_PDPVerifier *PDPVerifierCallerSession) MAXPIECESIZELOG2() (*big.Int, error) { + return _PDPVerifier.Contract.MAXPIECESIZELOG2(&_PDPVerifier.CallOpts) } // NOCHALLENGESCHEDULED is a free data retrieval call binding the contract method 0x462dd449. @@ -575,6 +569,37 @@ func (_PDPVerifier *PDPVerifierCallerSession) UPGRADEINTERFACEVERSION() (string, return _PDPVerifier.Contract.UPGRADEINTERFACEVERSION(&_PDPVerifier.CallOpts) } +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_PDPVerifier *PDPVerifierCaller) VERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _PDPVerifier.contract.Call(opts, &out, "VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_PDPVerifier *PDPVerifierSession) VERSION() (string, error) { + return _PDPVerifier.Contract.VERSION(&_PDPVerifier.CallOpts) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_PDPVerifier *PDPVerifierCallerSession) VERSION() (string, error) { + return _PDPVerifier.Contract.VERSION(&_PDPVerifier.CallOpts) +} + // CalculateProofFee is a free data retrieval call binding the contract method 0x4903704a. // // Solidity: function calculateProofFee(uint256 setId, uint256 estimatedGasFee) view returns(uint256) @@ -606,35 +631,152 @@ func (_PDPVerifier *PDPVerifierCallerSession) CalculateProofFee(setId *big.Int, return _PDPVerifier.Contract.CalculateProofFee(&_PDPVerifier.CallOpts, setId, estimatedGasFee) } -// FindRootIds is a free data retrieval call binding the contract method 0x0528a55b. +// DataSetLive is a free data retrieval call binding the contract method 0xca759f27. +// +// Solidity: function dataSetLive(uint256 setId) view returns(bool) +func (_PDPVerifier *PDPVerifierCaller) DataSetLive(opts *bind.CallOpts, setId *big.Int) (bool, error) { + var out []interface{} + err := _PDPVerifier.contract.Call(opts, &out, "dataSetLive", setId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// DataSetLive is a free data retrieval call binding the contract method 0xca759f27. +// +// Solidity: function dataSetLive(uint256 setId) view returns(bool) +func (_PDPVerifier *PDPVerifierSession) DataSetLive(setId *big.Int) (bool, error) { + return _PDPVerifier.Contract.DataSetLive(&_PDPVerifier.CallOpts, setId) +} + +// DataSetLive is a free data retrieval call binding the contract method 0xca759f27. +// +// Solidity: function dataSetLive(uint256 setId) view returns(bool) +func (_PDPVerifier *PDPVerifierCallerSession) DataSetLive(setId *big.Int) (bool, error) { + return _PDPVerifier.Contract.DataSetLive(&_PDPVerifier.CallOpts, setId) +} + +// FindPieceIds is a free data retrieval call binding the contract method 0x349c9179. +// +// Solidity: function findPieceIds(uint256 setId, uint256[] leafIndexs) view returns((uint256,uint256)[]) +func (_PDPVerifier *PDPVerifierCaller) FindPieceIds(opts *bind.CallOpts, setId *big.Int, leafIndexs []*big.Int) ([]IPDPTypesPieceIdAndOffset, error) { + var out []interface{} + err := _PDPVerifier.contract.Call(opts, &out, "findPieceIds", setId, leafIndexs) + + if err != nil { + return *new([]IPDPTypesPieceIdAndOffset), err + } + + out0 := *abi.ConvertType(out[0], new([]IPDPTypesPieceIdAndOffset)).(*[]IPDPTypesPieceIdAndOffset) + + return out0, err + +} + +// FindPieceIds is a free data retrieval call binding the contract method 0x349c9179. +// +// Solidity: function findPieceIds(uint256 setId, uint256[] leafIndexs) view returns((uint256,uint256)[]) +func (_PDPVerifier *PDPVerifierSession) FindPieceIds(setId *big.Int, leafIndexs []*big.Int) ([]IPDPTypesPieceIdAndOffset, error) { + return _PDPVerifier.Contract.FindPieceIds(&_PDPVerifier.CallOpts, setId, leafIndexs) +} + +// FindPieceIds is a free data retrieval call binding the contract method 0x349c9179. +// +// Solidity: function findPieceIds(uint256 setId, uint256[] leafIndexs) view returns((uint256,uint256)[]) +func (_PDPVerifier *PDPVerifierCallerSession) FindPieceIds(setId *big.Int, leafIndexs []*big.Int) ([]IPDPTypesPieceIdAndOffset, error) { + return _PDPVerifier.Contract.FindPieceIds(&_PDPVerifier.CallOpts, setId, leafIndexs) +} + +// GetActivePieceCount is a free data retrieval call binding the contract method 0x5353bdfd. // -// Solidity: function findRootIds(uint256 setId, uint256[] leafIndexs) view returns((uint256,uint256)[]) -func (_PDPVerifier *PDPVerifierCaller) FindRootIds(opts *bind.CallOpts, setId *big.Int, leafIndexs []*big.Int) ([]PDPVerifierRootIdAndOffset, error) { +// Solidity: function getActivePieceCount(uint256 setId) view returns(uint256 activeCount) +func (_PDPVerifier *PDPVerifierCaller) GetActivePieceCount(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "findRootIds", setId, leafIndexs) + err := _PDPVerifier.contract.Call(opts, &out, "getActivePieceCount", setId) if err != nil { - return *new([]PDPVerifierRootIdAndOffset), err + return *new(*big.Int), err } - out0 := *abi.ConvertType(out[0], new([]PDPVerifierRootIdAndOffset)).(*[]PDPVerifierRootIdAndOffset) + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err } -// FindRootIds is a free data retrieval call binding the contract method 0x0528a55b. +// GetActivePieceCount is a free data retrieval call binding the contract method 0x5353bdfd. +// +// Solidity: function getActivePieceCount(uint256 setId) view returns(uint256 activeCount) +func (_PDPVerifier *PDPVerifierSession) GetActivePieceCount(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetActivePieceCount(&_PDPVerifier.CallOpts, setId) +} + +// GetActivePieceCount is a free data retrieval call binding the contract method 0x5353bdfd. +// +// Solidity: function getActivePieceCount(uint256 setId) view returns(uint256 activeCount) +func (_PDPVerifier *PDPVerifierCallerSession) GetActivePieceCount(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetActivePieceCount(&_PDPVerifier.CallOpts, setId) +} + +// GetActivePieces is a free data retrieval call binding the contract method 0x39f51544. +// +// Solidity: function getActivePieces(uint256 setId, uint256 offset, uint256 limit) view returns((bytes)[] pieces, uint256[] pieceIds, uint256[] rawSizes, bool hasMore) +func (_PDPVerifier *PDPVerifierCaller) GetActivePieces(opts *bind.CallOpts, setId *big.Int, offset *big.Int, limit *big.Int) (struct { + Pieces []CidsCid + PieceIds []*big.Int + RawSizes []*big.Int + HasMore bool +}, error) { + var out []interface{} + err := _PDPVerifier.contract.Call(opts, &out, "getActivePieces", setId, offset, limit) + + outstruct := new(struct { + Pieces []CidsCid + PieceIds []*big.Int + RawSizes []*big.Int + HasMore bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.Pieces = *abi.ConvertType(out[0], new([]CidsCid)).(*[]CidsCid) + outstruct.PieceIds = *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int) + outstruct.RawSizes = *abi.ConvertType(out[2], new([]*big.Int)).(*[]*big.Int) + outstruct.HasMore = *abi.ConvertType(out[3], new(bool)).(*bool) + + return *outstruct, err + +} + +// GetActivePieces is a free data retrieval call binding the contract method 0x39f51544. // -// Solidity: function findRootIds(uint256 setId, uint256[] leafIndexs) view returns((uint256,uint256)[]) -func (_PDPVerifier *PDPVerifierSession) FindRootIds(setId *big.Int, leafIndexs []*big.Int) ([]PDPVerifierRootIdAndOffset, error) { - return _PDPVerifier.Contract.FindRootIds(&_PDPVerifier.CallOpts, setId, leafIndexs) +// Solidity: function getActivePieces(uint256 setId, uint256 offset, uint256 limit) view returns((bytes)[] pieces, uint256[] pieceIds, uint256[] rawSizes, bool hasMore) +func (_PDPVerifier *PDPVerifierSession) GetActivePieces(setId *big.Int, offset *big.Int, limit *big.Int) (struct { + Pieces []CidsCid + PieceIds []*big.Int + RawSizes []*big.Int + HasMore bool +}, error) { + return _PDPVerifier.Contract.GetActivePieces(&_PDPVerifier.CallOpts, setId, offset, limit) } -// FindRootIds is a free data retrieval call binding the contract method 0x0528a55b. +// GetActivePieces is a free data retrieval call binding the contract method 0x39f51544. // -// Solidity: function findRootIds(uint256 setId, uint256[] leafIndexs) view returns((uint256,uint256)[]) -func (_PDPVerifier *PDPVerifierCallerSession) FindRootIds(setId *big.Int, leafIndexs []*big.Int) ([]PDPVerifierRootIdAndOffset, error) { - return _PDPVerifier.Contract.FindRootIds(&_PDPVerifier.CallOpts, setId, leafIndexs) +// Solidity: function getActivePieces(uint256 setId, uint256 offset, uint256 limit) view returns((bytes)[] pieces, uint256[] pieceIds, uint256[] rawSizes, bool hasMore) +func (_PDPVerifier *PDPVerifierCallerSession) GetActivePieces(setId *big.Int, offset *big.Int, limit *big.Int) (struct { + Pieces []CidsCid + PieceIds []*big.Int + RawSizes []*big.Int + HasMore bool +}, error) { + return _PDPVerifier.Contract.GetActivePieces(&_PDPVerifier.CallOpts, setId, offset, limit) } // GetChallengeFinality is a free data retrieval call binding the contract method 0xf83758fe. @@ -699,44 +841,43 @@ func (_PDPVerifier *PDPVerifierCallerSession) GetChallengeRange(setId *big.Int) return _PDPVerifier.Contract.GetChallengeRange(&_PDPVerifier.CallOpts, setId) } -// GetFILUSDPrice is a free data retrieval call binding the contract method 0x4fa27920. +// GetDataSetLastProvenEpoch is a free data retrieval call binding the contract method 0x04595c1a. // -// Solidity: function getFILUSDPrice() view returns(uint64, int32) -func (_PDPVerifier *PDPVerifierCaller) GetFILUSDPrice(opts *bind.CallOpts) (uint64, int32, error) { +// Solidity: function getDataSetLastProvenEpoch(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCaller) GetDataSetLastProvenEpoch(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getFILUSDPrice") + err := _PDPVerifier.contract.Call(opts, &out, "getDataSetLastProvenEpoch", setId) if err != nil { - return *new(uint64), *new(int32), err + return *new(*big.Int), err } - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - out1 := *abi.ConvertType(out[1], new(int32)).(*int32) + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - return out0, out1, err + return out0, err } -// GetFILUSDPrice is a free data retrieval call binding the contract method 0x4fa27920. +// GetDataSetLastProvenEpoch is a free data retrieval call binding the contract method 0x04595c1a. // -// Solidity: function getFILUSDPrice() view returns(uint64, int32) -func (_PDPVerifier *PDPVerifierSession) GetFILUSDPrice() (uint64, int32, error) { - return _PDPVerifier.Contract.GetFILUSDPrice(&_PDPVerifier.CallOpts) +// Solidity: function getDataSetLastProvenEpoch(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierSession) GetDataSetLastProvenEpoch(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetDataSetLastProvenEpoch(&_PDPVerifier.CallOpts, setId) } -// GetFILUSDPrice is a free data retrieval call binding the contract method 0x4fa27920. +// GetDataSetLastProvenEpoch is a free data retrieval call binding the contract method 0x04595c1a. // -// Solidity: function getFILUSDPrice() view returns(uint64, int32) -func (_PDPVerifier *PDPVerifierCallerSession) GetFILUSDPrice() (uint64, int32, error) { - return _PDPVerifier.Contract.GetFILUSDPrice(&_PDPVerifier.CallOpts) +// Solidity: function getDataSetLastProvenEpoch(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCallerSession) GetDataSetLastProvenEpoch(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetDataSetLastProvenEpoch(&_PDPVerifier.CallOpts, setId) } -// GetNextChallengeEpoch is a free data retrieval call binding the contract method 0x6ba4608f. +// GetDataSetLeafCount is a free data retrieval call binding the contract method 0xa531998c. // -// Solidity: function getNextChallengeEpoch(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCaller) GetNextChallengeEpoch(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { +// Solidity: function getDataSetLeafCount(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCaller) GetDataSetLeafCount(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getNextChallengeEpoch", setId) + err := _PDPVerifier.contract.Call(opts, &out, "getDataSetLeafCount", setId) if err != nil { return *new(*big.Int), err @@ -748,119 +889,121 @@ func (_PDPVerifier *PDPVerifierCaller) GetNextChallengeEpoch(opts *bind.CallOpts } -// GetNextChallengeEpoch is a free data retrieval call binding the contract method 0x6ba4608f. +// GetDataSetLeafCount is a free data retrieval call binding the contract method 0xa531998c. // -// Solidity: function getNextChallengeEpoch(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierSession) GetNextChallengeEpoch(setId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetNextChallengeEpoch(&_PDPVerifier.CallOpts, setId) +// Solidity: function getDataSetLeafCount(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierSession) GetDataSetLeafCount(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetDataSetLeafCount(&_PDPVerifier.CallOpts, setId) } -// GetNextChallengeEpoch is a free data retrieval call binding the contract method 0x6ba4608f. +// GetDataSetLeafCount is a free data retrieval call binding the contract method 0xa531998c. // -// Solidity: function getNextChallengeEpoch(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCallerSession) GetNextChallengeEpoch(setId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetNextChallengeEpoch(&_PDPVerifier.CallOpts, setId) +// Solidity: function getDataSetLeafCount(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCallerSession) GetDataSetLeafCount(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetDataSetLeafCount(&_PDPVerifier.CallOpts, setId) } -// GetNextProofSetId is a free data retrieval call binding the contract method 0x8ea417e5. +// GetDataSetListener is a free data retrieval call binding the contract method 0x2b3129bb. // -// Solidity: function getNextProofSetId() view returns(uint64) -func (_PDPVerifier *PDPVerifierCaller) GetNextProofSetId(opts *bind.CallOpts) (uint64, error) { +// Solidity: function getDataSetListener(uint256 setId) view returns(address) +func (_PDPVerifier *PDPVerifierCaller) GetDataSetListener(opts *bind.CallOpts, setId *big.Int) (common.Address, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getNextProofSetId") + err := _PDPVerifier.contract.Call(opts, &out, "getDataSetListener", setId) if err != nil { - return *new(uint64), err + return *new(common.Address), err } - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err } -// GetNextProofSetId is a free data retrieval call binding the contract method 0x8ea417e5. +// GetDataSetListener is a free data retrieval call binding the contract method 0x2b3129bb. // -// Solidity: function getNextProofSetId() view returns(uint64) -func (_PDPVerifier *PDPVerifierSession) GetNextProofSetId() (uint64, error) { - return _PDPVerifier.Contract.GetNextProofSetId(&_PDPVerifier.CallOpts) +// Solidity: function getDataSetListener(uint256 setId) view returns(address) +func (_PDPVerifier *PDPVerifierSession) GetDataSetListener(setId *big.Int) (common.Address, error) { + return _PDPVerifier.Contract.GetDataSetListener(&_PDPVerifier.CallOpts, setId) } -// GetNextProofSetId is a free data retrieval call binding the contract method 0x8ea417e5. +// GetDataSetListener is a free data retrieval call binding the contract method 0x2b3129bb. // -// Solidity: function getNextProofSetId() view returns(uint64) -func (_PDPVerifier *PDPVerifierCallerSession) GetNextProofSetId() (uint64, error) { - return _PDPVerifier.Contract.GetNextProofSetId(&_PDPVerifier.CallOpts) +// Solidity: function getDataSetListener(uint256 setId) view returns(address) +func (_PDPVerifier *PDPVerifierCallerSession) GetDataSetListener(setId *big.Int) (common.Address, error) { + return _PDPVerifier.Contract.GetDataSetListener(&_PDPVerifier.CallOpts, setId) } -// GetNextRootId is a free data retrieval call binding the contract method 0xd49245c1. +// GetDataSetStorageProvider is a free data retrieval call binding the contract method 0x21b7cd1c. // -// Solidity: function getNextRootId(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCaller) GetNextRootId(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { +// Solidity: function getDataSetStorageProvider(uint256 setId) view returns(address, address) +func (_PDPVerifier *PDPVerifierCaller) GetDataSetStorageProvider(opts *bind.CallOpts, setId *big.Int) (common.Address, common.Address, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getNextRootId", setId) + err := _PDPVerifier.contract.Call(opts, &out, "getDataSetStorageProvider", setId) if err != nil { - return *new(*big.Int), err + return *new(common.Address), *new(common.Address), err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out1 := *abi.ConvertType(out[1], new(common.Address)).(*common.Address) - return out0, err + return out0, out1, err } -// GetNextRootId is a free data retrieval call binding the contract method 0xd49245c1. +// GetDataSetStorageProvider is a free data retrieval call binding the contract method 0x21b7cd1c. // -// Solidity: function getNextRootId(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierSession) GetNextRootId(setId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetNextRootId(&_PDPVerifier.CallOpts, setId) +// Solidity: function getDataSetStorageProvider(uint256 setId) view returns(address, address) +func (_PDPVerifier *PDPVerifierSession) GetDataSetStorageProvider(setId *big.Int) (common.Address, common.Address, error) { + return _PDPVerifier.Contract.GetDataSetStorageProvider(&_PDPVerifier.CallOpts, setId) } -// GetNextRootId is a free data retrieval call binding the contract method 0xd49245c1. +// GetDataSetStorageProvider is a free data retrieval call binding the contract method 0x21b7cd1c. // -// Solidity: function getNextRootId(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCallerSession) GetNextRootId(setId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetNextRootId(&_PDPVerifier.CallOpts, setId) +// Solidity: function getDataSetStorageProvider(uint256 setId) view returns(address, address) +func (_PDPVerifier *PDPVerifierCallerSession) GetDataSetStorageProvider(setId *big.Int) (common.Address, common.Address, error) { + return _PDPVerifier.Contract.GetDataSetStorageProvider(&_PDPVerifier.CallOpts, setId) } -// GetProofSetLastProvenEpoch is a free data retrieval call binding the contract method 0xfaa67163. +// GetFILUSDPrice is a free data retrieval call binding the contract method 0x4fa27920. // -// Solidity: function getProofSetLastProvenEpoch(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCaller) GetProofSetLastProvenEpoch(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { +// Solidity: function getFILUSDPrice() view returns(uint64, int32) +func (_PDPVerifier *PDPVerifierCaller) GetFILUSDPrice(opts *bind.CallOpts) (uint64, int32, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getProofSetLastProvenEpoch", setId) + err := _PDPVerifier.contract.Call(opts, &out, "getFILUSDPrice") if err != nil { - return *new(*big.Int), err + return *new(uint64), *new(int32), err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + out1 := *abi.ConvertType(out[1], new(int32)).(*int32) - return out0, err + return out0, out1, err } -// GetProofSetLastProvenEpoch is a free data retrieval call binding the contract method 0xfaa67163. +// GetFILUSDPrice is a free data retrieval call binding the contract method 0x4fa27920. // -// Solidity: function getProofSetLastProvenEpoch(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierSession) GetProofSetLastProvenEpoch(setId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetProofSetLastProvenEpoch(&_PDPVerifier.CallOpts, setId) +// Solidity: function getFILUSDPrice() view returns(uint64, int32) +func (_PDPVerifier *PDPVerifierSession) GetFILUSDPrice() (uint64, int32, error) { + return _PDPVerifier.Contract.GetFILUSDPrice(&_PDPVerifier.CallOpts) } -// GetProofSetLastProvenEpoch is a free data retrieval call binding the contract method 0xfaa67163. +// GetFILUSDPrice is a free data retrieval call binding the contract method 0x4fa27920. // -// Solidity: function getProofSetLastProvenEpoch(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCallerSession) GetProofSetLastProvenEpoch(setId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetProofSetLastProvenEpoch(&_PDPVerifier.CallOpts, setId) +// Solidity: function getFILUSDPrice() view returns(uint64, int32) +func (_PDPVerifier *PDPVerifierCallerSession) GetFILUSDPrice() (uint64, int32, error) { + return _PDPVerifier.Contract.GetFILUSDPrice(&_PDPVerifier.CallOpts) } -// GetProofSetLeafCount is a free data retrieval call binding the contract method 0x3f84135f. +// GetNextChallengeEpoch is a free data retrieval call binding the contract method 0x6ba4608f. // -// Solidity: function getProofSetLeafCount(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCaller) GetProofSetLeafCount(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { +// Solidity: function getNextChallengeEpoch(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCaller) GetNextChallengeEpoch(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getProofSetLeafCount", setId) + err := _PDPVerifier.contract.Call(opts, &out, "getNextChallengeEpoch", setId) if err != nil { return *new(*big.Int), err @@ -872,151 +1015,150 @@ func (_PDPVerifier *PDPVerifierCaller) GetProofSetLeafCount(opts *bind.CallOpts, } -// GetProofSetLeafCount is a free data retrieval call binding the contract method 0x3f84135f. +// GetNextChallengeEpoch is a free data retrieval call binding the contract method 0x6ba4608f. // -// Solidity: function getProofSetLeafCount(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierSession) GetProofSetLeafCount(setId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetProofSetLeafCount(&_PDPVerifier.CallOpts, setId) +// Solidity: function getNextChallengeEpoch(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierSession) GetNextChallengeEpoch(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetNextChallengeEpoch(&_PDPVerifier.CallOpts, setId) } -// GetProofSetLeafCount is a free data retrieval call binding the contract method 0x3f84135f. +// GetNextChallengeEpoch is a free data retrieval call binding the contract method 0x6ba4608f. // -// Solidity: function getProofSetLeafCount(uint256 setId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCallerSession) GetProofSetLeafCount(setId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetProofSetLeafCount(&_PDPVerifier.CallOpts, setId) +// Solidity: function getNextChallengeEpoch(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCallerSession) GetNextChallengeEpoch(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetNextChallengeEpoch(&_PDPVerifier.CallOpts, setId) } -// GetProofSetListener is a free data retrieval call binding the contract method 0x31601226. +// GetNextDataSetId is a free data retrieval call binding the contract method 0x442cded3. // -// Solidity: function getProofSetListener(uint256 setId) view returns(address) -func (_PDPVerifier *PDPVerifierCaller) GetProofSetListener(opts *bind.CallOpts, setId *big.Int) (common.Address, error) { +// Solidity: function getNextDataSetId() view returns(uint64) +func (_PDPVerifier *PDPVerifierCaller) GetNextDataSetId(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getProofSetListener", setId) + err := _PDPVerifier.contract.Call(opts, &out, "getNextDataSetId") if err != nil { - return *new(common.Address), err + return *new(uint64), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err } -// GetProofSetListener is a free data retrieval call binding the contract method 0x31601226. +// GetNextDataSetId is a free data retrieval call binding the contract method 0x442cded3. // -// Solidity: function getProofSetListener(uint256 setId) view returns(address) -func (_PDPVerifier *PDPVerifierSession) GetProofSetListener(setId *big.Int) (common.Address, error) { - return _PDPVerifier.Contract.GetProofSetListener(&_PDPVerifier.CallOpts, setId) +// Solidity: function getNextDataSetId() view returns(uint64) +func (_PDPVerifier *PDPVerifierSession) GetNextDataSetId() (uint64, error) { + return _PDPVerifier.Contract.GetNextDataSetId(&_PDPVerifier.CallOpts) } -// GetProofSetListener is a free data retrieval call binding the contract method 0x31601226. +// GetNextDataSetId is a free data retrieval call binding the contract method 0x442cded3. // -// Solidity: function getProofSetListener(uint256 setId) view returns(address) -func (_PDPVerifier *PDPVerifierCallerSession) GetProofSetListener(setId *big.Int) (common.Address, error) { - return _PDPVerifier.Contract.GetProofSetListener(&_PDPVerifier.CallOpts, setId) +// Solidity: function getNextDataSetId() view returns(uint64) +func (_PDPVerifier *PDPVerifierCallerSession) GetNextDataSetId() (uint64, error) { + return _PDPVerifier.Contract.GetNextDataSetId(&_PDPVerifier.CallOpts) } -// GetProofSetOwner is a free data retrieval call binding the contract method 0x4726075b. +// GetNextPieceId is a free data retrieval call binding the contract method 0x1c5ae80f. // -// Solidity: function getProofSetOwner(uint256 setId) view returns(address, address) -func (_PDPVerifier *PDPVerifierCaller) GetProofSetOwner(opts *bind.CallOpts, setId *big.Int) (common.Address, common.Address, error) { +// Solidity: function getNextPieceId(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCaller) GetNextPieceId(opts *bind.CallOpts, setId *big.Int) (*big.Int, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getProofSetOwner", setId) + err := _PDPVerifier.contract.Call(opts, &out, "getNextPieceId", setId) if err != nil { - return *new(common.Address), *new(common.Address), err + return *new(*big.Int), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - out1 := *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - return out0, out1, err + return out0, err } -// GetProofSetOwner is a free data retrieval call binding the contract method 0x4726075b. +// GetNextPieceId is a free data retrieval call binding the contract method 0x1c5ae80f. // -// Solidity: function getProofSetOwner(uint256 setId) view returns(address, address) -func (_PDPVerifier *PDPVerifierSession) GetProofSetOwner(setId *big.Int) (common.Address, common.Address, error) { - return _PDPVerifier.Contract.GetProofSetOwner(&_PDPVerifier.CallOpts, setId) +// Solidity: function getNextPieceId(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierSession) GetNextPieceId(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetNextPieceId(&_PDPVerifier.CallOpts, setId) } -// GetProofSetOwner is a free data retrieval call binding the contract method 0x4726075b. +// GetNextPieceId is a free data retrieval call binding the contract method 0x1c5ae80f. // -// Solidity: function getProofSetOwner(uint256 setId) view returns(address, address) -func (_PDPVerifier *PDPVerifierCallerSession) GetProofSetOwner(setId *big.Int) (common.Address, common.Address, error) { - return _PDPVerifier.Contract.GetProofSetOwner(&_PDPVerifier.CallOpts, setId) +// Solidity: function getNextPieceId(uint256 setId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCallerSession) GetNextPieceId(setId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetNextPieceId(&_PDPVerifier.CallOpts, setId) } -// GetRandomness is a free data retrieval call binding the contract method 0x453f4f62. +// GetPieceCid is a free data retrieval call binding the contract method 0x25bbbedf. // -// Solidity: function getRandomness(uint256 epoch) view returns(uint256) -func (_PDPVerifier *PDPVerifierCaller) GetRandomness(opts *bind.CallOpts, epoch *big.Int) (*big.Int, error) { +// Solidity: function getPieceCid(uint256 setId, uint256 pieceId) view returns((bytes)) +func (_PDPVerifier *PDPVerifierCaller) GetPieceCid(opts *bind.CallOpts, setId *big.Int, pieceId *big.Int) (CidsCid, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getRandomness", epoch) + err := _PDPVerifier.contract.Call(opts, &out, "getPieceCid", setId, pieceId) if err != nil { - return *new(*big.Int), err + return *new(CidsCid), err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out0 := *abi.ConvertType(out[0], new(CidsCid)).(*CidsCid) return out0, err } -// GetRandomness is a free data retrieval call binding the contract method 0x453f4f62. +// GetPieceCid is a free data retrieval call binding the contract method 0x25bbbedf. // -// Solidity: function getRandomness(uint256 epoch) view returns(uint256) -func (_PDPVerifier *PDPVerifierSession) GetRandomness(epoch *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetRandomness(&_PDPVerifier.CallOpts, epoch) +// Solidity: function getPieceCid(uint256 setId, uint256 pieceId) view returns((bytes)) +func (_PDPVerifier *PDPVerifierSession) GetPieceCid(setId *big.Int, pieceId *big.Int) (CidsCid, error) { + return _PDPVerifier.Contract.GetPieceCid(&_PDPVerifier.CallOpts, setId, pieceId) } -// GetRandomness is a free data retrieval call binding the contract method 0x453f4f62. +// GetPieceCid is a free data retrieval call binding the contract method 0x25bbbedf. // -// Solidity: function getRandomness(uint256 epoch) view returns(uint256) -func (_PDPVerifier *PDPVerifierCallerSession) GetRandomness(epoch *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetRandomness(&_PDPVerifier.CallOpts, epoch) +// Solidity: function getPieceCid(uint256 setId, uint256 pieceId) view returns((bytes)) +func (_PDPVerifier *PDPVerifierCallerSession) GetPieceCid(setId *big.Int, pieceId *big.Int) (CidsCid, error) { + return _PDPVerifier.Contract.GetPieceCid(&_PDPVerifier.CallOpts, setId, pieceId) } -// GetRootCid is a free data retrieval call binding the contract method 0x3b7ae913. +// GetPieceLeafCount is a free data retrieval call binding the contract method 0x0cd7b880. // -// Solidity: function getRootCid(uint256 setId, uint256 rootId) view returns((bytes)) -func (_PDPVerifier *PDPVerifierCaller) GetRootCid(opts *bind.CallOpts, setId *big.Int, rootId *big.Int) (CidsCid, error) { +// Solidity: function getPieceLeafCount(uint256 setId, uint256 pieceId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCaller) GetPieceLeafCount(opts *bind.CallOpts, setId *big.Int, pieceId *big.Int) (*big.Int, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getRootCid", setId, rootId) + err := _PDPVerifier.contract.Call(opts, &out, "getPieceLeafCount", setId, pieceId) if err != nil { - return *new(CidsCid), err + return *new(*big.Int), err } - out0 := *abi.ConvertType(out[0], new(CidsCid)).(*CidsCid) + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err } -// GetRootCid is a free data retrieval call binding the contract method 0x3b7ae913. +// GetPieceLeafCount is a free data retrieval call binding the contract method 0x0cd7b880. // -// Solidity: function getRootCid(uint256 setId, uint256 rootId) view returns((bytes)) -func (_PDPVerifier *PDPVerifierSession) GetRootCid(setId *big.Int, rootId *big.Int) (CidsCid, error) { - return _PDPVerifier.Contract.GetRootCid(&_PDPVerifier.CallOpts, setId, rootId) +// Solidity: function getPieceLeafCount(uint256 setId, uint256 pieceId) view returns(uint256) +func (_PDPVerifier *PDPVerifierSession) GetPieceLeafCount(setId *big.Int, pieceId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetPieceLeafCount(&_PDPVerifier.CallOpts, setId, pieceId) } -// GetRootCid is a free data retrieval call binding the contract method 0x3b7ae913. +// GetPieceLeafCount is a free data retrieval call binding the contract method 0x0cd7b880. // -// Solidity: function getRootCid(uint256 setId, uint256 rootId) view returns((bytes)) -func (_PDPVerifier *PDPVerifierCallerSession) GetRootCid(setId *big.Int, rootId *big.Int) (CidsCid, error) { - return _PDPVerifier.Contract.GetRootCid(&_PDPVerifier.CallOpts, setId, rootId) +// Solidity: function getPieceLeafCount(uint256 setId, uint256 pieceId) view returns(uint256) +func (_PDPVerifier *PDPVerifierCallerSession) GetPieceLeafCount(setId *big.Int, pieceId *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetPieceLeafCount(&_PDPVerifier.CallOpts, setId, pieceId) } -// GetRootLeafCount is a free data retrieval call binding the contract method 0x9153e64b. +// GetRandomness is a free data retrieval call binding the contract method 0x453f4f62. // -// Solidity: function getRootLeafCount(uint256 setId, uint256 rootId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCaller) GetRootLeafCount(opts *bind.CallOpts, setId *big.Int, rootId *big.Int) (*big.Int, error) { +// Solidity: function getRandomness(uint256 epoch) view returns(uint256) +func (_PDPVerifier *PDPVerifierCaller) GetRandomness(opts *bind.CallOpts, epoch *big.Int) (*big.Int, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "getRootLeafCount", setId, rootId) + err := _PDPVerifier.contract.Call(opts, &out, "getRandomness", epoch) if err != nil { return *new(*big.Int), err @@ -1028,18 +1170,18 @@ func (_PDPVerifier *PDPVerifierCaller) GetRootLeafCount(opts *bind.CallOpts, set } -// GetRootLeafCount is a free data retrieval call binding the contract method 0x9153e64b. +// GetRandomness is a free data retrieval call binding the contract method 0x453f4f62. // -// Solidity: function getRootLeafCount(uint256 setId, uint256 rootId) view returns(uint256) -func (_PDPVerifier *PDPVerifierSession) GetRootLeafCount(setId *big.Int, rootId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetRootLeafCount(&_PDPVerifier.CallOpts, setId, rootId) +// Solidity: function getRandomness(uint256 epoch) view returns(uint256) +func (_PDPVerifier *PDPVerifierSession) GetRandomness(epoch *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetRandomness(&_PDPVerifier.CallOpts, epoch) } -// GetRootLeafCount is a free data retrieval call binding the contract method 0x9153e64b. +// GetRandomness is a free data retrieval call binding the contract method 0x453f4f62. // -// Solidity: function getRootLeafCount(uint256 setId, uint256 rootId) view returns(uint256) -func (_PDPVerifier *PDPVerifierCallerSession) GetRootLeafCount(setId *big.Int, rootId *big.Int) (*big.Int, error) { - return _PDPVerifier.Contract.GetRootLeafCount(&_PDPVerifier.CallOpts, setId, rootId) +// Solidity: function getRandomness(uint256 epoch) view returns(uint256) +func (_PDPVerifier *PDPVerifierCallerSession) GetRandomness(epoch *big.Int) (*big.Int, error) { + return _PDPVerifier.Contract.GetRandomness(&_PDPVerifier.CallOpts, epoch) } // GetScheduledRemovals is a free data retrieval call binding the contract method 0x6fa44692. @@ -1104,12 +1246,12 @@ func (_PDPVerifier *PDPVerifierCallerSession) Owner() (common.Address, error) { return _PDPVerifier.Contract.Owner(&_PDPVerifier.CallOpts) } -// ProofSetLive is a free data retrieval call binding the contract method 0xf5cac1ba. +// PieceChallengable is a free data retrieval call binding the contract method 0xdc635266. // -// Solidity: function proofSetLive(uint256 setId) view returns(bool) -func (_PDPVerifier *PDPVerifierCaller) ProofSetLive(opts *bind.CallOpts, setId *big.Int) (bool, error) { +// Solidity: function pieceChallengable(uint256 setId, uint256 pieceId) view returns(bool) +func (_PDPVerifier *PDPVerifierCaller) PieceChallengable(opts *bind.CallOpts, setId *big.Int, pieceId *big.Int) (bool, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "proofSetLive", setId) + err := _PDPVerifier.contract.Call(opts, &out, "pieceChallengable", setId, pieceId) if err != nil { return *new(bool), err @@ -1121,57 +1263,26 @@ func (_PDPVerifier *PDPVerifierCaller) ProofSetLive(opts *bind.CallOpts, setId * } -// ProofSetLive is a free data retrieval call binding the contract method 0xf5cac1ba. -// -// Solidity: function proofSetLive(uint256 setId) view returns(bool) -func (_PDPVerifier *PDPVerifierSession) ProofSetLive(setId *big.Int) (bool, error) { - return _PDPVerifier.Contract.ProofSetLive(&_PDPVerifier.CallOpts, setId) -} - -// ProofSetLive is a free data retrieval call binding the contract method 0xf5cac1ba. -// -// Solidity: function proofSetLive(uint256 setId) view returns(bool) -func (_PDPVerifier *PDPVerifierCallerSession) ProofSetLive(setId *big.Int) (bool, error) { - return _PDPVerifier.Contract.ProofSetLive(&_PDPVerifier.CallOpts, setId) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_PDPVerifier *PDPVerifierCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { - var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "proxiableUUID") - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// PieceChallengable is a free data retrieval call binding the contract method 0xdc635266. // -// Solidity: function proxiableUUID() view returns(bytes32) -func (_PDPVerifier *PDPVerifierSession) ProxiableUUID() ([32]byte, error) { - return _PDPVerifier.Contract.ProxiableUUID(&_PDPVerifier.CallOpts) +// Solidity: function pieceChallengable(uint256 setId, uint256 pieceId) view returns(bool) +func (_PDPVerifier *PDPVerifierSession) PieceChallengable(setId *big.Int, pieceId *big.Int) (bool, error) { + return _PDPVerifier.Contract.PieceChallengable(&_PDPVerifier.CallOpts, setId, pieceId) } -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// PieceChallengable is a free data retrieval call binding the contract method 0xdc635266. // -// Solidity: function proxiableUUID() view returns(bytes32) -func (_PDPVerifier *PDPVerifierCallerSession) ProxiableUUID() ([32]byte, error) { - return _PDPVerifier.Contract.ProxiableUUID(&_PDPVerifier.CallOpts) +// Solidity: function pieceChallengable(uint256 setId, uint256 pieceId) view returns(bool) +func (_PDPVerifier *PDPVerifierCallerSession) PieceChallengable(setId *big.Int, pieceId *big.Int) (bool, error) { + return _PDPVerifier.Contract.PieceChallengable(&_PDPVerifier.CallOpts, setId, pieceId) } -// RootChallengable is a free data retrieval call binding the contract method 0x71cf2a16. +// PieceLive is a free data retrieval call binding the contract method 0x1a271225. // -// Solidity: function rootChallengable(uint256 setId, uint256 rootId) view returns(bool) -func (_PDPVerifier *PDPVerifierCaller) RootChallengable(opts *bind.CallOpts, setId *big.Int, rootId *big.Int) (bool, error) { +// Solidity: function pieceLive(uint256 setId, uint256 pieceId) view returns(bool) +func (_PDPVerifier *PDPVerifierCaller) PieceLive(opts *bind.CallOpts, setId *big.Int, pieceId *big.Int) (bool, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "rootChallengable", setId, rootId) + err := _PDPVerifier.contract.Call(opts, &out, "pieceLive", setId, pieceId) if err != nil { return *new(bool), err @@ -1183,133 +1294,133 @@ func (_PDPVerifier *PDPVerifierCaller) RootChallengable(opts *bind.CallOpts, set } -// RootChallengable is a free data retrieval call binding the contract method 0x71cf2a16. +// PieceLive is a free data retrieval call binding the contract method 0x1a271225. // -// Solidity: function rootChallengable(uint256 setId, uint256 rootId) view returns(bool) -func (_PDPVerifier *PDPVerifierSession) RootChallengable(setId *big.Int, rootId *big.Int) (bool, error) { - return _PDPVerifier.Contract.RootChallengable(&_PDPVerifier.CallOpts, setId, rootId) +// Solidity: function pieceLive(uint256 setId, uint256 pieceId) view returns(bool) +func (_PDPVerifier *PDPVerifierSession) PieceLive(setId *big.Int, pieceId *big.Int) (bool, error) { + return _PDPVerifier.Contract.PieceLive(&_PDPVerifier.CallOpts, setId, pieceId) } -// RootChallengable is a free data retrieval call binding the contract method 0x71cf2a16. +// PieceLive is a free data retrieval call binding the contract method 0x1a271225. // -// Solidity: function rootChallengable(uint256 setId, uint256 rootId) view returns(bool) -func (_PDPVerifier *PDPVerifierCallerSession) RootChallengable(setId *big.Int, rootId *big.Int) (bool, error) { - return _PDPVerifier.Contract.RootChallengable(&_PDPVerifier.CallOpts, setId, rootId) +// Solidity: function pieceLive(uint256 setId, uint256 pieceId) view returns(bool) +func (_PDPVerifier *PDPVerifierCallerSession) PieceLive(setId *big.Int, pieceId *big.Int) (bool, error) { + return _PDPVerifier.Contract.PieceLive(&_PDPVerifier.CallOpts, setId, pieceId) } -// RootLive is a free data retrieval call binding the contract method 0x47331050. +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. // -// Solidity: function rootLive(uint256 setId, uint256 rootId) view returns(bool) -func (_PDPVerifier *PDPVerifierCaller) RootLive(opts *bind.CallOpts, setId *big.Int, rootId *big.Int) (bool, error) { +// Solidity: function proxiableUUID() view returns(bytes32) +func (_PDPVerifier *PDPVerifierCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { var out []interface{} - err := _PDPVerifier.contract.Call(opts, &out, "rootLive", setId, rootId) + err := _PDPVerifier.contract.Call(opts, &out, "proxiableUUID") if err != nil { - return *new(bool), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -// RootLive is a free data retrieval call binding the contract method 0x47331050. +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. // -// Solidity: function rootLive(uint256 setId, uint256 rootId) view returns(bool) -func (_PDPVerifier *PDPVerifierSession) RootLive(setId *big.Int, rootId *big.Int) (bool, error) { - return _PDPVerifier.Contract.RootLive(&_PDPVerifier.CallOpts, setId, rootId) +// Solidity: function proxiableUUID() view returns(bytes32) +func (_PDPVerifier *PDPVerifierSession) ProxiableUUID() ([32]byte, error) { + return _PDPVerifier.Contract.ProxiableUUID(&_PDPVerifier.CallOpts) } -// RootLive is a free data retrieval call binding the contract method 0x47331050. +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. // -// Solidity: function rootLive(uint256 setId, uint256 rootId) view returns(bool) -func (_PDPVerifier *PDPVerifierCallerSession) RootLive(setId *big.Int, rootId *big.Int) (bool, error) { - return _PDPVerifier.Contract.RootLive(&_PDPVerifier.CallOpts, setId, rootId) +// Solidity: function proxiableUUID() view returns(bytes32) +func (_PDPVerifier *PDPVerifierCallerSession) ProxiableUUID() ([32]byte, error) { + return _PDPVerifier.Contract.ProxiableUUID(&_PDPVerifier.CallOpts) } -// AddRoots is a paid mutator transaction binding the contract method 0x11c0ee4a. +// AddPieces is a paid mutator transaction binding the contract method 0x306fc8be. // -// Solidity: function addRoots(uint256 setId, ((bytes),uint256)[] rootData, bytes extraData) returns(uint256) -func (_PDPVerifier *PDPVerifierTransactor) AddRoots(opts *bind.TransactOpts, setId *big.Int, rootData []PDPVerifierRootData, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.contract.Transact(opts, "addRoots", setId, rootData, extraData) +// Solidity: function addPieces(uint256 setId, (bytes)[] pieceData, bytes extraData) returns(uint256) +func (_PDPVerifier *PDPVerifierTransactor) AddPieces(opts *bind.TransactOpts, setId *big.Int, pieceData []CidsCid, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.contract.Transact(opts, "addPieces", setId, pieceData, extraData) } -// AddRoots is a paid mutator transaction binding the contract method 0x11c0ee4a. +// AddPieces is a paid mutator transaction binding the contract method 0x306fc8be. // -// Solidity: function addRoots(uint256 setId, ((bytes),uint256)[] rootData, bytes extraData) returns(uint256) -func (_PDPVerifier *PDPVerifierSession) AddRoots(setId *big.Int, rootData []PDPVerifierRootData, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.Contract.AddRoots(&_PDPVerifier.TransactOpts, setId, rootData, extraData) +// Solidity: function addPieces(uint256 setId, (bytes)[] pieceData, bytes extraData) returns(uint256) +func (_PDPVerifier *PDPVerifierSession) AddPieces(setId *big.Int, pieceData []CidsCid, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.AddPieces(&_PDPVerifier.TransactOpts, setId, pieceData, extraData) } -// AddRoots is a paid mutator transaction binding the contract method 0x11c0ee4a. +// AddPieces is a paid mutator transaction binding the contract method 0x306fc8be. // -// Solidity: function addRoots(uint256 setId, ((bytes),uint256)[] rootData, bytes extraData) returns(uint256) -func (_PDPVerifier *PDPVerifierTransactorSession) AddRoots(setId *big.Int, rootData []PDPVerifierRootData, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.Contract.AddRoots(&_PDPVerifier.TransactOpts, setId, rootData, extraData) +// Solidity: function addPieces(uint256 setId, (bytes)[] pieceData, bytes extraData) returns(uint256) +func (_PDPVerifier *PDPVerifierTransactorSession) AddPieces(setId *big.Int, pieceData []CidsCid, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.AddPieces(&_PDPVerifier.TransactOpts, setId, pieceData, extraData) } -// ClaimProofSetOwnership is a paid mutator transaction binding the contract method 0xee3dac65. +// ClaimDataSetStorageProvider is a paid mutator transaction binding the contract method 0xdf0f3248. // -// Solidity: function claimProofSetOwnership(uint256 setId) returns() -func (_PDPVerifier *PDPVerifierTransactor) ClaimProofSetOwnership(opts *bind.TransactOpts, setId *big.Int) (*types.Transaction, error) { - return _PDPVerifier.contract.Transact(opts, "claimProofSetOwnership", setId) +// Solidity: function claimDataSetStorageProvider(uint256 setId, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierTransactor) ClaimDataSetStorageProvider(opts *bind.TransactOpts, setId *big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.contract.Transact(opts, "claimDataSetStorageProvider", setId, extraData) } -// ClaimProofSetOwnership is a paid mutator transaction binding the contract method 0xee3dac65. +// ClaimDataSetStorageProvider is a paid mutator transaction binding the contract method 0xdf0f3248. // -// Solidity: function claimProofSetOwnership(uint256 setId) returns() -func (_PDPVerifier *PDPVerifierSession) ClaimProofSetOwnership(setId *big.Int) (*types.Transaction, error) { - return _PDPVerifier.Contract.ClaimProofSetOwnership(&_PDPVerifier.TransactOpts, setId) +// Solidity: function claimDataSetStorageProvider(uint256 setId, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierSession) ClaimDataSetStorageProvider(setId *big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.ClaimDataSetStorageProvider(&_PDPVerifier.TransactOpts, setId, extraData) } -// ClaimProofSetOwnership is a paid mutator transaction binding the contract method 0xee3dac65. +// ClaimDataSetStorageProvider is a paid mutator transaction binding the contract method 0xdf0f3248. // -// Solidity: function claimProofSetOwnership(uint256 setId) returns() -func (_PDPVerifier *PDPVerifierTransactorSession) ClaimProofSetOwnership(setId *big.Int) (*types.Transaction, error) { - return _PDPVerifier.Contract.ClaimProofSetOwnership(&_PDPVerifier.TransactOpts, setId) +// Solidity: function claimDataSetStorageProvider(uint256 setId, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierTransactorSession) ClaimDataSetStorageProvider(setId *big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.ClaimDataSetStorageProvider(&_PDPVerifier.TransactOpts, setId, extraData) } -// CreateProofSet is a paid mutator transaction binding the contract method 0x0a4d7932. +// CreateDataSet is a paid mutator transaction binding the contract method 0xbbae41cb. // -// Solidity: function createProofSet(address listenerAddr, bytes extraData) payable returns(uint256) -func (_PDPVerifier *PDPVerifierTransactor) CreateProofSet(opts *bind.TransactOpts, listenerAddr common.Address, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.contract.Transact(opts, "createProofSet", listenerAddr, extraData) +// Solidity: function createDataSet(address listenerAddr, bytes extraData) payable returns(uint256) +func (_PDPVerifier *PDPVerifierTransactor) CreateDataSet(opts *bind.TransactOpts, listenerAddr common.Address, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.contract.Transact(opts, "createDataSet", listenerAddr, extraData) } -// CreateProofSet is a paid mutator transaction binding the contract method 0x0a4d7932. +// CreateDataSet is a paid mutator transaction binding the contract method 0xbbae41cb. // -// Solidity: function createProofSet(address listenerAddr, bytes extraData) payable returns(uint256) -func (_PDPVerifier *PDPVerifierSession) CreateProofSet(listenerAddr common.Address, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.Contract.CreateProofSet(&_PDPVerifier.TransactOpts, listenerAddr, extraData) +// Solidity: function createDataSet(address listenerAddr, bytes extraData) payable returns(uint256) +func (_PDPVerifier *PDPVerifierSession) CreateDataSet(listenerAddr common.Address, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.CreateDataSet(&_PDPVerifier.TransactOpts, listenerAddr, extraData) } -// CreateProofSet is a paid mutator transaction binding the contract method 0x0a4d7932. +// CreateDataSet is a paid mutator transaction binding the contract method 0xbbae41cb. // -// Solidity: function createProofSet(address listenerAddr, bytes extraData) payable returns(uint256) -func (_PDPVerifier *PDPVerifierTransactorSession) CreateProofSet(listenerAddr common.Address, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.Contract.CreateProofSet(&_PDPVerifier.TransactOpts, listenerAddr, extraData) +// Solidity: function createDataSet(address listenerAddr, bytes extraData) payable returns(uint256) +func (_PDPVerifier *PDPVerifierTransactorSession) CreateDataSet(listenerAddr common.Address, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.CreateDataSet(&_PDPVerifier.TransactOpts, listenerAddr, extraData) } -// DeleteProofSet is a paid mutator transaction binding the contract method 0x847d1d06. +// DeleteDataSet is a paid mutator transaction binding the contract method 0x7a1e2990. // -// Solidity: function deleteProofSet(uint256 setId, bytes extraData) returns() -func (_PDPVerifier *PDPVerifierTransactor) DeleteProofSet(opts *bind.TransactOpts, setId *big.Int, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.contract.Transact(opts, "deleteProofSet", setId, extraData) +// Solidity: function deleteDataSet(uint256 setId, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierTransactor) DeleteDataSet(opts *bind.TransactOpts, setId *big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.contract.Transact(opts, "deleteDataSet", setId, extraData) } -// DeleteProofSet is a paid mutator transaction binding the contract method 0x847d1d06. +// DeleteDataSet is a paid mutator transaction binding the contract method 0x7a1e2990. // -// Solidity: function deleteProofSet(uint256 setId, bytes extraData) returns() -func (_PDPVerifier *PDPVerifierSession) DeleteProofSet(setId *big.Int, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.Contract.DeleteProofSet(&_PDPVerifier.TransactOpts, setId, extraData) +// Solidity: function deleteDataSet(uint256 setId, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierSession) DeleteDataSet(setId *big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.DeleteDataSet(&_PDPVerifier.TransactOpts, setId, extraData) } -// DeleteProofSet is a paid mutator transaction binding the contract method 0x847d1d06. +// DeleteDataSet is a paid mutator transaction binding the contract method 0x7a1e2990. // -// Solidity: function deleteProofSet(uint256 setId, bytes extraData) returns() -func (_PDPVerifier *PDPVerifierTransactorSession) DeleteProofSet(setId *big.Int, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.Contract.DeleteProofSet(&_PDPVerifier.TransactOpts, setId, extraData) +// Solidity: function deleteDataSet(uint256 setId, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierTransactorSession) DeleteDataSet(setId *big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.DeleteDataSet(&_PDPVerifier.TransactOpts, setId, extraData) } // Initialize is a paid mutator transaction binding the contract method 0xfe4b84df. @@ -1333,6 +1444,27 @@ func (_PDPVerifier *PDPVerifierTransactorSession) Initialize(_challengeFinality return _PDPVerifier.Contract.Initialize(&_PDPVerifier.TransactOpts, _challengeFinality) } +// Migrate is a paid mutator transaction binding the contract method 0x8fd3ab80. +// +// Solidity: function migrate() returns() +func (_PDPVerifier *PDPVerifierTransactor) Migrate(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PDPVerifier.contract.Transact(opts, "migrate") +} + +// Migrate is a paid mutator transaction binding the contract method 0x8fd3ab80. +// +// Solidity: function migrate() returns() +func (_PDPVerifier *PDPVerifierSession) Migrate() (*types.Transaction, error) { + return _PDPVerifier.Contract.Migrate(&_PDPVerifier.TransactOpts) +} + +// Migrate is a paid mutator transaction binding the contract method 0x8fd3ab80. +// +// Solidity: function migrate() returns() +func (_PDPVerifier *PDPVerifierTransactorSession) Migrate() (*types.Transaction, error) { + return _PDPVerifier.Contract.Migrate(&_PDPVerifier.TransactOpts) +} + // NextProvingPeriod is a paid mutator transaction binding the contract method 0x45c0b92d. // // Solidity: function nextProvingPeriod(uint256 setId, uint256 challengeEpoch, bytes extraData) returns() @@ -1354,45 +1486,45 @@ func (_PDPVerifier *PDPVerifierTransactorSession) NextProvingPeriod(setId *big.I return _PDPVerifier.Contract.NextProvingPeriod(&_PDPVerifier.TransactOpts, setId, challengeEpoch, extraData) } -// ProposeProofSetOwner is a paid mutator transaction binding the contract method 0x6cb55c16. +// ProposeDataSetStorageProvider is a paid mutator transaction binding the contract method 0x43186080. // -// Solidity: function proposeProofSetOwner(uint256 setId, address newOwner) returns() -func (_PDPVerifier *PDPVerifierTransactor) ProposeProofSetOwner(opts *bind.TransactOpts, setId *big.Int, newOwner common.Address) (*types.Transaction, error) { - return _PDPVerifier.contract.Transact(opts, "proposeProofSetOwner", setId, newOwner) +// Solidity: function proposeDataSetStorageProvider(uint256 setId, address newStorageProvider) returns() +func (_PDPVerifier *PDPVerifierTransactor) ProposeDataSetStorageProvider(opts *bind.TransactOpts, setId *big.Int, newStorageProvider common.Address) (*types.Transaction, error) { + return _PDPVerifier.contract.Transact(opts, "proposeDataSetStorageProvider", setId, newStorageProvider) } -// ProposeProofSetOwner is a paid mutator transaction binding the contract method 0x6cb55c16. +// ProposeDataSetStorageProvider is a paid mutator transaction binding the contract method 0x43186080. // -// Solidity: function proposeProofSetOwner(uint256 setId, address newOwner) returns() -func (_PDPVerifier *PDPVerifierSession) ProposeProofSetOwner(setId *big.Int, newOwner common.Address) (*types.Transaction, error) { - return _PDPVerifier.Contract.ProposeProofSetOwner(&_PDPVerifier.TransactOpts, setId, newOwner) +// Solidity: function proposeDataSetStorageProvider(uint256 setId, address newStorageProvider) returns() +func (_PDPVerifier *PDPVerifierSession) ProposeDataSetStorageProvider(setId *big.Int, newStorageProvider common.Address) (*types.Transaction, error) { + return _PDPVerifier.Contract.ProposeDataSetStorageProvider(&_PDPVerifier.TransactOpts, setId, newStorageProvider) } -// ProposeProofSetOwner is a paid mutator transaction binding the contract method 0x6cb55c16. +// ProposeDataSetStorageProvider is a paid mutator transaction binding the contract method 0x43186080. // -// Solidity: function proposeProofSetOwner(uint256 setId, address newOwner) returns() -func (_PDPVerifier *PDPVerifierTransactorSession) ProposeProofSetOwner(setId *big.Int, newOwner common.Address) (*types.Transaction, error) { - return _PDPVerifier.Contract.ProposeProofSetOwner(&_PDPVerifier.TransactOpts, setId, newOwner) +// Solidity: function proposeDataSetStorageProvider(uint256 setId, address newStorageProvider) returns() +func (_PDPVerifier *PDPVerifierTransactorSession) ProposeDataSetStorageProvider(setId *big.Int, newStorageProvider common.Address) (*types.Transaction, error) { + return _PDPVerifier.Contract.ProposeDataSetStorageProvider(&_PDPVerifier.TransactOpts, setId, newStorageProvider) } // ProvePossession is a paid mutator transaction binding the contract method 0xf58f952b. // // Solidity: function provePossession(uint256 setId, (bytes32,bytes32[])[] proofs) payable returns() -func (_PDPVerifier *PDPVerifierTransactor) ProvePossession(opts *bind.TransactOpts, setId *big.Int, proofs []PDPVerifierProof) (*types.Transaction, error) { +func (_PDPVerifier *PDPVerifierTransactor) ProvePossession(opts *bind.TransactOpts, setId *big.Int, proofs []IPDPTypesProof) (*types.Transaction, error) { return _PDPVerifier.contract.Transact(opts, "provePossession", setId, proofs) } // ProvePossession is a paid mutator transaction binding the contract method 0xf58f952b. // // Solidity: function provePossession(uint256 setId, (bytes32,bytes32[])[] proofs) payable returns() -func (_PDPVerifier *PDPVerifierSession) ProvePossession(setId *big.Int, proofs []PDPVerifierProof) (*types.Transaction, error) { +func (_PDPVerifier *PDPVerifierSession) ProvePossession(setId *big.Int, proofs []IPDPTypesProof) (*types.Transaction, error) { return _PDPVerifier.Contract.ProvePossession(&_PDPVerifier.TransactOpts, setId, proofs) } // ProvePossession is a paid mutator transaction binding the contract method 0xf58f952b. // // Solidity: function provePossession(uint256 setId, (bytes32,bytes32[])[] proofs) payable returns() -func (_PDPVerifier *PDPVerifierTransactorSession) ProvePossession(setId *big.Int, proofs []PDPVerifierProof) (*types.Transaction, error) { +func (_PDPVerifier *PDPVerifierTransactorSession) ProvePossession(setId *big.Int, proofs []IPDPTypesProof) (*types.Transaction, error) { return _PDPVerifier.Contract.ProvePossession(&_PDPVerifier.TransactOpts, setId, proofs) } @@ -1417,25 +1549,25 @@ func (_PDPVerifier *PDPVerifierTransactorSession) RenounceOwnership() (*types.Tr return _PDPVerifier.Contract.RenounceOwnership(&_PDPVerifier.TransactOpts) } -// ScheduleRemovals is a paid mutator transaction binding the contract method 0x3b68e4e9. +// SchedulePieceDeletions is a paid mutator transaction binding the contract method 0x0c292024. // -// Solidity: function scheduleRemovals(uint256 setId, uint256[] rootIds, bytes extraData) returns() -func (_PDPVerifier *PDPVerifierTransactor) ScheduleRemovals(opts *bind.TransactOpts, setId *big.Int, rootIds []*big.Int, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.contract.Transact(opts, "scheduleRemovals", setId, rootIds, extraData) +// Solidity: function schedulePieceDeletions(uint256 setId, uint256[] pieceIds, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierTransactor) SchedulePieceDeletions(opts *bind.TransactOpts, setId *big.Int, pieceIds []*big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.contract.Transact(opts, "schedulePieceDeletions", setId, pieceIds, extraData) } -// ScheduleRemovals is a paid mutator transaction binding the contract method 0x3b68e4e9. +// SchedulePieceDeletions is a paid mutator transaction binding the contract method 0x0c292024. // -// Solidity: function scheduleRemovals(uint256 setId, uint256[] rootIds, bytes extraData) returns() -func (_PDPVerifier *PDPVerifierSession) ScheduleRemovals(setId *big.Int, rootIds []*big.Int, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.Contract.ScheduleRemovals(&_PDPVerifier.TransactOpts, setId, rootIds, extraData) +// Solidity: function schedulePieceDeletions(uint256 setId, uint256[] pieceIds, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierSession) SchedulePieceDeletions(setId *big.Int, pieceIds []*big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.SchedulePieceDeletions(&_PDPVerifier.TransactOpts, setId, pieceIds, extraData) } -// ScheduleRemovals is a paid mutator transaction binding the contract method 0x3b68e4e9. +// SchedulePieceDeletions is a paid mutator transaction binding the contract method 0x0c292024. // -// Solidity: function scheduleRemovals(uint256 setId, uint256[] rootIds, bytes extraData) returns() -func (_PDPVerifier *PDPVerifierTransactorSession) ScheduleRemovals(setId *big.Int, rootIds []*big.Int, extraData []byte) (*types.Transaction, error) { - return _PDPVerifier.Contract.ScheduleRemovals(&_PDPVerifier.TransactOpts, setId, rootIds, extraData) +// Solidity: function schedulePieceDeletions(uint256 setId, uint256[] pieceIds, bytes extraData) returns() +func (_PDPVerifier *PDPVerifierTransactorSession) SchedulePieceDeletions(setId *big.Int, pieceIds []*big.Int, extraData []byte) (*types.Transaction, error) { + return _PDPVerifier.Contract.SchedulePieceDeletions(&_PDPVerifier.TransactOpts, setId, pieceIds, extraData) } // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. @@ -1480,9 +1612,9 @@ func (_PDPVerifier *PDPVerifierTransactorSession) UpgradeToAndCall(newImplementa return _PDPVerifier.Contract.UpgradeToAndCall(&_PDPVerifier.TransactOpts, newImplementation, data) } -// PDPVerifierDebugIterator is returned from FilterDebug and is used to iterate over the raw logs and unpacked data for Debug events raised by the PDPVerifier contract. -type PDPVerifierDebugIterator struct { - Event *PDPVerifierDebug // Event containing the contract specifics and raw log +// PDPVerifierContractUpgradedIterator is returned from FilterContractUpgraded and is used to iterate over the raw logs and unpacked data for ContractUpgraded events raised by the PDPVerifier contract. +type PDPVerifierContractUpgradedIterator struct { + Event *PDPVerifierContractUpgraded // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1496,7 +1628,7 @@ type PDPVerifierDebugIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierDebugIterator) Next() bool { +func (it *PDPVerifierContractUpgradedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1505,7 +1637,7 @@ func (it *PDPVerifierDebugIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierDebug) + it.Event = new(PDPVerifierContractUpgraded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1520,7 +1652,7 @@ func (it *PDPVerifierDebugIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierDebug) + it.Event = new(PDPVerifierContractUpgraded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1536,42 +1668,42 @@ func (it *PDPVerifierDebugIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierDebugIterator) Error() error { +func (it *PDPVerifierContractUpgradedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierDebugIterator) Close() error { +func (it *PDPVerifierContractUpgradedIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierDebug represents a Debug event raised by the PDPVerifier contract. -type PDPVerifierDebug struct { - Message string - Value *big.Int - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierContractUpgraded represents a ContractUpgraded event raised by the PDPVerifier contract. +type PDPVerifierContractUpgraded struct { + Version string + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterDebug is a free log retrieval operation binding the contract event 0x3c5ad147104e56be34a9176a6692f7df8d2f4b29a5af06bc6b98970d329d6577. +// FilterContractUpgraded is a free log retrieval operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. // -// Solidity: event Debug(string message, uint256 value) -func (_PDPVerifier *PDPVerifierFilterer) FilterDebug(opts *bind.FilterOpts) (*PDPVerifierDebugIterator, error) { +// Solidity: event ContractUpgraded(string version, address implementation) +func (_PDPVerifier *PDPVerifierFilterer) FilterContractUpgraded(opts *bind.FilterOpts) (*PDPVerifierContractUpgradedIterator, error) { - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "Debug") + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "ContractUpgraded") if err != nil { return nil, err } - return &PDPVerifierDebugIterator{contract: _PDPVerifier.contract, event: "Debug", logs: logs, sub: sub}, nil + return &PDPVerifierContractUpgradedIterator{contract: _PDPVerifier.contract, event: "ContractUpgraded", logs: logs, sub: sub}, nil } -// WatchDebug is a free log subscription operation binding the contract event 0x3c5ad147104e56be34a9176a6692f7df8d2f4b29a5af06bc6b98970d329d6577. +// WatchContractUpgraded is a free log subscription operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. // -// Solidity: event Debug(string message, uint256 value) -func (_PDPVerifier *PDPVerifierFilterer) WatchDebug(opts *bind.WatchOpts, sink chan<- *PDPVerifierDebug) (event.Subscription, error) { +// Solidity: event ContractUpgraded(string version, address implementation) +func (_PDPVerifier *PDPVerifierFilterer) WatchContractUpgraded(opts *bind.WatchOpts, sink chan<- *PDPVerifierContractUpgraded) (event.Subscription, error) { - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "Debug") + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "ContractUpgraded") if err != nil { return nil, err } @@ -1581,8 +1713,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchDebug(opts *bind.WatchOpts, sink c select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierDebug) - if err := _PDPVerifier.contract.UnpackLog(event, "Debug", log); err != nil { + event := new(PDPVerifierContractUpgraded) + if err := _PDPVerifier.contract.UnpackLog(event, "ContractUpgraded", log); err != nil { return err } event.Raw = log @@ -1603,21 +1735,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchDebug(opts *bind.WatchOpts, sink c }), nil } -// ParseDebug is a log parse operation binding the contract event 0x3c5ad147104e56be34a9176a6692f7df8d2f4b29a5af06bc6b98970d329d6577. +// ParseContractUpgraded is a log parse operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. // -// Solidity: event Debug(string message, uint256 value) -func (_PDPVerifier *PDPVerifierFilterer) ParseDebug(log types.Log) (*PDPVerifierDebug, error) { - event := new(PDPVerifierDebug) - if err := _PDPVerifier.contract.UnpackLog(event, "Debug", log); err != nil { +// Solidity: event ContractUpgraded(string version, address implementation) +func (_PDPVerifier *PDPVerifierFilterer) ParseContractUpgraded(log types.Log) (*PDPVerifierContractUpgraded, error) { + event := new(PDPVerifierContractUpgraded) + if err := _PDPVerifier.contract.UnpackLog(event, "ContractUpgraded", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PDPVerifier contract. -type PDPVerifierInitializedIterator struct { - Event *PDPVerifierInitialized // Event containing the contract specifics and raw log +// PDPVerifierDataSetCreatedIterator is returned from FilterDataSetCreated and is used to iterate over the raw logs and unpacked data for DataSetCreated events raised by the PDPVerifier contract. +type PDPVerifierDataSetCreatedIterator struct { + Event *PDPVerifierDataSetCreated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1631,7 +1763,7 @@ type PDPVerifierInitializedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierInitializedIterator) Next() bool { +func (it *PDPVerifierDataSetCreatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1640,7 +1772,7 @@ func (it *PDPVerifierInitializedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierInitialized) + it.Event = new(PDPVerifierDataSetCreated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1655,7 +1787,7 @@ func (it *PDPVerifierInitializedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierInitialized) + it.Event = new(PDPVerifierDataSetCreated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1671,41 +1803,60 @@ func (it *PDPVerifierInitializedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierInitializedIterator) Error() error { +func (it *PDPVerifierDataSetCreatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierInitializedIterator) Close() error { +func (it *PDPVerifierDataSetCreatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierInitialized represents a Initialized event raised by the PDPVerifier contract. -type PDPVerifierInitialized struct { - Version uint64 - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierDataSetCreated represents a DataSetCreated event raised by the PDPVerifier contract. +type PDPVerifierDataSetCreated struct { + SetId *big.Int + StorageProvider common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// FilterDataSetCreated is a free log retrieval operation binding the contract event 0x11369440e1b7135015c16acb9bc14b55b0f4b23b02010c363d34aec2e5b96281. // -// Solidity: event Initialized(uint64 version) -func (_PDPVerifier *PDPVerifierFilterer) FilterInitialized(opts *bind.FilterOpts) (*PDPVerifierInitializedIterator, error) { +// Solidity: event DataSetCreated(uint256 indexed setId, address indexed storageProvider) +func (_PDPVerifier *PDPVerifierFilterer) FilterDataSetCreated(opts *bind.FilterOpts, setId []*big.Int, storageProvider []common.Address) (*PDPVerifierDataSetCreatedIterator, error) { - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "Initialized") + var setIdRule []interface{} + for _, setIdItem := range setId { + setIdRule = append(setIdRule, setIdItem) + } + var storageProviderRule []interface{} + for _, storageProviderItem := range storageProvider { + storageProviderRule = append(storageProviderRule, storageProviderItem) + } + + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "DataSetCreated", setIdRule, storageProviderRule) if err != nil { return nil, err } - return &PDPVerifierInitializedIterator{contract: _PDPVerifier.contract, event: "Initialized", logs: logs, sub: sub}, nil + return &PDPVerifierDataSetCreatedIterator{contract: _PDPVerifier.contract, event: "DataSetCreated", logs: logs, sub: sub}, nil } -// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// WatchDataSetCreated is a free log subscription operation binding the contract event 0x11369440e1b7135015c16acb9bc14b55b0f4b23b02010c363d34aec2e5b96281. // -// Solidity: event Initialized(uint64 version) -func (_PDPVerifier *PDPVerifierFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PDPVerifierInitialized) (event.Subscription, error) { +// Solidity: event DataSetCreated(uint256 indexed setId, address indexed storageProvider) +func (_PDPVerifier *PDPVerifierFilterer) WatchDataSetCreated(opts *bind.WatchOpts, sink chan<- *PDPVerifierDataSetCreated, setId []*big.Int, storageProvider []common.Address) (event.Subscription, error) { - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "Initialized") + var setIdRule []interface{} + for _, setIdItem := range setId { + setIdRule = append(setIdRule, setIdItem) + } + var storageProviderRule []interface{} + for _, storageProviderItem := range storageProvider { + storageProviderRule = append(storageProviderRule, storageProviderItem) + } + + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "DataSetCreated", setIdRule, storageProviderRule) if err != nil { return nil, err } @@ -1715,8 +1866,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchInitialized(opts *bind.WatchOpts, select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierInitialized) - if err := _PDPVerifier.contract.UnpackLog(event, "Initialized", log); err != nil { + event := new(PDPVerifierDataSetCreated) + if err := _PDPVerifier.contract.UnpackLog(event, "DataSetCreated", log); err != nil { return err } event.Raw = log @@ -1737,21 +1888,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchInitialized(opts *bind.WatchOpts, }), nil } -// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// ParseDataSetCreated is a log parse operation binding the contract event 0x11369440e1b7135015c16acb9bc14b55b0f4b23b02010c363d34aec2e5b96281. // -// Solidity: event Initialized(uint64 version) -func (_PDPVerifier *PDPVerifierFilterer) ParseInitialized(log types.Log) (*PDPVerifierInitialized, error) { - event := new(PDPVerifierInitialized) - if err := _PDPVerifier.contract.UnpackLog(event, "Initialized", log); err != nil { +// Solidity: event DataSetCreated(uint256 indexed setId, address indexed storageProvider) +func (_PDPVerifier *PDPVerifierFilterer) ParseDataSetCreated(log types.Log) (*PDPVerifierDataSetCreated, error) { + event := new(PDPVerifierDataSetCreated) + if err := _PDPVerifier.contract.UnpackLog(event, "DataSetCreated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierNextProvingPeriodIterator is returned from FilterNextProvingPeriod and is used to iterate over the raw logs and unpacked data for NextProvingPeriod events raised by the PDPVerifier contract. -type PDPVerifierNextProvingPeriodIterator struct { - Event *PDPVerifierNextProvingPeriod // Event containing the contract specifics and raw log +// PDPVerifierDataSetDeletedIterator is returned from FilterDataSetDeleted and is used to iterate over the raw logs and unpacked data for DataSetDeleted events raised by the PDPVerifier contract. +type PDPVerifierDataSetDeletedIterator struct { + Event *PDPVerifierDataSetDeleted // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1765,7 +1916,7 @@ type PDPVerifierNextProvingPeriodIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierNextProvingPeriodIterator) Next() bool { +func (it *PDPVerifierDataSetDeletedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1774,7 +1925,7 @@ func (it *PDPVerifierNextProvingPeriodIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierNextProvingPeriod) + it.Event = new(PDPVerifierDataSetDeleted) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1789,7 +1940,7 @@ func (it *PDPVerifierNextProvingPeriodIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierNextProvingPeriod) + it.Event = new(PDPVerifierDataSetDeleted) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1805,53 +1956,52 @@ func (it *PDPVerifierNextProvingPeriodIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierNextProvingPeriodIterator) Error() error { +func (it *PDPVerifierDataSetDeletedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierNextProvingPeriodIterator) Close() error { +func (it *PDPVerifierDataSetDeletedIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierNextProvingPeriod represents a NextProvingPeriod event raised by the PDPVerifier contract. -type PDPVerifierNextProvingPeriod struct { - SetId *big.Int - ChallengeEpoch *big.Int - LeafCount *big.Int - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierDataSetDeleted represents a DataSetDeleted event raised by the PDPVerifier contract. +type PDPVerifierDataSetDeleted struct { + SetId *big.Int + DeletedLeafCount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterNextProvingPeriod is a free log retrieval operation binding the contract event 0xc099ffec4e3e773644a4d1dda368c46af853a0eeb15babde217f53a657396e1e. +// FilterDataSetDeleted is a free log retrieval operation binding the contract event 0x14eeeef7679fcb051c6572811f61c07bedccd0f1cfc1f9b79b23e47c5c52aeb7. // -// Solidity: event NextProvingPeriod(uint256 indexed setId, uint256 challengeEpoch, uint256 leafCount) -func (_PDPVerifier *PDPVerifierFilterer) FilterNextProvingPeriod(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierNextProvingPeriodIterator, error) { +// Solidity: event DataSetDeleted(uint256 indexed setId, uint256 deletedLeafCount) +func (_PDPVerifier *PDPVerifierFilterer) FilterDataSetDeleted(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierDataSetDeletedIterator, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "NextProvingPeriod", setIdRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "DataSetDeleted", setIdRule) if err != nil { return nil, err } - return &PDPVerifierNextProvingPeriodIterator{contract: _PDPVerifier.contract, event: "NextProvingPeriod", logs: logs, sub: sub}, nil + return &PDPVerifierDataSetDeletedIterator{contract: _PDPVerifier.contract, event: "DataSetDeleted", logs: logs, sub: sub}, nil } -// WatchNextProvingPeriod is a free log subscription operation binding the contract event 0xc099ffec4e3e773644a4d1dda368c46af853a0eeb15babde217f53a657396e1e. +// WatchDataSetDeleted is a free log subscription operation binding the contract event 0x14eeeef7679fcb051c6572811f61c07bedccd0f1cfc1f9b79b23e47c5c52aeb7. // -// Solidity: event NextProvingPeriod(uint256 indexed setId, uint256 challengeEpoch, uint256 leafCount) -func (_PDPVerifier *PDPVerifierFilterer) WatchNextProvingPeriod(opts *bind.WatchOpts, sink chan<- *PDPVerifierNextProvingPeriod, setId []*big.Int) (event.Subscription, error) { +// Solidity: event DataSetDeleted(uint256 indexed setId, uint256 deletedLeafCount) +func (_PDPVerifier *PDPVerifierFilterer) WatchDataSetDeleted(opts *bind.WatchOpts, sink chan<- *PDPVerifierDataSetDeleted, setId []*big.Int) (event.Subscription, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "NextProvingPeriod", setIdRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "DataSetDeleted", setIdRule) if err != nil { return nil, err } @@ -1861,8 +2011,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchNextProvingPeriod(opts *bind.Watch select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierNextProvingPeriod) - if err := _PDPVerifier.contract.UnpackLog(event, "NextProvingPeriod", log); err != nil { + event := new(PDPVerifierDataSetDeleted) + if err := _PDPVerifier.contract.UnpackLog(event, "DataSetDeleted", log); err != nil { return err } event.Raw = log @@ -1883,21 +2033,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchNextProvingPeriod(opts *bind.Watch }), nil } -// ParseNextProvingPeriod is a log parse operation binding the contract event 0xc099ffec4e3e773644a4d1dda368c46af853a0eeb15babde217f53a657396e1e. +// ParseDataSetDeleted is a log parse operation binding the contract event 0x14eeeef7679fcb051c6572811f61c07bedccd0f1cfc1f9b79b23e47c5c52aeb7. // -// Solidity: event NextProvingPeriod(uint256 indexed setId, uint256 challengeEpoch, uint256 leafCount) -func (_PDPVerifier *PDPVerifierFilterer) ParseNextProvingPeriod(log types.Log) (*PDPVerifierNextProvingPeriod, error) { - event := new(PDPVerifierNextProvingPeriod) - if err := _PDPVerifier.contract.UnpackLog(event, "NextProvingPeriod", log); err != nil { +// Solidity: event DataSetDeleted(uint256 indexed setId, uint256 deletedLeafCount) +func (_PDPVerifier *PDPVerifierFilterer) ParseDataSetDeleted(log types.Log) (*PDPVerifierDataSetDeleted, error) { + event := new(PDPVerifierDataSetDeleted) + if err := _PDPVerifier.contract.UnpackLog(event, "DataSetDeleted", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the PDPVerifier contract. -type PDPVerifierOwnershipTransferredIterator struct { - Event *PDPVerifierOwnershipTransferred // Event containing the contract specifics and raw log +// PDPVerifierDataSetEmptyIterator is returned from FilterDataSetEmpty and is used to iterate over the raw logs and unpacked data for DataSetEmpty events raised by the PDPVerifier contract. +type PDPVerifierDataSetEmptyIterator struct { + Event *PDPVerifierDataSetEmpty // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1911,7 +2061,7 @@ type PDPVerifierOwnershipTransferredIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierOwnershipTransferredIterator) Next() bool { +func (it *PDPVerifierDataSetEmptyIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1920,7 +2070,7 @@ func (it *PDPVerifierOwnershipTransferredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierOwnershipTransferred) + it.Event = new(PDPVerifierDataSetEmpty) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1935,7 +2085,7 @@ func (it *PDPVerifierOwnershipTransferredIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierOwnershipTransferred) + it.Event = new(PDPVerifierDataSetEmpty) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1951,60 +2101,51 @@ func (it *PDPVerifierOwnershipTransferredIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierOwnershipTransferredIterator) Error() error { +func (it *PDPVerifierDataSetEmptyIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierOwnershipTransferredIterator) Close() error { +func (it *PDPVerifierDataSetEmptyIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierOwnershipTransferred represents a OwnershipTransferred event raised by the PDPVerifier contract. -type PDPVerifierOwnershipTransferred struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierDataSetEmpty represents a DataSetEmpty event raised by the PDPVerifier contract. +type PDPVerifierDataSetEmpty struct { + SetId *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// FilterDataSetEmpty is a free log retrieval operation binding the contract event 0x02a8400fc343f45098cb00c3a6ea694174771939a5503f663e0ff6f4eb7c2842. // -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_PDPVerifier *PDPVerifierFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*PDPVerifierOwnershipTransferredIterator, error) { +// Solidity: event DataSetEmpty(uint256 indexed setId) +func (_PDPVerifier *PDPVerifierFilterer) FilterDataSetEmpty(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierDataSetEmptyIterator, error) { - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) + var setIdRule []interface{} + for _, setIdItem := range setId { + setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "DataSetEmpty", setIdRule) if err != nil { return nil, err } - return &PDPVerifierOwnershipTransferredIterator{contract: _PDPVerifier.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil + return &PDPVerifierDataSetEmptyIterator{contract: _PDPVerifier.contract, event: "DataSetEmpty", logs: logs, sub: sub}, nil } -// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// WatchDataSetEmpty is a free log subscription operation binding the contract event 0x02a8400fc343f45098cb00c3a6ea694174771939a5503f663e0ff6f4eb7c2842. // -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_PDPVerifier *PDPVerifierFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PDPVerifierOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { +// Solidity: event DataSetEmpty(uint256 indexed setId) +func (_PDPVerifier *PDPVerifierFilterer) WatchDataSetEmpty(opts *bind.WatchOpts, sink chan<- *PDPVerifierDataSetEmpty, setId []*big.Int) (event.Subscription, error) { - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) + var setIdRule []interface{} + for _, setIdItem := range setId { + setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "DataSetEmpty", setIdRule) if err != nil { return nil, err } @@ -2014,8 +2155,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchOwnershipTransferred(opts *bind.Wa select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierOwnershipTransferred) - if err := _PDPVerifier.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + event := new(PDPVerifierDataSetEmpty) + if err := _PDPVerifier.contract.UnpackLog(event, "DataSetEmpty", log); err != nil { return err } event.Raw = log @@ -2036,21 +2177,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchOwnershipTransferred(opts *bind.Wa }), nil } -// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// ParseDataSetEmpty is a log parse operation binding the contract event 0x02a8400fc343f45098cb00c3a6ea694174771939a5503f663e0ff6f4eb7c2842. // -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_PDPVerifier *PDPVerifierFilterer) ParseOwnershipTransferred(log types.Log) (*PDPVerifierOwnershipTransferred, error) { - event := new(PDPVerifierOwnershipTransferred) - if err := _PDPVerifier.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { +// Solidity: event DataSetEmpty(uint256 indexed setId) +func (_PDPVerifier *PDPVerifierFilterer) ParseDataSetEmpty(log types.Log) (*PDPVerifierDataSetEmpty, error) { + event := new(PDPVerifierDataSetEmpty) + if err := _PDPVerifier.contract.UnpackLog(event, "DataSetEmpty", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierPossessionProvenIterator is returned from FilterPossessionProven and is used to iterate over the raw logs and unpacked data for PossessionProven events raised by the PDPVerifier contract. -type PDPVerifierPossessionProvenIterator struct { - Event *PDPVerifierPossessionProven // Event containing the contract specifics and raw log +// PDPVerifierInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PDPVerifier contract. +type PDPVerifierInitializedIterator struct { + Event *PDPVerifierInitialized // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -2064,7 +2205,7 @@ type PDPVerifierPossessionProvenIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierPossessionProvenIterator) Next() bool { +func (it *PDPVerifierInitializedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2073,7 +2214,7 @@ func (it *PDPVerifierPossessionProvenIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierPossessionProven) + it.Event = new(PDPVerifierInitialized) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2088,7 +2229,7 @@ func (it *PDPVerifierPossessionProvenIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierPossessionProven) + it.Event = new(PDPVerifierInitialized) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2104,52 +2245,41 @@ func (it *PDPVerifierPossessionProvenIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierPossessionProvenIterator) Error() error { +func (it *PDPVerifierInitializedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierPossessionProvenIterator) Close() error { +func (it *PDPVerifierInitializedIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierPossessionProven represents a PossessionProven event raised by the PDPVerifier contract. -type PDPVerifierPossessionProven struct { - SetId *big.Int - Challenges []PDPVerifierRootIdAndOffset - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierInitialized represents a Initialized event raised by the PDPVerifier contract. +type PDPVerifierInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterPossessionProven is a free log retrieval operation binding the contract event 0x1acf7df9f0c1b0208c23be6178950c0273f89b766805a2c0bd1e53d25c700e50. +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. // -// Solidity: event PossessionProven(uint256 indexed setId, (uint256,uint256)[] challenges) -func (_PDPVerifier *PDPVerifierFilterer) FilterPossessionProven(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierPossessionProvenIterator, error) { - - var setIdRule []interface{} - for _, setIdItem := range setId { - setIdRule = append(setIdRule, setIdItem) - } +// Solidity: event Initialized(uint64 version) +func (_PDPVerifier *PDPVerifierFilterer) FilterInitialized(opts *bind.FilterOpts) (*PDPVerifierInitializedIterator, error) { - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "PossessionProven", setIdRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "Initialized") if err != nil { return nil, err } - return &PDPVerifierPossessionProvenIterator{contract: _PDPVerifier.contract, event: "PossessionProven", logs: logs, sub: sub}, nil + return &PDPVerifierInitializedIterator{contract: _PDPVerifier.contract, event: "Initialized", logs: logs, sub: sub}, nil } -// WatchPossessionProven is a free log subscription operation binding the contract event 0x1acf7df9f0c1b0208c23be6178950c0273f89b766805a2c0bd1e53d25c700e50. +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. // -// Solidity: event PossessionProven(uint256 indexed setId, (uint256,uint256)[] challenges) -func (_PDPVerifier *PDPVerifierFilterer) WatchPossessionProven(opts *bind.WatchOpts, sink chan<- *PDPVerifierPossessionProven, setId []*big.Int) (event.Subscription, error) { - - var setIdRule []interface{} - for _, setIdItem := range setId { - setIdRule = append(setIdRule, setIdItem) - } +// Solidity: event Initialized(uint64 version) +func (_PDPVerifier *PDPVerifierFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PDPVerifierInitialized) (event.Subscription, error) { - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "PossessionProven", setIdRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "Initialized") if err != nil { return nil, err } @@ -2159,8 +2289,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchPossessionProven(opts *bind.WatchO select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierPossessionProven) - if err := _PDPVerifier.contract.UnpackLog(event, "PossessionProven", log); err != nil { + event := new(PDPVerifierInitialized) + if err := _PDPVerifier.contract.UnpackLog(event, "Initialized", log); err != nil { return err } event.Raw = log @@ -2181,21 +2311,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchPossessionProven(opts *bind.WatchO }), nil } -// ParsePossessionProven is a log parse operation binding the contract event 0x1acf7df9f0c1b0208c23be6178950c0273f89b766805a2c0bd1e53d25c700e50. +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. // -// Solidity: event PossessionProven(uint256 indexed setId, (uint256,uint256)[] challenges) -func (_PDPVerifier *PDPVerifierFilterer) ParsePossessionProven(log types.Log) (*PDPVerifierPossessionProven, error) { - event := new(PDPVerifierPossessionProven) - if err := _PDPVerifier.contract.UnpackLog(event, "PossessionProven", log); err != nil { +// Solidity: event Initialized(uint64 version) +func (_PDPVerifier *PDPVerifierFilterer) ParseInitialized(log types.Log) (*PDPVerifierInitialized, error) { + event := new(PDPVerifierInitialized) + if err := _PDPVerifier.contract.UnpackLog(event, "Initialized", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierProofFeePaidIterator is returned from FilterProofFeePaid and is used to iterate over the raw logs and unpacked data for ProofFeePaid events raised by the PDPVerifier contract. -type PDPVerifierProofFeePaidIterator struct { - Event *PDPVerifierProofFeePaid // Event containing the contract specifics and raw log +// PDPVerifierNextProvingPeriodIterator is returned from FilterNextProvingPeriod and is used to iterate over the raw logs and unpacked data for NextProvingPeriod events raised by the PDPVerifier contract. +type PDPVerifierNextProvingPeriodIterator struct { + Event *PDPVerifierNextProvingPeriod // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -2209,7 +2339,7 @@ type PDPVerifierProofFeePaidIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierProofFeePaidIterator) Next() bool { +func (it *PDPVerifierNextProvingPeriodIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2218,7 +2348,7 @@ func (it *PDPVerifierProofFeePaidIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierProofFeePaid) + it.Event = new(PDPVerifierNextProvingPeriod) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2233,7 +2363,7 @@ func (it *PDPVerifierProofFeePaidIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierProofFeePaid) + it.Event = new(PDPVerifierNextProvingPeriod) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2249,54 +2379,53 @@ func (it *PDPVerifierProofFeePaidIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierProofFeePaidIterator) Error() error { +func (it *PDPVerifierNextProvingPeriodIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierProofFeePaidIterator) Close() error { +func (it *PDPVerifierNextProvingPeriodIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierProofFeePaid represents a ProofFeePaid event raised by the PDPVerifier contract. -type PDPVerifierProofFeePaid struct { - SetId *big.Int - Fee *big.Int - Price uint64 - Expo int32 - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierNextProvingPeriod represents a NextProvingPeriod event raised by the PDPVerifier contract. +type PDPVerifierNextProvingPeriod struct { + SetId *big.Int + ChallengeEpoch *big.Int + LeafCount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterProofFeePaid is a free log retrieval operation binding the contract event 0x928bbf5188022bf8b9a0e59f5e81e179d0a4c729bdba2856ac971af2063fbf2b. +// FilterNextProvingPeriod is a free log retrieval operation binding the contract event 0xc099ffec4e3e773644a4d1dda368c46af853a0eeb15babde217f53a657396e1e. // -// Solidity: event ProofFeePaid(uint256 indexed setId, uint256 fee, uint64 price, int32 expo) -func (_PDPVerifier *PDPVerifierFilterer) FilterProofFeePaid(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierProofFeePaidIterator, error) { +// Solidity: event NextProvingPeriod(uint256 indexed setId, uint256 challengeEpoch, uint256 leafCount) +func (_PDPVerifier *PDPVerifierFilterer) FilterNextProvingPeriod(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierNextProvingPeriodIterator, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "ProofFeePaid", setIdRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "NextProvingPeriod", setIdRule) if err != nil { return nil, err } - return &PDPVerifierProofFeePaidIterator{contract: _PDPVerifier.contract, event: "ProofFeePaid", logs: logs, sub: sub}, nil + return &PDPVerifierNextProvingPeriodIterator{contract: _PDPVerifier.contract, event: "NextProvingPeriod", logs: logs, sub: sub}, nil } -// WatchProofFeePaid is a free log subscription operation binding the contract event 0x928bbf5188022bf8b9a0e59f5e81e179d0a4c729bdba2856ac971af2063fbf2b. +// WatchNextProvingPeriod is a free log subscription operation binding the contract event 0xc099ffec4e3e773644a4d1dda368c46af853a0eeb15babde217f53a657396e1e. // -// Solidity: event ProofFeePaid(uint256 indexed setId, uint256 fee, uint64 price, int32 expo) -func (_PDPVerifier *PDPVerifierFilterer) WatchProofFeePaid(opts *bind.WatchOpts, sink chan<- *PDPVerifierProofFeePaid, setId []*big.Int) (event.Subscription, error) { +// Solidity: event NextProvingPeriod(uint256 indexed setId, uint256 challengeEpoch, uint256 leafCount) +func (_PDPVerifier *PDPVerifierFilterer) WatchNextProvingPeriod(opts *bind.WatchOpts, sink chan<- *PDPVerifierNextProvingPeriod, setId []*big.Int) (event.Subscription, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "ProofFeePaid", setIdRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "NextProvingPeriod", setIdRule) if err != nil { return nil, err } @@ -2306,8 +2435,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofFeePaid(opts *bind.WatchOpts, select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierProofFeePaid) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofFeePaid", log); err != nil { + event := new(PDPVerifierNextProvingPeriod) + if err := _PDPVerifier.contract.UnpackLog(event, "NextProvingPeriod", log); err != nil { return err } event.Raw = log @@ -2328,21 +2457,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofFeePaid(opts *bind.WatchOpts, }), nil } -// ParseProofFeePaid is a log parse operation binding the contract event 0x928bbf5188022bf8b9a0e59f5e81e179d0a4c729bdba2856ac971af2063fbf2b. +// ParseNextProvingPeriod is a log parse operation binding the contract event 0xc099ffec4e3e773644a4d1dda368c46af853a0eeb15babde217f53a657396e1e. // -// Solidity: event ProofFeePaid(uint256 indexed setId, uint256 fee, uint64 price, int32 expo) -func (_PDPVerifier *PDPVerifierFilterer) ParseProofFeePaid(log types.Log) (*PDPVerifierProofFeePaid, error) { - event := new(PDPVerifierProofFeePaid) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofFeePaid", log); err != nil { +// Solidity: event NextProvingPeriod(uint256 indexed setId, uint256 challengeEpoch, uint256 leafCount) +func (_PDPVerifier *PDPVerifierFilterer) ParseNextProvingPeriod(log types.Log) (*PDPVerifierNextProvingPeriod, error) { + event := new(PDPVerifierNextProvingPeriod) + if err := _PDPVerifier.contract.UnpackLog(event, "NextProvingPeriod", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierProofSetCreatedIterator is returned from FilterProofSetCreated and is used to iterate over the raw logs and unpacked data for ProofSetCreated events raised by the PDPVerifier contract. -type PDPVerifierProofSetCreatedIterator struct { - Event *PDPVerifierProofSetCreated // Event containing the contract specifics and raw log +// PDPVerifierOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the PDPVerifier contract. +type PDPVerifierOwnershipTransferredIterator struct { + Event *PDPVerifierOwnershipTransferred // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -2356,7 +2485,7 @@ type PDPVerifierProofSetCreatedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierProofSetCreatedIterator) Next() bool { +func (it *PDPVerifierOwnershipTransferredIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2365,7 +2494,7 @@ func (it *PDPVerifierProofSetCreatedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierProofSetCreated) + it.Event = new(PDPVerifierOwnershipTransferred) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2380,7 +2509,7 @@ func (it *PDPVerifierProofSetCreatedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierProofSetCreated) + it.Event = new(PDPVerifierOwnershipTransferred) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2396,60 +2525,60 @@ func (it *PDPVerifierProofSetCreatedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierProofSetCreatedIterator) Error() error { +func (it *PDPVerifierOwnershipTransferredIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierProofSetCreatedIterator) Close() error { +func (it *PDPVerifierOwnershipTransferredIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierProofSetCreated represents a ProofSetCreated event raised by the PDPVerifier contract. -type PDPVerifierProofSetCreated struct { - SetId *big.Int - Owner common.Address - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierOwnershipTransferred represents a OwnershipTransferred event raised by the PDPVerifier contract. +type PDPVerifierOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterProofSetCreated is a free log retrieval operation binding the contract event 0x017f0b33d96e8f9968590172013032c2346cf047787a5e17a44b0a1bb3cd0f01. +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. // -// Solidity: event ProofSetCreated(uint256 indexed setId, address indexed owner) -func (_PDPVerifier *PDPVerifierFilterer) FilterProofSetCreated(opts *bind.FilterOpts, setId []*big.Int, owner []common.Address) (*PDPVerifierProofSetCreatedIterator, error) { +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PDPVerifier *PDPVerifierFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*PDPVerifierOwnershipTransferredIterator, error) { - var setIdRule []interface{} - for _, setIdItem := range setId { - setIdRule = append(setIdRule, setIdItem) + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) } - var ownerRule []interface{} - for _, ownerItem := range owner { - ownerRule = append(ownerRule, ownerItem) + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "ProofSetCreated", setIdRule, ownerRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) if err != nil { return nil, err } - return &PDPVerifierProofSetCreatedIterator{contract: _PDPVerifier.contract, event: "ProofSetCreated", logs: logs, sub: sub}, nil + return &PDPVerifierOwnershipTransferredIterator{contract: _PDPVerifier.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil } -// WatchProofSetCreated is a free log subscription operation binding the contract event 0x017f0b33d96e8f9968590172013032c2346cf047787a5e17a44b0a1bb3cd0f01. +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. // -// Solidity: event ProofSetCreated(uint256 indexed setId, address indexed owner) -func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetCreated(opts *bind.WatchOpts, sink chan<- *PDPVerifierProofSetCreated, setId []*big.Int, owner []common.Address) (event.Subscription, error) { +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PDPVerifier *PDPVerifierFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PDPVerifierOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - var setIdRule []interface{} - for _, setIdItem := range setId { - setIdRule = append(setIdRule, setIdItem) + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) } - var ownerRule []interface{} - for _, ownerItem := range owner { - ownerRule = append(ownerRule, ownerItem) + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "ProofSetCreated", setIdRule, ownerRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) if err != nil { return nil, err } @@ -2459,8 +2588,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetCreated(opts *bind.WatchOp select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierProofSetCreated) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofSetCreated", log); err != nil { + event := new(PDPVerifierOwnershipTransferred) + if err := _PDPVerifier.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { return err } event.Raw = log @@ -2481,21 +2610,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetCreated(opts *bind.WatchOp }), nil } -// ParseProofSetCreated is a log parse operation binding the contract event 0x017f0b33d96e8f9968590172013032c2346cf047787a5e17a44b0a1bb3cd0f01. +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. // -// Solidity: event ProofSetCreated(uint256 indexed setId, address indexed owner) -func (_PDPVerifier *PDPVerifierFilterer) ParseProofSetCreated(log types.Log) (*PDPVerifierProofSetCreated, error) { - event := new(PDPVerifierProofSetCreated) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofSetCreated", log); err != nil { +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PDPVerifier *PDPVerifierFilterer) ParseOwnershipTransferred(log types.Log) (*PDPVerifierOwnershipTransferred, error) { + event := new(PDPVerifierOwnershipTransferred) + if err := _PDPVerifier.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierProofSetDeletedIterator is returned from FilterProofSetDeleted and is used to iterate over the raw logs and unpacked data for ProofSetDeleted events raised by the PDPVerifier contract. -type PDPVerifierProofSetDeletedIterator struct { - Event *PDPVerifierProofSetDeleted // Event containing the contract specifics and raw log +// PDPVerifierPiecesAddedIterator is returned from FilterPiecesAdded and is used to iterate over the raw logs and unpacked data for PiecesAdded events raised by the PDPVerifier contract. +type PDPVerifierPiecesAddedIterator struct { + Event *PDPVerifierPiecesAdded // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -2509,7 +2638,7 @@ type PDPVerifierProofSetDeletedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierProofSetDeletedIterator) Next() bool { +func (it *PDPVerifierPiecesAddedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2518,7 +2647,7 @@ func (it *PDPVerifierProofSetDeletedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierProofSetDeleted) + it.Event = new(PDPVerifierPiecesAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2533,7 +2662,7 @@ func (it *PDPVerifierProofSetDeletedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierProofSetDeleted) + it.Event = new(PDPVerifierPiecesAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2549,52 +2678,53 @@ func (it *PDPVerifierProofSetDeletedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierProofSetDeletedIterator) Error() error { +func (it *PDPVerifierPiecesAddedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierProofSetDeletedIterator) Close() error { +func (it *PDPVerifierPiecesAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierProofSetDeleted represents a ProofSetDeleted event raised by the PDPVerifier contract. -type PDPVerifierProofSetDeleted struct { - SetId *big.Int - DeletedLeafCount *big.Int - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierPiecesAdded represents a PiecesAdded event raised by the PDPVerifier contract. +type PDPVerifierPiecesAdded struct { + SetId *big.Int + PieceIds []*big.Int + PieceCids []CidsCid + Raw types.Log // Blockchain specific contextual infos } -// FilterProofSetDeleted is a free log retrieval operation binding the contract event 0x589e9a441b5bddda77c4ab647b0108764a9cc1a7f655aa9b7bc50b8bdfab8673. +// FilterPiecesAdded is a free log retrieval operation binding the contract event 0x396df50222a87662e94bb7d173792d5e61fe0b193b6ccf791f7ce433f0b28207. // -// Solidity: event ProofSetDeleted(uint256 indexed setId, uint256 deletedLeafCount) -func (_PDPVerifier *PDPVerifierFilterer) FilterProofSetDeleted(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierProofSetDeletedIterator, error) { +// Solidity: event PiecesAdded(uint256 indexed setId, uint256[] pieceIds, (bytes)[] pieceCids) +func (_PDPVerifier *PDPVerifierFilterer) FilterPiecesAdded(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierPiecesAddedIterator, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "ProofSetDeleted", setIdRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "PiecesAdded", setIdRule) if err != nil { return nil, err } - return &PDPVerifierProofSetDeletedIterator{contract: _PDPVerifier.contract, event: "ProofSetDeleted", logs: logs, sub: sub}, nil + return &PDPVerifierPiecesAddedIterator{contract: _PDPVerifier.contract, event: "PiecesAdded", logs: logs, sub: sub}, nil } -// WatchProofSetDeleted is a free log subscription operation binding the contract event 0x589e9a441b5bddda77c4ab647b0108764a9cc1a7f655aa9b7bc50b8bdfab8673. +// WatchPiecesAdded is a free log subscription operation binding the contract event 0x396df50222a87662e94bb7d173792d5e61fe0b193b6ccf791f7ce433f0b28207. // -// Solidity: event ProofSetDeleted(uint256 indexed setId, uint256 deletedLeafCount) -func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetDeleted(opts *bind.WatchOpts, sink chan<- *PDPVerifierProofSetDeleted, setId []*big.Int) (event.Subscription, error) { +// Solidity: event PiecesAdded(uint256 indexed setId, uint256[] pieceIds, (bytes)[] pieceCids) +func (_PDPVerifier *PDPVerifierFilterer) WatchPiecesAdded(opts *bind.WatchOpts, sink chan<- *PDPVerifierPiecesAdded, setId []*big.Int) (event.Subscription, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "ProofSetDeleted", setIdRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "PiecesAdded", setIdRule) if err != nil { return nil, err } @@ -2604,8 +2734,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetDeleted(opts *bind.WatchOp select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierProofSetDeleted) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofSetDeleted", log); err != nil { + event := new(PDPVerifierPiecesAdded) + if err := _PDPVerifier.contract.UnpackLog(event, "PiecesAdded", log); err != nil { return err } event.Raw = log @@ -2626,21 +2756,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetDeleted(opts *bind.WatchOp }), nil } -// ParseProofSetDeleted is a log parse operation binding the contract event 0x589e9a441b5bddda77c4ab647b0108764a9cc1a7f655aa9b7bc50b8bdfab8673. +// ParsePiecesAdded is a log parse operation binding the contract event 0x396df50222a87662e94bb7d173792d5e61fe0b193b6ccf791f7ce433f0b28207. // -// Solidity: event ProofSetDeleted(uint256 indexed setId, uint256 deletedLeafCount) -func (_PDPVerifier *PDPVerifierFilterer) ParseProofSetDeleted(log types.Log) (*PDPVerifierProofSetDeleted, error) { - event := new(PDPVerifierProofSetDeleted) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofSetDeleted", log); err != nil { +// Solidity: event PiecesAdded(uint256 indexed setId, uint256[] pieceIds, (bytes)[] pieceCids) +func (_PDPVerifier *PDPVerifierFilterer) ParsePiecesAdded(log types.Log) (*PDPVerifierPiecesAdded, error) { + event := new(PDPVerifierPiecesAdded) + if err := _PDPVerifier.contract.UnpackLog(event, "PiecesAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierProofSetEmptyIterator is returned from FilterProofSetEmpty and is used to iterate over the raw logs and unpacked data for ProofSetEmpty events raised by the PDPVerifier contract. -type PDPVerifierProofSetEmptyIterator struct { - Event *PDPVerifierProofSetEmpty // Event containing the contract specifics and raw log +// PDPVerifierPiecesRemovedIterator is returned from FilterPiecesRemoved and is used to iterate over the raw logs and unpacked data for PiecesRemoved events raised by the PDPVerifier contract. +type PDPVerifierPiecesRemovedIterator struct { + Event *PDPVerifierPiecesRemoved // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -2654,7 +2784,7 @@ type PDPVerifierProofSetEmptyIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierProofSetEmptyIterator) Next() bool { +func (it *PDPVerifierPiecesRemovedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2663,7 +2793,7 @@ func (it *PDPVerifierProofSetEmptyIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierProofSetEmpty) + it.Event = new(PDPVerifierPiecesRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2678,7 +2808,7 @@ func (it *PDPVerifierProofSetEmptyIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierProofSetEmpty) + it.Event = new(PDPVerifierPiecesRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2694,51 +2824,52 @@ func (it *PDPVerifierProofSetEmptyIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierProofSetEmptyIterator) Error() error { +func (it *PDPVerifierPiecesRemovedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierProofSetEmptyIterator) Close() error { +func (it *PDPVerifierPiecesRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierProofSetEmpty represents a ProofSetEmpty event raised by the PDPVerifier contract. -type PDPVerifierProofSetEmpty struct { - SetId *big.Int - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierPiecesRemoved represents a PiecesRemoved event raised by the PDPVerifier contract. +type PDPVerifierPiecesRemoved struct { + SetId *big.Int + PieceIds []*big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterProofSetEmpty is a free log retrieval operation binding the contract event 0x323c29bc8d678a5d987b90a321982d10b9a91bcad071a9e445879497bf0e68e7. +// FilterPiecesRemoved is a free log retrieval operation binding the contract event 0x6e87df804629ac17804b57ba7abbdfac8bdc36bab504fb8a8801eb313a8ce7b1. // -// Solidity: event ProofSetEmpty(uint256 indexed setId) -func (_PDPVerifier *PDPVerifierFilterer) FilterProofSetEmpty(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierProofSetEmptyIterator, error) { +// Solidity: event PiecesRemoved(uint256 indexed setId, uint256[] pieceIds) +func (_PDPVerifier *PDPVerifierFilterer) FilterPiecesRemoved(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierPiecesRemovedIterator, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "ProofSetEmpty", setIdRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "PiecesRemoved", setIdRule) if err != nil { return nil, err } - return &PDPVerifierProofSetEmptyIterator{contract: _PDPVerifier.contract, event: "ProofSetEmpty", logs: logs, sub: sub}, nil + return &PDPVerifierPiecesRemovedIterator{contract: _PDPVerifier.contract, event: "PiecesRemoved", logs: logs, sub: sub}, nil } -// WatchProofSetEmpty is a free log subscription operation binding the contract event 0x323c29bc8d678a5d987b90a321982d10b9a91bcad071a9e445879497bf0e68e7. +// WatchPiecesRemoved is a free log subscription operation binding the contract event 0x6e87df804629ac17804b57ba7abbdfac8bdc36bab504fb8a8801eb313a8ce7b1. // -// Solidity: event ProofSetEmpty(uint256 indexed setId) -func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetEmpty(opts *bind.WatchOpts, sink chan<- *PDPVerifierProofSetEmpty, setId []*big.Int) (event.Subscription, error) { +// Solidity: event PiecesRemoved(uint256 indexed setId, uint256[] pieceIds) +func (_PDPVerifier *PDPVerifierFilterer) WatchPiecesRemoved(opts *bind.WatchOpts, sink chan<- *PDPVerifierPiecesRemoved, setId []*big.Int) (event.Subscription, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "ProofSetEmpty", setIdRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "PiecesRemoved", setIdRule) if err != nil { return nil, err } @@ -2748,8 +2879,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetEmpty(opts *bind.WatchOpts select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierProofSetEmpty) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofSetEmpty", log); err != nil { + event := new(PDPVerifierPiecesRemoved) + if err := _PDPVerifier.contract.UnpackLog(event, "PiecesRemoved", log); err != nil { return err } event.Raw = log @@ -2770,21 +2901,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetEmpty(opts *bind.WatchOpts }), nil } -// ParseProofSetEmpty is a log parse operation binding the contract event 0x323c29bc8d678a5d987b90a321982d10b9a91bcad071a9e445879497bf0e68e7. +// ParsePiecesRemoved is a log parse operation binding the contract event 0x6e87df804629ac17804b57ba7abbdfac8bdc36bab504fb8a8801eb313a8ce7b1. // -// Solidity: event ProofSetEmpty(uint256 indexed setId) -func (_PDPVerifier *PDPVerifierFilterer) ParseProofSetEmpty(log types.Log) (*PDPVerifierProofSetEmpty, error) { - event := new(PDPVerifierProofSetEmpty) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofSetEmpty", log); err != nil { +// Solidity: event PiecesRemoved(uint256 indexed setId, uint256[] pieceIds) +func (_PDPVerifier *PDPVerifierFilterer) ParsePiecesRemoved(log types.Log) (*PDPVerifierPiecesRemoved, error) { + event := new(PDPVerifierPiecesRemoved) + if err := _PDPVerifier.contract.UnpackLog(event, "PiecesRemoved", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierProofSetOwnerChangedIterator is returned from FilterProofSetOwnerChanged and is used to iterate over the raw logs and unpacked data for ProofSetOwnerChanged events raised by the PDPVerifier contract. -type PDPVerifierProofSetOwnerChangedIterator struct { - Event *PDPVerifierProofSetOwnerChanged // Event containing the contract specifics and raw log +// PDPVerifierPossessionProvenIterator is returned from FilterPossessionProven and is used to iterate over the raw logs and unpacked data for PossessionProven events raised by the PDPVerifier contract. +type PDPVerifierPossessionProvenIterator struct { + Event *PDPVerifierPossessionProven // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -2798,7 +2929,7 @@ type PDPVerifierProofSetOwnerChangedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierProofSetOwnerChangedIterator) Next() bool { +func (it *PDPVerifierPossessionProvenIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2807,7 +2938,7 @@ func (it *PDPVerifierProofSetOwnerChangedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierProofSetOwnerChanged) + it.Event = new(PDPVerifierPossessionProven) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2822,7 +2953,7 @@ func (it *PDPVerifierProofSetOwnerChangedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierProofSetOwnerChanged) + it.Event = new(PDPVerifierPossessionProven) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2838,69 +2969,52 @@ func (it *PDPVerifierProofSetOwnerChangedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierProofSetOwnerChangedIterator) Error() error { +func (it *PDPVerifierPossessionProvenIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierProofSetOwnerChangedIterator) Close() error { +func (it *PDPVerifierPossessionProvenIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierProofSetOwnerChanged represents a ProofSetOwnerChanged event raised by the PDPVerifier contract. -type PDPVerifierProofSetOwnerChanged struct { - SetId *big.Int - OldOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierPossessionProven represents a PossessionProven event raised by the PDPVerifier contract. +type PDPVerifierPossessionProven struct { + SetId *big.Int + Challenges []IPDPTypesPieceIdAndOffset + Raw types.Log // Blockchain specific contextual infos } -// FilterProofSetOwnerChanged is a free log retrieval operation binding the contract event 0xd3273037b635678293ef0c076bd77af13760e75e12806d1db237616d03c3a766. +// FilterPossessionProven is a free log retrieval operation binding the contract event 0x1acf7df9f0c1b0208c23be6178950c0273f89b766805a2c0bd1e53d25c700e50. // -// Solidity: event ProofSetOwnerChanged(uint256 indexed setId, address indexed oldOwner, address indexed newOwner) -func (_PDPVerifier *PDPVerifierFilterer) FilterProofSetOwnerChanged(opts *bind.FilterOpts, setId []*big.Int, oldOwner []common.Address, newOwner []common.Address) (*PDPVerifierProofSetOwnerChangedIterator, error) { +// Solidity: event PossessionProven(uint256 indexed setId, (uint256,uint256)[] challenges) +func (_PDPVerifier *PDPVerifierFilterer) FilterPossessionProven(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierPossessionProvenIterator, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - var oldOwnerRule []interface{} - for _, oldOwnerItem := range oldOwner { - oldOwnerRule = append(oldOwnerRule, oldOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "ProofSetOwnerChanged", setIdRule, oldOwnerRule, newOwnerRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "PossessionProven", setIdRule) if err != nil { return nil, err } - return &PDPVerifierProofSetOwnerChangedIterator{contract: _PDPVerifier.contract, event: "ProofSetOwnerChanged", logs: logs, sub: sub}, nil + return &PDPVerifierPossessionProvenIterator{contract: _PDPVerifier.contract, event: "PossessionProven", logs: logs, sub: sub}, nil } -// WatchProofSetOwnerChanged is a free log subscription operation binding the contract event 0xd3273037b635678293ef0c076bd77af13760e75e12806d1db237616d03c3a766. +// WatchPossessionProven is a free log subscription operation binding the contract event 0x1acf7df9f0c1b0208c23be6178950c0273f89b766805a2c0bd1e53d25c700e50. // -// Solidity: event ProofSetOwnerChanged(uint256 indexed setId, address indexed oldOwner, address indexed newOwner) -func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetOwnerChanged(opts *bind.WatchOpts, sink chan<- *PDPVerifierProofSetOwnerChanged, setId []*big.Int, oldOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { +// Solidity: event PossessionProven(uint256 indexed setId, (uint256,uint256)[] challenges) +func (_PDPVerifier *PDPVerifierFilterer) WatchPossessionProven(opts *bind.WatchOpts, sink chan<- *PDPVerifierPossessionProven, setId []*big.Int) (event.Subscription, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - var oldOwnerRule []interface{} - for _, oldOwnerItem := range oldOwner { - oldOwnerRule = append(oldOwnerRule, oldOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "ProofSetOwnerChanged", setIdRule, oldOwnerRule, newOwnerRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "PossessionProven", setIdRule) if err != nil { return nil, err } @@ -2910,8 +3024,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetOwnerChanged(opts *bind.Wa select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierProofSetOwnerChanged) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofSetOwnerChanged", log); err != nil { + event := new(PDPVerifierPossessionProven) + if err := _PDPVerifier.contract.UnpackLog(event, "PossessionProven", log); err != nil { return err } event.Raw = log @@ -2932,21 +3046,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchProofSetOwnerChanged(opts *bind.Wa }), nil } -// ParseProofSetOwnerChanged is a log parse operation binding the contract event 0xd3273037b635678293ef0c076bd77af13760e75e12806d1db237616d03c3a766. +// ParsePossessionProven is a log parse operation binding the contract event 0x1acf7df9f0c1b0208c23be6178950c0273f89b766805a2c0bd1e53d25c700e50. // -// Solidity: event ProofSetOwnerChanged(uint256 indexed setId, address indexed oldOwner, address indexed newOwner) -func (_PDPVerifier *PDPVerifierFilterer) ParseProofSetOwnerChanged(log types.Log) (*PDPVerifierProofSetOwnerChanged, error) { - event := new(PDPVerifierProofSetOwnerChanged) - if err := _PDPVerifier.contract.UnpackLog(event, "ProofSetOwnerChanged", log); err != nil { +// Solidity: event PossessionProven(uint256 indexed setId, (uint256,uint256)[] challenges) +func (_PDPVerifier *PDPVerifierFilterer) ParsePossessionProven(log types.Log) (*PDPVerifierPossessionProven, error) { + event := new(PDPVerifierPossessionProven) + if err := _PDPVerifier.contract.UnpackLog(event, "PossessionProven", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierRootsAddedIterator is returned from FilterRootsAdded and is used to iterate over the raw logs and unpacked data for RootsAdded events raised by the PDPVerifier contract. -type PDPVerifierRootsAddedIterator struct { - Event *PDPVerifierRootsAdded // Event containing the contract specifics and raw log +// PDPVerifierProofFeePaidIterator is returned from FilterProofFeePaid and is used to iterate over the raw logs and unpacked data for ProofFeePaid events raised by the PDPVerifier contract. +type PDPVerifierProofFeePaidIterator struct { + Event *PDPVerifierProofFeePaid // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -2960,7 +3074,7 @@ type PDPVerifierRootsAddedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierRootsAddedIterator) Next() bool { +func (it *PDPVerifierProofFeePaidIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2969,7 +3083,7 @@ func (it *PDPVerifierRootsAddedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierRootsAdded) + it.Event = new(PDPVerifierProofFeePaid) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2984,7 +3098,7 @@ func (it *PDPVerifierRootsAddedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierRootsAdded) + it.Event = new(PDPVerifierProofFeePaid) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3000,52 +3114,54 @@ func (it *PDPVerifierRootsAddedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierRootsAddedIterator) Error() error { +func (it *PDPVerifierProofFeePaidIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierRootsAddedIterator) Close() error { +func (it *PDPVerifierProofFeePaidIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierRootsAdded represents a RootsAdded event raised by the PDPVerifier contract. -type PDPVerifierRootsAdded struct { - SetId *big.Int - RootIds []*big.Int - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierProofFeePaid represents a ProofFeePaid event raised by the PDPVerifier contract. +type PDPVerifierProofFeePaid struct { + SetId *big.Int + Fee *big.Int + Price uint64 + Expo int32 + Raw types.Log // Blockchain specific contextual infos } -// FilterRootsAdded is a free log retrieval operation binding the contract event 0x5ce51a8003915c377679ba533d9dafa0792058b254965697e674272f13f4fdd3. +// FilterProofFeePaid is a free log retrieval operation binding the contract event 0x928bbf5188022bf8b9a0e59f5e81e179d0a4c729bdba2856ac971af2063fbf2b. // -// Solidity: event RootsAdded(uint256 indexed setId, uint256[] rootIds) -func (_PDPVerifier *PDPVerifierFilterer) FilterRootsAdded(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierRootsAddedIterator, error) { +// Solidity: event ProofFeePaid(uint256 indexed setId, uint256 fee, uint64 price, int32 expo) +func (_PDPVerifier *PDPVerifierFilterer) FilterProofFeePaid(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierProofFeePaidIterator, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "RootsAdded", setIdRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "ProofFeePaid", setIdRule) if err != nil { return nil, err } - return &PDPVerifierRootsAddedIterator{contract: _PDPVerifier.contract, event: "RootsAdded", logs: logs, sub: sub}, nil + return &PDPVerifierProofFeePaidIterator{contract: _PDPVerifier.contract, event: "ProofFeePaid", logs: logs, sub: sub}, nil } -// WatchRootsAdded is a free log subscription operation binding the contract event 0x5ce51a8003915c377679ba533d9dafa0792058b254965697e674272f13f4fdd3. +// WatchProofFeePaid is a free log subscription operation binding the contract event 0x928bbf5188022bf8b9a0e59f5e81e179d0a4c729bdba2856ac971af2063fbf2b. // -// Solidity: event RootsAdded(uint256 indexed setId, uint256[] rootIds) -func (_PDPVerifier *PDPVerifierFilterer) WatchRootsAdded(opts *bind.WatchOpts, sink chan<- *PDPVerifierRootsAdded, setId []*big.Int) (event.Subscription, error) { +// Solidity: event ProofFeePaid(uint256 indexed setId, uint256 fee, uint64 price, int32 expo) +func (_PDPVerifier *PDPVerifierFilterer) WatchProofFeePaid(opts *bind.WatchOpts, sink chan<- *PDPVerifierProofFeePaid, setId []*big.Int) (event.Subscription, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "RootsAdded", setIdRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "ProofFeePaid", setIdRule) if err != nil { return nil, err } @@ -3055,8 +3171,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchRootsAdded(opts *bind.WatchOpts, s select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierRootsAdded) - if err := _PDPVerifier.contract.UnpackLog(event, "RootsAdded", log); err != nil { + event := new(PDPVerifierProofFeePaid) + if err := _PDPVerifier.contract.UnpackLog(event, "ProofFeePaid", log); err != nil { return err } event.Raw = log @@ -3077,21 +3193,21 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchRootsAdded(opts *bind.WatchOpts, s }), nil } -// ParseRootsAdded is a log parse operation binding the contract event 0x5ce51a8003915c377679ba533d9dafa0792058b254965697e674272f13f4fdd3. +// ParseProofFeePaid is a log parse operation binding the contract event 0x928bbf5188022bf8b9a0e59f5e81e179d0a4c729bdba2856ac971af2063fbf2b. // -// Solidity: event RootsAdded(uint256 indexed setId, uint256[] rootIds) -func (_PDPVerifier *PDPVerifierFilterer) ParseRootsAdded(log types.Log) (*PDPVerifierRootsAdded, error) { - event := new(PDPVerifierRootsAdded) - if err := _PDPVerifier.contract.UnpackLog(event, "RootsAdded", log); err != nil { +// Solidity: event ProofFeePaid(uint256 indexed setId, uint256 fee, uint64 price, int32 expo) +func (_PDPVerifier *PDPVerifierFilterer) ParseProofFeePaid(log types.Log) (*PDPVerifierProofFeePaid, error) { + event := new(PDPVerifierProofFeePaid) + if err := _PDPVerifier.contract.UnpackLog(event, "ProofFeePaid", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PDPVerifierRootsRemovedIterator is returned from FilterRootsRemoved and is used to iterate over the raw logs and unpacked data for RootsRemoved events raised by the PDPVerifier contract. -type PDPVerifierRootsRemovedIterator struct { - Event *PDPVerifierRootsRemoved // Event containing the contract specifics and raw log +// PDPVerifierStorageProviderChangedIterator is returned from FilterStorageProviderChanged and is used to iterate over the raw logs and unpacked data for StorageProviderChanged events raised by the PDPVerifier contract. +type PDPVerifierStorageProviderChangedIterator struct { + Event *PDPVerifierStorageProviderChanged // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -3105,7 +3221,7 @@ type PDPVerifierRootsRemovedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *PDPVerifierRootsRemovedIterator) Next() bool { +func (it *PDPVerifierStorageProviderChangedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3114,7 +3230,7 @@ func (it *PDPVerifierRootsRemovedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PDPVerifierRootsRemoved) + it.Event = new(PDPVerifierStorageProviderChanged) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3129,7 +3245,7 @@ func (it *PDPVerifierRootsRemovedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PDPVerifierRootsRemoved) + it.Event = new(PDPVerifierStorageProviderChanged) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3145,52 +3261,69 @@ func (it *PDPVerifierRootsRemovedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PDPVerifierRootsRemovedIterator) Error() error { +func (it *PDPVerifierStorageProviderChangedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PDPVerifierRootsRemovedIterator) Close() error { +func (it *PDPVerifierStorageProviderChangedIterator) Close() error { it.sub.Unsubscribe() return nil } -// PDPVerifierRootsRemoved represents a RootsRemoved event raised by the PDPVerifier contract. -type PDPVerifierRootsRemoved struct { - SetId *big.Int - RootIds []*big.Int - Raw types.Log // Blockchain specific contextual infos +// PDPVerifierStorageProviderChanged represents a StorageProviderChanged event raised by the PDPVerifier contract. +type PDPVerifierStorageProviderChanged struct { + SetId *big.Int + OldStorageProvider common.Address + NewStorageProvider common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterRootsRemoved is a free log retrieval operation binding the contract event 0xd22bb0ee05b8ca92312459c76223d3b9bc1bd96fb6c9b18e637ededf92d81174. +// FilterStorageProviderChanged is a free log retrieval operation binding the contract event 0x686146a80f2bf4dc855942926481871515b39b508826d7982a2e0212d20552c9. // -// Solidity: event RootsRemoved(uint256 indexed setId, uint256[] rootIds) -func (_PDPVerifier *PDPVerifierFilterer) FilterRootsRemoved(opts *bind.FilterOpts, setId []*big.Int) (*PDPVerifierRootsRemovedIterator, error) { +// Solidity: event StorageProviderChanged(uint256 indexed setId, address indexed oldStorageProvider, address indexed newStorageProvider) +func (_PDPVerifier *PDPVerifierFilterer) FilterStorageProviderChanged(opts *bind.FilterOpts, setId []*big.Int, oldStorageProvider []common.Address, newStorageProvider []common.Address) (*PDPVerifierStorageProviderChangedIterator, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } + var oldStorageProviderRule []interface{} + for _, oldStorageProviderItem := range oldStorageProvider { + oldStorageProviderRule = append(oldStorageProviderRule, oldStorageProviderItem) + } + var newStorageProviderRule []interface{} + for _, newStorageProviderItem := range newStorageProvider { + newStorageProviderRule = append(newStorageProviderRule, newStorageProviderItem) + } - logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "RootsRemoved", setIdRule) + logs, sub, err := _PDPVerifier.contract.FilterLogs(opts, "StorageProviderChanged", setIdRule, oldStorageProviderRule, newStorageProviderRule) if err != nil { return nil, err } - return &PDPVerifierRootsRemovedIterator{contract: _PDPVerifier.contract, event: "RootsRemoved", logs: logs, sub: sub}, nil + return &PDPVerifierStorageProviderChangedIterator{contract: _PDPVerifier.contract, event: "StorageProviderChanged", logs: logs, sub: sub}, nil } -// WatchRootsRemoved is a free log subscription operation binding the contract event 0xd22bb0ee05b8ca92312459c76223d3b9bc1bd96fb6c9b18e637ededf92d81174. +// WatchStorageProviderChanged is a free log subscription operation binding the contract event 0x686146a80f2bf4dc855942926481871515b39b508826d7982a2e0212d20552c9. // -// Solidity: event RootsRemoved(uint256 indexed setId, uint256[] rootIds) -func (_PDPVerifier *PDPVerifierFilterer) WatchRootsRemoved(opts *bind.WatchOpts, sink chan<- *PDPVerifierRootsRemoved, setId []*big.Int) (event.Subscription, error) { +// Solidity: event StorageProviderChanged(uint256 indexed setId, address indexed oldStorageProvider, address indexed newStorageProvider) +func (_PDPVerifier *PDPVerifierFilterer) WatchStorageProviderChanged(opts *bind.WatchOpts, sink chan<- *PDPVerifierStorageProviderChanged, setId []*big.Int, oldStorageProvider []common.Address, newStorageProvider []common.Address) (event.Subscription, error) { var setIdRule []interface{} for _, setIdItem := range setId { setIdRule = append(setIdRule, setIdItem) } + var oldStorageProviderRule []interface{} + for _, oldStorageProviderItem := range oldStorageProvider { + oldStorageProviderRule = append(oldStorageProviderRule, oldStorageProviderItem) + } + var newStorageProviderRule []interface{} + for _, newStorageProviderItem := range newStorageProvider { + newStorageProviderRule = append(newStorageProviderRule, newStorageProviderItem) + } - logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "RootsRemoved", setIdRule) + logs, sub, err := _PDPVerifier.contract.WatchLogs(opts, "StorageProviderChanged", setIdRule, oldStorageProviderRule, newStorageProviderRule) if err != nil { return nil, err } @@ -3200,8 +3333,8 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchRootsRemoved(opts *bind.WatchOpts, select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PDPVerifierRootsRemoved) - if err := _PDPVerifier.contract.UnpackLog(event, "RootsRemoved", log); err != nil { + event := new(PDPVerifierStorageProviderChanged) + if err := _PDPVerifier.contract.UnpackLog(event, "StorageProviderChanged", log); err != nil { return err } event.Raw = log @@ -3222,12 +3355,12 @@ func (_PDPVerifier *PDPVerifierFilterer) WatchRootsRemoved(opts *bind.WatchOpts, }), nil } -// ParseRootsRemoved is a log parse operation binding the contract event 0xd22bb0ee05b8ca92312459c76223d3b9bc1bd96fb6c9b18e637ededf92d81174. +// ParseStorageProviderChanged is a log parse operation binding the contract event 0x686146a80f2bf4dc855942926481871515b39b508826d7982a2e0212d20552c9. // -// Solidity: event RootsRemoved(uint256 indexed setId, uint256[] rootIds) -func (_PDPVerifier *PDPVerifierFilterer) ParseRootsRemoved(log types.Log) (*PDPVerifierRootsRemoved, error) { - event := new(PDPVerifierRootsRemoved) - if err := _PDPVerifier.contract.UnpackLog(event, "RootsRemoved", log); err != nil { +// Solidity: event StorageProviderChanged(uint256 indexed setId, address indexed oldStorageProvider, address indexed newStorageProvider) +func (_PDPVerifier *PDPVerifierFilterer) ParseStorageProviderChanged(log types.Log) (*PDPVerifierStorageProviderChanged, error) { + event := new(PDPVerifierStorageProviderChanged) + if err := _PDPVerifier.contract.UnpackLog(event, "StorageProviderChanged", log); err != nil { return nil, err } event.Raw = log diff --git a/pdp/contract/types.go b/pdp/contract/types.go new file mode 100644 index 000000000..cf7c9bf89 --- /dev/null +++ b/pdp/contract/types.go @@ -0,0 +1,6 @@ +package contract + +// PieceData matches the Solidity PieceData struct +type PieceData struct { + Piece struct{ Data []byte } +} diff --git a/pdp/contract/utils.go b/pdp/contract/utils.go new file mode 100644 index 000000000..658ee6a41 --- /dev/null +++ b/pdp/contract/utils.go @@ -0,0 +1,411 @@ +package contract + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + mbig "math/big" + "strings" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + etypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + logging "github.com/ipfs/go-log/v2" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/builtin" + + "github.com/filecoin-project/curio/build" + "github.com/filecoin-project/curio/harmony/harmonydb" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/types/ethtypes" +) + +var log = logging.Logger("pdp-contract") + +// GetProvingScheduleFromListener checks if a listener has a view contract and returns +// an IPDPProvingSchedule instance bound to the appropriate address. +// It uses the view contract address if available, otherwise uses the listener address directly. +func GetProvingScheduleFromListener(listenerAddr common.Address, ethClient *ethclient.Client) (*IPDPProvingSchedule, error) { + // Try to get the view contract address from the listener + provingScheduleAddr := listenerAddr + + // Check if the listener supports the viewContractAddress method + listenerService, err := NewListenerServiceWithViewContract(listenerAddr, ethClient) + if err == nil { + // Try to get the view contract address + viewAddr, err := listenerService.ViewContractAddress(nil) + if err == nil && viewAddr != (common.Address{}) { + // Use the view contract for proving schedule operations + provingScheduleAddr = viewAddr + } + } + + // Create and return the IPDPProvingSchedule binding + // This works whether provingScheduleAddr points to: + // - The view contract (which must implement IPDPProvingSchedule) + // - The listener itself (where listener must implement IPDPProvingSchedule) + provingSchedule, err := NewIPDPProvingSchedule(provingScheduleAddr, ethClient) + if err != nil { + return nil, xerrors.Errorf("failed to create proving schedule binding: %w", err) + } + + return provingSchedule, nil +} + +const ServiceRegistryMainnet = "0x9C65E8E57C98cCc040A3d825556832EA1e9f4Df6" +const ServiceRegistryCalibnet = "0xA8a7e2130C27e4f39D1aEBb3D538D5937bCf8ddb" + +func ServiceRegistryAddress() (common.Address, error) { + switch build.BuildType { + case build.BuildCalibnet: + return common.HexToAddress(ServiceRegistryCalibnet), nil + case build.BuildMainnet: + return common.HexToAddress(ServiceRegistryMainnet), nil + default: + return common.Address{}, xerrors.Errorf("service registry address not set for this network %s", build.BuildTypeString()[1:]) + } +} + +func FSRegister(ctx context.Context, db *harmonydb.DB, full api.FullNode, ethClient *ethclient.Client, name, description string, pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilities map[string]string) (uint64, error) { + if len(name) > 128 { + return 0, xerrors.Errorf("name is too long, max 128 characters allowed") + } + + if name == "" { + return 0, xerrors.Errorf("name is required") + } + + if len(description) > 128 { + return 0, xerrors.Errorf("description is too long, max 128 characters allowed") + } + + var keys, values []string + for k, v := range capabilities { + if len(k) > 32 { + return 0, xerrors.Errorf("capabilities key %s is too long, max 32 characters allowed", k) + } + if len(v) > 128 { + return 0, xerrors.Errorf("capabilities value %s is too long, max 128 characters allowed", v) + } + keys = append(keys, k) + values = append(values, v) + } + + sender, fSender, privateKey, err := getSender(ctx, db) + if err != nil { + return 0, xerrors.Errorf("failed to get sender: %w", err) + } + + ac, err := full.StateGetActor(ctx, fSender, types.EmptyTSK) + if err != nil { + return 0, xerrors.Errorf("failed to get actor: %w", err) + } + + amount, err := types.ParseFIL("5 FIL") + if err != nil { + return 0, fmt.Errorf("failed to parse 5 FIL: %w", err) + } + + token := abi.NewTokenAmount(amount.Int64()) + + if ac.Balance.LessThan(big.NewInt(token.Int64())) { + return 0, xerrors.Errorf("wallet balance is too low") + } + + walletEvm, err := ethtypes.EthAddressFromFilecoinAddress(fSender) + if err != nil { + return 0, xerrors.Errorf("failed to convert wallet address to Eth address: %w", err) + } + + contractAddr, err := ServiceRegistryAddress() + if err != nil { + return 0, xerrors.Errorf("failed to get service registry address: %w", err) + } + + srAbi, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return 0, xerrors.Errorf("failed to get service registry ABI: %w", err) + } + + registry, err := NewServiceProviderRegistry(contractAddr, ethClient) + if err != nil { + return 0, xerrors.Errorf("failed to create service registry: %w", err) + } + + encodedPDP, err := registry.EncodePDPOffering(&bind.CallOpts{Context: ctx}, pdpOffering) + if err != nil { + return 0, xerrors.Errorf("failed to encode PDP offering: %w", err) + } + + if len(keys) > 10 { + return 0, xerrors.Errorf("too many capabilities, max 10 allowed") + } + + // Prepare EVM calldata + calldata, err := srAbi.Pack("registerProvider", common.Address(walletEvm), name, description, uint8(0), encodedPDP, keys, values) + if err != nil { + return 0, fmt.Errorf("failed to serialize parameters for registerProvider: %w", err) + } + + signedTx, err := createSignedTransaction(ctx, ethClient, privateKey, sender, contractAddr, amount.Int, calldata) + if err != nil { + return 0, xerrors.Errorf("creating signed transaction: %w", err) + } + + err = ethClient.SendTransaction(ctx, signedTx) + if err != nil { + return 0, xerrors.Errorf("sending transaction: %w", err) + } + + log.Infof("Sent Register Service Provider transaction %s at %s", signedTx.Hash().String(), time.Now().Format(time.RFC3339Nano)) + + ctxCancel, cancel := context.WithTimeout(ctx, 5*time.Minute) + defer cancel() + + for { + _, pending, err := ethClient.TransactionByHash(ctxCancel, signedTx.Hash()) + if err != nil { + if errors.Is(err, context.Canceled) { + return 0, xerrors.Errorf("timed out while waiting for transaction %s to be mined: %w", signedTx.Hash().String(), err) + } + if strings.Contains(err.Error(), "not found") { + time.Sleep(5 * time.Second) + continue + } + return 0, xerrors.Errorf("getting transaction %s status: %w", signedTx.Hash().String(), err) + } + if pending { + time.Sleep(5 * time.Second) + continue + } + break + } + + receipt, err := ethClient.TransactionReceipt(ctx, signedTx.Hash()) + if err != nil { + return 0, xerrors.Errorf("getting transaction receipt: %w", err) + } + + event, exists := srAbi.Events["ProviderRegistered"] + if !exists { + return 0, xerrors.Errorf("ProviderRegistered event not found in ABI") + } + + for _, vLog := range receipt.Logs { + if len(vLog.Topics) > 0 && vLog.Topics[0] == event.ID { + if len(vLog.Topics) < 2 { + return 0, xerrors.Errorf("log does not contain providerId topic") + } + + // Compare that event log contains the correct payee + payee := common.BytesToAddress(vLog.Topics[1].Bytes()) + if payee != sender { + continue + } + + setIdBigInt := new(big.Int).SetBytes(vLog.Topics[1].Bytes()) + return setIdBigInt.Uint64(), nil + } + } + + return 0, xerrors.Errorf("ProviderRegistered event not found in receipt of transaction %s", signedTx.Hash().String()) +} + +func getSender(ctx context.Context, db *harmonydb.DB) (common.Address, address.Address, *ecdsa.PrivateKey, error) { + // Fetch the private key from the database + var privateKeyData []byte + err := db.QueryRow(ctx, + `SELECT private_key FROM eth_keys WHERE role = 'pdp'`).Scan(&privateKeyData) + if err != nil { + return common.Address{}, address.Address{}, nil, xerrors.Errorf("fetching pdp private key from db: %w", err) + } + + privateKey, err := crypto.ToECDSA(privateKeyData) + if err != nil { + return common.Address{}, address.Address{}, nil, xerrors.Errorf("converting private key: %w", err) + } + + sender := crypto.PubkeyToAddress(privateKey.PublicKey) + + fSender, err := address.NewDelegatedAddress(builtin.EthereumAddressManagerActorID, sender.Bytes()) + if err != nil { + return common.Address{}, address.Address{}, nil, xerrors.Errorf("failed to create delegated address: %w", err) + } + + return sender, fSender, privateKey, nil +} + +func createSignedTransaction(ctx context.Context, ethClient *ethclient.Client, privateKey *ecdsa.PrivateKey, from, to common.Address, amount *mbig.Int, data []byte) (*etypes.Transaction, error) { + msg := ethereum.CallMsg{ + From: from, + To: &to, + Value: amount, + Data: data, + } + + gasLimit, err := ethClient.EstimateGas(ctx, msg) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + if gasLimit == 0 { + return nil, fmt.Errorf("estimated gas limit is zero") + } + + // Fetch current base fee + header, err := ethClient.HeaderByNumber(ctx, nil) + if err != nil { + return nil, fmt.Errorf("failed to get latest block header: %w", err) + } + + baseFee := header.BaseFee + if baseFee == nil { + return nil, fmt.Errorf("base fee not available; network might not support EIP-1559") + } + + // Set GasTipCap (maxPriorityFeePerGas) + gasTipCap, err := ethClient.SuggestGasTipCap(ctx) + if err != nil { + return nil, xerrors.Errorf("estimating gas premium: %w", err) + } + + // Calculate GasFeeCap (maxFeePerGas) + gasFeeCap := big.NewInt(0).Add(baseFee, gasTipCap) + + chainID, err := ethClient.NetworkID(ctx) + if err != nil { + return nil, xerrors.Errorf("getting network ID: %w", err) + } + + pendingNonce, err := ethClient.PendingNonceAt(ctx, from) + if err != nil { + return nil, xerrors.Errorf("getting pending nonce: %w", err) + } + + // Create a new transaction with estimated gas limit and fee caps + tx := etypes.NewTx(&etypes.DynamicFeeTx{ + ChainID: chainID, + Nonce: pendingNonce, + GasFeeCap: gasFeeCap, + GasTipCap: gasTipCap, + Gas: gasLimit, + To: &to, + Value: amount, + Data: data, + }) + + // Sign the transaction + signer := etypes.LatestSignerForChainID(chainID) + signedTx, err := etypes.SignTx(tx, signer, privateKey) + if err != nil { + return nil, xerrors.Errorf("signing transaction: %w", err) + } + + return signedTx, nil +} + +func FSUpdateProvider(ctx context.Context, name, description string, db *harmonydb.DB, ethClient *ethclient.Client) (string, error) { + if len(name) > 128 { + return "", xerrors.Errorf("name is too long, max 128 characters allowed") + } + + if name == "" { + return "", xerrors.Errorf("name is required") + } + + if len(description) > 128 { + return "", xerrors.Errorf("description is too long, max 128 characters allowed") + } + + sender, _, privateKey, err := getSender(ctx, db) + if err != nil { + return "", xerrors.Errorf("failed to get sender: %w", err) + } + + contractAddr, err := ServiceRegistryAddress() + if err != nil { + return "", xerrors.Errorf("failed to get service registry address: %w", err) + } + + srAbi, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return "", xerrors.Errorf("failed to get service registry ABI: %w", err) + } + + calldata, err := srAbi.Pack("updateProviderInfo", name, description) + if err != nil { + return "", xerrors.Errorf("failed to serialize parameters for updateProviderInfo: %w", err) + } + + signedTx, err := createSignedTransaction(ctx, ethClient, privateKey, sender, contractAddr, mbig.NewInt(0), calldata) + if err != nil { + return "", xerrors.Errorf("creating signed transaction: %w", err) + } + + err = ethClient.SendTransaction(ctx, signedTx) + if err != nil { + return "", xerrors.Errorf("sending transaction: %w", err) + } + + return signedTx.Hash().String(), nil +} + +func FSUpdatePDPService(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client, pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilities map[string]string) (string, error) { + var keys, values []string + for k, v := range capabilities { + keys = append(keys, k) + values = append(values, v) + } + + sender, _, privateKey, err := getSender(ctx, db) + if err != nil { + return "", xerrors.Errorf("failed to get sender: %w", err) + } + + contractAddr, err := ServiceRegistryAddress() + if err != nil { + return "", xerrors.Errorf("failed to get service registry address: %w", err) + } + + srAbi, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return "", xerrors.Errorf("failed to get service registry ABI: %w", err) + } + + registry, err := NewServiceProviderRegistry(contractAddr, ethClient) + if err != nil { + return "", xerrors.Errorf("failed to create service registry: %w", err) + } + + encodedPDP, err := registry.EncodePDPOffering(&bind.CallOpts{Context: ctx}, pdpOffering) + if err != nil { + return "", xerrors.Errorf("failed to encode PDP offering: %w", err) + } + + calldata, err := srAbi.Pack("updatePDPServiceWithCapabilities", encodedPDP, keys, values) + if err != nil { + return "", xerrors.Errorf("failed to serialize parameters for updatePDPServiceWithCapabilities: %w", err) + } + + signedTx, err := createSignedTransaction(ctx, ethClient, privateKey, sender, contractAddr, mbig.NewInt(0), calldata) + if err != nil { + return "", xerrors.Errorf("creating signed transaction: %w", err) + } + + err = ethClient.SendTransaction(ctx, signedTx) + if err != nil { + return "", xerrors.Errorf("sending transaction: %w", err) + } + + return signedTx.Hash().String(), nil +} diff --git a/pdp/handlers.go b/pdp/handlers.go index 0bf57c503..1ae8229c6 100644 --- a/pdp/handlers.go +++ b/pdp/handlers.go @@ -33,8 +33,7 @@ import ( types2 "github.com/filecoin-project/lotus/chain/types" ) -// PDPRoutePath is the base path for PDP routes -const PDPRoutePath = "/pdp" +const requestTimeout = 10 * time.Second // PDPService represents the service for managing proof sets and pieces type PDPService struct { @@ -65,27 +64,30 @@ func NewPDPService(db *harmonydb.DB, stor paths.StashStore, ec *ethclient.Client } // Routes registers the HTTP routes with the provided router -func Routes(r *chi.Mux, p *PDPService) { +func Routes(p *PDPService) http.Handler { + + r := chi.NewRouter() + // Routes for proof sets - r.Route(path.Join(PDPRoutePath, "/proof-sets"), func(r chi.Router) { + r.Route("/proof-sets", func(r chi.Router) { // POST /pdp/proof-sets - Create a new proof set - r.Post("/", p.handleCreateProofSet) + r.Method("POST", "/", http.TimeoutHandler(http.HandlerFunc(p.handleCreateProofSet), requestTimeout, "request timeout")) // GET /pdp/proof-sets/created/{txHash} - Get the status of a proof set creation - r.Get("/created/{txHash}", p.handleGetProofSetCreationStatus) + r.Method("GET", "/created/{txHash}", http.TimeoutHandler(http.HandlerFunc(p.handleGetProofSetCreationStatus), requestTimeout, "request timeout")) // Individual proof set routes r.Route("/{proofSetID}", func(r chi.Router) { // GET /pdp/proof-sets/{set-id} - r.Get("/", p.handleGetProofSet) + r.Method("GET", "/", http.TimeoutHandler(http.HandlerFunc(p.handleGetProofSet), requestTimeout, "request timeout")) // DEL /pdp/proof-sets/{set-id} - r.Delete("/", p.handleDeleteProofSet) + r.Method("DELETE", "/", http.TimeoutHandler(http.HandlerFunc(p.handleDeleteProofSet), requestTimeout, "request timeout")) // Routes for roots within a proof set r.Route("/roots", func(r chi.Router) { // POST /pdp/proof-sets/{set-id}/roots - r.Post("/", p.handleAddRootToProofSet) + r.Method("POST", "/", http.TimeoutHandler(http.HandlerFunc(p.handleAddRootToProofSet), requestTimeout, "request timeout")) // GET /pdp/proof-sets/{set-id}/roots/added/{txHash} r.Get("/added/{txHash}", p.handleGetRootAdditionStatus) @@ -93,26 +95,27 @@ func Routes(r *chi.Mux, p *PDPService) { // Individual root routes r.Route("/{rootID}", func(r chi.Router) { // GET /pdp/proof-sets/{set-id}/roots/{root-id} - r.Get("/", p.handleGetProofSetRoot) + r.Method("GET", "/", http.TimeoutHandler(http.HandlerFunc(p.handleGetProofSetRoot), requestTimeout, "request timeout")) // DEL /pdp/proof-sets/{set-id}/roots/{root-id} - r.Delete("/", p.handleDeleteProofSetRoot) + r.Method("DELETE", "/", http.TimeoutHandler(http.HandlerFunc(p.handleDeleteProofSetRoot), requestTimeout, "request timeout")) }) }) }) }) - r.Get(path.Join(PDPRoutePath, "/ping"), p.handlePing) + r.Method("GET", "/ping", http.TimeoutHandler(http.HandlerFunc(p.handlePing), requestTimeout, "request timeout")) // Routes for piece storage and retrieval // POST /pdp/piece - r.Post(path.Join(PDPRoutePath, "/piece"), p.handlePiecePost) + r.Method("POST", "/piece", http.TimeoutHandler(http.HandlerFunc(p.handlePiecePost), requestTimeout, "request timeout")) // GET /pdp/piece/ - r.Get(path.Join(PDPRoutePath, "/piece/"), p.handleFindPiece) + r.Method("GET", "/piece", http.TimeoutHandler(http.HandlerFunc(p.handleFindPiece), requestTimeout, "request timeout")) // PUT /pdp/piece/upload/{uploadUUID} - r.Put(path.Join(PDPRoutePath, "/piece/upload/{uploadUUID}"), p.handlePieceUpload) + r.Put("/piece/upload/{uploadUUID}", p.handlePieceUpload) + return r } // Handler functions @@ -357,7 +360,7 @@ func (p *PDPService) handleGetProofSetCreationStatus(w http.ResponseWriter, r *h WHERE create_message_hash = $1 `, txHash).Scan(&proofSetCreate.CreateMessageHash, &proofSetCreate.OK, &proofSetCreate.ProofSetCreated, &proofSetCreate.Service) if err != nil { - if err == sql.ErrNoRows { + if errors.Is(err, pgx.ErrNoRows) { http.Error(w, "Proof set creation not found for given txHash", http.StatusNotFound) return } @@ -394,7 +397,7 @@ func (p *PDPService) handleGetProofSetCreationStatus(w http.ResponseWriter, r *h WHERE signed_tx_hash = $1 `, txHash).Scan(&txStatus) if err != nil { - if err == sql.ErrNoRows { + if errors.Is(err, pgx.ErrNoRows) { // This should not happen as per foreign key constraints http.Error(w, "Message status not found for given txHash", http.StatusInternalServerError) return diff --git a/pdp/handlers_upload.go b/pdp/handlers_upload.go index fec8ebdfc..69efc0840 100644 --- a/pdp/handlers_upload.go +++ b/pdp/handlers_upload.go @@ -6,6 +6,7 @@ import ( "database/sql" "encoding/hex" "encoding/json" + "errors" "fmt" "hash" "io" @@ -84,7 +85,7 @@ func (ph *PieceHash) commp(ctx context.Context, db *harmonydb.DB) (cid.Cid, bool SELECT commp FROM pdp_piece_mh_to_commp WHERE mhash = $1 AND size = $2 `, mh, ph.Size).Scan(&commpStr) if err != nil { - if err == pgx.ErrNoRows { + if errors.Is(err, pgx.ErrNoRows) { return cid.Undef, false, nil } return cid.Undef, false, fmt.Errorf("failed to query pdp_piece_mh_to_commp: %w", err) @@ -205,7 +206,7 @@ func (p *PDPService) handlePiecePost(w http.ResponseWriter, r *http.Request) { } // Create a location URL where the piece data can be uploaded via PUT - uploadURL = path.Join(PDPRoutePath, "/piece/upload", uploadUUID.String()) + uploadURL = path.Join(r.URL.Path, "upload", uploadUUID.String()) responseStatus = http.StatusCreated return true, nil // Commit the transaction @@ -260,7 +261,7 @@ func (p *PDPService) handlePieceUpload(w http.ResponseWriter, r *http.Request) { SELECT piece_cid, notify_url, piece_ref, check_hash_codec, check_hash, check_size FROM pdp_piece_uploads WHERE id = $1 `, uploadUUID.String()).Scan(&pieceCIDStr, ¬ifyURL, &pieceRef, &checkHashName, &checkHash, &checkSize) if err != nil { - if err == sql.ErrNoRows { + if errors.Is(err, pgx.ErrNoRows) { http.Error(w, "Upload UUID not found", http.StatusNotFound) } else { http.Error(w, "Database error", http.StatusInternalServerError) diff --git a/scripts/generate-cli.py b/scripts/generate-cli.py index 69876d0aa..956944bd2 100644 --- a/scripts/generate-cli.py +++ b/scripts/generate-cli.py @@ -55,5 +55,8 @@ def get_cmd_recursively(cur_cmd): os.putenv("LOTUS_DOCS_GENERATION", "1") os.putenv("CURIO_VERSION_IGNORE_COMMIT", "1") + + # Set LANG=en-US to ensure help text is generated in English + os.putenv("LANG", "en-US") generate_lotus_cli('curio') generate_lotus_cli('sptool') diff --git a/tasks/f3/f3_task.go b/tasks/f3/f3_task.go index 86d280ae8..248bec11f 100644 --- a/tasks/f3/f3_task.go +++ b/tasks/f3/f3_task.go @@ -13,6 +13,7 @@ import ( "github.com/filecoin-project/go-f3/manifest" "github.com/filecoin-project/curio/deps" + "github.com/filecoin-project/curio/deps/config" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/harmony/harmonytask" "github.com/filecoin-project/curio/harmony/resources" @@ -52,10 +53,10 @@ type F3Task struct { leaseTerm uint64 - actors map[dtypes.MinerAddress]bool + actors *config.Dynamic[map[dtypes.MinerAddress]bool] } -func NewF3Task(db *harmonydb.DB, api F3ParticipationAPI, actors map[dtypes.MinerAddress]bool) *F3Task { +func NewF3Task(db *harmonydb.DB, api F3ParticipationAPI, actors *config.Dynamic[map[dtypes.MinerAddress]bool]) *F3Task { return &F3Task{ db: db, api: api, @@ -210,22 +211,26 @@ func (f *F3Task) TypeDetails() harmonytask.TaskTypeDetails { } func (f *F3Task) Adder(taskFunc harmonytask.AddTaskFunc) { - for a := range f.actors { - spid, err := address.IDFromAddress(address.Address(a)) - if err != nil { - log.Errorw("failed to parse miner address", "miner", a, "error", err) - continue - } - - taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { - n, err := tx.Exec("INSERT INTO f3_tasks (sp_id, task_id) VALUES ($1, $2) ON CONFLICT DO NOTHING", spid, id) + f3TheActors := func() { + for a := range f.actors.Get() { + spid, err := address.IDFromAddress(address.Address(a)) if err != nil { - return false, err + log.Errorw("failed to parse miner address", "miner", a, "error", err) + continue } - return n > 0, nil - }) + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + n, err := tx.Exec("INSERT INTO f3_tasks (sp_id, task_id) VALUES ($1, $2) ON CONFLICT DO NOTHING", spid, id) + if err != nil { + return false, err + } + + return n > 0, nil + }) + } } + f3TheActors() + f.actors.OnChange(f3TheActors) } func (f *F3Task) GetSpid(db *harmonydb.DB, taskID int64) string { diff --git a/tasks/gc/pipeline_meta_gc.go b/tasks/gc/pipeline_meta_gc.go index 9dc7269d4..ffb3372ed 100644 --- a/tasks/gc/pipeline_meta_gc.go +++ b/tasks/gc/pipeline_meta_gc.go @@ -38,6 +38,12 @@ func (s *PipelineGC) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done return false, xerrors.Errorf("cleanupUnseal: %w", err) } + if err := s.cleanupMK20DealPipeline(); err != nil { + return false, xerrors.Errorf("cleanupMK20DealPipeline: %w", err) + } + if err := s.cleanupPDPPipeline(); err != nil { + return false, xerrors.Errorf("cleanupPDPPipeline: %w", err) + } return true, nil } @@ -158,12 +164,8 @@ func (s *PipelineGC) cleanupUpgrade() error { } func (s *PipelineGC) cleanupMK12DealPipeline() error { - // Remove market_mk12_deal_pipeline entries where: - // sealed is true and indexed is true ctx := context.Background() - // Execute the query - // NOTE: pipelines can be complete before indexing finishes in case of reindexing pipeline tasks (created in CheckIndex task) _, err := s.db.Exec(ctx, `DELETE FROM market_mk12_deal_pipeline WHERE (should_index = FALSE OR indexed = TRUE) AND complete = TRUE;`) if err != nil { return xerrors.Errorf("failed to clean up sealed deals: %w", err) @@ -177,6 +179,39 @@ func (s *PipelineGC) cleanupMK12DealPipeline() error { return nil } +func (s *PipelineGC) cleanupMK20DealPipeline() error { + ctx := context.Background() + + _, err := s.db.Exec(ctx, `DELETE FROM market_mk20_offline_urls + WHERE id IN ( + SELECT id FROM market_mk20_pipeline WHERE complete = TRUE)`) + if err != nil { + return xerrors.Errorf("failed to clean up offline urls: %w", err) + } + _, err = s.db.Exec(ctx, `DELETE FROM market_mk20_download_pipeline + WHERE id IN ( + SELECT id FROM market_mk20_pipeline WHERE complete = TRUE)`) + if err != nil { + return xerrors.Errorf("failed to clean up download pipeline: %w", err) + } + _, err = s.db.Exec(ctx, `DELETE FROM market_mk20_pipeline WHERE (indexing = FALSE OR indexed = TRUE) AND complete = TRUE;`) + if err != nil { + return xerrors.Errorf("failed to clean up sealed deals: %w", err) + } + + _, err = s.db.Exec(ctx, `DELETE FROM pdp_ipni_task WHERE complete = TRUE;`) + if err != nil { + return xerrors.Errorf("failed to clean up PDP indexing tasks: %w", err) + } + + _, err = s.db.Exec(ctx, `DELETE FROM piece_cleanup WHERE complete = TRUE;`) + if err != nil { + return xerrors.Errorf("failed to clean up piece cleanup: %w", err) + } + + return nil +} + func (s *PipelineGC) cleanupUnseal() error { // Remove sectors_unseal_pipeline entries where: // after_unseal_sdr is true @@ -196,5 +231,14 @@ func (s *PipelineGC) cleanupUnseal() error { return nil } +func (s *PipelineGC) cleanupPDPPipeline() error { + ctx := context.Background() + _, err := s.db.Exec(ctx, `DELETE FROM pdp_pipeline WHERE complete = TRUE;`) + if err != nil { + return xerrors.Errorf("failed to clean up sealed deals: %w", err) + } + return nil +} + var _ harmonytask.TaskInterface = &PipelineGC{} var _ = harmonytask.Reg(&PipelineGC{}) diff --git a/tasks/gc/storage_gc_mark.go b/tasks/gc/storage_gc_mark.go index de4ee17c2..f1fdd14a2 100644 --- a/tasks/gc/storage_gc_mark.go +++ b/tasks/gc/storage_gc_mark.go @@ -324,6 +324,9 @@ func (s *StorageGCMark) Do(taskID harmonytask.TaskID, stillOwned func() bool) (d lb := policy.GetWinningPoStSectorSetLookback(nv) + builtin.EpochsInDay + 1 finalityHeight := head.Height() - lb + if finalityHeight < 0 { + finalityHeight = 1 + } finalityTipset, err := s.api.ChainGetTipSetByHeight(ctx, finalityHeight, head.Key()) if err != nil { diff --git a/tasks/gc/task_cleanup_piece.go b/tasks/gc/task_cleanup_piece.go new file mode 100644 index 000000000..977f6b4f3 --- /dev/null +++ b/tasks/gc/task_cleanup_piece.go @@ -0,0 +1,485 @@ +package gc + +import ( + "context" + "database/sql" + "errors" + "time" + + "github.com/google/uuid" + "github.com/ipfs/go-cid" + "github.com/oklog/ulid" + "github.com/samber/lo" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/lib/promise" + "github.com/filecoin-project/curio/market/indexstore" + "github.com/filecoin-project/curio/market/mk20" +) + +type PieceCleanupTask struct { + db *harmonydb.DB + indexStore *indexstore.IndexStore + TF promise.Promise[harmonytask.AddTaskFunc] +} + +func NewPieceCleanupTask(db *harmonydb.DB, indexStore *indexstore.IndexStore) *PieceCleanupTask { + return &PieceCleanupTask{ + db: db, + indexStore: indexStore, + } +} + +func (p *PieceCleanupTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + // TODO: Plug this into PoRep 1.2 and 2.0 clean up as well + // TODO: Remove Deal from MK12 and Mk20? + + ctx := context.Background() + + var tasks []struct { + ID string `db:"id"` + PieceCid string `db:"piece_cid_v2"` + PDP bool `db:"pdp"` + Sector int64 `db:"sector_number"` + SPID int64 `db:"sp_id"` + PieceRef sql.NullInt64 `db:"piece_ref"` + } + + err = p.db.Select(ctx, &tasks, `SELECT id, piece_cid_v2, pdp, sp_id, sector_number, piece_ref FROM piece_cleanup WHERE cleanup_task_id = $1 AND after_cleanup = FALSE`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to get piece cleanup task: %w", err) + } + + if len(tasks) != 1 { + return false, xerrors.Errorf("expected 1 piece cleanup task but got %d", len(tasks)) + } + + task := tasks[0] + + var isMK12 bool + var isMK20 bool + _, err = uuid.Parse(task.ID) + if err == nil { + isMK12 = true + } else { + _, err = ulid.Parse(task.ID) + if err == nil { + isMK20 = true + } + if err != nil { + return false, xerrors.Errorf("failed to parse task ID %s: %w", task.ID, err) + } + } + + pcid2, err := cid.Parse(task.PieceCid) + if err != nil { + return false, xerrors.Errorf("failed to parse piece cid: %w", err) + } + + pi, err := mk20.GetPieceInfo(pcid2) + if err != nil { + return false, xerrors.Errorf("failed to get piece info for piece %s: %w", pcid2, err) + } + + // Did we index this piece? + var indexed bool + err = p.db.QueryRow(ctx, `SELECT indexed FROM market_piece_metadata WHERE piece_cid = $1 AND piece_size = $2`, pi.PieceCIDV1.String(), pi.Size).Scan(&indexed) + if err != nil { + return false, xerrors.Errorf("failed to check if piece if indexe: %w", err) + } + + dropIndex := true + + type pd struct { + ID string `db:"id"` + } + + var pieceDeals []pd + + // Let's piece deals as we need to make a complicated decision about IPNI and Indexing + err = p.db.Select(ctx, &pieceDeals, `SELECT id FROM market_piece_deal WHERE piece_cid = $1 AND piece_length = $2`, pi.PieceCIDV1.String(), pi.Size) + if err != nil { + return false, xerrors.Errorf("failed to get piece deals: %w", err) + } + + if len(pieceDeals) == 0 { + // This could be due to partial clean up + log.Infof("No piece deals found for piece %s", taskID) + return false, nil + } + /* + Get a list of piece deals + 1. If only single row then check + a) MK1.2 + i) publish IPNI removal ad + ii) Drop index + b) MK2.0 + i) Publish IPNI Ad based on attached product + ii) Drop index if any + iii) Drop Aggregate index + 2. If multiple rows then, check if + a.) MK1.2 + i) If any of the deals is MK1.2 and is not the deal we are cleaning, then keep the indexes and don't publish IPNI rm Ad + ii) If there are any MK2.0 deal then check if they are PoRep or PDP + a.) If any of the deals is MK1.2 and is not the deal we are cleaning, then keep the indexes + b.) If 2 rows, with same ID then we have PoRep and PDP for same deal. Clean up based on product. + c.) If we have multiple rows with different MK2.0 deals then we need to make a complex decision + i) Check if any of them apart from deal we are cleaning is paying to keep index. If yes, then don't remove them + ii) Check if any of them is paying to keep IPNI payload announced apart from deal we are cleaning. If yes, then don't publish RM ad + iii) Don't publish RM ad for IPNI piece if we have any other PDP deals + */ + + if len(pieceDeals) == 1 { + // Single piece deal, then drop index if deal ID matches + pieceDeal := pieceDeals[0] + if task.ID != pieceDeal.ID { + return false, xerrors.Errorf("piece deal ID %s does not match task ID %s", pieceDeal.ID, task.ID) + } + + if isMK12 { + err := p.ipniRemoval(ctx, task.ID, false, true, task.PDP) + if err != nil { + return false, xerrors.Errorf("failed to publish IPNI removal ad for piece %s, Single MK12 deal %s: %w", pcid2, task.ID, err) + } + } + + if isMK20 { + lid, err := ulid.Parse(pieceDeal.ID) + if err != nil { + return false, xerrors.Errorf("failed to parse piece deal ID %s: %w", pieceDeal.ID, err) + } + + deal, err := mk20.DealFromDB(ctx, p.db, lid) + if err != nil { + return false, xerrors.Errorf("failed to get deal for id %s: %w", lid, err) + } + + if deal.Products.RetrievalV1 == nil { + // Return early, we don't need to drop index or publish rm ads + return true, nil + } + + retv := deal.Products.RetrievalV1 + + if task.PDP { + // Let's publish PDP removal first + err := p.ipniRemoval(ctx, task.ID, retv.AnnouncePiece, retv.AnnouncePayload, task.PDP) + if err != nil { + return false, xerrors.Errorf("failed to update piece cleanup for single MK20 deal: %w", err) + } + } else { + err := p.ipniRemoval(ctx, task.ID, false, true, task.PDP) + if err != nil { + return false, xerrors.Errorf("failed to update payload cleanup for single MK20 deal: %w", err) + } + } + } + } else { + // If we have multiple rows + var mk12List []uuid.UUID + var mk20List []ulid.ULID + var pieceDeal pd + for _, pDeal := range pieceDeals { + if pDeal.ID == task.ID { + pieceDeal = pDeal + continue + } + + uid, err := uuid.Parse(pDeal.ID) + if err == nil { + mk12List = append(mk12List, uid) + continue + } + lid, serr := ulid.Parse(pDeal.ID) + if serr == nil { + mk20List = append(mk20List, lid) + continue + } + return false, xerrors.Errorf("failed to parse piece deal ID %s: %w, %w", pieceDeal.ID, err, serr) + + } + lo.Uniq(mk12List) + lo.Uniq(mk20List) + if isMK12 { + rmAccounce := true + if len(mk12List) > 1 { + // Don't drop index or publish removal we have same the piece in another deal + dropIndex = false + rmAccounce = false + } + if len(mk20List) > 0 { + for _, d := range mk20List { + deal, err := mk20.DealFromDB(ctx, p.db, d) + if err != nil { + return false, xerrors.Errorf("failed to get deal for id %s: %w", d, err) + } + // If MK20 deal is not DDO, then the context would be different and we can skip + if deal.Products.DDOV1 == nil { + continue + } + if deal.Products.RetrievalV1 == nil { + continue + } + retv := deal.Products.RetrievalV1 + if retv.Indexing { + dropIndex = false + } + if retv.AnnouncePayload { + // No need to publish rm Ad as another MK20 deal is paying for it + rmAccounce = false + break + } + } + } + if rmAccounce { + err := p.ipniRemoval(ctx, task.ID, false, true, task.PDP) + if err != nil { + return false, xerrors.Errorf("failed to update piece cleanup for MK12 deal: %w", err) + } + } + } + + if isMK20 { + // If this is PDP then we need to check if we have any other PDP deals because contextID is different for PDP and PoRep deals + if task.PDP { + rmPayload := true + rmPiece := true + + if len(mk20List) > 0 { + for _, d := range mk20List { + deal, err := mk20.DealFromDB(ctx, p.db, d) + if err != nil { + return false, xerrors.Errorf("failed to get deal for id %s: %w", d, err) + } + if deal.Products.PDPV1 == nil { + continue + } + if deal.Products.RetrievalV1 == nil { + continue + } + retv := deal.Products.RetrievalV1 + + if retv.AnnouncePiece { + rmPiece = false + } + if retv.AnnouncePayload { + rmPayload = false + } + + } + } + + err := p.ipniRemoval(ctx, task.ID, rmPiece, rmPayload, task.PDP) + if err != nil { + return false, xerrors.Errorf("failed to update piece and payload cleanup for MK20 PDP deal: %w", err) + } + } else { + rmAnnounce := true + + // If we have another PoRep MK12 deal then don't announce removal + if len(mk12List) > 0 { + rmAnnounce = false + } + + if len(mk20List) > 0 { + for _, d := range mk20List { + deal, err := mk20.DealFromDB(ctx, p.db, d) + if err != nil { + return false, xerrors.Errorf("failed to get deal for id %s: %w", d, err) + } + // If MK20 deal is not DDO, then the context would be different and we can skip + if deal.Products.DDOV1 == nil { + continue + } + if deal.Products.RetrievalV1 == nil { + continue + } + if !deal.Products.RetrievalV1.Indexing { + dropIndex = false + } + + if !deal.Products.RetrievalV1.AnnouncePayload { + rmAnnounce = false + } + } + } + + if rmAnnounce { + err := p.ipniRemoval(ctx, task.ID, false, true, task.PDP) + if err != nil { + return false, xerrors.Errorf("failed to update payload cleanup for MK20 deal: %w", err) + } + } + } + } + } + + if dropIndex { + err = dropIndexes(ctx, p.indexStore, pcid2, pi.PieceCIDV1) + if err != nil { + return false, xerrors.Errorf("failed to drop indexes for piece %s: %w", pcid2, err) + } + err = dropAggregateIndex(ctx, p.indexStore, pcid2) + if err != nil { + return false, xerrors.Errorf("failed to drop aggregate index for piece %s: %w", pcid2, err) + } + } + + var shouldDropCache bool + err = p.db.QueryRow(ctx, `SELECT NOT EXISTS ( + SELECT 1 + FROM market_piece_deal mpd + WHERE mpd.piece_cid = $1 + AND mpd.piece_length = $2 + AND mpd.id IS DISTINCT FROM $3 + AND mpd.sp_id = -1 + ) AS ok;`, pi.PieceCIDV1.String(), pi.Size, task.ID).Scan(&shouldDropCache) + if err != nil { + return false, xerrors.Errorf("failed to check if we should drop cache for piece %s: %w", pcid2, err) + } + + if shouldDropCache { + err = p.indexStore.DeletePDPLayer(ctx, pcid2) + if err != nil { + return false, xerrors.Errorf("failed to drop cache for piece %s: %w", pcid2, err) + } + } + + comm, err := p.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + if task.PDP { + _, err = tx.Exec(`SELECT remove_piece_deal($1, $2, $3, $4)`, task.ID, -1, pi.PieceCIDV1.String(), pi.Size) + } else { + _, err = tx.Exec(`SELECT remove_piece_deal($1, $2, $3, $4)`, task.ID, task.SPID, pi.PieceCIDV1.String(), pi.Size) + } + + if err != nil { + return false, xerrors.Errorf("failed to remove piece deal: %w", err) + } + + // Drop piece ref + if task.PieceRef.Valid { + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = $1`, task.PieceRef.Int64) + if err != nil { + return false, xerrors.Errorf("failed to remove parked piece ref: %w", err) + } + } + + _, err = tx.Exec(`UPDATE piece_cleanup SET + cleanup_task_id = NULL, + after_cleanup = TRUE, + piece_cid = $1, + piece_size = $2 + WHERE cleanup_task_id = $3`, pi.PieceCIDV1.String(), pi.Size, taskID) + if err != nil { + return false, xerrors.Errorf("failed to mark complete cleanup task: %w", err) + } + return true, nil + + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("failed to commit piece cleanup: %w", err) + } + if !comm { + return false, xerrors.Errorf("failed to commit piece cleanup") + } + + return true, nil +} + +func dropIndexes(ctx context.Context, indexStore *indexstore.IndexStore, pieceCid, pieceCid2 cid.Cid) error { + err := indexStore.RemoveIndexes(ctx, pieceCid) + if err != nil { + return xerrors.Errorf("failed to remove indexes for piece %s: %w", pieceCid, err) + } + + err = indexStore.RemoveIndexes(ctx, pieceCid2) + if err != nil { + return xerrors.Errorf("failed to remove indexes for piece %s: %w", pieceCid, err) + } + return nil +} + +func dropAggregateIndex(ctx context.Context, indexStore *indexstore.IndexStore, pieceCid cid.Cid) error { + err := indexStore.RemoveAggregateIndex(ctx, pieceCid) + if err != nil { + return xerrors.Errorf("failed to remove aggregate index for piece %s: %w", pieceCid, err) + } + return nil +} + +func (p *PieceCleanupTask) ipniRemoval(ctx context.Context, id string, rmPiece, rmPayload, pdp bool) error { + n, err := p.db.Exec(ctx, `UPDATE piece_cleanup SET announce = $1, announce_payload = $2 WHERE id = $3 and pdp = $4`, rmPiece, rmPayload, id, pdp) + if err != nil { + return xerrors.Errorf("failed to update piece and payload cleanup for deal: %w", err) + } + + if n != 1 { + return xerrors.Errorf("failed to update piece and payload cleanup for deal: %d rows updated", n) + } + return nil +} + +func (p *PieceCleanupTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + return &ids[0], nil +} + +func (p *PieceCleanupTask) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "PieceCleanup", + Cost: resources.Resources{ + Cpu: 1, + Ram: 64 << 20, + }, + MaxFailures: 3, + IAmBored: passcall.Every(30*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return p.schedule(context.Background(), taskFunc) + }), + } +} + +func (p *PieceCleanupTask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var did string + var pdp bool + err := tx.QueryRow(`SELECT id, pdp FROM piece_cleanup + WHERE cleanup_task_id IS NULL + AND after_cleanup = FALSE + LIMIT 1`).Scan(&did, &pdp) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, nil + } + return false, xerrors.Errorf("failed to query piece_cleanup: %w", err) + } + + _, err = tx.Exec(`UPDATE piece_cleanup SET cleanup_task_id = $1 WHERE id = $2 AND pdp = $3 AND after_cleanup = FALSE`, id, did, pdp) + if err != nil { + return false, xerrors.Errorf("failed to update piece_cleanup: %w", err) + } + + stop = false // we found a task to schedule, keep going + return true, nil + }) + + } + + return nil +} + +func (p *PieceCleanupTask) Adder(taskFunc harmonytask.AddTaskFunc) { + p.TF.Set(taskFunc) +} + +var _ harmonytask.TaskInterface = &PieceCleanupTask{} +var _ = harmonytask.Reg(&PieceCleanupTask{}) diff --git a/tasks/indexing/task_check_indexes.go b/tasks/indexing/task_check_indexes.go index eb47ecdfe..1d720f4a3 100644 --- a/tasks/indexing/task_check_indexes.go +++ b/tasks/indexing/task_check_indexes.go @@ -3,11 +3,18 @@ package indexing import ( "bytes" "context" + "database/sql" + "fmt" + "net/url" "time" + "github.com/google/uuid" "github.com/ipfs/go-cid" + "github.com/oklog/ulid" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" + commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/curio/harmony/harmonydb" @@ -15,9 +22,10 @@ import ( "github.com/filecoin-project/curio/harmony/resources" "github.com/filecoin-project/curio/lib/storiface" "github.com/filecoin-project/curio/market/indexstore" + "github.com/filecoin-project/curio/market/mk20" ) -const CheckIndexInterval = 9 * time.Minute +const CheckIndexInterval = time.Hour * 6 var MaxOngoingIndexingTasks = 40 @@ -59,41 +67,59 @@ func (c *CheckIndexesTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) return false, xerrors.Errorf("checking IPNI: %w", err) } + err = c.checkIPNIMK20(ctx, taskID) + if err != nil { + return false, xerrors.Errorf("checking IPNI for MK20 deals: %w", err) + } + return true, nil } func (c *CheckIndexesTask) checkIndexing(ctx context.Context, taskID harmonytask.TaskID) error { type checkEntry struct { - PieceCid string `db:"piece_cid"` - PieceLen int64 `db:"piece_length"` - PieceOff int64 `db:"piece_offset"` - SPID int64 `db:"sp_id"` - SectorID int64 `db:"sector_num"` - RawSize int64 `db:"raw_size"` + ID string `db:"id"` + PieceCid string `db:"piece_cid"` + PieceLen int64 `db:"piece_length"` + PieceOff int64 `db:"piece_offset"` + SPID int64 `db:"sp_id"` + SectorID int64 `db:"sector_num"` + RawSize int64 `db:"raw_size"` + PieceRef sql.NullInt64 `db:"piece_ref"` } var toCheckList []checkEntry err := c.db.Select(ctx, &toCheckList, ` - SELECT mm.piece_cid, mpd.piece_length, mpd.piece_offset, mpd.sp_id, mpd.sector_num, mpd.raw_size + SELECT mm.piece_cid, mpd.piece_length, mpd.piece_offset, mpd.sp_id, mpd.sector_num, mpd.raw_size, mpd.piece_ref, mpd.id FROM market_piece_metadata mm - LEFT JOIN market_piece_deal mpd ON mm.piece_cid = mpd.piece_cid - WHERE mm.indexed = true + LEFT JOIN market_piece_deal mpd ON mm.piece_cid = mpd.piece_cid AND mm.piece_size = mpd.piece_length + WHERE mm.indexed = true AND mpd.sp_id > 0 AND mpd.sector_num > 0 `) if err != nil { return err } - toCheck := make(map[string][]checkEntry) + toCheck := make(map[abi.PieceInfo][]checkEntry) for _, e := range toCheckList { - toCheck[e.PieceCid] = append(toCheck[e.PieceCid], e) + pCid, err := cid.Parse(e.PieceCid) + if err != nil { + return xerrors.Errorf("parsing piece cid: %w", err) + } + pi := abi.PieceInfo{PieceCID: pCid, Size: abi.PaddedPieceSize(e.PieceLen)} + toCheck[pi] = append(toCheck[pi], e) } // Check the number of ongoing indexing tasks var ongoingIndexingTasks int64 - err = c.db.QueryRow(ctx, ` - SELECT COUNT(*) - FROM market_mk12_deal_pipeline - WHERE indexing_created_at IS NOT NULL AND indexed = false - `).Scan(&ongoingIndexingTasks) + err = c.db.QueryRow(ctx, `SELECT + ( + SELECT COUNT(*) + FROM market_mk12_deal_pipeline + WHERE indexing_created_at IS NOT NULL AND indexed = false + ) + + ( + SELECT COUNT(*) + FROM market_mk20_pipeline + WHERE indexing_created_at IS NOT NULL AND indexed = false + ) AS total_pending_indexing;`).Scan(&ongoingIndexingTasks) if err != nil { return xerrors.Errorf("counting ongoing indexing tasks: %w", err) } @@ -104,13 +130,13 @@ func (c *CheckIndexesTask) checkIndexing(ctx context.Context, taskID harmonytask var have, missing int64 - for p, cent := range toCheck { - pieceCid, err := cid.Parse(p) + for p, cents := range toCheck { + pieceCid, err := commcid.PieceCidV2FromV1(p.PieceCID, uint64(cents[0].RawSize)) if err != nil { - return xerrors.Errorf("parsing piece cid: %w", err) + return xerrors.Errorf("getting piece commP: %w", err) } - // Check if the piece is present in the index store + // Check if the pieceV2 is present in the index store hasEnt, err := c.indexStore.CheckHasPiece(ctx, pieceCid) if err != nil { return xerrors.Errorf("getting piece hash range: %w", err) @@ -121,130 +147,216 @@ func (c *CheckIndexesTask) checkIndexing(ctx context.Context, taskID harmonytask continue } - // Index not present, flag for repair - missing++ - log.Warnw("piece missing in indexstore", "piece", pieceCid, "task", taskID) - - var uuids []struct { - DealUUID string `db:"uuid"` - } - err = c.db.Select(ctx, &uuids, ` - SELECT uuid - FROM market_mk12_deals - WHERE piece_cid = $1 - `, pieceCid.String()) - if err != nil { - return xerrors.Errorf("getting deal uuids: %w", err) - } - if len(uuids) == 0 { - log.Warnw("no deals for unindexed piece", "piece", pieceCid, "task", taskID) - continue - } - - // Check the number of ongoing indexing tasks again - err = c.db.QueryRow(ctx, ` - SELECT COUNT(*) - FROM market_mk12_deal_pipeline - WHERE indexing_created_at IS NOT NULL AND indexed = false - `).Scan(&ongoingIndexingTasks) + // Check if the pieceV1 is present in the index store + hasEnt, err = c.indexStore.CheckHasPiece(ctx, p.PieceCID) if err != nil { - return xerrors.Errorf("counting ongoing indexing tasks: %w", err) - } - if ongoingIndexingTasks >= int64(MaxOngoingIndexingTasks) { - log.Warnw("too many ongoing indexing tasks, stopping processing missing pieces", "task", taskID, "ongoing", ongoingIndexingTasks) - break + return xerrors.Errorf("getting piece hash range: %w", err) } - // Collect deal UUIDs - dealUUIDs := make([]string, 0, len(uuids)) - for _, u := range uuids { - dealUUIDs = append(dealUUIDs, u.DealUUID) - } - - // Get deal details from market_mk12_deals - var deals []struct { - UUID string `db:"uuid"` - SPID int64 `db:"sp_id"` - PieceCID string `db:"piece_cid"` - PieceSize int64 `db:"piece_size"` - Offline bool `db:"offline"` - URL *string `db:"url"` - Headers []byte `db:"url_headers"` - CreatedAt time.Time `db:"created_at"` - } - err = c.db.Select(ctx, &deals, ` - SELECT uuid, sp_id, piece_cid, piece_size, offline, url, url_headers, created_at - FROM market_mk12_deals - WHERE uuid = ANY($1) - `, dealUUIDs) - if err != nil { - return xerrors.Errorf("getting deal details: %w", err) + if hasEnt { + have++ + continue } - // Use the first deal for processing - deal := deals[0] - - var sourceSector *storiface.SectorRef - var sourceOff, rawSize int64 - for _, entry := range cent { - if entry.SPID != deal.SPID { - continue - } - if sourceSector = c.findSourceSector(ctx, entry.SPID, entry.SectorID); sourceSector == nil { - // No unsealed copy - continue - } - sourceOff = entry.PieceOff - rawSize = entry.RawSize - break - } + // Index not present, flag for repair + missing++ + log.Warnw("piece missing in indexstore", "piece", pieceCid, "task", taskID) - if sourceSector == nil { - log.Infow("no unsealed copy of sector found for reindexing", "piece", pieceCid, "task", taskID, "deals", len(deals), "have", have, "missing", missing, "ongoing", ongoingIndexingTasks) - continue - } + for _, cent := range cents { + var isMK12 bool + var id ulid.ULID - var added bool - - _, err = c.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { - added = false - - // Insert into market_mk12_deal_pipeline - n, err := tx.Exec(` - INSERT INTO market_mk12_deal_pipeline ( - uuid, sp_id, piece_cid, piece_size, raw_size, offline, url, headers, created_at, - sector, sector_offset, reg_seal_proof, - started, after_psd, after_commp, after_find_deal, sealed, complete, - indexed, indexing_created_at, indexing_task_id, should_index - ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, - true, true, true, true, true, true, - false, NOW(), NULL, true) - ON CONFLICT (uuid) DO NOTHING - `, deal.UUID, deal.SPID, deal.PieceCID, deal.PieceSize, rawSize, deal.Offline, deal.URL, deal.Headers, deal.CreatedAt, - sourceSector.ID.Number, sourceOff, int64(sourceSector.ProofType)) + id, err := ulid.Parse(cent.ID) if err != nil { - return false, xerrors.Errorf("upserting into deal pipeline for uuid %s: %w", deal.UUID, err) + serr := err + _, err = uuid.Parse(cent.ID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w, %w", serr, err) + } + isMK12 = true } - if n == 0 { - return false, nil - } - added = true - _, err = tx.Exec(`UPDATE market_piece_metadata SET indexed = FALSE WHERE piece_cid = $1`, pieceCid.String()) - if err != nil { - return false, xerrors.Errorf("updating market_piece_metadata.indexed column: %w", err) + var scheduled bool + + if isMK12 { + // Get deal details from market_mk12_deals + var mk12deals []struct { + UUID string `db:"uuid"` + SPID int64 `db:"sp_id"` + PieceCID string `db:"piece_cid"` + PieceSize int64 `db:"piece_size"` + Offline bool `db:"offline"` + CreatedAt time.Time `db:"created_at"` + } + err = c.db.Select(ctx, &mk12deals, `SELECT + uuid, + sp_id, + piece_cid, + piece_size, + offline, + created_at, + FALSE AS ddo + FROM market_mk12_deals + WHERE uuid = $1 + + UNION ALL + + SELECT + uuid, + sp_id, + piece_cid, + piece_size, + TRUE AS offline, + created_at, + TRUE AS ddo + FROM market_direct_deals + WHERE uuid = $1; + `, cent.ID) + if err != nil { + return xerrors.Errorf("getting deal details: %w", err) + } + + if len(mk12deals) == 0 { + log.Warnw("no mk12 deals for unindexed piece", "piece", pieceCid, "task", taskID) + continue + } + + mk12deal := mk12deals[0] + + if cent.PieceRef.Valid { + continue // This is mk20 deal + } + if cent.SPID != mk12deal.SPID { + continue + } + sourceSector := c.findSourceSector(ctx, cent.SPID, cent.SectorID) + if sourceSector == nil { + continue + } + + var added bool + + _, err = c.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + added = false + + // Insert into market_mk12_deal_pipeline + n, err := tx.Exec(` + INSERT INTO market_mk12_deal_pipeline ( + uuid, sp_id, piece_cid, piece_size, raw_size, offline, created_at, + sector, sector_offset, reg_seal_proof, + started, after_psd, after_commp, after_find_deal, sealed, complete, + indexed, indexing_created_at, indexing_task_id, should_index + ) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, + true, true, true, true, true, true, + false, NOW(), NULL, true) + ON CONFLICT (uuid) DO NOTHING + `, mk12deal.UUID, mk12deal.SPID, mk12deal.PieceCID, mk12deal.PieceSize, cent.RawSize, mk12deal.Offline, mk12deal.CreatedAt, + sourceSector.ID.Number, cent.PieceOff, int64(sourceSector.ProofType)) + if err != nil { + return false, xerrors.Errorf("upserting into deal pipeline for uuid %s: %w", mk12deal.UUID, err) + } + if n == 0 { + return false, nil + } + added = true + + _, err = tx.Exec(`UPDATE market_piece_metadata SET indexed = FALSE WHERE piece_cid = $1 AND piece_size = $2`, p.PieceCID.String(), p.Size) + if err != nil { + return false, xerrors.Errorf("updating market_piece_metadata.indexed column: %w", err) + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return xerrors.Errorf("inserting into market_mk12_deal_pipeline: %w", err) + } + + if added { + log.Infow("added reindexing pipeline entry", "uuid", mk12deal.UUID, "task", taskID, "piece", pieceCid) + ongoingIndexingTasks++ + scheduled = true + } + } else { + if !cent.PieceRef.Valid { + continue + } + + deal, err := mk20.DealFromDB(ctx, c.db, id) + if err != nil { + log.Warnw("failed to get deal from db", "id", id.String(), "task", taskID) + continue + } + + spid, err := address.IDFromAddress(deal.Products.DDOV1.Provider) + if err != nil { + return xerrors.Errorf("parsing provider address: %w", err) + } + + pi, err := deal.PieceInfo() + if err != nil { + return xerrors.Errorf("getting piece info: %w", err) + } + + if uint64(cent.SPID) != spid { + continue + } + + pieceIDUrl := url.URL{ + Scheme: "pieceref", + Opaque: fmt.Sprintf("%d", cent.PieceRef.Int64), + } + + data := deal.Data + ddo := deal.Products.DDOV1 + + aggregation := 0 + if data.Format.Aggregate != nil { + aggregation = int(data.Format.Aggregate.Type) + } + + var added bool + + _, err = c.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`INSERT INTO market_mk20_pipeline ( + id, sp_id, contract, client, piece_cid_v2, piece_cid, piece_size, raw_size, + offline, url, indexing, announce, duration, piece_aggregation, + started, downloaded, after_commp, aggregated, sector, reg_seal_proof, sector_offset, sealed, + indexing_created_at, complete) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, + TRUE, TRUE, TRUE, TRUE, $15, 0, $16, TRUE, NOW(), TRUE)`, // We can use reg_seal_proof = 0 because process_piece_deal will prevent new entry from being created + deal.Identifier.String(), spid, ddo.ContractAddress, deal.Client, deal.Data.PieceCID.String(), pi.PieceCIDV1.String(), pi.Size, int64(pi.RawSize), + false, pieceIDUrl.String(), true, false, ddo.Duration, aggregation, + cent.SectorID, cent.PieceOff) + if err != nil { + return false, xerrors.Errorf("inserting mk20 pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting mk20 pipeline: %d rows affected", n) + } + + added = true + + _, err = tx.Exec(`UPDATE market_piece_metadata SET indexed = FALSE WHERE piece_cid = $1 AND piece_size = $2`, p.PieceCID.String(), p.Size) + if err != nil { + return false, xerrors.Errorf("updating market_piece_metadata.indexed column: %w", err) + } + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return xerrors.Errorf("inserting into market_mk20_pipeline: %w", err) + } + + if added { + log.Infow("added reindexing pipeline entry", "id", id, "task", taskID, "piece", pieceCid) + ongoingIndexingTasks++ + scheduled = true + } } - return true, nil - }, harmonydb.OptionRetry()) - if err != nil { - return xerrors.Errorf("inserting into market_mk12_deal_pipeline: %w", err) - } - - if added { - log.Infow("added reindexing pipeline entry", "uuid", deal.UUID, "task", taskID, "piece", deal.PieceCID) - ongoingIndexingTasks++ + if scheduled { + break // Break out of PieceDeal loop + } } if ongoingIndexingTasks >= int64(MaxOngoingIndexingTasks) { @@ -260,8 +372,9 @@ func (c *CheckIndexesTask) checkIndexing(ctx context.Context, taskID harmonytask func (c *CheckIndexesTask) checkIPNI(ctx context.Context, taskID harmonytask.TaskID) (err error) { type pieceSP struct { - PieceCid string `db:"piece_cid"` - SpID int64 `db:"sp_id"` + PieceCid string `db:"piece_cid"` + PieceSize abi.PaddedPieceSize `db:"piece_size"` + SpID int64 `db:"sp_id"` } // get candidates to check @@ -301,7 +414,7 @@ func (c *CheckIndexesTask) checkIPNI(ctx context.Context, taskID harmonytask.Tas // get already running pipelines with announce=true var announcePiecePipelines []pieceSP - err = c.db.Select(ctx, &announcePiecePipelines, `SELECT piece_cid, sp_id FROM market_mk12_deal_pipeline WHERE announce=true`) + err = c.db.Select(ctx, &announcePiecePipelines, `SELECT piece_cid, piece_size, sp_id FROM market_mk12_deal_pipeline WHERE announce=true`) if err != nil { return xerrors.Errorf("getting ipni tasks: %w", err) } @@ -322,13 +435,13 @@ func (c *CheckIndexesTask) checkIPNI(ctx context.Context, taskID harmonytask.Tas return nil } - var have, missisg, issues int64 + var have, missing, issues int64 defer func() { - log.Infow("IPNI Ad check", "have", have, "missisg", missisg, "issues", issues, "err", err) + log.Infow("IPNI Ad check", "have", have, "missing", missing, "issues", issues, "err", err) }() for _, deal := range toCheck { - if _, ok := announcablePipelines[pieceSP{deal.PieceCID, deal.SpID}]; ok { + if _, ok := announcablePipelines[pieceSP{deal.PieceCID, deal.PieceSize, deal.SpID}]; ok { // pipeline for the piece already running have++ continue @@ -388,7 +501,7 @@ func (c *CheckIndexesTask) checkIPNI(ctx context.Context, taskID harmonytask.Tas PieceOffset int64 `db:"piece_offset"` RawSize int64 `db:"raw_size"` } - err = c.db.Select(ctx, &sourceSector, `SELECT sector_num, piece_offset, raw_size FROM market_piece_deal WHERE piece_cid=$1 AND sp_id = $2`, deal.PieceCID, deal.SpID) + err = c.db.Select(ctx, &sourceSector, `SELECT sector_num, piece_offset, raw_size FROM market_piece_deal WHERE piece_cid=$1 AND piece_length = $2 AND sp_id = $3`, deal.PieceCID, deal.PieceSize, deal.SpID) if err != nil { return xerrors.Errorf("getting source sector: %w", err) } @@ -415,7 +528,7 @@ func (c *CheckIndexesTask) checkIPNI(ctx context.Context, taskID harmonytask.Tas continue } - missisg++ + missing++ n, err := c.db.Exec(ctx, ` INSERT INTO market_mk12_deal_pipeline ( @@ -449,6 +562,184 @@ func (c *CheckIndexesTask) checkIPNI(ctx context.Context, taskID harmonytask.Tas return nil } +func (c *CheckIndexesTask) checkIPNIMK20(ctx context.Context, taskID harmonytask.TaskID) (err error) { + var ids []struct { + ID string `db:"id"` + } + + err = c.db.Select(ctx, &ids, `SELECT m.id + FROM market_mk20_deal AS m + LEFT JOIN ipni AS i + ON m.piece_cid_v2 = i.piece_cid_v2 + LEFT JOIN market_mk20_pipeline AS p + ON m.id = p.id + LEFT JOIN market_mk20_pipeline_waiting AS w + ON m.id = w.id + WHERE m.piece_cid_v2 IS NOT NULL + AND m.ddo_v1 IS NOT NULL + AND m.ddo_v1 != 'null' + AND (m.retrieval_v1->>'announce_payload')::boolean = TRUE + AND i.piece_cid_v2 IS NULL + AND p.id IS NULL + AND w.id IS NULL;`) + if err != nil { + return xerrors.Errorf("getting mk20 deals which are not announced: %w", err) + } + + if len(ids) == 0 { + return nil + } + + var ipniPeerIDs []struct { + SpID int64 `db:"sp_id"` + PeerID string `db:"peer_id"` + } + err = c.db.Select(ctx, &ipniPeerIDs, `SELECT sp_id, peer_id FROM ipni_peerid`) + if err != nil { + return xerrors.Errorf("getting ipni tasks: %w", err) + } + + spToPeer := map[int64]string{} + for _, d := range ipniPeerIDs { + spToPeer[d.SpID] = d.PeerID + } + + var ongoingIpniTasks int64 + err = c.db.QueryRow(ctx, `SELECT COUNT(1) FROM ipni_task`).Scan(&ongoingIpniTasks) + if err != nil { + return xerrors.Errorf("getting ipni tasks: %w", err) + } + if ongoingIpniTasks >= int64(MaxOngoingIndexingTasks) { + log.Debugw("too many ongoing ipni tasks, skipping ipni index checks", "task", taskID, "ongoing", ongoingIpniTasks) + return nil + } + + var have, missing, issues int64 + for _, i := range ids { + id, err := ulid.Parse(i.ID) + if err != nil { + return xerrors.Errorf("parsing deal id: %w", err) + } + + deal, err := mk20.DealFromDB(ctx, c.db, id) + if err != nil { + return xerrors.Errorf("getting deal from db: %w", err) + } + + spid, err := address.IDFromAddress(deal.Products.DDOV1.Provider) + if err != nil { + return xerrors.Errorf("parsing provider address: %w", err) + } + + pinfo, err := deal.PieceInfo() + if err != nil { + return xerrors.Errorf("getting piece info: %w", err) + } + + pi := abi.PieceInfo{ + PieceCID: pinfo.PieceCIDV1, + Size: pinfo.Size, + } + + var ctxIdBuf bytes.Buffer + err = pi.MarshalCBOR(&ctxIdBuf) + if err != nil { + return xerrors.Errorf("marshaling piece info: %w", err) + } + + ctxId := ctxIdBuf.Bytes() + + provider, ok := spToPeer[int64(spid)] + if !ok { + issues++ + log.Warnw("no peer id for spid", "spid", spid, "checkPiece", deal.Data.PieceCID.String()) + continue + } + + var hasEnt int64 + err = c.db.QueryRow(ctx, `SELECT count(1) FROM ipni WHERE context_id=$1 AND provider=$2`, ctxId, provider).Scan(&hasEnt) + if err != nil { + return xerrors.Errorf("getting piece hash range: %w", err) + } + if hasEnt > 0 { + // has the entry + have++ + continue + } + + hasIndex, err := c.indexStore.CheckHasPiece(ctx, deal.Data.PieceCID) + if err != nil { + return xerrors.Errorf("getting piece hash range: %w", err) + } + if !hasIndex { + log.Warnw("no index for piece with missing IPNI Ad", "piece", deal.Data.PieceCID.String(), "checkPiece", pi.PieceCID) + issues++ + continue + } + + var sourceSector []struct { + SectorNum int64 `db:"sector_num"` + PieceOffset int64 `db:"piece_offset"` + RawSize int64 `db:"raw_size"` + PieceRef sql.NullInt64 `db:"piece_ref"` + } + err = c.db.Select(ctx, &sourceSector, `SELECT sector_num, piece_offset, raw_size, piece_ref FROM market_piece_deal WHERE id = $1`, id.String()) + if err != nil { + return xerrors.Errorf("getting source sector: %w", err) + } + if len(sourceSector) == 0 { + log.Warnw("no source sector for piece", "piece", deal.Data.PieceCID.String(), "checkPiece", pi.PieceCID) + issues++ + continue + } + + src := sourceSector[0] + + if !src.PieceRef.Valid { + log.Warnw("no piece ref for ipni reindexing", "piece", pi.PieceCID, "checkPiece", deal.Data.PieceCID.String()) + missing++ + continue + } + + pieceIDUrl := url.URL{ + Scheme: "pieceref", + Opaque: fmt.Sprintf("%d", src.PieceRef.Int64), + } + + data := deal.Data + ddo := deal.Products.DDOV1 + + aggregation := 0 + if data.Format.Aggregate != nil { + aggregation = int(data.Format.Aggregate.Type) + } + + n, err := c.db.Exec(ctx, `INSERT INTO market_mk20_pipeline ( + id, sp_id, contract, client, piece_cid_v2, piece_cid, piece_size, raw_size, + offline, url, indexing, announce, duration, piece_aggregation, + started, downloaded, after_commp, aggregated, sector, reg_seal_proof, sector_offset, sealed, + indexing_created_at, indexed, complete) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, + TRUE, TRUE, TRUE, TRUE, $15, 0, $16, TRUE, NOW(), TRUE, FALSE)`, // We can use reg_seal_proof = 0 because process_piece_deal will prevent new entry from being created + deal.Identifier.String(), spid, ddo.ContractAddress, deal.Client, data.PieceCID.String(), pinfo.PieceCIDV1.String(), pinfo.Size, int64(pinfo.RawSize), + false, pieceIDUrl.String(), true, true, ddo.Duration, aggregation, + src.SectorNum, src.PieceOffset) + if err != nil { + return xerrors.Errorf("inserting mk20 pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("inserting mk20 pipeline: %d rows affected", n) + } + log.Infow("created IPNI reindexing pipeline", "piece", pi.PieceCID, "spid", spid) + ongoingIpniTasks++ + if ongoingIpniTasks >= int64(MaxOngoingIndexingTasks) { + return nil + } + } + + return nil +} + func (c *CheckIndexesTask) findSourceSector(ctx context.Context, spid, sectorNum int64) *storiface.SectorRef { var sourceSector *storiface.SectorRef var qres []struct { @@ -496,7 +787,8 @@ func (c *CheckIndexesTask) TypeDetails() harmonytask.TaskTypeDetails { Gpu: 0, Ram: 32 << 20, }, - IAmBored: harmonytask.SingletonTaskAdder(CheckIndexInterval, c), + IAmBored: harmonytask.SingletonTaskAdder(CheckIndexInterval, c), + MaxFailures: 3, } } diff --git a/tasks/indexing/task_indexing.go b/tasks/indexing/task_indexing.go index d3df8c3fb..75906c11f 100644 --- a/tasks/indexing/task_indexing.go +++ b/tasks/indexing/task_indexing.go @@ -3,18 +3,28 @@ package indexing import ( "bufio" "context" + "database/sql" "errors" "fmt" "io" + "net/url" + "runtime" + "sort" + "strconv" + "sync" "time" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" carv2 "github.com/ipld/go-car/v2" + "github.com/oklog/ulid" "github.com/yugabyte/pgx/v5" "golang.org/x/sync/errgroup" "golang.org/x/xerrors" + "github.com/filecoin-project/go-data-segment/datasegment" + "github.com/filecoin-project/go-data-segment/fr32" + commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/curio/deps/config" @@ -22,11 +32,13 @@ import ( "github.com/filecoin-project/curio/harmony/harmonytask" "github.com/filecoin-project/curio/harmony/resources" "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/cachedreader" "github.com/filecoin-project/curio/lib/ffi" "github.com/filecoin-project/curio/lib/passcall" "github.com/filecoin-project/curio/lib/pieceprovider" "github.com/filecoin-project/curio/lib/storiface" "github.com/filecoin-project/curio/market/indexstore" + "github.com/filecoin-project/curio/market/mk20" ) var log = logging.Logger("indexing") @@ -35,6 +47,7 @@ type IndexingTask struct { db *harmonydb.DB indexStore *indexstore.IndexStore pieceProvider *pieceprovider.SectorReader + cpr *cachedreader.CachedPieceReader sc *ffi.SealCalls cfg *config.CurioConfig insertConcurrency int @@ -42,12 +55,13 @@ type IndexingTask struct { max taskhelp.Limiter } -func NewIndexingTask(db *harmonydb.DB, sc *ffi.SealCalls, indexStore *indexstore.IndexStore, pieceProvider *pieceprovider.SectorReader, cfg *config.CurioConfig, max taskhelp.Limiter) *IndexingTask { +func NewIndexingTask(db *harmonydb.DB, sc *ffi.SealCalls, indexStore *indexstore.IndexStore, pieceProvider *pieceprovider.SectorReader, cpr *cachedreader.CachedPieceReader, cfg *config.CurioConfig, max taskhelp.Limiter) *IndexingTask { return &IndexingTask{ db: db, indexStore: indexStore, pieceProvider: pieceProvider, + cpr: cpr, sc: sc, cfg: cfg, insertConcurrency: cfg.Market.StorageMarketConfig.Indexing.InsertConcurrency, @@ -57,18 +71,23 @@ func NewIndexingTask(db *harmonydb.DB, sc *ffi.SealCalls, indexStore *indexstore } type itask struct { - UUID string `db:"uuid"` - SpID int64 `db:"sp_id"` - Sector abi.SectorNumber `db:"sector"` - Proof abi.RegisteredSealProof `db:"reg_seal_proof"` - PieceCid string `db:"piece_cid"` - Size abi.PaddedPieceSize `db:"piece_size"` - Offset int64 `db:"sector_offset"` - RawSize int64 `db:"raw_size"` - ShouldIndex bool `db:"should_index"` - Announce bool `db:"announce"` - ChainDealId abi.DealID `db:"chain_deal_id"` - IsDDO bool `db:"is_ddo"` + UUID string `db:"uuid"` + SpID int64 `db:"sp_id"` + Sector abi.SectorNumber `db:"sector"` + Proof abi.RegisteredSealProof `db:"reg_seal_proof"` + PieceCid string `db:"piece_cid"` + Size abi.PaddedPieceSize `db:"piece_size"` + Offset int64 `db:"sector_offset"` + RawSize int64 `db:"raw_size"` + Url sql.NullString `db:"url"` + ShouldIndex bool `db:"should_index"` + IndexingCreatedAt time.Time `db:"indexing_created_at"` + Announce bool `db:"announce"` + ChainDealId abi.DealID `db:"chain_deal_id"` + IsDDO bool `db:"is_ddo"` + Mk20 bool `db:"mk20"` + IsRM bool `db:"is_rm"` + PieceRef int64 } func (i *IndexingTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { @@ -78,29 +97,53 @@ func (i *IndexingTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (do ctx := context.Background() err = i.db.Select(ctx, &tasks, `SELECT - p.uuid, - p.sp_id, - p.sector, - p.piece_cid, - p.piece_size, - p.sector_offset, - p.reg_seal_proof, - p.raw_size, - p.should_index, - p.announce, - p.is_ddo, - COALESCE(d.chain_deal_id, 0) AS chain_deal_id -- If NULL, return 0 + p.uuid, + p.sp_id, + p.sector, + p.piece_cid, + p.piece_size, + p.sector_offset, + p.reg_seal_proof, + p.raw_size, + p.url, + p.should_index, + p.announce, + p.is_ddo, + COALESCE(d.chain_deal_id, 0) AS chain_deal_id, + FALSE AS mk20 FROM - market_mk12_deal_pipeline p + market_mk12_deal_pipeline p LEFT JOIN - market_mk12_deals d - ON p.uuid = d.uuid AND p.sp_id = d.sp_id + market_mk12_deals d + ON p.uuid = d.uuid AND p.sp_id = d.sp_id LEFT JOIN - market_direct_deals md - ON p.uuid = md.uuid AND p.sp_id = md.sp_id + market_direct_deals md + ON p.uuid = md.uuid AND p.sp_id = md.sp_id WHERE - p.indexing_task_id = $1; - ;`, taskID) + p.indexing_task_id = $1 + + UNION ALL + + SELECT + id AS uuid, + sp_id, + sector, + piece_cid, + piece_size, + sector_offset, + reg_seal_proof, + raw_size, + url, + indexing as should_index, + announce, + TRUE AS is_ddo, + 0 AS chain_deal_id, + TRUE AS mk20 + FROM + market_mk20_pipeline p + WHERE + p.indexing_task_id = $1; + `, taskID) if err != nil { return false, xerrors.Errorf("getting indexing params: %w", err) } @@ -113,18 +156,72 @@ func (i *IndexingTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (do // Check if piece is already indexed var indexed bool - err = i.db.QueryRow(ctx, `SELECT indexed FROM market_piece_metadata WHERE piece_cid = $1`, task.PieceCid).Scan(&indexed) + err = i.db.QueryRow(ctx, `SELECT indexed FROM market_piece_metadata WHERE piece_cid = $1 and piece_size = $2`, task.PieceCid, task.Size).Scan(&indexed) if err != nil && !errors.Is(err, pgx.ErrNoRows) { return false, xerrors.Errorf("checking if piece %s is already indexed: %w", task.PieceCid, err) } + var byteData bool + var subPieces []mk20.DataSource + + if task.Mk20 { + id, err := ulid.Parse(task.UUID) + if err != nil { + return false, xerrors.Errorf("parsing id: %w", err) + } + deal, err := mk20.DealFromDB(ctx, i.db, id) + if err != nil { + return false, xerrors.Errorf("getting mk20 deal from DB: %w", err) + } + if deal.Data.Format.Aggregate != nil { + if deal.Data.Format.Aggregate.Type > 0 { + var found bool + if len(deal.Data.Format.Aggregate.Sub) > 0 { + subPieces = deal.Data.Format.Aggregate.Sub + found = true + } + if len(deal.Data.SourceAggregate.Pieces) > 0 { + subPieces = deal.Data.SourceAggregate.Pieces + found = true + } + if !found { + return false, xerrors.Errorf("no sub pieces for aggregate mk20 deal") + } + } + } + + if deal.Data.Format.Raw != nil { + byteData = true + } + + if !task.Url.Valid { + return false, xerrors.Errorf("no url for mk20 deal") + } + + url, err := url.Parse(task.Url.String) + if err != nil { + return false, xerrors.Errorf("parsing url: %w", err) + } + + if url.Scheme != "pieceref" { + return false, xerrors.Errorf("invalid url scheme: %s", url.Scheme) + } + + refNum, err := strconv.ParseInt(url.Opaque, 10, 64) + if err != nil { + return false, xerrors.Errorf("parsing piece reference number: %w", err) + } + + task.PieceRef = refNum + } + // Return early if already indexed or should not be indexed - if indexed || !task.ShouldIndex { + if indexed || !task.ShouldIndex || byteData { err = i.recordCompletion(ctx, task, taskID, false) if err != nil { return false, err } - log.Infow("Piece already indexed or should not be indexed", "piece_cid", task.PieceCid, "indexed", indexed, "should_index", task.ShouldIndex, "uuid", task.UUID, "sp_id", task.SpID, "sector", task.Sector) + log.Infow("Piece already indexed or should not be indexed", "piece_cid", task.PieceCid, "indexed", indexed, "should_index", task.ShouldIndex, "id", task.UUID, "sp_id", task.SpID, "sector", task.Sector) return true, nil } @@ -134,16 +231,31 @@ func (i *IndexingTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (do return false, xerrors.Errorf("parsing piece CID: %w", err) } - reader, err := i.pieceProvider.ReadPiece(ctx, storiface.SectorRef{ - ID: abi.SectorID{ - Miner: abi.ActorID(task.SpID), - Number: task.Sector, - }, - ProofType: task.Proof, - }, storiface.PaddedByteIndex(task.Offset).Unpadded(), task.Size.Unpadded(), pieceCid) - + pc2, err := commcid.PieceCidV2FromV1(pieceCid, uint64(task.RawSize)) if err != nil { - return false, xerrors.Errorf("getting piece reader: %w", err) + return false, xerrors.Errorf("getting piece commP: %w", err) + } + + var reader storiface.Reader + + if task.Mk20 { + reader, _, err = i.cpr.GetSharedPieceReader(ctx, pc2, false) + + if err != nil { + return false, xerrors.Errorf("getting piece reader: %w", err) + } + } else { + reader, err = i.pieceProvider.ReadPiece(ctx, storiface.SectorRef{ + ID: abi.SectorID{ + Miner: abi.ActorID(task.SpID), + Number: task.Sector, + }, + ProofType: task.Proof, + }, storiface.PaddedByteIndex(task.Offset).Unpadded(), task.Size.Unpadded(), pieceCid) + + if err != nil { + return false, xerrors.Errorf("getting piece reader: %w", err) + } } defer func() { @@ -156,49 +268,31 @@ func (i *IndexingTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (do chanSize := dealCfg.Indexing.InsertConcurrency * dealCfg.Indexing.InsertBatchSize recs := make(chan indexstore.Record, chanSize) - - //recs := make([]indexstore.Record, 0, chanSize) - opts := []carv2.Option{carv2.ZeroLengthSectionAsEOF(true)} - blockReader, err := carv2.NewBlockReader(bufio.NewReaderSize(reader, 4<<20), opts...) - if err != nil { - return false, fmt.Errorf("getting block reader over piece: %w", err) - } + var blocks int64 var eg errgroup.Group addFail := make(chan struct{}) var interrupted bool - var blocks int64 - start := time.Now() eg.Go(func() error { defer close(addFail) - - serr := i.indexStore.AddIndex(ctx, pieceCid, recs) - if serr != nil { - return xerrors.Errorf("adding index to DB: %w", serr) - } - return nil + return i.indexStore.AddIndex(ctx, pc2, recs) }) - blockMetadata, err := blockReader.SkipNext() -loop: - for err == nil { - blocks++ + var aggidx map[cid.Cid][]indexstore.Record - select { - case recs <- indexstore.Record{ - Cid: blockMetadata.Cid, - Offset: blockMetadata.Offset, - Size: blockMetadata.Size, - }: - case <-addFail: - interrupted = true - break loop - } - blockMetadata, err = blockReader.SkipNext() + if task.Mk20 && len(subPieces) > 0 { + blocks, aggidx, interrupted, err = IndexAggregate(pc2, reader, task.Size, subPieces, recs, addFail) + } else { + blocks, interrupted, err = IndexCAR(reader, 4<<20, recs, addFail) } - if err != nil && !errors.Is(err, io.EOF) { - return false, fmt.Errorf("generating index for piece: %w", err) + + if err != nil { + // Indexing itself failed, stop early + close(recs) // still safe to close, AddIndex will exit on channel close + // wait for AddIndex goroutine to finish cleanly + _ = eg.Wait() + return false, xerrors.Errorf("indexing failed: %w", err) } // Close the channel @@ -212,44 +306,329 @@ loop: log.Infof("Indexing deal %s took %0.3f seconds", task.UUID, time.Since(startTime).Seconds()) + // Save aggregate index if present + for k, v := range aggidx { + if len(v) > 0 { + err = i.indexStore.InsertAggregateIndex(ctx, k, v) + if err != nil { + return false, xerrors.Errorf("inserting aggregate index: %w", err) + } + } + } + err = i.recordCompletion(ctx, task, taskID, true) if err != nil { return false, err } - blocksPerSecond := float64(blocks) / time.Since(start).Seconds() - log.Infow("Piece indexed", "piece_cid", task.PieceCid, "uuid", task.UUID, "sp_id", task.SpID, "sector", task.Sector, "blocks", blocks, "blocks_per_second", blocksPerSecond) + blocksPerSecond := float64(blocks) / time.Since(startTime).Seconds() + log.Infow("Piece indexed", "piece_cid", task.PieceCid, "id", task.UUID, "sp_id", task.SpID, "sector", task.Sector, "blocks", blocks, "blocks_per_second", blocksPerSecond) return true, nil } +// parseDataSegmentIndex is a local more efficient alternative to the method provided by the datasegment library +func parseDataSegmentIndex(unpaddedReader io.Reader) (datasegment.IndexData, error) { + const ( + unpaddedChunk = 127 + paddedChunk = 128 + ) + + // Read all unpadded data (up to 32 MiB Max as per FRC for 64 GiB sector) + unpaddedData, err := io.ReadAll(unpaddedReader) + if err != nil { + return datasegment.IndexData{}, xerrors.Errorf("reading unpadded data: %w", err) + } + + // Make sure it's aligned to 127 + if len(unpaddedData)%unpaddedChunk != 0 { + return datasegment.IndexData{}, fmt.Errorf("unpadded data length %d is not a multiple of 127", len(unpaddedData)) + } + numChunks := len(unpaddedData) / unpaddedChunk + + // Prepare padded output buffer + paddedData := make([]byte, numChunks*paddedChunk) + + // Parallel pad + var wg sync.WaitGroup + concurrency := runtime.NumCPU() + chunkPerWorker := (numChunks + concurrency - 1) / concurrency + + for w := 0; w < concurrency; w++ { + start := w * chunkPerWorker + end := (w + 1) * chunkPerWorker + if end > numChunks { + end = numChunks + } + wg.Add(1) + go func(start, end int) { + defer wg.Done() + for i := start; i < end; i++ { + in := unpaddedData[i*unpaddedChunk : (i+1)*unpaddedChunk] + out := paddedData[i*paddedChunk : (i+1)*paddedChunk] + fr32.Pad(in, out) + } + }(start, end) + } + wg.Wait() + + // Decode entries + allEntries := make([]datasegment.SegmentDesc, numChunks*2) + for i := 0; i < numChunks; i++ { + p := paddedData[i*paddedChunk : (i+1)*paddedChunk] + + if err := allEntries[i*2+0].UnmarshalBinary(p[:datasegment.EntrySize]); err != nil { + return datasegment.IndexData{}, xerrors.Errorf("unmarshal entry 1 at chunk %d: %w", i, err) + } + if err := allEntries[i*2+1].UnmarshalBinary(p[datasegment.EntrySize:]); err != nil { + return datasegment.IndexData{}, xerrors.Errorf("unmarshal entry 2 at chunk %d: %w", i, err) + } + } + + return datasegment.IndexData{Entries: allEntries}, nil +} + +func validateSegments(segments []datasegment.SegmentDesc) []datasegment.SegmentDesc { + entryCount := len(segments) + + validCh := make(chan datasegment.SegmentDesc, entryCount) + var wg sync.WaitGroup + + workers := runtime.NumCPU() + chunkSize := (entryCount + workers - 1) / workers + + for w := 0; w < workers; w++ { + start := w * chunkSize + end := (w + 1) * chunkSize + if end > entryCount { + end = entryCount + } + if start >= end { + break + } + + wg.Add(1) + go func(start, end int) { + defer wg.Done() + for i := start; i < end; i++ { + entry := segments[i] + if err := entry.Validate(); err == nil { + validCh <- entry + } + log.Debugw("data segment invalid", "segment", entry) + } + }(start, end) + } + + go func() { + wg.Wait() + close(validCh) + }() + + var validEntries []datasegment.SegmentDesc + for entry := range validCh { + validEntries = append(validEntries, entry) + } + sort.Slice(validEntries, func(i, j int) bool { + return validEntries[i].Offset < validEntries[j].Offset + }) + return validEntries +} + +func IndexCAR(r io.Reader, buffSize int, recs chan<- indexstore.Record, addFail <-chan struct{}) (int64, bool, error) { + blockReader, err := carv2.NewBlockReader(bufio.NewReaderSize(r, buffSize), carv2.ZeroLengthSectionAsEOF(true)) + if err != nil { + return 0, false, fmt.Errorf("getting block reader over piece: %w", err) + } + + var blocks int64 + var interrupted bool + + for { + blockMetadata, err := blockReader.SkipNext() + if err != nil { + if errors.Is(err, io.EOF) { + break + } + return blocks, interrupted, fmt.Errorf("generating index for piece: %w", err) + } + + blocks++ + + select { + case recs <- indexstore.Record{ + Cid: blockMetadata.Cid, + Offset: blockMetadata.SourceOffset, + Size: blockMetadata.Size, + }: + case <-addFail: + interrupted = true + } + + if interrupted { + break + } + } + + return blocks, interrupted, nil +} + +type IndexReader interface { + io.ReaderAt + io.Seeker + io.Reader +} + +func IndexAggregate(pieceCid cid.Cid, + reader IndexReader, + size abi.PaddedPieceSize, + subPieces []mk20.DataSource, + recs chan<- indexstore.Record, + addFail <-chan struct{}, +) (int64, map[cid.Cid][]indexstore.Record, bool, error) { + dsis := datasegment.DataSegmentIndexStartOffset(size) + if _, err := reader.Seek(int64(dsis), io.SeekStart); err != nil { + return 0, nil, false, xerrors.Errorf("seeking to data segment index start offset: %w", err) + } + + idata, err := parseDataSegmentIndex(reader) + if err != nil { + return 0, nil, false, xerrors.Errorf("parsing data segment index: %w", err) + } + if len(idata.Entries) == 0 { + return 0, nil, false, xerrors.New("no data segment index entries") + } + + valid := validateSegments(idata.Entries) + if len(valid) == 0 { + return 0, nil, false, xerrors.New("no valid data segment index entries") + } + + aggidx := make(map[cid.Cid][]indexstore.Record) + + log.Infow("Indexing aggregate", "piece_size", size, "num_chunks", len(valid), "num_sub_pieces", len(subPieces)) + + if len(subPieces) > 1 { + if len(valid) != len(subPieces) { + return 0, nil, false, xerrors.Errorf("expected %d data segment index entries, got %d", len(subPieces), len(idata.Entries)) + } + } else { + return 0, nil, false, xerrors.Errorf("expected at least 2 sub pieces, got 0") + } + + var totalBlocks int64 + for j, entry := range valid { + bufferSize := 4 << 20 + if entry.Size < uint64(bufferSize) { + bufferSize = int(entry.Size) + } + strt := entry.UnpaddedOffest() + leng := entry.UnpaddedLength() + sectionReader := io.NewSectionReader(reader, int64(strt), int64(leng)) + sp := subPieces[j] + + if sp.Format.Car != nil { + b, inter, err := IndexCAR(sectionReader, bufferSize, recs, addFail) + if err != nil { + //// Allow one more layer of aggregation to be indexed + //if strings.Contains(err.Error(), "invalid car version") { + // if haveSubPieces { + // if subPieces[j].Car != nil { + // return 0, aggidx, false, xerrors.Errorf("invalid car version for subPiece %d: %w", j, err) + // } + // if subPieces[j].Raw != nil { + // continue + // } + // if subPieces[j].Aggregate != nil { + // b, idx, inter, err = IndexAggregate(commp.PCidV2(), sectionReader, abi.PaddedPieceSize(entry.Size), nil, recs, addFail) + // if err != nil { + // return totalBlocks, aggidx, inter, xerrors.Errorf("invalid aggregate for subPiece %d: %w", j, err) + // } + // totalBlocks += b + // for k, v := range idx { + // aggidx[k] = append(aggidx[k], v...) + // } + // } + // } else { + // continue + // } + //} + return totalBlocks, aggidx, false, xerrors.Errorf("indexing subPiece %d: %w", j, err) + } + + if inter { + return totalBlocks, aggidx, true, nil + } + totalBlocks += b + } + + aggidx[pieceCid] = append(aggidx[pieceCid], indexstore.Record{ + Cid: sp.PieceCID, + Offset: strt, + Size: leng, + }) + } + + return totalBlocks, aggidx, false, nil +} + // recordCompletion add the piece metadata and piece deal to the DB and // records the completion of an indexing task in the database func (i *IndexingTask) recordCompletion(ctx context.Context, task itask, taskID harmonytask.TaskID, indexed bool) error { - _, err := i.db.Exec(ctx, `SELECT process_piece_deal($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, - task.UUID, task.PieceCid, !task.IsDDO, task.SpID, task.Sector, task.Offset, task.Size, task.RawSize, indexed, false, task.ChainDealId) - if err != nil { - return xerrors.Errorf("failed to update piece metadata and piece deal for deal %s: %w", task.UUID, err) + if task.Mk20 { + _, err := i.db.Exec(ctx, `SELECT process_piece_deal($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, + task.UUID, task.PieceCid, !task.IsDDO, task.SpID, task.Sector, task.Offset, task.Size, task.RawSize, indexed, task.PieceRef, false, task.ChainDealId) + if err != nil { + return xerrors.Errorf("failed to update piece metadata and piece deal for deal %s: %w", task.UUID, err) + } + } else { + _, err := i.db.Exec(ctx, `SELECT process_piece_deal($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, + task.UUID, task.PieceCid, !task.IsDDO, task.SpID, task.Sector, task.Offset, task.Size, task.RawSize, indexed, nil, false, task.ChainDealId) + if err != nil { + return xerrors.Errorf("failed to update piece metadata and piece deal for deal %s: %w", task.UUID, err) + } } // If IPNI is disabled then mark deal as complete otherwise just mark as indexed if i.cfg.Market.StorageMarketConfig.IPNI.Disable { - n, err := i.db.Exec(ctx, `UPDATE market_mk12_deal_pipeline SET indexed = TRUE, indexing_task_id = NULL, + if task.Mk20 { + n, err := i.db.Exec(ctx, `UPDATE market_mk20_pipeline SET indexed = TRUE, indexing_task_id = NULL, + complete = TRUE WHERE id = $1 AND indexing_task_id = $2`, task.UUID, taskID) + if err != nil { + return xerrors.Errorf("store indexing success: updating pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("store indexing success: updated %d rows", n) + } + } else { + n, err := i.db.Exec(ctx, `UPDATE market_mk12_deal_pipeline SET indexed = TRUE, indexing_task_id = NULL, complete = TRUE WHERE uuid = $1 AND indexing_task_id = $2`, task.UUID, taskID) - if err != nil { - return xerrors.Errorf("store indexing success: updating pipeline: %w", err) - } - if n != 1 { - return xerrors.Errorf("store indexing success: updated %d rows", n) + if err != nil { + return xerrors.Errorf("store indexing success: updating pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("store indexing success: updated %d rows", n) + } } } else { - n, err := i.db.Exec(ctx, `UPDATE market_mk12_deal_pipeline SET indexed = TRUE, indexing_task_id = NULL + if task.Mk20 { + n, err := i.db.Exec(ctx, `UPDATE market_mk20_pipeline SET indexed = TRUE, indexing_task_id = NULL + WHERE id = $1 AND indexing_task_id = $2`, task.UUID, taskID) + if err != nil { + return xerrors.Errorf("store indexing success: updating pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("store indexing success: updated %d rows", n) + } + } else { + n, err := i.db.Exec(ctx, `UPDATE market_mk12_deal_pipeline SET indexed = TRUE, indexing_task_id = NULL WHERE uuid = $1 AND indexing_task_id = $2`, task.UUID, taskID) - if err != nil { - return xerrors.Errorf("store indexing success: updating pipeline: %w", err) - } - if n != 1 { - return xerrors.Errorf("store indexing success: updated %d rows", n) + if err != nil { + return xerrors.Errorf("store indexing success: updating pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("store indexing success: updated %d rows", n) + } } } @@ -259,45 +638,88 @@ func (i *IndexingTask) recordCompletion(ctx context.Context, task itask, taskID func (i *IndexingTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { ctx := context.Background() + type task struct { + TaskID harmonytask.TaskID `db:"indexing_task_id"` + SpID int64 `db:"sp_id"` + SectorNumber int64 `db:"sector"` + StorageID string `db:"storage_id"` + Url string `db:"url"` + Indexing bool `db:"indexing"` + } + + var tasks []*task + indIDs := make([]int64, len(ids)) for x, id := range ids { indIDs[x] = int64(id) } - // Accept any task which should not be indexed as - // it does not require storage access - var id int64 - err := i.db.QueryRow(ctx, `SELECT indexing_task_id - FROM market_mk12_deal_pipeline - WHERE should_index = FALSE AND - indexing_task_id = ANY ($1) ORDER BY indexing_task_id LIMIT 1`, indIDs).Scan(&id) - if err == nil { - ret := harmonytask.TaskID(id) - return &ret, nil - } else if !errors.Is(err, pgx.ErrNoRows) { - return nil, xerrors.Errorf("getting pending indexing task: %w", err) + var mk20tasks []*task + if storiface.FTPiece != 32 { + panic("storiface.FTPiece != 32") } - var tasks []struct { - TaskID harmonytask.TaskID `db:"indexing_task_id"` - SpID int64 `db:"sp_id"` - SectorNumber int64 `db:"sector"` - StorageID string `db:"storage_id"` + err := i.db.Select(ctx, &mk20tasks, `SELECT indexing_task_id, url, indexing FROM market_mk20_pipeline WHERE indexing_task_id = ANY($1)`, indIDs) + if err != nil { + return nil, xerrors.Errorf("getting mk20 urls: %w", err) + } + + for _, t := range mk20tasks { + + if !t.Indexing { + continue + } + + goUrl, err := url.Parse(t.Url) + if err != nil { + return nil, xerrors.Errorf("parsing data URL: %w", err) + } + if goUrl.Scheme == "pieceref" { + refNum, err := strconv.ParseInt(goUrl.Opaque, 10, 64) + if err != nil { + return nil, xerrors.Errorf("parsing piece reference number: %w", err) + } + + // get pieceID + var pieceID []struct { + PieceID storiface.PieceNumber `db:"piece_id"` + } + err = i.db.Select(ctx, &pieceID, `SELECT piece_id FROM parked_piece_refs WHERE ref_id = $1`, refNum) + if err != nil { + return nil, xerrors.Errorf("getting pieceID: %w", err) + } + + var sLocation string + + err = i.db.QueryRow(ctx, ` + SELECT storage_id FROM sector_location + WHERE miner_id = 0 AND sector_num = $1 AND sector_filetype = 32`, pieceID[0].PieceID).Scan(&sLocation) + + if err != nil { + return nil, xerrors.Errorf("failed to get storage location from DB: %w", err) + } + + t.StorageID = sLocation + + } } if storiface.FTUnsealed != 1 { panic("storiface.FTUnsealed != 1") } - err = i.db.Select(ctx, &tasks, ` - SELECT dp.indexing_task_id, dp.sp_id, dp.sector, l.storage_id FROM market_mk12_deal_pipeline dp - INNER JOIN sector_location l ON dp.sp_id = l.miner_id AND dp.sector = l.sector_num - WHERE dp.indexing_task_id = ANY ($1) AND l.sector_filetype = 1 -`, indIDs) + var mk12tasks []*task + + err = i.db.Select(ctx, &mk12tasks, `SELECT dp.indexing_task_id, dp.should_index AS indexing, dp.sp_id, dp.sector, l.storage_id + FROM market_mk12_deal_pipeline dp + INNER JOIN sector_location l ON dp.sp_id = l.miner_id AND dp.sector = l.sector_num + WHERE dp.indexing_task_id = ANY ($1) AND l.sector_filetype = 1`, indIDs) if err != nil { - return nil, xerrors.Errorf("getting tasks: %w", err) + return nil, xerrors.Errorf("getting mk12 tasks: %w", err) } + tasks = append(mk20tasks, mk12tasks...) + ls, err := i.sc.LocalStorage(ctx) if err != nil { return nil, xerrors.Errorf("getting local storage: %w", err) @@ -309,6 +731,9 @@ func (i *IndexingTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.T } for _, t := range tasks { + if !t.Indexing { + return &t.TaskID, nil + } if found, ok := localStorageMap[t.StorageID]; ok && found { return &t.TaskID, nil } @@ -342,35 +767,60 @@ func (i *IndexingTask) schedule(ctx context.Context, taskFunc harmonytask.AddTas taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { stop = true // assume we're done until we find a task to schedule - var pendings []struct { + var mk12Pendings []struct { UUID string `db:"uuid"` } // Indexing job must be created for every deal to make sure piece details are inserted in DB // even if we don't want to index it. If piece is not supposed to be indexed then it will handled // by the Do() - err := i.db.Select(ctx, &pendings, `SELECT uuid FROM market_mk12_deal_pipeline + err := tx.Select(&mk12Pendings, `SELECT uuid FROM market_mk12_deal_pipeline WHERE sealed = TRUE AND indexing_task_id IS NULL AND indexed = FALSE ORDER BY indexing_created_at ASC LIMIT 1;`) if err != nil { - return false, xerrors.Errorf("getting pending indexing tasks: %w", err) + return false, xerrors.Errorf("getting pending mk12 indexing tasks: %w", err) } - if len(pendings) == 0 { - return false, nil + if len(mk12Pendings) > 0 { + pending := mk12Pendings[0] + + _, err = tx.Exec(`UPDATE market_mk12_deal_pipeline SET indexing_task_id = $1 + WHERE indexing_task_id IS NULL AND uuid = $2`, id, pending.UUID) + if err != nil { + return false, xerrors.Errorf("updating mk12 indexing task id: %w", err) + } + + stop = false // we found a task to schedule, keep going + return true, nil } - pending := pendings[0] + var mk20Pendings []struct { + UUID string `db:"id"` + } - _, err = tx.Exec(`UPDATE market_mk12_deal_pipeline SET indexing_task_id = $1 - WHERE indexing_task_id IS NULL AND uuid = $2`, id, pending.UUID) + err = tx.Select(&mk20Pendings, `SELECT id FROM market_mk20_pipeline + WHERE sealed = TRUE + AND indexing_task_id IS NULL + AND indexed = FALSE + ORDER BY indexing_created_at ASC LIMIT 1;`) + if err != nil { + return false, xerrors.Errorf("getting mk20 pending indexing tasks: %w", err) + } + + if len(mk20Pendings) == 0 { + return false, nil + } + + pending := mk20Pendings[0] + _, err = tx.Exec(`UPDATE market_mk20_pipeline SET indexing_task_id = $1 + WHERE indexing_task_id IS NULL AND id = $2`, id, pending.UUID) if err != nil { - return false, xerrors.Errorf("updating indexing task id: %w", err) + return false, xerrors.Errorf("updating mk20 indexing task id: %w", err) } - stop = false // we found a task to schedule, keep going + stop = false return true, nil }) } @@ -383,7 +833,9 @@ func (i *IndexingTask) Adder(taskFunc harmonytask.AddTaskFunc) { func (i *IndexingTask) GetSpid(db *harmonydb.DB, taskID int64) string { var spid string - err := db.QueryRow(context.Background(), `SELECT sp_id FROM market_mk12_deal_pipeline WHERE indexing_task_id = $1`, taskID).Scan(&spid) + err := db.QueryRow(context.Background(), `SELECT sp_id FROM market_mk12_deal_pipeline WHERE indexing_task_id = $1 + UNION ALL + SELECT sp_id FROM market_mk20_pipeline WHERE indexing_task_id = $1`, taskID).Scan(&spid) if err != nil { log.Errorf("getting spid: %s", err) return "" diff --git a/tasks/indexing/task_ipni.go b/tasks/indexing/task_ipni.go index 8f84a8805..401de2d17 100644 --- a/tasks/indexing/task_ipni.go +++ b/tasks/indexing/task_ipni.go @@ -1,21 +1,20 @@ package indexing import ( - "bufio" "bytes" "context" "crypto/rand" + "database/sql" "errors" "fmt" - "io" "net" "net/url" "strings" "time" + "github.com/google/uuid" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" - carv2 "github.com/ipld/go-car/v2" cidlink "github.com/ipld/go-ipld-prime/linking/cid" "github.com/ipni/go-libipni/ingest/schema" "github.com/ipni/go-libipni/metadata" @@ -23,9 +22,13 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr/net" + "github.com/multiformats/go-varint" + "github.com/oklog/ulid" "github.com/yugabyte/pgx/v5" + "golang.org/x/sync/errgroup" "golang.org/x/xerrors" + commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/curio/build" @@ -34,6 +37,7 @@ import ( "github.com/filecoin-project/curio/harmony/harmonytask" "github.com/filecoin-project/curio/harmony/resources" "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/cachedreader" "github.com/filecoin-project/curio/lib/ffi" "github.com/filecoin-project/curio/lib/passcall" "github.com/filecoin-project/curio/lib/pieceprovider" @@ -41,24 +45,25 @@ import ( "github.com/filecoin-project/curio/market/indexstore" "github.com/filecoin-project/curio/market/ipni/chunker" "github.com/filecoin-project/curio/market/ipni/ipniculib" + "github.com/filecoin-project/curio/market/mk20" ) var ilog = logging.Logger("ipni") type IPNITask struct { db *harmonydb.DB - indexStore *indexstore.IndexStore pieceProvider *pieceprovider.SectorReader + cpr *cachedreader.CachedPieceReader sc *ffi.SealCalls cfg *config.CurioConfig max taskhelp.Limiter } -func NewIPNITask(db *harmonydb.DB, sc *ffi.SealCalls, indexStore *indexstore.IndexStore, pieceProvider *pieceprovider.SectorReader, cfg *config.CurioConfig, max taskhelp.Limiter) *IPNITask { +func NewIPNITask(db *harmonydb.DB, sc *ffi.SealCalls, pieceProvider *pieceprovider.SectorReader, cpr *cachedreader.CachedPieceReader, cfg *config.CurioConfig, max taskhelp.Limiter) *IPNITask { return &IPNITask{ db: db, - indexStore: indexStore, pieceProvider: pieceProvider, + cpr: cpr, sc: sc, cfg: cfg, max: max, @@ -70,6 +75,7 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b var tasks []struct { SPID int64 `db:"sp_id"` + ID sql.NullString `db:"id"` Sector abi.SectorNumber `db:"sector"` Proof abi.RegisteredSealProof `db:"reg_seal_proof"` Offset int64 `db:"sector_offset"` @@ -80,7 +86,8 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b } err = I.db.Select(ctx, &tasks, `SELECT - sp_id, + sp_id, + id, sector, reg_seal_proof, sector_offset, @@ -111,12 +118,159 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b return true, nil } + if task.Rm { + comm, err := I.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + var ads []struct { + ContextID []byte `db:"context_id"` + IsRm bool `db:"is_rm"` + Previous string `db:"previous"` + Provider string `db:"provider"` + Addresses string `db:"addresses"` + Entries string `db:"entries"` + Metadata []byte `db:"metadata"` + Pcid2 string `db:"piece_cid_v2"` + Pcid1 string `db:"piece_cid"` + Size int64 `db:"piece_size"` + } + + // Get the latest Ad + err = tx.Select(&ads, `SELECT + context_id, + is_rm, + previous, + provider, + addresses, + entries, + metadata, + piece_cid_v2, + piece_cid, + piece_size + FROM ipni + WHERE context_id = $1 + AND provider = $2 + ORDER BY order_number DESC + LIMIT 1`, task.CtxID, task.Prov) + + if err != nil { + return false, xerrors.Errorf("getting ad from DB: %w", err) + } + + if len(ads) == 0 { + return false, xerrors.Errorf("not original ad found for removal ad") + } + + if len(ads) > 1 { + return false, xerrors.Errorf("expected 1 ad but got %d", len(ads)) + } + + a := ads[0] + + e, err := cid.Parse(a.Entries) + if err != nil { + return false, xerrors.Errorf("parsing entry CID: %w", err) + } + + var prev string + + err = tx.QueryRow(`SELECT head FROM ipni_head WHERE provider = $1`, task.Prov).Scan(&prev) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return false, xerrors.Errorf("querying previous head: %w", err) + } + + prevCID, err := cid.Parse(prev) + if err != nil { + return false, xerrors.Errorf("parsing previous CID: %w", err) + } + + var privKey []byte + err = tx.QueryRow(`SELECT priv_key FROM ipni_peerid WHERE sp_id = $1`, task.SPID).Scan(&privKey) + if err != nil { + return false, xerrors.Errorf("failed to get private ipni-libp2p key for PDP: %w", err) + } + + pkey, err := crypto.UnmarshalPrivateKey(privKey) + if err != nil { + return false, xerrors.Errorf("unmarshaling private key: %w", err) + } + + adv := schema.Advertisement{ + PreviousID: cidlink.Link{Cid: prevCID}, + Provider: a.Provider, + Addresses: strings.Split(a.Addresses, "|"), + Entries: cidlink.Link{Cid: e}, + ContextID: a.ContextID, + IsRm: true, + Metadata: a.Metadata, + } + + err = adv.Sign(pkey) + if err != nil { + return false, xerrors.Errorf("signing the advertisement: %w", err) + } + + err = adv.Validate() + if err != nil { + return false, xerrors.Errorf("validating the advertisement: %w", err) + } + + adNode, err := adv.ToNode() + if err != nil { + return false, xerrors.Errorf("converting advertisement to node: %w", err) + } + + ad, err := ipniculib.NodeToLink(adNode, schema.Linkproto) + if err != nil { + return false, xerrors.Errorf("converting advertisement to link: %w", err) + } + + _, err = tx.Exec(`SELECT insert_ad_and_update_head($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, + ad.(cidlink.Link).Cid.String(), adv.ContextID, a.Metadata, a.Pcid2, a.Pcid1, a.Size, adv.IsRm, adv.Provider, strings.Join(adv.Addresses, "|"), + adv.Signature, adv.Entries.String()) + + if err != nil { + return false, xerrors.Errorf("adding advertisement to the database: %w", err) + } + + n, err := tx.Exec(`UPDATE ipni_task SET complete = true WHERE task_id = $1`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to mark IPNI task complete: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updated %d rows", n) + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("store IPNI success: %w", err) + } + + if !comm { + return false, xerrors.Errorf("store IPNI success: failed to commit the transaction") + } + + log.Infow("IPNI task complete", "task_id", taskID) + return true, nil + } + var pi abi.PieceInfo err = pi.UnmarshalCBOR(bytes.NewReader(task.CtxID)) if err != nil { return false, xerrors.Errorf("unmarshaling piece info: %w", err) } + var rawSize abi.UnpaddedPieceSize + err = I.db.QueryRow(ctx, `SELECT raw_size FROM market_piece_deal WHERE piece_cid = $1 AND piece_length = $2 LIMIT 1`, pi.PieceCID.String(), pi.Size).Scan(&rawSize) + if err != nil { + return false, xerrors.Errorf("querying raw size: %w", err) + } + + pcid2, err := commcid.PieceCidV2FromV1(pi.PieceCID, uint64(rawSize)) + if err != nil { + return false, xerrors.Errorf("getting piece CID v2: %w", err) + } + + // Try to read unsealed sector first (mk12 deal) reader, err := I.pieceProvider.ReadPiece(ctx, storiface.SectorRef{ ID: abi.SectorID{ Miner: abi.ActorID(task.SPID), @@ -125,27 +279,113 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b ProofType: task.Proof, }, storiface.PaddedByteIndex(task.Offset).Unpadded(), pi.Size.Unpadded(), pi.PieceCID) if err != nil { - return false, xerrors.Errorf("getting piece reader: %w", err) + serr := err + // Try to read piece (mk20 deal) + reader, _, err = I.cpr.GetSharedPieceReader(ctx, pcid2, false) + if err != nil { + return false, xerrors.Errorf("getting piece reader from sector and piece park: %w, %w", serr, err) + } } - opts := []carv2.Option{carv2.ZeroLengthSectionAsEOF(true)} - blockReader, err := carv2.NewBlockReader(bufio.NewReaderSize(reader, 4<<20), opts...) - if err != nil { - return false, fmt.Errorf("getting block reader over piece: %w", err) + defer func() { + _ = reader.Close() + }() + + var isMK20 bool + + if task.ID.Valid { + _, err := ulid.Parse(task.ID.String) + if err == nil { + isMK20 = true + } else { + _, err := uuid.Parse(task.ID.String) + if err != nil { + return false, xerrors.Errorf("parsing task id: %w", err) + } + } } + recs := make(chan indexstore.Record, 1) + + var eg errgroup.Group + addFail := make(chan struct{}) + var interrupted bool + var subPieces []mk20.DataSource chk := chunker.NewInitialChunker() - blockMetadata, err := blockReader.SkipNext() - for err == nil { - if err := chk.Accept(blockMetadata.Hash(), int64(blockMetadata.Offset), blockMetadata.Size+40); err != nil { - return false, xerrors.Errorf("accepting block: %w", err) + eg.Go(func() error { + defer close(addFail) + for rec := range recs { + // CAR sections are [varint (length), CID, blockData] + combinedSize := rec.Size + uint64(rec.Cid.ByteLen()) + lenSize := uint64(varint.UvarintSize(combinedSize)) + sectionSize := combinedSize + lenSize + serr := chk.Accept(rec.Cid.Hash(), int64(rec.Offset), sectionSize) + if serr != nil { + addFail <- struct{}{} + return serr + } + } + return nil + }) + + if isMK20 { + id, serr := ulid.Parse(task.ID.String) + if serr != nil { + return false, xerrors.Errorf("parsing task id: %w", serr) + } + deal, serr := mk20.DealFromDB(ctx, I.db, id) + if serr != nil { + return false, xerrors.Errorf("getting deal from db: %w", serr) } - blockMetadata, err = blockReader.SkipNext() + if deal.Data.Format.Raw != nil { + return false, xerrors.Errorf("raw data not supported") + } + + if deal.Data.Format.Car != nil { + _, interrupted, err = IndexCAR(reader, 4<<20, recs, addFail) + } + + if deal.Data.Format.Aggregate != nil { + if deal.Data.Format.Aggregate.Type > 0 { + var found bool + if len(deal.Data.Format.Aggregate.Sub) > 0 { + subPieces = deal.Data.Format.Aggregate.Sub + found = true + } + if len(deal.Data.SourceAggregate.Pieces) > 0 { + subPieces = deal.Data.SourceAggregate.Pieces + found = true + } + if !found { + return false, xerrors.Errorf("no sub pieces for aggregate mk20 deal") + } + _, _, interrupted, err = IndexAggregate(pcid2, reader, pi.Size, subPieces, recs, addFail) + } else { + return false, xerrors.Errorf("invalid aggregate type") + } + } + + } else { + _, interrupted, err = IndexCAR(reader, 4<<20, recs, addFail) + } + + if err != nil { + // Chunking itself failed, stop early + close(recs) // still safe to close, chk.Accept() will exit on channel close + // wait for chk.Accept() goroutine to finish cleanly + _ = eg.Wait() + return false, xerrors.Errorf("chunking failed: %w", err) } - if !errors.Is(err, io.EOF) { - return false, xerrors.Errorf("reading block: %w", err) + + // Close the channel + close(recs) + + // Wait till is finished + err = eg.Wait() + if err != nil { + return false, xerrors.Errorf("adding index to chunk (interrupted %t): %w", interrupted, err) } // make sure we still own the task before writing to the database @@ -153,7 +393,7 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b return false, nil } - lnk, err := chk.Finish(ctx, I.db, pi.PieceCID) + lnk, err := chk.Finish(ctx, I.db, pcid2, false) if err != nil { return false, xerrors.Errorf("chunking CAR multihash iterator: %w", err) } @@ -166,7 +406,7 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b _, err = I.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { var prev string err = tx.QueryRow(`SELECT head FROM ipni_head WHERE provider = $1`, task.Prov).Scan(&prev) - if err != nil && err != pgx.ErrNoRows { + if err != nil && !errors.Is(err, pgx.ErrNoRows) { return false, xerrors.Errorf("querying previous head: %w", err) } @@ -245,8 +485,8 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b return false, xerrors.Errorf("converting advertisement to link: %w", err) } - _, err = tx.Exec(`SELECT insert_ad_and_update_head($1, $2, $3, $4, $5, $6, $7, $8, $9)`, - ad.(cidlink.Link).Cid.String(), adv.ContextID, pi.PieceCID.String(), pi.Size, adv.IsRm, adv.Provider, strings.Join(adv.Addresses, "|"), + _, err = tx.Exec(`SELECT insert_ad_and_update_head($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, + ad.(cidlink.Link).Cid.String(), adv.ContextID, md, pcid2.String(), pi.PieceCID.String(), pi.Size, adv.IsRm, adv.Provider, strings.Join(adv.Addresses, "|"), adv.Signature, adv.Entries.String()) if err != nil { @@ -274,17 +514,23 @@ func (I *IPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b } func (I *IPNITask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { - var tasks []struct { + type task struct { TaskID harmonytask.TaskID `db:"task_id"` SpID int64 `db:"sp_id"` SectorNumber int64 `db:"sector"` - StorageID *string `db:"storage_id"` + StorageID sql.NullString `db:"storage_id"` + IsRm bool `db:"is_rm"` + ID string `db:"id"` } if storiface.FTUnsealed != 1 { panic("storiface.FTUnsealed != 1") } + if storiface.FTPiece != 32 { + panic("storiface.FTPiece != 32") + } + ctx := context.Background() indIDs := make([]int64, len(ids)) @@ -292,13 +538,68 @@ func (I *IPNITask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskE indIDs[i] = int64(id) } + var tasks []task err := I.db.Select(ctx, &tasks, ` - SELECT dp.task_id, dp.sp_id, dp.sector, l.storage_id FROM ipni_task dp + SELECT dp.task_id, dp.sp_id, dp.sector, l.storage_id, dp.is_rm, dp.id FROM ipni_task dp LEFT JOIN sector_location l ON dp.sp_id = l.miner_id AND dp.sector = l.sector_num WHERE dp.task_id = ANY ($1) AND (l.sector_filetype IS NULL OR l.sector_filetype = 1) `, indIDs) if err != nil { - return nil, xerrors.Errorf("getting tasks: %w", err) + return nil, xerrors.Errorf("getting task details: %w", err) + } + + var mk12TaskIds []harmonytask.TaskID + var mk20TaskIds []harmonytask.TaskID + + for _, t := range tasks { + if t.IsRm { + return &ids[0], nil // If this is rm task then storage is not needed + } + _, err := ulid.Parse(t.ID) + if err == nil { + mk20TaskIds = append(mk20TaskIds, t.TaskID) + } else { + _, err := uuid.Parse(t.ID) + if err != nil { + return nil, xerrors.Errorf("parsing task id: %w", err) + } + mk12TaskIds = append(mk12TaskIds, t.TaskID) + } + } + + var finalTasks []task + + if len(mk12TaskIds) > 0 { + var mk12Tasks []task + err := I.db.Select(ctx, &mk12Tasks, ` + SELECT dp.task_id, dp.id, l.storage_id FROM ipni_task dp + LEFT JOIN sector_location l ON dp.sp_id = l.miner_id AND dp.sector = l.sector_num + WHERE dp.task_id = ANY ($1) AND (l.sector_filetype IS NULL OR l.sector_filetype = 1)`, indIDs) + if err != nil { + return nil, xerrors.Errorf("getting storage details: %w", err) + } + finalTasks = append(finalTasks, mk12Tasks...) + } + + if len(mk20TaskIds) > 0 { + var mk20Tasks []task + err := I.db.Select(ctx, &mk20Tasks, ` + SELECT + dp.task_id, + dp.id, + l.storage_id + FROM ipni_task dp + JOIN market_piece_deal mpd ON mpd.id = dp.id + JOIN parked_piece_refs pr ON pr.ref_id = mpd.piece_ref + JOIN sector_location l ON l.miner_id = 0 + AND l.sector_num = pr.piece_id + AND l.sector_filetype = 32 + WHERE dp.task_id = ANY ($1); + `, indIDs) + if err != nil { + return nil, xerrors.Errorf("getting storage details: %w", err) + } + finalTasks = append(finalTasks, mk20Tasks...) } ls, err := I.sc.LocalStorage(ctx) @@ -312,19 +613,20 @@ func (I *IPNITask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskE acceptables[t] = true } - for _, t := range tasks { + for _, t := range finalTasks { if _, ok := acceptables[t.TaskID]; !ok { continue } + acceptables[t.TaskID] = false // note the task was found - if t.StorageID == nil { + if !t.StorageID.Valid { // no unsealed copy return &t.TaskID, nil } for _, l := range ls { - if string(l.ID) == *t.StorageID { + if string(l.ID) == t.StorageID.String { return &t.TaskID, nil } } @@ -369,27 +671,76 @@ func (I *IPNITask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFun var stop bool for !stop { var markComplete *string + var mk20, isRM bool taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { stop = true // assume we're done until we find a task to schedule var pendings []itask - err := tx.Select(&pendings, `SELECT - uuid, - sp_id, - sector, - piece_cid, - piece_size, - sector_offset, - reg_seal_proof, - raw_size, - should_index, - announce - FROM market_mk12_deal_pipeline - WHERE sealed = TRUE - AND indexed = TRUE - AND complete = FALSE + err := tx.Select(&pendings, `WITH unioned AS ( + SELECT + uuid, + sp_id, + sector, + piece_cid, + piece_size, + sector_offset, + reg_seal_proof, + raw_size, + should_index, + announce, + indexing_created_at, + FALSE as mk20, + FALSE as is_rm + FROM market_mk12_deal_pipeline + WHERE sealed = TRUE + AND indexed = TRUE + AND complete = FALSE + + UNION ALL + + SELECT + id AS uuid, + sp_id, + sector, + piece_cid, + piece_size, + sector_offset, + reg_seal_proof, + raw_size, + indexing AS should_index, + announce, + indexing_created_at, + TRUE as mk20, + FALSE as is_rm + FROM market_mk20_pipeline + WHERE sealed = TRUE + AND indexed = TRUE + AND complete = FALSE + + UNION ALL + + SELECT + id AS uuid, + sp_id, + sector_number AS sector, + piece_cid, + piece_size, + 0::bigint AS sector_offset, + 0::bigint AS reg_seal_proof, + 0::bigint AS raw_size, + TRUE AS should_index, + TRUE AS announce, + TIMEZONE('UTC', NOW()) AS indexing_created_at, + TRUE as mk20, + TRUE as is_rm + FROM piece_cleanup + WHERE after_cleanup = TRUE + AND complete = FALSE + ) + SELECT * + FROM unioned ORDER BY indexing_created_at ASC LIMIT 1;`) if err != nil { @@ -405,21 +756,17 @@ func (I *IPNITask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFun // Skip IPNI if deal says not to announce or not to index (fast retrievals). If we announce without // indexing, it will cause issue with retrievals. if !p.Announce || !p.ShouldIndex { - n, err := tx.Exec(`UPDATE market_mk12_deal_pipeline SET complete = TRUE WHERE uuid = $1`, p.UUID) - if err != nil { - return false, xerrors.Errorf("store IPNI success: updating pipeline (1): %w", err) - } - if n != 1 { - return false, xerrors.Errorf("store IPNI success: updated %d rows", n) - } stop = false // we found a task to schedule, keep going - return true, nil + markComplete = &p.UUID + mk20 = p.Mk20 + isRM = p.IsRM + return false, nil } var privKey []byte err = tx.QueryRow(`SELECT priv_key FROM ipni_peerid WHERE sp_id = $1`, p.SpID).Scan(&privKey) if err != nil { - if err != pgx.ErrNoRows { + if !errors.Is(err, pgx.ErrNoRows) { return false, xerrors.Errorf("failed to get private libp2p key for miner %d: %w", p.SpID, err) } @@ -475,20 +822,24 @@ func (I *IPNITask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFun return false, xerrors.Errorf("marshaling piece info: %w", err) } - _, err = tx.Exec(`SELECT insert_ipni_task($1, $2, $3, $4, $5, $6, $7, $8)`, p.SpID, - p.Sector, p.Proof, p.Offset, b.Bytes(), false, pid.String(), id) + _, err = tx.Exec(`SELECT insert_ipni_task($1, $2, $3, $4, $5, $6, $7, $8, $9)`, p.UUID, p.SpID, + p.Sector, p.Proof, p.Offset, b.Bytes(), p.IsRM, pid.String(), id) if err != nil { if harmonydb.IsErrUniqueContraint(err) { - ilog.Infof("Another IPNI announce task already present for piece %s in deal %s", p.PieceCid, p.UUID) + ilog.Infof("Another IPNI announce task already present for piece %s and RM %t in deal %s", p.PieceCid, p.IsRM, p.UUID) // SET "complete" status to true for this deal, so it is not considered next time markComplete = &p.UUID + mk20 = p.Mk20 + isRM = p.IsRM stop = false // we found a sector to work on, keep going - return true, nil + return false, nil } if strings.Contains(err.Error(), "already published") { ilog.Infof("Piece %s in deal %s is already published", p.PieceCid, p.UUID) // SET "complete" status to true for this deal, so it is not considered next time markComplete = &p.UUID + mk20 = p.Mk20 + isRM = p.IsRM stop = false // we found a sector to work on, keep going return false, nil } @@ -496,11 +847,25 @@ func (I *IPNITask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFun } stop = false // we found a task to schedule, keep going + markComplete = &p.UUID + mk20 = p.Mk20 + isRM = p.IsRM return true, nil }) if markComplete != nil { - n, err := I.db.Exec(ctx, `UPDATE market_mk12_deal_pipeline SET complete = TRUE WHERE uuid = $1 AND complete = FALSE`, *markComplete) + var n int + var err error + if isRM { + n, err = I.db.Exec(ctx, `UPDATE piece_cleanup SET complete = TRUE WHERE id = $1 AND complete = FALSE`, *markComplete) + } else { + if mk20 { + n, err = I.db.Exec(ctx, `UPDATE market_mk20_pipeline SET complete = TRUE WHERE id = $1 AND complete = FALSE`, *markComplete) + } else { + n, err = I.db.Exec(ctx, `UPDATE market_mk12_deal_pipeline SET complete = TRUE WHERE uuid = $1 AND complete = FALSE`, *markComplete) + } + } + if err != nil { log.Errorf("store IPNI success: updating pipeline (2): %s", err) } diff --git a/tasks/indexing/task_pdp_indexing.go b/tasks/indexing/task_pdp_indexing.go new file mode 100644 index 000000000..ee199504a --- /dev/null +++ b/tasks/indexing/task_pdp_indexing.go @@ -0,0 +1,374 @@ +package indexing + +import ( + "context" + "errors" + "time" + + "github.com/ipfs/go-cid" + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/sync/errgroup" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/cachedreader" + "github.com/filecoin-project/curio/lib/ffi" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/market/indexstore" + "github.com/filecoin-project/curio/market/mk20" +) + +type PDPIndexingTask struct { + db *harmonydb.DB + indexStore *indexstore.IndexStore + cpr *cachedreader.CachedPieceReader + sc *ffi.SealCalls + cfg *config.CurioConfig + insertConcurrency int + insertBatchSize int + max taskhelp.Limiter +} + +func NewPDPIndexingTask(db *harmonydb.DB, sc *ffi.SealCalls, indexStore *indexstore.IndexStore, cpr *cachedreader.CachedPieceReader, cfg *config.CurioConfig, max taskhelp.Limiter) *PDPIndexingTask { + + return &PDPIndexingTask{ + db: db, + indexStore: indexStore, + cpr: cpr, + sc: sc, + cfg: cfg, + insertConcurrency: cfg.Market.StorageMarketConfig.Indexing.InsertConcurrency, + insertBatchSize: cfg.Market.StorageMarketConfig.Indexing.InsertBatchSize, + max: max, + } +} + +func (P *PDPIndexingTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + + var tasks []struct { + ID string `db:"id"` + PieceCIDV2 string `db:"piece_cid_v2"` + PieceRef int64 `db:"piece_ref"` + Indexing bool `db:"indexing"` + } + + err = P.db.Select(ctx, &tasks, `SELECT id, piece_cid_v2, piece_ref, indexing FROM pdp_pipeline WHERE indexing_task_id = $1 AND indexed = FALSE`, taskID) + if err != nil { + return false, xerrors.Errorf("getting PDP pending indexing tasks: %w", err) + } + + if len(tasks) != 1 { + return false, xerrors.Errorf("incorrect rows for pending indexing tasks: %d", len(tasks)) + } + + task := tasks[0] + + pcid2, err := cid.Parse(task.PieceCIDV2) + if err != nil { + return false, xerrors.Errorf("parsing piece CID: %w", err) + } + + pi, err := mk20.GetPieceInfo(pcid2) + if err != nil { + return false, xerrors.Errorf("getting piece info: %w", err) + } + + var indexed bool + err = P.db.QueryRow(ctx, `SELECT indexed FROM market_piece_metadata WHERE piece_cid = $1 and piece_size = $2`, pi.PieceCIDV1.String(), pi.Size).Scan(&indexed) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return false, xerrors.Errorf("checking if piece %s is already indexed: %w", task.PieceCIDV2, err) + } + + id, err := ulid.Parse(task.ID) + if err != nil { + return false, xerrors.Errorf("parsing task id: %w", err) + } + + deal, err := mk20.DealFromDB(ctx, P.db, id) + if err != nil { + return false, xerrors.Errorf("getting deal from db: %w", err) + } + + var subPieces []mk20.DataSource + var byteData bool + + if deal.Data.Format.Aggregate != nil { + if deal.Data.Format.Aggregate.Type > 0 { + var found bool + if len(deal.Data.Format.Aggregate.Sub) > 0 { + subPieces = deal.Data.Format.Aggregate.Sub + found = true + } + if len(deal.Data.SourceAggregate.Pieces) > 0 { + subPieces = deal.Data.SourceAggregate.Pieces + found = true + } + if !found { + return false, xerrors.Errorf("no sub pieces for aggregate PDP deal") + } + } + } + + if deal.Data.Format.Raw != nil { + byteData = true + } + + if indexed || !task.Indexing || byteData { + err = P.recordCompletion(ctx, taskID, task.ID, pi.PieceCIDV1.String(), int64(pi.Size), int64(pi.RawSize), task.PieceRef, false) + if err != nil { + return false, err + } + log.Infow("Piece already indexed or should not be indexed", "piece_cid", task.PieceCIDV2, "indexed", indexed, "should_index", task.Indexing, "id", task.ID, "sp_id") + + return true, nil + } + + reader, _, err := P.cpr.GetSharedPieceReader(ctx, pcid2, false) + + if err != nil { + return false, xerrors.Errorf("getting piece reader: %w", err) + } + + defer func() { + _ = reader.Close() + }() + + startTime := time.Now() + + dealCfg := P.cfg.Market.StorageMarketConfig + chanSize := dealCfg.Indexing.InsertConcurrency * dealCfg.Indexing.InsertBatchSize + + recs := make(chan indexstore.Record, chanSize) + var blocks int64 + + var eg errgroup.Group + addFail := make(chan struct{}) + var interrupted bool + + eg.Go(func() error { + defer close(addFail) + return P.indexStore.AddIndex(ctx, pcid2, recs) + }) + + var aggidx map[cid.Cid][]indexstore.Record + + if len(subPieces) > 0 { + blocks, aggidx, interrupted, err = IndexAggregate(pcid2, reader, pi.Size, subPieces, recs, addFail) + } else { + blocks, interrupted, err = IndexCAR(reader, 4<<20, recs, addFail) + } + + if err != nil { + // Indexing itself failed, stop early + close(recs) // still safe to close, AddIndex will exit on channel close + // wait for AddIndex goroutine to finish cleanly + _ = eg.Wait() + return false, xerrors.Errorf("indexing failed: %w", err) + } + + // Close the channel + close(recs) + + // Wait till AddIndex is finished + err = eg.Wait() + if err != nil { + return false, xerrors.Errorf("adding index to DB (interrupted %t): %w", interrupted, err) + } + + log.Infof("Indexing deal %s took %0.3f seconds", task.ID, time.Since(startTime).Seconds()) + + // Save aggregate index if present + for k, v := range aggidx { + if len(v) > 0 { + err = P.indexStore.InsertAggregateIndex(ctx, k, v) + if err != nil { + return false, xerrors.Errorf("inserting aggregate index: %w", err) + } + } + } + + err = P.recordCompletion(ctx, taskID, task.ID, pi.PieceCIDV1.String(), int64(pi.Size), int64(pi.RawSize), task.PieceRef, true) + if err != nil { + return false, err + } + + blocksPerSecond := float64(blocks) / time.Since(startTime).Seconds() + log.Infow("Piece indexed", "piece_cid", task.PieceCIDV2, "id", task.ID, "blocks", blocks, "blocks_per_second", blocksPerSecond) + + return true, nil +} + +func (P *PDPIndexingTask) recordCompletion(ctx context.Context, taskID harmonytask.TaskID, id, PieceCID string, size, rawSize, pieceRef int64, indexed bool) error { + comm, err := P.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + _, err = tx.Exec(`SELECT process_piece_deal($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, + id, PieceCID, false, -1, -1, nil, size, rawSize, indexed, pieceRef, false, 0) + if err != nil { + return false, xerrors.Errorf("failed to update piece metadata and piece deal for deal %s: %w", id, err) + } + + if P.cfg.Market.StorageMarketConfig.IPNI.Disable { + n, err := P.db.Exec(ctx, `UPDATE pdp_pipeline SET indexed = TRUE, indexing_task_id = NULL, + complete = TRUE WHERE id = $1 AND indexing_task_id = $2`, id, taskID) + if err != nil { + return false, xerrors.Errorf("store indexing success: updating pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("store indexing success: updated %d rows", n) + } + } else { + n, err := tx.Exec(`UPDATE pdp_pipeline SET indexed = TRUE, indexing_task_id = NULL + WHERE id = $1 AND indexing_task_id = $2`, id, taskID) + if err != nil { + return false, xerrors.Errorf("store indexing success: updating pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("store indexing success: updated %d rows", n) + } + } + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return xerrors.Errorf("committing transaction: %w", err) + } + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + + return nil +} + +func (P *PDPIndexingTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + ctx := context.Background() + + type task struct { + TaskID harmonytask.TaskID `db:"indexing_task_id"` + StorageID string `db:"storage_id"` + PieceRef int64 `db:"piece_ref"` + Indexing bool `db:"indexing"` + } + + indIDs := make([]int64, len(ids)) + for x, id := range ids { + indIDs[x] = int64(id) + } + + var tasks []*task + if storiface.FTPiece != 32 { + panic("storiface.FTPiece != 32") + } + + err := P.db.Select(ctx, &tasks, `SELECT indexing_task_id, piece_ref, indexing FROM pdp_pipeline WHERE indexing_task_id = ANY($1)`, indIDs) + if err != nil { + return nil, xerrors.Errorf("getting PDP indexing details: %w", err) + } + + for _, t := range tasks { + + if !t.Indexing { + continue + } + + var sLocation string + err = P.db.QueryRow(ctx, ` + SELECT sl.storage_id + FROM parked_piece_refs ppr + JOIN sector_location sl + ON sl.sector_num = ppr.piece_id + AND sl.miner_id = 0 + AND sl.sector_filetype = 32 + WHERE ppr.ref_id = $1 + `, t.PieceRef).Scan(&sLocation) + if err != nil { + return nil, xerrors.Errorf("getting storage_id: %w", err) + } + + t.StorageID = sLocation + } + + ls, err := P.sc.LocalStorage(ctx) + if err != nil { + return nil, xerrors.Errorf("getting local storage: %w", err) + } + + localStorageMap := make(map[string]bool, len(ls)) + for _, l := range ls { + localStorageMap[string(l.ID)] = true + } + + for _, t := range tasks { + if !t.Indexing { + return &t.TaskID, nil + } + if found, ok := localStorageMap[t.StorageID]; ok && found { + return &t.TaskID, nil + } + } + + return nil, nil +} + +func (P *PDPIndexingTask) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Name: "PDPIndexing", + Cost: resources.Resources{ + Cpu: 1, + Ram: uint64(P.insertBatchSize * P.insertConcurrency * 56 * 2), + }, + Max: P.max, + MaxFailures: 3, + IAmBored: passcall.Every(3*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return P.schedule(context.Background(), taskFunc) + }), + } +} + +func (P *PDPIndexingTask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + // schedule submits + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var pendings []struct { + ID string `db:"id"` + } + + err := tx.Select(&pendings, `SELECT id FROM pdp_pipeline + WHERE after_save_cache = TRUE + AND indexing_task_id IS NULL + AND indexed = FALSE + ORDER BY indexing_created_at ASC LIMIT 1;`) + if err != nil { + return false, xerrors.Errorf("getting PDP pending indexing tasks: %w", err) + } + + if len(pendings) == 0 { + return false, nil + } + + pending := pendings[0] + _, err = tx.Exec(`UPDATE pdp_pipeline SET indexing_task_id = $1 + WHERE indexing_task_id IS NULL AND id = $2`, id, pending.ID) + if err != nil { + return false, xerrors.Errorf("updating PDP indexing task id: %w", err) + } + + stop = false + return true, nil + }) + } + + return nil +} + +func (P *PDPIndexingTask) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ harmonytask.TaskInterface = &PDPIndexingTask{} +var _ = harmonytask.Reg(&PDPIndexingTask{}) diff --git a/tasks/indexing/task_pdp_ipni.go b/tasks/indexing/task_pdp_ipni.go new file mode 100644 index 000000000..5db1bbe5c --- /dev/null +++ b/tasks/indexing/task_pdp_ipni.go @@ -0,0 +1,808 @@ +package indexing + +import ( + "context" + "crypto/rand" + "errors" + "fmt" + "net/url" + "strings" + "time" + + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ipni/go-libipni/ingest/schema" + "github.com/ipni/go-libipni/metadata" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/multiformats/go-varint" + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/sync/errgroup" + "golang.org/x/xerrors" + + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-padreader" + + "github.com/filecoin-project/curio/build" + "github.com/filecoin-project/curio/deps/config" + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/cachedreader" + "github.com/filecoin-project/curio/lib/ffi" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/market/indexstore" + "github.com/filecoin-project/curio/market/ipni/chunker" + "github.com/filecoin-project/curio/market/ipni/ipniculib" + "github.com/filecoin-project/curio/market/ipni/types" + "github.com/filecoin-project/curio/market/mk20" +) + +type PDPIPNITask struct { + db *harmonydb.DB + cpr *cachedreader.CachedPieceReader + sc *ffi.SealCalls + cfg *config.CurioConfig + max taskhelp.Limiter +} + +func NewPDPIPNITask(db *harmonydb.DB, sc *ffi.SealCalls, cpr *cachedreader.CachedPieceReader, cfg *config.CurioConfig, max taskhelp.Limiter) *PDPIPNITask { + return &PDPIPNITask{ + db: db, + cpr: cpr, + sc: sc, + cfg: cfg, + max: max, + } +} + +func (P *PDPIPNITask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + + var tasks []struct { + ID string `db:"id"` + CtxID []byte `db:"context_id"` + Rm bool `db:"is_rm"` + Prov string `db:"provider"` + Complete bool `db:"complete"` + } + + err = P.db.Select(ctx, &tasks, `SELECT + id, + context_id, + is_rm, + provider, + complete + FROM + pdp_ipni_task + WHERE + task_id = $1;`, taskID) + if err != nil { + return false, xerrors.Errorf("getting ipni task params: %w", err) + } + + if len(tasks) == 0 { + return true, nil + } + + if len(tasks) != 1 { + return false, xerrors.Errorf("expected 1 ipni task params, got %d", len(tasks)) + } + + task := tasks[0] + + if task.Complete { + log.Infow("IPNI task already complete", "task_id", taskID) + return true, nil + } + + if task.Rm { + comm, err := P.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + var ads []struct { + ContextID []byte `db:"context_id"` + IsRm bool `db:"is_rm"` + Previous string `db:"previous"` + Provider string `db:"provider"` + Addresses string `db:"addresses"` + Entries string `db:"entries"` + Metadata []byte `db:"metadata"` + Pcid2 string `db:"piece_cid_v2"` + Pcid1 string `db:"piece_cid"` + Size int64 `db:"piece_size"` + } + + // Get the latest Ad + err = tx.Select(&ads, `SELECT + context_id, + is_rm, + previous, + provider, + addresses, + entries, + metadata, + piece_cid_v2, + piece_cid, + piece_size + FROM ipni + WHERE context_id = $1 + AND provider = $2 + ORDER BY order_number DESC + LIMIT 1`, task.CtxID, task.Prov) + + if err != nil { + return false, xerrors.Errorf("getting ad from DB: %w", err) + } + + if len(ads) == 0 { + return false, xerrors.Errorf("not original ad found for removal ad") + } + + if len(ads) > 1 { + return false, xerrors.Errorf("expected 1 ad but got %d", len(ads)) + } + + a := ads[0] + + e, err := cid.Parse(a.Entries) + if err != nil { + return false, xerrors.Errorf("parsing entry CID: %w", err) + } + + var prev string + + err = tx.QueryRow(`SELECT head FROM ipni_head WHERE provider = $1`, task.Prov).Scan(&prev) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return false, xerrors.Errorf("querying previous head: %w", err) + } + + prevCID, err := cid.Parse(prev) + if err != nil { + return false, xerrors.Errorf("parsing previous CID: %w", err) + } + + var privKey []byte + err = tx.QueryRow(`SELECT priv_key FROM ipni_peerid WHERE sp_id = $1`, -1).Scan(&privKey) + if err != nil { + return false, xerrors.Errorf("failed to get private ipni-libp2p key for PDP: %w", err) + } + + pkey, err := crypto.UnmarshalPrivateKey(privKey) + if err != nil { + return false, xerrors.Errorf("unmarshaling private key: %w", err) + } + + adv := schema.Advertisement{ + PreviousID: cidlink.Link{Cid: prevCID}, + Provider: a.Provider, + Addresses: strings.Split(a.Addresses, "|"), + Entries: cidlink.Link{Cid: e}, + ContextID: a.ContextID, + IsRm: true, + Metadata: a.Metadata, + } + + err = adv.Sign(pkey) + if err != nil { + return false, xerrors.Errorf("signing the advertisement: %w", err) + } + + err = adv.Validate() + if err != nil { + return false, xerrors.Errorf("validating the advertisement: %w", err) + } + + adNode, err := adv.ToNode() + if err != nil { + return false, xerrors.Errorf("converting advertisement to node: %w", err) + } + + ad, err := ipniculib.NodeToLink(adNode, schema.Linkproto) + if err != nil { + return false, xerrors.Errorf("converting advertisement to link: %w", err) + } + + _, err = tx.Exec(`SELECT insert_ad_and_update_head($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, + ad.(cidlink.Link).Cid.String(), adv.ContextID, a.Metadata, a.Pcid2, a.Pcid1, a.Size, adv.IsRm, adv.Provider, strings.Join(adv.Addresses, "|"), + adv.Signature, adv.Entries.String()) + + if err != nil { + return false, xerrors.Errorf("adding advertisement to the database: %w", err) + } + + n, err := tx.Exec(`UPDATE pdp_ipni_task SET complete = true WHERE task_id = $1`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to mark IPNI task complete: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updated %d rows", n) + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("store IPNI success: %w", err) + } + + if !comm { + return false, xerrors.Errorf("store IPNI success: failed to commit the transaction") + } + + log.Infow("IPNI task complete", "task_id", taskID) + return true, nil + } + + pinfo := &types.PdpIpniContext{} + err = pinfo.Unmarshal(task.CtxID) + if err != nil { + return false, xerrors.Errorf("unmarshaling piece info: %w", err) + } + + pcid2 := pinfo.PieceCID + + pieceCid, rawSize, err := commcid.PieceCidV1FromV2(pcid2) + if err != nil { + return false, xerrors.Errorf("getting piece cid v1 from piece cid v2: %w", err) + } + + size := padreader.PaddedSize(rawSize).Padded() + + var lnk ipld.Link + + if pinfo.Payload { + reader, _, err := P.cpr.GetSharedPieceReader(ctx, pcid2, false) + if err != nil { + return false, xerrors.Errorf("getting piece reader from piece park: %w", err) + } + + defer func() { + _ = reader.Close() + }() + + recs := make(chan indexstore.Record, 1) + + var eg errgroup.Group + addFail := make(chan struct{}) + var interrupted bool + var subPieces []mk20.DataSource + chk := chunker.NewInitialChunker() + + eg.Go(func() error { + defer close(addFail) + for rec := range recs { + // CAR sections are [varint (length), CID, blockData] + combinedSize := rec.Size + uint64(rec.Cid.ByteLen()) + lenSize := uint64(varint.UvarintSize(combinedSize)) + sectionSize := combinedSize + lenSize + serr := chk.Accept(rec.Cid.Hash(), int64(rec.Offset), sectionSize) + if serr != nil { + addFail <- struct{}{} + return serr + } + } + return nil + }) + + id, serr := ulid.Parse(task.ID) + if serr != nil { + return false, xerrors.Errorf("parsing task id: %w", serr) + } + deal, serr := mk20.DealFromDB(ctx, P.db, id) + if serr != nil { + return false, xerrors.Errorf("getting deal from db: %w", serr) + } + + if deal.Data.Format.Raw != nil { + return false, xerrors.Errorf("raw data not supported") + } + + if deal.Data.Format.Car != nil { + _, interrupted, err = IndexCAR(reader, 4<<20, recs, addFail) + } + + if deal.Data.Format.Aggregate != nil { + if deal.Data.Format.Aggregate.Type > 0 { + var found bool + if len(deal.Data.Format.Aggregate.Sub) > 0 { + subPieces = deal.Data.Format.Aggregate.Sub + found = true + } + if len(deal.Data.SourceAggregate.Pieces) > 0 { + subPieces = deal.Data.SourceAggregate.Pieces + found = true + } + if !found { + return false, xerrors.Errorf("no sub pieces for aggregate mk20 deal") + } + _, _, interrupted, err = IndexAggregate(pcid2, reader, size, subPieces, recs, addFail) + } else { + return false, xerrors.Errorf("invalid aggregate type") + } + } + + if err != nil { + // Chunking itself failed, stop early + close(recs) // still safe to close, chk.Accept() will exit on channel close + // wait for chk.Accept() goroutine to finish cleanly + _ = eg.Wait() + return false, xerrors.Errorf("chunking failed: %w", err) + } + + // Close the channel + close(recs) + + // Wait till is finished + err = eg.Wait() + if err != nil { + return false, xerrors.Errorf("adding index to chunk (interrupted %t): %w", interrupted, err) + } + + // make sure we still own the task before writing to the database + if !stillOwned() { + return false, nil + } + + lnk, err = chk.Finish(ctx, P.db, pcid2, false) + if err != nil { + return false, xerrors.Errorf("chunking CAR multihash iterator: %w", err) + } + } else { + chk := chunker.NewInitialChunker() + err = chk.Accept(pcid2.Hash(), 0, uint64(size)) + if err != nil { + return false, xerrors.Errorf("adding index to chunk: %w", err) + } + lnk, err = chk.Finish(ctx, P.db, pcid2, true) + if err != nil { + return false, xerrors.Errorf("chunking CAR multihash iterator: %w", err) + } + } + + // make sure we still own the task before writing ad chains + if !stillOwned() { + return false, nil + } + + _, err = P.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + var prev string + err = tx.QueryRow(`SELECT head FROM ipni_head WHERE provider = $1`, task.Prov).Scan(&prev) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return false, xerrors.Errorf("querying previous head: %w", err) + } + + var md []byte + if pinfo.Payload { + mds := metadata.IpfsGatewayHttp{} + mdb, err := mds.MarshalBinary() + if err != nil { + return false, xerrors.Errorf("marshaling metadata: %w", err) + } + md = mdb + } else { + mds := metadata.FilecoinPieceHttp{} + mdb, err := mds.MarshalBinary() + if err != nil { + return false, xerrors.Errorf("marshaling metadata: %w", err) + } + md = mdb + } + + var privKey []byte + err = tx.QueryRow(`SELECT priv_key FROM ipni_peerid WHERE sp_id = $1`, -1).Scan(&privKey) + if err != nil { + return false, xerrors.Errorf("failed to get private ipni-libp2p key for PDP: %w", err) + } + + pkey, err := crypto.UnmarshalPrivateKey(privKey) + if err != nil { + return false, xerrors.Errorf("unmarshaling private key: %w", err) + } + + adv := schema.Advertisement{ + Provider: task.Prov, + Entries: lnk, + ContextID: task.CtxID, + Metadata: md, + IsRm: task.Rm, + } + + { + u, err := url.Parse(fmt.Sprintf("https://%s", P.cfg.HTTP.DomainName)) + if err != nil { + return false, xerrors.Errorf("parsing announce address domain: %w", err) + } + if build.BuildType != build.BuildMainnet && build.BuildType != build.BuildCalibnet { + ls := strings.Split(P.cfg.HTTP.ListenAddress, ":") + u, err = url.Parse(fmt.Sprintf("http://%s:%s", P.cfg.HTTP.DomainName, ls[1])) + if err != nil { + return false, xerrors.Errorf("parsing announce address domain: %w", err) + } + } + + addr, err := FromURLWithPort(u) + if err != nil { + return false, xerrors.Errorf("converting URL to multiaddr: %w", err) + } + + adv.Addresses = append(adv.Addresses, addr.String()) + } + + if prev != "" { + prevCID, err := cid.Parse(prev) + if err != nil { + return false, xerrors.Errorf("parsing previous CID: %w", err) + } + + adv.PreviousID = cidlink.Link{Cid: prevCID} + } + + err = adv.Sign(pkey) + if err != nil { + return false, xerrors.Errorf("signing the advertisement: %w", err) + } + + err = adv.Validate() + if err != nil { + return false, xerrors.Errorf("validating the advertisement: %w", err) + } + + adNode, err := adv.ToNode() + if err != nil { + return false, xerrors.Errorf("converting advertisement to node: %w", err) + } + + ad, err := ipniculib.NodeToLink(adNode, schema.Linkproto) + if err != nil { + return false, xerrors.Errorf("converting advertisement to link: %w", err) + } + + _, err = tx.Exec(`SELECT insert_ad_and_update_head($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, + ad.(cidlink.Link).Cid.String(), adv.ContextID, md, pcid2.String(), pieceCid.String(), size, adv.IsRm, adv.Provider, strings.Join(adv.Addresses, "|"), + adv.Signature, adv.Entries.String()) + + if err != nil { + return false, xerrors.Errorf("adding advertisement to the database: %w", err) + } + + n, err := tx.Exec(`UPDATE pdp_ipni_task SET complete = true WHERE task_id = $1`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to mark IPNI task complete: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("updated %d rows", n) + } + + return true, nil + + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("store IPNI success: %w", err) + } + + log.Infow("IPNI task complete", "task_id", taskID) + + return true, nil +} + +func (P *PDPIPNITask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + return &ids[0], nil +} + +func (P *PDPIPNITask) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Name: "PDPIpni", + Cost: resources.Resources{ + Cpu: 1, + Ram: 1 << 30, + }, + MaxFailures: 3, + IAmBored: passcall.Every(30*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return P.schedule(context.Background(), taskFunc) + }), + Max: P.max, + } +} + +func (P *PDPIPNITask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + if P.cfg.Market.StorageMarketConfig.IPNI.Disable { + return nil + } + + // schedule submits + var stop bool + for !stop { + var markComplete, markCompletePayload, complete *string + var isRm bool + + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var pendings []struct { + ID string `db:"id"` + PieceCid string `db:"piece_cid_v2"` + IsRM bool `db:"is_rm"` + Announce bool `db:"announce"` + AnnouncePayload bool `db:"announce_payload"` + Announced bool `db:"announced"` + AnnouncedPayload bool `db:"announced_payload"` + } + + err := tx.Select(&pendings, `WITH unioned AS ( + SELECT + dp.id, + dp.piece_cid_v2, + dp.announce, + dp.announce_payload, + dp.announced, + dp.announced_payload, + FALSE AS is_rm + FROM pdp_pipeline dp + WHERE dp.indexed = TRUE + AND dp.complete = FALSE + + UNION ALL + + SELECT + pc.id, + pc.piece_cid_v2, + pc.announce, + pc.announce_payload, + pc.announced, + pc.announced_payload, + TRUE AS is_rm + FROM piece_cleanup pc + WHERE pc.after_cleanup = TRUE + AND pc.complete = FALSE + ) + SELECT * + FROM unioned + LIMIT 1; + `) + if err != nil { + return false, xerrors.Errorf("getting pending IPNI announcing tasks: %w", err) + } + + if len(pendings) == 0 { + return false, nil + } + + p := pendings[0] + + // Mark deal is complete if: + // 1. We don't need to announce anything + // 2. Both type of announcements are done + if (!p.Announce && !p.AnnouncePayload) || (p.Announced && p.AnnouncedPayload) { //nolint:staticcheck + isRm = p.IsRM + complete = &p.ID + return false, nil + } + + var privKey []byte + var peerIDStr string + err = tx.QueryRow(`SELECT priv_key, peer_id FROM ipni_peerid WHERE sp_id = $1`, -1).Scan(&privKey, &peerIDStr) + if err != nil { + if !errors.Is(err, pgx.ErrNoRows) { + return false, xerrors.Errorf("failed to get private libp2p key for PDP: %w", err) + } + + // generate the ipni provider key + pk, _, err := crypto.GenerateEd25519Key(rand.Reader) + if err != nil { + return false, xerrors.Errorf("failed to generate a new key: %w", err) + } + + privKey, err = crypto.MarshalPrivateKey(pk) + if err != nil { + return false, xerrors.Errorf("failed to marshal the private key: %w", err) + } + + pid, err := peer.IDFromPublicKey(pk.GetPublic()) + if err != nil { + return false, xerrors.Errorf("getting peer ID: %w", err) + } + + n, err := tx.Exec(`INSERT INTO ipni_peerid (sp_id, priv_key, peer_id) VALUES ($1, $2, $3) ON CONFLICT(sp_id) DO NOTHING `, -1, privKey, pid.String()) + if err != nil { + return false, xerrors.Errorf("failed to to insert the key into DB: %w", err) + } + + if n == 0 { + return false, xerrors.Errorf("failed to insert the key into db") + } + + peerIDStr = pid.String() + } + + pid, err := peer.Decode(peerIDStr) + if err != nil { + return false, fmt.Errorf("decoding peer ID: %w", err) + } + + pcid, err := cid.Parse(p.PieceCid) + if err != nil { + return false, xerrors.Errorf("parsing piece CID: %w", err) + } + + // If we need to announce payload and haven't done so, then do it first + if p.AnnouncePayload && !p.AnnouncedPayload { + pi := &types.PdpIpniContext{ + PieceCID: pcid, + Payload: true, + } + + iContext, err := pi.Marshal() + if err != nil { + return false, xerrors.Errorf("marshaling piece info: %w", err) + } + + _, err = tx.Exec(`SELECT insert_pdp_ipni_task($1, $2, $3, $4, $5)`, iContext, p.IsRM, p.ID, pid.String(), id) + if err != nil { + if harmonydb.IsErrUniqueContraint(err) { + ilog.Infof("Another IPNI announce task already present for piece %s and payload %d with RM %t in deal %s", p.PieceCid, p.AnnouncePayload, p.IsRM, p.ID) + stop = false // we found a sector to work on, keep going + isRm = p.IsRM + markCompletePayload = &p.ID + return false, nil + } + if strings.Contains(err.Error(), "already published") { + ilog.Infof("Piece %s in deal %s is already published", p.PieceCid, p.ID) + stop = false // we found a sector to work on, keep going + isRm = p.IsRM + markCompletePayload = &p.ID + return false, nil + } + return false, xerrors.Errorf("updating IPNI announcing task id: %w", err) + } + stop = false + isRm = p.IsRM + markCompletePayload = &p.ID + // Return early while commiting so we mark complete for payload announcement + return true, nil + } + + // If we don't need to announce payload, mark it as complete so pipeline does not try that + if !p.AnnouncePayload && !p.AnnouncedPayload { + stop = false + isRm = p.IsRM + markCompletePayload = &p.ID + // Rerun early without commiting so we mark complete for payload announcement + return false, nil + } + + // If we need to announce piece and haven't done so then do it + if p.Announce && !p.Announced { + pi := &types.PdpIpniContext{ + PieceCID: pcid, + Payload: false, + } + + iContext, err := pi.Marshal() + if err != nil { + return false, xerrors.Errorf("marshaling piece info: %w", err) + } + + _, err = tx.Exec(`SELECT insert_pdp_ipni_task($1, $2, $3, $4, $5)`, iContext, p.IsRM, p.ID, pid.String(), id) + if err != nil { + if harmonydb.IsErrUniqueContraint(err) { + ilog.Infof("Another IPNI announce task already present for piece %s and payload %d with RM %t in deal %s", p.PieceCid, p.AnnouncePayload, p.IsRM, p.ID) + stop = false // we found a sector to work on, keep going + markComplete = &p.ID + isRm = p.IsRM + return false, nil + + } + if strings.Contains(err.Error(), "already published") { + ilog.Infof("Piece %s in deal %s is already published", p.PieceCid, p.ID) + stop = false // we found a sector to work on, keep going + markComplete = &p.ID + isRm = p.IsRM + return false, nil + + } + return false, xerrors.Errorf("updating IPNI announcing task id: %w", err) + } + stop = false + isRm = p.IsRM + markComplete = &p.ID + // Return early while commiting so we mark complete for piece announcement + return true, nil + } + + // If we don't need to announce piece, mark it as complete so pipeline does not try that + if !p.Announce && !p.Announced { + stop = false + isRm = p.IsRM + markComplete = &p.ID + // Rerun early without commiting so we mark complete for payload announcement + return false, nil + } + + return false, xerrors.Errorf("no task to schedule") + }) + + if markComplete != nil { + var n int + var err error + if isRm { + n, err = P.db.Exec(ctx, `UPDATE piece_cleanup SET announced = TRUE WHERE id = $1`, *markComplete) + } else { + n, err = P.db.Exec(ctx, `UPDATE pdp_pipeline SET announced = TRUE WHERE id = $1`, *markComplete) + } + + if err != nil { + log.Errorf("store IPNI success: updating pipeline: %w", err) + } + if n != 1 { + log.Errorf("store IPNI success: updated %d rows", n) + } + } + + if markCompletePayload != nil { + var n int + var err error + if isRm { + n, err = P.db.Exec(ctx, `UPDATE piece_cleanup SET announced_payload = TRUE WHERE id = $1`, *markCompletePayload) + } else { + n, err = P.db.Exec(ctx, `UPDATE pdp_pipeline SET announced_payload = TRUE WHERE id = $1`, *markCompletePayload) + } + if err != nil { + log.Errorf("store IPNI success: updating pipeline: %w", err) + } + if n != 1 { + log.Errorf("store IPNI success: updated %d rows", n) + } + } + + if complete != nil { + comm, err := P.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + if isRm { + n, err := tx.Exec(`UPDATE piece_cleanup SET complete = TRUE WHERE id = $1`, *complete) + if err != nil { + return false, xerrors.Errorf("updating piece cleanup pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected to update 1 row in piece_cleanup but updated %d rows", n) + } + return true, nil + } + n, err := tx.Exec(`UPDATE pdp_pipeline SET complete = TRUE WHERE id = $1`, *complete) + + if err != nil { + return false, xerrors.Errorf("updating pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected to update 1 row but updated %d rows", n) + } + + n, err = tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set(pdp_v1, '{complete}', 'true'::jsonb, true) + WHERE id = $1;`, *complete) + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + + stop = false // we found a task to schedule, keep going + ilog.Debugf("Deal %s is marked as complete", *complete) + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return xerrors.Errorf("marking deal as complete: %w", err) + } + if !comm { + return xerrors.Errorf("marking deal as complete: failed to commit transaction") + } + } + } + + return nil +} + +func (P *PDPIPNITask) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ harmonytask.TaskInterface = &PDPIPNITask{} +var _ = harmonytask.Reg(&PDPIPNITask{}) diff --git a/tasks/message/watch.go b/tasks/message/watch.go index b75f950c3..bf288401a 100644 --- a/tasks/message/watch.go +++ b/tasks/message/watch.go @@ -49,7 +49,7 @@ func NewMessageWatcher(db *harmonydb.DB, ht *harmonytask.TaskEngine, pcs *chains updateCh: make(chan struct{}), } go mw.run() - if err := pcs.AddHandler(mw.processHeadChange); err != nil { + if err := pcs.AddWatcher(mw.processHeadChange); err != nil { return nil, err } return mw, nil diff --git a/tasks/message/watch_eth.go b/tasks/message/watch_eth.go index a71219864..4ac851a4b 100644 --- a/tasks/message/watch_eth.go +++ b/tasks/message/watch_eth.go @@ -65,7 +65,7 @@ func NewMessageWatcherEth(db *harmonydb.DB, ht *harmonytask.TaskEngine, pcs *cha ethCallTimeout: defaultEthCallTimeout, } go mw.run() - if err := pcs.AddHandler(mw.processHeadChange); err != nil { + if err := pcs.AddWatcher(mw.processHeadChange); err != nil { return nil, err } return mw, nil @@ -257,7 +257,7 @@ func (mw *MessageWatcherEth) update() { } } - log.Infow("MessageWatcherEth update completed", + log.Debugw("MessageWatcherEth update completed", "processed", processed, "confirmed", confirmed, "stillPending", stillPending, diff --git a/tasks/pdp/data_set_create_watch.go b/tasks/pdp/data_set_create_watch.go new file mode 100644 index 000000000..b6184d5d6 --- /dev/null +++ b/tasks/pdp/data_set_create_watch.go @@ -0,0 +1,223 @@ +package pdp + +import ( + "context" + "encoding/json" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/chainsched" + "github.com/filecoin-project/curio/pdp/contract" + + chainTypes "github.com/filecoin-project/lotus/chain/types" +) + +type DataSetCreate struct { + CreateMessageHash string `db:"tx_hash"` + ID string `db:"id"` + Client string `db:"client"` +} + +func NewWatcherDataSetCreate(db *harmonydb.DB, ethClient *ethclient.Client, pcs *chainsched.CurioChainSched) { + if err := pcs.AddHandler(func(ctx context.Context, revert, apply *chainTypes.TipSet) error { + err := processPendingDataSetCreates(ctx, db, ethClient) + if err != nil { + log.Errorf("Failed to process pending data set creates: %s", err) + } + return nil + }); err != nil { + panic(err) + } +} + +func processPendingDataSetCreates(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client) error { + // Query for pdp_data_set_create entries tx_hash is NOT NULL + var dataSetCreates []DataSetCreate + + err := db.Select(ctx, &dataSetCreates, ` + SELECT id, client, tx_hash + FROM pdp_data_set_create + WHERE tx_hash IS NOT NULL`) + if err != nil { + return xerrors.Errorf("failed to select data set creates: %w", err) + } + + if len(dataSetCreates) == 0 { + // No pending data set creates + return nil + } + + // Process each data set create + for _, dsc := range dataSetCreates { + err := processDataSetCreate(ctx, db, dsc, ethClient) + if err != nil { + log.Errorf("Failed to process data set create for tx %s: %s", dsc.CreateMessageHash, err) + continue + } + } + + return nil +} + +func processDataSetCreate(ctx context.Context, db *harmonydb.DB, dsc DataSetCreate, ethClient *ethclient.Client) error { + // Retrieve the tx_receipt from message_waits_eth + var txReceiptJSON []byte + var txSuccess bool + err := db.QueryRow(ctx, `SELECT tx_receipt, tx_success FROM message_waits_eth + WHERE signed_tx_hash = $1 + AND tx_success IS NOT NULL + AND tx_receipt IS NOT NULL`, dsc.CreateMessageHash).Scan(&txReceiptJSON, &txSuccess) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + log.Debugf("tx hash %s is either missing from watch table or is not yet processed by watcher", dsc.CreateMessageHash) + return nil + } + return xerrors.Errorf("failed to get tx_receipt for tx %s: %w", dsc.CreateMessageHash, err) + } + + // Unmarshal the tx_receipt JSON into types.Receipt + var txReceipt types.Receipt + err = json.Unmarshal(txReceiptJSON, &txReceipt) + if err != nil { + return xerrors.Errorf("failed to unmarshal tx_receipt for tx %s: %w", dsc.CreateMessageHash, err) + } + + // Exit early if transaction executed with failure + if !txSuccess { + // This means msg failed, we should let the user know + // TODO: Review if error would be in receipt + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set( + jsonb_set(pdp_v1, '{error}', to_jsonb($1::text), true), + '{complete}', to_jsonb(true), true + ) + WHERE id = $2;`, "Transaction failed", dsc.ID) + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + _, err = tx.Exec(`DELETE FROM pdp_data_set_create WHERE id = $1`, dsc.ID) + if err != nil { + return false, xerrors.Errorf("failed to delete pdp_data_set_create: %w", err) + } + return true, nil + }) + if err != nil { + return xerrors.Errorf("failed to commit transaction: %w", err) + } + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + return nil + } + + // Parse the logs to extract the dataSetId + dataSetId, err := extractDataSetIdFromReceipt(&txReceipt) + if err != nil { + return xerrors.Errorf("failed to extract dataSetId from receipt for tx %s: %w", dsc.CreateMessageHash, err) + } + + // Get the listener address for this data set from the PDPVerifier contract + pdpVerifier, err := contract.NewPDPVerifier(contract.ContractAddresses().PDPVerifier, ethClient) + if err != nil { + return xerrors.Errorf("failed to instantiate PDPVerifier contract: %w", err) + } + + listenerAddr, err := pdpVerifier.GetDataSetListener(nil, big.NewInt(int64(dataSetId))) + if err != nil { + return xerrors.Errorf("failed to get listener address for data set %d: %w", dataSetId, err) + } + + // Get the proving period from the listener + // Assumption: listener is a PDP Service with proving window informational methods + provingPeriod, challengeWindow, err := getProvingPeriodChallengeWindow(ctx, ethClient, listenerAddr) + if err != nil { + return xerrors.Errorf("failed to get max proving period: %w", err) + } + + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`INSERT INTO pdp_data_set (id, client, proving_period, challenge_window, create_deal_id, create_message_hash) + VALUES ($1, $2, $3, $4, $5, $6)`, dataSetId, dsc.Client, provingPeriod, challengeWindow, dsc.ID, dsc.CreateMessageHash) + if err != nil { + return false, xerrors.Errorf("failed to insert pdp_data_set_create: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be inserted, got %d", n) + } + + n, err = tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set(pdp_v1, '{complete}', 'true'::jsonb, true) + WHERE id = $1;`, dsc.ID) + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + + _, err = tx.Exec(`DELETE FROM pdp_data_set_create WHERE id = $1`, dsc.ID) + if err != nil { + return false, xerrors.Errorf("failed to delete pdp_data_set_create: %w", err) + } + return true, nil + }) + if err != nil { + return xerrors.Errorf("failed to commit transaction: %w", err) + } + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + + return nil +} + +func extractDataSetIdFromReceipt(receipt *types.Receipt) (uint64, error) { + pdpABI, err := contract.PDPVerifierMetaData.GetAbi() + if err != nil { + return 0, xerrors.Errorf("failed to get PDP ABI: %w", err) + } + + event, exists := pdpABI.Events["DataSetCreated"] + if !exists { + return 0, xerrors.Errorf("DataSetCreated event not found in ABI") + } + + for _, vLog := range receipt.Logs { + if len(vLog.Topics) > 0 && vLog.Topics[0] == event.ID { + if len(vLog.Topics) < 2 { + return 0, xerrors.Errorf("log does not contain setId topic") + } + + setIdBigInt := new(big.Int).SetBytes(vLog.Topics[1].Bytes()) + return setIdBigInt.Uint64(), nil + } + } + + return 0, xerrors.Errorf("DataSetCreated event not found in receipt") +} + +func getProvingPeriodChallengeWindow(ctx context.Context, ethClient *ethclient.Client, listenerAddr common.Address) (uint64, uint64, error) { + // Get the proving schedule from the listener (handles view contract indirection) + schedule, err := contract.GetProvingScheduleFromListener(listenerAddr, ethClient) + if err != nil { + return 0, 0, xerrors.Errorf("failed to get proving schedule from listener: %w", err) + } + + config, err := schedule.GetPDPConfig(&bind.CallOpts{Context: ctx}) + if err != nil { + return 0, 0, xerrors.Errorf("failed to get pdp config: %w", err) + } + + return config.MaxProvingPeriod, config.ChallengeWindow.Uint64(), nil +} diff --git a/tasks/pdp/data_set_delete_watch.go b/tasks/pdp/data_set_delete_watch.go new file mode 100644 index 000000000..83d6a90f6 --- /dev/null +++ b/tasks/pdp/data_set_delete_watch.go @@ -0,0 +1,177 @@ +package pdp + +import ( + "context" + "encoding/json" + "errors" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/chainsched" + + chainTypes "github.com/filecoin-project/lotus/chain/types" +) + +type DataSetDelete struct { + DeleteMessageHash string `db:"tx_hash"` + ID string `db:"id"` + PID int64 `db:"set_id"` +} + +func NewWatcherDelete(db *harmonydb.DB, pcs *chainsched.CurioChainSched) { + if err := pcs.AddHandler(func(ctx context.Context, revert, apply *chainTypes.TipSet) error { + err := processPendingDataSetDeletes(ctx, db) + if err != nil { + log.Errorf("Failed to process pending data set creates: %s", err) + } + return nil + }); err != nil { + panic(err) + } +} + +func processPendingDataSetDeletes(ctx context.Context, db *harmonydb.DB) error { + // Query for pdp_data_set_delete where txHash is not NULL + var dataSetDeletes []DataSetDelete + + err := db.Select(ctx, &dataSetDeletes, ` + SELECT id, set_id, tx_hash + FROM pdp_data_set_delete + WHERE tx_hash IS NOT NULL`) + if err != nil { + return xerrors.Errorf("failed to select data set deletes: %w", err) + } + + if len(dataSetDeletes) == 0 { + // No pending data set creates + return nil + } + + // Process each data set delete + for _, psd := range dataSetDeletes { + err := processDataSetDelete(ctx, db, psd) + if err != nil { + log.Errorf("Failed to process data set delete for tx %s: %s", psd.DeleteMessageHash, err) + continue + } + } + + return nil +} + +func processDataSetDelete(ctx context.Context, db *harmonydb.DB, psd DataSetDelete) error { + // Retrieve the tx_receipt from message_waits_eth + var txReceiptJSON []byte + var txSuccess bool + err := db.QueryRow(ctx, `SELECT tx_receipt, tx_success FROM message_waits_eth WHERE signed_tx_hash = $1 + AND tx_success IS NOT NULL + AND tx_receipt IS NOT NULL`, psd.DeleteMessageHash).Scan(&txReceiptJSON, &txSuccess) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + log.Debugf("tx hash %s is either missing from watch table or is not yet processed by watcher", psd.DeleteMessageHash) + return nil + } + return xerrors.Errorf("failed to get tx_receipt for tx %s: %w", psd.DeleteMessageHash, err) + } + + // Unmarshal the tx_receipt JSON into types.Receipt + var txReceipt types.Receipt + err = json.Unmarshal(txReceiptJSON, &txReceipt) + if err != nil { + return xerrors.Errorf("failed to unmarshal tx_receipt for tx %s: %w", psd.DeleteMessageHash, err) + } + + // Exit early if transaction executed with failure + if !txSuccess { + // This means msg failed, we should let the user know + // TODO: Review if error would be in receipt + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set( + jsonb_set(pdp_v1, '{error}', to_jsonb($1::text), true), + '{complete}', to_jsonb(true), true + ) + WHERE id = $2;`, "Transaction failed", psd.ID) + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + _, err = tx.Exec(`DELETE FROM pdp_data_set_delete WHERE id = $1`, psd.ID) + if err != nil { + return false, xerrors.Errorf("failed to delete row from pdp_data_set_delete: %w", err) + } + return true, nil + }) + if err != nil { + return xerrors.Errorf("failed to commit transaction: %w", err) + } + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + return nil + } + + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + + n, err := tx.Exec(`UPDATE pdp_data_set SET removed = TRUE, + remove_deal_id = $1, + remove_message_hash = $2 + WHERE id = $3`, psd.ID, psd.DeleteMessageHash, psd.PID) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_data_set: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + + _, err = tx.Exec(`DELETE FROM pdp_data_set_delete WHERE id = $1`, psd.ID) + if err != nil { + return false, xerrors.Errorf("failed to delete row from pdp_data_set_delete: %w", err) + } + + n, err = tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set(pdp_v1, '{complete}', 'true'::jsonb, true) + WHERE id = $1;`, psd.ID) + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + + // Start piece cleanup tasks + _, err = tx.Exec(`INSERT INTO piece_cleanup (id, piece_cid_v2, pdp, sp_id, sector_number, piece_ref) + SELECT p.add_deal_id, p.piece_cid_v2, TRUE, -1, -1, p.piece_ref + FROM pdp_dataset_piece AS p + WHERE p.data_set_id = $1 + AND p.removed = FALSE + ON CONFLICT (id, pdp) DO NOTHING;`, psd.PID) + if err != nil { + return false, xerrors.Errorf("failed to insert into piece_cleanup: %w", err) + } + + _, err = tx.Exec(`UPDATE pdp_dataset_piece SET removed = TRUE, + remove_deal_id = $1, + remove_message_hash = $2 + WHERE data_set_id = $3`, psd.ID, psd.DeleteMessageHash, psd.PID) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_dataset_piece: %w", err) + } + + return true, nil + }) + + if err != nil { + return xerrors.Errorf("failed to commit transaction: %w", err) + } + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + + return nil +} diff --git a/tasks/pdp/dataset_add_piece_watch.go b/tasks/pdp/dataset_add_piece_watch.go new file mode 100644 index 000000000..8b625488b --- /dev/null +++ b/tasks/pdp/dataset_add_piece_watch.go @@ -0,0 +1,262 @@ +package pdp + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ipfs/go-cid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/chainsched" + "github.com/filecoin-project/curio/pdp/contract" + + chainTypes "github.com/filecoin-project/lotus/chain/types" +) + +// Structures to represent database records +type DataSetPieceAdd struct { + ID string `db:"id"` + Client string `db:"client"` + PieceCID2 string `db:"piece_cid_v2"` // pieceCIDV2 + DataSet uint64 `db:"data_set_id"` + PieceRef int64 `db:"piece_ref"` + AddMessageHash string `db:"add_message_hash"` + AddMessageIndex int64 `db:"add_message_index"` +} + +// NewWatcherPieceAdd sets up the watcher for data set piece additions +func NewWatcherPieceAdd(db *harmonydb.DB, pcs *chainsched.CurioChainSched, ethClient *ethclient.Client) { + if err := pcs.AddHandler(func(ctx context.Context, revert, apply *chainTypes.TipSet) error { + err := processPendingDataSetPieceAdds(ctx, db, ethClient) + if err != nil { + log.Errorf("Failed to process pending data set piece adds: %s", err) + } + + return nil + }); err != nil { + panic(err) + } +} + +// processPendingDataSetPieceAdds processes piece additions that have been confirmed on-chain +func processPendingDataSetPieceAdds(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client) error { + // Query for pdp_dataset_piece_adds entries where add_message_ok = TRUE + var pieceAdds []DataSetPieceAdd + + err := db.Select(ctx, &pieceAdds, ` + SELECT id, client, piece_cid_v2, data_set_id, piece_ref, add_message_hash, add_message_index + FROM pdp_pipeline + WHERE after_add_piece = TRUE AND after_add_piece_msg = FALSE + `) + if err != nil { + return xerrors.Errorf("failed to select data set piece adds: %w", err) + } + + if len(pieceAdds) == 0 { + // No pending root adds + return nil + } + + // Process each piece addition + for _, pieceAdd := range pieceAdds { + err := processDataSetPieceAdd(ctx, db, pieceAdd, ethClient) + if err != nil { + log.Errorf("Failed to process piece add for tx %s: %s", pieceAdd.AddMessageHash, err) + continue + } + } + + return nil +} + +func processDataSetPieceAdd(ctx context.Context, db *harmonydb.DB, pieceAdd DataSetPieceAdd, ethClient *ethclient.Client) error { + // Retrieve the tx_receipt from message_waits_eth + var txReceiptJSON []byte + var txSuccess bool + err := db.QueryRow(ctx, `SELECT tx_success, tx_receipt FROM message_waits_eth WHERE signed_tx_hash = $1 + AND tx_success IS NOT NULL + AND tx_receipt IS NOT NULL`, pieceAdd.AddMessageHash).Scan(&txSuccess, &txReceiptJSON) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + log.Debugf("tx hash %s is either missing from watch table or is not yet processed by watcher", pieceAdd.AddMessageHash) + return nil + } + return xerrors.Errorf("failed to get tx_receipt for tx %s: %w", pieceAdd.AddMessageHash, err) + } + + // Unmarshal the tx_receipt JSON into types.Receipt + var txReceipt types.Receipt + err = json.Unmarshal(txReceiptJSON, &txReceipt) + if err != nil { + return xerrors.Errorf("failed to unmarshal tx_receipt for tx %s: %w", pieceAdd.AddMessageHash, err) + } + + if !txSuccess { + // This means msg failed, we should let the user know + // TODO: Review if error would be in receipt + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set( + jsonb_set(pdp_v1, '{error}', to_jsonb($1::text), true), + '{complete}', to_jsonb(true), true + ) + WHERE id = $2;`, "Transaction failed", pieceAdd.ID) + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + _, err = tx.Exec(`DELETE FROM pdp_pipeline WHERE id = $1`, pieceAdd.ID) + if err != nil { + return false, xerrors.Errorf("failed to clean up pdp pipeline: %w", err) + } + return true, nil + }) + if err != nil { + return xerrors.Errorf("failed to commit transaction: %w", err) + } + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + return nil + } + + // Get the ABI from the contract metadata + pdpABI, err := contract.PDPVerifierMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get PDP ABI: %w", err) + } + + // Get the event definition + event, exists := pdpABI.Events["PiecesAdded"] + if !exists { + return fmt.Errorf("PiecesAdded event not found in ABI") + } + + var pieceIds []uint64 + var pieceCids [][]byte + eventFound := false + + pcid2, err := cid.Parse(pieceAdd.PieceCID2) + if err != nil { + return fmt.Errorf("failed to parse piece CID: %w", err) + } + + parser, err := contract.NewPDPVerifierFilterer(contract.ContractAddresses().PDPVerifier, ethClient) + if err != nil { + return fmt.Errorf("failed to create PDPVerifierFilterer: %w", err) + } + + // Iterate over the logs in the receipt + for _, vLog := range txReceipt.Logs { + // Check if the log corresponds to the PiecesAdded event + if len(vLog.Topics) > 0 && vLog.Topics[0] == event.ID { + // The setId is an indexed parameter in Topics[1], but we don't need it here + // as we already have the dataset ID from the database + + parsed, err := parser.ParsePiecesAdded(*vLog) + if err != nil { + return fmt.Errorf("failed to parse event log: %w", err) + } + + pieceIds = make([]uint64, len(parsed.PieceIds)) + for i := range parsed.PieceIds { + pieceIds[i] = parsed.PieceIds[i].Uint64() + } + + pieceCids = make([][]byte, len(parsed.PieceCids)) + for i := range parsed.PieceCids { + pieceCids[i] = parsed.PieceCids[i].Data + } + + eventFound = true + // We found the event, so we can break the loop + break + } + } + + if !eventFound { + return fmt.Errorf("PiecesAdded event not found in receipt") + } + + pieceId := pieceIds[pieceAdd.AddMessageIndex] + pieceCid := pieceCids[pieceAdd.AddMessageIndex] + + apcid2, err := cid.Cast(pieceCid) + if err != nil { + return fmt.Errorf("failed to cast piece CID: %w", err) + } + + if !apcid2.Equals(pcid2) { + return fmt.Errorf("piece CID in event log does not match piece CID in message") + } + + // Insert into message_waits_eth and pdp_dataset_pieces + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { + // Update data set for initialization upon first add + _, err = tx.Exec(` + UPDATE pdp_data_set SET init_ready = true + WHERE id = $1 AND prev_challenge_request_epoch IS NULL AND challenge_request_msg_hash IS NULL AND prove_at_epoch IS NULL + `, pieceAdd.DataSet) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_data_set: %w", err) + } + + // Insert into pdp_dataset_piece + n, err := tx.Exec(` + INSERT INTO pdp_dataset_piece ( + data_set_id, + client, + piece_cid_v2, + piece, + piece_ref, + add_deal_id, + add_message_hash, + add_message_index + ) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8) + `, + pieceAdd.DataSet, + pieceAdd.Client, + pieceAdd.PieceCID2, + pieceId, + pieceAdd.PieceRef, + pieceAdd.ID, + pieceAdd.AddMessageHash, + pieceAdd.AddMessageIndex, + ) + if err != nil { + return false, xerrors.Errorf("failed to insert into pdp_dataset_piece: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("incorrect number of rows inserted for pdp_dataset_piece: %d", n) + } + + n, err = tx.Exec(`UPDATE pdp_pipeline SET after_add_piece_msg = TRUE WHERE id = $1`, pieceAdd.ID) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("incorrect number of rows updated for pdp_pipeline: %d", n) + } + + // Return true to commit the transaction + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return xerrors.Errorf("failed to save details to DB: %w", err) + } + + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + + return nil +} diff --git a/tasks/pdp/dataset_delete_root_watch.go b/tasks/pdp/dataset_delete_root_watch.go new file mode 100644 index 000000000..94a917154 --- /dev/null +++ b/tasks/pdp/dataset_delete_root_watch.go @@ -0,0 +1,152 @@ +package pdp + +import ( + "context" + "encoding/json" + "errors" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/chainsched" + + chainTypes "github.com/filecoin-project/lotus/chain/types" +) + +type DataSetPieceDelete struct { + ID string `db:"id"` + DataSet uint64 `db:"set_id"` + Pieces []int64 `db:"pieces"` + Hash string `db:"tx_hash"` +} + +func NewWatcherPieceDelete(db *harmonydb.DB, pcs *chainsched.CurioChainSched) { + if err := pcs.AddHandler(func(ctx context.Context, revert, apply *chainTypes.TipSet) error { + err := processPendingDataSetPieceDeletes(ctx, db) + if err != nil { + log.Errorf("Failed to process pending data set creates: %s", err) + } + return nil + }); err != nil { + panic(err) + } +} + +func processPendingDataSetPieceDeletes(ctx context.Context, db *harmonydb.DB) error { + var dataSetPieceDeletes []DataSetPieceDelete + err := db.Select(ctx, &dataSetPieceDeletes, ` + SELECT id, tx_hash, pieces, set_id FROM pdp_piece_delete WHERE tx_hash IS NOT NULL`) + if err != nil { + return xerrors.Errorf("failed to select data set piece deletes: %w", err) + } + + if len(dataSetPieceDeletes) == 0 { + return nil + } + + for _, psd := range dataSetPieceDeletes { + err := processDataSetPieceDelete(ctx, db, psd) + if err != nil { + log.Errorf("Failed to process data set piece delete for tx %s: %s", psd.Hash, err) + continue + } + } + + return nil +} + +func processDataSetPieceDelete(ctx context.Context, db *harmonydb.DB, psd DataSetPieceDelete) error { + var txReceiptJSON []byte + var txSuccess bool + err := db.QueryRow(ctx, `SELECT tx_receipt, tx_success FROM message_waits_eth WHERE signed_tx_hash = $1 + AND tx_success IS NOT NULL + AND tx_receipt IS NOT NULL`, psd.Hash).Scan(&txReceiptJSON, &txSuccess) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + log.Debugf("tx hash %s is either missing from watch table or is not yet processed by watcher", psd.Hash) + return nil + } + return xerrors.Errorf("failed to get tx_receipt for tx %s: %w", psd.Hash, err) + } + + var txReceipt types.Receipt + err = json.Unmarshal(txReceiptJSON, &txReceipt) + if err != nil { + return xerrors.Errorf("failed to unmarshal tx_receipt for tx %s: %w", psd.Hash, err) + } + + if !txSuccess { + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set( + jsonb_set(pdp_v1, '{error}', to_jsonb($1::text), true), + '{complete}', to_jsonb(true), true + ) + WHERE id = $2;`, "Transaction failed", psd.ID) + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + _, err = tx.Exec(`DELETE FROM pdp_piece_delete WHERE id = $1`, psd.ID) + if err != nil { + return false, xerrors.Errorf("failed to delete row from pdp_piece_delete: %w", err) + } + return true, nil + }) + if err != nil { + return xerrors.Errorf("failed to commit transaction: %w", err) + } + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + return nil + } + + comm, err := db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE pdp_dataset_piece SET removed = TRUE, + remove_deal_id = $1, + remove_message_hash = $2 + WHERE data_set_id = $3 AND piece = ANY($4)`, psd.ID, psd.Hash, psd.DataSet, psd.Pieces) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_dataset_piece: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + n, err = tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set(pdp_v1, '{complete}', 'true'::jsonb, true) + WHERE id = $1;`, psd.ID) + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + _, err = tx.Exec(`DELETE FROM pdp_piece_delete WHERE id = $1`, psd.ID) + if err != nil { + return false, xerrors.Errorf("failed to delete row from pdp_piece_delete: %w", err) + } + _, err = tx.Exec(`INSERT INTO piece_cleanup (id, piece_cid_v2, pdp, sp_id, sector_number, piece_ref) + SELECT p.add_deal_id, p.piece_cid_v2, TRUE, -1, -1, p.piece_ref + FROM pdp_dataset_piece AS p + WHERE p.data_set_id = $1 + AND p.piece = ANY($2) + ON CONFLICT (id, pdp) DO NOTHING;`, psd.DataSet, psd.Pieces) + if err != nil { + return false, xerrors.Errorf("failed to insert into piece_cleanup: %w", err) + } + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return xerrors.Errorf("failed to commit transaction: %w", err) + } + if !comm { + return xerrors.Errorf("failed to commit transaction") + } + return nil +} diff --git a/tasks/pdp/proofset_addroot_watch.go b/tasks/pdp/proofset_addroot_watch.go deleted file mode 100644 index db042dd5f..000000000 --- a/tasks/pdp/proofset_addroot_watch.go +++ /dev/null @@ -1,234 +0,0 @@ -package pdp - -import ( - "context" - "encoding/json" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" - "golang.org/x/xerrors" - - "github.com/filecoin-project/curio/harmony/harmonydb" - "github.com/filecoin-project/curio/lib/chainsched" - "github.com/filecoin-project/curio/pdp/contract" - - chainTypes "github.com/filecoin-project/lotus/chain/types" -) - -// Structures to represent database records -type ProofSetRootAdd struct { - ProofSet uint64 `db:"proofset"` - AddMessageHash string `db:"add_message_hash"` -} - -// RootAddEntry represents entries from pdp_proofset_root_adds -type RootAddEntry struct { - ProofSet uint64 `db:"proofset"` - Root string `db:"root"` - AddMessageHash string `db:"add_message_hash"` - AddMessageIndex uint64 `db:"add_message_index"` - Subroot string `db:"subroot"` - SubrootOffset int64 `db:"subroot_offset"` - SubrootSize int64 `db:"subroot_size"` - PDPPieceRefID int64 `db:"pdp_pieceref"` - AddMessageOK *bool `db:"add_message_ok"` - PDPProofSetID uint64 `db:"proofset"` -} - -// NewWatcherRootAdd sets up the watcher for proof set root additions -func NewWatcherRootAdd(db *harmonydb.DB, ethClient *ethclient.Client, pcs *chainsched.CurioChainSched) { - if err := pcs.AddHandler(func(ctx context.Context, revert, apply *chainTypes.TipSet) error { - err := processPendingProofSetRootAdds(ctx, db, ethClient) - if err != nil { - log.Warnf("Failed to process pending proof set root adds: %v", err) - } - - return nil - }); err != nil { - panic(err) - } -} - -// processPendingProofSetRootAdds processes root additions that have been confirmed on-chain -func processPendingProofSetRootAdds(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client) error { - // Query for pdp_proofset_root_adds entries where add_message_ok = TRUE - var rootAdds []ProofSetRootAdd - - err := db.Select(ctx, &rootAdds, ` - SELECT DISTINCT proofset, add_message_hash - FROM pdp_proofset_root_adds - WHERE add_message_ok = TRUE AND roots_added = FALSE - `) - if err != nil { - return xerrors.Errorf("failed to select proof set root adds: %w", err) - } - - if len(rootAdds) == 0 { - // No pending root adds - return nil - } - - // Process each root addition - for _, rootAdd := range rootAdds { - err := processProofSetRootAdd(ctx, db, ethClient, rootAdd) - if err != nil { - log.Warnf("Failed to process root add for tx %s: %v", rootAdd.AddMessageHash, err) - continue - } - } - - return nil -} - -func processProofSetRootAdd(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client, rootAdd ProofSetRootAdd) error { - // Retrieve the tx_receipt from message_waits_eth - var txReceiptJSON []byte - err := db.QueryRow(ctx, ` - SELECT tx_receipt - FROM message_waits_eth - WHERE signed_tx_hash = $1 - `, rootAdd.AddMessageHash).Scan(&txReceiptJSON) - if err != nil { - return xerrors.Errorf("failed to get tx_receipt for tx %s: %w", rootAdd.AddMessageHash, err) - } - - // Unmarshal the tx_receipt JSON into types.Receipt - var txReceipt types.Receipt - err = json.Unmarshal(txReceiptJSON, &txReceipt) - if err != nil { - return xerrors.Errorf("failed to unmarshal tx_receipt for tx %s: %w", rootAdd.AddMessageHash, err) - } - - // Parse the logs to extract root IDs and other data - err = extractAndInsertRootsFromReceipt(ctx, db, &txReceipt, rootAdd) - if err != nil { - return xerrors.Errorf("failed to extract roots from receipt for tx %s: %w", rootAdd.AddMessageHash, err) - } - - return nil -} - -func extractAndInsertRootsFromReceipt(ctx context.Context, db *harmonydb.DB, receipt *types.Receipt, rootAdd ProofSetRootAdd) error { - // Get the ABI from the contract metadata - pdpABI, err := contract.PDPVerifierMetaData.GetAbi() - if err != nil { - return fmt.Errorf("failed to get PDP ABI: %w", err) - } - - // Get the event definition - event, exists := pdpABI.Events["RootsAdded"] - if !exists { - return fmt.Errorf("RootsAdded event not found in ABI") - } - - var rootIds []uint64 - eventFound := false - - // Iterate over the logs in the receipt - for _, vLog := range receipt.Logs { - // Check if the log corresponds to the RootsAdded event - if len(vLog.Topics) > 0 && vLog.Topics[0] == event.ID { - // The setId is an indexed parameter in Topics[1], but we don't need it here - // as we already have the proofset ID from the database - - // Parse the non-indexed parameter (rootIds array) from the data - unpacked, err := event.Inputs.Unpack(vLog.Data) - if err != nil { - return fmt.Errorf("failed to unpack log data: %w", err) - } - - // Extract the rootIds array - if len(unpacked) == 0 { - return fmt.Errorf("no unpacked data found in log") - } - - // Convert the unpacked rootIds ([]interface{} containing *big.Int) to []uint64 - bigIntRootIds, ok := unpacked[0].([]*big.Int) - if !ok { - return fmt.Errorf("failed to convert unpacked data to array") - } - - rootIds = make([]uint64, len(bigIntRootIds)) - for i := range bigIntRootIds { - rootIds[i] = bigIntRootIds[i].Uint64() - } - - eventFound = true - // We found the event, so we can break the loop - break - } - } - - if !eventFound { - return fmt.Errorf("RootsAdded event not found in receipt") - } - - // Now we have the firstAdded rootId, proceed with database operations - - // Begin a database transaction - _, err = db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { - // Fetch the entries from pdp_proofset_root_adds - var rootAddEntries []RootAddEntry - err := tx.Select(&rootAddEntries, ` - SELECT proofset, root, add_message_hash, add_message_index, subroot, subroot_offset, subroot_size, pdp_pieceref - FROM pdp_proofset_root_adds - WHERE proofset = $1 AND add_message_hash = $2 - ORDER BY add_message_index ASC, subroot_offset ASC - `, rootAdd.ProofSet, rootAdd.AddMessageHash) - if err != nil { - return false, fmt.Errorf("failed to select from pdp_proofset_root_adds: %w", err) - } - - // For each entry, use the corresponding rootId from the event - for _, entry := range rootAddEntries { - if entry.AddMessageIndex >= uint64(len(rootIds)) { - return false, fmt.Errorf("index out of bounds: entry index %d exceeds rootIds length %d", - entry.AddMessageIndex, len(rootIds)) - } - - rootId := rootIds[entry.AddMessageIndex] - // Insert into pdp_proofset_roots - _, err := tx.Exec(` - INSERT INTO pdp_proofset_roots ( - proofset, - root, - root_id, - subroot, - subroot_offset, - subroot_size, - pdp_pieceref, - add_message_hash, - add_message_index - ) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9 - ) - `, entry.ProofSet, entry.Root, rootId, entry.Subroot, entry.SubrootOffset, entry.SubrootSize, entry.PDPPieceRefID, entry.AddMessageHash, entry.AddMessageIndex) - if err != nil { - return false, fmt.Errorf("failed to insert into pdp_proofset_roots: %w", err) - } - } - - // Mark as processed in pdp_proofset_root_adds (don't delete, for transaction tracking) - rowsAffected, err := tx.Exec(` - UPDATE pdp_proofset_root_adds - SET roots_added = TRUE - WHERE proofset = $1 AND add_message_hash = $2 AND roots_added = FALSE - `, rootAdd.ProofSet, rootAdd.AddMessageHash) - if err != nil { - return false, fmt.Errorf("failed to update pdp_proofset_root_adds: %w", err) - } - - if int(rowsAffected) != len(rootAddEntries) { - return false, fmt.Errorf("expected to update %d rows in pdp_proofset_root_adds but updated %d", len(rootAddEntries), rowsAffected) - } - - return true, nil - }) - if err != nil { - return fmt.Errorf("failed to process root additions in DB: %w", err) - } - - return nil -} diff --git a/tasks/pdp/proofset_create_watch.go b/tasks/pdp/proofset_create_watch.go deleted file mode 100644 index 2ed78883d..000000000 --- a/tasks/pdp/proofset_create_watch.go +++ /dev/null @@ -1,194 +0,0 @@ -package pdp - -import ( - "context" - "encoding/json" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" - "golang.org/x/xerrors" - - "github.com/filecoin-project/curio/harmony/harmonydb" - "github.com/filecoin-project/curio/lib/chainsched" - "github.com/filecoin-project/curio/pdp/contract" - - chainTypes "github.com/filecoin-project/lotus/chain/types" -) - -type ProofSetCreate struct { - CreateMessageHash string `db:"create_message_hash"` - Service string `db:"service"` -} - -func NewWatcherCreate(db *harmonydb.DB, ethClient *ethclient.Client, pcs *chainsched.CurioChainSched) { - if err := pcs.AddHandler(func(ctx context.Context, revert, apply *chainTypes.TipSet) error { - err := processPendingProofSetCreates(ctx, db, ethClient) - if err != nil { - log.Warnf("Failed to process pending proof set creates: %v", err) - } - return nil - }); err != nil { - panic(err) - } -} - -func processPendingProofSetCreates(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client) error { - // Query for pdp_proofset_creates entries where ok = TRUE and proofset_created = FALSE - var proofSetCreates []ProofSetCreate - - err := db.Select(ctx, &proofSetCreates, ` - SELECT create_message_hash, service - FROM pdp_proofset_creates - WHERE ok = TRUE AND proofset_created = FALSE - `) - if err != nil { - return xerrors.Errorf("failed to select proof set creates: %w", err) - } - - log.Infow("ProofSetCreate watcher checking pending proof sets", "count", len(proofSetCreates)) - - if len(proofSetCreates) == 0 { - // No pending proof set creates - return nil - } - - // Process each proof set create - for _, psc := range proofSetCreates { - log.Infow("Processing proof set create", - "txHash", psc.CreateMessageHash, - "service", psc.Service) - err := processProofSetCreate(ctx, db, psc, ethClient) - if err != nil { - log.Warnf("Failed to process proof set create for tx %s: %v", psc.CreateMessageHash, err) - continue - } - log.Infow("Successfully processed proof set create", "txHash", psc.CreateMessageHash) - } - - return nil -} - -func processProofSetCreate(ctx context.Context, db *harmonydb.DB, psc ProofSetCreate, ethClient *ethclient.Client) error { - // Retrieve the tx_receipt from message_waits_eth - var txReceiptJSON []byte - log.Debugw("Fetching tx_receipt from message_waits_eth", "txHash", psc.CreateMessageHash) - err := db.QueryRow(ctx, ` - SELECT tx_receipt - FROM message_waits_eth - WHERE signed_tx_hash = $1 - `, psc.CreateMessageHash).Scan(&txReceiptJSON) - if err != nil { - return xerrors.Errorf("failed to get tx_receipt for tx %s: %w", psc.CreateMessageHash, err) - } - log.Debugw("Retrieved tx_receipt", "txHash", psc.CreateMessageHash, "receiptLength", len(txReceiptJSON)) - - // Unmarshal the tx_receipt JSON into types.Receipt - var txReceipt types.Receipt - err = json.Unmarshal(txReceiptJSON, &txReceipt) - if err != nil { - return xerrors.Errorf("failed to unmarshal tx_receipt for tx %s: %w", psc.CreateMessageHash, err) - } - log.Debugw("Unmarshalled receipt", "txHash", psc.CreateMessageHash, "status", txReceipt.Status, "logs", len(txReceipt.Logs)) - - // Parse the logs to extract the proofSetId - proofSetId, err := extractProofSetIdFromReceipt(&txReceipt) - if err != nil { - return xerrors.Errorf("failed to extract proofSetId from receipt for tx %s: %w", psc.CreateMessageHash, err) - } - log.Infow("Extracted proofSetId from receipt", "txHash", psc.CreateMessageHash, "proofSetId", proofSetId) - - // Get the listener address for this proof set from the PDPVerifier contract - pdpVerifier, err := contract.NewPDPVerifier(contract.ContractAddresses().PDPVerifier, ethClient) - if err != nil { - return xerrors.Errorf("failed to instantiate PDPVerifier contract: %w", err) - } - - listenerAddr, err := pdpVerifier.GetProofSetListener(nil, big.NewInt(int64(proofSetId))) - if err != nil { - return xerrors.Errorf("failed to get listener address for proof set %d: %w", proofSetId, err) - } - - // Get the proving period from the listener - // Assumption: listener is a PDP Service with proving window informational methods - provingPeriod, challengeWindow, err := getProvingPeriodChallengeWindow(ctx, ethClient, listenerAddr) - if err != nil { - return xerrors.Errorf("failed to get max proving period: %w", err) - } - - // Insert a new entry into pdp_proof_sets - err = insertProofSet(ctx, db, psc.CreateMessageHash, proofSetId, psc.Service, provingPeriod, challengeWindow) - if err != nil { - return xerrors.Errorf("failed to insert proof set %d for tx %+v: %w", proofSetId, psc, err) - } - - // Update pdp_proofset_creates to set proofset_created = TRUE - _, err = db.Exec(ctx, ` - UPDATE pdp_proofset_creates - SET proofset_created = TRUE - WHERE create_message_hash = $1 - `, psc.CreateMessageHash) - if err != nil { - return xerrors.Errorf("failed to update proofset_creates for tx %s: %w", psc.CreateMessageHash, err) - } - - return nil -} - -func extractProofSetIdFromReceipt(receipt *types.Receipt) (uint64, error) { - pdpABI, err := contract.PDPVerifierMetaData.GetAbi() - if err != nil { - return 0, xerrors.Errorf("failed to get PDP ABI: %w", err) - } - - event, exists := pdpABI.Events["ProofSetCreated"] - if !exists { - return 0, xerrors.Errorf("ProofSetCreated event not found in ABI") - } - - for _, vLog := range receipt.Logs { - if len(vLog.Topics) > 0 && vLog.Topics[0] == event.ID { - if len(vLog.Topics) < 2 { - return 0, xerrors.Errorf("log does not contain setId topic") - } - - setIdBigInt := new(big.Int).SetBytes(vLog.Topics[1].Bytes()) - return setIdBigInt.Uint64(), nil - } - } - - return 0, xerrors.Errorf("ProofSetCreated event not found in receipt") -} - -func insertProofSet(ctx context.Context, db *harmonydb.DB, createMsg string, proofSetId uint64, service string, provingPeriod uint64, challengeWindow uint64) error { - // Implement the insertion into pdp_proof_sets table - // Adjust the SQL statement based on your table schema - _, err := db.Exec(ctx, ` - INSERT INTO pdp_proof_sets (id, create_message_hash, service, proving_period, challenge_window) - VALUES ($1, $2, $3, $4, $5) - `, proofSetId, createMsg, service, provingPeriod, challengeWindow) - return err -} - -func getProvingPeriodChallengeWindow(ctx context.Context, ethClient *ethclient.Client, listenerAddr common.Address) (uint64, uint64, error) { - // ProvingPeriod - schedule, err := contract.NewIPDPProvingSchedule(listenerAddr, ethClient) - if err != nil { - return 0, 0, xerrors.Errorf("failed to create proving schedule binding, check that listener has proving schedule methods: %w", err) - } - - period, err := schedule.GetMaxProvingPeriod(&bind.CallOpts{Context: ctx}) - if err != nil { - return 0, 0, xerrors.Errorf("failed to get proving period: %w", err) - } - - // ChallengeWindow - challengeWindow, err := schedule.ChallengeWindow(&bind.CallOpts{Context: ctx}) - if err != nil { - return 0, 0, xerrors.Errorf("failed to get challenge window: %w", err) - } - - return period, challengeWindow.Uint64(), nil -} diff --git a/tasks/pdp/task_add_data_set.go b/tasks/pdp/task_add_data_set.go new file mode 100644 index 000000000..226841b08 --- /dev/null +++ b/tasks/pdp/task_add_data_set.go @@ -0,0 +1,201 @@ +package pdp + +import ( + "context" + "errors" + "strings" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/pdp/contract" + "github.com/filecoin-project/curio/tasks/message" +) + +type PDPTaskAddDataSet struct { + db *harmonydb.DB + sender *message.SenderETH + ethClient *ethclient.Client + filClient PDPServiceNodeApi +} + +func NewPDPTaskAddDataSet(db *harmonydb.DB, sender *message.SenderETH, ethClient *ethclient.Client, filClient PDPServiceNodeApi) *PDPTaskAddDataSet { + return &PDPTaskAddDataSet{ + db: db, + sender: sender, + ethClient: ethClient, + filClient: filClient, + } +} + +func (p *PDPTaskAddDataSet) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + var pcreates []struct { + RecordKeeper string `db:"record_keeper"` + ExtraData []byte `db:"extra_data"` + } + + err = p.db.Select(ctx, &pcreates, `SELECT record_keeper, extra_data FROM pdp_data_set_create WHERE task_id = $1 AND tx_hash IS NULL`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to get task details from DB: %w", err) + } + + if len(pcreates) != 1 { + return false, xerrors.Errorf("incorrect rows for dataset create found for taskID %d", taskID) + } + + pcreate := pcreates[0] + + recordKeeperAddr := common.HexToAddress(pcreate.RecordKeeper) + if recordKeeperAddr == (common.Address{}) { + return false, xerrors.Errorf("invalid record keeper address: %s", pcreate.RecordKeeper) + } + + extraDataBytes := []byte{} + + if pcreate.ExtraData != nil { + extraDataBytes = pcreate.ExtraData + } + + // Get the sender address from 'eth_keys' table where role = 'pdp' limit 1 + fromAddress, err := p.getSenderAddress(ctx) + if err != nil { + return false, xerrors.Errorf("failed to get sender address: %w", err) + } + + // Manually create the transaction without requiring a Signer + // Obtain the ABI of the PDPVerifier contract + abiData, err := contract.PDPVerifierMetaData.GetAbi() + if err != nil { + return false, xerrors.Errorf("getting PDPVerifier ABI: %w", err) + } + + // Pack the method call data + data, err := abiData.Pack("createDataSet", recordKeeperAddr, extraDataBytes) + if err != nil { + return false, xerrors.Errorf("packing data: %w", err) + } + + // Prepare the transaction (nonce will be set to 0, SenderETH will assign it) + tx := types.NewTransaction( + 0, + contract.ContractAddresses().PDPVerifier, + contract.SybilFee(), + 0, + nil, + data, + ) + + // Send the transaction using SenderETH + reason := "pdp-create-data-set" + txHash, err := p.sender.Send(ctx, fromAddress, tx, reason) + if err != nil { + return false, xerrors.Errorf("sending transaction: %w", err) + } + + // Insert into message_waits_eth and pdp_data_set_create + txHashLower := strings.ToLower(txHash.Hex()) + comm, err := p.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE pdp_data_set_create SET tx_hash = $1, task_id = NULL WHERE task_id = $2`, txHashLower, taskID) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_data_set_create: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("incorrect number of rows updated for pdp_data_set_create: %d", n) + } + _, err = tx.Exec(`INSERT INTO message_waits_eth (signed_tx_hash, tx_status) VALUES ($1, $2)`, txHashLower, "pending") + if err != nil { + return false, xerrors.Errorf("failed to insert into message_waits_eth: %w", err) + } + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return false, xerrors.Errorf("failed to commit transaction: %w", err) + } + + if !comm { + return false, xerrors.Errorf("failed to commit transaction") + } + + return true, nil +} + +func (p *PDPTaskAddDataSet) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + return &ids[0], nil +} + +func (p *PDPTaskAddDataSet) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "PDPAddDataSet", + Cost: resources.Resources{ + Cpu: 1, + Ram: 64 << 20, + }, + MaxFailures: 3, + IAmBored: passcall.Every(3*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return p.schedule(context.Background(), taskFunc) + }), + } +} + +func (p *PDPTaskAddDataSet) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var did string + err := tx.QueryRow(`SELECT id FROM pdp_data_set_create WHERE task_id IS NULL AND tx_hash IS NULL LIMIT 1`).Scan(&did) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, nil + } + return false, xerrors.Errorf("failed to query pdp_data_set_create: %w", err) + } + if did == "" { + return false, xerrors.Errorf("no valid id found for taskID") + } + + _, err = tx.Exec(`UPDATE pdp_data_set_create SET task_id = $1 WHERE id = $2 AND tx_hash IS NULL`, id, did) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_data_set_create: %w", err) + } + + stop = false // we found a task to schedule, keep going + return true, nil + }) + + } + + return nil +} + +// getSenderAddress retrieves the sender address from the database where role = 'pdp' limit 1 +func (p *PDPTaskAddDataSet) getSenderAddress(ctx context.Context) (common.Address, error) { + var addressStr string + err := p.db.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp' LIMIT 1`).Scan(&addressStr) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return common.Address{}, errors.New("no sender address with role 'pdp' found") + } + return common.Address{}, err + } + address := common.HexToAddress(addressStr) + return address, nil +} + +func (p *PDPTaskAddDataSet) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ harmonytask.TaskInterface = &PDPTaskAddDataSet{} +var _ = harmonytask.Reg(&PDPTaskAddDataSet{}) diff --git a/tasks/pdp/task_add_piece.go b/tasks/pdp/task_add_piece.go new file mode 100644 index 000000000..b22b4b153 --- /dev/null +++ b/tasks/pdp/task_add_piece.go @@ -0,0 +1,227 @@ +package pdp + +import ( + "context" + "errors" + "math/big" + "strings" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ipfs/go-cid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/pdp/contract" + "github.com/filecoin-project/curio/tasks/message" + + types2 "github.com/filecoin-project/lotus/chain/types" +) + +type PDPServiceNodeApi interface { + ChainHead(ctx context.Context) (*types2.TipSet, error) +} + +type PDPTaskAddPiece struct { + db *harmonydb.DB + sender *message.SenderETH + ethClient *ethclient.Client +} + +func NewPDPTaskAddPiece(db *harmonydb.DB, sender *message.SenderETH, ethClient *ethclient.Client) *PDPTaskAddPiece { + return &PDPTaskAddPiece{ + db: db, + sender: sender, + ethClient: ethClient, + } +} + +func (p *PDPTaskAddPiece) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + + var addPieces []struct { + ID string `db:"id"` + PieceCid2 string `db:"piece_cid_v2"` + DataSetID int64 `db:"data_set_id"` + ExtraData []byte `db:"extra_data"` + PieceRef string `db:"piece_ref"` + } + + err = p.db.Select(ctx, &addPieces, `SELECT id, piece_cid_v2, data_set_id, extra_data, piece_ref FROM pdp_pipeline WHERE add_piece_task_id = $1 AND after_add_piece = FALSE`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to select add piece: %w", err) + } + + if len(addPieces) == 0 { + return false, xerrors.Errorf("no add piece found for taskID %d", taskID) + } + + if len(addPieces) > 1 { + return false, xerrors.Errorf("multiple add piece found for taskID %d", taskID) + } + + addPiece := addPieces[0] + + pcid2, err := cid.Parse(addPiece.PieceCid2) + if err != nil { + return false, xerrors.Errorf("failed to parse piece cid: %w", err) + } + + // Prepare the Ethereum transaction data outside the DB transaction + // Obtain the ABI of the PDPVerifier contract + abiData, err := contract.PDPVerifierMetaData.GetAbi() + if err != nil { + return false, xerrors.Errorf("getting PDPVerifier ABI: %w", err) + } + + pieceDataArray := []contract.CidsCid{ + { + Data: pcid2.Bytes(), + }, + } + + dataSetID := new(big.Int).SetUint64(uint64(addPiece.DataSetID)) + + // Prepare the Ethereum transaction + // Pack the method call data + // The extraDataBytes variable is now correctly populated above + data, err := abiData.Pack("addPieces", dataSetID, pieceDataArray, addPiece.ExtraData) + if err != nil { + return false, xerrors.Errorf("packing data: %w", err) + } + + callOpts := &bind.CallOpts{ + Context: ctx, + } + + pdpVerifierAddress := contract.ContractAddresses().PDPVerifier + + pdpVerifier, err := contract.NewPDPVerifier(pdpVerifierAddress, p.ethClient) + if err != nil { + return false, xerrors.Errorf("failed to instantiate PDPVerifier contract at %s: %w", pdpVerifierAddress.Hex(), err) + } + + // Get the sender address for this dataset + owner, _, err := pdpVerifier.GetDataSetStorageProvider(callOpts, dataSetID) + if err != nil { + return false, xerrors.Errorf("failed to get owner: %w", err) + } + + // Prepare the transaction (nonce will be set to 0, SenderETH will assign it) + txEth := types.NewTransaction( + 0, + contract.ContractAddresses().PDPVerifier, + big.NewInt(0), + 0, + nil, + data, + ) + + // Send the transaction using SenderETH + reason := "pdp-add-piece" + txHash, err := p.sender.Send(ctx, owner, txEth, reason) + if err != nil { + return false, xerrors.Errorf("sending transaction: %w", err) + } + + txHashLower := strings.ToLower(txHash.Hex()) + + // Insert into message_waits_eth and pdp_dataset_piece + _, err = p.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { + // Insert into message_waits_eth + _, err = tx.Exec(` + INSERT INTO message_waits_eth (signed_tx_hash, tx_status) + VALUES ($1, $2) + `, txHashLower, "pending") + if err != nil { + return false, xerrors.Errorf("failed to insert into message_waits_eth: %w", err) + } + + n, err := tx.Exec(`UPDATE pdp_pipeline SET + after_add_piece = TRUE, + add_piece_task_id = NULL, + add_message_hash = $2 + WHERE add_piece_task_id = $1`, taskID, txHashLower) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("incorrect number of rows updated for pdp_pipeline: %d", n) + } + + // Return true to commit the transaction + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("failed to save details to DB: %w", err) + } + return true, nil +} + +func (p *PDPTaskAddPiece) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + return &ids[0], nil +} + +func (p *PDPTaskAddPiece) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "PDPAddPiece", + Cost: resources.Resources{ + Cpu: 1, + Ram: 64 << 20, + }, + MaxFailures: 3, + IAmBored: passcall.Every(5*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return p.schedule(context.Background(), taskFunc) + }), + } +} + +func (p *PDPTaskAddPiece) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var did string + err := tx.QueryRow(`SELECT id FROM pdp_pipeline + WHERE add_piece_task_id IS NULL + AND after_add_piece = FALSE + AND after_add_piece_msg = FALSE + AND aggregated = TRUE + LIMIT 1`).Scan(&did) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, nil + } + return false, xerrors.Errorf("failed to query pdp_pipeline: %w", err) + } + if did == "" { + return false, xerrors.Errorf("no valid deal ID found for scheduling") + } + + _, err = tx.Exec(`UPDATE pdp_pipeline SET add_piece_task_id = $1 WHERE id = $2 AND after_add_piece = FALSE AND after_add_piece_msg = FALSE AND aggregated = TRUE`, id, did) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_pipeline: %w", err) + } + + stop = false // we found a task to schedule, keep going + return true, nil + }) + + } + + return nil +} + +func (p *PDPTaskAddPiece) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ harmonytask.TaskInterface = &PDPTaskAddPiece{} +var _ = harmonytask.Reg(&PDPTaskAddPiece{}) diff --git a/tasks/pdp/task_aggregation.go b/tasks/pdp/task_aggregation.go new file mode 100644 index 000000000..87c041f4b --- /dev/null +++ b/tasks/pdp/task_aggregation.go @@ -0,0 +1,395 @@ +package pdp + +import ( + "context" + "errors" + "fmt" + "io" + "math/bits" + "time" + + "github.com/ipfs/go-cid" + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-data-segment/datasegment" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/ffi" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/market/mk20" +) + +type AggregatePDPDealTask struct { + db *harmonydb.DB + sc *ffi.SealCalls +} + +func NewAggregatePDPDealTask(db *harmonydb.DB, sc *ffi.SealCalls) *AggregatePDPDealTask { + return &AggregatePDPDealTask{ + db: db, + sc: sc, + } +} + +func (a *AggregatePDPDealTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + + var pieces []struct { + PieceCidV2 string `db:"piece_cid_v2"` + PieceRef int64 `db:"piece_ref"` + ID string `db:"id"` + AggrIndex int `db:"aggr_index"` + Aggregated bool `db:"aggregated"` + Aggregation int `db:"deal_aggregation"` + } + + err = a.db.Select(ctx, &pieces, ` + SELECT + piece_cid_v2, + piece_ref, + id, + aggr_index, + aggregated, + deal_aggregation + FROM + pdp_pipeline + WHERE + agg_task_id = $1 ORDER BY aggr_index ASC`, taskID) + if err != nil { + return false, xerrors.Errorf("getting piece details: %w", err) + } + + if len(pieces) == 0 { + return false, xerrors.Errorf("no pieces to aggregate for task %d", taskID) + } + + if len(pieces) == 1 { + n, err := a.db.Exec(ctx, `UPDATE pdp_pipeline SET aggregated = TRUE, agg_task_id = NULL + WHERE id = $1 + AND agg_task_id = $2`, pieces[0].ID, taskID) + if err != nil { + return false, xerrors.Errorf("updating aggregated piece details in DB: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row updated, got %d", n) + } + log.Infof("skipping aggregation as deal %s only has 1 piece for task %s", pieces[0].ID, taskID) + return true, nil + } + + id := pieces[0].ID + + ID, err := ulid.Parse(id) + if err != nil { + return false, xerrors.Errorf("parsing deal ID: %w", err) + } + + deal, err := mk20.DealFromDB(ctx, a.db, ID) + if err != nil { + return false, xerrors.Errorf("getting deal details from DB: %w", err) + } + + pi, err := deal.PieceInfo() + if err != nil { + return false, xerrors.Errorf("getting piece info: %w", err) + } + + var pinfos []abi.PieceInfo + var readers []io.Reader + + var refIDs []int64 + + for _, piece := range pieces { + if piece.Aggregated { + return false, xerrors.Errorf("piece %s for deal %s already aggregated for task %d", piece.PieceCidV2, piece.ID, taskID) + } + if piece.Aggregation != 1 { + return false, xerrors.Errorf("incorrect aggregation value for piece %s for deal %s for task %d", piece.PieceCidV2, piece.ID, taskID) + } + if piece.ID != id { + return false, xerrors.Errorf("piece details do not match") + } + + var reader io.Reader // io.ReadCloser is not supported by padreader + var closer io.Closer + + // get pieceID + var pieceID []struct { + PieceID storiface.PieceNumber `db:"piece_id"` + } + err = a.db.Select(ctx, &pieceID, `SELECT piece_id FROM parked_piece_refs WHERE ref_id = $1`, piece.PieceRef) + if err != nil { + return false, xerrors.Errorf("getting pieceID: %w", err) + } + + if len(pieceID) != 1 { + return false, xerrors.Errorf("expected 1 pieceID, got %d", len(pieceID)) + } + + pr, err := a.sc.PieceReader(ctx, pieceID[0].PieceID) + if err != nil { + return false, xerrors.Errorf("getting piece reader: %w", err) + } + + closer = pr + reader = pr + defer func() { + _ = closer.Close() + }() + + pcid2, err := cid.Parse(piece.PieceCidV2) + if err != nil { + return false, xerrors.Errorf("parsing piece cid: %w", err) + } + + pinfo, err := mk20.GetPieceInfo(pcid2) + if err != nil { + return false, xerrors.Errorf("getting piece info: %w", err) + } + + pinfos = append(pinfos, abi.PieceInfo{ + Size: pinfo.Size, + PieceCID: pinfo.PieceCIDV1, + }) + + readers = append(readers, io.LimitReader(reader, int64(pinfo.RawSize))) + refIDs = append(refIDs, piece.PieceRef) + } + + _, aggregatedRawSize, err := datasegment.ComputeDealPlacement(pinfos) + if err != nil { + return false, xerrors.Errorf("computing aggregated piece size: %w", err) + } + + overallSize := abi.PaddedPieceSize(aggregatedRawSize) + // we need to make this the 'next' power of 2 in order to have space for the index + next := 1 << (64 - bits.LeadingZeros64(uint64(overallSize+256))) + + aggr, err := datasegment.NewAggregate(abi.PaddedPieceSize(next), pinfos) + if err != nil { + return false, xerrors.Errorf("creating aggregate: %w", err) + } + + outR, err := aggr.AggregateObjectReader(readers) + if err != nil { + return false, xerrors.Errorf("aggregating piece readers: %w", err) + } + + var parkedPieceID, pieceRefID int64 + var pieceParked bool + + comm, err := a.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // TODO: Review this logic for incomplete pieces + // Check if we already have the piece, if found then verify access and skip rest of the processing + var pid int64 + var complete bool + err = tx.QueryRow(`SELECT id, complete FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2 AND long_term = TRUE`, pi.PieceCIDV1.String(), pi.Size).Scan(&pid, &complete) + if err == nil { + // If piece exists then check if we can access the data + pr, err := a.sc.PieceReader(ctx, storiface.PieceNumber(pid)) + if err != nil { + // If piece does not exist then we will park it otherwise fail here + if !errors.Is(err, storiface.ErrSectorNotFound) { + // We should fail here because any subsequent operation which requires access to data will also fail + // till this error is fixed + return false, fmt.Errorf("failed to get piece reader: %w", err) + } + } + defer func() { + _ = pr.Close() + }() + pieceParked = true + parkedPieceID = pid + } else { + if !errors.Is(err, pgx.ErrNoRows) { + return false, fmt.Errorf("failed to check if piece already exists: %w", err) + } + // If piece does not exist then let's create one + err = tx.QueryRow(` + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term, skip) + VALUES ($1, $2, $3, TRUE, TRUE) RETURNING id`, + pi.PieceCIDV1.String(), pi.Size, pi.RawSize).Scan(&parkedPieceID) + if err != nil { + return false, fmt.Errorf("failed to create parked_pieces entry: %w", err) + } + } + + err = tx.QueryRow(` + INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, TRUE) RETURNING ref_id + `, parkedPieceID, "/Aggregate").Scan(&pieceRefID) + if err != nil { + return false, fmt.Errorf("failed to create parked_piece_refs entry: %w", err) + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("saving aggregated chunk details to DB: %w", err) + } + + if !comm { + return false, xerrors.Errorf("failed to commit the transaction") + } + + failed := true + + // Clean up piece park tables in case of failure + // TODO: Figure out if there is a race condition with cleanup task + defer func() { + if failed { + _, ferr := a.db.Exec(ctx, `DELETE FROM parked_piece_refs WHERE ref_id = $1`, pieceRefID) + if ferr != nil { + log.Errorf("failed to delete parked_piece_refs entry: %w", ferr) + } + } + }() + + // Write piece if not already complete + if !pieceParked { + upi, _, err := a.sc.WriteUploadPiece(ctx, storiface.PieceNumber(parkedPieceID), int64(pi.RawSize), outR, storiface.PathStorage, true) + if err != nil { + return false, xerrors.Errorf("writing aggregated piece data to storage: %w", err) + } + + if !upi.PieceCID.Equals(pi.PieceCIDV1) { + return false, xerrors.Errorf("commP mismatch calculated %s and supplied %s", upi.PieceCID.String(), pi.PieceCIDV1.String()) + } + + if upi.Size != pi.Size { + return false, xerrors.Errorf("commP size mismatch calculated %d and supplied %d", upi.Size, pi.Size) + } + } + + comm, err = a.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // Replace the pipeline piece with a new aggregated piece + _, err = tx.Exec(`DELETE FROM pdp_pipeline WHERE id = $1`, id) + if err != nil { + return false, fmt.Errorf("failed to delete pipeline pieces: %w", err) + } + + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = ANY($1) AND long_term = FALSE`, refIDs) + if err != nil { + return false, fmt.Errorf("failed to delete parked_piece_refs entries: %w", err) + } + + _, err = tx.Exec(`UPDATE parked_pieces SET complete = true WHERE id = $1 AND complete = FALSE`, parkedPieceID) + if err != nil { + return false, fmt.Errorf("failed to mark piece as complete: %w", err) + } + + pdp := deal.Products.PDPV1 + retv := deal.Products.RetrievalV1 + + n, err := tx.Exec(`INSERT INTO pdp_pipeline ( + id, client, piece_cid_v2, data_set_id, extra_data, piece_ref, + downloaded, deal_aggregation, aggr_index, aggregated, indexing, announce, announce_payload, after_commp) + VALUES ($1, $2, $3, $4, $5, $6, TRUE, $7, 0, TRUE, $8, $9, $10, TRUE)`, + id, deal.Client, deal.Data.PieceCID.String(), *pdp.DataSetID, + pdp.ExtraData, pieceRefID, deal.Data.Format.Aggregate.Type, retv.Indexing, retv.AnnouncePiece, retv.AnnouncePayload) + if err != nil { + return false, xerrors.Errorf("inserting aggregated piece in PDP pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting aggregated piece in PDP pipeline: %d rows affected", n) + } + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("saving aggregated piece details to DB: %w", err) + } + + if !comm { + return false, xerrors.Errorf("failed to commit the transaction") + } + + failed = false + + return true, nil +} + +func (a *AggregatePDPDealTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + // If no local pieceRef was found then just return first TaskID + return &ids[0], nil +} + +func (a *AggregatePDPDealTask) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "AggregatePDPDeal", + Cost: resources.Resources{ + Cpu: 1, + Ram: 4 << 30, + }, + MaxFailures: 3, + IAmBored: passcall.Every(3*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return a.schedule(context.Background(), taskFunc) + }), + } +} + +func (a *AggregatePDPDealTask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var deals []struct { + ID string `db:"id"` + Count int `db:"count"` + } + + err := a.db.Select(ctx, &deals, `SELECT id, COUNT(*) AS count + FROM pdp_pipeline + GROUP BY id + HAVING bool_and(downloaded) + AND bool_and(after_commp) + AND bool_and(NOT aggregated) + AND bool_and(agg_task_id IS NULL);`) + if err != nil { + log.Errorf("getting deals to aggregate: %w", err) + return + } + + if len(deals) == 0 { + return false, nil + } + + deal := deals[0] + + log.Infow("processing aggregation task", "deal", deal.ID, "count", deal.Count) + n, err := tx.Exec(`UPDATE pdp_pipeline SET agg_task_id = $1 + WHERE id = $2 + AND downloaded = TRUE + AND after_commp = TRUE + AND aggregated = FALSE + AND agg_task_id IS NULL`, id, deal.ID) + if err != nil { + return false, xerrors.Errorf("creating aggregation task for PDP: %w", err) + } + + if n == deal.Count { + log.Infow("aggregation task created successfully", "deal", deal.ID) + } + + stop = false + + return n == deal.Count, nil + }) + + } + + return nil +} + +func (a *AggregatePDPDealTask) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ = harmonytask.Reg(&AggregatePDPDealTask{}) +var _ harmonytask.TaskInterface = &AggregatePDPDealTask{} diff --git a/tasks/pdp/task_commp.go b/tasks/pdp/task_commp.go new file mode 100644 index 000000000..aa2c244c3 --- /dev/null +++ b/tasks/pdp/task_commp.go @@ -0,0 +1,321 @@ +package pdp + +import ( + "context" + "errors" + "io" + "net/url" + "strconv" + "time" + + "github.com/ipfs/go-cid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-commp-utils/writer" + commcid "github.com/filecoin-project/go-fil-commcid" + commp "github.com/filecoin-project/go-fil-commp-hashhash" + "github.com/filecoin-project/go-padreader" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/ffi" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/market/mk20" +) + +type PDPCommpTask struct { + db *harmonydb.DB + sc *ffi.SealCalls + max int +} + +func NewPDPCommpTask(db *harmonydb.DB, sc *ffi.SealCalls, max int) *PDPCommpTask { + return &PDPCommpTask{ + db: db, + sc: sc, + max: max, + } +} + +func (c *PDPCommpTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + + var pieces []struct { + Pcid string `db:"piece_cid_v2"` + Ref int64 `db:"piece_ref"` + ID string `db:"id"` + } + + err = c.db.Select(ctx, &pieces, `SELECT id, piece_cid_v2, piece_ref FROM pdp_pipeline + WHERE commp_task_id = $1 + AND downloaded = TRUE;`, taskID) + if err != nil { + return false, xerrors.Errorf("getting piece details: %w", err) + } + if len(pieces) != 1 { + return false, xerrors.Errorf("expected 1 piece, got %d", len(pieces)) + } + piece := pieces[0] + + pcid, err := cid.Parse(piece.Pcid) + if err != nil { + return false, xerrors.Errorf("parsing piece: %w", err) + } + + pi, err := mk20.GetPieceInfo(pcid) + if err != nil { + return false, xerrors.Errorf("getting piece info: %w", err) + } + + // get pieceID + var pieceID []struct { + PieceID storiface.PieceNumber `db:"piece_id"` + } + err = c.db.Select(ctx, &pieceID, `SELECT piece_id FROM parked_piece_refs WHERE ref_id = $1`, piece.Ref) + if err != nil { + return false, xerrors.Errorf("getting pieceID: %w", err) + } + + if len(pieceID) != 1 { + return false, xerrors.Errorf("expected 1 pieceID, got %d", len(pieceID)) + } + + pr, err := c.sc.PieceReader(ctx, pieceID[0].PieceID) + if err != nil { + return false, xerrors.Errorf("getting piece reader: %w", err) + } + + pReader, pSz := padreader.New(pr, pi.RawSize) + + defer func() { + _ = pr.Close() + }() + + wr := new(commp.Calc) + written, err := io.CopyBuffer(wr, pReader, make([]byte, writer.CommPBuf)) + if err != nil { + return false, xerrors.Errorf("copy into commp writer: %w", err) + } + + if written != int64(pSz) { + return false, xerrors.Errorf("number of bytes written to CommP writer %d not equal to the file size %d", written, pSz) + } + + digest, size, err := wr.Digest() + if err != nil { + return false, xerrors.Errorf("computing commP failed: %w", err) + } + + calculatedCommp, err := commcid.DataCommitmentV1ToCID(digest) + if err != nil { + return false, xerrors.Errorf("computing commP failed: %w", err) + } + + if !calculatedCommp.Equals(pi.PieceCIDV1) { + return false, xerrors.Errorf("commp mismatch: calculated %s and expected %s", calculatedCommp, pi.PieceCIDV1) + } + + if pi.Size != abi.PaddedPieceSize(size) { + return false, xerrors.Errorf("pieceSize mismatch: expected %d, got %d", pi.Size, abi.PaddedPieceSize(size)) + } + + n, err := c.db.Exec(ctx, `UPDATE pdp_pipeline SET after_commp = TRUE, commp_task_id = NULL + WHERE id = $1 + AND piece_cid_v2 = $2 + AND downloaded = TRUE + AND after_commp = FALSE + AND commp_task_id = $3`, + piece.ID, piece.Pcid, taskID) + + if err != nil { + return false, xerrors.Errorf("store commp success: updating pdp pipeline: %w", err) + } + + if n != 1 { + return false, xerrors.Errorf("store commp success: updated %d rows", n) + } + + return true, nil + +} + +func (c *PDPCommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + // CommP task can be of 2 types + // 1. Using ParkPiece pieceRef + // 2. Using remote HTTP reader + // ParkPiece should be scheduled on same node which has the piece + // Remote HTTP ones can be scheduled on any node + + ctx := context.Background() + + var tasks []struct { + TaskID harmonytask.TaskID `db:"commp_task_id"` + StorageID string `db:"storage_id"` + Url *string `db:"url"` + } + + indIDs := make([]int64, len(ids)) + for i, id := range ids { + indIDs[i] = int64(id) + } + + comm, err := c.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + err = tx.Select(&tasks, ` SELECT + commp_task_id, + url + FROM + market_mk12_deal_pipeline + WHERE + commp_task_id = ANY ($1) + + UNION ALL + + SELECT + commp_task_id, + url + FROM + market_mk20_pipeline + WHERE + commp_task_id = ANY ($1); + `, indIDs) + if err != nil { + return false, xerrors.Errorf("failed to get deal details from DB: %w", err) + } + + if storiface.FTPiece != 32 { + panic("storiface.FTPiece != 32") + } + + for _, task := range tasks { + if task.Url != nil { + goUrl, err := url.Parse(*task.Url) + if err != nil { + return false, xerrors.Errorf("parsing data URL: %w", err) + } + if goUrl.Scheme == "pieceref" { + refNum, err := strconv.ParseInt(goUrl.Opaque, 10, 64) + if err != nil { + return false, xerrors.Errorf("parsing piece reference number: %w", err) + } + + // get pieceID + var pieceID []struct { + PieceID storiface.PieceNumber `db:"piece_id"` + } + err = tx.Select(&pieceID, `SELECT piece_id FROM parked_piece_refs WHERE ref_id = $1`, refNum) + if err != nil { + return false, xerrors.Errorf("getting pieceID: %w", err) + } + + var sLocation string + + err = tx.QueryRow(` + SELECT storage_id FROM sector_location + WHERE miner_id = 0 AND sector_num = $1 AND sector_filetype = 32`, pieceID[0].PieceID).Scan(&sLocation) + + if err != nil { + return false, xerrors.Errorf("failed to get storage location from DB: %w", err) + } + + task.StorageID = sLocation + } + } + } + + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return nil, err + } + + if !comm { + return nil, xerrors.Errorf("failed to commit the transaction") + } + + ls, err := c.sc.LocalStorage(ctx) + if err != nil { + return nil, xerrors.Errorf("getting local storage: %w", err) + } + + acceptables := map[harmonytask.TaskID]bool{} + + for _, t := range ids { + acceptables[t] = true + } + + for _, t := range tasks { + if _, ok := acceptables[t.TaskID]; !ok { + continue + } + + for _, l := range ls { + if string(l.ID) == t.StorageID { + return &t.TaskID, nil + } + } + } + + // If no local pieceRef was found then just return first TaskID + return &ids[0], nil +} + +func (c *PDPCommpTask) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(c.max), + Name: "PDPCommP", + Cost: resources.Resources{ + Cpu: 1, + Ram: 1 << 30, + }, + MaxFailures: 3, + IAmBored: passcall.Every(3*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return c.schedule(context.Background(), taskFunc) + }), + } +} + +func (c *PDPCommpTask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var did string + err := tx.QueryRow(`SELECT id FROM pdp_pipeline + WHERE commp_task_id IS NULL + AND after_commp = FALSE + AND downloaded = TRUE`).Scan(&did) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, nil + } + return false, xerrors.Errorf("failed to query pdp_pipeline: %w", err) + } + if did == "" { + return false, xerrors.Errorf("no valid deal ID found for scheduling") + } + + _, err = tx.Exec(`UPDATE pdp_pipeline SET commp_task_id = $1 WHERE id = $2 AND commp_task_id IS NULL AND after_commp = FALSE AND downloaded = TRUE`, id, did) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_pipeline: %w", err) + } + + stop = false // we found a task to schedule, keep going + return true, nil + }) + + } + + return nil +} + +func (c *PDPCommpTask) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ = harmonytask.Reg(&PDPCommpTask{}) +var _ harmonytask.TaskInterface = &PDPCommpTask{} diff --git a/tasks/pdp/task_delete_data_set.go b/tasks/pdp/task_delete_data_set.go new file mode 100644 index 000000000..e0ed526ab --- /dev/null +++ b/tasks/pdp/task_delete_data_set.go @@ -0,0 +1,199 @@ +package pdp + +import ( + "context" + "errors" + "math/big" + "strings" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/pdp/contract" + "github.com/filecoin-project/curio/tasks/message" +) + +type PDPTaskDeleteDataSet struct { + db *harmonydb.DB + sender *message.SenderETH + ethClient *ethclient.Client + filClient PDPServiceNodeApi +} + +func NewPDPTaskDeleteDataSet(db *harmonydb.DB, sender *message.SenderETH, ethClient *ethclient.Client, filClient PDPServiceNodeApi) *PDPTaskDeleteDataSet { + return &PDPTaskDeleteDataSet{ + db: db, + sender: sender, + ethClient: ethClient, + filClient: filClient, + } +} + +func (p *PDPTaskDeleteDataSet) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + var pdeletes []struct { + SetID int64 `db:"set_id"` + ExtraData []byte `db:"extra_data"` + } + + err = p.db.Select(ctx, &pdeletes, `SELECT set_id, extra_data FROM pdp_data_set_delete WHERE task_id = $1 AND tx_hash IS NULL`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to get task details from DB: %w", err) + } + + if len(pdeletes) != 1 { + return false, xerrors.Errorf("incorrect rows for dataset delete found for taskID %d", taskID) + } + + pdelete := pdeletes[0] + + extraDataBytes := []byte{} + + dataSetID := new(big.Int).SetUint64(uint64(pdelete.SetID)) + + if pdelete.ExtraData != nil { + extraDataBytes = pdelete.ExtraData + } + + pdpContracts := contract.ContractAddresses() + pdpVerifierAddress := pdpContracts.PDPVerifier + + pdpVerifier, err := contract.NewPDPVerifier(pdpVerifierAddress, p.ethClient) + if err != nil { + return false, xerrors.Errorf("failed to instantiate PDPVerifier contract at %s: %w", pdpVerifierAddress.Hex(), err) + } + + callOpts := &bind.CallOpts{ + Context: ctx, + } + + // Get the sender address for this dataset + owner, _, err := pdpVerifier.GetDataSetStorageProvider(callOpts, dataSetID) + if err != nil { + return false, xerrors.Errorf("failed to get owner: %w", err) + } + + // Manually create the transaction without requiring a Signer + // Obtain the ABI of the PDPVerifier contract + abiData, err := contract.PDPVerifierMetaData.GetAbi() + if err != nil { + return false, xerrors.Errorf("getting PDPVerifier ABI: %w", err) + } + + // Pack the method call data + data, err := abiData.Pack("deleteDataSet", dataSetID, extraDataBytes) + if err != nil { + return false, xerrors.Errorf("packing data: %w", err) + } + + // Prepare the transaction (nonce will be set to 0, SenderETH will assign it) + tx := types.NewTransaction( + 0, + contract.ContractAddresses().PDPVerifier, + big.NewInt(0), + 0, + nil, + data, + ) + + // Send the transaction using SenderETH + reason := "pdp-delete-data-set" + txHash, err := p.sender.Send(ctx, owner, tx, reason) + if err != nil { + return false, xerrors.Errorf("sending transaction: %w", err) + } + + // Insert into message_waits_eth and pdp_data_set_delete + txHashLower := strings.ToLower(txHash.Hex()) + + comm, err := p.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE pdp_data_set_delete SET tx_hash = $1, task_id = NULL WHERE task_id = $2`, txHashLower, taskID) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_data_set_delete: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("incorrect number of rows updated for pdp_data_set_delete: %d", n) + } + + _, err = tx.Exec(`INSERT INTO message_waits_eth (signed_tx_hash, tx_status) VALUES ($1, $2)`, txHashLower, "pending") + if err != nil { + return false, xerrors.Errorf("failed to insert into message_waits_eth: %w", err) + } + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return false, xerrors.Errorf("failed to commit transaction: %w", err) + } + + if !comm { + return false, xerrors.Errorf("failed to commit transaction") + } + + return true, nil +} + +func (p *PDPTaskDeleteDataSet) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + return &ids[0], nil +} + +func (p *PDPTaskDeleteDataSet) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "PDPDelDataSet", + Cost: resources.Resources{ + Cpu: 1, + Ram: 64 << 20, + }, + MaxFailures: 3, + IAmBored: passcall.Every(3*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return p.schedule(context.Background(), taskFunc) + }), + } +} + +func (p *PDPTaskDeleteDataSet) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var did string + err := tx.QueryRow(`SELECT id FROM pdp_data_set_delete WHERE task_id IS NULL AND tx_hash IS NULL LIMIT 1`).Scan(&did) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, nil + } + return false, xerrors.Errorf("failed to query pdp_data_set_delete: %w", err) + } + if did == "" { + return false, xerrors.Errorf("no valid id found for taskID") + } + + _, err = tx.Exec(`UPDATE pdp_data_set_delete SET task_id = $1 WHERE id = $2 AND tx_hash IS NULL`, id, did) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_data_set_delete: %w", err) + } + + stop = false // we found a task to schedule, keep going + return true, nil + }) + + } + + return nil +} + +func (p *PDPTaskDeleteDataSet) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ harmonytask.TaskInterface = &PDPTaskDeleteDataSet{} +var _ = harmonytask.Reg(&PDPTaskDeleteDataSet{}) diff --git a/tasks/pdp/task_delete_piece.go b/tasks/pdp/task_delete_piece.go new file mode 100644 index 000000000..e4ed7805c --- /dev/null +++ b/tasks/pdp/task_delete_piece.go @@ -0,0 +1,208 @@ +package pdp + +import ( + "context" + "errors" + "math/big" + "strings" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/pdp/contract" + "github.com/filecoin-project/curio/tasks/message" +) + +type PDPTaskDeletePiece struct { + db *harmonydb.DB + sender *message.SenderETH + ethClient *ethclient.Client +} + +func (p *PDPTaskDeletePiece) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + + var rdeletes []struct { + ID string `db:"id"` + SetID int64 `db:"set_id"` + Pieces []int64 `db:"pieces"` + ExtraData []byte `db:"extra_data"` + } + + err = p.db.Select(ctx, &rdeletes, `SELECT id, set_id, pieces, extra_data FROM pdp_piece_delete WHERE task_id = $1 AND tx_hash IS NULL`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to get task details from DB: %w", err) + } + + if len(rdeletes) != 1 { + return false, xerrors.Errorf("incorrect rows for delete piece found for taskID %d", taskID) + } + + rdelete := rdeletes[0] + + extraDataBytes := []byte{} + + if rdelete.ExtraData != nil { + extraDataBytes = rdelete.ExtraData + } + + dataSetID := new(big.Int).SetUint64(uint64(rdelete.SetID)) + + pdpContracts := contract.ContractAddresses() + pdpVerifierAddress := pdpContracts.PDPVerifier + + pdpVerifier, err := contract.NewPDPVerifier(pdpVerifierAddress, p.ethClient) + if err != nil { + return false, xerrors.Errorf("failed to instantiate PDPVerifier contract at %s: %w", pdpVerifierAddress.Hex(), err) + } + + callOpts := &bind.CallOpts{ + Context: ctx, + } + + // Get the sender address for this dataset + owner, _, err := pdpVerifier.GetDataSetStorageProvider(callOpts, dataSetID) + if err != nil { + return false, xerrors.Errorf("failed to get owner: %w", err) + } + + var pieces []*big.Int + for _, piece := range rdelete.Pieces { + pieces = append(pieces, new(big.Int).SetUint64(uint64(piece))) + } + + abiData, err := contract.PDPVerifierMetaData.GetAbi() + if err != nil { + return false, xerrors.Errorf("getting PDPVerifier ABI: %w", err) + } + + // Pack the method call data + data, err := abiData.Pack("schedulePieceDeletions", dataSetID, pieces, extraDataBytes) + if err != nil { + return false, xerrors.Errorf("packing data: %w", err) + } + + // Prepare the transaction (nonce will be set to 0, SenderETH will assign it) + tx := types.NewTransaction( + 0, + contract.ContractAddresses().PDPVerifier, + big.NewInt(0), + 0, + nil, + data, + ) + + // Send the transaction using SenderETH + reason := "pdp-remove-piece" + txHash, err := p.sender.Send(ctx, owner, tx, reason) + if err != nil { + return false, xerrors.Errorf("sending transaction: %w", err) + } + + // Insert into message_waits_eth and pdp_data_set_delete + txHashLower := strings.ToLower(txHash.Hex()) + + comm, err := p.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + n, err := tx.Exec(`UPDATE pdp_piece_delete SET tx_hash = $1, task_id = NULL WHERE task_id = $2`, txHashLower, taskID) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_piece_delete: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("incorrect number of rows updated for pdp_piece_delete: %d", n) + } + + _, err = tx.Exec(`INSERT INTO message_waits_eth (signed_tx_hash, tx_status) VALUES ($1, $2)`, txHashLower, "pending") + if err != nil { + return false, xerrors.Errorf("failed to insert into message_waits_eth: %w", err) + } + return true, nil + + // TODO: INSERT IPNI and Index removal tasks + + }, harmonydb.OptionRetry()) + + if err != nil { + return false, xerrors.Errorf("failed to commit transaction: %w", err) + } + + if !comm { + return false, xerrors.Errorf("failed to commit transaction") + } + + return true, nil +} + +func (p *PDPTaskDeletePiece) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + return &ids[0], nil +} + +func (p *PDPTaskDeletePiece) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "PDPDeletePiece", + Cost: resources.Resources{ + Cpu: 1, + Ram: 64 << 20, + }, + MaxFailures: 3, + IAmBored: passcall.Every(5*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return p.schedule(context.Background(), taskFunc) + }), + } +} + +func (p *PDPTaskDeletePiece) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var did string + err := tx.QueryRow(`SELECT id FROM pdp_piece_delete + WHERE task_id IS NULL + AND tx_hash IS NULL LIMIT 1`).Scan(&did) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, nil + } + return false, xerrors.Errorf("failed to query pdp_piece_delete: %w", err) + } + if did == "" { + return false, xerrors.Errorf("no valid deal ID found for scheduling") + } + + _, err = tx.Exec(`UPDATE pdp_piece_delete SET task_id = $1 WHERE id = $2 AND task_id IS NULL AND tx_hash IS NULL`, id, did) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_piece_delete: %w", err) + } + + stop = false // we found a task to schedule, keep going + return true, nil + }) + + } + + return nil +} + +func (p *PDPTaskDeletePiece) Adder(taskFunc harmonytask.AddTaskFunc) {} + +func NewPDPTaskDeletePiece(db *harmonydb.DB, sender *message.SenderETH, ethClient *ethclient.Client) *PDPTaskDeletePiece { + return &PDPTaskDeletePiece{ + db: db, + sender: sender, + ethClient: ethClient, + } +} + +var _ harmonytask.TaskInterface = &PDPTaskDeletePiece{} +var _ = harmonytask.Reg(&PDPTaskDeletePiece{}) diff --git a/tasks/pdp/task_init_pp.go b/tasks/pdp/task_init_pp.go index b5bce2010..c75c4d9b4 100644 --- a/tasks/pdp/task_init_pp.go +++ b/tasks/pdp/task_init_pp.go @@ -2,12 +2,14 @@ package pdp import ( "context" - "database/sql" + "errors" "math/big" + "strings" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/yugabyte/pgx/v5" "golang.org/x/xerrors" "github.com/filecoin-project/curio/harmony/harmonydb" @@ -48,31 +50,31 @@ func NewInitProvingPeriodTask(db *harmonydb.DB, ethClient *ethclient.Client, fil return nil } - // Now query the db for proof sets needing nextProvingPeriod inital call + // Now query the db for data sets needing nextProvingPeriod initial call var toCallInit []struct { - ProofSetID int64 `db:"id"` + DataSetID int64 `db:"id"` } err := db.Select(ctx, &toCallInit, ` SELECT id - FROM pdp_proof_sets + FROM pdp_data_set WHERE challenge_request_task_id IS NULL - AND init_ready AND prove_at_epoch IS NULL + AND init_ready AND prove_at_epoch IS NULL AND removed = FALSE `) - if err != nil && err != sql.ErrNoRows { - return xerrors.Errorf("failed to select proof sets needing nextProvingPeriod: %w", err) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return xerrors.Errorf("failed to select data sets needing nextProvingPeriod: %w", err) } for _, ps := range toCallInit { ipp.addFunc.Val(ctx)(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { - // Update pdp_proof_sets to set challenge_request_task_id = id + // Update pdp_data_set to set challenge_request_task_id = id affected, err := tx.Exec(` - UPDATE pdp_proof_sets + UPDATE pdp_data_set SET challenge_request_task_id = $1 - WHERE id = $2 AND challenge_request_task_id IS NULL - `, id, ps.ProofSetID) + WHERE id = $2 AND challenge_request_task_id IS NULL AND removed = FALSE + `, id, ps.DataSetID) if err != nil { - return false, xerrors.Errorf("failed to update pdp_proof_sets: %w", err) + return false, xerrors.Errorf("failed to update pdp_data_set: %w", err) } if affected == 0 { // Someone else might have already scheduled the task @@ -92,50 +94,62 @@ func NewInitProvingPeriodTask(db *harmonydb.DB, ethClient *ethclient.Client, fil func (ipp *InitProvingPeriodTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { ctx := context.Background() - // Select the proof set where challenge_request_task_id = taskID - var proofSetID int64 + // Select the data set where challenge_request_task_id = taskID + var dataSetID int64 err = ipp.db.QueryRow(ctx, ` SELECT id - FROM pdp_proof_sets + FROM pdp_data_set WHERE challenge_request_task_id = $1 - `, taskID).Scan(&proofSetID) - if err == sql.ErrNoRows { - // No matching proof set, task is done (something weird happened, and e.g another task was spawned in place of this one) + `, taskID).Scan(&dataSetID) + if errors.Is(err, pgx.ErrNoRows) { + // No matching data set, task is done (something weird happened, and e.g. another task was spawned in place of this one) return true, nil } if err != nil { - return false, xerrors.Errorf("failed to query pdp_proof_sets: %w", err) + return false, xerrors.Errorf("failed to query pdp_data_set: %w", err) } - // Get the listener address for this proof set from the PDPVerifier contract + // Get the listener address for this data set from the PDPVerifier contract pdpVerifier, err := contract.NewPDPVerifier(contract.ContractAddresses().PDPVerifier, ipp.ethClient) if err != nil { return false, xerrors.Errorf("failed to instantiate PDPVerifier contract: %w", err) } - listenerAddr, err := pdpVerifier.GetProofSetListener(nil, big.NewInt(proofSetID)) + // Check if the data set has any leaves (pieces) before attempting to initialize proving period + leafCount, err := pdpVerifier.GetDataSetLeafCount(nil, big.NewInt(dataSetID)) if err != nil { - return false, xerrors.Errorf("failed to get listener address for proof set %d: %w", proofSetID, err) + return false, xerrors.Errorf("failed to get leaf count for data set %d: %w", dataSetID, err) + } + if leafCount.Cmp(big.NewInt(0)) == 0 { + // No leaves in the data set yet, skip initialization + // Return done=false to retry later (the task will be retried by the scheduler) + log.Warnf("no leaves in data set %d, skipping initialization with task %d", dataSetID, taskID) + return false, nil } - // Determine the next challenge window start by consulting the listener - provingSchedule, err := contract.NewIPDPProvingSchedule(listenerAddr, ipp.ethClient) + listenerAddr, err := pdpVerifier.GetDataSetListener(nil, big.NewInt(dataSetID)) if err != nil { - return false, xerrors.Errorf("failed to create proving schedule binding, check that listener has proving schedule methods: %w", err) + return false, xerrors.Errorf("failed to get listener address for data set %d: %w", dataSetID, err) } - // ChallengeWindow - challengeWindow, err := provingSchedule.ChallengeWindow(&bind.CallOpts{Context: ctx}) + // Get the proving schedule from the listener (handles view contract indirection) + provingSchedule, err := contract.GetProvingScheduleFromListener(listenerAddr, ipp.ethClient) if err != nil { - return false, xerrors.Errorf("failed to get challenge window: %w", err) + return false, xerrors.Errorf("failed to get proving schedule from listener: %w", err) } - init_prove_at, err := provingSchedule.InitChallengeWindowStart(&bind.CallOpts{Context: ctx}) + config, err := provingSchedule.GetPDPConfig(&bind.CallOpts{Context: ctx}) if err != nil { - return false, xerrors.Errorf("failed to get next challenge window start: %w", err) + return false, xerrors.Errorf("failed to get pdp config: %w", err) } - init_prove_at = init_prove_at.Add(init_prove_at, challengeWindow.Div(challengeWindow, big.NewInt(2))) // Give a buffer of 1/2 challenge window epochs so that we are still within challenge window + + // ChallengeWindow + challengeWindow := big.NewInt(config.ChallengeWindow.Int64()) + + init_prove_at := big.NewInt(config.InitChallengeWindowStart.Int64()) + buffer := challengeWindow.Uint64() / 2 + init_prove_at = init_prove_at.Add(init_prove_at, big.NewInt(int64(buffer))) // Give a buffer of 1/2 challenge window epochs so that we are still within challenge window // Instantiate the PDPVerifier contract pdpContracts := contract.ContractAddresses() pdpVeriferAddress := pdpContracts.PDPVerifier @@ -146,11 +160,19 @@ func (ipp *InitProvingPeriodTask) Do(taskID harmonytask.TaskID, stillOwned func( return false, xerrors.Errorf("failed to get PDPVerifier ABI: %w", err) } - data, err := abiData.Pack("nextProvingPeriod", big.NewInt(proofSetID), init_prove_at, []byte{}) + data, err := abiData.Pack("nextProvingPeriod", big.NewInt(dataSetID), init_prove_at, []byte{}) if err != nil { return false, xerrors.Errorf("failed to pack data: %w", err) } + currentBlock, err := ipp.ethClient.BlockNumber(ctx) + if err != nil { + return false, xerrors.Errorf("failed to get current block number: %w", err) + } + + expectedInitWdStart := currentBlock + config.MaxProvingPeriod - config.ChallengeWindow.Uint64() + expectedMid := expectedInitWdStart + config.ChallengeWindow.Uint64()/2 + // Prepare the transaction txEth := types.NewTransaction( 0, // nonce (will be set by sender) @@ -166,7 +188,7 @@ func (ipp *InitProvingPeriodTask) Do(taskID harmonytask.TaskID, stillOwned func( return false, nil } - fromAddress, _, err := pdpVerifier.GetProofSetOwner(nil, big.NewInt(proofSetID)) + fromAddress, _, err := pdpVerifier.GetDataSetStorageProvider(nil, big.NewInt(dataSetID)) if err != nil { return false, xerrors.Errorf("failed to get default sender address: %w", err) } @@ -181,31 +203,34 @@ func (ipp *InitProvingPeriodTask) Do(taskID harmonytask.TaskID, stillOwned func( reason := "pdp-proving-init" txHash, err := ipp.sender.Send(ctx, fromAddress, txEth, reason) if err != nil { + log.Errorf("failed to send transaction at %d, InitChallengeWindowStart %d, ChallengeWindow %d, MaxProvingPeriod %d, Buffer %d, InitReadyAt %d, ExpectedInitChallenge %d, ExpectedInitReadyAt %d: %w", currentBlock, config.InitChallengeWindowStart.Uint64(), config.ChallengeWindow.Uint64(), config.MaxProvingPeriod, buffer, init_prove_at.Uint64(), expectedInitWdStart, expectedMid, err) return false, xerrors.Errorf("failed to send transaction: %w", err) } + txHashLower := strings.ToLower(txHash.Hex()) + // Update the database in a transaction _, err = ipp.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { - // Update pdp_proof_sets + // Update pdp_data_set affected, err := tx.Exec(` - UPDATE pdp_proof_sets + UPDATE pdp_data_set SET challenge_request_msg_hash = $1, prev_challenge_request_epoch = $2, prove_at_epoch = $3 WHERE id = $4 - `, txHash.Hex(), ts.Height(), init_prove_at.Uint64(), proofSetID) + `, txHashLower, ts.Height(), init_prove_at.Uint64(), dataSetID) if err != nil { - return false, xerrors.Errorf("failed to update pdp_proof_sets: %w", err) + return false, xerrors.Errorf("failed to update pdp_data_set: %w", err) } if affected == 0 { - return false, xerrors.Errorf("pdp_proof_sets update affected 0 rows") + return false, xerrors.Errorf("pdp_data_set update affected 0 rows") } // Insert into message_waits_eth _, err = tx.Exec(` INSERT INTO message_waits_eth (signed_tx_hash, tx_status) VALUES ($1, 'pending') ON CONFLICT DO NOTHING - `, txHash.Hex()) + `, txHashLower) if err != nil { return false, xerrors.Errorf("failed to insert into message_waits_eth: %w", err) } diff --git a/tasks/pdp/task_next_pp.go b/tasks/pdp/task_next_pp.go index 14790e844..708fa3b8e 100644 --- a/tasks/pdp/task_next_pp.go +++ b/tasks/pdp/task_next_pp.go @@ -2,11 +2,13 @@ package pdp import ( "context" - "database/sql" + "errors" "math/big" + "strings" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/yugabyte/pgx/v5" "golang.org/x/xerrors" "github.com/filecoin-project/curio/harmony/harmonydb" @@ -47,31 +49,31 @@ func NewNextProvingPeriodTask(db *harmonydb.DB, ethClient *ethclient.Client, fil return nil } - // Now query the db for proof sets needing nextProvingPeriod + // Now query the db for data sets needing nextProvingPeriod var toCallNext []struct { - ProofSetID int64 `db:"id"` + DataSetID int64 `db:"id"` } err := db.Select(ctx, &toCallNext, ` SELECT id - FROM pdp_proof_sets + FROM pdp_data_set WHERE challenge_request_task_id IS NULL - AND (prove_at_epoch + challenge_window) <= $1 + AND (prove_at_epoch + challenge_window) <= $1 AND removed = FALSE `, apply.Height()) - if err != nil && err != sql.ErrNoRows { - return xerrors.Errorf("failed to select proof sets needing nextProvingPeriod: %w", err) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return xerrors.Errorf("failed to select data sets needing nextProvingPeriod: %w", err) } for _, ps := range toCallNext { n.addFunc.Val(ctx)(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { - // Update pdp_proof_sets to set challenge_request_task_id = id + // Update pdp_data_set to set challenge_request_task_id = id affected, err := tx.Exec(` - UPDATE pdp_proof_sets + UPDATE pdp_data_set SET challenge_request_task_id = $1 - WHERE id = $2 AND challenge_request_task_id IS NULL - `, id, ps.ProofSetID) + WHERE id = $2 AND challenge_request_task_id IS NULL AND removed = FALSE + `, id, ps.DataSetID) if err != nil { - return false, xerrors.Errorf("failed to update pdp_proof_sets: %w", err) + return false, xerrors.Errorf("failed to update pdp_data_set: %w", err) } if affected == 0 { // Someone else might have already scheduled the task @@ -90,39 +92,40 @@ func NewNextProvingPeriodTask(db *harmonydb.DB, ethClient *ethclient.Client, fil func (n *NextProvingPeriodTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { ctx := context.Background() - // Select the proof set where challenge_request_task_id = taskID - var proofSetID int64 + // Select the data set where challenge_request_task_id = taskID + var dataSetID int64 err = n.db.QueryRow(ctx, ` SELECT id - FROM pdp_proof_sets + FROM pdp_data_set WHERE challenge_request_task_id = $1 AND prove_at_epoch IS NOT NULL - `, taskID).Scan(&proofSetID) - if err == sql.ErrNoRows { - // No matching proof set, task is done (something weird happened, and e.g another task was spawned in place of this one) + `, taskID).Scan(&dataSetID) + if errors.Is(err, pgx.ErrNoRows) { + // No matching data set, task is done (something weird happened, and e.g another task was spawned in place of this one) return true, nil } if err != nil { - return false, xerrors.Errorf("failed to query pdp_proof_sets: %w", err) + return false, xerrors.Errorf("failed to query pdp_data_set: %w", err) } - // Get the listener address for this proof set from the PDPVerifier contract + // Get the listener address for this data set from the PDPVerifier contract pdpVerifier, err := contract.NewPDPVerifier(contract.ContractAddresses().PDPVerifier, n.ethClient) if err != nil { return false, xerrors.Errorf("failed to instantiate PDPVerifier contract: %w", err) } - listenerAddr, err := pdpVerifier.GetProofSetListener(nil, big.NewInt(proofSetID)) + listenerAddr, err := pdpVerifier.GetDataSetListener(nil, big.NewInt(dataSetID)) if err != nil { - return false, xerrors.Errorf("failed to get listener address for proof set %d: %w", proofSetID, err) + return false, xerrors.Errorf("failed to get listener address for data set %d: %w", dataSetID, err) } - // Determine the next challenge window start by consulting the listener - provingSchedule, err := contract.NewIPDPProvingSchedule(listenerAddr, n.ethClient) + // Get the proving schedule from the listener (handles view contract indirection) + provingSchedule, err := contract.GetProvingScheduleFromListener(listenerAddr, n.ethClient) if err != nil { - return false, xerrors.Errorf("failed to create proving schedule binding, check that listener has proving schedule methods: %w", err) + return false, xerrors.Errorf("failed to get proving schedule from listener: %w", err) } - next_prove_at, err := provingSchedule.NextChallengeWindowStart(nil, big.NewInt(proofSetID)) + + next_prove_at, err := provingSchedule.NextPDPChallengeWindowStart(nil, big.NewInt(dataSetID)) if err != nil { return false, xerrors.Errorf("failed to get next challenge window start: %w", err) } @@ -137,7 +140,7 @@ func (n *NextProvingPeriodTask) Do(taskID harmonytask.TaskID, stillOwned func() return false, xerrors.Errorf("failed to get PDPVerifier ABI: %w", err) } - data, err := abiData.Pack("nextProvingPeriod", big.NewInt(proofSetID), next_prove_at, []byte{}) + data, err := abiData.Pack("nextProvingPeriod", big.NewInt(dataSetID), next_prove_at, []byte{}) if err != nil { return false, xerrors.Errorf("failed to pack data: %w", err) } @@ -157,7 +160,7 @@ func (n *NextProvingPeriodTask) Do(taskID harmonytask.TaskID, stillOwned func() return false, nil } - fromAddress, _, err := pdpVerifier.GetProofSetOwner(nil, big.NewInt(proofSetID)) + fromAddress, _, err := pdpVerifier.GetDataSetStorageProvider(nil, big.NewInt(dataSetID)) if err != nil { return false, xerrors.Errorf("failed to get default sender address: %w", err) } @@ -175,28 +178,30 @@ func (n *NextProvingPeriodTask) Do(taskID harmonytask.TaskID, stillOwned func() return false, xerrors.Errorf("failed to send transaction: %w", err) } + txHashLower := strings.ToLower(txHash.Hex()) + // Update the database in a transaction _, err = n.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { - // Update pdp_proof_sets + // Update pdp_data_set affected, err := tx.Exec(` - UPDATE pdp_proof_sets + UPDATE pdp_data_set SET challenge_request_msg_hash = $1, prev_challenge_request_epoch = $2, prove_at_epoch = $3 WHERE id = $4 - `, txHash.Hex(), ts.Height(), next_prove_at.Uint64(), proofSetID) + `, txHashLower, ts.Height(), next_prove_at.Uint64(), dataSetID) if err != nil { - return false, xerrors.Errorf("failed to update pdp_proof_sets: %w", err) + return false, xerrors.Errorf("failed to update pdp_data_set: %w", err) } if affected == 0 { - return false, xerrors.Errorf("pdp_proof_sets update affected 0 rows") + return false, xerrors.Errorf("pdp_data_set update affected 0 rows") } // Insert into message_waits_eth _, err = tx.Exec(` INSERT INTO message_waits_eth (signed_tx_hash, tx_status) VALUES ($1, 'pending') ON CONFLICT DO NOTHING - `, txHash.Hex()) + `, txHashLower) if err != nil { return false, xerrors.Errorf("failed to insert into message_waits_eth: %w", err) } diff --git a/tasks/pdp/task_prove.go b/tasks/pdp/task_prove.go index 2f0a626a1..b5772c831 100644 --- a/tasks/pdp/task_prove.go +++ b/tasks/pdp/task_prove.go @@ -2,29 +2,28 @@ package pdp import ( "context" - "database/sql" "encoding/binary" "encoding/hex" "errors" "io" "math/big" - "math/bits" - "sort" "sync/atomic" + "github.com/dustin/go-humanize" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/ipfs/go-cid" - pool "github.com/libp2p/go-buffer-pool" "github.com/minio/sha256-simd" + "github.com/oklog/ulid" "github.com/samber/lo" + "github.com/yugabyte/pgx/v5" "golang.org/x/crypto/sha3" "golang.org/x/xerrors" - "github.com/filecoin-project/go-commp-utils/zerocomm" commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-padreader" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/curio/harmony/harmonydb" @@ -34,6 +33,8 @@ import ( "github.com/filecoin-project/curio/lib/chainsched" "github.com/filecoin-project/curio/lib/promise" "github.com/filecoin-project/curio/lib/proof" + "github.com/filecoin-project/curio/market/indexstore" + "github.com/filecoin-project/curio/market/mk20" "github.com/filecoin-project/curio/pdp/contract" "github.com/filecoin-project/curio/tasks/message" @@ -49,6 +50,7 @@ type ProveTask struct { sender *message.SenderETH cpr *cachedreader.CachedPieceReader fil ProveTaskChainApi + idx *indexstore.IndexStore head atomic.Pointer[chainTypes.TipSet] @@ -60,16 +62,17 @@ type ProveTaskChainApi interface { ChainHead(context.Context) (*chainTypes.TipSet, error) //perm:read } -func NewProveTask(chainSched *chainsched.CurioChainSched, db *harmonydb.DB, ethClient *ethclient.Client, fil ProveTaskChainApi, sender *message.SenderETH, cpr *cachedreader.CachedPieceReader) *ProveTask { +func NewProveTask(chainSched *chainsched.CurioChainSched, db *harmonydb.DB, ethClient *ethclient.Client, fil ProveTaskChainApi, sender *message.SenderETH, cpr *cachedreader.CachedPieceReader, idx *indexstore.IndexStore) *ProveTask { pt := &ProveTask{ db: db, ethClient: ethClient, sender: sender, cpr: cpr, fil: fil, + idx: idx, } - // ProveTasks are created on pdp_proof_sets entries where + // ProveTasks are created on pdp_data_set entries where // challenge_request_msg_hash is not null (=not yet landed) err := chainSched.AddHandler(func(ctx context.Context, revert, apply *chainTypes.TipSet) error { @@ -84,13 +87,13 @@ func NewProveTask(chainSched *chainsched.CurioChainSched, db *harmonydb.DB, ethC pt.addFunc.Val(ctx)(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { // Select proof sets ready for proving - var proofSets []struct { + var dataSets []struct { ID int64 `db:"id"` } - err := tx.Select(&proofSets, ` + err := tx.Select(&dataSets, ` SELECT p.id - FROM pdp_proof_sets p + FROM pdp_data_set p INNER JOIN message_waits_eth mw on mw.signed_tx_hash = p.challenge_request_msg_hash WHERE p.challenge_request_msg_hash IS NOT NULL AND mw.tx_success = TRUE AND p.prove_at_epoch < $1 LIMIT 2 @@ -99,37 +102,37 @@ func NewProveTask(chainSched *chainsched.CurioChainSched, db *harmonydb.DB, ethC return false, xerrors.Errorf("failed to select proof sets: %w", err) } - if len(proofSets) == 0 { + if len(dataSets) == 0 { // No proof sets to process return false, nil } // Determine if there might be more proof sets to process - more = len(proofSets) > 1 + more = len(dataSets) > 1 // Process the first proof set - todo := proofSets[0] + todo := dataSets[0] - // Insert a new task into pdp_prove_tasks + // Insert a new task into pdp_proving_tasks affected, err := tx.Exec(` - INSERT INTO pdp_prove_tasks (proofset, task_id) + INSERT INTO pdp_proving_tasks (data_set_id, task_id) VALUES ($1, $2) ON CONFLICT DO NOTHING `, todo.ID, id) if err != nil { - return false, xerrors.Errorf("failed to insert into pdp_prove_tasks: %w", err) + return false, xerrors.Errorf("failed to insert into pdp_proving_tasks: %w", err) } if affected == 0 { return false, nil } - // Update pdp_proof_sets to set next_challenge_possible = FALSE + // Update pdp_data_set to set next_challenge_possible = FALSE affected, err = tx.Exec(` - UPDATE pdp_proof_sets + UPDATE pdp_data_set SET challenge_request_msg_hash = NULL WHERE id = $1 AND challenge_request_msg_hash IS NOT NULL `, todo.ID) if err != nil { - return false, xerrors.Errorf("failed to update pdp_proof_sets: %w", err) + return false, xerrors.Errorf("failed to update pdp_data_set: %w", err) } if affected == 0 { more = false @@ -158,13 +161,13 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done ctx := context.Background() // Retrieve proof set and challenge epoch for the task - var proofSetID int64 + var dataSetID int64 err = p.db.QueryRow(context.Background(), ` - SELECT proofset - FROM pdp_prove_tasks + SELECT data_set_id + FROM pdp_proving_tasks WHERE task_id = $1 - `, taskID).Scan(&proofSetID) + `, taskID).Scan(&dataSetID) if err != nil { return false, xerrors.Errorf("failed to get task details: %w", err) } @@ -182,7 +185,7 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done } // Proof parameters - challengeEpoch, err := pdpVerifier.GetNextChallengeEpoch(callOpts, big.NewInt(proofSetID)) + challengeEpoch, err := pdpVerifier.GetNextChallengeEpoch(callOpts, big.NewInt(dataSetID)) if err != nil { return false, xerrors.Errorf("failed to get next challenge epoch: %w", err) } @@ -192,7 +195,7 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done return false, xerrors.Errorf("failed to get chain randomness from beacon for pdp prove: %w", err) } - proofs, err := p.GenerateProofs(ctx, pdpVerifier, proofSetID, seed, contract.NumChallenges) + proofs, err := p.GenerateProofs(ctx, pdpVerifier, dataSetID, seed, contract.NumChallenges) if err != nil { return false, xerrors.Errorf("failed to generate proofs: %w", err) } @@ -202,7 +205,7 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done return false, xerrors.Errorf("failed to get PDPVerifier ABI: %w", err) } - data, err := abiData.Pack("provePossession", big.NewInt(proofSetID), proofs) + data, err := abiData.Pack("provePossession", big.NewInt(dataSetID), proofs) if err != nil { return false, xerrors.Errorf("failed to pack data: %w", err) } @@ -225,21 +228,19 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done proofStr += "] ] ]" - log.Infof("PDP Prove Task: proofSetID: %d, taskID: %d, proofs: %s", proofSetID, taskID, proofStr) + log.Infof("PDP Prove Task: dataSetID: %d, taskID: %d, proofs: %s", dataSetID, taskID, proofStr) } */ // If gas used is 0 fee is maximized gasFee := big.NewInt(0) - proofFee, err := pdpVerifier.CalculateProofFee(callOpts, big.NewInt(proofSetID), gasFee) + + fee, err := pdpVerifier.CalculateProofFee(callOpts, big.NewInt(dataSetID), gasFee) if err != nil { return false, xerrors.Errorf("failed to calculate proof fee: %w", err) } - // Add 2x buffer for certainty - proofFee = new(big.Int).Mul(proofFee, big.NewInt(3)) - - // Get the sender address for this proofset - owner, _, err := pdpVerifier.GetProofSetOwner(callOpts, big.NewInt(proofSetID)) + // Get the sender address for this dataset + owner, _, err := pdpVerifier.GetDataSetStorageProvider(callOpts, big.NewInt(dataSetID)) if err != nil { return false, xerrors.Errorf("failed to get owner: %w", err) } @@ -253,7 +254,7 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done txEth := types.NewTransaction( 0, pdpVerifierAddress, - proofFee, + fee, 0, nil, data, @@ -278,13 +279,13 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done } log.Infow("PDP Prove Task", - "proofSetID", proofSetID, + "dataSetID", dataSetID, "taskID", taskID, "proofs", proofLogs, "data", hex.EncodeToString(data), "gasFeeEstimate", gasFee, - "proofFee initial", proofFee.Div(proofFee, big.NewInt(3)), - "proofFee 3x", proofFee, + "proofFee initial", fee.Div(fee, big.NewInt(3)), + "proofFee 3x", fee, "txEth", txEth, ) @@ -299,46 +300,40 @@ func (p *ProveTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done return false, xerrors.Errorf("failed to send transaction: %w", err) } - // Remove the roots previously scheduled for deletion - err = p.cleanupDeletedRoots(ctx, proofSetID, pdpVerifier) - if err != nil { - return false, xerrors.Errorf("failed to cleanup deleted roots: %w", err) - } - - log.Infow("PDP Prove Task: transaction sent", "txHash", txHash, "proofSetID", proofSetID, "taskID", taskID) + log.Infow("PDP Prove Task: transaction sent", "txHash", txHash, "dataSetID", dataSetID, "taskID", taskID) // Task completed successfully return true, nil } -func (p *ProveTask) GenerateProofs(ctx context.Context, pdpService *contract.PDPVerifier, proofSetID int64, seed abi.Randomness, numChallenges int) ([]contract.PDPVerifierProof, error) { - proofs := make([]contract.PDPVerifierProof, numChallenges) +func (p *ProveTask) GenerateProofs(ctx context.Context, pdpService *contract.PDPVerifier, dataSetID int64, seed abi.Randomness, numChallenges int) ([]contract.IPDPTypesProof, error) { + proofs := make([]contract.IPDPTypesProof, numChallenges) callOpts := &bind.CallOpts{ Context: ctx, } - totalLeafCount, err := pdpService.GetChallengeRange(callOpts, big.NewInt(proofSetID)) + totalLeafCount, err := pdpService.GetChallengeRange(callOpts, big.NewInt(dataSetID)) if err != nil { return nil, xerrors.Errorf("failed to get proof set leaf count: %w", err) } totalLeaves := totalLeafCount.Uint64() challenges := lo.Times(numChallenges, func(i int) int64 { - return generateChallengeIndex(seed, proofSetID, i, totalLeaves) + return generateChallengeIndex(seed, dataSetID, i, totalLeaves) }) - rootId, err := pdpService.FindRootIds(callOpts, big.NewInt(proofSetID), lo.Map(challenges, func(i int64, _ int) *big.Int { return big.NewInt(i) })) + pieceId, err := pdpService.FindPieceIds(callOpts, big.NewInt(dataSetID), lo.Map(challenges, func(i int64, _ int) *big.Int { return big.NewInt(i) })) if err != nil { return nil, xerrors.Errorf("failed to find root IDs: %w", err) } for i := 0; i < numChallenges; i++ { - root := rootId[i] + piece := pieceId[i] - proof, err := p.proveRoot(ctx, proofSetID, root.RootId.Int64(), root.Offset.Int64()) + proof, err := p.proveRoot(ctx, dataSetID, piece.PieceId.Int64(), piece.Offset.Int64()) if err != nil { - return nil, xerrors.Errorf("failed to prove root %d (%d, %d, %d): %w", i, proofSetID, root.RootId.Int64(), root.Offset.Int64(), err) + return nil, xerrors.Errorf("failed to prove root %d (%d, %d, %d): %w", i, dataSetID, piece.PieceId.Int64(), piece.Offset.Int64(), err) } proofs[i] = proof @@ -347,7 +342,7 @@ func (p *ProveTask) GenerateProofs(ctx context.Context, pdpService *contract.PDP return proofs, nil } -func generateChallengeIndex(seed abi.Randomness, proofSetID int64, proofIndex int, totalLeaves uint64) int64 { +func generateChallengeIndex(seed abi.Randomness, dataSetID int64, proofIndex int, totalLeaves uint64) int64 { // Create a buffer to hold the concatenated data (96 bytes: 32 bytes * 3) data := make([]byte, 0, 96) @@ -355,10 +350,10 @@ func generateChallengeIndex(seed abi.Randomness, proofSetID int64, proofIndex in data = append(data, seed...) - // Convert proofSetID to 32-byte big-endian representation - proofSetIDBigInt := big.NewInt(proofSetID) - proofSetIDBytes := padTo32Bytes(proofSetIDBigInt.Bytes()) - data = append(data, proofSetIDBytes...) + // Convert dataSetID to 32-byte big-endian representation + dataSetIDBigInt := big.NewInt(dataSetID) + dataSetIDBytes := padTo32Bytes(dataSetIDBigInt.Bytes()) + data = append(data, dataSetIDBytes...) // Convert proofIndex to 8-byte big-endian representation proofIndexBytes := make([]byte, 8) @@ -380,7 +375,7 @@ func generateChallengeIndex(seed abi.Randomness, proofSetID int64, proofIndex in // Log for debugging log.Debugw("generateChallengeIndex", "seed", seed, - "proofSetID", proofSetID, + "dataSetID", dataSetID, "proofIndex", proofIndex, "totalLeaves", totalLeaves, "data", hex.EncodeToString(data), @@ -400,261 +395,190 @@ func padTo32Bytes(b []byte) []byte { return padded } -func (p *ProveTask) genSubrootMemtree(ctx context.Context, subrootCid string, subrootSize abi.PaddedPieceSize) ([]byte, error) { - subrootCidObj, err := cid.Parse(subrootCid) - if err != nil { - return nil, xerrors.Errorf("failed to parse subroot CID: %w", err) - } - - if subrootSize > proof.MaxMemtreeSize { - return nil, xerrors.Errorf("subroot size exceeds maximum: %d", subrootSize) - } - - subrootReader, unssize, err := p.cpr.GetSharedPieceReader(ctx, subrootCidObj) - if err != nil { - return nil, xerrors.Errorf("failed to get subroot reader: %w", err) - } - - var r io.Reader = subrootReader - - if unssize.Padded() > subrootSize { - return nil, xerrors.Errorf("subroot size mismatch: %d > %d", unssize.Padded(), subrootSize) - } else if unssize.Padded() < subrootSize { - // pad with zeros - r = io.MultiReader(r, nullreader.NewNullReader(abi.UnpaddedPieceSize(subrootSize-unssize.Padded()))) - } - - defer func() { - _ = subrootReader.Close() - }() - - return proof.BuildSha254Memtree(r, subrootSize.Unpadded()) -} - -func (p *ProveTask) proveRoot(ctx context.Context, proofSetID int64, rootId int64, challengedLeaf int64) (contract.PDPVerifierProof, error) { - const arity = 2 +func (p *ProveTask) proveRoot(ctx context.Context, dataSetID int64, pieceID int64, challengedLeaf int64) (contract.IPDPTypesProof, error) { rootChallengeOffset := challengedLeaf * LeafSize - // Retrieve the root and subroot - type subrootMeta struct { - Root string `db:"root"` - Subroot string `db:"subroot"` - SubrootOffset int64 `db:"subroot_offset"` // padded offset - SubrootSize int64 `db:"subroot_size"` // padded piece size - } - - var subroots []subrootMeta + var pieceCid, dealID string - err := p.db.Select(context.Background(), &subroots, ` - SELECT root, subroot, subroot_offset, subroot_size - FROM pdp_proofset_roots - WHERE proofset = $1 AND root_id = $2 - ORDER BY subroot_offset ASC - `, proofSetID, rootId) + err := p.db.QueryRow(context.Background(), `SELECT piece_cid_v2, add_deal_id FROM pdp_dataset_piece WHERE data_set_id = $1 AND piece = $2`, dataSetID, pieceID).Scan(&pieceCid, &dealID) if err != nil { - return contract.PDPVerifierProof{}, xerrors.Errorf("failed to get root and subroot: %w", err) - } - - // find first subroot with subroot_offset >= rootChallengeOffset - challSubRoot, challSubrootIdx, ok := lo.FindLastIndexOf(subroots, func(subroot subrootMeta) bool { - return subroot.SubrootOffset < rootChallengeOffset - }) - if !ok { - return contract.PDPVerifierProof{}, xerrors.New("no subroot found") + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to piece cid and deal id for the piece: %w", err) } - // build subroot memtree - memtree, err := p.genSubrootMemtree(ctx, challSubRoot.Subroot, abi.PaddedPieceSize(challSubRoot.SubrootSize)) + pcid, err := cid.Parse(pieceCid) if err != nil { - return contract.PDPVerifierProof{}, xerrors.Errorf("failed to generate subroot memtree: %w", err) + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to parse piece CID: %w", err) } - subrootChallengedLeaf := challengedLeaf - (challSubRoot.SubrootOffset / LeafSize) - log.Debugw("subrootChallengedLeaf", "subrootChallengedLeaf", subrootChallengedLeaf, "challengedLeaf", challengedLeaf, "subrootOffsetLs", challSubRoot.SubrootOffset/LeafSize) - - /* - type RawMerkleProof struct { - Leaf [32]byte - Proof [][32]byte - Root [32]byte - } - */ - subrootProof, err := proof.MemtreeProof(memtree, subrootChallengedLeaf) - pool.Put(memtree) + pi, err := mk20.GetPieceInfo(pcid) if err != nil { - return contract.PDPVerifierProof{}, xerrors.Errorf("failed to generate subroot proof: %w", err) - } - log.Debugw("subrootProof", "subrootProof", subrootProof) - - // build partial top-tree - type treeElem struct { - Level int // 1 == leaf, NODE_SIZE - Hash [LeafSize]byte - } - type elemIndex struct { - Level int - ElemOffset int64 // offset in terms of nodes at the current level + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to get piece info: %w", err) } - partialTree := map[elemIndex]treeElem{} - var subrootsSize abi.PaddedPieceSize + var out contract.IPDPTypesProof + var rootDigest [32]byte - // 1. prefill the partial tree - for _, subroot := range subroots { - subrootsSize += abi.PaddedPieceSize(subroot.SubrootSize) - - unsCid, err := cid.Parse(subroot.Subroot) + // If piece is less than 100 MiB, let's generate proof directly without using cache + if pi.RawSize < MinSizeForCache { + // Get original file reader + reader, _, err := p.cpr.GetSharedPieceReader(ctx, pcid, false) if err != nil { - return contract.PDPVerifierProof{}, xerrors.Errorf("failed to parse subroot CID: %w", err) + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to get piece reader: %w", err) } + defer func() { + _ = reader.Close() + }() - commp, err := commcid.CIDToPieceCommitmentV1(unsCid) + // Build Merkle tree from padded input + memTree, err := proof.BuildSha254Memtree(reader, pi.Size.Unpadded()) if err != nil { - return contract.PDPVerifierProof{}, xerrors.Errorf("failed to convert CID to piece commitment: %w", err) + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to build memtree: %w", err) } + log.Debugw("provePiece", "rootChallengeOffset", rootChallengeOffset, "challengedLeaf", challengedLeaf) - var comm [LeafSize]byte - copy(comm[:], commp) - - level := proof.NodeLevel(subroot.SubrootSize/LeafSize, arity) - offset := (subroot.SubrootOffset / LeafSize) >> uint(level-1) - partialTree[elemIndex{Level: level, ElemOffset: offset}] = treeElem{ - Level: level, - Hash: comm, + mProof, err := proof.MemtreeProof(memTree, challengedLeaf) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to generate memtree proof: %w", err) } - } - rootSize := nextPowerOfTwo(subrootsSize) - rootLevel := proof.NodeLevel(int64(rootSize/LeafSize), arity) + out = contract.IPDPTypesProof{ + Leaf: mProof.Leaf, + Proof: mProof.Proof, + } - // 2. build the partial tree - // we do the build from the right side of the tree - elements are sorted by size, so only elements on the right side can have missing siblings + rootDigest = mProof.Root + } else { + has, layerIdx, err := p.idx.GetPDPLayerIndex(ctx, pcid) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to check if piece has PDP layer: %w", err) + } - isRight := func(offset int64) bool { - return offset&1 == 1 - } + if !has { + log.Errorf("No proving cache found for piece %s. Create a save cache task", pcid.String()) + err = p.startSaveCache(ctx, dealID) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to start save cache task: %w", err) + } + return contract.IPDPTypesProof{}, xerrors.Errorf("No proving cache found for piece %s. Create a save cache task", pcid.String()) + } - for i := len(subroots) - 1; i >= 0; i-- { - subroot := subroots[i] - level := proof.NodeLevel(subroot.SubrootSize/LeafSize, arity) - offset := (subroot.SubrootOffset / LeafSize) >> uint(level-1) - firstSubroot := i == 0 + leavesPerNode := int64(1) << layerIdx + snapshotNodeIndex := challengedLeaf >> layerIdx + startLeaf := snapshotNodeIndex << layerIdx - curElem := partialTree[elemIndex{Level: level, ElemOffset: offset}] + has, node, err := p.idx.GetPDPNode(ctx, pcid, layerIdx, snapshotNodeIndex) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to get node: %w", err) + } - log.Debugw("processing partialtree subroot", "curElem", curElem, "level", level, "offset", offset, "subroot", subroot.SubrootOffset, "subrootSz", subroot.SubrootSize) + if !has { + log.Errorf("Proving cache does not have the node for piece %s. Create a save cache task", pcid.String()) + err = p.startSaveCache(ctx, dealID) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to start save cache task: %w", err) + } + return contract.IPDPTypesProof{}, xerrors.Errorf("Proving cache does not have the node for piece %s. Create a save cache task", pcid.String()) + } - for !isRight(offset) { - // find the rightSibling - siblingIndex := elemIndex{Level: level, ElemOffset: offset + 1} - rightSibling, ok := partialTree[siblingIndex] - if !ok { - // if we're processing the first subroot branch, AND we've ran out of right siblings, we're done - if firstSubroot { - break - } + log.Debugw("proveRoot", "rootChallengeOffset", rootChallengeOffset, "challengedLeaf", challengedLeaf, "layerIdx", layerIdx, "snapshotNodeIndex", snapshotNodeIndex, "node", node) - // create a zero rightSibling - rightSibling = treeElem{ - Level: level, - Hash: zerocomm.PieceComms[level-zerocomm.Skip-1], - } - log.Debugw("rightSibling zero", "rightSibling", rightSibling, "siblingIndex", siblingIndex, "level", level, "offset", offset) - partialTree[siblingIndex] = rightSibling - } + if node.Layer != layerIdx { + return contract.IPDPTypesProof{}, xerrors.Errorf("node layer mismatch: %d != %d", node.Layer, layerIdx) + } - // compute the parent - parent := proof.ComputeBinShaParent(curElem.Hash, rightSibling.Hash) - parentLevel := level + 1 - parentOffset := offset / arity + // Convert tree-based leaf range to file-based offset/length + offset := int64(abi.PaddedPieceSize(startLeaf * 32).Unpadded()) + length := int64(abi.PaddedPieceSize(leavesPerNode * 32).Unpadded()) - partialTree[elemIndex{Level: parentLevel, ElemOffset: parentOffset}] = treeElem{ - Level: parentLevel, - Hash: parent, - } + // Compute padded size to build Merkle tree + subrootSize := padreader.PaddedSize(uint64(length)).Padded() - // move to the parent - level = parentLevel - offset = parentOffset - curElem = partialTree[elemIndex{Level: level, ElemOffset: offset}] + // Get original file reader + reader, reportedSize, err := p.cpr.GetSharedPieceReader(ctx, pcid, false) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to get reader: %w", err) } - } + defer func() { + _ = reader.Close() + }() - { - var partialTreeList []elemIndex - for k := range partialTree { - partialTreeList = append(partialTreeList, k) - } - sort.Slice(partialTreeList, func(i, j int) bool { - if partialTreeList[i].Level != partialTreeList[j].Level { - return partialTreeList[i].Level < partialTreeList[j].Level - } - return partialTreeList[i].ElemOffset < partialTreeList[j].ElemOffset - }) + // Create a new section reader that only reads the requested range + dataReader := io.NewSectionReader(reader, offset, length) - } + fileRemaining := int64(reportedSize) - offset - challLevel := proof.NodeLevel(challSubRoot.SubrootSize/LeafSize, arity) - challOffset := (challSubRoot.SubrootOffset / LeafSize) >> uint(challLevel-1) + var data io.Reader + if fileRemaining < length { + data = io.MultiReader(dataReader, nullreader.NewNullReader(abi.UnpaddedPieceSize(int64(subrootSize.Unpadded())-fileRemaining))) + } else { + data = dataReader + } - log.Debugw("challSubRoot", "challSubRoot", challSubrootIdx, "challLevel", challLevel, "challOffset", challOffset) + memtree, err := proof.BuildSha254Memtree(data, subrootSize.Unpadded()) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to build memtree: %w", err) + } - challSubtreeLeaf := partialTree[elemIndex{Level: challLevel, ElemOffset: challOffset}] - if challSubtreeLeaf.Hash != subrootProof.Root { - return contract.PDPVerifierProof{}, xerrors.Errorf("subtree root doesn't match partial tree leaf, %x != %x", challSubtreeLeaf.Hash, subrootProof.Root) - } + // Get challenge leaf in subTree + subTreeChallenge := challengedLeaf - startLeaf - var out contract.PDPVerifierProof - copy(out.Leaf[:], subrootProof.Leaf[:]) - out.Proof = append(out.Proof, subrootProof.Proof...) + subTreeProof, err := proof.MemtreeProof(memtree, subTreeChallenge) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to generate sub tree proof: %w", err) + } + log.Debugw("subTreeProof", "subrootProof", subTreeProof) - currentLevel := challLevel - currentOffset := challOffset + // Verify root of proof + if subTreeProof.Root != node.Hash { + return contract.IPDPTypesProof{}, xerrors.Errorf("subroot root mismatch: %x != %x", subTreeProof.Root, node.Hash) + } - for currentLevel < rootLevel { - siblingOffset := currentOffset ^ 1 + // Fetch full cached layer from DB + layerNodes, err := p.idx.GetPDPLayer(ctx, pcid, layerIdx) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to get layer nodes: %w", err) + } - // Retrieve sibling hash from partialTree or use zero hash - siblingIndex := elemIndex{Level: currentLevel, ElemOffset: siblingOffset} - index := elemIndex{Level: currentLevel, ElemOffset: currentOffset} - siblingElem, ok := partialTree[siblingIndex] - if !ok { - return contract.PDPVerifierProof{}, xerrors.Errorf("missing sibling at level %d, offset %d", currentLevel, siblingOffset) + // Arrange snapshot layer into a byte array + var layerBytes []byte + for _, n := range layerNodes { + layerBytes = append(layerBytes, n.Hash[:]...) } - elem, ok := partialTree[index] - if !ok { - return contract.PDPVerifierProof{}, xerrors.Errorf("missing element at level %d, offset %d", currentLevel, currentOffset) + log.Debugw("layerBytes", "Human Size", humanize.Bytes(uint64(len(layerBytes))), "Size", len(layerBytes), "Number of nodes", len(layerNodes)) + + // Create subTree from snapshot to commP (root) + mtree, err := proof.BuildSha254MemtreeFromSnapshot(layerBytes) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to build memtree from snapshot: %w", err) } - if currentOffset < siblingOffset { // left - log.Debugw("Proof", "position", index, "left-c", hex.EncodeToString(elem.Hash[:]), "right-s", hex.EncodeToString(siblingElem.Hash[:]), "out", hex.EncodeToString(shabytes(append(elem.Hash[:], siblingElem.Hash[:]...))[:])) - } else { // right - log.Debugw("Proof", "position", index, "left-s", hex.EncodeToString(siblingElem.Hash[:]), "right-c", hex.EncodeToString(elem.Hash[:]), "out", hex.EncodeToString(shabytes(append(siblingElem.Hash[:], elem.Hash[:]...))[:])) + + // Generate merkle proof from snapShot node to commP + proofs, err := proof.MemtreeProof(mtree, snapshotNodeIndex) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to generate memtree proof: %w", err) } - // Append the sibling's hash to the proof - out.Proof = append(out.Proof, siblingElem.Hash) + com, _, err := commcid.PieceCidV2ToDataCommitment(pcid) + if err != nil { + return contract.IPDPTypesProof{}, xerrors.Errorf("failed to get piece commitment: %w", err) + } - // Move up to the parent node - currentOffset = currentOffset / arity - currentLevel++ - } + // Verify proof with original root + if [32]byte(com) != proofs.Root { + return contract.IPDPTypesProof{}, xerrors.Errorf("root digest mismatch: %x != %x", com, proofs.Root) + } - log.Debugw("proof complete", "proof", out) + out = contract.IPDPTypesProof{ + Leaf: subTreeProof.Leaf, + Proof: append(subTreeProof.Proof, proofs.Proof...), + } - rootCid, err := cid.Parse(subroots[0].Root) - if err != nil { - return contract.PDPVerifierProof{}, xerrors.Errorf("failed to parse root CID: %w", err) + rootDigest = proofs.Root } - commRoot, err := commcid.CIDToPieceCommitmentV1(rootCid) - if err != nil { - return contract.PDPVerifierProof{}, xerrors.Errorf("failed to convert CID to piece commitment: %w", err) - } - var cr [LeafSize]byte - copy(cr[:], commRoot) - if !Verify(out, cr, uint64(challengedLeaf)) { - return contract.PDPVerifierProof{}, xerrors.Errorf("proof verification failed") + if !Verify(out, rootDigest, uint64(challengedLeaf)) { + return contract.IPDPTypesProof{}, xerrors.Errorf("proof verification failed") } // Return the completed proof @@ -665,7 +589,7 @@ func (p *ProveTask) getSenderAddress(ctx context.Context, match common.Address) var addressStr string err := p.db.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp' AND address = $1 LIMIT 1`, match.Hex()).Scan(&addressStr) if err != nil { - if errors.Is(err, sql.ErrNoRows) { + if errors.Is(err, pgx.ErrNoRows) { return common.Address{}, errors.New("no sender address with role 'pdp' found") } return common.Address{}, err @@ -674,62 +598,6 @@ func (p *ProveTask) getSenderAddress(ctx context.Context, match common.Address) return address, nil } -func (p *ProveTask) cleanupDeletedRoots(ctx context.Context, proofSetID int64, pdpVerifier *contract.PDPVerifier) error { - removals, err := pdpVerifier.GetScheduledRemovals(nil, big.NewInt(proofSetID)) - if err != nil { - return xerrors.Errorf("failed to get scheduled removals: %w", err) - } - - // Execute cleanup in a transaction - ok, err := p.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { - for _, removeID := range removals { - log.Debugw("cleanupDeletedRoots", "removeID", removeID) - // Get the pdp_pieceref ID for the root before deleting - var pdpPieceRefID int64 - err := tx.QueryRow(` - SELECT pdp_pieceref - FROM pdp_proofset_roots - WHERE proofset = $1 AND root_id = $2 - `, proofSetID, removeID.Int64()).Scan(&pdpPieceRefID) - if err != nil { - if errors.Is(err, sql.ErrNoRows) { - // Root already deleted, skip - continue - } - return false, xerrors.Errorf("failed to get piece ref for root %d: %w", removeID, err) - } - - // Delete the parked piece ref, this will cascade to the pdp piece ref too - _, err = tx.Exec(` - DELETE FROM parked_piece_refs - WHERE ref_id = $1 - `, pdpPieceRefID) - if err != nil { - return false, xerrors.Errorf("failed to delete parked piece ref %d: %w", pdpPieceRefID, err) - } - - // Delete the root entry - _, err = tx.Exec(` - DELETE FROM pdp_proofset_roots - WHERE proofset = $1 AND root_id = $2 - `, proofSetID, removeID) - if err != nil { - return false, xerrors.Errorf("failed to delete root %d: %w", removeID, err) - } - } - - return true, nil - }, harmonydb.OptionRetry()) - if err != nil { - return xerrors.Errorf("failed to cleanup deleted roots: %w", err) - } - if !ok { - return xerrors.Errorf("database delete not committed") - } - - return nil -} - func (p *ProveTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { if len(ids) == 0 { return nil, nil @@ -754,12 +622,7 @@ func (p *ProveTask) Adder(taskFunc harmonytask.AddTaskFunc) { p.addFunc.Set(taskFunc) } -func nextPowerOfTwo(n abi.PaddedPieceSize) abi.PaddedPieceSize { - lz := bits.LeadingZeros64(uint64(n - 1)) - return 1 << (64 - lz) -} - -func Verify(proof contract.PDPVerifierProof, root [32]byte, position uint64) bool { +func Verify(proof contract.IPDPTypesProof, root [32]byte, position uint64) bool { computedHash := proof.Leaf for i := 0; i < len(proof.Proof); i++ { @@ -789,7 +652,36 @@ func shabytes(in []byte) []byte { return out[:] } -var ( - _ = harmonytask.Reg(&ProveTask{}) - _ harmonytask.TaskInterface = &ProveTask{} -) +var _ = harmonytask.Reg(&ProveTask{}) +var _ harmonytask.TaskInterface = &ProveTask{} + +func (p *ProveTask) startSaveCache(ctx context.Context, dealID string) error { + id, err := ulid.Parse(dealID) + if err != nil { + return xerrors.Errorf("failed to parse deal ID: %w", err) + } + + deal, err := mk20.DealFromDB(ctx, p.db, id) + if err != nil { + return xerrors.Errorf("failed to get deal from DB: %w", err) + } + + pdp := deal.Products.PDPV1 + + var refID int64 + err = p.db.QueryRow(ctx, `SELECT piece_ref FROM market_piece_deal WHERE id = $1 AND piece_ref IS NOT NULL`, id.String()).Scan(&refID) + if err != nil { + return xerrors.Errorf("failed to get piece ref: %w", err) + } + + _, err = p.db.Exec(ctx, `INSERT INTO pdp_pipeline ( + id, client, piece_cid_v2, data_set_id, extra_data, piece_ref, + downloaded, deal_aggregation, aggr_index, aggregated, indexing, announce, announce_payload, after_commp, after_add_piece, after_add_piece_msg) + VALUES ($1, $2, $3, $4, $5, $6, TRUE, 0, 0, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE) ON CONFLICT(id, aggr_index) DO NOTHING`, + id.String(), deal.Client, deal.Data.PieceCID.String(), *pdp.DataSetID, pdp.ExtraData, refID) + + if err != nil { + return xerrors.Errorf("inserting piece in PDP pipeline: %w", err) + } + return nil +} diff --git a/tasks/pdp/task_save_cache.go b/tasks/pdp/task_save_cache.go new file mode 100644 index 000000000..71c9ce6a3 --- /dev/null +++ b/tasks/pdp/task_save_cache.go @@ -0,0 +1,198 @@ +package pdp + +import ( + "context" + "errors" + "io" + "time" + + "github.com/ipfs/go-cid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + commcid "github.com/filecoin-project/go-fil-commcid" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/cachedreader" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/lib/savecache" + "github.com/filecoin-project/curio/market/indexstore" + "github.com/filecoin-project/curio/market/mk20" +) + +const MinSizeForCache = uint64(100 * 1024 * 1024) + +type TaskPDPSaveCache struct { + db *harmonydb.DB + cpr *cachedreader.CachedPieceReader + idx *indexstore.IndexStore +} + +func NewTaskPDPSaveCache(db *harmonydb.DB, cpr *cachedreader.CachedPieceReader, idx *indexstore.IndexStore) *TaskPDPSaveCache { + return &TaskPDPSaveCache{ + db: db, + cpr: cpr, + idx: idx, + } +} + +func (t *TaskPDPSaveCache) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + var saveCaches []struct { + ID string `db:"id"` + PieceCid string `db:"piece_cid_v2"` + DataSetID int64 `db:"data_set_id"` + PieceRef string `db:"piece_ref"` + } + + err = t.db.Select(ctx, &saveCaches, `SELECT id, piece_cid_v2, data_set_id, piece_ref FROM pdp_pipeline WHERE save_cache_task_id = $1 AND after_save_cache = FALSE`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to select rows from pipeline: %w", err) + } + + if len(saveCaches) == 0 { + return false, xerrors.Errorf("no saveCaches found for taskID %d", taskID) + } + + if len(saveCaches) > 1 { + return false, xerrors.Errorf("multiple saveCaches found for taskID %d", taskID) + } + + sc := saveCaches[0] + + pcid, err := cid.Parse(sc.PieceCid) + if err != nil { + return false, xerrors.Errorf("failed to parse piece cid: %w", err) + } + + pi, err := mk20.GetPieceInfo(pcid) + if err != nil { + return false, xerrors.Errorf("failed to get piece info: %w", err) + } + + // Let's build the merkle Tree again (commP) and save a middle layer for fast proving + // for pieces larger than 100 MiB + if pi.RawSize > MinSizeForCache { + has, _, err := t.idx.GetPDPLayerIndex(ctx, pcid) + if err != nil { + return false, xerrors.Errorf("failed to check if piece has PDP layer: %w", err) + } + + if !has { + cp := savecache.NewCommPWithSize(pi.RawSize) + reader, _, err := t.cpr.GetSharedPieceReader(ctx, pcid, false) + if err != nil { + return false, xerrors.Errorf("failed to get shared piece reader: %w", err) + } + defer func() { + _ = reader.Close() + }() + + n, err := io.CopyBuffer(cp, reader, make([]byte, 4<<20)) + if err != nil { + return false, xerrors.Errorf("failed to copy piece data to commP: %w", err) + } + + digest, _, lidx, _, snap, err := cp.DigestWithSnapShot() + if err != nil { + return false, xerrors.Errorf("failed to get piece digest: %w", err) + } + + pcid2, err := commcid.DataCommitmentToPieceCidv2(digest, uint64(n)) + if err != nil { + return false, xerrors.Errorf("failed to create commP: %w", err) + } + + if pcid2.Equals(pcid) { + return false, xerrors.Errorf("commP cid does not match piece cid: %s != %s", pcid2.String(), pcid.String()) + } + + leafs := make([]indexstore.NodeDigest, len(snap)) + for i, s := range snap { + leafs[i] = indexstore.NodeDigest{ + Layer: lidx, + Hash: s.Hash, + Index: int64(i), + } + } + + err = t.idx.AddPDPLayer(ctx, pcid, leafs) + if err != nil { + return false, xerrors.Errorf("failed to add PDP layer cache: %w", err) + } + } + } + + n, err := t.db.Exec(ctx, `UPDATE pdp_pipeline SET after_save_cache = TRUE, save_cache_task_id = NULL, indexing_created_at = NOW() WHERE save_cache_task_id = $1`, taskID) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_pipeline: %w", err) + } + + if n != 1 { + return false, xerrors.Errorf("failed to update pdp_pipeline: expected 1 row but %d rows updated", n) + } + + return true, nil +} + +func (t *TaskPDPSaveCache) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + return &ids[0], nil +} + +func (t *TaskPDPSaveCache) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "PDPSaveCache", + Cost: resources.Resources{ + Cpu: 1, + Ram: 64 << 20, + }, + MaxFailures: 3, + IAmBored: passcall.Every(2*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return t.schedule(context.Background(), taskFunc) + }), + } +} + +func (t *TaskPDPSaveCache) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + + var did string + err := tx.QueryRow(`SELECT id FROM pdp_pipeline + WHERE save_cache_task_id IS NULL + AND after_save_cache = FALSE + AND after_add_piece_msg = TRUE`).Scan(&did) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, nil + } + return false, xerrors.Errorf("failed to query pdp_pipeline: %w", err) + } + if did == "" { + return false, xerrors.Errorf("no valid deal ID found for scheduling") + } + + _, err = tx.Exec(`UPDATE pdp_pipeline SET save_cache_task_id = $1 WHERE id = $2 AND after_save_cache = FALSE AND after_add_piece_msg = TRUE AND save_cache_task_id IS NULL`, id, did) + if err != nil { + return false, xerrors.Errorf("failed to update pdp_pipeline: %w", err) + } + + stop = false // we found a task to schedule, keep going + return true, nil + }) + + } + + return nil +} + +func (t *TaskPDPSaveCache) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ harmonytask.TaskInterface = &TaskPDPSaveCache{} +var _ = harmonytask.Reg(&TaskPDPSaveCache{}) diff --git a/tasks/piece/task_aggregate_chunks.go b/tasks/piece/task_aggregate_chunks.go new file mode 100644 index 000000000..ba8bc69b3 --- /dev/null +++ b/tasks/piece/task_aggregate_chunks.go @@ -0,0 +1,434 @@ +package piece + +import ( + "context" + "errors" + "fmt" + "io" + "net/url" + "time" + + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/ffi" + "github.com/filecoin-project/curio/lib/passcall" + "github.com/filecoin-project/curio/lib/paths" + "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/market/mk20" +) + +type AggregateChunksTask struct { + db *harmonydb.DB + remote *paths.Remote + sc *ffi.SealCalls +} + +func NewAggregateChunksTask(db *harmonydb.DB, remote *paths.Remote, sc *ffi.SealCalls) *AggregateChunksTask { + return &AggregateChunksTask{ + db: db, + remote: remote, + sc: sc, + } +} + +func (a *AggregateChunksTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + + var chunks []struct { + ID string `db:"id"` + Chunk int `db:"chunk"` + Size int64 `db:"chunk_size"` + RefID int64 `db:"ref_id"` + } + + err = a.db.Select(ctx, &chunks, ` + SELECT + id, + chunk, + chunk_size, + ref_id + FROM + market_mk20_deal_chunk + WHERE + finalize_task_id = $1 + AND complete = TRUE + AND finalize = TRUE + ORDER BY chunk ASC`, taskID) + if err != nil { + return false, xerrors.Errorf("getting chunk details: %w", err) + } + + if len(chunks) == 0 { + return false, xerrors.Errorf("no chunks to aggregate for task %d", taskID) + } + + idStr := chunks[0].ID + + id, err := ulid.Parse(idStr) + if err != nil { + return false, xerrors.Errorf("parsing deal ID: %w", err) + } + + deal, err := mk20.DealFromDB(ctx, a.db, id) + if err != nil { + return false, xerrors.Errorf("getting deal details: %w", err) + } + + pi, err := deal.PieceInfo() + if err != nil { + return false, xerrors.Errorf("getting piece info: %w", err) + } + + rawSize := int64(pi.RawSize) + pcid := pi.PieceCIDV1 + psize := pi.Size + pcid2 := deal.Data.PieceCID + + var readers []io.Reader + var refIds []int64 + + for _, chunk := range chunks { + // get pieceID + var pieceID []struct { + PieceID storiface.PieceNumber `db:"piece_id"` + } + err = a.db.Select(ctx, &pieceID, `SELECT piece_id FROM parked_piece_refs WHERE ref_id = $1`, chunk.RefID) + if err != nil { + return false, xerrors.Errorf("getting pieceID: %w", err) + } + + if len(pieceID) != 1 { + return false, xerrors.Errorf("expected 1 pieceID, got %d", len(pieceID)) + } + + pr, err := a.sc.PieceReader(ctx, pieceID[0].PieceID) + if err != nil { + return false, xerrors.Errorf("getting piece reader: %w", err) + } + + reader := pr + + defer func() { + _ = pr.Close() + }() + readers = append(readers, reader) + refIds = append(refIds, chunk.RefID) + } + + rd := io.MultiReader(readers...) + + var parkedPieceID, pieceRefID int64 + var pieceParked bool + + comm, err := a.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // Check if we already have the piece, if found then verify access and skip rest of the processing + var pid int64 + err = tx.QueryRow(`SELECT id FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2 AND long_term = TRUE`, pcid.String(), psize).Scan(&pid) + if err == nil { + // If piece exists then check if we can access the data + pr, err := a.sc.PieceReader(ctx, storiface.PieceNumber(pid)) + if err != nil { + // If piece does not exist then we will park it otherwise fail here + if !errors.Is(err, storiface.ErrSectorNotFound) { + // We should fail here because any subsequent operation which requires access to data will also fail + // till this error is fixed + return false, fmt.Errorf("failed to get piece reader: %w", err) + } + } + defer func() { + _ = pr.Close() + }() + pieceParked = true + parkedPieceID = pid + } else { + if !errors.Is(err, pgx.ErrNoRows) { + return false, fmt.Errorf("failed to check if piece already exists: %w", err) + } + // If piece does not exist then let's create one + err = tx.QueryRow(` + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term, skip) + VALUES ($1, $2, $3, TRUE, TRUE) RETURNING id`, + pcid.String(), psize, rawSize).Scan(&parkedPieceID) + if err != nil { + return false, fmt.Errorf("failed to create parked_pieces entry: %w", err) + } + } + + err = tx.QueryRow(` + INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, TRUE) RETURNING ref_id + `, parkedPieceID, "/PUT").Scan(&pieceRefID) + if err != nil { + return false, fmt.Errorf("failed to create parked_piece_refs entry: %w", err) + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("saving aggregated chunk details to DB: %w", err) + } + + if !comm { + return false, xerrors.Errorf("failed to commit the transaction") + } + + failed := true + var cleanupChunks bool + + // Clean up piece park tables in case of failure + // TODO: Figure out if there is a race condition with cleanup task + defer func() { + if cleanupChunks { + _, serr := a.db.Exec(ctx, `DELETE FROM market_mk20_deal_chunk WHERE id = $1`, id.String()) + if serr != nil { + log.Errorf("failed to delete market_mk20_deal_chunk entry: %w", serr) + } + _, serr = a.db.Exec(ctx, `DELETE FROM parked_piece_refs WHERE ref_id = ANY($1)`, refIds) + if serr != nil { + log.Errorf("failed to delete parked_piece_refs entry: %w", serr) + } + } + if failed { + _, ferr := a.db.Exec(ctx, `DELETE FROM parked_piece_refs WHERE ref_id = $1`, pieceRefID) + if ferr != nil { + log.Errorf("failed to delete parked_piece_refs entry: %w", ferr) + } + } + }() + + // Write piece if not already complete + if !pieceParked { + cpi, _, err := a.sc.WriteUploadPiece(ctx, storiface.PieceNumber(parkedPieceID), rawSize, rd, storiface.PathStorage, true) + if err != nil { + return false, xerrors.Errorf("writing aggregated piece data to storage: %w", err) + } + + if !cpi.PieceCID.Equals(pcid) { + cleanupChunks = true + return false, xerrors.Errorf("commP mismatch calculated %s and supplied %s", cpi.PieceCID.String(), pcid.String()) + } + + if cpi.Size != psize { + cleanupChunks = true + return false, xerrors.Errorf("commP size mismatch calculated %d and supplied %d", cpi.Size, psize) + } + } + + // Update DB status of piece, deal, PDP + comm, err = a.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + var refIDUsed bool + + dealdata := deal.Data + aggregation := 0 + if dealdata.Format.Aggregate != nil { + aggregation = int(dealdata.Format.Aggregate.Type) + } + + if !pieceParked { + _, err = tx.Exec(`UPDATE parked_pieces SET + complete = TRUE + WHERE id = $1 + AND complete = false`, pieceRefID) + if err != nil { + return false, xerrors.Errorf("marking piece park as complete: %w", err) + } + } + + // Update PoRep pipeline + if deal.Products.DDOV1 != nil { + var complete bool + err = tx.QueryRow(`SELECT (ddo_v1->>'complete')::boolean FROM market_mk20_deal WHERE id = $1`, id.String()).Scan(&complete) + if err != nil { + return false, fmt.Errorf("getting porep status: %w", err) + } + if !complete { + spid, err := address.IDFromAddress(deal.Products.DDOV1.Provider) + if err != nil { + return false, fmt.Errorf("getting provider ID: %w", err) + } + + var rev mk20.RetrievalV1 + if deal.Products.RetrievalV1 != nil { + rev = *deal.Products.RetrievalV1 + } + + ddo := deal.Products.DDOV1 + dealID := deal.Identifier.String() + + var allocationID interface{} + if ddo.AllocationId != nil { + allocationID = *ddo.AllocationId + } else { + allocationID = nil + } + + pieceIDUrl := url.URL{ + Scheme: "pieceref", + Opaque: fmt.Sprintf("%d", pieceRefID), + } + + n, err := tx.Exec(`INSERT INTO market_mk20_pipeline ( + id, sp_id, contract, client, piece_cid_v2, piece_cid, + piece_size, raw_size, url, offline, indexing, announce, + allocation_id, duration, piece_aggregation, deal_aggregation, started, downloaded, after_commp) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, TRUE, TRUE, TRUE)`, + dealID, spid, ddo.ContractAddress, deal.Client, pcid2.String(), pcid.String(), + psize, rawSize, pieceIDUrl.String(), false, rev.Indexing, rev.AnnouncePayload, + allocationID, ddo.Duration, aggregation, aggregation) + + if err != nil { + return false, xerrors.Errorf("inserting mk20 pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting mk20 pipeline: %d rows affected", n) + } + + refIDUsed = true + } + } + + // Update PDP pipeline + if deal.Products.PDPV1 != nil { + var complete bool + err = tx.QueryRow(`SELECT (pdp_v1->>'complete')::boolean FROM market_mk20_deal WHERE id = $1`, id.String()).Scan(&complete) + if err != nil { + return false, fmt.Errorf("getting pdp status: %w", err) + } + if !complete { + pdp := deal.Products.PDPV1 + retv := deal.Products.RetrievalV1 + if refIDUsed { + err = tx.QueryRow(` + INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, TRUE) RETURNING ref_id + `, parkedPieceID, "/PUT").Scan(&pieceRefID) + if err != nil { + return false, fmt.Errorf("failed to create parked_piece_refs entry: %w", err) + } + } + + n, err := tx.Exec(`INSERT INTO pdp_pipeline ( + id, client, piece_cid_v2, data_set_id, extra_data, piece_ref, + downloaded, deal_aggregation, aggr_index, indexing, announce, announce_payload, after_commp) + VALUES ($1, $2, $3, $4, $5, $6, TRUE, $7, 0, $8, $9, $10, TRUE)`, + id.String(), deal.Client, deal.Data.PieceCID.String(), *pdp.DataSetID, + pdp.ExtraData, pieceRefID, aggregation, retv.Indexing, retv.AnnouncePiece, retv.AnnouncePayload) + if err != nil { + return false, xerrors.Errorf("inserting in PDP pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting in PDP pipeline: %d rows affected", n) + } + } + } + + _, err = tx.Exec(`DELETE FROM market_mk20_pipeline_waiting WHERE id = $1`, id.String()) + if err != nil { + return false, xerrors.Errorf("deleting deal from mk20 pipeline waiting: %w", err) + } + + _, err = tx.Exec(`DELETE FROM market_mk20_deal_chunk WHERE id = $1`, id.String()) + if err != nil { + return false, xerrors.Errorf("deleting deal chunks from mk20 deal: %w", err) + } + + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = ANY($1)`, refIds) + if err != nil { + return false, xerrors.Errorf("deleting parked piece refs: %w", err) + } + + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return false, xerrors.Errorf("updating DB: %w", err) + } + if !comm { + return false, xerrors.Errorf("failed to commit the transaction") + } + + failed = false + + return true, nil +} + +func (a *AggregateChunksTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + return &ids[0], nil +} + +func (a *AggregateChunksTask) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "AggregateChunks", + Cost: resources.Resources{ + Cpu: 1, + Ram: 4 << 30, + }, + MaxFailures: 1, + IAmBored: passcall.Every(5*time.Second, func(taskFunc harmonytask.AddTaskFunc) error { + return a.schedule(context.Background(), taskFunc) + }), + } +} + +func (a *AggregateChunksTask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskFunc) error { + // schedule submits + var stop bool + for !stop { + taskFunc(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { + stop = true // assume we're done until we find a task to schedule + var mid string + var count int + err := a.db.QueryRow(ctx, `SELECT id, COUNT(*) AS total_chunks + FROM market_mk20_deal_chunk + GROUP BY id + HAVING + COUNT(*) = COUNT(*) FILTER ( + WHERE complete = TRUE + AND finalize = TRUE + AND finalize_task_id IS NULL + AND ref_id IS NOT NULL + ) + ORDER BY id + LIMIT 1;`).Scan(&mid, &count) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, nil + } + return false, xerrors.Errorf("getting next task to schedule: %w", err) + } + if mid == "" { + return false, xerrors.Errorf("no id for tasks to schedule") + } + + n, err := tx.Exec(`UPDATE market_mk20_deal_chunk SET finalize_task_id = $1 + WHERE id = $2 + AND complete = TRUE + AND finalize = TRUE + AND finalize_task_id IS NULL + AND ref_id IS NOT NULL`, id, mid) + if err != nil { + return false, xerrors.Errorf("updating chunk finalize task: %w", err) + } + if n != count { + return false, xerrors.Errorf("expected to update %d rows: %d rows affected", count, n) + } + stop = false + return true, nil + }) + } + return nil +} + +func (a *AggregateChunksTask) Adder(taskFunc harmonytask.AddTaskFunc) {} + +var _ = harmonytask.Reg(&AggregateChunksTask{}) +var _ harmonytask.TaskInterface = &AggregateChunksTask{} diff --git a/tasks/piece/task_park_piece.go b/tasks/piece/task_park_piece.go index 81625f04f..b6a65ed8a 100644 --- a/tasks/piece/task_park_piece.go +++ b/tasks/piece/task_park_piece.go @@ -46,8 +46,8 @@ type ParkPieceTask struct { p2Active func() bool } -func NewParkPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, max int, maxInPark int, p2Active func() bool, minFreeStoragePercent float64) (*ParkPieceTask, error) { - return newPieceTask(db, sc, nil, max, maxInPark, false, p2Active, minFreeStoragePercent) +func NewParkPieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int, maxInPark int, p2Active func() bool, minFreeStoragePercent float64) (*ParkPieceTask, error) { + return newPieceTask(db, sc, remote, max, maxInPark, false, p2Active, minFreeStoragePercent) } func NewStorePieceTask(db *harmonydb.DB, sc *ffi2.SealCalls, remote *paths.Remote, max int) (*ParkPieceTask, error) { @@ -84,6 +84,7 @@ func (p *ParkPieceTask) pollPieceTasks(ctx context.Context) { FROM parked_pieces WHERE long_term = $1 AND complete = FALSE + AND skip = FALSE AND task_id IS NULL `, p.longTerm) if err != nil { @@ -104,7 +105,7 @@ func (p *ParkPieceTask) pollPieceTasks(ctx context.Context) { p.TF.Val(ctx)(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, err error) { // Update n, err := tx.Exec( - `UPDATE parked_pieces SET task_id = $1 WHERE id = $2 AND complete = FALSE AND task_id IS NULL AND long_term = $3`, + `UPDATE parked_pieces SET task_id = $1 WHERE id = $2 AND complete = FALSE AND skip = FALSE AND task_id IS NULL AND long_term = $3`, id, pieceID.ID, p.longTerm) if err != nil { return false, xerrors.Errorf("updating parked piece: %w", err) diff --git a/tasks/seal/finalize_pieces.go b/tasks/seal/finalize_pieces.go index de94df8e5..35f4d9939 100644 --- a/tasks/seal/finalize_pieces.go +++ b/tasks/seal/finalize_pieces.go @@ -38,7 +38,7 @@ func DropSectorPieceRefs(ctx context.Context, db *harmonydb.DB, sid abi.SectorID continue } - n, err := db.Exec(ctx, `DELETE FROM parked_piece_refs WHERE ref_id = $1`, refID) + n, err := db.Exec(ctx, `DELETE FROM parked_piece_refs WHERE ref_id = $1 AND long_term = FALSE`, refID) if err != nil { log.Errorw("failed to delete piece ref", "url", pu.URL, "error", err, "miner", sid.Miner, "sector", sid.Number) } diff --git a/tasks/seal/poller_commit_msg.go b/tasks/seal/poller_commit_msg.go index 312162248..68ddc65ae 100644 --- a/tasks/seal/poller_commit_msg.go +++ b/tasks/seal/poller_commit_msg.go @@ -161,7 +161,14 @@ func (s *SealPoller) pollCommitMsgLanded(ctx context.Context, task pollTask) err if err != nil { return false, xerrors.Errorf("update market_mk12_deal_pipeline: %w", err) } - log.Debugw("marked deals as sealed", "sp", task.SpID, "sector", task.SectorNumber, "count", n) + log.Debugw("marked mk12 deals as sealed", "sp", task.SpID, "sector", task.SectorNumber, "count", n) + + n, err = tx.Exec(`UPDATE market_mk20_pipeline SET sealed = TRUE WHERE sp_id = $1 AND sector = $2 AND sealed = FALSE`, task.SpID, task.SectorNumber) + if err != nil { + return false, xerrors.Errorf("update market_mk20_pipeline: %w", err) + } + log.Debugw("marked mk20 deals as sealed", "sp", task.SpID, "sector", task.SectorNumber, "count", n) + return true, nil } } diff --git a/tasks/seal/task_movestorage.go b/tasks/seal/task_movestorage.go index 05e4272fc..74fd43a8f 100644 --- a/tasks/seal/task_movestorage.go +++ b/tasks/seal/task_movestorage.go @@ -68,10 +68,20 @@ func (m *MoveStorageTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) } _, err = m.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { - // Create a indexing task - _, err = tx.Exec(`SELECT create_indexing_task($1, $2)`, taskID, "sectors_sdr_pipeline") + // Set indexing_created_at to Now() to allow new indexing tasks + _, err = tx.Exec(`UPDATE market_mk20_pipeline + SET indexing_created_at = NOW() + WHERE sp_id = $1 AND sector = $2;`, task.SpID, task.SectorNumber) if err != nil { - return false, fmt.Errorf("error creating indexing task: %w", err) + return false, fmt.Errorf("error creating indexing task for mk20 deals: %w", err) + } + + _, err = tx.Exec(`UPDATE market_mk12_deal_pipeline + SET indexing_created_at = NOW() + WHERE sp_id = $1 AND sector = $2; + `, task.SpID, task.SectorNumber) + if err != nil { + return false, fmt.Errorf("error creating indexing task for mk12: %w", err) } _, err = tx.Exec(`UPDATE sectors_sdr_pipeline SET after_move_storage = TRUE, task_id_move_storage = NULL WHERE task_id_move_storage = $1`, taskID) diff --git a/tasks/snap/task_movestorage.go b/tasks/snap/task_movestorage.go index e76b10c68..2fc1958d3 100644 --- a/tasks/snap/task_movestorage.go +++ b/tasks/snap/task_movestorage.go @@ -71,10 +71,20 @@ func (m *MoveStorageTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) } _, err = m.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { - // Create an indexing task - _, err = tx.Exec(`SELECT create_indexing_task($1, $2)`, taskID, "sectors_snap_pipeline") + // Set indexing_created_at to Now() to allow new indexing tasks + _, err = tx.Exec(`UPDATE market_mk20_pipeline + SET indexing_created_at = NOW() + WHERE sp_id = $1 AND sector = $2;`, task.SpID, task.SectorNumber) if err != nil { - return false, fmt.Errorf("error creating indexing task: %w", err) + return false, fmt.Errorf("error creating indexing task for mk20 deals: %w", err) + } + + _, err = tx.Exec(`UPDATE market_mk12_deal_pipeline + SET indexing_created_at = NOW() + WHERE sp_id = $1 AND sector = $2; + `, task.SpID, task.SectorNumber) + if err != nil { + return false, fmt.Errorf("error creating indexing task for mk12 deals: %w", err) } _, err = tx.Exec(`UPDATE sectors_snap_pipeline SET after_move_storage = TRUE, task_id_move_storage = NULL WHERE task_id_move_storage = $1`, taskID) diff --git a/tasks/snap/task_submit.go b/tasks/snap/task_submit.go index 4586b6376..2ec03c741 100644 --- a/tasks/snap/task_submit.go +++ b/tasks/snap/task_submit.go @@ -813,7 +813,13 @@ func (s *SubmitTask) updateLanded(ctx context.Context, tx *harmonydb.Tx, spId, s if err != nil { return xerrors.Errorf("update market_mk12_deal_pipeline: %w", err) } - log.Debugw("marked deals as sealed", "sp", spId, "sector", sectorNum, "count", n) + log.Debugw("marked mk12 deals as sealed", "sp", spId, "sector", sectorNum, "count", n) + + n, err = tx.Exec(`UPDATE market_mk20_pipeline SET sealed = TRUE WHERE sp_id = $1 AND sector = $2 AND sealed = FALSE`, spId, sectorNum) + if err != nil { + return xerrors.Errorf("update market_mk20_pipeline: %w", err) + } + log.Debugw("marked mk20 deals as sealed", "sp", spId, "sector", sectorNum, "count", n) } } diff --git a/tasks/storage-market/market_balance.go b/tasks/storage-market/market_balance.go deleted file mode 100644 index c31a5d6d0..000000000 --- a/tasks/storage-market/market_balance.go +++ /dev/null @@ -1,201 +0,0 @@ -package storage_market - -import ( - "context" - "time" - - logging "github.com/ipfs/go-log/v2" - "github.com/samber/lo" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/curio/deps/config" - "github.com/filecoin-project/curio/harmony/harmonytask" - "github.com/filecoin-project/curio/harmony/resources" - "github.com/filecoin-project/curio/harmony/taskhelp" - "github.com/filecoin-project/curio/tasks/message" - - lapi "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/chain/actors" - marketActor "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/types" -) - -const BalanceCheckInterval = 5 * time.Minute - -var blog = logging.Logger("balancemgr") - -type mbalanceApi interface { - ChainHead(ctx context.Context) (*types.TipSet, error) - StateMarketBalance(context.Context, address.Address, types.TipSetKey) (lapi.MarketBalance, error) - StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) -} - -type BalanceManager struct { - api mbalanceApi - miners map[string][]address.Address - cfg *config.CurioConfig - sender *message.Sender - bmcfg map[address.Address]config.BalanceManagerConfig -} - -func NewBalanceManager(api mbalanceApi, miners []address.Address, cfg *config.CurioConfig, sender *message.Sender) (*BalanceManager, error) { - var disabledMiners []address.Address - - for _, m := range cfg.Market.StorageMarketConfig.MK12.DisabledMiners { - maddr, err := address.NewFromString(m) - if err != nil { - return nil, xerrors.Errorf("failed to parse miner string: %s", err) - } - disabledMiners = append(disabledMiners, maddr) - } - - enabled, _ := lo.Difference(miners, disabledMiners) - - mmap := make(map[string][]address.Address) - mmap[mk12Str] = enabled - bmcfg := make(map[address.Address]config.BalanceManagerConfig) - for _, a := range cfg.Addresses { - if len(a.MinerAddresses) > 0 { - for _, m := range a.MinerAddresses { - maddr, err := address.NewFromString(m) - if err != nil { - return nil, xerrors.Errorf("failed to parse miner string: %s", err) - } - bmcfg[maddr] = a.BalanceManager - } - } - } - - return &BalanceManager{ - api: api, - cfg: cfg, - miners: mmap, - sender: sender, - bmcfg: bmcfg, - }, nil -} - -func (m *BalanceManager) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { - ctx := context.Background() - - err = m.dealMarketBalance(ctx) - if err != nil { - return false, err - } - - return true, nil -} - -func (m *BalanceManager) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { - id := ids[0] - return &id, nil -} - -func (m *BalanceManager) TypeDetails() harmonytask.TaskTypeDetails { - return harmonytask.TaskTypeDetails{ - Max: taskhelp.Max(1), - Name: "BalanceManager", - Cost: resources.Resources{ - Cpu: 1, - Ram: 64 << 20, - Gpu: 0, - }, - IAmBored: harmonytask.SingletonTaskAdder(BalanceCheckInterval, m), - } -} - -func (m *BalanceManager) Adder(taskFunc harmonytask.AddTaskFunc) {} - -var _ harmonytask.TaskInterface = &BalanceManager{} -var _ = harmonytask.Reg(&BalanceManager{}) - -func (m *BalanceManager) dealMarketBalance(ctx context.Context) error { - - for module, miners := range m.miners { - if module != mk12Str { - continue - } - for _, miner := range miners { - miner := miner - - lowthreshold := abi.TokenAmount(m.bmcfg[miner].MK12Collateral.CollateralLowThreshold) - highthreshold := abi.TokenAmount(m.bmcfg[miner].MK12Collateral.CollateralHighThreshold) - - if m.bmcfg[miner].MK12Collateral.DealCollateralWallet == "" { - blog.Errorf("Deal collateral wallet is not set for miner %s", miner.String()) - continue - } - - wallet, err := address.NewFromString(m.bmcfg[miner].MK12Collateral.DealCollateralWallet) - if err != nil { - return xerrors.Errorf("failed to parse deal collateral wallet: %w", err) - } - - w, err := m.api.StateGetActor(ctx, wallet, types.EmptyTSK) - if err != nil { - return xerrors.Errorf("failed to get wallet actor: %w", err) - } - - wbal := w.Balance - - // Check head in loop in case it changes and wallet balance changes - head, err := m.api.ChainHead(ctx) - if err != nil { - return xerrors.Errorf("failed to get chain head: %w", err) - } - - bal, err := m.api.StateMarketBalance(ctx, miner, head.Key()) - if err != nil { - return xerrors.Errorf("failed to get market balance: %w", err) - } - - avail := big.Sub(bal.Escrow, bal.Locked) - - if avail.GreaterThan(lowthreshold) { - blog.Debugf("Skipping add balance for miner %s, available balance is %s, threshold is %s", miner.String(), avail.String(), lowthreshold.String()) - continue - } - - amount := big.Sub(highthreshold, avail) - - if wbal.LessThan(amount) { - return xerrors.Errorf("Worker wallet balance %s is lower than specified amount %s", wbal.String(), amount.String()) - } - - params, err := actors.SerializeParams(&miner) - if err != nil { - return xerrors.Errorf("failed to serialize miner address: %w", err) - } - - maxfee, err := types.ParseFIL("0.05 FIL") - if err != nil { - return xerrors.Errorf("failed to parse max fee: %w", err) - } - - msp := &lapi.MessageSendSpec{ - MaxFee: abi.TokenAmount(maxfee), - } - - msg := &types.Message{ - To: marketActor.Address, - From: wallet, - Value: amount, - Method: marketActor.Methods.AddBalance, - Params: params, - } - - mcid, err := m.sender.Send(ctx, msg, msp, "add-market-collateral") - if err != nil { - return xerrors.Errorf("failed to send message: %w", err) - } - - blog.Debugf("sent message %s to add collateral to miner %s", mcid.String(), miner.String()) - } - } - - return nil -} diff --git a/tasks/storage-market/mk20.go b/tasks/storage-market/mk20.go new file mode 100644 index 000000000..ef216e879 --- /dev/null +++ b/tasks/storage-market/mk20.go @@ -0,0 +1,1254 @@ +package storage_market + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/url" + "runtime" + "strconv" + "time" + + "github.com/ipfs/go-cid" + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-padreader" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/builtin" + verifreg13 "github.com/filecoin-project/go-state-types/builtin/v13/verifreg" + "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/lib/commcidv2" + "github.com/filecoin-project/curio/market/mk20" + + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/proofs" + "github.com/filecoin-project/lotus/chain/types" + lpiece "github.com/filecoin-project/lotus/storage/pipeline/piece" +) + +type MK20PipelinePiece struct { + ID string `db:"id"` + SPID int64 `db:"sp_id"` + Client string `db:"client"` + Contract string `db:"contract"` + PieceCIDV2 string `db:"piece_cid_v2"` + PieceCID string `db:"piece_cid"` + PieceSize int64 `db:"piece_size"` + RawSize int64 `db:"raw_size"` + Offline bool `db:"offline"` + URL *string `db:"url"` // Nullable fields use pointers + Indexing bool `db:"indexing"` + Announce bool `db:"announce"` + AllocationID *int64 `db:"allocation_id"` // Nullable fields use pointers + Duration *int64 `db:"duration"` // Nullable fields use pointers + PieceAggregation int `db:"piece_aggregation"` + + Started bool `db:"started"` + + Downloaded bool `db:"downloaded"` + + CommTaskID *int64 `db:"commp_task_id"` + AfterCommp bool `db:"after_commp"` + + DealAggregation int `db:"deal_aggregation"` + AggregationIndex int64 `db:"aggr_index"` + AggregationTaskID *int64 `db:"agg_task_id"` + Aggregated bool `db:"aggregated"` + + Sector *int64 `db:"sector"` // Nullable fields use pointers + RegSealProof *int `db:"reg_seal_proof"` // Nullable fields use pointers + SectorOffset *int64 `db:"sector_offset"` // Nullable fields use pointers + + IndexingCreatedAt *time.Time `db:"indexing_created_at"` // Nullable fields use pointers + IndexingTaskID *int64 `db:"indexing_task_id"` + Indexed bool `db:"indexed"` +} + +func (d *CurioStorageDealMarket) processMK20Deals(ctx context.Context) { + // Catch any panics if encountered as we are working with user provided data + defer func() { + if r := recover(); r != nil { + trace := make([]byte, 1<<16) + n := runtime.Stack(trace, false) + + log.Errorf("panic occurred: %v\n%s", r, trace[:n]) + } + }() + d.processMK20DealPieces(ctx) + //d.downloadMk20Deal(ctx) + d.processMK20DealAggregation(ctx) + d.processMK20DealIngestion(ctx) +} + +func (d *CurioStorageDealMarket) pipelineInsertLoop(ctx context.Context) { + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + d.insertDDODealInPipeline(ctx) + d.insertDealInPipelineForUpload(ctx) + } + } +} + +func (d *CurioStorageDealMarket) insertDDODealInPipeline(ctx context.Context) { + var deals []string + rows, err := d.db.Query(ctx, `SELECT id from market_mk20_pipeline_waiting`) + if err != nil { + log.Errorf("querying mk20 pipeline waiting: %s", err) + return + } + for rows.Next() { + var dealID string + err = rows.Scan(&dealID) + if err != nil { + log.Errorf("scanning mk20 pipeline waiting: %s", err) + return + } + deals = append(deals, dealID) + } + + if err := rows.Err(); err != nil { + log.Errorf("iterating over mk20 pipeline waiting: %s", err) + return + } + var dealIDs []ulid.ULID + for _, dealID := range deals { + id, err := ulid.Parse(dealID) + if err != nil { + log.Errorf("parsing deal id: %s", err) + return + } + dealIDs = append(dealIDs, id) + } + if len(dealIDs) == 0 { + return + } + for _, id := range dealIDs { + comm, err := d.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + deal, err := mk20.DealFromTX(tx, id) + if err != nil { + return false, xerrors.Errorf("getting deal from db: %w", err) + } + err = insertPiecesInTransaction(ctx, tx, deal) + if err != nil { + return false, xerrors.Errorf("inserting pieces in db: %w", err) + } + _, err = tx.Exec(`DELETE FROM market_mk20_pipeline_waiting WHERE id = $1`, id.String()) + if err != nil { + return false, xerrors.Errorf("deleting deal from mk20 pipeline waiting: %w", err) + } + return true, nil + }) + if err != nil { + log.Errorf("inserting deal in pipeline: %s", err) + continue + } + if !comm { + log.Errorf("inserting deal in pipeline: commit failed") + continue + } + } +} + +// insertDealInPipelineForUpload start processing deals which are +// 1. Waiting for data +// 2. DataSource defined +// 3. We already have the piece +// We process both DDO and PDP deal in same function +func (d *CurioStorageDealMarket) insertDealInPipelineForUpload(ctx context.Context) { + var deals []struct { + DealID string `db:"id"` + } + err := d.db.Select(ctx, &deals, `SELECT id from market_mk20_upload_waiting WHERE chunked IS NULL AND ref_id IS NULL`) + if err != nil { + log.Errorf("querying mk20 pipeline waiting upload: %s", err) + return + } + + var dealIDs []ulid.ULID + for _, deal := range deals { + id, err := ulid.Parse(deal.DealID) + if err != nil { + log.Errorf("parsing deal id: %s", err) + return + } + dealIDs = append(dealIDs, id) + } + if len(dealIDs) == 0 { + return + } + + for _, id := range dealIDs { + _, err = d.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + deal, err := mk20.DealFromTX(tx, id) + if err != nil { + return false, xerrors.Errorf("getting deal from db: %w", err) + } + + if deal.Data == nil { + return false, nil + } + + pi, err := deal.PieceInfo() + if err != nil { + return false, xerrors.Errorf("getting piece info: %w", err) + } + + var pieceID int64 + // Check if already have the piece and save the user trouble to upload + err = tx.QueryRow(`SELECT id FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2`, pi.PieceCIDV1.String(), pi.Size).Scan(&pieceID) + + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + // We don't have the piece, let user upload + return false, nil + } else { + // Some other error occurred during select + return false, xerrors.Errorf("checking existing parked piece: %w", err) + } + } + + retv := deal.Products.RetrievalV1 + data := deal.Data + + aggregation := 0 + if data.Format.Aggregate != nil { + aggregation = int(data.Format.Aggregate.Type) + } + + spid, err := address.IDFromAddress(deal.Products.DDOV1.Provider) + if err != nil { + return false, fmt.Errorf("getting provider ID: %w", err) + } + + var comm bool + + // Insert DDO deal if present + if deal.Products.DDOV1 != nil { + ddo := deal.Products.DDOV1 + + var allocationID interface{} + if ddo.AllocationId != nil { + allocationID = *ddo.AllocationId + } else { + allocationID = nil + } + + // If we have the piece then create reference and insert in pipeline + var pieceRefID int64 + err = tx.QueryRow(` + INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, TRUE) RETURNING ref_id`, pieceID, "/PUT").Scan(&pieceRefID) + if err != nil { + return false, fmt.Errorf("failed to create parked_piece_refs entry: %w", err) + } + + pieceIDUrl := url.URL{ + Scheme: "pieceref", + Opaque: fmt.Sprintf("%d", pieceRefID), + } + + n, err := tx.Exec(`INSERT INTO market_mk20_pipeline ( + id, sp_id, contract, client, piece_cid_v2, piece_cid, piece_size, raw_size, url, + offline, indexing, announce, allocation_id, duration, + piece_aggregation, deal_aggregation, started, downloaded, after_commp, aggregated) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, TRUE, TRUE, TRUE, TRUE)`, + id, spid, ddo.ContractAddress, deal.Client, deal.Data.PieceCID.String(), pi.PieceCIDV1.String(), pi.Size, pi.RawSize, pieceIDUrl.String(), + false, retv.Indexing, retv.AnnouncePayload, allocationID, ddo.Duration, + 0, aggregation) + if err != nil { + return false, xerrors.Errorf("inserting piece in mk20 pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting piece in mk20 pipeline: %d rows affected", n) + } + + comm = true + } + + if deal.Products.PDPV1 != nil { + pdp := deal.Products.PDPV1 + + // If we have the piece then create reference and insert in pipeline + var pieceRefID int64 + err = tx.QueryRow(` + INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, TRUE) RETURNING ref_id`, pieceID, "/PUT").Scan(&pieceRefID) + if err != nil { + return false, fmt.Errorf("failed to create parked_piece_refs entry: %w", err) + } + + n, err := tx.Exec(`INSERT INTO pdp_pipeline ( + id, client, piece_cid_v2, data_set_id, extra_data, piece_ref, + downloaded, deal_aggregation, aggr_index, aggregated, indexing, announce, announce_payload, after_commp) + VALUES ($1, $2, $3, $4, $5, $6, TRUE, $7, 0, TRUE, $8, $9, $10, TRUE)`, + id, deal.Client, deal.Data.PieceCID.String(), *pdp.DataSetID, + pdp.ExtraData, pieceRefID, aggregation, retv.Indexing, retv.AnnouncePiece, retv.AnnouncePayload) + if err != nil { + return false, xerrors.Errorf("inserting piece in PDP pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting piece in PDP pipeline: %d rows affected", n) + } + comm = true + } + + return comm, nil + }) + if err != nil { + log.Errorf("inserting upload deal in pipeline: %s", err) + continue + } + } +} + +func insertPiecesInTransaction(ctx context.Context, tx *harmonydb.Tx, deal *mk20.Deal) error { + spid, err := address.IDFromAddress(deal.Products.DDOV1.Provider) + if err != nil { + return fmt.Errorf("getting provider ID: %w", err) + } + + var rev mk20.RetrievalV1 + if deal.Products.RetrievalV1 != nil { + rev = *deal.Products.RetrievalV1 + } + ddo := deal.Products.DDOV1 + data := deal.Data + dealID := deal.Identifier.String() + pi, err := deal.PieceInfo() + if err != nil { + return fmt.Errorf("getting piece info: %w", err) + } + + var allocationID interface{} + if ddo.AllocationId != nil { + allocationID = *ddo.AllocationId + } else { + allocationID = nil + } + + aggregation := 0 + if data.Format.Aggregate != nil { + aggregation = int(data.Format.Aggregate.Type) + } + + // Insert pipeline when Data source is HTTP + if data.SourceHTTP != nil { + var pieceID int64 + // Attempt to select the piece ID first + err = tx.QueryRow(`SELECT id FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2`, pi.PieceCIDV1.String(), pi.Size).Scan(&pieceID) + + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + // Piece does not exist, attempt to insert + err = tx.QueryRow(` + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term) + VALUES ($1, $2, $3, TRUE) + ON CONFLICT (piece_cid, piece_padded_size, long_term, cleanup_task_id) DO NOTHING + RETURNING id`, pi.PieceCIDV1.String(), pi.Size, pi.RawSize).Scan(&pieceID) + if err != nil { + return xerrors.Errorf("inserting new parked piece and getting id: %w", err) + } + } else { + // Some other error occurred during select + return xerrors.Errorf("checking existing parked piece: %w", err) + } + } + + var refIds []int64 + + // Add parked_piece_refs + for _, src := range data.SourceHTTP.URLs { + var refID int64 + + headers, err := json.Marshal(src.Headers) + if err != nil { + return xerrors.Errorf("marshaling headers: %w", err) + } + + err = tx.QueryRow(`INSERT INTO parked_piece_refs (piece_id, data_url, data_headers, long_term) + VALUES ($1, $2, $3, TRUE) RETURNING ref_id`, pieceID, src.URL, headers).Scan(&refID) + if err != nil { + return xerrors.Errorf("inserting parked piece ref: %w", err) + } + refIds = append(refIds, refID) + } + + n, err := tx.Exec(`INSERT INTO market_mk20_download_pipeline (id, piece_cid_v2, product, ref_ids) VALUES ($1, $2, $3, $4)`, + dealID, deal.Data.PieceCID.String(), mk20.ProductNameDDOV1, refIds) + if err != nil { + return xerrors.Errorf("inserting mk20 download pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("inserting mk20 download pipeline: %d rows affected", n) + } + + n, err = tx.Exec(`INSERT INTO market_mk20_pipeline ( + id, sp_id, contract, client, piece_cid_v2, piece_cid, + piece_size, raw_size, offline, indexing, announce, + allocation_id, duration, piece_aggregation, started) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, TRUE)`, + dealID, spid, ddo.ContractAddress, deal.Client, data.PieceCID.String(), pi.PieceCIDV1.String(), + pi.Size, pi.RawSize, false, rev.Indexing, rev.AnnouncePayload, + allocationID, ddo.Duration, aggregation) + if err != nil { + return xerrors.Errorf("inserting mk20 pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("inserting mk20 pipeline: %d rows affected", n) + } + return nil + } + + // INSERT Pipeline when data source is offline + if deal.Data.SourceOffline != nil { + n, err := tx.Exec(`INSERT INTO market_mk20_pipeline ( + id, sp_id, contract, client, piece_cid_v2, piece_cid, + piece_size, raw_size, offline, indexing, announce, + allocation_id, duration, piece_aggregation) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)`, + dealID, spid, ddo.ContractAddress, deal.Client, data.PieceCID.String(), pi.PieceCIDV1.String(), + pi.Size, pi.RawSize, true, rev.Indexing, rev.AnnouncePayload, + allocationID, ddo.Duration, aggregation) + if err != nil { + return xerrors.Errorf("inserting mk20 pipeline: %w", err) + } + if n != 1 { + return xerrors.Errorf("inserting mk20 pipeline: %d rows affected", n) + } + return nil + } + + // Insert pipeline when data source is aggregate + if deal.Data.SourceAggregate != nil { + + // Find all unique pieces where data source is HTTP + type downloadkey struct { + ID string + PieceCIDV2 cid.Cid + PieceCID cid.Cid + Size abi.PaddedPieceSize + RawSize uint64 + } + toDownload := make(map[downloadkey][]mk20.HttpUrl) + + for _, piece := range deal.Data.SourceAggregate.Pieces { + spi, err := mk20.GetPieceInfo(piece.PieceCID) + if err != nil { + return xerrors.Errorf("getting piece info: %w", err) + } + if piece.SourceHTTP != nil { + urls, ok := toDownload[downloadkey{ID: dealID, PieceCIDV2: piece.PieceCID, PieceCID: spi.PieceCIDV1, Size: spi.Size, RawSize: spi.RawSize}] + if ok { + toDownload[downloadkey{ID: dealID, PieceCIDV2: piece.PieceCID, PieceCID: spi.PieceCIDV1, Size: spi.Size}] = append(urls, piece.SourceHTTP.URLs...) + } else { + toDownload[downloadkey{ID: dealID, PieceCIDV2: piece.PieceCID, PieceCID: spi.PieceCIDV1, Size: spi.Size, RawSize: spi.RawSize}] = piece.SourceHTTP.URLs + } + } + } + + batch := &pgx.Batch{} + batchSize := 5000 + + for k, v := range toDownload { + for _, src := range v { + headers, err := json.Marshal(src.Headers) + if err != nil { + return xerrors.Errorf("marshal headers: %w", err) + } + batch.Queue(`WITH inserted_piece AS ( + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term) + VALUES ($1, $2, $3, FALSE) + ON CONFLICT (piece_cid, piece_padded_size, long_term, cleanup_task_id) DO NOTHING + RETURNING id + ), + selected_piece AS ( + SELECT COALESCE( + (SELECT id FROM inserted_piece), + (SELECT id FROM parked_pieces + WHERE piece_cid = $1 AND piece_padded_size = $2 AND long_term = FALSE AND cleanup_task_id IS NULL) + ) AS id + ), + inserted_ref AS ( + INSERT INTO parked_piece_refs (piece_id, data_url, data_headers, long_term) + SELECT id, $4, $5, FALSE FROM selected_piece + RETURNING ref_id + ) + INSERT INTO market_mk20_download_pipeline (id, piece_cid_v2, product, ref_ids) + VALUES ($6, $8, $7, ARRAY[(SELECT ref_id FROM inserted_ref)]) + ON CONFLICT (id, piece_cid_v2, product) DO UPDATE + SET ref_ids = array_append( + market_mk20_download_pipeline.ref_ids, + (SELECT ref_id FROM inserted_ref) + ) + WHERE NOT market_mk20_download_pipeline.ref_ids @> ARRAY[(SELECT ref_id FROM inserted_ref)];`, + k.PieceCID.String(), k.Size, k.RawSize, src.URL, headers, k.ID, mk20.ProductNameDDOV1, k.PieceCIDV2.String()) + } + + if batch.Len() > batchSize { + res := tx.SendBatch(ctx, batch) + if err := res.Close(); err != nil { + return xerrors.Errorf("closing parked piece query batch: %w", err) + } + batch = &pgx.Batch{} + } + } + + if batch.Len() > 0 { + res := tx.SendBatch(ctx, batch) + if err := res.Close(); err != nil { + return xerrors.Errorf("closing parked piece query batch: %w", err) + } + } + + pBatch := &pgx.Batch{} + pBatchSize := 4000 + for i, piece := range deal.Data.SourceAggregate.Pieces { + var offline bool + if piece.SourceOffline != nil { + offline = true + } + spi, err := mk20.GetPieceInfo(piece.PieceCID) + if err != nil { + return xerrors.Errorf("getting piece info: %w", err) + } + pBatch.Queue(`INSERT INTO market_mk20_pipeline (id, sp_id, contract, client, piece_cid_v2, piece_cid, + piece_size, raw_size, offline, indexing, announce, allocation_id, duration, + piece_aggregation, deal_aggregation, aggr_index, started) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)`, + dealID, spid, ddo.ContractAddress, deal.Client, piece.PieceCID.String(), spi.PieceCIDV1.String(), + spi.Size, spi.RawSize, offline, rev.Indexing, rev.AnnouncePayload, allocationID, ddo.Duration, + 0, aggregation, i, !offline) + if pBatch.Len() > pBatchSize { + res := tx.SendBatch(ctx, pBatch) + if err := res.Close(); err != nil { + return xerrors.Errorf("closing mk20 pipeline insert batch: %w", err) + } + pBatch = &pgx.Batch{} + } + } + if pBatch.Len() > 0 { + res := tx.SendBatch(ctx, pBatch) + if err := res.Close(); err != nil { + return xerrors.Errorf("closing mk20 pipeline insert batch: %w", err) + } + } + return nil + } + + return xerrors.Errorf("unknown data source type") +} + +func (d *CurioStorageDealMarket) processMK20DealPieces(ctx context.Context) { + var pieces []MK20PipelinePiece + err := d.db.Select(ctx, &pieces, `SELECT + id, + sp_id, + contract, + client, + piece_cid_v2, + piece_cid, + piece_size, + raw_size, + offline, + url, + indexing, + announce, + allocation_id, + duration, + piece_aggregation, + started, + downloaded, + commp_task_id, + after_commp, + deal_aggregation, + aggr_index, + agg_task_id, + aggregated, + sector, + reg_seal_proof, + sector_offset, + indexing_created_at, + indexing_task_id, + indexed + FROM + market_mk20_pipeline + WHERE complete = false ORDER BY created_at ASC; + `) + if err != nil { + log.Errorw("failed to get deals from DB", "error", err) + return + } + + for _, piece := range pieces { + err := d.processMk20Pieces(ctx, piece) + if err != nil { + log.Errorw("failed to process deal", "ID", piece.ID, "SP", piece.SPID, "Contract", piece.Contract, "Piece CID", piece.PieceCID, "Piece Size", piece.PieceSize, "error", err) + continue + } + } + +} + +func (d *CurioStorageDealMarket) processMk20Pieces(ctx context.Context, piece MK20PipelinePiece) error { + err := d.downloadMk20Deal(ctx, piece) + if err != nil { + return err + } + + err = d.findOfflineURLMk20Deal(ctx, piece) + if err != nil { + return err + } + + err = d.createCommPMk20Piece(ctx, piece) + if err != nil { + return err + } + + err = d.addDealOffset(ctx, piece) + if err != nil { + return err + } + + return nil +} + +// downloadMk20Deal handles the downloading process of an MK20 pipeline piece by scheduling it in the database and updating its status. +// If the pieces are part of an aggregation deal then we download for short term otherwise, +// we download for long term to avoid the need to have unsealed copy +func (d *CurioStorageDealMarket) downloadMk20Deal(ctx context.Context, piece MK20PipelinePiece) error { + n, err := d.db.Exec(ctx, `SELECT mk20_ddo_mark_downloaded($1)`, mk20.ProductNameDDOV1) + if err != nil { + log.Errorf("failed to mark PDP downloaded piece: %v", err) + } + log.Debugf("Succesfully marked %d PDP pieces as downloaded", n) + + //if !piece.Downloaded && piece.Started { + // _, err := d.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // var refid int64 + // err = tx.QueryRow(`SELECT u.ref_id FROM ( + // SELECT unnest(dp.ref_ids) AS ref_id + // FROM market_mk20_download_pipeline dp + // WHERE dp.id = $1 AND dp.piece_cid_v2 = $2 AND dp.product = $3 + // ) u + // JOIN parked_piece_refs pr ON pr.ref_id = u.ref_id + // JOIN parked_pieces pp ON pp.id = pr.piece_id + // WHERE pp.complete = TRUE + // LIMIT 1;`, piece.ID, piece.PieceCIDV2, mk20.ProductNameDDOV1).Scan(&refid) + // if err != nil { + // if errors.Is(err, pgx.ErrNoRows) { + // return false, nil + // } + // return false, xerrors.Errorf("failed to check if the piece is downloaded: %w", err) + // } + // + // // Remove other ref_ids from piece_park_refs + // _, err = tx.Exec(`DELETE FROM parked_piece_refs + // WHERE ref_id IN ( + // SELECT unnest(dp.ref_ids) + // FROM market_mk20_download_pipeline dp + // WHERE dp.id = $1 AND dp.piece_cid_v2 = $2 AND dp.product = $3 + // ) + // AND ref_id != $4;`, piece.ID, piece.PieceCIDV2, mk20.ProductNameDDOV1, refid) + // if err != nil { + // return false, xerrors.Errorf("failed to remove other ref_ids from piece_park_refs: %w", err) + // } + // + // _, err = tx.Exec(`DELETE FROM market_mk20_download_pipeline WHERE id = $1 AND piece_cid_v2 = $2 AND product = $3;`, + // piece.ID, piece.PieceCIDV2, mk20.ProductNameDDOV1) + // if err != nil { + // return false, xerrors.Errorf("failed to delete piece from download table: %w", err) + // } + // + // pieceIDUrl := url.URL{ + // Scheme: "pieceref", + // Opaque: fmt.Sprintf("%d", refid), + // } + // + // _, err = tx.Exec(`UPDATE market_mk20_pipeline SET downloaded = TRUE, url = $1 + // WHERE id = $2 + // AND piece_cid = $3 + // AND piece_size = $4`, + // pieceIDUrl.String(), piece.ID, piece.PieceCID, piece.PieceSize) + // if err != nil { + // return false, xerrors.Errorf("failed to update pipeline piece table: %w", err) + // } + // piece.Downloaded = true + // return true, nil + // }, harmonydb.OptionRetry()) + // + // if err != nil { + // return xerrors.Errorf("failed to schedule the deal for download: %w", err) + // } + //} + return nil +} + +// findOfflineURLMk20Deal find the URL for offline piece. In MK20, we don't work directly with remote pieces, we download them +// locally and then decide to aggregate, long term or remove them +func (d *CurioStorageDealMarket) findOfflineURLMk20Deal(ctx context.Context, piece MK20PipelinePiece) error { + if piece.Offline && !piece.Downloaded && !piece.Started { + comm, err := d.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + var updated bool + err = tx.QueryRow(`SELECT process_offline_download($1, $2, $3, $4, $5)`, piece.ID, piece.PieceCIDV2, piece.PieceCID, piece.PieceSize, mk20.ProductNameDDOV1).Scan(&updated) + if err != nil { + if !errors.Is(err, pgx.ErrNoRows) { + return false, xerrors.Errorf("failed to start download for offline deal %s: %w", piece.ID, err) + } + } + + if updated { + return true, nil + } + + // Check if We can find the URL for this piece on remote servers + for rUrl, headers := range d.urls { + // Create a new HTTP request + urlString := fmt.Sprintf("%s?id=%s", rUrl, piece.PieceCIDV2) + req, err := http.NewRequest(http.MethodHead, urlString, nil) + if err != nil { + return false, xerrors.Errorf("error creating request: %w", err) + } + + req.Header = headers + + // Create a client and make the request + client := &http.Client{ + Timeout: 10 * time.Second, + } + resp, err := client.Do(req) + if err != nil { + return false, xerrors.Errorf("error making GET request: %w", err) + } + + // Check the response code for 404 + if resp.StatusCode != http.StatusOK { + if resp.StatusCode != 404 { + return false, xerrors.Errorf("not ok response from HTTP server: %s", resp.Status) + } + continue + } + + hdrs, err := json.Marshal(headers) + if err != nil { + return false, xerrors.Errorf("marshaling headers: %w", err) + } + + rawSizeStr := resp.Header.Get("Content-Length") + if rawSizeStr == "" { + continue + } + rawSize, err := strconv.ParseInt(rawSizeStr, 10, 64) + if err != nil { + return false, xerrors.Errorf("failed to parse the raw size: %w", err) + } + + if rawSize != piece.RawSize { + continue + } + + if abi.PaddedPieceSize(piece.PieceSize) != padreader.PaddedSize(uint64(rawSize)).Padded() { + continue + } + + _, err = tx.Exec(`WITH pipeline_piece AS ( + SELECT id, piece_cid, piece_size, deal_aggregation + FROM market_mk20_pipeline + WHERE id = $1 AND piece_cid = $2 AND piece_size = $3 + ), + existing_piece AS ( + SELECT id AS piece_id + FROM parked_pieces + WHERE piece_cid = $2 AND piece_padded_size = $3 + ), + inserted_piece AS ( + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term) + SELECT $2, $3, $4, NOT (p.deal_aggregation > 0) + FROM pipeline_piece p + WHERE NOT EXISTS (SELECT 1 FROM existing_piece) + RETURNING id AS piece_id + ), + selected_piece AS ( + SELECT piece_id FROM existing_piece + UNION ALL + SELECT piece_id FROM inserted_piece + ), + inserted_ref AS ( + INSERT INTO parked_piece_refs (piece_id, data_url, data_headers, long_term) + SELECT + s.piece_id, + $5, + $6, + NOT (p.deal_aggregation > 0) + FROM selected_piece s + JOIN pipeline_piece p ON true + RETURNING ref_id + ), + upsert_pipeline AS ( + INSERT INTO market_mk20_download_pipeline (id, piece_cid_v2, product, ref_ids) + SELECT $1, $8, $7, array_agg(ref_id) + FROM inserted_ref + ON CONFLICT (id, piece_cid_v2, product) DO UPDATE + SET ref_ids = ( + SELECT array( + SELECT DISTINCT r + FROM unnest(market_mk20_download_pipeline.ref_ids || excluded.ref_ids) AS r + ) + ) + ) + UPDATE market_mk20_pipeline + SET started = TRUE + WHERE id = $1 AND piece_cid = $2 AND piece_size = $3 AND started = FALSE;`, + piece.ID, piece.PieceCID, piece.PieceSize, rawSize, urlString, hdrs, mk20.ProductNameDDOV1, piece.PieceCIDV2) + if err != nil { + return false, xerrors.Errorf("failed to start download for offline deal using PieceLocator: %w", err) + } + + return true, nil + } + return false, nil + + }, harmonydb.OptionRetry()) + if err != nil { + return xerrors.Errorf("deal %s: %w", piece.ID, err) + } + + if comm { + log.Infow("URL attached for offline deal piece", "deal piece", piece) + } + } + + return nil +} + +// createCommPMk20Piece handles the creation of a CommP task for an MK20 pipeline piece, updating its status based on piece attributes. +func (d *CurioStorageDealMarket) createCommPMk20Piece(ctx context.Context, piece MK20PipelinePiece) error { + if piece.Downloaded && !piece.AfterCommp && piece.CommTaskID == nil { + // Skip commP is configured to do so + if d.cfg.Market.StorageMarketConfig.MK20.SkipCommP { + _, err := d.db.Exec(ctx, `UPDATE market_mk20_pipeline SET after_commp = TRUE, commp_task_id = NULL + WHERE id = $1 + AND sp_id = $2 + AND piece_cid = $3 + AND piece_size = $4 + AND raw_size = $5 + AND aggr_index = $6 + AND downloaded = TRUE + AND after_commp = FALSE`, piece.ID, piece.SPID, piece.PieceCID, piece.PieceSize, piece.RawSize, piece.AggregationIndex) + if err != nil { + return xerrors.Errorf("marking piece as after commP: %w", err) + } + log.Debugw("commP skipped successfully", "deal piece", piece) + return nil + } + + if d.adders[pollerCommP].IsSet() { + d.adders[pollerCommP].Val(ctx)(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, err error) { + // update + n, err := tx.Exec(`UPDATE market_mk20_pipeline SET commp_task_id = $1 + WHERE id = $2 + AND sp_id = $3 + AND piece_cid = $4 + AND piece_size = $5 + AND raw_size = $6 + AND aggr_index = $7 + AND downloaded = TRUE + AND after_commp = FALSE + AND commp_task_id IS NULL`, id, piece.ID, piece.SPID, piece.PieceCID, piece.PieceSize, piece.RawSize, piece.AggregationIndex) + if err != nil { + return false, xerrors.Errorf("creating commP task for deal piece: %w", err) + } + + if n > 0 { + log.Debugw("commP task created successfully", "deal piece", piece) + } + + // commit only if we updated the piece + return n > 0, nil + }) + } + + return nil + } + return nil +} + +func (d *CurioStorageDealMarket) addDealOffset(ctx context.Context, piece MK20PipelinePiece) error { + // Get the deal offset if sector has started sealing + if piece.Sector != nil && piece.RegSealProof != nil && piece.SectorOffset == nil { + _, err := d.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + type pieces struct { + Cid string `db:"piece_cid"` + Size abi.PaddedPieceSize `db:"piece_size"` + Index int64 `db:"piece_index"` + } + + var pieceList []pieces + err = tx.Select(&pieceList, `SELECT piece_cid, piece_size, piece_index + FROM sectors_sdr_initial_pieces + WHERE sp_id = $1 AND sector_number = $2 + + UNION ALL + + SELECT piece_cid, piece_size, piece_index + FROM sectors_snap_initial_pieces + WHERE sp_id = $1 AND sector_number = $2 + + ORDER BY piece_index ASC;`, piece.SPID, piece.Sector) + if err != nil { + return false, xerrors.Errorf("getting pieces for sector: %w", err) + } + + if len(pieceList) == 0 { + // Sector might be waiting for more deals + return false, nil + } + + var offset abi.UnpaddedPieceSize + + for _, p := range pieceList { + _, padLength := proofs.GetRequiredPadding(offset.Padded(), p.Size) + offset += padLength.Unpadded() + if p.Cid == piece.PieceCID && p.Size == abi.PaddedPieceSize(piece.PieceSize) { + n, err := tx.Exec(`UPDATE market_mk20_pipeline SET sector_offset = $1 WHERE id = $2 AND sector = $3 AND sector_offset IS NULL`, offset.Padded(), piece.ID, piece.Sector) + if err != nil { + return false, xerrors.Errorf("updating deal offset: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected to update 1 deal, updated %d", n) + } + offset += p.Size.Unpadded() + return true, nil + } + + } + return false, xerrors.Errorf("failed to find deal offset for piece %s", piece.PieceCID) + }, harmonydb.OptionRetry()) + if err != nil { + return xerrors.Errorf("failed to get deal offset: %w", err) + } + } + return nil +} + +func (d *CurioStorageDealMarket) processMK20DealAggregation(ctx context.Context) { + if !d.adders[pollerAggregate].IsSet() { + return + } + + var deals []struct { + ID string `db:"id"` + Count int `db:"count"` + } + + err := d.db.Select(ctx, &deals, `SELECT id, COUNT(*) AS count + FROM market_mk20_pipeline + GROUP BY id + HAVING bool_and(after_commp) + AND bool_and(NOT aggregated) + AND bool_and(agg_task_id IS NULL);`) + if err != nil { + log.Errorf("getting deals to aggregate: %w", err) + return + } + + for _, deal := range deals { + log.Infow("processing aggregation task", "deal", deal.ID, "count", deal.Count) + d.adders[pollerAggregate].Val(ctx)(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, err error) { + n, err := tx.Exec(`UPDATE market_mk20_pipeline SET agg_task_id = $1 + WHERE id = $2 + AND started = TRUE + AND downloaded = TRUE + AND after_commp = TRUE + AND aggregated = FALSE + AND agg_task_id IS NULL`, id, deal.ID) + if err != nil { + return false, xerrors.Errorf("creating aggregation task for deal: %w", err) + } + + if n == deal.Count { + log.Infow("aggregation task created successfully", "deal", deal.ID) + } + + return n == deal.Count, nil + }) + } + +} + +func (d *CurioStorageDealMarket) processMK20DealIngestion(ctx context.Context) { + + head, err := d.api.ChainHead(ctx) + if err != nil { + log.Errorf("getting chain head: %w", err) + return + } + + var deals []struct { + ID string `db:"id"` + SPID int64 `db:"sp_id"` + Client string `db:"client"` + PieceCID string `db:"piece_cid"` + PieceSize int64 `db:"piece_size"` + RawSize int64 `db:"raw_size"` + AllocationID *int64 `db:"allocation_id"` + Duration int64 `db:"duration"` + Url string `db:"url"` + Count int `db:"unassigned_count"` + } + + err = d.db.Select(ctx, &deals, `SELECT + id, + MIN(sp_id) AS sp_id, + MIN(client) AS client, + MIN(piece_cid) AS piece_cid, + MIN(piece_size) AS piece_size, + MIN(raw_size) AS raw_size, + MIN(allocation_id) AS allocation_id, + MIN(duration) AS duration, + MIN(url) AS url, + COUNT(*) AS unassigned_count + FROM market_mk20_pipeline + WHERE aggregated = TRUE AND sector IS NULL + GROUP BY id;`) + if err != nil { + log.Errorf("getting deals for ingestion: %w", err) + return + } + + for _, deal := range deals { + if deal.Count != 1 { + log.Errorf("unexpected count for deal: %s", deal.ID) + continue + } + + pcid, err := cid.Parse(deal.PieceCID) + if err != nil { + log.Errorw("failed to parse aggregate piece cid", "deal", deal, "error", err) + continue + } + + client, err := address.NewFromString(deal.Client) + if err != nil { + log.Errorw("failed to parse client address", "deal", deal, "error", err) + continue + } + + clientIdAddr, err := d.api.StateLookupID(ctx, client, types.EmptyTSK) + if err != nil { + log.Errorw("failed to lookup client id", "deal", deal, "error", err) + } + + clientId, err := address.IDFromAddress(clientIdAddr) + if err != nil { + log.Errorw("failed to parse client id", "deal", deal, "error", err) + continue + } + + aurl, err := url.Parse(deal.Url) + if err != nil { + log.Errorf("failed to parse aggregate url: %w", err) + continue + } + if aurl.Scheme != "pieceref" { + log.Errorw("aggregate url is not a pieceref: %s", deal) + continue + } + + start := head.Height() + 2*builtin.EpochsInDay + end := start + abi.ChainEpoch(deal.Duration) + var vak *miner.VerifiedAllocationKey + if deal.AllocationID != nil { + alloc, err := d.api.StateGetAllocation(ctx, client, verifreg.AllocationId(*deal.AllocationID), types.EmptyTSK) + if err != nil { + log.Errorw("failed to get allocation", "deal", deal, "error", err) + continue + } + if alloc == nil { + log.Errorw("allocation not found", "deal", deal, "error", err) + continue + } + if alloc.Expiration < start { + log.Errorw("allocation expired", "deal", deal, "error", err) + continue + } + end = start + alloc.TermMin + vak = &miner.VerifiedAllocationKey{ + Client: abi.ActorID(clientId), + ID: verifreg13.AllocationId(*deal.AllocationID), + } + } + + // TODO: Attach notifications + pdi := lpiece.PieceDealInfo{ + DealSchedule: lpiece.DealSchedule{ + StartEpoch: start, + EndEpoch: end, + }, + PieceActivationManifest: &miner.PieceActivationManifest{ + CID: pcid, + Size: abi.PaddedPieceSize(deal.PieceSize), + VerifiedAllocationKey: vak, + }, + } + + maddr, err := address.NewIDAddress(uint64(deal.SPID)) + if err != nil { + log.Errorw("failed to parse miner address", "deal", deal, "error", err) + continue + } + + comm, err := d.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + sector, sp, err := d.pin.AllocatePieceToSector(ctx, tx, maddr, pdi, deal.RawSize, *aurl, nil) + if err != nil { + return false, xerrors.Errorf("failed to allocate piece to sector: %w", err) + } + + n, err := tx.Exec(`UPDATE market_mk20_pipeline SET sector = $1, reg_seal_proof = $2 WHERE id = $3`, *sector, *sp, deal.ID) + if err != nil { + return false, xerrors.Errorf("failed to update deal: %w", err) + } + + return n == 1, nil + }, harmonydb.OptionRetry()) + if err != nil { + log.Errorf("failed to commit transaction: %s", err) + continue + } + if comm { + log.Infow("deal ingested successfully", "deal", deal) + } else { + log.Infow("deal not ingested", "deal", deal) + } + } +} + +func (d *CurioStorageDealMarket) migratePieceCIDV2(ctx context.Context) { + ticker := time.NewTicker(1 * time.Hour) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + d.migratePcid(ctx) + } + } +} + +func (d *CurioStorageDealMarket) migratePcid(ctx context.Context) { + // Migrate ipni_chunks table + var pieceCIDs []struct { + PieceCID string `db:"piece_cid"` + } + err := d.db.Select(ctx, &pieceCIDs, `SELECT piece_cid FROM ipni_chunks`) + if err != nil { + log.Errorf("failed to get piece CIDs: %w", err) + return + } + + for _, pieceCID := range pieceCIDs { + pcid, err := cid.Parse(pieceCID.PieceCID) + if err != nil { + log.Errorf("failed to parse piece CID: %w", err) + continue + } + isPcid2 := commcidv2.IsPieceCidV2(pcid) + if isPcid2 { + continue + } + + comm, err := d.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // Check that table market_piece_metadata has a single entry for this piece cid + var count int + err = tx.QueryRow(`SELECT COUNT(*) AS count FROM market_piece_metadata WHERE piece_cid = $1`, pieceCID.PieceCID).Scan(&count) + if err != nil { + return false, xerrors.Errorf("failed to get piece metadata: %w", err) + } + if count != 1 { + return false, xerrors.Errorf("expected to find a single piece metadata entry for piece cid %s", pieceCID.PieceCID) + } + // Get raw size from market_piece_deal table for this piece CID + var rawSize uint64 + err = tx.QueryRow(`SELECT raw_size FROM market_piece_deal WHERE piece_cid = $1`, pieceCID.PieceCID).Scan(&rawSize) + if err != nil { + log.Errorf("failed to get piece deal: %w", err) + } + + pcid2, err := commcid.PieceCidV2FromV1(pcid, rawSize) + if err != nil { + return false, xerrors.Errorf("failed to convert to piece cid v2: %w", err) + } + + // Update ipni_chunks table with correct entry + _, err = tx.Exec(`UPDATE ipni_chunks SET piece_cid = $1 WHERE piece_cid = $2`, pcid2.String(), pieceCID.PieceCID) + if err != nil { + return false, xerrors.Errorf("failed to update ipni_chunks table: %w", err) + } + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + log.Errorf("failed to commit transaction: %s", err) + continue + } + if comm { + log.Debugw("piece CID migrated successfully", "piece CID", pieceCID.PieceCID) + } else { + log.Debugw("piece CID not migrated", "piece CID", pieceCID.PieceCID) + } + } + + // Add PieceCIDv2 to ipni table + var pieceInfos []struct { + PieceCID string `db:"piece_cid"` + Size int64 `db:"size"` + RawSize int64 `db:"raw_size"` + } + err = d.db.Select(ctx, &pieceInfos, `SELECT + i.piece_cid, + i.piece_size, + mpd.raw_size + FROM ipni AS i + JOIN LATERAL ( + SELECT d.raw_size + FROM market_piece_deal AS d + WHERE d.piece_cid = i.piece_cid + AND d.piece_length = i.piece_size + LIMIT 1 + ) AS mpd ON true + WHERE i.piece_cid_v2 IS NULL;`) + if err != nil { + log.Errorf("failed to get piece infos: %w", err) + return + } + for _, pieceInfo := range pieceInfos { + pcid, err := cid.Parse(pieceInfo.PieceCID) + if err != nil { + log.Errorf("failed to parse piece CID: %w", err) + } + + pcid2, err := commcid.PieceCidV2FromV1(pcid, uint64(pieceInfo.RawSize)) + if err != nil { + log.Errorf("failed to convert to piece cid v2: %w", err) + } + + _, err = d.db.Exec(ctx, `UPDATE ipni SET piece_cid_v2 = $1 WHERE piece_cid = $2 AND piece_size = $3`, pcid2.String(), pieceInfo.PieceCID, pieceInfo.Size) + if err != nil { + log.Errorf("failed to update ipni table: %w", err) + } + } +} diff --git a/tasks/storage-market/storage_market.go b/tasks/storage-market/storage_market.go index 927e07b07..69929eeae 100644 --- a/tasks/storage-market/storage_market.go +++ b/tasks/storage-market/storage_market.go @@ -14,6 +14,8 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/google/go-cmp/cmp" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" "github.com/yugabyte/pgx/v5" @@ -28,34 +30,32 @@ import ( "github.com/filecoin-project/curio/deps/config" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/lib/ffi" "github.com/filecoin-project/curio/lib/multictladdr" "github.com/filecoin-project/curio/lib/paths" "github.com/filecoin-project/curio/lib/promise" "github.com/filecoin-project/curio/market/mk12" "github.com/filecoin-project/curio/market/mk12/legacytypes" + "github.com/filecoin-project/curio/market/mk20" "github.com/filecoin-project/curio/market/storageingest" - "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/proofs" "github.com/filecoin-project/lotus/storage/pipeline/piece" ) var log = logging.Logger("storage-market") -const ( - mk12Str = "mk12" - mk20Str = "mk20" -) - const ( pollerCommP = iota pollerPSD pollerFindDeal + pollerAggregate numPollers ) -const dealPollerInterval = 30 * time.Second +const dealPollerInterval = 3 * time.Second type storageMarketAPI interface { mk12.MK12API @@ -66,13 +66,16 @@ type CurioStorageDealMarket struct { cfg *config.CurioConfig db *harmonydb.DB pin storageingest.Ingester - miners map[string][]address.Address + miners *config.Dynamic[[]address.Address] api storageMarketAPI MK12Handler *mk12.MK12 + MK20Handler *mk20.MK20 + ethClient *ethclient.Client si paths.SectorIndex urls map[string]http.Header adders [numPollers]promise.Promise[harmonytask.AddTaskFunc] as *multictladdr.MultiAddressSelector + sc *ffi.SealCalls } type MK12Pipeline struct { @@ -109,10 +112,7 @@ type MK12Pipeline struct { Offset *int64 `db:"sector_offset"` } -func NewCurioStorageDealMarket(miners []address.Address, db *harmonydb.DB, cfg *config.CurioConfig, si paths.SectorIndex, mapi storageMarketAPI, as *multictladdr.MultiAddressSelector) *CurioStorageDealMarket { - - moduleMap := make(map[string][]address.Address) - moduleMap[mk12Str] = append(moduleMap[mk12Str], miners...) +func NewCurioStorageDealMarket(miners *config.Dynamic[[]address.Address], db *harmonydb.DB, cfg *config.CurioConfig, ethClient *ethclient.Client, si paths.SectorIndex, mapi storageMarketAPI, as *multictladdr.MultiAddressSelector, sc *ffi.SealCalls) *CurioStorageDealMarket { urls := make(map[string]http.Header) for _, curl := range cfg.Market.StorageMarketConfig.PieceLocator { @@ -120,64 +120,77 @@ func NewCurioStorageDealMarket(miners []address.Address, db *harmonydb.DB, cfg * } return &CurioStorageDealMarket{ - cfg: cfg, - db: db, - api: mapi, - miners: moduleMap, - si: si, - urls: urls, - as: as, + cfg: cfg, + db: db, + api: mapi, + miners: miners, + si: si, + urls: urls, + as: as, + ethClient: ethClient, + sc: sc, } } func (d *CurioStorageDealMarket) StartMarket(ctx context.Context) error { var err error - for module, miners := range d.miners { - if module == mk12Str { - if len(miners) == 0 { - // Do not start the poller if no minerID present - return nil - } - d.MK12Handler, err = mk12.NewMK12Handler(miners, d.db, d.si, d.api, d.cfg, d.as) - if err != nil { - return err - } + d.MK12Handler, err = mk12.NewMK12Handler(d.miners.Get(), d.db, d.si, d.api, d.cfg, d.as) + if err != nil { + return err + } + prevMiners := d.miners.Get() - if d.MK12Handler != nil { - for _, miner := range miners { - _, err = d.MK12Handler.GetAsk(ctx, miner) - if err != nil { - if strings.Contains(err.Error(), "no ask found") { - if build.BuildType != build.BuildMainnet && build.BuildType != build.BuildCalibnet { - err = d.MK12Handler.SetAsk(ctx, abi.NewTokenAmount(0), abi.NewTokenAmount(0), miner, legacytypes.MinPieceSize(abi.PaddedPieceSize(128)), legacytypes.MaxPieceSize(abi.PaddedPieceSize(8<<20))) - if err != nil { - return xerrors.Errorf("failed to set ask for miner %s: %w", miner, err) - } - } else { - err = d.MK12Handler.SetAsk(ctx, abi.NewTokenAmount(45211226852), abi.NewTokenAmount(0), miner) - if err != nil { - return xerrors.Errorf("failed to set ask for miner %s: %w", miner, err) - } - } - } else { - return xerrors.Errorf("failed to get miner ask %s: %w", miner, err) + if d.MK12Handler != nil { + for _, miner := range d.miners.Get() { // Not Dynamic for MK12 + _, err = d.MK12Handler.GetAsk(ctx, miner) + if err != nil { + if strings.Contains(err.Error(), "no ask found") { + if build.BuildType != build.BuildMainnet && build.BuildType != build.BuildCalibnet { + err = d.MK12Handler.SetAsk(ctx, abi.NewTokenAmount(0), abi.NewTokenAmount(0), miner, legacytypes.MinPieceSize(abi.PaddedPieceSize(128)), legacytypes.MaxPieceSize(abi.PaddedPieceSize(8<<20))) + if err != nil { + return xerrors.Errorf("failed to set ask for miner %s: %w", miner, err) + } + } else { + err = d.MK12Handler.SetAsk(ctx, abi.NewTokenAmount(45211226852), abi.NewTokenAmount(0), miner) + if err != nil { + return xerrors.Errorf("failed to set ask for miner %s: %w", miner, err) } } + } else { + return xerrors.Errorf("failed to get miner ask %s: %w", miner, err) } } - - if d.cfg.Ingest.DoSnap { - d.pin, err = storageingest.NewPieceIngesterSnap(ctx, d.db, d.api, miners, d.cfg) - } else { - d.pin, err = storageingest.NewPieceIngester(ctx, d.db, d.api, miners, d.cfg) - } } + d.miners.OnChange(func() { + newMiners := d.miners.Get() + if !cmp.Equal(prevMiners, newMiners, config.BigIntComparer) { + log.Errorf("Miners changed from %d to %d. . Restart required for Market 1.2 Ingest to work.", len(prevMiners), len(newMiners)) + } + }) } + d.MK20Handler, err = mk20.NewMK20Handler(d.miners, d.db, d.si, d.api, d.ethClient, d.cfg, d.as, d.sc) if err != nil { return err } + + if len(prevMiners) > 0 { + if d.cfg.Ingest.DoSnap { + d.pin, err = storageingest.NewPieceIngesterSnap(ctx, d.db, d.api, prevMiners, d.cfg) + } else { + d.pin, err = storageingest.NewPieceIngester(ctx, d.db, d.api, prevMiners, d.cfg) + } + if err != nil { + return err + } + } + d.miners.OnChange(func() { + newMiners := d.miners.Get() + if len(prevMiners) != len(newMiners) && (len(prevMiners) == 0 || len(newMiners) == 0) { + log.Errorf("Miners changed from %d to %d. . Restart required for Market Ingest to work.", len(prevMiners), len(newMiners)) + } + }) go d.runPoller(ctx) return nil @@ -185,6 +198,10 @@ func (d *CurioStorageDealMarket) StartMarket(ctx context.Context) error { } func (d *CurioStorageDealMarket) runPoller(ctx context.Context) { + // Start thread to insert mk20 DDO deals into pipeline + go d.pipelineInsertLoop(ctx) + go d.migratePieceCIDV2(ctx) + ticker := time.NewTicker(dealPollerInterval) defer ticker.Stop() @@ -218,13 +235,8 @@ func (d *CurioStorageDealMarket) poll(ctx context.Context) { 5. Once commP is complete, send PSD and find the allocated deal ID 6. Add the deal using pieceIngest */ - for module, miners := range d.miners { - if module == mk12Str { - if len(miners) > 0 { - d.processMK12Deals(ctx) - } - } - } + d.processMK12Deals(ctx) + d.processMK20Deals(ctx) } func (d *CurioStorageDealMarket) processMK12Deals(ctx context.Context) { @@ -497,21 +509,36 @@ func (d *CurioStorageDealMarket) findURLForOfflineDeals(ctx context.Context, dea var updated bool err = tx.QueryRow(` WITH selected_data AS ( - SELECT url, headers, raw_size - FROM market_offline_urls - WHERE uuid = $1 + SELECT url, headers, raw_size + FROM market_offline_urls + WHERE uuid = $1 + ), + updated_pipeline AS ( + UPDATE market_mk12_deal_pipeline + SET url = selected_data.url, + headers = selected_data.headers, + raw_size = selected_data.raw_size, + started = TRUE + FROM selected_data + WHERE market_mk12_deal_pipeline.uuid = $1 + RETURNING uuid + ), + updated_deals AS ( + UPDATE market_mk12_deals + SET raw_size = selected_data.raw_size + FROM selected_data + WHERE market_mk12_deals.uuid = $1 + RETURNING uuid + ), + updated_direct_deals AS ( + UPDATE market_direct_deals + SET raw_size = selected_data.raw_size + FROM selected_data + WHERE market_direct_deals.uuid = $1 + RETURNING uuid ) - UPDATE market_mk12_deal_pipeline - SET url = selected_data.url, - headers = selected_data.headers, - raw_size = selected_data.raw_size, - started = TRUE - FROM selected_data - WHERE market_mk12_deal_pipeline.uuid = $1 - RETURNING CASE - WHEN EXISTS (SELECT 1 FROM selected_data) THEN TRUE - ELSE FALSE - END;`, deal).Scan(&updated) + SELECT + (EXISTS (SELECT 1 FROM selected_data)) AS updated;`, deal).Scan(&updated) if err != nil { if !errors.Is(err, pgx.ErrNoRows) { return false, xerrors.Errorf("failed to update the pipeline for deal %s: %w", deal, err) @@ -570,6 +597,16 @@ func (d *CurioStorageDealMarket) findURLForOfflineDeals(ctx context.Context, dea return false, xerrors.Errorf("store url for piece %s: updating pipeline: %w", pcid, err) } + _, err = tx.Exec(`UPDATE market_mk12_deals SET raw_size = $1 WHERE uuid = $2`, rawSize, deal) + if err != nil { + return false, xerrors.Errorf("store url for piece %s: updating deals: %w", pcid, err) + } + + _, err = tx.Exec(`UPDATE market_direct_deals SET raw_size = $1 WHERE uuid = $2`, rawSize, deal) + if err != nil { + return false, xerrors.Errorf("store url for piece %s: updating direct deals: %w", pcid, err) + } + return true, nil } return false, nil @@ -694,10 +731,10 @@ func (d *CurioStorageDealMarket) ingestDeal(ctx context.Context, deal MK12Pipeli StartEpoch: abi.ChainEpoch(dbdeal.StartEpoch), EndEpoch: abi.ChainEpoch(dbdeal.EndEpoch), }, - PieceActivationManifest: &miner.PieceActivationManifest{ + PieceActivationManifest: &lminer.PieceActivationManifest{ CID: pcid, Size: abi.PaddedPieceSize(dbdeal.PieceSize), - VerifiedAllocationKey: &miner.VerifiedAllocationKey{ + VerifiedAllocationKey: &lminer.VerifiedAllocationKey{ Client: abi.ActorID(clientId), ID: verifreg.AllocationId(dbdeal.AllocationID), }, diff --git a/tasks/storage-market/task_aggregation.go b/tasks/storage-market/task_aggregation.go new file mode 100644 index 000000000..ec86eadf0 --- /dev/null +++ b/tasks/storage-market/task_aggregation.go @@ -0,0 +1,379 @@ +package storage_market + +import ( + "context" + "errors" + "fmt" + "io" + "math/bits" + "net/url" + "strconv" + + "github.com/ipfs/go-cid" + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-data-segment/datasegment" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/harmony/harmonytask" + "github.com/filecoin-project/curio/harmony/resources" + "github.com/filecoin-project/curio/harmony/taskhelp" + "github.com/filecoin-project/curio/lib/ffi" + "github.com/filecoin-project/curio/lib/paths" + "github.com/filecoin-project/curio/lib/storiface" + "github.com/filecoin-project/curio/market/mk20" +) + +type AggregateDealTask struct { + sm *CurioStorageDealMarket + db *harmonydb.DB + sc *ffi.SealCalls + stor paths.StashStore + api headAPI +} + +func NewAggregateTask(sm *CurioStorageDealMarket, db *harmonydb.DB, sc *ffi.SealCalls, stor paths.StashStore, api headAPI) *AggregateDealTask { + return &AggregateDealTask{ + sm: sm, + db: db, + sc: sc, + stor: stor, + api: api, + } +} + +func (a *AggregateDealTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done bool, err error) { + ctx := context.Background() + + var pieces []struct { + Pcid string `db:"piece_cid"` + Psize int64 `db:"piece_size"` + RawSize int64 `db:"raw_size"` + URL string `db:"url"` + ID string `db:"id"` + SpID int64 `db:"sp_id"` + AggrIndex int `db:"aggr_index"` + Aggregated bool `db:"aggregated"` + Aggregation int `db:"deal_aggregation"` + } + + err = a.db.Select(ctx, &pieces, ` + SELECT + piece_cid, + piece_size, + raw_size, + url, + id, + sp_id, + aggr_index, + aggregated, + deal_aggregation + FROM + market_mk20_pipeline + WHERE + agg_task_id = $1 ORDER BY aggr_index ASC`, taskID) + if err != nil { + return false, xerrors.Errorf("getting piece details: %w", err) + } + + if len(pieces) == 0 { + return false, xerrors.Errorf("no pieces to aggregate for task %d", taskID) + } + + if len(pieces) == 1 { + n, err := a.db.Exec(ctx, `UPDATE market_mk20_pipeline SET aggregated = TRUE, agg_task_id = NULL + WHERE id = $1 + AND agg_task_id = $2`, pieces[0].ID, taskID) + if err != nil { + return false, xerrors.Errorf("updating aggregated piece details in DB: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row updated, got %d", n) + } + log.Infof("skipping aggregation as deal %s only has 1 piece for task %s", pieces[0].ID, taskID) + return true, nil + } + + id := pieces[0].ID + spid := pieces[0].SpID + + ID, err := ulid.Parse(id) + if err != nil { + return false, xerrors.Errorf("parsing deal ID: %w", err) + } + + deal, err := mk20.DealFromDB(ctx, a.db, ID) + if err != nil { + return false, xerrors.Errorf("getting deal details from DB: %w", err) + } + + pi, err := deal.PieceInfo() + if err != nil { + return false, xerrors.Errorf("getting piece info: %w", err) + } + + var pinfos []abi.PieceInfo + var readers []io.Reader + + var refIDs []int64 + + for _, piece := range pieces { + if piece.Aggregated { + return false, xerrors.Errorf("piece %s for deal %s already aggregated for task %d", piece.Pcid, piece.ID, taskID) + } + if piece.Aggregation != 1 { + return false, xerrors.Errorf("incorrect aggregation value for piece %s for deal %s for task %d", piece.Pcid, piece.ID, taskID) + } + if piece.ID != id || piece.SpID != spid { + return false, xerrors.Errorf("piece details do not match") + } + goUrl, err := url.Parse(piece.URL) + if err != nil { + return false, xerrors.Errorf("parsing data URL: %w", err) + } + if goUrl.Scheme != "pieceref" { + return false, xerrors.Errorf("invalid data URL scheme: %s", goUrl.Scheme) + } + + var reader io.Reader // io.ReadCloser is not supported by padreader + var closer io.Closer + + refNum, err := strconv.ParseInt(goUrl.Opaque, 10, 64) + if err != nil { + return false, xerrors.Errorf("parsing piece reference number: %w", err) + } + + // get pieceID + var pieceID []struct { + PieceID storiface.PieceNumber `db:"piece_id"` + } + err = a.db.Select(ctx, &pieceID, `SELECT piece_id FROM parked_piece_refs WHERE ref_id = $1`, refNum) + if err != nil { + return false, xerrors.Errorf("getting pieceID: %w", err) + } + + if len(pieceID) != 1 { + return false, xerrors.Errorf("expected 1 pieceID, got %d", len(pieceID)) + } + + pr, err := a.sc.PieceReader(ctx, pieceID[0].PieceID) + if err != nil { + return false, xerrors.Errorf("getting piece reader: %w", err) + } + + closer = pr + reader = pr + defer func() { + _ = closer.Close() + }() + + pcid, err := cid.Parse(piece.Pcid) + if err != nil { + return false, xerrors.Errorf("parsing piece cid: %w", err) + } + + pinfos = append(pinfos, abi.PieceInfo{ + Size: abi.PaddedPieceSize(piece.Psize), + PieceCID: pcid, + }) + + readers = append(readers, io.LimitReader(reader, piece.RawSize)) + refIDs = append(refIDs, refNum) + } + + _, aggregatedRawSize, err := datasegment.ComputeDealPlacement(pinfos) + if err != nil { + return false, xerrors.Errorf("computing aggregated piece size: %w", err) + } + + overallSize := abi.PaddedPieceSize(aggregatedRawSize) + // we need to make this the 'next' power of 2 in order to have space for the index + next := 1 << (64 - bits.LeadingZeros64(uint64(overallSize+256))) + + aggr, err := datasegment.NewAggregate(abi.PaddedPieceSize(next), pinfos) + if err != nil { + return false, xerrors.Errorf("creating aggregate: %w", err) + } + + outR, err := aggr.AggregateObjectReader(readers) + if err != nil { + return false, xerrors.Errorf("aggregating piece readers: %w", err) + } + + var parkedPieceID, pieceRefID int64 + var pieceParked bool + + comm, err := a.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + // TODO: Review this logic for pieces which are not complete + // Check if we already have the piece, if found then verify access and skip rest of the processing + var pid int64 + err = tx.QueryRow(`SELECT id FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2 AND long_term = TRUE`, pi.PieceCIDV1.String(), pi.Size).Scan(&pid) + if err == nil { + // If piece exists then check if we can access the data + pr, err := a.sc.PieceReader(ctx, storiface.PieceNumber(pid)) + if err != nil { + // If piece does not exist then we will park it otherwise fail here + if !errors.Is(err, storiface.ErrSectorNotFound) { + // We should fail here because any subsequent operation which requires access to data will also fail + // till this error is fixed + return false, fmt.Errorf("failed to get piece reader: %w", err) + } + } + defer func() { + _ = pr.Close() + }() + pieceParked = true + parkedPieceID = pid + } else { + if !errors.Is(err, pgx.ErrNoRows) { + return false, fmt.Errorf("failed to check if piece already exists: %w", err) + } + // If piece does not exist then let's create one + err = tx.QueryRow(` + INSERT INTO parked_pieces (piece_cid, piece_padded_size, piece_raw_size, long_term, skip) + VALUES ($1, $2, $3, TRUE, TRUE) RETURNING id`, + pi.PieceCIDV1.String(), pi.Size, pi.RawSize).Scan(&parkedPieceID) + if err != nil { + return false, fmt.Errorf("failed to create parked_pieces entry: %w", err) + } + } + + err = tx.QueryRow(` + INSERT INTO parked_piece_refs (piece_id, data_url, long_term) + VALUES ($1, $2, TRUE) RETURNING ref_id + `, parkedPieceID, "/Aggregate").Scan(&pieceRefID) + if err != nil { + return false, fmt.Errorf("failed to create parked_piece_refs entry: %w", err) + } + + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("saving aggregated chunk details to DB: %w", err) + } + + if !comm { + return false, xerrors.Errorf("failed to commit the transaction") + } + + failed := true + + // Clean up piece park tables in case of failure + // TODO: Figure out if there is a race condition with cleanup task + defer func() { + if failed { + _, ferr := a.db.Exec(ctx, `DELETE FROM parked_piece_refs WHERE ref_id = $1`, pieceRefID) + if ferr != nil { + log.Errorf("failed to delete parked_piece_refs entry: %w", ferr) + } + } + }() + + // Write piece if not already complete + if !pieceParked { + upi, _, err := a.sc.WriteUploadPiece(ctx, storiface.PieceNumber(parkedPieceID), int64(pi.RawSize), outR, storiface.PathStorage, true) + if err != nil { + return false, xerrors.Errorf("writing aggregated piece data to storage: %w", err) + } + + if !upi.PieceCID.Equals(pi.PieceCIDV1) { + return false, xerrors.Errorf("commP mismatch calculated %s and supplied %s", upi.PieceCID.String(), pi.PieceCIDV1.String()) + } + + if upi.Size != pi.Size { + return false, xerrors.Errorf("commP size mismatch calculated %d and supplied %d", upi.Size, pi.Size) + } + } + + comm, err = a.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + pieceIDUrl := url.URL{ + Scheme: "pieceref", + Opaque: fmt.Sprintf("%d", pieceRefID), + } + + // Replace the pipeline piece with a new aggregated piece + _, err = tx.Exec(`DELETE FROM market_mk20_pipeline WHERE id = $1`, id) + if err != nil { + return false, fmt.Errorf("failed to delete pipeline pieces: %w", err) + } + + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = ANY($1) AND long_term = FALSE`, refIDs) + if err != nil { + return false, fmt.Errorf("failed to delete parked_piece_refs entries: %w", err) + } + + _, err = tx.Exec(`UPDATE parked_pieces SET complete = true WHERE id = $1 AND complete = FALSE`, parkedPieceID) + if err != nil { + return false, fmt.Errorf("failed to mark piece as complete: %w", err) + } + + var rev mk20.RetrievalV1 + if deal.Products.RetrievalV1 != nil { + rev = *deal.Products.RetrievalV1 + } + + ddo := deal.Products.DDOV1 + data := deal.Data + + var allocationID interface{} + if ddo.AllocationId != nil { + allocationID = *ddo.AllocationId + } else { + allocationID = nil + } + + n, err := tx.Exec(`INSERT INTO market_mk20_pipeline ( + id, sp_id, contract, client, piece_cid_v2, piece_cid, piece_size, raw_size, url, + offline, indexing, announce, allocation_id, duration, + piece_aggregation, deal_aggregation, started, downloaded, after_commp, aggregated) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, TRUE, TRUE, TRUE, TRUE)`, + id, spid, ddo.ContractAddress, deal.Client, deal.Data.PieceCID.String(), pi.PieceCIDV1.String(), pi.Size, pi.RawSize, pieceIDUrl.String(), + false, rev.Indexing, rev.AnnouncePayload, allocationID, ddo.Duration, + data.Format.Aggregate.Type, data.Format.Aggregate.Type) + if err != nil { + return false, xerrors.Errorf("inserting aggregated piece in mk20 pipeline: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("inserting aggregated piece in mk20 pipeline: %d rows affected", n) + } + return true, nil + }, harmonydb.OptionRetry()) + if err != nil { + return false, xerrors.Errorf("saving aggregated piece details to DB: %w", err) + } + + if !comm { + return false, xerrors.Errorf("failed to commit the transaction") + } + + failed = false + + return true, nil +} + +func (a *AggregateDealTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.TaskEngine) (*harmonytask.TaskID, error) { + // If no local pieceRef was found then just return first TaskID + return &ids[0], nil +} + +func (a *AggregateDealTask) TypeDetails() harmonytask.TaskTypeDetails { + return harmonytask.TaskTypeDetails{ + Max: taskhelp.Max(50), + Name: "AggregateDeals", + Cost: resources.Resources{ + Cpu: 1, + Ram: 4 << 30, + }, + MaxFailures: 3, + } +} + +func (a *AggregateDealTask) Adder(taskFunc harmonytask.AddTaskFunc) { + a.sm.adders[pollerAggregate].Set(taskFunc) +} + +var _ = harmonytask.Reg(&AggregateDealTask{}) +var _ harmonytask.TaskInterface = &AggregateDealTask{} diff --git a/tasks/storage-market/task_commp.go b/tasks/storage-market/task_commp.go index 22fb19788..f1322c8c9 100644 --- a/tasks/storage-market/task_commp.go +++ b/tasks/storage-market/task_commp.go @@ -53,32 +53,64 @@ func (c *CommpTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done ctx := context.Background() var pieces []struct { - Pcid string `db:"piece_cid"` - Psize int64 `db:"piece_size"` - UUID string `db:"uuid"` - URL *string `db:"url"` - Headers json.RawMessage `db:"headers"` - RawSize int64 `db:"raw_size"` + Pcid string `db:"piece_cid"` + Psize int64 `db:"piece_size"` + RawSize int64 `db:"raw_size"` + URL *string `db:"url"` + Headers json.RawMessage `db:"headers"` + ID string `db:"id"` + SpID int64 `db:"sp_id"` + MK12Piece bool `db:"mk12_source_table"` + AggrIndex int64 `db:"aggr_index"` } - err = c.db.Select(ctx, &pieces, `SELECT uuid, url, headers, raw_size, piece_cid, piece_size - FROM market_mk12_deal_pipeline WHERE commp_task_id = $1`, taskID) - + err = c.db.Select(ctx, &pieces, `SELECT + uuid AS id, + url, + headers, + raw_size, + piece_cid, + piece_size, + sp_id, + 0 AS aggr_index, + TRUE AS mk12_source_table + FROM + market_mk12_deal_pipeline + WHERE + commp_task_id = $1 + + UNION ALL + + SELECT + id, + url, + NULL AS headers, + raw_size, + piece_cid, + piece_size, + sp_id, + aggr_index, + FALSE AS mk12_source_table + FROM + market_mk20_pipeline + WHERE + commp_task_id = $1`, taskID) if err != nil { return false, xerrors.Errorf("getting piece details: %w", err) } - if len(pieces) != 1 { return false, xerrors.Errorf("expected 1 piece, got %d", len(pieces)) } piece := pieces[0] - expired, err := checkExpiry(ctx, c.db, c.api, piece.UUID, c.sm.pin.GetExpectedSealDuration()) - if err != nil { - return false, xerrors.Errorf("deal %s expired: %w", piece.UUID, err) - } - if expired { - return true, nil + if piece.MK12Piece { + expired, err := checkExpiry(ctx, c.db, c.api, piece.ID, c.sm.pin.GetExpectedSealDuration()) + if err != nil { + return false, xerrors.Errorf("deal %s expired: %w", piece.ID, err) + } + if expired { + return true, nil + } } if piece.URL != nil { @@ -199,7 +231,24 @@ func (c *CommpTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done return false, xerrors.Errorf("commP mismatch calculated %s and supplied %s", pcid, calculatedCommp.PieceCID) } - n, err := c.db.Exec(ctx, `UPDATE market_mk12_deal_pipeline SET after_commp = TRUE, psd_wait_time = NOW(), commp_task_id = NULL WHERE commp_task_id = $1`, taskID) + var n int + + if piece.MK12Piece { + n, err = c.db.Exec(ctx, `UPDATE market_mk12_deal_pipeline SET after_commp = TRUE, psd_wait_time = NOW(), commp_task_id = NULL WHERE commp_task_id = $1`, taskID) + } else { + n, err = c.db.Exec(ctx, `UPDATE market_mk20_pipeline SET after_commp = TRUE, commp_task_id = NULL + WHERE id = $1 + AND sp_id = $2 + AND piece_cid = $3 + AND piece_size = $4 + AND raw_size = $5 + AND aggr_index = $6 + AND downloaded = TRUE + AND after_commp = FALSE + AND commp_task_id = $7`, + piece.ID, piece.SpID, piece.Pcid, piece.Psize, piece.RawSize, piece.AggrIndex, taskID) + } + if err != nil { return false, xerrors.Errorf("store commp success: updating deal pipeline: %w", err) } @@ -210,7 +259,11 @@ func (c *CommpTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done return true, nil } - return false, xerrors.Errorf("failed to find URL for the piece %s in the db", piece.Pcid) + if piece.MK12Piece { + return false, xerrors.Errorf("failed to find URL for the piece %s in the db", piece.Pcid) + } + + return false, xerrors.Errorf("failed to find URL for the mk20 deal piece with id %s, SP %d, CID %s, Size %d and Index %d in the db", piece.ID, piece.SpID, piece.Pcid, piece.Psize, piece.AggrIndex) } @@ -221,7 +274,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task // ParkPiece should be scheduled on same node which has the piece // Remote HTTP ones can be scheduled on any node - if !c.bindToData { + if !c.bindToData { // id := ids[0] return &id, nil } @@ -240,9 +293,24 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task } comm, err := c.db.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { - err = tx.Select(&tasks, ` - SELECT commp_task_id, url FROM market_mk12_deal_pipeline - WHERE commp_task_id = ANY ($1)`, indIDs) + err = tx.Select(&tasks, ` SELECT + commp_task_id, + url + FROM + market_mk12_deal_pipeline + WHERE + commp_task_id = ANY ($1) + + UNION ALL + + SELECT + commp_task_id, + url + FROM + market_mk20_pipeline + WHERE + commp_task_id = ANY ($1); + `, indIDs) if err != nil { return false, xerrors.Errorf("failed to get deal details from DB: %w", err) } @@ -279,7 +347,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task err = tx.QueryRow(` SELECT storage_id FROM sector_location - WHERE miner_id = 0 AND sector_num = $1 AND sector_filetype = $2`, pieceID[0].PieceID, storiface.FTPiece).Scan(&sLocation) + WHERE miner_id = 0 AND sector_num = $1 AND sector_filetype = 32`, pieceID[0].PieceID).Scan(&sLocation) if err != nil { return false, xerrors.Errorf("failed to get storage location from DB: %w", err) @@ -289,6 +357,7 @@ func (c *CommpTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.Task } } } + return true, nil }, harmonydb.OptionRetry()) diff --git a/tasks/window/compute_task.go b/tasks/window/compute_task.go index 2e74aab19..63847bc43 100644 --- a/tasks/window/compute_task.go +++ b/tasks/window/compute_task.go @@ -19,6 +19,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/curio/deps/config" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/harmony/harmonytask" "github.com/filecoin-project/curio/harmony/resources" @@ -73,7 +74,7 @@ type WdPostTask struct { windowPoStTF promise.Promise[harmonytask.AddTaskFunc] - actors map[dtypes.MinerAddress]bool + actors *config.Dynamic[map[dtypes.MinerAddress]bool] max int parallel chan struct{} challengeReadTimeout time.Duration @@ -93,7 +94,7 @@ func NewWdPostTask(db *harmonydb.DB, verifier storiface.Verifier, paramck func() (bool, error), pcs *chainsched.CurioChainSched, - actors map[dtypes.MinerAddress]bool, + actors *config.Dynamic[map[dtypes.MinerAddress]bool], max int, parallel int, challengeReadTimeout time.Duration, @@ -451,7 +452,7 @@ func (t *WdPostTask) Adder(taskFunc harmonytask.AddTaskFunc) { } func (t *WdPostTask) processHeadChange(ctx context.Context, revert, apply *types.TipSet) error { - for act := range t.actors { + for act := range t.actors.Get() { maddr := address.Address(act) aid, err := address.IDFromAddress(maddr) diff --git a/tasks/window/recover_task.go b/tasks/window/recover_task.go index 07997bf13..b9fa018ed 100644 --- a/tasks/window/recover_task.go +++ b/tasks/window/recover_task.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/curio/deps/config" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/harmony/harmonytask" "github.com/filecoin-project/curio/harmony/resources" @@ -35,7 +36,7 @@ type WdPostRecoverDeclareTask struct { maxDeclareRecoveriesGasFee types.FIL as *multictladdr.MultiAddressSelector - actors map[dtypes.MinerAddress]bool + actors *config.Dynamic[map[dtypes.MinerAddress]bool] startCheckTF promise.Promise[harmonytask.AddTaskFunc] } @@ -65,7 +66,7 @@ func NewWdPostRecoverDeclareTask(sender *message.Sender, pcs *chainsched.CurioChainSched, maxDeclareRecoveriesGasFee types.FIL, - actors map[dtypes.MinerAddress]bool) (*WdPostRecoverDeclareTask, error) { + actors *config.Dynamic[map[dtypes.MinerAddress]bool]) (*WdPostRecoverDeclareTask, error) { t := &WdPostRecoverDeclareTask{ sender: sender, db: db, @@ -249,7 +250,7 @@ func (w *WdPostRecoverDeclareTask) Adder(taskFunc harmonytask.AddTaskFunc) { func (w *WdPostRecoverDeclareTask) processHeadChange(ctx context.Context, revert, apply *types.TipSet) error { tf := w.startCheckTF.Val(ctx) - for act := range w.actors { + for act := range w.actors.Get() { maddr := address.Address(act) aid, err := address.IDFromAddress(maddr) diff --git a/tasks/winning/winning_task.go b/tasks/winning/winning_task.go index 504fa648d..b86b45019 100644 --- a/tasks/winning/winning_task.go +++ b/tasks/winning/winning_task.go @@ -22,6 +22,7 @@ import ( "github.com/filecoin-project/curio/build" "github.com/filecoin-project/curio/deps" + "github.com/filecoin-project/curio/deps/config" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/curio/harmony/harmonytask" "github.com/filecoin-project/curio/harmony/resources" @@ -51,7 +52,7 @@ type WinPostTask struct { paramsReady func() (bool, error) api WinPostAPI - actors map[dtypes.MinerAddress]bool + actors *config.Dynamic[map[dtypes.MinerAddress]bool] mineTF promise.Promise[harmonytask.AddTaskFunc] } @@ -75,7 +76,7 @@ type WinPostAPI interface { WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error) } -func NewWinPostTask(max int, db *harmonydb.DB, remote *paths.Remote, verifier storiface.Verifier, paramck func() (bool, error), api WinPostAPI, actors map[dtypes.MinerAddress]bool) *WinPostTask { +func NewWinPostTask(max int, db *harmonydb.DB, remote *paths.Remote, verifier storiface.Verifier, paramck func() (bool, error), api WinPostAPI, actors *config.Dynamic[map[dtypes.MinerAddress]bool]) *WinPostTask { t := &WinPostTask{ max: max, db: db, @@ -677,7 +678,7 @@ func (t *WinPostTask) mineBasic(ctx context.Context) { baseEpoch := workBase.TipSet.Height() - for act := range t.actors { + for act := range t.actors.Get() { spID, err := address.IDFromAddress(address.Address(act)) if err != nil { log.Errorf("failed to get spID from address %s: %s", act, err) diff --git a/web/api/config/config.go b/web/api/config/config.go index 20f68c6df..a168ac7b5 100644 --- a/web/api/config/config.go +++ b/web/api/config/config.go @@ -67,7 +67,7 @@ func getSch(w http.ResponseWriter, r *http.Request) { Pattern: "1 fil/0.03 fil/0.31/1 attofil", } } - if i == reflect.TypeOf(time.Second) { // Override the Pattern for types.FIL + if i == reflect.TypeOf(time.Second) { // Override the Pattern for duration return &jsonschema.Schema{ Type: "string", Pattern: "0h0m0s", @@ -76,15 +76,15 @@ func getSch(w http.ResponseWriter, r *http.Request) { return nil }, } - sch := ref.Reflect(config.CurioConfig{}) - // add comments - for k, doc := range config.Doc { - item, ok := sch.Definitions[k] - if !ok { - continue + sch := ref.Reflect(config.UnwrapDynamics(config.CurioConfig{})) + + // Helper to add comments to a schema's properties + addComments := func(targetSchema *jsonschema.Schema, docEntries []config.DocField) { + if targetSchema == nil || targetSchema.Properties == nil { + return } - for _, line := range doc { - item, ok := item.Properties.Get(line.Name) + for _, line := range docEntries { + item, ok := targetSchema.Properties.Get(line.Name) if !ok { continue } @@ -102,14 +102,55 @@ func getSch(w http.ResponseWriter, r *http.Request) { } } + // Add comments to definitions + for k, doc := range config.Doc { + if item, ok := sch.Definitions[k]; ok { + addComments(item, doc) + } + } + + // Add comments to inline schemas in root Properties (like Ingest -> CurioIngestConfig) + // Map root property names to their corresponding Doc key + inlineSchemaMap := map[string]string{ + "Ingest": "CurioIngestConfig", + } + for propName, docKey := range inlineSchemaMap { + if prop, ok := sch.Properties.Get(propName); ok { + if doc, ok := config.Doc[docKey]; ok { + addComments(prop, doc) + } + } + } + var allOpt func(s *jsonschema.Schema) allOpt = func(s *jsonschema.Schema) { + if s == nil { + return + } s.Required = []string{} + + // Recurse into Properties (handles inline schemas like Ingest) + if s.Properties != nil { + // Iterate using Oldest/Next pattern (OrderedMap doesn't have Keys method) + for pair := s.Properties.Oldest(); pair != nil; pair = pair.Next() { + allOpt(pair.Value) // Recursively process property schemas + } + } + + // Recurse into Definitions for _, v := range s.Definitions { - v.Required = []string{} + allOpt(v) + } + // Recurse into other nested schema structures + for _, v := range []*jsonschema.Schema{s.Items, s.AdditionalProperties, s.Not, s.If, s.Then, s.Else} { allOpt(v) } + for _, v := range []interface{}{s.AllOf, s.AnyOf, s.OneOf} { + for _, sub := range v.([]*jsonschema.Schema) { + allOpt(sub) + } + } } allOpt(sch) diff --git a/web/api/sector/sector.go b/web/api/sector/sector.go index df8048516..78deaabb4 100644 --- a/web/api/sector/sector.go +++ b/web/api/sector/sector.go @@ -126,7 +126,7 @@ func (c *cfg) getSectors(w http.ResponseWriter, r *http.Request) { Miner int64 `db:"sp_id"` Sector int64 `db:"sector_number"` } - var sectors []sector + var sectors []*sector var pieces []piece apihelper.OrHTTPFail(w, c.DB.Select(r.Context(), §ors, `SELECT @@ -143,12 +143,12 @@ func (c *cfg) getSectors(w http.ResponseWriter, r *http.Request) { mID int64 sNum uint64 } - sectorIdx := map[sectorID]int{} + sectorIdx := map[sectorID]*sector{} for i, s := range sectors { sectors[i].HasSealed = s.SectorFiletype&int(storiface.FTSealed) != 0 || s.SectorFiletype&int(storiface.FTUpdate) != 0 sectors[i].HasUnsealed = s.SectorFiletype&int(storiface.FTUnsealed) != 0 sectors[i].HasSnap = s.SectorFiletype&int(storiface.FTUpdate) != 0 - sectorIdx[sectorID{s.MinerID, uint64(s.SectorNum)}] = i + sectorIdx[sectorID{s.MinerID, uint64(s.SectorNum)}] = sectors[i] addr, err := address.NewIDAddress(uint64(s.MinerID)) apihelper.OrHTTPFail(w, err) sectors[i].MinerAddress = addr @@ -190,29 +190,35 @@ func (c *cfg) getSectors(w http.ResponseWriter, r *http.Request) { apihelper.OrHTTPFail(w, err) for _, chainy := range onChainInfo { st := chainy.onChain - if i, ok := sectorIdx[sectorID{minerID, uint64(st.SectorNumber)}]; ok { - sectors[i].IsOnChain = true - sectors[i].ExpiresAt = st.Expiration - sectors[i].IsFilPlus = st.VerifiedDealWeight.GreaterThan(big.NewInt(0)) + if s, ok := sectorIdx[sectorID{minerID, uint64(st.SectorNumber)}]; ok { + s.IsOnChain = true + s.ExpiresAt = st.Expiration + s.IsFilPlus = st.VerifiedDealWeight.GreaterThan(big.NewInt(0)) if ss, err := st.SealProof.SectorSize(); err == nil { - sectors[i].SealInfo = ss.ShortString() + s.SealInfo = ss.ShortString() } - sectors[i].Proving = chainy.active + s.Proving = chainy.active if st.Expiration < head.Height() { delete(sectorIdx, sectorID{minerID, uint64(st.SectorNumber)}) - sectors = append(sectors[:i], sectors[i+1:]...) + // find s in sectors and remove it + for i, st := range sectors { + if s.SectorNum == st.SectorNum && s.MinerID == st.MinerID { + sectors = append(sectors[:i], sectors[i+1:]...) + break + } + } continue } dw, vp := .0, .0 f05, ddo := 0, 0 var pi []piece - if j, ok := pieceIndex[sectorID{sectors[i].MinerID, uint64(sectors[i].SectorNum)}]; ok { + if j, ok := pieceIndex[sectorID{s.MinerID, uint64(s.SectorNum)}]; ok { for _, k := range j { pi = append(pi, pieces[k]) } } - estimate := st.Expiration-st.Activation <= 0 || sectors[i].HasSnap + estimate := st.Expiration-st.Activation <= 0 || s.HasSnap if estimate { for _, p := range pi { if p.Proposal != nil { @@ -248,20 +254,20 @@ func (c *cfg) getSectors(w http.ResponseWriter, r *http.Request) { } } } - sectors[i].DealWeight = "CC" + s.DealWeight = "CC" if dw > 0 { - sectors[i].DealWeight = units.BytesSize(dw) + s.DealWeight = units.BytesSize(dw) } if vp > 0 { - sectors[i].DealWeight = units.BytesSize(vp) + s.DealWeight = units.BytesSize(vp) } - sectors[i].Deals = fmt.Sprintf("Market: %d, DDO: %d", f05, ddo) + s.Deals = fmt.Sprintf("Market: %d, DDO: %d", f05, ddo) } else { // sector is on chain but not in db if st.Expiration < head.Height() { continue // skip expired ones } - s := sector{ + s := §or{ MinerID: minerID, MinerAddress: maddr, SectorNum: int64(chainy.onChain.SectorNumber), @@ -275,6 +281,7 @@ func (c *cfg) getSectors(w http.ResponseWriter, r *http.Request) { s.SealInfo = ss.ShortString() } sectors = append(sectors, s) + sectorIdx[sectorID{minerID, uint64(st.SectorNumber)}] = s } } } diff --git a/web/api/webrpc/actor_charts.go b/web/api/webrpc/actor_charts.go index 4e136b870..42adeae76 100644 --- a/web/api/webrpc/actor_charts.go +++ b/web/api/webrpc/actor_charts.go @@ -2,6 +2,7 @@ package webrpc import ( "context" + "fmt" "sort" "github.com/samber/lo" @@ -29,14 +30,16 @@ type SectorBucket struct { } type SectorBuckets struct { - All []SectorBucket - CC []SectorBucket + All []SectorBucket + CC []SectorBucket + BlockDelaySeconds int } func (a *WebRPC) ActorCharts(ctx context.Context, maddr address.Address) (*SectorBuckets, error) { out := SectorBuckets{ - All: []SectorBucket{}, - CC: []SectorBucket{}, + All: []SectorBucket{}, + CC: []SectorBucket{}, + BlockDelaySeconds: int(build.BlockDelaySecs), } stor := store.ActorStore(ctx, @@ -106,8 +109,13 @@ func (a *WebRPC) ActorCharts(ctx context.Context, maddr address.Address) (*Secto if sector.VerifiedDealWeight.GreaterThan(abi.NewStoragePower(0)) { weight = big.Div(big.Mul(sector.VerifiedDealWeight, big.NewInt(verifiedPowerGainMul)), big.NewInt(int64(sector.Expiration-sector.PowerBaseEpoch))) } + + fmt.Println("Sector Number", sector.SectorNumber, "Weight", weight) + sb.QAP = big.Add(sb.QAP, weight) + fmt.Println("Sector Number", sector.SectorNumber, "QAP", sb.QAP) + if sector.DealWeight.Equals(abi.NewStoragePower(0)) && sector.VerifiedDealWeight.Equals(abi.NewStoragePower(0)) { sbc, ok := bucketsMapCC[bucket] if !ok { @@ -162,7 +170,7 @@ func (a *WebRPC) prepExpirationBucket(out []SectorBucket, now *types.TipSet) ([] totalCount := lo.Reduce(out, func(acc int64, b SectorBucket, _ int) int64 { return acc + b.Count }, int64(0)) - totalPower := lo.Reduce(out, func(agg big.Int, b SectorBucket, _ int) big.Int { return big.Add(agg, b.QAP) }, big.Zero()) + //totalPower := lo.Reduce(out, func(agg big.Int, b SectorBucket, _ int) big.Int { return big.Add(agg, b.QAP) }, big.Zero()) if len(out) == 0 { return out, nil @@ -179,13 +187,15 @@ func (a *WebRPC) prepExpirationBucket(out []SectorBucket, now *types.TipSet) ([] } for i := range out { + fmt.Println("Bucket", i, "Epoch", out[i].BucketEpoch, "Count", out[i].Count, "QAP", out[i].QAP, "VestedLockedFunds", out[i].VestedLockedFunds) newTotal := totalCount - out[i].Count out[i].Count = newTotal totalCount = newTotal - newTotalPower := big.Sub(totalPower, out[i].QAP) - out[i].QAP = newTotalPower - totalPower = newTotalPower + //newTotalPower := big.Sub(totalPower, out[i].QAP) + //fmt.Println("Bucket", i, "New Total Power", newTotalPower.String()) + //out[i].QAP = newTotalPower + //totalPower = newTotalPower epochsToExpiry := out[i].BucketEpoch - now.Height() secsToExpiry := int64(epochsToExpiry) * int64(build.BlockDelaySecs) diff --git a/web/api/webrpc/content.go b/web/api/webrpc/content.go deleted file mode 100644 index 02fa4b166..000000000 --- a/web/api/webrpc/content.go +++ /dev/null @@ -1,54 +0,0 @@ -package webrpc - -import ( - "context" - - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" -) - -// ContentInfo represents information about content location -type ContentInfo struct { - PieceCID string `json:"piece_cid"` - Offset uint64 `json:"offset"` - Size uint64 `json:"size"` - - Err string `json:"err"` -} - -// FindContentByCID finds content by CID -// This is a dummy implementation for now to get the frontend working -func (a *WebRPC) FindContentByCID(ctx context.Context, cs string) ([]ContentInfo, error) { - cid, err := cid.Parse(cs) - if err != nil { - return nil, err - } - - mh := cid.Hash() - - offsets, err := a.deps.IndexStore.PiecesContainingMultihash(ctx, mh) - if err != nil { - return nil, xerrors.Errorf("pieces containing multihash %s: %w", mh, err) - } - - var res []ContentInfo - for _, offset := range offsets { - off, err := a.deps.IndexStore.GetOffset(ctx, offset.PieceCid, mh) - if err != nil { - res = append(res, ContentInfo{ - PieceCID: offset.PieceCid.String(), - Offset: off, - Size: uint64(offset.BlockSize), - Err: err.Error(), - }) - continue - } - res = append(res, ContentInfo{ - PieceCID: offset.PieceCid.String(), - Offset: off, - Size: uint64(offset.BlockSize), - }) - } - - return res, nil -} diff --git a/web/api/webrpc/deals.go b/web/api/webrpc/deals.go index 2648eae75..ba9a93cfe 100644 --- a/web/api/webrpc/deals.go +++ b/web/api/webrpc/deals.go @@ -4,7 +4,11 @@ import ( "context" "time" + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" + commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/curio/market/storageingest" @@ -17,18 +21,20 @@ type OpenDealInfo struct { SectorNumber uint64 `db:"sector_number"` PieceCID string `db:"piece_cid"` PieceSize uint64 `db:"piece_size"` + RawSize uint64 `db:"data_raw_size"` CreatedAt time.Time `db:"created_at"` SnapDeals bool `db:"is_snap"` PieceSizeStr string `db:"-"` CreatedAtStr string `db:"-"` + PieceCidV2 string `db:"-"` Miner string } func (a *WebRPC) DealsPending(ctx context.Context) ([]OpenDealInfo, error) { deals := []OpenDealInfo{} - err := a.deps.DB.Select(ctx, &deals, `SELECT sp_id, sector_number, piece_cid, piece_size, created_at, is_snap FROM open_sector_pieces ORDER BY created_at DESC`) + err := a.deps.DB.Select(ctx, &deals, `SELECT sp_id, sector_number, piece_cid, piece_size, data_raw_size, created_at, is_snap FROM open_sector_pieces ORDER BY created_at DESC`) if err != nil { return nil, err } @@ -41,6 +47,15 @@ func (a *WebRPC) DealsPending(ctx context.Context) ([]OpenDealInfo, error) { return nil, err } deals[i].Miner = maddr.String() + pcid, err := cid.Parse(deals[i].PieceCID) + if err != nil { + return nil, xerrors.Errorf("failed to parse piece cid: %w", err) + } + pcid2, err := commcid.PieceCidV2FromV1(pcid, deals[i].RawSize) + if err != nil { + return nil, xerrors.Errorf("failed to get commp: %w", err) + } + deals[i].PieceCidV2 = pcid2.String() } return deals, nil diff --git a/web/api/webrpc/ipfs_content.go b/web/api/webrpc/ipfs_content.go new file mode 100644 index 000000000..dbbc4b999 --- /dev/null +++ b/web/api/webrpc/ipfs_content.go @@ -0,0 +1,117 @@ +package webrpc + +import ( + "context" + + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/curio/lib/commcidv2" +) + +// ContentInfo represents information about content location +type ContentInfo struct { + PieceCID string `json:"piece_cid"` + Offset uint64 `json:"offset"` + Size uint64 `json:"size"` + + Err string `json:"err"` +} + +// FindContentByCID finds content by CID +func (a *WebRPC) FindContentByCID(ctx context.Context, cs string) ([]ContentInfo, error) { + cid, err := cid.Parse(cs) + if err != nil { + return nil, err + } + + if commcidv2.IsPieceCidV2(cid) || commcidv2.IsCidV1PieceCid(cid) { + _, pcid2, err := a.maybeUpgradePieceCid(ctx, cid) + if err != nil { + return nil, xerrors.Errorf("failed to upgrade piece cid: %w", err) + } + return []ContentInfo{ + { + PieceCID: pcid2.String(), + Offset: 0, + Size: 0, + }, + }, nil + } + + mh := cid.Hash() + + offsets, err := a.deps.IndexStore.PiecesContainingMultihash(ctx, mh) + if err != nil { + return nil, xerrors.Errorf("pieces containing multihash %s: %w", mh, err) + } + + var res []ContentInfo + for _, offset := range offsets { + off, err := a.deps.IndexStore.GetOffset(ctx, offset.PieceCid, mh) + if err != nil { + _, pcid2, err := a.maybeUpgradePieceCid(ctx, offset.PieceCid) + if err != nil { + return nil, xerrors.Errorf("failed to upgrade piece cid: %w", err) + } + res = append(res, ContentInfo{ + PieceCID: pcid2.String(), + Offset: off, + Size: offset.BlockSize, + Err: err.Error(), + }) + continue + } + + _, pcid2, err := a.maybeUpgradePieceCid(ctx, offset.PieceCid) + if err != nil { + return nil, xerrors.Errorf("failed to upgrade piece cid: %w", err) + } + res = append(res, ContentInfo{ + PieceCID: pcid2.String(), + Offset: off, + Size: offset.BlockSize, + }) + } + + return res, nil +} + +func (a *WebRPC) maybeUpgradePieceCid(ctx context.Context, c cid.Cid) (bool, cid.Cid, error) { + if commcidv2.IsPieceCidV2(c) { + return true, c, nil + } + + if !commcidv2.IsCidV1PieceCid(c) { + return false, c, nil + } + + // Lookup piece_cid in market_piece_deal (always v1), get raw_size and piece_length + + // raw_size = if mpd.raw_size == 0, then Padded(piece_length).Unpadded() else mpd.raw_size + var rawSize uint64 + var pieceLength uint64 + + err := a.deps.DB.QueryRow(ctx, ` + SELECT COALESCE(raw_size, 0), piece_length + FROM market_piece_deal + WHERE piece_cid = $1 + `, c.String()).Scan(&rawSize, &pieceLength) + if err != nil { + return false, c, xerrors.Errorf("failed to lookup piece info: %w", err) + } + + if rawSize == 0 { + rawSize = uint64(abi.PaddedPieceSize(pieceLength).Unpadded()) + } + + pcid2, err := commcid.PieceCidV2FromV1(c, rawSize) + if err != nil { + return false, c, err + } + + return true, pcid2, nil +} diff --git a/web/api/webrpc/ipni.go b/web/api/webrpc/ipni.go index 9ae0e1f3c..dd1e1b31d 100644 --- a/web/api/webrpc/ipni.go +++ b/web/api/webrpc/ipni.go @@ -12,10 +12,15 @@ import ( "time" "github.com/ipfs/go-cid" + "github.com/samber/lo" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" + + itype "github.com/filecoin-project/curio/market/ipni/types" + "github.com/filecoin-project/curio/market/mk20" ) type IpniAd struct { @@ -36,7 +41,8 @@ type IpniAd struct { EntryCount int64 `json:"entry_count"` CIDCount int64 `json:"cid_count"` - AdCids []string `db:"-" json:"ad_cids"` + AdCids []string `db:"-" json:"ad_cids"` + PieceCidV2 string `db:"-" json:"piece_cid_v2"` } func (a *WebRPC) GetAd(ctx context.Context, ad string) (*IpniAd, error) { @@ -90,21 +96,58 @@ func (a *WebRPC) GetAd(ctx context.Context, ad string) (*IpniAd, error) { details := ads[0] - var pi abi.PieceInfo - err = pi.UnmarshalCBOR(bytes.NewReader(details.ContextID)) - if err != nil { - return nil, xerrors.Errorf("failed to unmarshal piece info: %w", err) + var pcid, pcid2 cid.Cid + var psize int64 + + if details.SpID == -1 { + var pi itype.PdpIpniContext + err = pi.Unmarshal(details.ContextID) + if err != nil { + return nil, xerrors.Errorf("failed to unmarshal PDP piece info: %w", err) + } + pcid2 = pi.PieceCID + pInfo, err := mk20.GetPieceInfo(pcid2) + if err != nil { + return nil, xerrors.Errorf("failed to get piece info: %w", err) + } + pcid = pInfo.PieceCIDV1 + psize = int64(pInfo.Size) + } else { + var pi abi.PieceInfo + err = pi.UnmarshalCBOR(bytes.NewReader(details.ContextID)) + if err != nil { + return nil, xerrors.Errorf("failed to unmarshal piece info: %w", err) + } + + pcid = pi.PieceCID + psize = int64(pi.Size) + + // Get RawSize from market_piece_deal to calculate PieceCidV2 + var rawSize uint64 + err = a.deps.DB.QueryRow(ctx, `SELECT raw_size FROM market_piece_deal WHERE piece_cid = $1 AND piece_length = $2 LIMIT 1;`, pi.PieceCID, pi.Size).Scan(&rawSize) + if err != nil { + return nil, xerrors.Errorf("failed to get raw size: %w", err) + } + + pcid2, err = commcid.PieceCidV2FromV1(pi.PieceCID, rawSize) + if err != nil { + return nil, xerrors.Errorf("failed to get commp: %w", err) + } } - details.PieceCid = pi.PieceCID.String() - size := int64(pi.Size) - details.PieceSize = size + details.PieceCid = pcid.String() + details.PieceSize = psize + details.PieceCidV2 = pcid2.String() - maddr, err := address.NewIDAddress(uint64(details.SpID)) - if err != nil { - return nil, err + if details.SpID == -1 { + details.Miner = "PDP" + } else { + maddr, err := address.NewIDAddress(uint64(details.SpID)) + if err != nil { + return nil, err + } + details.Miner = maddr.String() } - details.Miner = maddr.String() if !details.PreviousAd.Valid { details.Previous = "" @@ -123,7 +166,18 @@ func (a *WebRPC) GetAd(ctx context.Context, ad string) (*IpniAd, error) { CIDCount int64 `db:"cid_count"` } - err = a.deps.DB.Select(ctx, &adEntryInfo, `SELECT count(1) as entry_count, sum(num_blocks) as cid_count from ipni_chunks where piece_cid=$1`, details.PieceCid) + err = a.deps.DB.Select(ctx, &adEntryInfo, `WITH entry AS ( + SELECT is_pdp + FROM ipni_chunks + WHERE cid = $2 + LIMIT 1 + ) + SELECT + COUNT(*) AS entry_count, + COALESCE(SUM(ic.num_blocks), 0) AS cid_count + FROM ipni_chunks ic + JOIN entry e ON ic.is_pdp = e.is_pdp + WHERE ic.piece_cid = $1;`, details.PieceCidV2, details.Entries) if err != nil { return nil, xerrors.Errorf("failed to fetch the ad entry count from DB: %w", err) } @@ -190,11 +244,15 @@ func (a *WebRPC) IPNISummary(ctx context.Context) ([]*IPNI, error) { } for i := range summary { - maddr, err := address.NewIDAddress(uint64(summary[i].SpId)) - if err != nil { - return nil, fmt.Errorf("failed to convert ID address: %w", err) + if summary[i].SpId == -1 { + summary[i].Miner = "PDP" + } else { + maddr, err := address.NewIDAddress(uint64(summary[i].SpId)) + if err != nil { + return nil, fmt.Errorf("failed to convert ID address: %w", err) + } + summary[i].Miner = maddr.String() } - summary[i].Miner = maddr.String() } type minimalIpniInfo struct { @@ -222,7 +280,7 @@ func (a *WebRPC) IPNISummary(ctx context.Context) ([]*IPNI, error) { return nil, fmt.Errorf("failed to fetch IPNI configuration: %w", err) } - for _, service := range services { + for _, service := range lo.Uniq(services) { for _, d := range summary { url := service + "/providers/" + d.PeerID resp, err := http.Get(url) diff --git a/web/api/webrpc/market.go b/web/api/webrpc/market.go index d496c0ef3..84dc38e36 100644 --- a/web/api/webrpc/market.go +++ b/web/api/webrpc/market.go @@ -5,6 +5,7 @@ import ( "context" "database/sql" "encoding/json" + "errors" "fmt" "net/http" "strconv" @@ -13,16 +14,22 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-cid" + "github.com/oklog/ulid" "github.com/samber/lo" "github.com/snadrus/must" "github.com/yugabyte/pgx/v5" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + commcid "github.com/filecoin-project/go-fil-commcid" + "github.com/filecoin-project/go-padreader" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/lib/commcidv2" + itype "github.com/filecoin-project/curio/market/ipni/types" + "github.com/filecoin-project/curio/market/mk20" lapi "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors" @@ -88,32 +95,33 @@ func (a *WebRPC) SetStorageAsk(ctx context.Context, ask *StorageAsk) error { } type MK12Pipeline struct { - UUID string `db:"uuid" json:"uuid"` - SpID int64 `db:"sp_id" json:"sp_id"` - Started bool `db:"started" json:"started"` - PieceCid string `db:"piece_cid" json:"piece_cid"` - PieceSize int64 `db:"piece_size" json:"piece_size"` - RawSize *int64 `db:"raw_size" json:"raw_size"` - Offline bool `db:"offline" json:"offline"` - URL *string `db:"url" json:"url"` - Headers []byte `db:"headers" json:"headers"` - CommTaskID *int64 `db:"commp_task_id" json:"commp_task_id"` - AfterCommp bool `db:"after_commp" json:"after_commp"` - PSDTaskID *int64 `db:"psd_task_id" json:"psd_task_id"` - AfterPSD bool `db:"after_psd" json:"after_psd"` - PSDWaitTime *time.Time `db:"psd_wait_time" json:"psd_wait_time"` - FindDealTaskID *int64 `db:"find_deal_task_id" json:"find_deal_task_id"` - AfterFindDeal bool `db:"after_find_deal" json:"after_find_deal"` - Sector *int64 `db:"sector" json:"sector"` - Offset *int64 `db:"sector_offset" json:"sector_offset"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - Indexed bool `db:"indexed" json:"indexed"` - Announce bool `db:"announce" json:"announce"` - Complete bool `db:"complete" json:"complete"` - Miner string `json:"miner"` + UUID string `db:"uuid" json:"uuid"` + SpID int64 `db:"sp_id" json:"sp_id"` + Started bool `db:"started" json:"started"` + PieceCid string `db:"piece_cid" json:"piece_cid"` + PieceSize int64 `db:"piece_size" json:"piece_size"` + PieceCidV2 string `db:"-" json:"piece_cid_v2"` + RawSize sql.NullInt64 `db:"raw_size" json:"raw_size"` + Offline bool `db:"offline" json:"offline"` + URL *string `db:"url" json:"url"` + Headers []byte `db:"headers" json:"headers"` + CommTaskID *int64 `db:"commp_task_id" json:"commp_task_id"` + AfterCommp bool `db:"after_commp" json:"after_commp"` + PSDTaskID *int64 `db:"psd_task_id" json:"psd_task_id"` + AfterPSD bool `db:"after_psd" json:"after_psd"` + PSDWaitTime *time.Time `db:"psd_wait_time" json:"psd_wait_time"` + FindDealTaskID *int64 `db:"find_deal_task_id" json:"find_deal_task_id"` + AfterFindDeal bool `db:"after_find_deal" json:"after_find_deal"` + Sector *int64 `db:"sector" json:"sector"` + Offset *int64 `db:"sector_offset" json:"sector_offset"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + Indexed bool `db:"indexed" json:"indexed"` + Announce bool `db:"announce" json:"announce"` + Complete bool `db:"complete" json:"complete"` + Miner string `json:"miner"` } -func (a *WebRPC) GetDealPipelines(ctx context.Context, limit int, offset int) ([]*MK12Pipeline, error) { +func (a *WebRPC) GetMK12DealPipelines(ctx context.Context, limit int, offset int) ([]*MK12Pipeline, error) { if limit <= 0 { limit = 25 } @@ -163,6 +171,17 @@ func (a *WebRPC) GetDealPipelines(ctx context.Context, limit int, offset int) ([ return nil, xerrors.Errorf("failed to parse the miner ID: %w", err) } s.Miner = addr.String() + if s.RawSize.Valid { + pcid, err := cid.Parse(s.PieceCid) + if err != nil { + return nil, xerrors.Errorf("failed to parse v1 piece CID: %w", err) + } + pcid2, err := commcid.PieceCidV2FromV1(pcid, uint64(s.RawSize.Int64)) + if err != nil { + return nil, xerrors.Errorf("failed to get commP from piece info: %w", err) + } + s.PieceCidV2 = pcid2.String() + } } return pipelines, nil @@ -171,7 +190,7 @@ func (a *WebRPC) GetDealPipelines(ctx context.Context, limit int, offset int) ([ type StorageDealSummary struct { ID string `db:"uuid" json:"id"` MinerID int64 `db:"sp_id" json:"sp_id"` - Sector *int64 `db:"sector_num" json:"sector"` + Sector sql.NullInt64 `db:"sector_num" json:"sector"` CreatedAt time.Time `db:"created_at" json:"created_at"` SignedProposalCid string `db:"signed_proposal_cid" json:"signed_proposal_cid"` Offline bool `db:"offline" json:"offline"` @@ -179,10 +198,11 @@ type StorageDealSummary struct { StartEpoch int64 `db:"start_epoch" json:"start_epoch"` EndEpoch int64 `db:"end_epoch" json:"end_epoch"` ClientPeerId string `db:"client_peer_id" json:"client_peer_id"` - ChainDealId *int64 `db:"chain_deal_id" json:"chain_deal_id"` - PublishCid *string `db:"publish_cid" json:"publish_cid"` + ChainDealId sql.NullInt64 `db:"chain_deal_id" json:"chain_deal_id"` + PublishCid sql.NullString `db:"publish_cid" json:"publish_cid"` PieceCid string `db:"piece_cid" json:"piece_cid"` PieceSize int64 `db:"piece_size" json:"piece_size"` + RawSize sql.NullInt64 `db:"raw_size"` FastRetrieval bool `db:"fast_retrieval" json:"fast_retrieval"` AnnounceToIpni bool `db:"announce_to_ipni" json:"announce_to_ipni"` Url sql.NullString `db:"url"` @@ -192,29 +212,18 @@ type StorageDealSummary struct { DBError sql.NullString `db:"error"` Error string `json:"error"` Miner string `json:"miner"` - IsLegacy bool `json:"is_legacy"` - Indexed *bool `db:"indexed" json:"indexed"` + Indexed sql.NullBool `db:"indexed" json:"indexed"` IsDDO bool `db:"is_ddo" json:"is_ddo"` + PieceCidV2 string `json:"piece_cid_v2"` } func (a *WebRPC) StorageDealInfo(ctx context.Context, deal string) (*StorageDealSummary, error) { - - var isLegacy bool - var pcid cid.Cid - id, err := uuid.Parse(deal) if err != nil { - p, perr := cid.Parse(deal) - if perr != nil { - return &StorageDealSummary{}, xerrors.Errorf("failed to parse the deal ID: %w and %w", err, perr) - } - isLegacy = true - pcid = p + return nil, xerrors.Errorf("failed to parse deal ID: %w", err) } - - if !isLegacy { - var summaries []StorageDealSummary - err = a.deps.DB.Select(ctx, &summaries, `SELECT + var summaries []StorageDealSummary + err = a.deps.DB.Select(ctx, &summaries, `SELECT deal.uuid, deal.sp_id, deal.created_at, @@ -228,6 +237,7 @@ func (a *WebRPC) StorageDealInfo(ctx context.Context, deal string) (*StorageDeal deal.publish_cid, deal.piece_cid, deal.piece_size, + deal.raw_size, deal.fast_retrieval, deal.announce_to_ipni, deal.url, @@ -252,6 +262,7 @@ func (a *WebRPC) StorageDealInfo(ctx context.Context, deal string) (*StorageDeal md.publish_cid, md.piece_cid, md.piece_size, + md.raw_size, md.fast_retrieval, md.announce_to_ipni, md.url, @@ -278,6 +289,7 @@ func (a *WebRPC) StorageDealInfo(ctx context.Context, deal string) (*StorageDeal '' AS publish_cid, mdd.piece_cid, mdd.piece_size, + mdd.raw_size, mdd.fast_retrieval, mdd.announce_to_ipni, '' AS url, @@ -290,106 +302,74 @@ func (a *WebRPC) StorageDealInfo(ctx context.Context, deal string) (*StorageDeal LEFT JOIN market_piece_deal mpd ON mpd.id = deal.uuid AND mpd.sp_id = deal.sp_id LEFT JOIN market_piece_metadata mpm - ON mpm.piece_cid = deal.piece_cid; + ON mpm.piece_cid = deal.piece_cid AND mpm.piece_size = deal.piece_size; `, id.String()) - if err != nil { - return &StorageDealSummary{}, xerrors.Errorf("select deal summary: %w", err) - } - - if len(summaries) == 0 { - return nil, xerrors.Errorf("No such deal found in database: %s", id.String()) - } - - d := summaries[0] - d.IsLegacy = isLegacy - - addr, err := address.NewIDAddress(uint64(d.MinerID)) - if err != nil { - return &StorageDealSummary{}, err - } - - if d.Header != nil { - var h http.Header - err = json.Unmarshal(d.Header, &h) - if err != nil { - return &StorageDealSummary{}, err - } - d.UrlHeaders = h - } - - if !d.Url.Valid { - d.URLS = "" - } else { - d.URLS = d.Url.String - } - - if !d.DBError.Valid { - d.Error = "" - } else { - d.Error = d.DBError.String - } - - d.Miner = addr.String() - - return &d, nil - } - - var summaries []StorageDealSummary - err = a.deps.DB.Select(ctx, &summaries, `SELECT - '' AS uuid, - sp_id, - created_at, - signed_proposal_cid, - FALSE as offline, - verified, - start_epoch, - end_epoch, - client_peer_id, - chain_deal_id, - publish_cid, - piece_cid, - piece_size, - fast_retrieval, - FALSE AS announce_to_ipni, - '' AS url, - '{}' AS url_headers, - '' AS error, - sector_num, - FALSE AS indexed - FROM market_legacy_deals - WHERE signed_proposal_cid = $1`, pcid.String()) - if err != nil { - return &StorageDealSummary{}, err + return &StorageDealSummary{}, xerrors.Errorf("select deal summary: %w", err) } if len(summaries) == 0 { - return nil, xerrors.Errorf("No such deal found in database :%s", pcid.String()) + return nil, xerrors.Errorf("No such deal found in database: %s", id.String()) } d := summaries[0] - d.IsLegacy = isLegacy addr, err := address.NewIDAddress(uint64(d.MinerID)) if err != nil { return &StorageDealSummary{}, err } + if d.Header != nil { + var h http.Header + err = json.Unmarshal(d.Header, &h) + if err != nil { + return &StorageDealSummary{}, err + } + d.UrlHeaders = h + } + + if !d.Url.Valid { + d.URLS = "" + } else { + d.URLS = d.Url.String + } + + if !d.DBError.Valid { + d.Error = "" + } else { + d.Error = d.DBError.String + } + d.Miner = addr.String() + if d.RawSize.Valid { + pcid, err := cid.Parse(d.PieceCid) + if err != nil { + return &StorageDealSummary{}, xerrors.Errorf("failed to parse piece CID: %w", err) + } + pcid2, err := commcid.PieceCidV2FromV1(pcid, uint64(d.RawSize.Int64)) + if err != nil { + return &StorageDealSummary{}, xerrors.Errorf("failed to get commP from piece info: %w", err) + } + d.PieceCidV2 = pcid2.String() + } + return &d, nil + } type StorageDealList struct { - ID string `db:"uuid" json:"id"` - MinerID int64 `db:"sp_id" json:"sp_id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - PieceCid string `db:"piece_cid" json:"piece_cid"` - PieceSize int64 `db:"piece_size" json:"piece_size"` - Processed bool `db:"processed" json:"processed"` - Error sql.NullString `db:"error" json:"error"` - Miner string `json:"miner"` + ID string `db:"uuid" json:"id"` + MinerID int64 `db:"sp_id" json:"sp_id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + PieceCidV1 string `db:"piece_cid" json:"piece_cid"` + PieceSize int64 `db:"piece_size" json:"piece_size"` + RawSize sql.NullInt64 `db:"raw_size"` + PieceCidV2 string `json:"piece_cid_v2"` + Processed bool `db:"processed" json:"processed"` + Error sql.NullString `db:"error" json:"error"` + Miner string `json:"miner"` } func (a *WebRPC) MK12StorageDealList(ctx context.Context, limit int, offset int) ([]*StorageDealList, error) { @@ -401,6 +381,7 @@ func (a *WebRPC) MK12StorageDealList(ctx context.Context, limit int, offset int) md.created_at, md.piece_cid, md.piece_size, + md.raw_size, md.error, coalesce(mm12dp.complete, true) as processed FROM market_mk12_deals md @@ -417,37 +398,23 @@ func (a *WebRPC) MK12StorageDealList(ctx context.Context, limit int, offset int) return nil, err } mk12Summaries[i].Miner = addr.String() - } - return mk12Summaries, nil - -} - -func (a *WebRPC) LegacyStorageDealList(ctx context.Context, limit int, offset int) ([]StorageDealList, error) { - var mk12Summaries []StorageDealList - - err := a.deps.DB.Select(ctx, &mk12Summaries, `SELECT - signed_proposal_cid AS uuid, - sp_id, - created_at, - piece_cid, - piece_size, - NULL AS error, - TRUE AS processed - FROM market_legacy_deals - ORDER BY created_at DESC - LIMIT $1 OFFSET $2;`, limit, offset) - if err != nil { - return nil, fmt.Errorf("failed to fetch deal list: %w", err) - } - for i := range mk12Summaries { - addr, err := address.NewIDAddress(uint64(mk12Summaries[i].MinerID)) - if err != nil { - return nil, err + // Find PieceCidV2 only of rawSize is present + // It will be absent only for Offline deals (mk12, mk12-ddo), waiting for data + if mk12Summaries[i].RawSize.Valid { + pcid, err := cid.Parse(mk12Summaries[i].PieceCidV1) + if err != nil { + return nil, xerrors.Errorf("failed to parse v1 piece CID: %w", err) + } + pcid2, err := commcid.PieceCidV2FromV1(pcid, uint64(mk12Summaries[i].RawSize.Int64)) + if err != nil { + return nil, xerrors.Errorf("failed to get commP from piece info: %w", err) + } + mk12Summaries[i].PieceCidV2 = pcid2.String() } - mk12Summaries[i].Miner = addr.String() } return mk12Summaries, nil + } type WalletBalances struct { @@ -571,26 +538,28 @@ func (a *WebRPC) MoveBalanceToEscrow(ctx context.Context, miner string, amount s } type PieceDeal struct { - ID string `db:"id" json:"id"` - BoostDeal bool `db:"boost_deal" json:"boost_deal"` - LegacyDeal bool `db:"legacy_deal" json:"legacy_deal"` - SpId int64 `db:"sp_id" json:"sp_id"` - ChainDealId int64 `db:"chain_deal_id" json:"chain_deal_id"` - Sector int64 `db:"sector_num" json:"sector"` - Offset int64 `db:"piece_offset" json:"offset"` - Length int64 `db:"piece_length" json:"length"` - RawSize int64 `db:"raw_size" json:"raw_size"` - Miner string `json:"miner"` + ID string `db:"id" json:"id"` + BoostDeal bool `db:"boost_deal" json:"boost_deal"` + LegacyDeal bool `db:"legacy_deal" json:"legacy_deal"` + SpId int64 `db:"sp_id" json:"sp_id"` + ChainDealId int64 `db:"chain_deal_id" json:"chain_deal_id"` + Sector int64 `db:"sector_num" json:"sector"` + Offset sql.NullInt64 `db:"piece_offset" json:"offset"` + Length int64 `db:"piece_length" json:"length"` + RawSize int64 `db:"raw_size" json:"raw_size"` + Miner string `json:"miner"` + MK20 bool `db:"-" json:"mk20"` } type PieceInfo struct { - PieceCid string `json:"piece_cid"` - Size int64 `json:"size"` - CreatedAt time.Time `json:"created_at"` - Indexed bool `json:"indexed"` - IndexedAT time.Time `json:"indexed_at"` - IPNIAd string `json:"ipni_ad"` - Deals []*PieceDeal `json:"deals"` + PieceCidv2 string `json:"piece_cid_v2"` + PieceCid string `json:"piece_cid"` + Size int64 `json:"size"` + CreatedAt time.Time `json:"created_at"` + Indexed bool `json:"indexed"` + IndexedAT time.Time `json:"indexed_at"` + IPNIAd []string `json:"ipni_ads"` + Deals []*PieceDeal `json:"deals"` } func (a *WebRPC) PieceInfo(ctx context.Context, pieceCid string) (*PieceInfo, error) { @@ -599,10 +568,25 @@ func (a *WebRPC) PieceInfo(ctx context.Context, pieceCid string) (*PieceInfo, er return nil, err } - ret := &PieceInfo{} + if !commcidv2.IsPieceCidV2(piece) { + return nil, xerrors.Errorf("invalid piece CID V2: %w", err) + } + + pcid, rawSize, err := commcid.PieceCidV1FromV2(piece) + if err != nil { + return nil, xerrors.Errorf("failed to get pieceCidv1 from piece CID v2: %w", err) + } + + size := padreader.PaddedSize(rawSize).Padded() + + ret := &PieceInfo{ + PieceCidv2: piece.String(), + PieceCid: pcid.String(), + Size: int64(size), + } - err = a.deps.DB.QueryRow(ctx, `SELECT created_at, indexed, indexed_at FROM market_piece_metadata WHERE piece_cid = $1`, piece.String()).Scan(&ret.CreatedAt, &ret.Indexed, &ret.IndexedAT) - if err != nil && err != pgx.ErrNoRows { + err = a.deps.DB.QueryRow(ctx, `SELECT created_at, indexed, indexed_at FROM market_piece_metadata WHERE piece_cid = $1 AND piece_size = $2`, pcid.String(), size).Scan(&ret.CreatedAt, &ret.Indexed, &ret.IndexedAT) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { return nil, xerrors.Errorf("failed to get piece metadata: %w", err) } @@ -619,42 +603,82 @@ func (a *WebRPC) PieceInfo(ctx context.Context, pieceCid string) (*PieceInfo, er piece_length, raw_size FROM market_piece_deal - WHERE piece_cid = $1`, piece.String()) + WHERE piece_cid = $1 AND piece_length = $2`, pcid.String(), size) if err != nil { return nil, xerrors.Errorf("failed to get piece deals: %w", err) } for i := range pieceDeals { - addr, err := address.NewIDAddress(uint64(pieceDeals[i].SpId)) - if err != nil { - return nil, err + if pieceDeals[i].SpId == -1 { + pieceDeals[i].Miner = "PDP" + } else { + addr, err := address.NewIDAddress(uint64(pieceDeals[i].SpId)) + if err != nil { + return nil, err + } + _, err = uuid.Parse(pieceDeals[i].ID) + if err != nil { + pieceDeals[i].MK20 = true + } + pieceDeals[i].Miner = addr.String() } - pieceDeals[i].Miner = addr.String() - ret.Size = pieceDeals[i].Length } ret.Deals = pieceDeals - ret.PieceCid = piece.String() + + b := new(bytes.Buffer) pi := abi.PieceInfo{ - PieceCID: piece, - Size: abi.PaddedPieceSize(ret.Size), + PieceCID: pcid, + Size: size, } - b := new(bytes.Buffer) - err = pi.MarshalCBOR(b) if err != nil { return nil, xerrors.Errorf("failed to marshal piece info: %w", err) } + c1 := itype.PdpIpniContext{ + PieceCID: piece, + Payload: true, + } + + c1b, err := c1.Marshal() + if err != nil { + return nil, xerrors.Errorf("failed to marshal PDP piece info: %w", err) + } + fmt.Printf("C1B: %x", c1b) + + c2 := itype.PdpIpniContext{ + PieceCID: piece, + Payload: false, + } + + c2b, err := c2.Marshal() + if err != nil { + return nil, xerrors.Errorf("failed to marshal PDP piece info: %w", err) + } + fmt.Printf("C2B: %x", c2b) + // Get only the latest Ad var ipniAd string err = a.deps.DB.QueryRow(ctx, `SELECT ad_cid FROM ipni WHERE context_id = $1 ORDER BY order_number DESC LIMIT 1`, b.Bytes()).Scan(&ipniAd) - if err != nil && err != pgx.ErrNoRows { - return nil, xerrors.Errorf("failed to get deal ID by piece CID: %w", err) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return nil, xerrors.Errorf("failed to get ad ID by piece CID: %w", err) + } + + var ipniAdPdp string + err = a.deps.DB.QueryRow(ctx, `SELECT ad_cid FROM ipni WHERE context_id = $1 ORDER BY order_number DESC LIMIT 1`, c1b).Scan(&ipniAdPdp) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return nil, xerrors.Errorf("failed to get ad ID by piece CID for PDP: %w", err) + } + + var ipniAdPdp1 string + err = a.deps.DB.QueryRow(ctx, `SELECT ad_cid FROM ipni WHERE context_id = $1 ORDER BY order_number DESC LIMIT 1`, c2b).Scan(&ipniAdPdp1) + if err != nil && !errors.Is(err, pgx.ErrNoRows) { + return nil, xerrors.Errorf("failed to get ad ID by piece CID for PDP: %w", err) } - ret.IPNIAd = ipniAd + ret.IPNIAd = append(ret.IPNIAd, ipniAd, ipniAdPdp, ipniAdPdp1) return ret, nil } @@ -679,18 +703,34 @@ type ParkedPieceRef struct { // PieceParkStates retrieves the park states for a given piece CID func (a *WebRPC) PieceParkStates(ctx context.Context, pieceCID string) (*ParkedPieceState, error) { + pcid, err := cid.Parse(pieceCID) + if err != nil { + return nil, err + } + + if !commcidv2.IsPieceCidV2(pcid) { + return nil, xerrors.Errorf("invalid piece CID V2: %w", err) + } + + pcid1, rawSize, err := commcid.PieceCidV1FromV2(pcid) + if err != nil { + return nil, xerrors.Errorf("failed to get piece CID v1 from piece CID v2: %w", err) + } + + size := padreader.PaddedSize(rawSize).Padded() + var pps ParkedPieceState // Query the parked_pieces table - err := a.deps.DB.QueryRow(ctx, ` + err = a.deps.DB.QueryRow(ctx, ` SELECT id, created_at, piece_cid, piece_padded_size, piece_raw_size, complete, task_id, cleanup_task_id - FROM parked_pieces WHERE piece_cid = $1 - `, pieceCID).Scan( + FROM parked_pieces WHERE piece_cid = $1 AND piece_padded_size = $2 + `, pcid1.String(), size).Scan( &pps.ID, &pps.CreatedAt, &pps.PieceCID, &pps.PiecePaddedSize, &pps.PieceRawSize, &pps.Complete, &pps.TaskID, &pps.CleanupTaskID, ) if err != nil { - if err == pgx.ErrNoRows { + if errors.Is(err, pgx.ErrNoRows) { return nil, nil } return nil, fmt.Errorf("failed to query parked piece: %w", err) @@ -798,16 +838,87 @@ type MK12DealPipeline struct { CreatedAt time.Time `db:"created_at" json:"created_at"` } -// MK12DealDetailEntry combines a deal and its pipeline -type MK12DealDetailEntry struct { +// MK20DealPipeline represents a record from market_mk20_ddo_pipeline table +type MK20DDOPipeline struct { + ID string `db:"id" json:"id"` + SpId int64 `db:"sp_id" json:"sp_id"` + Contract string `db:"contract" json:"contract"` + Client string `db:"client" json:"client"` + PieceCidV2 string `db:"piece_cid_v2" json:"piece_cid_v2"` + PieceCid string `db:"piece_cid" json:"piece_cid"` + PieceSize int64 `db:"piece_size" json:"piece_size"` + RawSize uint64 `db:"raw_size" json:"raw_size"` + Offline bool `db:"offline" json:"offline"` + URL sql.NullString `db:"url" json:"url"` + Indexing bool `db:"indexing" json:"indexing"` + Announce bool `db:"announce" json:"announce"` + AllocationID sql.NullInt64 `db:"allocation_id" json:"allocation_id"` + Duration int64 `db:"duration" json:"duration"` + PieceAggregation int `db:"piece_aggregation" json:"piece_aggregation"` + + Started bool `db:"started" json:"started"` + Downloaded bool `db:"downloaded" json:"downloaded"` + + CommpTaskId sql.NullInt64 `db:"commp_task_id" json:"commp_task_id"` + AfterCommp bool `db:"after_commp" json:"after_commp"` + + DealAggregation int `db:"deal_aggregation" json:"deal_aggregation"` + AggregationIndex int64 `db:"aggr_index" json:"aggr_index"` + AggregationTaskID sql.NullInt64 `db:"agg_task_id" json:"agg_task_id"` + Aggregated bool `db:"aggregated" json:"aggregated"` + + Sector sql.NullInt64 `db:"sector" json:"sector"` + RegSealProof sql.NullInt64 `db:"reg_seal_proof" json:"reg_seal_proof"` + SectorOffset sql.NullInt64 `db:"sector_offset" json:"sector_offset"` + Sealed bool `db:"sealed" json:"sealed"` + + IndexingCreatedAt sql.NullTime `db:"indexing_created_at" json:"indexing_created_at"` + IndexingTaskId sql.NullInt64 `db:"indexing_task_id" json:"indexing_task_id"` + Indexed bool `db:"indexed" json:"indexed"` + + Complete bool `db:"complete" json:"complete"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + + Miner string `db:"-" json:"miner"` +} + +type PieceInfoMK12Deals struct { Deal *MK12Deal `json:"deal"` - Pipeline *MK12DealPipeline `json:"pipeline,omitempty"` + Pipeline *MK12DealPipeline `json:"mk12_pipeline,omitempty"` +} + +type PieceInfoMK20Deals struct { + Deal *MK20StorageDeal `json:"deal"` + DDOPipeline *MK20DDOPipeline `json:"mk20_ddo_pipeline,omitempty"` + PDPPipeline *MK20PDPPipeline `json:"mk20_pdp_pipeline,omitempty"` } -func (a *WebRPC) MK12DealDetail(ctx context.Context, pieceCid string) ([]MK12DealDetailEntry, error) { +// PieceDealDetailEntry combines a deal and its pipeline +type PieceDealDetailEntry struct { + MK12 []PieceInfoMK12Deals `json:"mk12"` + MK20 []PieceInfoMK20Deals `json:"mk20"` +} + +func (a *WebRPC) PieceDealDetail(ctx context.Context, pieceCid string) (*PieceDealDetailEntry, error) { + pcid, err := cid.Parse(pieceCid) + if err != nil { + return nil, err + } + + if !commcidv2.IsPieceCidV2(pcid) { + return nil, xerrors.Errorf("invalid piece CID V2: %w", err) + } + + pcid1, rawSize, err := commcid.PieceCidV1FromV2(pcid) + if err != nil { + return nil, xerrors.Errorf("failed to get piece CID v1 from piece CID v2: %w", err) + } + + size := padreader.PaddedSize(rawSize).Padded() + var mk12Deals []*MK12Deal - err := a.deps.DB.Select(ctx, &mk12Deals, ` + err = a.deps.DB.Select(ctx, &mk12Deals, ` SELECT uuid, sp_id, @@ -832,7 +943,7 @@ func (a *WebRPC) MK12DealDetail(ctx context.Context, pieceCid string) ([]MK12Dea error, FALSE AS is_ddo FROM market_mk12_deals - WHERE piece_cid = $1 + WHERE piece_cid = $1 AND piece_size = $2 UNION ALL @@ -860,7 +971,7 @@ func (a *WebRPC) MK12DealDetail(ctx context.Context, pieceCid string) ([]MK12Dea NULL AS error, -- NULL handled by Go (sql.NullString) TRUE AS is_ddo FROM market_direct_deals - WHERE piece_cid = $1`, pieceCid) + WHERE piece_cid = $1 AND piece_size = $2`, pcid.String(), size) if err != nil { return nil, err } @@ -909,7 +1020,7 @@ func (a *WebRPC) MK12DealDetail(ctx context.Context, pieceCid string) ([]MK12Dea WHERE uuid = ANY($1) `, uuids) if err != nil { - return nil, err + return nil, xerrors.Errorf("failed to query mk12 pipelines: %w", err) } } @@ -919,9 +1030,135 @@ func (a *WebRPC) MK12DealDetail(ctx context.Context, pieceCid string) ([]MK12Dea pipelineMap[pipeline.UUID] = pipeline } - var entries []MK12DealDetailEntry + var mk20Deals []*mk20.DBDeal + err = a.deps.DB.Select(ctx, &mk20Deals, `SELECT + id, + client, + data, + ddo_v1, + retrieval_v1, + pdp_v1 FROM market_mk20_deal WHERE piece_cid_v2 = $1`, pcid1.String()) + if err != nil { + return nil, xerrors.Errorf("failed to query mk20 deals: %w", err) + } + + ids := make([]string, len(mk20Deals)) + mk20deals := make([]*MK20StorageDeal, len(mk20Deals)) + + for i, dbdeal := range mk20Deals { + deal, err := dbdeal.ToDeal() + if err != nil { + return nil, err + } + ids[i] = deal.Identifier.String() + + var Err sql.NullString + + if len(dbdeal.DDOv1) > 0 && string(dbdeal.DDOv1) != "null" { + var dddov1 mk20.DBDDOV1 + if err := json.Unmarshal(dbdeal.DDOv1, &dddov1); err != nil { + return nil, fmt.Errorf("unmarshal ddov1: %w", err) + } + if dddov1.Error != "" { + Err.String = dddov1.Error + Err.Valid = true + } + } + + mk20deals[i] = &MK20StorageDeal{ + Deal: deal, + DDOErr: Err, + } + } + + var mk20Pipelines []MK20DDOPipeline + err = a.deps.DB.Select(ctx, &mk20Pipelines, ` + SELECT + created_at, + id, + sp_id, + contract, + client, + piece_cid_v2, + piece_cid, + piece_size, + raw_size, + offline, + url, + indexing, + announce, + allocation_id, + piece_aggregation, + started, + downloaded, + commp_task_id, + after_commp, + deal_aggregation, + aggr_index, + agg_task_id, + aggregated, + sector, + reg_seal_proof, + sector_offset, + sealed, + indexing_created_at, + indexing_task_id, + indexed, + complete + FROM market_mk20_pipeline + WHERE id = ANY($1)`, ids) + if err != nil { + return nil, xerrors.Errorf("failed to query mk20 DDO pipelines: %w", err) + } + + var mk20PDPPipelines []MK20PDPPipeline + err = a.deps.DB.Select(ctx, &mk20PDPPipelines, ` + SELECT + created_at, + id, + client, + piece_cid_v2, + indexing, + announce, + announce_payload, + downloaded, + commp_task_id, + after_commp, + deal_aggregation, + aggr_index, + agg_task_id, + aggregated, + add_piece_task_id, + after_add_piece, + after_add_piece_msg, + save_cache_task_id, + after_save_cache, + indexing_created_at, + indexing_task_id, + indexed, + complete + FROM pdp_pipeline + WHERE id = ANY($1)`, ids) + if err != nil { + return nil, xerrors.Errorf("failed to query mk20 PDP pipelines: %w", err) + } + + mk20pipelineMap := make(map[string]MK20DDOPipeline) + for _, pipeline := range mk20Pipelines { + pipeline := pipeline + mk20pipelineMap[pipeline.ID] = pipeline + } + + mk20PDPpipelineMap := make(map[string]MK20PDPPipeline) + for _, pipeline := range mk20PDPPipelines { + pipeline := pipeline + mk20PDPpipelineMap[pipeline.ID] = pipeline + } + + ret := &PieceDealDetailEntry{} + for _, deal := range mk12Deals { - entry := MK12DealDetailEntry{ + entry := PieceInfoMK12Deals{ Deal: deal, } if pipeline, exists := pipelineMap[deal.UUID]; exists { @@ -929,10 +1166,30 @@ func (a *WebRPC) MK12DealDetail(ctx context.Context, pieceCid string) ([]MK12Dea } else { entry.Pipeline = nil // Pipeline may not exist for processed and active deals } - entries = append(entries, entry) + ret.MK12 = append(ret.MK12, entry) } - return entries, nil + for _, deal := range mk20deals { + entry := PieceInfoMK20Deals{ + Deal: deal, + } + if pipeline, exists := mk20pipelineMap[deal.Deal.Identifier.String()]; exists { + entry.DDOPipeline = &pipeline + } else { + entry.DDOPipeline = nil // Pipeline may not exist for processed and active deals + } + if pipeline, exists := mk20PDPpipelineMap[deal.Deal.Identifier.String()]; exists { + entry.PDPPipeline = &pipeline + } else { + entry.PDPPipeline = nil + } + if ret.MK20 == nil { + ret.MK20 = make([]PieceInfoMK20Deals, 0) + } + ret.MK20 = append(ret.MK20, entry) + } + + return ret, nil } func firstOrZero[T any](a []T) T { @@ -942,11 +1199,108 @@ func firstOrZero[T any](a []T) T { return a[0] } -func (a *WebRPC) MK12DealPipelineRemove(ctx context.Context, uuid string) error { +func (a *WebRPC) DealPipelineRemove(ctx context.Context, id string) error { + _, err := ulid.Parse(id) + if err != nil { + _, err = uuid.Parse(id) + if err != nil { + return xerrors.Errorf("invalid pipeline id: %w", err) + } + return a.mk12DealPipelineRemove(ctx, id) + } + return a.mk20DealPipelineRemove(ctx, id) +} + +func (a *WebRPC) mk20DealPipelineRemove(ctx context.Context, id string) error { + _, err := a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + var pipelines []struct { + Url sql.NullString `db:"url"` + Sector sql.NullInt64 `db:"sector"` + + CommpTaskID sql.NullInt64 `db:"commp_task_id"` + AggrTaskID sql.NullInt64 `db:"agg_task_id"` + IndexingTaskID sql.NullInt64 `db:"indexing_task_id"` + } + + err = tx.Select(&pipelines, `SELECT url, sector, commp_task_id, agg_task_id, indexing_task_id + FROM market_mk20_pipeline WHERE id = $1`, id) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, fmt.Errorf("no deal pipeline found with id %s", id) + } + return false, err + } + + if len(pipelines) == 0 { + return false, fmt.Errorf("no deal pipeline found with id %s", id) + } + + // Collect non-null task IDs + var taskIDs []int64 + for _, pipeline := range pipelines { + if pipeline.CommpTaskID.Valid { + taskIDs = append(taskIDs, pipeline.CommpTaskID.Int64) + } + if pipeline.AggrTaskID.Valid { + taskIDs = append(taskIDs, pipeline.AggrTaskID.Int64) + } + if pipeline.IndexingTaskID.Valid { + taskIDs = append(taskIDs, pipeline.IndexingTaskID.Int64) + } + } + + // Check if any tasks are still running + if len(taskIDs) > 0 { + var runningTasks int + err = tx.QueryRow(`SELECT COUNT(*) FROM harmony_task WHERE id = ANY($1)`, taskIDs).Scan(&runningTasks) + if err != nil { + return false, err + } + if runningTasks > 0 { + return false, fmt.Errorf("cannot remove deal pipeline %s: tasks are still running", id) + } + } + + //Mark failure for deal + _, err = tx.Exec(`UPDATE market_mk20_deal SET error = $1 WHERE id = $2`, "Deal pipeline removed by SP", id) + if err != nil { + return false, xerrors.Errorf("failed to mark deal %s as failed", id) + } + + // Remove market_mk20_pipeline entry + _, err = tx.Exec(`DELETE FROM market_mk20_pipeline WHERE id = $1`, id) + if err != nil { + return false, err + } + + // If sector is null, remove related pieceref + for _, pipeline := range pipelines { + if !pipeline.Sector.Valid && pipeline.Url.Valid { + const prefix = "pieceref:" + if strings.HasPrefix(pipeline.Url.String, prefix) { + refIDStr := pipeline.Url.String[len(prefix):] + refID, err := strconv.ParseInt(refIDStr, 10, 64) + if err != nil { + return false, fmt.Errorf("invalid refID in URL: %v", err) + } + // Remove from parked_piece_refs where ref_id = refID + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = $1`, refID) + if err != nil { + return false, err + } + } + } + } + return true, nil + }, harmonydb.OptionRetry()) + return err +} + +func (a *WebRPC) mk12DealPipelineRemove(ctx context.Context, uuid string) error { _, err := a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { // First, get deal_pipeline.url, task_ids, and sector values var ( - url string + url sql.NullString sector sql.NullInt64 commpTaskID sql.NullInt64 @@ -960,7 +1314,7 @@ func (a *WebRPC) MK12DealPipelineRemove(ctx context.Context, uuid string) error &url, §or, &commpTaskID, &psdTaskID, &findDealTaskID, &indexingTaskID, ) if err != nil { - if err == sql.ErrNoRows { + if errors.Is(err, pgx.ErrNoRows) { return false, fmt.Errorf("no deal pipeline found with uuid %s", uuid) } return false, err @@ -1015,11 +1369,11 @@ func (a *WebRPC) MK12DealPipelineRemove(ctx context.Context, uuid string) error } // If sector is null, remove related pieceref - if !sector.Valid { + if !sector.Valid && url.Valid { // Extract refID from deal_pipeline.url (format: "pieceref:[refid]") const prefix = "pieceref:" - if strings.HasPrefix(url, prefix) { - refIDStr := url[len(prefix):] + if strings.HasPrefix(url.String, prefix) { + refIDStr := url.String[len(prefix):] refID, err := strconv.ParseInt(refIDStr, 10, 64) if err != nil { return false, fmt.Errorf("invalid refID in URL: %v", err) @@ -1037,7 +1391,7 @@ func (a *WebRPC) MK12DealPipelineRemove(ctx context.Context, uuid string) error return err } -type PipelineFailedStats struct { +type MK12PipelineFailedStats struct { DownloadingFailed int64 CommPFailed int64 PSDFailed int64 @@ -1045,7 +1399,7 @@ type PipelineFailedStats struct { IndexFailed int64 } -func (a *WebRPC) PipelineFailedTasksMarket(ctx context.Context) (*PipelineFailedStats, error) { +func (a *WebRPC) MK12PipelineFailedTasks(ctx context.Context) (*MK12PipelineFailedStats, error) { // We'll create a similar query, but this time we coalesce the task IDs from harmony_task. // If the join fails (no matching harmony_task), all joined fields for that task will be NULL. // We detect failure by checking that xxx_task_id IS NOT NULL, after_xxx = false, and that no task record was found in harmony_task. @@ -1064,7 +1418,7 @@ WITH pipeline_data AS ( dp.after_find_deal, pp.task_id AS downloading_task_id FROM market_mk12_deal_pipeline dp - LEFT JOIN parked_pieces pp ON pp.piece_cid = dp.piece_cid + LEFT JOIN parked_pieces pp ON pp.piece_cid = dp.piece_cid AND pp.piece_padded_size = dp.piece_size WHERE dp.complete = false ), tasks AS ( @@ -1143,7 +1497,7 @@ FROM tasks counts := c[0] - return &PipelineFailedStats{ + return &MK12PipelineFailedStats{ DownloadingFailed: counts.DownloadingFailed, CommPFailed: counts.CommPFailed, PSDFailed: counts.PSDFailed, @@ -1152,7 +1506,7 @@ FROM tasks }, nil } -func (a *WebRPC) BulkRestartFailedMarketTasks(ctx context.Context, taskType string) error { +func (a *WebRPC) MK12BulkRestartFailedMarketTasks(ctx context.Context, taskType string) error { didCommit, err := a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { var rows *harmonydb.Query var err error @@ -1278,7 +1632,7 @@ func (a *WebRPC) BulkRestartFailedMarketTasks(ctx context.Context, taskType stri return nil } -func (a *WebRPC) BulkRemoveFailedMarketPipelines(ctx context.Context, taskType string) error { +func (a *WebRPC) MK12BulkRemoveFailedMarketPipelines(ctx context.Context, taskType string) error { didCommit, err := a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { var rows *harmonydb.Query var err error @@ -1459,6 +1813,7 @@ func (a *WebRPC) MK12DDOStorageDealList(ctx context.Context, limit int, offset i md.created_at, md.piece_cid, md.piece_size, + md.raw_size, md.error, coalesce(mm12dp.complete, true) as processed FROM market_direct_deals md @@ -1475,6 +1830,18 @@ func (a *WebRPC) MK12DDOStorageDealList(ctx context.Context, limit int, offset i return nil, err } mk12Summaries[i].Miner = addr.String() + + if mk12Summaries[i].RawSize.Valid { + pcid, err := cid.Parse(mk12Summaries[i].PieceCidV1) + if err != nil { + return nil, xerrors.Errorf("failed to parse v1 piece CID: %w", err) + } + pcid2, err := commcid.PieceCidV2FromV1(pcid, uint64(mk12Summaries[i].RawSize.Int64)) + if err != nil { + return nil, xerrors.Errorf("failed to convert v1 piece CID to v2: %w", err) + } + mk12Summaries[i].PieceCidV2 = pcid2.String() + } } return mk12Summaries, nil diff --git a/web/api/webrpc/market_2.go b/web/api/webrpc/market_2.go new file mode 100644 index 000000000..aeefb9b47 --- /dev/null +++ b/web/api/webrpc/market_2.go @@ -0,0 +1,1528 @@ +package webrpc + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + "fmt" + "strconv" + "strings" + "time" + + eabi "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/oklog/ulid" + "github.com/yugabyte/pgx/v5" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + + "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/market/mk20" +) + +type MK20StorageDeal struct { + Deal *mk20.Deal `json:"deal"` + DDOErr sql.NullString `json:"ddoerr"` + PDPErr sql.NullString `json:"pdperr"` + DDOId sql.NullInt64 `json:"ddoid"` +} + +func (a *WebRPC) MK20DDOStorageDeal(ctx context.Context, id string) (*MK20StorageDeal, error) { + pid, err := ulid.Parse(id) + if err != nil { + return nil, xerrors.Errorf("parsing deal ID: %w", err) + } + + var dbDeals []mk20.DBDeal + err = a.deps.DB.Select(ctx, &dbDeals, `SELECT id, + client, + data, + ddo_v1, + retrieval_v1, + pdp_v1 FROM market_mk20_deal WHERE id = $1`, pid.String()) + if err != nil { + return nil, xerrors.Errorf("getting deal from DB: %w", err) + } + if len(dbDeals) != 1 { + return nil, xerrors.Errorf("expected 1 deal, got %d", len(dbDeals)) + } + dbDeal := dbDeals[0] + deal, err := dbDeal.ToDeal() + if err != nil { + return nil, xerrors.Errorf("converting DB deal to struct: %w", err) + } + + ret := &MK20StorageDeal{Deal: deal} + + if len(dbDeal.DDOv1) > 0 && string(dbDeal.DDOv1) != "null" { + var dddov1 mk20.DBDDOV1 + if err := json.Unmarshal(dbDeal.DDOv1, &dddov1); err != nil { + return nil, fmt.Errorf("unmarshal ddov1: %w", err) + } + if dddov1.Error != "" { + ret.DDOErr = sql.NullString{String: dddov1.Error, Valid: true} + } + if dddov1.DealID > 0 { + ret.DDOId = sql.NullInt64{Int64: dddov1.DealID, Valid: true} + } + } + + if len(dbDeal.PDPV1) > 0 && string(dbDeal.PDPV1) != "null" { + var pdpv1 mk20.DBPDPV1 + if err := json.Unmarshal(dbDeal.PDPV1, &pdpv1); err != nil { + return nil, fmt.Errorf("unmarshal pdpv1: %w", err) + } + if pdpv1.Error != "" { + ret.PDPErr = sql.NullString{String: pdpv1.Error, Valid: true} + } + } + + return ret, nil +} + +type MK20StorageDealList struct { + ID string `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + PieceCidV2 sql.NullString `db:"piece_cid_v2" json:"piece_cid_v2"` + Processed bool `db:"processed" json:"processed"` + Error sql.NullString `db:"error" json:"error"` + Miner sql.NullString `db:"miner" json:"miner"` +} + +func (a *WebRPC) MK20DDOStorageDeals(ctx context.Context, limit int, offset int) ([]*MK20StorageDealList, error) { + var mk20Summaries []*MK20StorageDealList + + err := a.deps.DB.Select(ctx, &mk20Summaries, `SELECT + d.created_at, + d.id, + d.piece_cid_v2, + (d.ddo_v1->'ddo'->>'provider')::text AS miner, + (d.ddo_v1->>'error')::text AS error, + CASE + WHEN EXISTS ( + SELECT 1 FROM market_mk20_pipeline_waiting w + WHERE w.id = d.id + ) THEN FALSE + WHEN EXISTS ( + SELECT 1 FROM market_mk20_pipeline p + WHERE p.id = d.id AND p.complete = FALSE + ) THEN FALSE + ELSE TRUE + END AS processed + FROM market_mk20_deal d + WHERE d.ddo_v1 IS NOT NULL AND d.ddo_v1 != 'null' + ORDER BY d.created_at DESC + LIMIT $1 OFFSET $2;`, limit, offset) + if err != nil { + return nil, fmt.Errorf("failed to fetch deal list: %w", err) + } + + return mk20Summaries, nil +} + +func (a *WebRPC) MK20DDOPipelines(ctx context.Context, limit int, offset int) ([]*MK20DDOPipeline, error) { + if limit <= 0 { + limit = 25 + } + if limit > 100 { + limit = 100 + } + if offset < 0 { + offset = 0 + } + + var pipelines []*MK20DDOPipeline + err := a.deps.DB.Select(ctx, &pipelines, ` + SELECT + created_at, + id, + sp_id, + contract, + client, + piece_cid_v2, + piece_cid, + piece_size, + raw_size, + offline, + url, + indexing, + announce, + allocation_id, + piece_aggregation, + started, + downloaded, + commp_task_id, + after_commp, + deal_aggregation, + aggr_index, + agg_task_id, + aggregated, + sector, + reg_seal_proof, + sector_offset, + sealed, + indexing_created_at, + indexing_task_id, + indexed, + complete + FROM market_mk20_pipeline + ORDER BY created_at DESC + LIMIT $1 OFFSET $2`, limit, offset) + if err != nil { + return nil, fmt.Errorf("failed to fetch deal pipelines: %w", err) + } + + for _, s := range pipelines { + addr, err := address.NewIDAddress(uint64(s.SpId)) + if err != nil { + return nil, xerrors.Errorf("failed to parse the miner ID: %w", err) + } + s.Miner = addr.String() + } + + return pipelines, nil +} + +type MK20PipelineFailedStats struct { + DownloadingFailed int64 + CommPFailed int64 + AggFailed int64 + IndexFailed int64 +} + +func (a *WebRPC) MK20PipelineFailedTasks(ctx context.Context) (*MK20PipelineFailedStats, error) { + // We'll create a similar query, but this time we coalesce the task IDs from harmony_task. + // If the join fails (no matching harmony_task), all joined fields for that task will be NULL. + // We detect failure by checking that xxx_task_id IS NOT NULL, after_xxx = false, and that no task record was found in harmony_task. + + const query = ` + WITH pipeline_data AS ( + SELECT dp.id, + dp.complete, + dp.commp_task_id, + dp.agg_task_id, + dp.indexing_task_id, + dp.sector, + dp.after_commp, + dp.aggregated, + pp.task_id AS downloading_task_id + FROM market_mk20_pipeline dp + LEFT JOIN parked_pieces pp ON pp.piece_cid = dp.piece_cid AND pp.piece_padded_size = dp.piece_size + WHERE dp.complete = false + ), + tasks AS ( + SELECT p.*, + dt.id AS downloading_tid, + ct.id AS commp_tid, + pt.id AS agg_tid, + it.id AS index_tid + FROM pipeline_data p + LEFT JOIN harmony_task dt ON dt.id = p.downloading_task_id + LEFT JOIN harmony_task ct ON ct.id = p.commp_task_id + LEFT JOIN harmony_task pt ON pt.id = p.agg_task_id + LEFT JOIN harmony_task it ON it.id = p.indexing_task_id + ) + SELECT + -- Downloading failed: + -- downloading_task_id IS NOT NULL, after_commp = false (haven't completed commp stage), + -- and downloading_tid IS NULL (no harmony_task record) + COUNT(*) FILTER ( + WHERE downloading_task_id IS NOT NULL + AND after_commp = false + AND downloading_tid IS NULL + ) AS downloading_failed, + + -- CommP (verify) failed: + -- commp_task_id IS NOT NULL, after_commp = false, commp_tid IS NULL + COUNT(*) FILTER ( + WHERE commp_task_id IS NOT NULL + AND after_commp = false + AND commp_tid IS NULL + ) AS commp_failed, + + -- Aggregation failed: + -- agg_task_id IS NOT NULL, aggregated = false, agg_tid IS NULL + COUNT(*) FILTER ( + WHERE agg_task_id IS NOT NULL + AND aggregated = false + AND agg_tid IS NULL + ) AS agg_failed, + + -- Index failed: + -- indexing_task_id IS NOT NULL and if we assume indexing is after find_deal: + -- If indexing_task_id is set, we are presumably at indexing stage. + -- If index_tid IS NULL (no task found), then it's failed. + -- We don't have after_index, now at indexing. + COUNT(*) FILTER ( + WHERE indexing_task_id IS NOT NULL + AND index_tid IS NULL + AND aggregated = true + ) AS index_failed + FROM tasks + ` + + var c []struct { + DownloadingFailed int64 `db:"downloading_failed"` + CommPFailed int64 `db:"commp_failed"` + AggFailed int64 `db:"agg_failed"` + IndexFailed int64 `db:"index_failed"` + } + + err := a.deps.DB.Select(ctx, &c, query) + if err != nil { + return nil, xerrors.Errorf("failed to run failed task query: %w", err) + } + + counts := c[0] + + return &MK20PipelineFailedStats{ + DownloadingFailed: counts.DownloadingFailed, + CommPFailed: counts.CommPFailed, + AggFailed: counts.AggFailed, + IndexFailed: counts.IndexFailed, + }, nil +} + +func (a *WebRPC) MK20BulkRestartFailedMarketTasks(ctx context.Context, taskType string) error { + didCommit, err := a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { + var rows *harmonydb.Query + var err error + + switch taskType { + case "downloading": + rows, err = tx.Query(` + SELECT pp.task_id + FROM market_mk20_pipeline dp + LEFT JOIN parked_pieces pp ON pp.piece_cid = dp.piece_cid AND pp.piece_padded_size = dp.piece_size + LEFT JOIN harmony_task h ON h.id = pp.task_id + WHERE dp.downloaded = false + AND h.id IS NULL + `) + case "commp": + rows, err = tx.Query(` + SELECT dp.commp_task_id + FROM market_mk20_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.commp_task_id + WHERE dp.complete = false + AND dp.downloaded = true + AND dp.commp_task_id IS NOT NULL + AND dp.after_commp = false + AND h.id IS NULL + `) + case "aggregate": + rows, err = tx.Query(` + SELECT dp.agg_task_id + FROM market_mk20_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.agg_task_id + WHERE dp.complete = false + AND dp.after_commp = true + AND dp.agg_task_id IS NOT NULL + AND dp.aggregated = false + AND h.id IS NULL + `) + case "index": + rows, err = tx.Query(` + SELECT dp.indexing_task_id + FROM market_mk20_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.indexing_task_id + WHERE dp.complete = false + AND dp.indexing_task_id IS NOT NULL + AND dp.sealed = true + AND h.id IS NULL + `) + default: + return false, fmt.Errorf("unknown task type: %s", taskType) + } + + if err != nil { + return false, fmt.Errorf("failed to query failed tasks: %w", err) + } + defer rows.Close() + + var taskIDs []int64 + for rows.Next() { + var tid int64 + if err := rows.Scan(&tid); err != nil { + return false, fmt.Errorf("failed to scan task_id: %w", err) + } + taskIDs = append(taskIDs, tid) + } + + if err := rows.Err(); err != nil { + return false, fmt.Errorf("row iteration error: %w", err) + } + + for _, taskID := range taskIDs { + var name string + var posted time.Time + var result bool + err = tx.QueryRow(` + SELECT name, posted, result + FROM harmony_task_history + WHERE task_id = $1 + ORDER BY id DESC LIMIT 1 + `, taskID).Scan(&name, &posted, &result) + if errors.Is(err, pgx.ErrNoRows) { + // No history means can't restart this task + continue + } else if err != nil { + return false, fmt.Errorf("failed to query history: %w", err) + } + + // If result=true means the task ended successfully, no restart needed + if result { + continue + } + + log.Infow("restarting task", "task_id", taskID, "name", name) + + _, err = tx.Exec(` + INSERT INTO harmony_task (id, initiated_by, update_time, posted_time, owner_id, added_by, previous_task, name) + VALUES ($1, NULL, NOW(), $2, NULL, $3, NULL, $4) + `, taskID, posted, a.deps.MachineID, name) + if err != nil { + return false, fmt.Errorf("failed to insert harmony_task for task_id %d: %w", taskID, err) + } + } + + // All done successfully, commit the transaction + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return err + } + if !didCommit { + return fmt.Errorf("transaction did not commit") + } + + return nil +} + +func (a *WebRPC) MK20BulkRemoveFailedMarketPipelines(ctx context.Context, taskType string) error { + didCommit, err := a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { + var rows *harmonydb.Query + var err error + + // We'll select pipeline fields directly based on the stage conditions + switch taskType { + case "downloading": + rows, err = tx.Query(` + SELECT dp.id, dp.url, dp.sector, + dp.commp_task_id, dp.agg_task_id, dp.indexing_task_id + FROM market_mk20_pipeline dp + LEFT JOIN parked_pieces pp ON pp.piece_cid = dp.piece_cid AND pp.piece_padded_size = dp.piece_size + LEFT JOIN harmony_task h ON h.id = pp.task_id + WHERE dp.complete = false + AND dp.downloaded = false + AND pp.task_id IS NOT NULL + AND h.id IS NULL + `) + case "commp": + rows, err = tx.Query(` + SELECT dp.id, dp.url, dp.sector, + dp.commp_task_id, dp.agg_task_id, dp.indexing_task_id + FROM market_mk20_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.commp_task_id + WHERE dp.complete = false + AND dp.downloaded = true + AND dp.commp_task_id IS NOT NULL + AND dp.after_commp = false + AND h.id IS NULL + `) + case "aggregate": + rows, err = tx.Query(` + SELECT dp.id, dp.url, dp.sector, + dp.commp_task_id, dp.agg_task_id, dp.indexing_task_id + FROM market_mk20_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.agg_task_id + WHERE dp.complete = false + AND after_commp = true + AND dp.agg_task_id IS NOT NULL + AND dp.aggregated = false + AND h.id IS NULL + `) + case "index": + rows, err = tx.Query(` + SELECT dp.id, dp.url, dp.sector, + dp.commp_task_id, dp.agg_task_id, dp.indexing_task_id + FROM market_mk20_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.indexing_task_id + WHERE dp.complete = false + AND sealed = true + AND dp.indexing_task_id IS NOT NULL + AND h.id IS NULL + `) + default: + return false, fmt.Errorf("unknown task type: %s", taskType) + } + + if err != nil { + return false, fmt.Errorf("failed to query failed pipelines: %w", err) + } + defer rows.Close() + + type pipelineInfo struct { + id string + url string + sector sql.NullInt64 + commpTaskID sql.NullInt64 + aggTaskID sql.NullInt64 + indexingTaskID sql.NullInt64 + } + + var pipelines []pipelineInfo + for rows.Next() { + var p pipelineInfo + if err := rows.Scan(&p.id, &p.url, &p.sector, &p.commpTaskID, &p.aggTaskID, &p.indexingTaskID); err != nil { + return false, fmt.Errorf("failed to scan pipeline info: %w", err) + } + pipelines = append(pipelines, p) + } + if err := rows.Err(); err != nil { + return false, fmt.Errorf("row iteration error: %w", err) + } + + for _, p := range pipelines { + // Gather task IDs + var taskIDs []int64 + if p.commpTaskID.Valid { + taskIDs = append(taskIDs, p.commpTaskID.Int64) + } + if p.aggTaskID.Valid { + taskIDs = append(taskIDs, p.aggTaskID.Int64) + } + if p.indexingTaskID.Valid { + taskIDs = append(taskIDs, p.indexingTaskID.Int64) + } + + if len(taskIDs) > 0 { + var runningTasks int + err = tx.QueryRow(`SELECT COUNT(*) FROM harmony_task WHERE id = ANY($1)`, taskIDs).Scan(&runningTasks) + if err != nil { + return false, err + } + if runningTasks > 0 { + // This should not happen if they are failed, but just in case + return false, fmt.Errorf("cannot remove deal pipeline %s: tasks are still running", p.id) + } + } + + _, err = tx.Exec(`UPDATE market_mk20_deal SET error = $1 WHERE id = $2`, "Deal pipeline removed by SP", p.id) + if err != nil { + return false, xerrors.Errorf("store deal failure: updating deal pipeline: %w", err) + } + + _, err = tx.Exec(`DELETE FROM market_mk20_pipeline WHERE id = $1`, p.id) + if err != nil { + return false, err + } + + // If sector is null, remove related pieceref + if !p.sector.Valid { + const prefix = "pieceref:" + if strings.HasPrefix(p.url, prefix) { + refIDStr := p.url[len(prefix):] + refID, err := strconv.ParseInt(refIDStr, 10, 64) + if err != nil { + return false, fmt.Errorf("invalid refID in URL for pipeline %s: %v", p.id, err) + } + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = $1`, refID) + if err != nil { + return false, fmt.Errorf("failed to remove parked_piece_refs for pipeline %s: %w", p.id, err) + } + } + } + + log.Infow("removed failed pipeline", "id", p.id) + } + + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return err + } + if !didCommit { + return fmt.Errorf("transaction did not commit") + } + + return nil +} + +func (a *WebRPC) AddMarketContract(ctx context.Context, contract, abiString string) error { + if contract == "" { + return fmt.Errorf("empty contract") + } + if abiString == "" { + return fmt.Errorf("empty abi") + } + + if !strings.HasPrefix(contract, "0x") { + return fmt.Errorf("contract must start with 0x") + } + + if !common.IsHexAddress(contract) { + return fmt.Errorf("invalid contract address") + } + + ethabi, err := eabi.JSON(strings.NewReader(abiString)) + if err != nil { + return fmt.Errorf("invalid abi: %w", err) + } + + if len(ethabi.Methods) == 0 { + return fmt.Errorf("invalid abi: no methods") + } + + n, err := a.deps.DB.Exec(ctx, `INSERT INTO ddo_contracts (address, abi) VALUES ($1, $2) ON CONFLICT (address) DO NOTHING`, contract, abiString) + if err != nil { + return xerrors.Errorf("failed to add contract: %w", err) + } + if n == 0 { + return fmt.Errorf("contract already exists") + } + return nil +} + +func (a *WebRPC) UpdateMarketContract(ctx context.Context, contract, abiString string) error { + if contract == "" { + return fmt.Errorf("empty contract") + } + + if abiString == "" { + return fmt.Errorf("empty abi") + } + + if !strings.HasPrefix(contract, "0x") { + return fmt.Errorf("contract must start with 0x") + } + + if !common.IsHexAddress(contract) { + return fmt.Errorf("invalid contract address") + } + + ethabi, err := eabi.JSON(strings.NewReader(abiString)) + if err != nil { + return fmt.Errorf("invalid abi: %w", err) + } + + if len(ethabi.Methods) == 0 { + return fmt.Errorf("invalid abi: no methods") + } + + // Check if contract exists in DB + var count int + err = a.deps.DB.QueryRow(ctx, `SELECT COUNT(*) FROM ddo_contracts WHERE address = $1`, contract).Scan(&count) + if err != nil { + return xerrors.Errorf("failed to check contract: %w", err) + } + if count == 0 { + return fmt.Errorf("contract does not exist") + } + + n, err := a.deps.DB.Exec(ctx, `UPDATE ddo_contracts SET abi = $2 WHERE address = $1`, contract, abiString) + if err != nil { + return xerrors.Errorf("failed to update contract ABI: %w", err) + } + + if n == 0 { + return fmt.Errorf("failed to update the contract ABI") + } + + return nil +} + +func (a *WebRPC) RemoveMarketContract(ctx context.Context, contract string) error { + if contract == "" { + return fmt.Errorf("empty contract") + } + if !strings.HasPrefix(contract, "0x") { + return fmt.Errorf("contract must start with 0x") + } + _, err := a.deps.DB.Exec(ctx, `DELETE FROM ddo_contracts WHERE address = $1`, contract) + if err != nil { + return xerrors.Errorf("failed to remove contract: %w", err) + } + return nil +} + +func (a *WebRPC) ListMarketContracts(ctx context.Context) (map[string]string, error) { + var contracts []struct { + Address string `db:"address"` + Abi string `db:"abi"` + } + err := a.deps.DB.Select(ctx, &contracts, `SELECT address, abi FROM ddo_contracts`) + if err != nil { + return nil, xerrors.Errorf("failed to get contracts from DB: %w", err) + } + + contractMap := make(map[string]string) + for _, contract := range contracts { + contractMap[contract.Address] = contract.Abi + } + + return contractMap, nil +} + +func (a *WebRPC) EnableProduct(ctx context.Context, name string) error { + if name == "" { + return fmt.Errorf("empty product name") + } + + // Check if product exists in market_mk20_products + var count int + err := a.deps.DB.QueryRow(ctx, `SELECT COUNT(*) FROM market_mk20_products WHERE name = $1`, name).Scan(&count) + if err != nil { + return xerrors.Errorf("failed to check product: %w", err) + } + if count == 0 { + return fmt.Errorf("product does not exist") + } + n, err := a.deps.DB.Exec(ctx, `UPDATE market_mk20_products SET enabled = true WHERE name = $1`, name) + if err != nil { + return xerrors.Errorf("failed to enable product: %w", err) + } + if n == 0 { + return fmt.Errorf("failed to enable the product") + } + return nil +} + +func (a *WebRPC) DisableProduct(ctx context.Context, name string) error { + if name == "" { + return fmt.Errorf("empty product name") + } + + // Check if product exists in market_mk20_products + var count int + err := a.deps.DB.QueryRow(ctx, `SELECT COUNT(*) FROM market_mk20_products WHERE name = $1`, name).Scan(&count) + if err != nil { + return xerrors.Errorf("failed to check product: %w", err) + } + if count == 0 { + return fmt.Errorf("product does not exist") + } + n, err := a.deps.DB.Exec(ctx, `UPDATE market_mk20_products SET enabled = false WHERE name = $1`, name) + if err != nil { + return xerrors.Errorf("failed to disable product: %w", err) + } + if n == 0 { + return fmt.Errorf("failed to disable the product") + } + return nil +} + +func (a *WebRPC) ListProducts(ctx context.Context) (map[string]bool, error) { + var products []struct { + Name string `db:"name"` + Enabled bool `db:"enabled"` + } + err := a.deps.DB.Select(ctx, &products, `SELECT name, enabled FROM market_mk20_products`) + if err != nil { + return nil, xerrors.Errorf("failed to get products from DB: %w", err) + } + productMap := make(map[string]bool) + for _, product := range products { + productMap[product.Name] = product.Enabled + } + return productMap, nil +} + +func (a *WebRPC) EnableDataSource(ctx context.Context, name string) error { + if name == "" { + return fmt.Errorf("empty data source name") + } + + // check if datasource exists in market_mk20_data_source + var count int + err := a.deps.DB.QueryRow(ctx, `SELECT COUNT(*) FROM market_mk20_data_source WHERE name = $1`, name).Scan(&count) + if err != nil { + return xerrors.Errorf("failed to check datasource: %w", err) + } + if count == 0 { + return fmt.Errorf("datasource does not exist") + } + n, err := a.deps.DB.Exec(ctx, `UPDATE market_mk20_data_source SET enabled = true WHERE name = $1`, name) + if err != nil { + return xerrors.Errorf("failed to enable datasource: %w", err) + } + if n == 0 { + return fmt.Errorf("failed to enable the datasource") + } + return nil +} + +func (a *WebRPC) DisableDataSource(ctx context.Context, name string) error { + if name == "" { + return fmt.Errorf("empty data source name") + } + // check if datasource exists in market_mk20_data_source + var count int + err := a.deps.DB.QueryRow(ctx, `SELECT COUNT(*) FROM market_mk20_data_source WHERE name = $1`, name).Scan(&count) + if err != nil { + return xerrors.Errorf("failed to check datasource: %w", err) + } + if count == 0 { + return fmt.Errorf("datasource does not exist") + } + n, err := a.deps.DB.Exec(ctx, `UPDATE market_mk20_data_source SET enabled = false WHERE name = $1`, name) + if err != nil { + return xerrors.Errorf("failed to disable datasource: %w", err) + } + if n == 0 { + return fmt.Errorf("failed to disable the datasource") + } + return nil +} + +func (a *WebRPC) ListDataSources(ctx context.Context) (map[string]bool, error) { + var datasources []struct { + Name string `db:"name"` + Enabled bool `db:"enabled"` + } + err := a.deps.DB.Select(ctx, &datasources, `SELECT name, enabled FROM market_mk20_data_source`) + if err != nil { + return nil, xerrors.Errorf("failed to get datasources from DB: %w", err) + } + + datasourceMap := make(map[string]bool) + for _, datasource := range datasources { + datasourceMap[datasource.Name] = datasource.Enabled + } + return datasourceMap, nil +} + +type UploadStatus struct { + ID string `json:"id"` + Status mk20.UploadStatus `json:"status"` +} + +func (a *WebRPC) ChunkUploadStatus(ctx context.Context, idStr string) (*UploadStatus, error) { + id, err := ulid.Parse(idStr) + if err != nil { + return nil, fmt.Errorf("invalid chunk upload id: %w", err) + } + + var status mk20.UploadStatus + + err = a.deps.DB.QueryRow(ctx, `SELECT + COUNT(*) AS total, + COUNT(*) FILTER (WHERE complete) AS complete, + COUNT(*) FILTER (WHERE NOT complete) AS missing, + ARRAY_AGG(chunk ORDER BY chunk) FILTER (WHERE complete) AS completed_chunks, + ARRAY_AGG(chunk ORDER BY chunk) FILTER (WHERE NOT complete) AS incomplete_chunks + FROM + market_mk20_deal_chunk + WHERE + id = $1 + GROUP BY + id;`, id.String()).Scan(&status.TotalChunks, &status.Uploaded, &status.Missing, &status.UploadedChunks, &status.MissingChunks) + if err != nil { + if !errors.Is(err, pgx.ErrNoRows) { + return nil, xerrors.Errorf("failed to get chunk upload status: %w", err) + } + return nil, nil + } + + return &UploadStatus{ + ID: idStr, + Status: status, + }, nil +} + +// MK20PDPPipeline represents a record from market_mk20_PDP_pipeline table +type MK20PDPPipeline struct { + ID string `db:"id" json:"id"` + Client string `db:"client" json:"client"` + PieceCidV2 string `db:"piece_cid_v2" json:"piece_cid_v2"` + Indexing bool `db:"indexing" json:"indexing"` + Announce bool `db:"announce" json:"announce"` + AnnouncePayload bool `db:"announce_payload" json:"announce_payload"` + + Downloaded bool `db:"downloaded" json:"downloaded"` + + CommpTaskId sql.NullInt64 `db:"commp_task_id" json:"commp_task_id"` + AfterCommp bool `db:"after_commp" json:"after_commp"` + + DealAggregation int `db:"deal_aggregation" json:"deal_aggregation"` + AggregationIndex int64 `db:"aggr_index" json:"aggr_index"` + AggregationTaskID sql.NullInt64 `db:"agg_task_id" json:"agg_task_id"` + Aggregated bool `db:"aggregated" json:"aggregated"` + + AddPieceTaskID sql.NullInt64 `db:"add_piece_task_id" json:"add_piece_task_id"` + AfterAddPiece bool `db:"after_add_piece" json:"after_add_piece"` + + AfterAddPieceMsg bool `db:"after_add_piece_msg" json:"after_add_piece_msg"` + + SaveCacheTaskID sql.NullInt64 `db:"save_cache_task_id" json:"save_cache_task_id"` + AfterSaveCache bool `db:"after_save_cache" json:"after_save_cache"` + + IndexingCreatedAt sql.NullTime `db:"indexing_created_at" json:"indexing_created_at"` + IndexingTaskId sql.NullInt64 `db:"indexing_task_id" json:"indexing_task_id"` + Indexed bool `db:"indexed" json:"indexed"` + + Complete bool `db:"complete" json:"complete"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + + Miner string `db:"-" json:"miner"` +} + +type MK20PDPDealList struct { + ID string `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + PieceCidV2 sql.NullString `db:"piece_cid_v2" json:"piece_cid_v2"` + Processed bool `db:"processed" json:"processed"` + Error sql.NullString `db:"error" json:"error"` +} + +func (a *WebRPC) MK20PDPStorageDeals(ctx context.Context, limit int, offset int) ([]*MK20PDPDealList, error) { + var pdpSummaries []*MK20PDPDealList + + err := a.deps.DB.Select(ctx, &pdpSummaries, `SELECT + d.created_at, + d.id, + d.piece_cid_v2, + (d.pdp_v1->>'error')::text AS error, + (d.pdp_v1->>'complete')::boolean as processed + FROM market_mk20_deal d + WHERE d.pdp_v1 IS NOT NULL AND d.pdp_v1 != 'null' + ORDER BY d.created_at DESC + LIMIT $1 OFFSET $2;`, limit, offset) + if err != nil { + return nil, fmt.Errorf("failed to fetch PDP deal list: %w", err) + } + + return pdpSummaries, nil +} + +func (a *WebRPC) MK20PDPPipelines(ctx context.Context, limit int, offset int) ([]*MK20PDPPipeline, error) { + if limit <= 0 { + limit = 25 + } + if limit > 100 { + limit = 100 + } + if offset < 0 { + offset = 0 + } + + var pipelines []*MK20PDPPipeline + err := a.deps.DB.Select(ctx, &pipelines, ` + SELECT + created_at, + id, + client, + piece_cid_v2, + indexing, + announce, + announce_payload, + downloaded, + commp_task_id, + after_commp, + deal_aggregation, + aggr_index, + agg_task_id, + aggregated, + add_piece_task_id, + after_add_piece, + after_add_piece_msg, + save_cache_task_id, + after_save_cache, + indexing_created_at, + indexing_task_id, + indexed, + complete + FROM pdp_pipeline + ORDER BY created_at DESC + LIMIT $1 OFFSET $2`, limit, offset) + if err != nil { + return nil, fmt.Errorf("failed to fetch pdp pipelines: %w", err) + } + + return pipelines, nil +} + +type MK20PDPPipelineFailedStats struct { + DownloadingFailed int64 + CommPFailed int64 + AggFailed int64 + AddPieceFailed int64 + SaveCacheFailed int64 + IndexFailed int64 +} + +func (a *WebRPC) MK20PDPPipelineFailedTasks(ctx context.Context) (*MK20PDPPipelineFailedStats, error) { + // We'll create a similar query, but this time we coalesce the task IDs from harmony_task. + // If the join fails (no matching harmony_task), all joined fields for that task will be NULL. + // We detect failure by checking that xxx_task_id IS NOT NULL, after_xxx = false, and that no task record was found in harmony_task. + + const query = ` + WITH pipeline_data AS ( + SELECT + dp.id, + dp.complete, + dp.commp_task_id, + dp.agg_task_id, + dp.add_piece_task_id, + dp.save_cache_task_id, + dp.indexing_task_id, + dp.after_commp, + dp.aggregated, + dp.after_add_piece, + dp.after_save_cache, + t.downloading_task_id + FROM pdp_pipeline dp + LEFT JOIN market_mk20_download_pipeline mdp + ON mdp.id = dp.id + AND mdp.piece_cid_v2 = dp.piece_cid_v2 + AND mdp.product = $1 + LEFT JOIN LATERAL ( + SELECT pp.task_id AS downloading_task_id + FROM unnest(mdp.ref_ids) AS r(ref_id) + JOIN parked_piece_refs pr ON pr.ref_id = r.ref_id + JOIN parked_pieces pp ON pp.id = pr.piece_id + WHERE pp.complete = FALSE + LIMIT 1 + ) t ON TRUE + WHERE dp.complete = FALSE + ), + tasks AS ( + SELECT p.*, + dt.id AS downloading_tid, + ct.id AS commp_tid, + at.id AS agg_tid, + ap.id as add_piece_tid, + sc.id as save_cache_tid, + it.id AS index_tid + FROM pipeline_data p + LEFT JOIN harmony_task dt ON dt.id = p.downloading_task_id + LEFT JOIN harmony_task ct ON ct.id = p.commp_task_id + LEFT JOIN harmony_task at ON at.id = p.agg_task_id + LEFT JOIN harmony_task ap ON ap.id = p.add_piece_task_id + LEFT JOIN harmony_task sc ON sc.id = p.save_cache_task_id + LEFT JOIN harmony_task it ON it.id = p.indexing_task_id + ) + SELECT + -- Downloading failed: + -- downloading_task_id IS NOT NULL, after_commp = false (haven't completed commp stage), + -- and downloading_tid IS NULL (no harmony_task record) + COUNT(*) FILTER ( + WHERE downloading_task_id IS NOT NULL + AND after_commp = false + AND downloading_tid IS NULL + ) AS downloading_failed, + + -- CommP (verify) failed: + -- commp_task_id IS NOT NULL, after_commp = false, commp_tid IS NULL + COUNT(*) FILTER ( + WHERE commp_task_id IS NOT NULL + AND after_commp = false + AND commp_tid IS NULL + ) AS commp_failed, + + -- Aggregation failed: + -- agg_task_id IS NOT NULL, aggregated = false, agg_tid IS NULL + COUNT(*) FILTER ( + WHERE agg_task_id IS NOT NULL + AND aggregated = false + AND agg_tid IS NULL + ) AS agg_failed, + + -- Add Piece failed: + -- add_piece_task_id IS NOT NULL, after_add_piece = false, add_piece_tid IS NULL + COUNT(*) FILTER ( + WHERE add_piece_task_id IS NOT NULL + AND after_add_piece = false + AND add_piece_tid IS NULL + ) AS add_piece_failed, + + -- Save Cache failed: + -- save_cache_task_id IS NOT NULL, after_save_cache = false, save_cache_tid IS NULL + COUNT(*) FILTER ( + WHERE save_cache_task_id IS NOT NULL + AND after_save_cache = false + AND save_cache_tid IS NULL + ) AS save_cache_failed, + + -- Index failed: + -- indexing_task_id IS NOT NULL and if we assume indexing is after find_deal: + -- If indexing_task_id is set, we are presumably at indexing stage. + -- If index_tid IS NULL (no task found), then it's failed. + -- We don't have after_index, now at indexing. + COUNT(*) FILTER ( + WHERE indexing_task_id IS NOT NULL + AND index_tid IS NULL + AND after_save_cache = true + ) AS index_failed + FROM tasks + ` + + var c []struct { + DownloadingFailed int64 `db:"downloading_failed"` + CommPFailed int64 `db:"commp_failed"` + AggFailed int64 `db:"agg_failed"` + AddPieceFailed int64 `db:"add_piece_failed"` + SaveCacheFailed int64 `db:"save_cache_failed"` + IndexFailed int64 `db:"index_failed"` + } + + err := a.deps.DB.Select(ctx, &c, query, mk20.ProductNamePDPV1) + if err != nil { + return nil, xerrors.Errorf("failed to run failed task query: %w", err) + } + + counts := c[0] + + return &MK20PDPPipelineFailedStats{ + DownloadingFailed: counts.DownloadingFailed, + CommPFailed: counts.CommPFailed, + AggFailed: counts.AggFailed, + AddPieceFailed: counts.AddPieceFailed, + SaveCacheFailed: counts.SaveCacheFailed, + IndexFailed: counts.IndexFailed, + }, nil +} + +func (a *WebRPC) MK20BulkRestartFailedPDPTasks(ctx context.Context, taskType string) error { + didCommit, err := a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { + var rows *harmonydb.Query + var err error + + switch taskType { + case "downloading": + rows, err = tx.Query(` + SELECT + t.task_id + FROM pdp_pipeline dp + LEFT JOIN market_mk20_download_pipeline mdp + ON mdp.id = dp.id + AND mdp.piece_cid_v2 = dp.piece_cid_v2 + AND mdp.product = $1 + LEFT JOIN LATERAL ( + SELECT pp.task_id + FROM unnest(mdp.ref_ids) AS r(ref_id) + JOIN parked_piece_refs pr ON pr.ref_id = r.ref_id + JOIN parked_pieces pp ON pp.id = pr.piece_id + WHERE pp.complete = FALSE + LIMIT 1 + ) AS t ON TRUE + LEFT JOIN harmony_task h ON h.id = t.task_id + WHERE dp.downloaded = FALSE + AND h.id IS NULL; + `, mk20.ProductNamePDPV1) + case "commp": + rows, err = tx.Query(` + SELECT dp.commp_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.commp_task_id + WHERE dp.complete = false + AND dp.downloaded = true + AND dp.commp_task_id IS NOT NULL + AND dp.after_commp = false + AND h.id IS NULL + `) + case "aggregate": + rows, err = tx.Query(` + SELECT dp.agg_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.agg_task_id + WHERE dp.complete = false + AND dp.after_commp = true + AND dp.agg_task_id IS NOT NULL + AND dp.aggregated = false + AND h.id IS NULL + `) + case "add_piece": + rows, err = tx.Query(` + SELECT dp.add_piece_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.add_piece_task_id + WHERE dp.complete = false + AND dp.aggregated = true + AND dp.add_piece_task_id IS NOT NULL + AND dp.after_add_piece = false + AND h.id IS NULL + `) + case "save_cache": + rows, err = tx.Query(` + SELECT dp.save_cache_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.save_cache_task_id + WHERE dp.complete = false + AND dp.after_add_piece = true + AND dp.after_add_piece_msg = true + AND dp.save_cache_task_id IS NOT NULL + AND dp.after_save_cache = false + AND h.id IS NULL + `) + case "index": + rows, err = tx.Query(` + SELECT dp.indexing_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.indexing_task_id + WHERE dp.complete = false + AND dp.indexing_task_id IS NOT NULL + AND dp.after_save_cache = true + AND h.id IS NULL + `) + default: + return false, fmt.Errorf("unknown task type: %s", taskType) + } + + if err != nil { + return false, fmt.Errorf("failed to query failed tasks: %w", err) + } + defer rows.Close() + + var taskIDs []int64 + for rows.Next() { + var tid int64 + if err := rows.Scan(&tid); err != nil { + return false, fmt.Errorf("failed to scan task_id: %w", err) + } + taskIDs = append(taskIDs, tid) + } + + if err := rows.Err(); err != nil { + return false, fmt.Errorf("row iteration error: %w", err) + } + + for _, taskID := range taskIDs { + var name string + var posted time.Time + var result bool + err = tx.QueryRow(` + SELECT name, posted, result + FROM harmony_task_history + WHERE task_id = $1 + ORDER BY id DESC LIMIT 1 + `, taskID).Scan(&name, &posted, &result) + if errors.Is(err, pgx.ErrNoRows) { + // No history means can't restart this task + continue + } else if err != nil { + return false, fmt.Errorf("failed to query history: %w", err) + } + + // If result=true means the task ended successfully, no restart needed + if result { + continue + } + + log.Infow("restarting task", "task_id", taskID, "name", name) + + _, err = tx.Exec(` + INSERT INTO harmony_task (id, initiated_by, update_time, posted_time, owner_id, added_by, previous_task, name) + VALUES ($1, NULL, NOW(), $2, NULL, $3, NULL, $4) + `, taskID, posted, a.deps.MachineID, name) + if err != nil { + return false, fmt.Errorf("failed to insert harmony_task for task_id %d: %w", taskID, err) + } + } + + // All done successfully, commit the transaction + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return err + } + if !didCommit { + return fmt.Errorf("transaction did not commit") + } + + return nil +} + +func (a *WebRPC) MK20BulkRemoveFailedPDPPipelines(ctx context.Context, taskType string) error { + didCommit, err := a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { + var rows *harmonydb.Query + var err error + + // We'll select pipeline fields directly based on the stage conditions + switch taskType { + case "downloading": + rows, err = tx.Query(` + SELECT + dp.id, + dp.piece_ref, + dp.commp_task_id, + dp.agg_task_id, + dp.add_piece_task_id, + dp.save_cache_task_id, + dp.indexing_task_id + FROM pdp_pipeline dp + LEFT JOIN market_mk20_download_pipeline mdp + ON mdp.id = dp.id + AND mdp.piece_cid_v2 = dp.piece_cid_v2 + AND mdp.product = $1 + LEFT JOIN LATERAL ( + SELECT pp.task_id + FROM unnest(mdp.ref_ids) AS r(ref_id) + JOIN parked_piece_refs pr ON pr.ref_id = r.ref_id + JOIN parked_pieces pp ON pp.id = pr.piece_id + WHERE pp.task_id IS NOT NULL + LIMIT 1 + ) t ON TRUE + LEFT JOIN harmony_task h ON h.id = t.task_id + WHERE dp.complete = FALSE + AND dp.downloaded = FALSE + AND t.task_id IS NOT NULL + AND h.id IS NULL; + `, mk20.ProductNamePDPV1) + case "commp": + rows, err = tx.Query(` + SELECT dp.id, dp.piece_ref, dp.commp_task_id, dp.agg_task_id, dp.add_piece_task_id, dp.save_cache_task_id, dp.indexing_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.commp_task_id + WHERE dp.complete = false + AND dp.downloaded = true + AND dp.commp_task_id IS NOT NULL + AND dp.after_commp = false + AND h.id IS NULL + `) + case "aggregate": + rows, err = tx.Query(` + SELECT dp.id, dp.piece_ref, dp.commp_task_id, dp.agg_task_id, dp.add_piece_task_id, dp.save_cache_task_id, dp.indexing_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.agg_task_id + WHERE dp.complete = false + AND after_commp = true + AND dp.agg_task_id IS NOT NULL + AND dp.aggregated = false + AND h.id IS NULL + `) + case "add_piece": + rows, err = tx.Query(` + SELECT dp.id, dp.piece_ref, dp.commp_task_id, dp.agg_task_id, dp.add_piece_task_id, dp.save_cache_task_id, dp.indexing_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.agg_task_id + WHERE dp.complete = false + AND aggregated = true + AND dp.add_piece_task_id IS NOT NULL + AND dp.after_add_piece = false + AND h.id IS NULL + `) + case "save_cache": + rows, err = tx.Query(` + SELECT dp.id, dp.piece_ref, dp.commp_task_id, dp.agg_task_id, dp.add_piece_task_id, dp.save_cache_task_id, dp.indexing_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.agg_task_id + WHERE dp.complete = false + AND after_add_piece = true + AND after_add_piece_msg = true + AND dp.save_cache_task_id IS NOT NULL + AND dp.after_save_cache = false + AND h.id IS NULL + `) + case "index": + rows, err = tx.Query(` + SELECT dp.id, dp.piece_ref, dp.commp_task_id, dp.agg_task_id, dp.add_piece_task_id, dp.save_cache_task_id, dp.indexing_task_id + FROM pdp_pipeline dp + LEFT JOIN harmony_task h ON h.id = dp.indexing_task_id + WHERE dp.complete = false + AND after_save_cache = true + AND dp.indexing_task_id IS NOT NULL + AND h.id IS NULL + `) + default: + return false, fmt.Errorf("unknown task type: %s", taskType) + } + + if err != nil { + return false, fmt.Errorf("failed to query failed pipelines: %w", err) + } + defer rows.Close() + + type pipelineInfo struct { + id string + refID sql.NullInt64 + commpTaskID sql.NullInt64 + aggTaskID sql.NullInt64 + addPieceTaskID sql.NullInt64 + saveCacheTask sql.NullInt64 + indexingTaskID sql.NullInt64 + } + + var pipelines []pipelineInfo + for rows.Next() { + var p pipelineInfo + if err := rows.Scan(&p.id, &p.refID, &p.commpTaskID, &p.aggTaskID, &p.addPieceTaskID, &p.saveCacheTask, &p.indexingTaskID); err != nil { + return false, fmt.Errorf("failed to scan pdp pipeline info: %w", err) + } + pipelines = append(pipelines, p) + } + if err := rows.Err(); err != nil { + return false, fmt.Errorf("row iteration error: %w", err) + } + + for _, p := range pipelines { + // Gather task IDs + var taskIDs []int64 + if p.commpTaskID.Valid { + taskIDs = append(taskIDs, p.commpTaskID.Int64) + } + if p.aggTaskID.Valid { + taskIDs = append(taskIDs, p.aggTaskID.Int64) + } + if p.addPieceTaskID.Valid { + taskIDs = append(taskIDs, p.addPieceTaskID.Int64) + } + if p.saveCacheTask.Valid { + taskIDs = append(taskIDs, p.saveCacheTask.Int64) + } + if p.indexingTaskID.Valid { + taskIDs = append(taskIDs, p.indexingTaskID.Int64) + } + + if len(taskIDs) > 0 { + var runningTasks int + err = tx.QueryRow(`SELECT COUNT(*) FROM harmony_task WHERE id = ANY($1)`, taskIDs).Scan(&runningTasks) + if err != nil { + return false, err + } + if runningTasks > 0 { + // This should not happen if they are failed, but just in case + return false, fmt.Errorf("cannot remove deal pipeline %s: tasks are still running", p.id) + } + } + + n, err := tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set( + jsonb_set(pdp_v1, '{error}', to_jsonb($1::text), true), + '{complete}', to_jsonb(true), true + ) + WHERE id = $2;`, "Transaction failed", p.id) // TODO: Add Correct error + + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + + _, err = tx.Exec(`DELETE FROM pdp_pipeline WHERE id = $1`, p.id) + if err != nil { + return false, xerrors.Errorf("failed to clean up pdp pipeline: %w", err) + } + + if p.refID.Valid { + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = $1`, p.refID.Int64) + if err != nil { + return false, fmt.Errorf("failed to remove parked_piece_refs for pipeline %s: %w", p.id, err) + } + } + + log.Infow("removed failed PDP pipeline", "id", p.id) + } + + return true, nil + }, harmonydb.OptionRetry()) + + if err != nil { + return err + } + if !didCommit { + return fmt.Errorf("transaction did not commit") + } + + return nil +} + +func (a *WebRPC) MK20PDPPipelineRemove(ctx context.Context, id string) error { + _, err := ulid.Parse(id) + if err != nil { + return err + } + + _, err = a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) { + var pipelines []struct { + Ref sql.NullInt64 `db:"piece_ref"` + + CommpTaskID sql.NullInt64 `db:"commp_task_id"` + AggrTaskID sql.NullInt64 `db:"agg_task_id"` + AddPieceTaskID sql.NullInt64 `db:"add_piece_task_id"` + SaveCacheTask sql.NullInt64 `db:"save_cache_task"` + IndexingTaskID sql.NullInt64 `db:"indexing_task_id"` + } + + err = tx.Select(&pipelines, `SELECT piece_ref, sector, commp_task_id, agg_task_id, indexing_task_id + FROM market_mk20_pipeline WHERE id = $1`, id) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return false, fmt.Errorf("no deal pipeline found with id %s", id) + } + return false, err + } + + if len(pipelines) == 0 { + return false, fmt.Errorf("no deal pipeline found with id %s", id) + } + + // Collect non-null task IDs + var taskIDs []int64 + for _, pipeline := range pipelines { + if pipeline.CommpTaskID.Valid { + taskIDs = append(taskIDs, pipeline.CommpTaskID.Int64) + } + if pipeline.AggrTaskID.Valid { + taskIDs = append(taskIDs, pipeline.AggrTaskID.Int64) + } + if pipeline.AddPieceTaskID.Valid { + taskIDs = append(taskIDs, pipeline.AddPieceTaskID.Int64) + } + if pipeline.SaveCacheTask.Valid { + taskIDs = append(taskIDs, pipeline.SaveCacheTask.Int64) + } + if pipeline.IndexingTaskID.Valid { + taskIDs = append(taskIDs, pipeline.IndexingTaskID.Int64) + } + } + + // Check if any tasks are still running + if len(taskIDs) > 0 { + var runningTasks int + err = tx.QueryRow(`SELECT COUNT(*) FROM harmony_task WHERE id = ANY($1)`, taskIDs).Scan(&runningTasks) + if err != nil { + return false, err + } + if runningTasks > 0 { + return false, fmt.Errorf("cannot remove deal pipeline %s: tasks are still running", id) + } + } + + n, err := tx.Exec(`UPDATE market_mk20_deal + SET pdp_v1 = jsonb_set( + jsonb_set(pdp_v1, '{error}', to_jsonb($1::text), true), + '{complete}', to_jsonb(true), true + ) + WHERE id = $2;`, "Transaction failed", id) // TODO: Add Correct error + + if err != nil { + return false, xerrors.Errorf("failed to update market_mk20_deal: %w", err) + } + if n != 1 { + return false, xerrors.Errorf("expected 1 row to be updated, got %d", n) + } + + _, err = tx.Exec(`DELETE FROM pdp_pipeline WHERE id = $1`, id) + if err != nil { + return false, xerrors.Errorf("failed to clean up pdp pipeline: %w", err) + } + + for _, pipeline := range pipelines { + if pipeline.Ref.Valid { + _, err = tx.Exec(`DELETE FROM parked_piece_refs WHERE ref_id = $1`, pipeline.Ref) + if err != nil { + return false, fmt.Errorf("failed to remove parked_piece_refs for pipeline %s: %w", id, err) + } + } + } + + return true, nil + }, harmonydb.OptionRetry()) + return err +} diff --git a/web/api/webrpc/market_filters.go b/web/api/webrpc/market_filters.go index 164d7ab4e..14c45b10b 100644 --- a/web/api/webrpc/market_filters.go +++ b/web/api/webrpc/market_filters.go @@ -416,7 +416,7 @@ func (a *WebRPC) DefaultFilterBehaviour(ctx context.Context) (*DefaultFilterBeha var cfgminers []address.Address var cgminer []address.Address - lo.ForEach(lo.Keys(a.deps.Maddrs), func(item dtypes.MinerAddress, _ int) { + lo.ForEach(lo.Keys(a.deps.Maddrs.Get()), func(item dtypes.MinerAddress, _ int) { cfgminers = append(cfgminers, address.Address(item)) }) diff --git a/web/api/webrpc/pdp.go b/web/api/webrpc/pdp.go index c6c2f99a1..fdb6b2cef 100644 --- a/web/api/webrpc/pdp.go +++ b/web/api/webrpc/pdp.go @@ -6,14 +6,20 @@ import ( "crypto/x509" "encoding/hex" "encoding/pem" + "errors" "fmt" + "math/big" + "net/url" "strings" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/yugabyte/pgx/v5" - xerrors "golang.org/x/xerrors" + "golang.org/x/xerrors" "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/pdp/contract" ) // PDPService represents a PDP service @@ -164,12 +170,14 @@ func (a *WebRPC) ImportPDPKey(ctx context.Context, hexPrivateKey string) (string // Insert into the database within a transaction _, err = a.deps.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (bool, error) { // Check if the owner_address already exists - var existingAddress string - err := tx.QueryRow(`SELECT address FROM eth_keys WHERE address = $1 AND role = 'pdp'`, address).Scan(&existingAddress) - if err == nil { + var existingAddress bool + + err := tx.QueryRow(`SELECT EXISTS(SELECT 1 FROM eth_keys WHERE role = 'pdp')`).Scan(&existingAddress) + if err != nil { + return false, xerrors.Errorf("failed to check existing owner address: %v", err) + } + if existingAddress { return false, fmt.Errorf("owner address %s already exists", address) - } else if err != pgx.ErrNoRows { - return false, fmt.Errorf("failed to check existing owner address: %v", err) } // Insert the new owner address and private key @@ -210,7 +218,7 @@ func (a *WebRPC) RemovePDPKey(ctx context.Context, ownerAddress string) error { var existingAddress string err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE address = $1 AND role = 'pdp'`, ownerAddress).Scan(&existingAddress) if err != nil { - if err == pgx.ErrNoRows { + if errors.Is(err, pgx.ErrNoRows) { return fmt.Errorf("owner address %s does not exist", ownerAddress) } log.Errorf("RemovePDPKey: failed to check existing owner address: %v", err) @@ -226,3 +234,351 @@ func (a *WebRPC) RemovePDPKey(ctx context.Context, ownerAddress string) error { return nil } + +type FSRegistryStatus struct { + Address string `json:"address"` + ID int64 `json:"id"` + Active bool `json:"status"` + Name string `json:"name"` + Description string `json:"description"` + Payee string `json:"payee"` + PDPService *FSPDPOffering `json:"pdp_service"` + Capabilities map[string]string `json:"capabilities"` +} + +type FSPDPOffering struct { + ServiceURL string `json:"service_url"` + MinPieceSizeInBytes int64 `json:"min_size"` + MaxPieceSizeInBytes int64 `json:"max_size"` + IpniPiece bool `json:"ipni_piece"` + IpniIpfs bool `json:"ipni_ipfs"` + StoragePricePerTibPerMonth int64 `json:"price"` + MinProvingPeriodInEpochs int64 `json:"min_proving_period"` + Location string `json:"location"` +} + +func (a *WebRPC) FSRegistryStatus(ctx context.Context) (*FSRegistryStatus, error) { + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return nil, fmt.Errorf("no PDP key found") + } + return nil, fmt.Errorf("failed to retrieve PDP key") + } + + eclient, err := a.deps.EthClient.Val() + if err != nil { + return nil, fmt.Errorf("failed to get eth client: %w", err) + } + + registryAddr, err := contract.ServiceRegistryAddress() + if err != nil { + return nil, fmt.Errorf("failed to get service registry address: %w", err) + } + + registry, err := contract.NewServiceProviderRegistry(registryAddr, eclient) + if err != nil { + return nil, fmt.Errorf("failed to create service registry: %w", err) + } + + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return nil, fmt.Errorf("failed to check if provider is registered: %w", err) + } + + if !registered { + return nil, nil + } + + provider, err := registry.GetProviderByAddress(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return nil, fmt.Errorf("failed to get provider: %w", err) + } + + pdpOffering, err := registry.GetPDPService(&bind.CallOpts{Context: ctx}, provider.ProviderId) + if err != nil { + return nil, fmt.Errorf("failed to get PDP offering: %w", err) + } + + capabilityValues, err := registry.GetProductCapabilities(&bind.CallOpts{Context: ctx}, provider.ProviderId, uint8(0), pdpOffering.CapabilityKeys) + if err != nil { + return nil, fmt.Errorf("failed to get capability values: %w", err) + } + + capabilities := make(map[string]string) + for i := range pdpOffering.CapabilityKeys { + if capabilityValues.Exists[i] { + capabilities[pdpOffering.CapabilityKeys[i]] = capabilityValues.Values[i] + } else { + capabilities[pdpOffering.CapabilityKeys[i]] = "" + } + } + + return &FSRegistryStatus{ + Address: existingAddress, + ID: provider.ProviderId.Int64(), + Active: provider.IsActive, + Payee: provider.Payee.String(), + Name: provider.Name, + Description: provider.Description, + Capabilities: capabilities, + PDPService: &FSPDPOffering{ + ServiceURL: pdpOffering.PdpOffering.ServiceURL, + MinPieceSizeInBytes: pdpOffering.PdpOffering.MinPieceSizeInBytes.Int64(), + MaxPieceSizeInBytes: pdpOffering.PdpOffering.MaxPieceSizeInBytes.Int64(), + IpniPiece: pdpOffering.PdpOffering.IpniPiece, + IpniIpfs: pdpOffering.PdpOffering.IpniIpfs, + StoragePricePerTibPerMonth: pdpOffering.PdpOffering.StoragePricePerTibPerMonth.Int64(), + MinProvingPeriodInEpochs: pdpOffering.PdpOffering.MinProvingPeriodInEpochs.Int64(), + Location: pdpOffering.PdpOffering.Location, + }, + }, nil +} + +func (a *WebRPC) FSRegister(ctx context.Context, name, description, location string) error { + if name == "" { + return fmt.Errorf("name cannot be empty") + } + if description == "" { + return fmt.Errorf("description cannot be empty") + } + + if len(name) > 128 { + return fmt.Errorf("name cannot be longer than 128 characters") + } + + if len(description) > 256 { + return fmt.Errorf("description cannot be longer than 256 characters") + } + + if location == "" { + location = "Unknown" + } + + if len(location) > 128 { + return xerrors.Errorf("location must be less than 128 characters") + } + + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return fmt.Errorf("no PDP key found") + } + return fmt.Errorf("failed to retrieve PDP key") + } + + eclient, err := a.deps.EthClient.Val() + if err != nil { + return fmt.Errorf("failed to get eth client: %w", err) + } + + registryAddr, err := contract.ServiceRegistryAddress() + if err != nil { + return fmt.Errorf("failed to get service registry address: %w", err) + } + + registry, err := contract.NewServiceProviderRegistry(registryAddr, eclient) + if err != nil { + return fmt.Errorf("failed to create service registry: %w", err) + } + + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return fmt.Errorf("failed to check if provider is registered: %w", err) + } + + if registered { + return xerrors.Errorf("provider is already registered") + } + + serviceURL := url.URL{ + Scheme: "https", + Host: a.deps.Cfg.HTTP.DomainName, + } + + offering := contract.ServiceProviderRegistryStoragePDPOffering{ + ServiceURL: serviceURL.String(), + MinPieceSizeInBytes: big.NewInt(1024 * 1024), // 1 MiB + MaxPieceSizeInBytes: big.NewInt(64 * 1024 * 1024 * 1024), // 64 GiB + IpniPiece: true, + IpniIpfs: true, + StoragePricePerTibPerMonth: big.NewInt(100000), // 1 USDFC per TiB per month + MinProvingPeriodInEpochs: big.NewInt(1440), // 12 hours + Location: location, + PaymentTokenAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + } + + id, err := contract.FSRegister(ctx, a.deps.DB, a.deps.Chain, eclient, name, description, offering, nil) + if err != nil { + return xerrors.Errorf("failed to register storage provider with service contract: %w", err) + } + + log.Infof("FSRegister: registered PDP provider with ID %d", id) + + return nil +} + +func (a *WebRPC) FSUpdateProvider(ctx context.Context, name, description string) error { + if name == "" { + return fmt.Errorf("name cannot be empty") + } + if description == "" { + return fmt.Errorf("description cannot be empty") + } + + if len(name) > 128 { + return fmt.Errorf("name cannot be longer than 128 characters") + } + + if len(description) > 256 { + return fmt.Errorf("description cannot be longer than 256 characters") + } + + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return fmt.Errorf("no PDP key found") + } + return fmt.Errorf("failed to retrieve PDP key") + } + + eclient, err := a.deps.EthClient.Val() + if err != nil { + return fmt.Errorf("failed to get eth client: %w", err) + } + + registryAddr, err := contract.ServiceRegistryAddress() + if err != nil { + return fmt.Errorf("failed to get service registry address: %w", err) + } + + registry, err := contract.NewServiceProviderRegistry(registryAddr, eclient) + if err != nil { + return fmt.Errorf("failed to create service registry: %w", err) + } + + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return fmt.Errorf("failed to check if provider is registered: %w", err) + } + + if !registered { + return xerrors.Errorf("provider is not registered") + } + + hash, err := contract.FSUpdateProvider(ctx, name, description, a.deps.DB, eclient) + if err != nil { + return xerrors.Errorf("failed to update service provider info: %w", err) + } + + log.Infof("FSRegister: registered PDP provider details updated with transaction %s", hash) + + return nil +} + +func (a *WebRPC) FSUpdatePDP(ctx context.Context, pdpOffering *FSPDPOffering, capabilities map[string]string) error { + if pdpOffering == nil { + return fmt.Errorf("pdp offering cannot be empty") + } + + if pdpOffering.ServiceURL == "" { + return fmt.Errorf("service URL cannot be empty") + } else { + _, err := url.Parse(pdpOffering.ServiceURL) + if err != nil { + return fmt.Errorf("invalid service URL") + } + } + + if pdpOffering.MinPieceSizeInBytes < 1024*1024 { + return fmt.Errorf("minimum piece size must be at least 1 MiB") + } else if pdpOffering.MaxPieceSizeInBytes < 1024*1024 { + return fmt.Errorf("maximum piece size must be at least 1 MiB") + } else if pdpOffering.MaxPieceSizeInBytes < pdpOffering.MinPieceSizeInBytes { + return fmt.Errorf("maximum piece size must be greater than minimum piece size") + } else if pdpOffering.MaxPieceSizeInBytes > 64*1024*1024*1024 { + return fmt.Errorf("maximum piece size must be less than 64 GiB") + } + + if pdpOffering.StoragePricePerTibPerMonth < 0 { + return fmt.Errorf("storage price per TiB per month must be greater than or equal to 0") + } + + if pdpOffering.MinProvingPeriodInEpochs < 0 { + return fmt.Errorf("minimum proving period in epochs must be greater than or equal to 0") + } + + if pdpOffering.Location == "" { + pdpOffering.Location = "Unknown" + } + + if len(pdpOffering.Location) > 128 { + return fmt.Errorf("location cannot be longer than 128 characters") + } + + for k, v := range capabilities { + if len(k) > 32 { + return xerrors.Errorf("capabilities key %s is too long, max 32 characters allowed", k) + } + if len(v) > 128 { + return xerrors.Errorf("capabilities value %s is too long, max 128 characters allowed", v) + } + } + + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return fmt.Errorf("no PDP key found") + } + return fmt.Errorf("failed to retrieve PDP key") + } + + eclient, err := a.deps.EthClient.Val() + if err != nil { + return fmt.Errorf("failed to get eth client: %w", err) + } + + registryAddr, err := contract.ServiceRegistryAddress() + if err != nil { + return fmt.Errorf("failed to get service registry address: %w", err) + } + + registry, err := contract.NewServiceProviderRegistry(registryAddr, eclient) + if err != nil { + return fmt.Errorf("failed to create service registry: %w", err) + } + + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return fmt.Errorf("failed to check if provider is registered: %w", err) + } + + if !registered { + return xerrors.Errorf("provider is not registered") + } + + offering := contract.ServiceProviderRegistryStoragePDPOffering{ + ServiceURL: pdpOffering.ServiceURL, + MinPieceSizeInBytes: big.NewInt(pdpOffering.MinPieceSizeInBytes), + MaxPieceSizeInBytes: big.NewInt(pdpOffering.MaxPieceSizeInBytes), + IpniPiece: pdpOffering.IpniPiece, + IpniIpfs: pdpOffering.IpniIpfs, + StoragePricePerTibPerMonth: big.NewInt(pdpOffering.StoragePricePerTibPerMonth), + MinProvingPeriodInEpochs: big.NewInt(pdpOffering.MinProvingPeriodInEpochs), + Location: pdpOffering.Location, + PaymentTokenAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + } + + hash, err := contract.FSUpdatePDPService(ctx, a.deps.DB, eclient, offering, capabilities) + if err != nil { + return xerrors.Errorf("failed to update service provider info: %w", err) + } + + log.Infof("FSRegister: updated PDP provider product details with transaction %s", hash) + + return nil +} diff --git a/web/api/webrpc/sector.go b/web/api/webrpc/sector.go index 2078a3aa7..73e9353a6 100644 --- a/web/api/webrpc/sector.go +++ b/web/api/webrpc/sector.go @@ -7,11 +7,13 @@ import ( "time" "github.com/docker/go-units" + "github.com/ipfs/go-cid" "github.com/samber/lo" "github.com/snadrus/must" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -115,6 +117,7 @@ type SectorPieceMeta struct { PieceIndex int64 `db:"piece_index"` PieceCid string `db:"piece_cid"` PieceSize int64 `db:"piece_size"` + PieceCidV2 string `db:"-"` DealID *string `db:"deal_id"` DataUrl *string `db:"data_url"` @@ -513,6 +516,20 @@ func (a *WebRPC) SectorInfo(ctx context.Context, sp string, intid int64) (*Secto pieces[i].StrPieceSize = types.SizeStr(types.NewInt(uint64(pieces[i].PieceSize))) pieces[i].StrDataRawSize = types.SizeStr(types.NewInt(uint64(derefOrZero(pieces[i].DataRawSize)))) + pcid, err := cid.Parse(pieces[i].PieceCid) + if err != nil { + return nil, xerrors.Errorf("failed to parse piece cid: %w", err) + } + + if pieces[i].DataRawSize != nil { + pcid2, err := commcid.PieceCidV2FromV1(pcid, uint64(*pieces[i].DataRawSize)) + if err != nil { + return nil, xerrors.Errorf("failed to generate piece cid v2: %w", err) + } + + pieces[i].PieceCidV2 = pcid2.String() + } + id, isPiecePark := strings.CutPrefix(derefOrZero(pieces[i].DataUrl), "pieceref:") if !isPiecePark { continue diff --git a/web/srv.go b/web/srv.go index 92d99ae48..398c6048c 100644 --- a/web/srv.go +++ b/web/srv.go @@ -41,7 +41,73 @@ var webDev = os.Getenv("CURIO_WEB_DEV") == "1" func GetSrv(ctx context.Context, deps *deps.Deps, devMode bool) (*http.Server, error) { mx := mux.NewRouter() - mx.Use(corsMiddleware) + + // Single CORS middleware that handles all CORS logic + // Wrap the entire router to ensure middleware runs for all requests including unmatched routes + corsHandler := func(next http.Handler) http.Handler { + for _, ao := range deps.Cfg.HTTP.CORSOrigins { + if ao == "*" { + log.Infof("This CORS configuration allows any website to call irreversable APIs on the Curio node: %s", ao) + } + } + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Handle OPTIONS preflight requests - always return 204, even if CORS not configured + if r.Method == http.MethodOptions { + if len(deps.Cfg.HTTP.CORSOrigins) > 0 { + origin := r.Header.Get("Origin") + var allowedOrigin string + allowed := false + + // Check if origin is allowed + for _, ao := range deps.Cfg.HTTP.CORSOrigins { + if ao == "*" || ao == origin { + allowedOrigin = ao + allowed = true + break + } + } + + if allowed { + if allowedOrigin == "*" { + + w.Header().Set("Access-Control-Allow-Origin", "*") + } else { + w.Header().Set("Access-Control-Allow-Origin", origin) + } + } + w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, PATCH") + requestHeaders := r.Header.Get("Access-Control-Request-Headers") + if requestHeaders != "" { + w.Header().Set("Access-Control-Allow-Headers", requestHeaders) + } else { + w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, Accept-Encoding") + } + w.Header().Set("Access-Control-Max-Age", "86400") + } + w.WriteHeader(http.StatusNoContent) + return + } + + // Set CORS headers for non-OPTIONS requests if CORS is configured + if len(deps.Cfg.HTTP.CORSOrigins) > 0 { + origin := r.Header.Get("Origin") + if origin != "" { + for _, ao := range deps.Cfg.HTTP.CORSOrigins { + if ao == "*" || ao == origin { + if ao == "*" { + w.Header().Set("Access-Control-Allow-Origin", "*") + } else { + w.Header().Set("Access-Control-Allow-Origin", origin) + } + break + } + } + } + } + + next.ServeHTTP(w, r) + }) + } if !devMode { api.Routes(mx.PathPrefix("/api").Subrouter(), deps, webDev) @@ -90,7 +156,7 @@ func GetSrv(ctx context.Context, deps *deps.Deps, devMode bool) (*http.Server, e }) return &http.Server{ - Handler: http.HandlerFunc(mx.ServeHTTP), + Handler: corsHandler(mx), BaseContext: func(listener net.Listener) context.Context { ctx, _ := tag.New(context.Background(), tag.Upsert(metrics.APIInterface, "curio")) return ctx @@ -278,19 +344,3 @@ func proxyCopy(dst, src *websocket.Conn, errc chan<- error, direction string) { } } } - -func corsMiddleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") - w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization") - w.Header().Set("Access-Control-Allow-Credentials", "true") - - if r.Method == http.MethodOptions { - w.WriteHeader(http.StatusOK) - return - } - - next.ServeHTTP(w, r) - }) -} diff --git a/web/static/config/edit.html b/web/static/config/edit.html index f9dbc6cc2..d2be1ec6c 100644 --- a/web/static/config/edit.html +++ b/web/static/config/edit.html @@ -76,6 +76,24 @@ color: white; font-weight: bold; } + + /* Hide the info button tooltips */ + .jsoneditor-twbs5-text-button[data-toggle="tooltip"] { + display: none !important; + } + + /* Style for field descriptions that we'll inject */ + .field-description { + display: block; + color: #aaa; + font-size: 0.875rem; + margin-top: 4px; + margin-bottom: 8px; + font-style: italic; + line-height: 1.4; + max-width: 100%; + white-space: pre-wrap; + }
        @@ -118,10 +136,52 @@ disable_edit_json: true, form_name_root: "Configuration", disable_properties: true, + show_errors: "always", + display_required_only: false, + remove_button_labels: false, }; editor = new JSONEditor(container, options); + // Function to convert tooltip buttons to visible descriptions + function showDescriptions() { + const infoButtons = document.querySelectorAll('.jsoneditor-twbs5-text-button[data-toggle="tooltip"]'); + infoButtons.forEach(button => { + // Bootstrap 5 moves title to data-bs-original-title + const description = button.getAttribute('data-bs-original-title') || button.getAttribute('title'); + if (description) { + // Create a description div + const descDiv = document.createElement('div'); + descDiv.className = 'field-description'; + descDiv.textContent = description.replace(/"/g, '"'); + + // Find the parent form group and insert description + let parent = button.closest('.form-group'); + if (!parent) { + parent = button.closest('.card-body'); + } + if (!parent) { + parent = button.parentElement; + } + + // Check if description hasn't been added already + if (parent && !parent.querySelector('.field-description')) { + parent.appendChild(descDiv); + } + } + }); + } + + // Call after editor is ready and on any changes + editor.on('ready', function() { + showDescriptions(); + }); + + // Re-run when editor changes (for dynamic fields) + editor.on('change', function() { + setTimeout(showDescriptions, 100); + }); + document.getElementById("helpBtn").addEventListener("click", function() { var helpText = document.getElementById("helpText"); if (helpText.classList.contains("hidden")) { diff --git a/web/static/pages/actor/actor-detail.mjs b/web/static/pages/actor/actor-detail.mjs index 63b57692f..3c4247294 100644 --- a/web/static/pages/actor/actor-detail.mjs +++ b/web/static/pages/actor/actor-detail.mjs @@ -99,7 +99,9 @@ customElements.define('actor-detail', class Actor extends LitElement { Source Config Layers: - ${actorInfo.Summary.CLayers} + + ${actorInfo.Summary.CLayers.map(layer => html`${layer} `)} + Sector Size: @@ -388,6 +390,7 @@ class ActorCharts extends LitElement { const firstAll = this.data.All[0]?.BucketEpoch ?? Infinity; const firstCC = this.data.CC[0]?.BucketEpoch ?? Infinity; const nowEpoch = Math.min(firstAll, firstCC); + const blockDelaySeconds = this.data.BlockDelaySeconds // --------------------------- // 1) EXPIRATION CHART (All vs. CC) @@ -423,7 +426,7 @@ class ActorCharts extends LitElement { }, ], }, - options: this.createChartOptions('Expiration (Count)', 'Count', nowEpoch, allExpData, ccExpData), + options: this.createChartOptions('Expiration (Count)', 'Count', nowEpoch, blockDelaySeconds, allExpData, ccExpData), }; if (!this.chartExpiration) { @@ -455,14 +458,14 @@ class ActorCharts extends LitElement { borderColor: 'rgb(255, 205, 86)', backgroundColor: 'rgba(255, 205, 86, 0.2)', borderWidth: 1, - stepped: true, + stepped: 'after', fill: true, pointRadius: 2, data: allQAPData, }, ], }, - options: this.createChartOptions('Quality-Adjusted Power', 'QAP', nowEpoch, allQAPData), + options: this.createChartOptions('Quality-Adjusted Power', 'QAP', nowEpoch, blockDelaySeconds, allQAPData), }; if (!this.chartQAP) { @@ -494,7 +497,7 @@ class ActorCharts extends LitElement { borderColor: 'rgb(153, 102, 255)', backgroundColor: 'rgba(153, 102, 255, 0.2)', borderWidth: 1, - stepped: true, + stepped: 'after', fill: true, pointRadius: 2, data: allLockedData, @@ -505,6 +508,7 @@ class ActorCharts extends LitElement { 'Vesting Locked Funds', 'Locked Funds (FIL)', nowEpoch, + blockDelaySeconds, allLockedData ), }; @@ -525,10 +529,11 @@ class ActorCharts extends LitElement { * @param {string} chartTitle - The chart title * @param {string} yTitle - Label for Y axis * @param {number} nowEpoch - The earliest epoch we consider "current" + * @param {number} blockDelaySeconds - The BlockDelaySeconds for the build * @param {Array} allData - The data array for the "All" set * @param {Array} [ccData] - Optional data array for the "CC" set */ - createChartOptions(chartTitle, yTitle, nowEpoch, allData, ccData = []) { + createChartOptions(chartTitle, yTitle, nowEpoch, blockDelaySeconds, allData, ccData = []) { return { responsive: true, maintainAspectRatio: false, @@ -544,12 +549,12 @@ class ActorCharts extends LitElement { callbacks: { label: (context) => { const epochVal = context.parsed.x; - const daysOffset = Math.round(((epochVal - nowEpoch) * 30) / 86400); + const daysOffset = Math.round(((epochVal - nowEpoch) * blockDelaySeconds) / 86400); const months = (daysOffset / 30).toFixed(1); let value; if (yTitle === 'QAP') { - value = this.toHumanBytes(context.parsed.y); // For QAP + value = toHumanBytes(context.parsed.y); // For QAP } else if (yTitle === 'Locked Funds (FIL)') { value = this.toHumanFIL(context.parsed.y); // For Vesting } else { @@ -574,7 +579,7 @@ class ActorCharts extends LitElement { }, ticks: { callback: (value) => { - const days = Math.round(((value - nowEpoch) * 30) / 86400); + const days = Math.round(((value - nowEpoch) * blockDelaySeconds) / 86400); return days + 'd'; }, font: { diff --git a/web/static/pages/ipfs-content/content.mjs b/web/static/pages/ipfs-content/content.mjs new file mode 100644 index 000000000..f2c6f9003 --- /dev/null +++ b/web/static/pages/ipfs-content/content.mjs @@ -0,0 +1,125 @@ +import { LitElement, html, css } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; + +class ContentPage extends LitElement { + static properties = { + searchCid: { type: String }, + results: { type: Array }, + loading: { type: Boolean }, + error: { type: String } + }; + + constructor() { + super(); + this.searchCid = ''; + this.results = []; + this.loading = false; + this.error = ''; + } + + handleInput(e) { + this.searchCid = e.target.value; + } + + async handleFind() { + if (!this.searchCid.trim()) { + this.error = 'Please enter a CID'; + return; + } + + this.loading = true; + this.error = ''; + this.results = []; + + try { + const results = await RPCCall('FindContentByCID', [this.searchCid.trim()]); + this.results = results || []; + if (this.results.length === 0) { + this.error = 'No content found for this CID'; + } + } catch (err) { + console.error('Error finding content:', err); + this.error = `Error: ${err.message || err}`; + } finally { + this.loading = false; + } + } + + render() { + return html` + + + +
        +

        Find IPFS CID

        +
        + + +
        + + ${this.error ? html` +
        ${this.error}
        + ` : ''} + + ${this.results.length > 0 ? html` +

        Results

        + + + + + + + + + + ${this.results.map(item => html` + + + + + + `)} + +
        Piece CIDOffsetSize
        ${item.piece_cid}${item.err ? html`${item.err}` : item.offset}${this.formatBytes(item.size)}
        + ` : ''} +
        + `; + } + + formatBytes(bytes) { + if (!bytes) return '0 Bytes'; + const k = 1024; + const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; + } + + static styles = css` + .search-container { + display: grid; + grid-template-columns: 1fr auto; + grid-column-gap: 0.75rem; + margin-bottom: 1rem; + } + `; +} + +customElements.define('content-page', ContentPage); diff --git a/web/static/pages/ipfs-content/index.html b/web/static/pages/ipfs-content/index.html new file mode 100644 index 000000000..0e32a6761 --- /dev/null +++ b/web/static/pages/ipfs-content/index.html @@ -0,0 +1,26 @@ + + + + Content + + + + + + +
        +
        +
        +

        IPFS Content

        +
        +
        +
        + +
        +
        +
        +
        +
        + + + diff --git a/web/static/pages/ipni/ipni_search.mjs b/web/static/pages/ipni/ipni_search.mjs index 7f26412dd..a645fe07e 100644 --- a/web/static/pages/ipni/ipni_search.mjs +++ b/web/static/pages/ipni/ipni_search.mjs @@ -167,7 +167,7 @@ class IpniSearch extends LitElement { Piece CID - ${this.adData.piece_cid} + ${this.adData.piece_cid} Piece Size diff --git a/web/static/pages/market-settings/allow-list.mjs b/web/static/pages/market-settings/allow-list.mjs index 08a1b9c13..4edc87cd3 100644 --- a/web/static/pages/market-settings/allow-list.mjs +++ b/web/static/pages/market-settings/allow-list.mjs @@ -25,7 +25,6 @@ class AllowList extends LitElement { if (Array.isArray(result)) { this.allowList = result; } else { - console.error('GetAllowDenyList did not return an array:', result); this.allowList = []; } } catch (error) { diff --git a/web/static/pages/market/index.html b/web/static/pages/market/index.html index 659815ace..98f8e81de 100644 --- a/web/static/pages/market/index.html +++ b/web/static/pages/market/index.html @@ -4,8 +4,6 @@ Storage Market - - @@ -29,13 +27,6 @@

        Storage Market

        >@U#%w|b8g;l6`SDo;G^ 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%0A7YGx@s>4lk7 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

      2. @f{s25z+H8B@~qGG30XHQY0w5R0gAt*O!;5 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≥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 D<7v? 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%0Ao0~C5f{v4OXoOE9*Hk{>iDfu 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

    &Xn|M>~j)qMg@z zsewaM%}n1}Ucm@JJFD(zYLBr^q=+OX#XCIemyo;l%6@C(_V>Jd4~h}dRE;mr27;7c z$+raZGO(>ZInHsE?oYFK%cWyB(RPJAbwk@|rt-!v@#pSIW#=Fr+)S%&z5`);F=x3h zJ;4*QBt-;(wu2+c`0QFFeK)V{!^29~?Qwr&ThpTg>?bT*c3&CI+ml5@6;|z=OpVF$ zxs1+Z8bH5u_gy`6bt$XSr`Z+S|+V$;+ z^`hTKnD1R@w=pQUGx;k%jTNx!C20bPW~*nM)C(+pIHgiC1t$-cFmvocuF9)%sH%T} z*7~++hNMx&Z~@FH0}NR;Zrtj?#3_uN8J6IX zd3ixj&W98C;njv#w9e-yxn)kbD?Qy56l!Rb!BCtwU6O?1_CM1G>3RnSZA*VNh+ zbyGrgK%ru$6I)msL|axSUC9)5%X4zcnfbc-4^q*XoqP{*?Sfy_<+h~x0}%%vSp4jmoiubx0~f%T-8^w)qiTv1v7vS zGe-_Gt~boRY$Mj@#F78MN2tecGK&MlGML&Nyaz}usaVghb#e#awRmo}QxLGHnsUZ4 zul*Js!s)MBE}9P$BHuU$Y2G>BreF@`_e>JSVhDgaJ89^)8nyan-b07^DW6j-YTFhJ z$o7_9*3%T{mVT#Nhn-=GzFf zCQL7M7wBsEvLFJ0!ElV4fAaKiKrDdanbNCi3CJ|Xzr!pAOIL%9707kdb;-zSw~F&6XPIVl#%7 zs~;ppE9S8p-#l(rL~Ku$XU}}vrWG2;jXmt6R6=>st>}sF7*;T0Z}Hf4YnI0c{9xzc z)ULzw?fUu7&>DM(6YJwYL1OYMP4WD|kdg0H+q4sVoTMMqR&`G5XkDaeHOgfZLGS(gZEGFav6*Mo>ABmWo=R;5Z`4xr*fw~tSWL%dFvk3tG0JN+ zg&TErpcM?xf0#3J5XZ4`qDu23d@x*VVH%8_eHhsD+%;tr6_g(rKe>`_2v^`k+MSa4H*nz|136nEfhI5NmF0vU+`O-Du69LS5R8f9M$DD zDNV$uBH|Fkbh_V$5|p!AcD6O-nwr@|JyMNWqJZ-PWaPhz;L@%Hxtyg&jx;;U=yRH4+cp9u@Pnf&1S80+&Jai+uvh1N{$*Tw`6G91iuY`Ekh$(-au zA8zB06C?NGB2CV+V_v^&U{ZI|L0!tPURrElpa6{6_hF`mqY-H0e3&~6W z?EB|Mu%zx=b*PsBilB@=I_P?kcC%~0!a%tsi5-o&iG+8U|8DS08Q!~^z{r5HnAozr zEJct%?^0tfz1tPrn4PH>jtY%gAxJVQrglSEj~);P==ouGCbZ06U6Mg?`LGElfYgyQ zzC>`EUE+c?)G;%0PawYCqbXTG=basz%GK#?_oC&>qEeMA&O9y`Q{k__ks)F_WFOYk zCByw-qQe+nIwMxDEea~^_7g-WxSmJ9tneO5Tj?3(_1&q`?}rOA%`@rr5J&@g`qVUN z-ku70YOnO(ftmk#FP&Y~L87`!a0Ka$5@i08Vr5$vR+Jbm|#Jm*-Mgoftr zXI%PSqb*4Mb0LsnxDJ$A_c`^nRPmWoPUx^8<#TgI?ZW~KW>KXB$Jak;TNQuq@Uh>g z#>U3xN1f+x?$l|(LIZjs97^Qu(-=;oFuk5a37nkW8L#Nm7Ka4y3fsww01F&Hm^91> zBF1+RUrTRTEs)#d=^dpou(tad&^>u(EwmjA%~B^9IrNx_>Ut@%o{v{n)3o88jc;l3 z>(oR<2P6UaB^XId-S~2M>bn0kzR9KycsDb%u+qWMXL4~NtZ+2_5fGAbU1{Z;JFB#d z>Ev7`*>vX%k(Fq4)YZXNy0M7#mm+i%`uIG~0INf>HMyF)OkA1nJh5g)>&U3>s~sRXp>^KiSjNlN{{$-CVDA69~UzIJ%Qn^EKet!SKp7`Hy>Ve(v6#L6`B*Uu3vQN z{#c#fb(c1mXw_O4Af5zA~gRh}Eh6 z<9C*HCCVZ2=Z#V`+azq790#ROlP?vf>7kPjvWN}J-yTE1q_Wn3yuhGHx8X`~3V648 zuruJJ!LRbE;plGuM`!`Dg*`>Lgo*rnATK z{!8wC_~PNq4XgD_X4ZMh(#v|OpQtDihRX?g?L4#W(s7Xb(r8v0&`9COmB-7+)^zRU zp0|lPvd0HFaiS%wj_d0dd-)2~A)%rvz4XtXX7fCM)EkXcV6HAxMV${3%=ib8^=hFD z{sMl6DXa0D9P8#b&~yD|S;*vuS)!+AO7vQ~7y_VZamM_n=U0ilp_1t(YB;a;d-Wqw z!qJg9P!NzeX+OMT&~H|wk1cr*ZY8Xq>T{A`gY}!B7m)iDVjhd_Mh?a&`K&reb+OH` z3f~Wu8!y-6G3_+!l&iLT$Z1t)7E4n$XiNL3>jcL9 zj0G(^JsrdQJTKZw{})MEqY&Bl?VvC9^;x%|FmukRFiw_bp0tpF;I*1M!gTakA+T!G ziUA}CF9S&A*#2RRR$d+iiD;A<2r5*`Q657o=~BUy0~dO*O&bxv!I1jYXA>~;J_ zi`^ce(yIMlI%WgKx@=J;Qu=r&rjYdWCg*E|?I9a*1AcVL`PT{$knbxu>p|~WVUT~qcdY8W#R=^`6=oPmZ+TlV1m~~#F?i&w5YM3CE_^>iTi+9Xuz(A zA}>q`dQh#gYi0YRftQ;pC#myvr)2$Ib~SN#pNhBtACCrLqlJTMG7=LVbXbV;x#S&o@wxfZB3k*!u*yA-Vf?~({+SjNY6kH*)O*;{c3Lt z-=GAJ4O8hJDJ$<*qi{YRr+O+336^e*q;9c1yfSSfv%~ZLYSU7xD{SF^E?`U1ERoywB3wQ!PU4K4xfNVg+IW67js< z#SU)oliU6QJx`uh_t>LWkF|JW+Dvl z%B^@A4?LAMbs7JZD2H0SSB3X{olIMhU2MI&(8VSF5JhDgV%REm)th8EhpH*hF~{4a zsV_RLe@0lcCOH$q{aqg^PlxV(QDC(neBU!2yImHoq}{6FO)w$3+BffT*3Rf{l->do zhj7H*FH6@arNHCoTe>PQ|EtfDAj)eNO8af#9`bXE<&W*)&&1d41^gBKtCXI%k}VDO zdsTev<8jb_^s-z&ZM91nqsz-`L6L1YVYCAr)+eYZMAR@kT?&QSUe!TV8Yc!aN-iu$Pv4l1zu# zr+;hlzyShcK)0=d3aCY^4t*#EE6(9gSD~*E0Z1@ZnHgbXEl=B(qCq0GQd}5Fb=mam zU$p=j@%I|gIe_Tupt#i1YaB1Po=sKT-EyOV-fb+~;cdt42r~8FoG*`m%-_wL;eCrp zb-9bXHmlaZfeR|6PD)Cajf`aYLN|iaCG=YXE8hr#mgi&J+8`%`O3m+jefxsVDmHki zWx#N|%H~LFp_oTDT{9b=JEJNGWrg`0GLe8CdGTyS;y#(zAkPZIl-_-Y^8DY@s2i|K ze0F@%x z_Wna*ss21lTXJfMY8zR-{?s3|aXnT@e&hH3KHrUz2s3S+1JX|d2YCD1OTg;Ha=Am% zD>rz?)@9r;RtVvIqZ%KP z#)*t@X?H+~Po$8%k))JBl2gli;ZD)7p@(n-HsFTF%SPis#J_I*FEIIe{ zq#SiiwC9%ci>dyCb;b|v4N|b{=qbjWA(Q>L%s(qH@PgJY6zy!+^aGpfeH(t za9R&*>>$!ch)z8+<9_CAduI?mA4!?W-BXENO`3HQ#j;Jn)S21*=fh1+QfU#SUrH~k zKFoNXLM^9Vq1l(_Zbrxo7a@@OCQ@&GP91ep$j&rYJ6`Y+U<6(y<@d^hlOB7_sJX!6 zvB76xv7Ay&!0Ut^WaAoge^G>hk4qy@do!)or^9`(CD2OV4||MEdcf+(|8rzlDfOrD z{%mF5?ILJaOgiIrP+=lDc=7rDQy6RBWk$3;x!bR1YeBJr2YYDydgZP?H4)s%CbF?T zcr8)TY~q$^rhS2sU+5uGY*~JIBo!ZbuYGR+GgB{4-1Wmu6W>-%H_hJ=D9)FW<>x)6 z)QZc)GK>2xVuleidEuH+!*%U<3Y?^A;s2aoWm$fr!6w%YkDpFyE&qfj7iS8*lkgZ1 zubcMyHA2l-_ZaJnqXt*t28il*-yN#kf{Ot(29$fdO`r9_g0b z#xtQGeMOumoo#_-Yx-`p%tVs&(G>eq<6mzkkiDbk<@3WNqJ=-Nj_7 zm}_7*#dSF0z9|ddhAy$9|IM*N zc4S842|;(74vT+NCL~Iy|2eYtKZwhu=0eQJD&OjJ{tewGUNRn)*27;I*(i}wQ8isv zu>YR^%l3H+^Zyj$%gQx;_1CcF5or!6tBqvAczBA_8G93ZtRlp<(_hrxLM4&9_d+LIAv2!?uKKQi36c!y z^1>y~9SAQz$e3e{i5?#iBY^!|51P=7kdV5p-5KaqF)9%gEDvV<$#QQYMaN9jFcKGD zG1o6k3k4=-V<$1>~*wdHn)j!so4K%c1%w}1c9Mj8s*O)4*BEHczWRI*lcxIHPFW zTkRBWmjtmLSf`4X{<~5$sID$kf$wLvima=MMCd24Uu!-N1L~kk!;pUwt)57wgR8KC z7y)_a3Xy7~RGDcXVkd1xq&jw%jh5T`q_g_rHAWzknQ8sF%|=C8JwNWqoT6p4tI!k; z7j*gdN#<^I3V$7m5&(du^2*q}XKA!^>QLgn*SEXDHGR7-^c)8Qt6oOIy0|HZLpA0_ z|AnMg>OZJD3j){u?^mv}+k-==QpNrsO4e$pn)I9CvB8cN)#b}Kb=5rrAiu|k>p2%9 zpfrOeuyWpJ?z@m1%#&Aiq&)gGb)&S-R+rHKG2k|epYc%vd|Gt{6<325-x`=@o!|Sg zC_)x~lSp;s6f@LKRfyw3tUmX0tCZY_yiVk^#NXeUCgp_OKoVoc;}!lCo}t=vdk%%9 zFu*E6w3`)33=WR(>RzJ?87#T6e23cHmwT7!jnjR~ieXez+!m+xt)aqDx;xy8pLVDR zUi`l6MRJqNJS@<$2A~SVRBL|xPl7TEJO0!7Qbrh`!^V6MwxCg;{lP?-IN`d&KnKIwpOqsE!OfCICD`uD_JLpi7)GN*B=)D zxY5-S0RTChxng`=-`ntLk{&r=<*T-{2neb+#1}FGE^GS(wf7RPKqkPtYw7m;s!TpI zfeS6b#({^69&fBcJ8PlVsp!8eG5g$E@I3r(i!ZGrNt$>6smhFRo9!ec8-sGy+>XL@ zF*DYDy;jKn%X4qcWXexEx57|*Y}n0!iSy0*eY!DHX0J#WoIcbY9Y$C3eLeJjs?eSL zwqFMj&rYe&O1)WVgNWc;HrMKYEg*5e8SNDzo~=q;|F86?H1%*Udky2Q-g9SS>%@4u zl@9&ivgKKrzJlHY@~k=5oWvoEjZs~15da@J2s>P73ym$#SlOW%(a)gpN+IK5=VwgD)*O{kE1dKA+N5wDa)X%0##HQ}>rIdpi;aLf%^vDChuT?HH1C@Lk*dV*a3h z26Tq2H3OaIKe9-ui)zVOOS;(T9aB-^C|%w9Bk7G-<`}#gujS_NoH@Jb48F`A)a_H! zD_`BW-p;zVb)~!^RXzuFzO@_8*m`$EA1jAsx~C|lL8p2i z-4;VKT@Z*f@)0fX)nu2?c<62lbNB|aSES25Q+P?;F(rRk$UVMF& zYdbncd1afyuqllt6XFLHMi#J=3Eb}K_7Q2e&VE1C>B@Y{7{6DmENamc{m|%LN?Wir zZ~{wJcH!CDAJm$V=}EDpT!phJb~G+?@Pt`*mQqntHe{fuvlq5<_D!(&?(YilyT5;@ zf+YMeX{!RP%z?ah%|gZ^`G*e;Po9OoLs5z)8knW)xRj$dowF+#BkA+|=ADt<-Zha! zcEEu3OhT>xQd3#M{!*Pf;b!wJ7w!Jx=9m*6!C0h;139KX$L}ECi}>o|$w|yDc6MfT zA=X73h6vOsz`JAjY=L@<0e6KQ0;E!^^yG3S;-q1$AEg*U%D!fSap8Bz|$=#M#gQ*kJn1L93HTZ@g zbbl(O-3OX|(q7@vk*ZlwGgJ6|k1e$sv`XwQG8gA6F0ZvFE7RHd4m`So9b47;4W zEu&AytTr6GP)KMKNL#_=HgUYY^HI=h^^jZVFWKeHZC{+*W0f=e?RwXtbOzS{BJM4t z;%>ft-y|duLLfkb1_|!&oF^$S?gWnHy@RrT3>f1iAux9#f)$n~kqc$7h+<;q+alytm`JIH+olf{52+kaqj zel1ltXSZ~+UP22{0^PcFzN#4MH|@Jcw&db9~ACbOJ4Fs)9k}_+xdK2HU^kPP%xIrqrkZ zh)%Cm{z0c^a5hZB^j!sPPjE9ctF1x4XI_Dmi2z}ga!7IillaJI zpJoIyi8Ut&U~Dx8%}zQcgVC%{Q}KwEi*2a;n2aOnp4{lF&_4-Yop?rcCaqwC1hm&a zX~chWg^paN#~0)}|Jd{q9|~z@c502??~l-Q9^8=+jy=r6l#%JUtF{kMlaLgNjFg{B zSpY#n0_yg7Mk+{e?A=rMY#Dq9aqHKUYB|(d>=v)+W04W}Cr*de)6Vxx7|nFxpxD)a z$B^H2NFCdrx5wAsYKjt~L-pO4nPSWDs`$>X!>`PAxo@u-CR+JmE1(HNruAJ%m+552 zZovi$hLYg8f`M0?i1^YUTg^mNv?F*wmZaN$Z5=cEzQR-jOjfVu@0UGe(n(*QJS~c3qEb&4L3zrO6znuTVC-aVC|F6Klzd_ka zZDfG8!n@gp87n1<)+n+@8M(u4f11p~eqkY{o?K%7<|Qy$LP8n!fYZkBvipjsIQ>+f`?Sf}?0(F8F)q zpz$?uCS(c)YcIUA3g_{q@jdf)`9X!(tucZ~6FqzBpV0DXJK2z7Z7>80syFPyi=S3A zVJ|p%X<*c)S(3?iu~nMZA}Yhh^>1ia@h>!sixV;iX|a?#{XR_^+8sM}dO&7rcGebH z>oD{2{RBD5st3M7!fHYRjt%D+^-A#aW!Lza{lr+(j}o^~q}0r-+6`@NZkoBx>upiu;Z6LkK zg065EEogjPG3!6!nT6_oH@SsVXS!{-@kPb|HO}l?AaQI%PLv%J+;sI9;BqJ$y~oAb zf|16MZ-=7(19z8HI`i_6Z&IDs7vXeyDFs!H8Qj;50mc2;zOVirSBAQG`ll6<=NBP% zxBaEL77Hb?28Hp$Wd<6@YMT4!ktxclMrdFfBK_jvu%ac2Kq@SCiK{(CWU2`xFQ(?O zIelF>)=lN{$w~3`kOH#}j{Zuf%I#0UaFZ1jNhHKxOZoU7Zyup-^^<p$QPzJQL z?cKA#j$YOQ5O>904nwOa?Xy9%xf*58s{&LlO7g(7_Q@l;ui|qX1U1m{!G)X*Yb$f( zA@G>s7#C%>jA+NdLK%1YLPbUU2{h7rGZ&K!Rx3G;J1J4j_H=9zDTxoPyRmx3#Df3O*OJr2m(y9fmy(Z_F;s6Q+UN+zLZTO1+E559j z0KVjcXir`VmuAWk$eNw8U)b6S7+!*XZWJ*BEgx$xUk{Y@ z<^?KpGpp1h~6$b1Cx=zNWSoMMFaE3><$f-CmVKW4(k8y@yz$gQX@5 z?g18Ib9+R&UqKGtW7*ngH#p_zS4mNDmX^0>DLW~E0i>1MQuO`N4BfQZh~Jbz2;5l^ zTgJnYDa%>^?WIZ4f#H`+ed>!!Gh4L@mB+z|h)Rx|#BG-`)KGCOCyUM@unraR0oMU* zwgp{F*Q~`QQ7c|q4o-K1tqS+m9ajEt)ytg*H()DH1D^0Rx@V*w&&}dYd$Rg0mUzg3 z*hIH3XhNPlL*+`@rV$9QBd(TKr_J&-H!1v0jdae6N)4Q#Aj8HUX8cLk&u1-P5LpFp zrUMnrii6$rlg}9Yz0k$G=3Ua*3ymdA;wIUvKvIp>2kC@5h1b*ceB1gF9Dx^skydsN zrq*^n&Ah+3c^6Agwbi~F2N{5HXB1g%!lh=1MtCP&w7>ChU`eQ^VylPit#8KkOZn5z z7N4IHon(Gn{%&|1v2ffuL_blw;O8igA*JPmB;MtmZ!Pse#Xb-oEG30SAfA@$J0Q}c z&rI3svV3l7^q8`70W@7eh<6s9-M}7*{U?xNI$Q+29>JFj>5A9{M}!o+e1j}d{+3&l z=B}=uR-Mg+ZO+lsh2{#QX^hETO;zi@SJjDY5rVZZD_k}t}B28CFW{LXX{fm77{5)4;MW-0HB^=tft-_aB&h+I9;}3Yj@Fg ze*EH3r^hfxvApW;b`<^P>T`N5EDJ4|TcWZus9un!7plsiC@b*9d+nkPj?kmx$=D*Q zx2vchD3Um_p6zlZcDPB;yAZ*mPj^ zOG|~0@|&EAZ0>ozpcFly-rlS*zk^?nv<5u1Bw$o*w(c0!d4@8qwrH${bkn1iW8QvV zmhs(73b0GwQhPz6{M=xn8hB(#W&xYHn^EFy4CIaNYd$&;5z0wu#1&bf`*CLzpQfh1 zX=TxP-0jn=g3xD@C_FuGj7?$GUr+EAATlOmQPQyL z@H0kF6t^E(v!ezOPE{08U_22iCP$(4{`$_wv_mCQpffEy`l%S83#HW$hala=JstC& zS;m-&YUY=|F7(Q&en>Z@|GT|_f?CQ<`_wIOEhNXo{Q((PW6iiW-TBRJV?b4X`M1V% zztcuH-~R7U)VY#eKmX=vyBLHPHTy6=tdVAAg1Q;c;EMLP17o{xc-+j5QFc#lmMv7? z`@@@Jck@P5x>7VM^K%92W%`!&1sqUNt~~VhoBMZ5n+$1N1(zOwX~QR$&NPK-G_Fhy zyVOb8TQe?IQ@9y6kxKceujic!y&IZbG9{tAydjDtRCV+WIfyjcG6>Y{LlKrFfV@VvUMbY*NBe;VfxasqD~Sj6R+w*>nlRAhch>STGSs96drgmvicnnq86vGae@7L_NU6K>W zpP`~UC{$)T^DkDA^xlxFI6kROb!Ble+mF$;8Wj^=@eI5g9MGLNe+=y^SnfK(A$@E- zHJ4hU`ZmqQ8HZ`s=G>o>yi0tm_O%k#O>^WzD5#N;oTrNVxqbNdeTa zWe_wq&`Dyid(O%bJzIx^b#q}$Eh#0q__{w?W>jPSs5&(9PR_}Y*XvCtY=QP5RJWPD(Y)nVD-j?Oe)8xxv>8kL&c9zQdZAD^9 zq9?vO;;?F*$GLjIBfm}t97LFz!j*n-&~_abd^HOE!Kf35)8d;x|IQ?0077*|jkzDn z_o;DUOPUgkO%7Ge!%}LbCpDs$Q>l9f=V8_#`D?`o#HFFQKjXBoH;XCsH;;-0)@sz?14?$6&^&N}w$n-+xOXpWgt zT*X?_=RGuDlkw9$m^4KxdTJ-$>CU}}q*7^m1$`Rj4Kx(w#`qF_jgMN+?;Z1ka`0~{ z-JHLxG_+OCg+Hmi&DaPIH*&mc~@9-#^Lx5cgwzHJmm!YQQ1BGf^ zD`-#OPz-R_Z@SXSZ%_a-i6?h#FXQIXlNa^|QhW$tWJa_W8%fyt=P~~3k*eb*(-N?4 zdmL2^P?Ln*R_tN=OMHEX_qjtTl;OVR*{b}#q<5R6ny84_2 z7K4;aUVhQltFyTXh7`U7$S976y7%~i7`N%^2)TFOr5!0#*erL`JsehxD%K3^)RvMs zpQ+SYHx}8@@_$;R+#qe3eO0E;?v!D{HL@4)Hs%LAW7C};+{2er5jl$+&2dOW#lD|w zNsz$$a-?4jRp*=)>BsewEp@HF6wtWZtrxiqM*6K7#&pVZHEIF$-51W4)wWuABp*z8 z>veFQ-!>q9vU1V1-nXuPKEb>juFx%PLNCa7qW8)BSluo6!M}9R%r=Iji2KX0_D%+} z=8gN!F3*;d{XCwhS}g~i)OGc0Egs#AV!hYxlLGTr=H59*^R`=2H~av~uBC;2ZReRj zoj`)c&lf~D5&NctSXkYw!VksQSC<<5V%_5A5x%gDuh4-+azlgb(ZWj(~cfscSy(-|#z87zG7c9-Z6FJJbN-Fmbx>+-V zV@RN_y7m)m161sh*}e!Tp~GcY5t)%TwIcow2MogrQlW|rM~PQd3G!a`HT`}ybT-T5 zW(JuD63MF*jLRN!>9aJXgTYDIwfwaVnI6BoaP4Sn(D^*2r|*!w8!RjvGtk+|F(pd9 zNB4aWC)<8SnVdWAx+~qpML>*~g)wy!?Gfd}h;B4CS z+u;YVVRUW26cT;#tj^ik1ZRU^UzF}+2$M5eb@IXJb-s>5<-{pO86`Hw=>*Zw8=+`N z8|+z4z7kbq%(KoTnByl%Eb14_EDHp1J64HdYGy)%Q9)8j&`kSj)Sj)^SRQF zd?JNM&)NwsX3HdnK;d;{syPE$ou{SDZ8fsKo5VWDiq=ETcBRCc=c4>W!nim1lwED4qm}AKz1g7l;Ub9 z8UBS`nUXTU`Y=(zt8VqB9IS$ZZa&N5v2Mn;A+?Wbsm4;j`y1EdYz{(wU5^jtx%j!edxB+QErCDq$s=Wby^P>hGz9Qx zR2m9MC_LQcd}6ODu*spMD}LKPH$o0Gzk0IRgy^MW-^REr59rSN>1X2HWw?^((@}t!V?Ofb0CdX1OR|u&`p^c$=(31=<6eN_O2v zMJa1t50*jE`N*h%@T3lV=#mc)?}`*rv(G22M)O+F)VK!q-#9 z)MxSIOtW>0K*ApKPnf~+w89xHzH=PxXV&C(w(OsO#qyP61{>kD*So<6Wej}tMPH2M zxvs7s*#X$UYiW?*x|{csz1eo88i2ERo7bk_*3p)WKf?-XoC`v!H}uSORZZn6S@BW= zv#S^&%Gof?m~-yn@#3*pzUWsid(d~`&Ikr1$Oi(gEK&&H<0W=U$F=}HG{15$gU-Wq zxp0JVF?s|N;;N-+6 zA)fPv+TFy;D(~AnOKM_a2V|Yu)O%54MhD7+$lADAjov-$44&hK<$5W!MGktt3F*xg za5{(4br8VI*-e!iC%;AF$gos+^e^4G1>jvUaySIi4* zR1`4_wFj$}6>JPIfBdEwbwKF5vn-lGnrEUcJk^@<*&srcdI43b=DOaVsdi?@@+*($ zk@xfT?_Bz{OQqfqrJ2-OwD&6sw^{4ij$5w%E=VZ*L4)ng21Ri-JXaK%xn@+6o({tT zt%#AA@K}s~=;8UWNP=yXcSCf$+cl`gCEwB;S2Sf}$%8_ifrpzh%9Pde<_D`&YJNM9|8QZwTCmcugVyEqeZ>2>sdL|Ecu; zAMq^imk8j8czv|{myG$hg?|zs*Z!k=ZT*ir)&F5Z!KXTFdwW^Xnm_t$zaLZI!<(xg zQ!PGjY@UfOOTYN5-fxf2|7eZ>x2p+lLug?=c|scwZ@VrLKs{#AExIugxD7o}(5_lT zMg8k<|7q7nj9-WJmAQ^)xS)%O2s-vqaH=o!AwT)B@p^#A%AmJhM&Q98rpi)T_|(z6 z2irt9Yzz4GaqIMkh!w&U;-oZ#l0m$|GLXF(m?k2+O z%JpmpO~u(Rvf&j)p{8Knsi_*ttmjCLM&^3@pv;!jcPvmeA_BVkATg=e4dg%t52X)J zQ@`%2Ho@Za9om~pu6E8}>6tl$4V;c-PE`!|eRn|*9-o?u@@e>GcDt-3-t+1!!zIyt zX*Kt#wG0=wA@Kv`+iv2y{_nV=B^dmv%SEio1`avd-b7?ey?-cyFPj7t9ud)dq4L?A zT>{jxU$&f;m#{ayDbh1zwISD!2QHQ%a{dTieK_goa0C1b|Y2CJ^7%~h>(h`NY^ z%<_J3n5uPp$gM8)&|w)lQc8QceugyGOM94o$~`(<&DE&%pdDpFT#7}u0WHnRfDzK$ zb1ZOIhqhDZTyI=!loHzS*OctNY}*5F>FbAC?WTsQ879*#rD>Xi13be~sR^A9&bL;} zOMd3C?sxYS7+edFD~M#8k;8?nl-SW4{;m2VX!irAtkq5u5#IuSg zB=z;XozbN`+5swR*YD}1eXwdd_}sf?kqOcu!=>>gxq+P9)OL-A+Xp~9JvF8&z6WC& zXAsT1$he65mi%>W%*{cj3|Gj9zC~H^Z zoN26HdK*g-1|fjFbzUb|fk!5W9h7{8C`!rjVKUN&{$+E*TZ@&i9ebzHRCD6st&rg9 zN@4R6fKJnn>(Hzr74M)zY-+2>Zhmb1Q=dY*O<6;&Dofqhih#0=&0pGY#Y;5|fm}BH zPI9^d+2fPPZb^xS|q!)T~fH(PZtifgE}TdRU04B3TyQmw{*5NN#6Ek%|!Lf3)`o2 za7ifu!dx*C(#>Z>a<>|MG`H%(SP@~_wBfpa#g~z z=K;yxCTXS`d5%`5SEe^qzs8ZVykBX9o#svrCWuW9Y1efClN ztI$0Ij)Z)H#h_efxM_<>J#(+h%&+l7f_qWD%j?H6WNT#`R2;nMO0enH z2Y|?2?Z&4YT)Eq!gTq?u+tkC`^*d5OQ*W*wlgEMhd5TZ+w@=S}9h!|Bb(erkjsO55 zPT&xf@N)FvI#VS$nA4VDK9g(CWxPVO1lo1a_}7_FMI2q~XWa4a;tuhfU0HOy*bBN` zO_$$S2Jv}Ld=xpX@D?z|gfO#m>FQ4m^aG8;#7!T-b4_IU$wNonNFT*AG)2h_|zs&(*lB2 znhV0E(3`8*56T=Bnq(`xqn94%tm}XOJYPrv`kumy6F4B!4u%Sp@LnDK72JcNy2MMv*nlP4wE{bzH&j6G$2ou

  • -
    -
    -
    - -
    -
    -
    @@ -43,13 +34,6 @@

    Storage Market

    -
    -
    -
    - -
    -
    -
    diff --git a/web/static/pages/market/pending-deals.mjs b/web/static/pages/market/pending-deals.mjs index f22f6e558..cdac22c5e 100644 --- a/web/static/pages/market/pending-deals.mjs +++ b/web/static/pages/market/pending-deals.mjs @@ -58,7 +58,7 @@ class PendingDeals extends LitElement { ${entry.Miner} ${entry.SectorNumber} - ${entry.PieceCID} + ${entry.PieceCID} ${entry.PieceSizeStr} ${entry.CreatedAtStr} diff --git a/web/static/pages/mk12-deal/deal.mjs b/web/static/pages/mk12-deal/deal.mjs index 5d8d3fb26..3ad8a6e48 100644 --- a/web/static/pages/mk12-deal/deal.mjs +++ b/web/static/pages/mk12-deal/deal.mjs @@ -33,17 +33,21 @@ class DealDetails extends LitElement { {property: 'Signed Proposal Cid', value: entry.signed_proposal_cid}, {property: 'Offline', value: entry.offline}, {property: 'Verified', value: entry.verified}, - {property: 'Is Legacy', value: entry.is_legacy}, {property: 'Is DDO', value: entry.is_ddo}, {property: 'Start Epoch', value: html``}, {property: 'End Epoch', value: html``}, {property: 'Client Peer ID', value: html``}, {property: 'Chain Deal ID', value: entry.chain_deal_id}, {property: 'Publish CID', value: entry.publish_cid}, - {property: 'Piece CID', value: html`${entry.piece_cid}`}, + {property: 'Piece CID', value: entry.piece_cid}, + {property: 'Piece CID V2', value: entry.piece_cid_v2 && entry.piece_cid_v2.trim() !== '' + ? html`${entry.piece_cid_v2}` + : 'N/A'}, {property: 'Piece Size', value: entry.piece_size}, + {property: 'Raw Size', value: entry.raw_size || 'N/A'}, {property: 'Fast Retrieval', value: entry.fast_retrieval}, {property: 'Announce To IPNI', value: entry.announce_to_ipni}, + {property: 'Indexed', value: entry.indexed ? 'Yes' : 'No'}, {property: 'Url', value: entry.url}, {property: 'Url Headers', value: html`
    diff --git a/web/static/pages/mk12-deal/index.html b/web/static/pages/mk12-deal/index.html index 5f63a80b5..6d03731eb 100644 --- a/web/static/pages/mk12-deal/index.html +++ b/web/static/pages/mk12-deal/index.html @@ -17,7 +17,7 @@
    -

    Deal Info

    +

    MK12 Deal Info

    diff --git a/web/static/pages/market/deal-pipelines.mjs b/web/static/pages/mk12-deals/deal-pipelines.mjs similarity index 94% rename from web/static/pages/market/deal-pipelines.mjs rename to web/static/pages/mk12-deals/deal-pipelines.mjs index c5b09f63a..9f1fc392e 100644 --- a/web/static/pages/market/deal-pipelines.mjs +++ b/web/static/pages/mk12-deals/deal-pipelines.mjs @@ -40,11 +40,11 @@ class DealPipelines extends LitElement { async loadData() { try { const params = [this.limit, this.offset]; - const deals = await RPCCall('GetDealPipelines', params); - this.deals = deals; + const deals = await RPCCall('GetMK12DealPipelines', params); + this.deals = deals || []; // Load failed tasks data - const failed = await RPCCall('PipelineFailedTasksMarket', []); + const failed = await RPCCall('MK12PipelineFailedTasks', []); this.failedTasks = failed || {}; this.requestUpdate(); @@ -135,7 +135,7 @@ class DealPipelines extends LitElement { this.requestUpdate(); try { - await RPCCall('BulkRestartFailedMarketTasks', [type]); + await RPCCall('MK12BulkRestartFailedMarketTasks', [type]); await this.loadData(); } catch (err) { console.error('Failed to restart tasks:', err); @@ -152,7 +152,7 @@ class DealPipelines extends LitElement { this.requestUpdate(); try { - await RPCCall('BulkRemoveFailedMarketPipelines', [type]); + await RPCCall('MK12BulkRemoveFailedMarketPipelines', [type]); await this.loadData(); } catch (err) { console.error('Failed to remove pipelines:', err); @@ -224,7 +224,10 @@ class DealPipelines extends LitElement { ${deal.miner} - ${this.formatPieceCid(deal.piece_cid)} + ${deal.piece_cid_v2 && deal.piece_cid_v2 !== "" + ? html`${this.formatPieceCid(deal.piece_cid_v2)}` + : html`${this.formatPieceCid(deal.piece_cid)}` + } ${this.formatBytes(deal.piece_size)} ${this.getDealStatus(deal)} diff --git a/web/static/pages/mk12-deals/index.html b/web/static/pages/mk12-deals/index.html index 5f65ce17b..d4c3c1f27 100644 --- a/web/static/pages/mk12-deals/index.html +++ b/web/static/pages/mk12-deals/index.html @@ -1,12 +1,13 @@ - Storage Marker + MK12 Storage Deals + + - @@ -22,24 +23,31 @@

    Storage Deals

    -
    +
    - + +
    +
    +
    +
    +
    +
    +
    - +
    - +
    diff --git a/web/static/pages/market/market-asks.mjs b/web/static/pages/mk12-deals/market-asks.mjs similarity index 83% rename from web/static/pages/market/market-asks.mjs rename to web/static/pages/mk12-deals/market-asks.mjs index 670b995df..70d926260 100644 --- a/web/static/pages/market/market-asks.mjs +++ b/web/static/pages/mk12-deals/market-asks.mjs @@ -161,56 +161,56 @@ class MarketAsks extends LitElement { render() { return html` - - - -
    -

    Storage Asks

    - - - - - - - - - - - - - - - - ${this.actorList.map((spID) => { - const ask = this.spAsks.get(spID); - return html` - - - - - - - - - - - - `; - })} - -
    SP IDPrice (FIL/TiB/Month)Price (attoFIL/GiB/Epoch)Verified Price (FIL/TiB/Month)Verified Price (attoFIL/GiB/Epoch)Min SizeMax SizeSequenceActions
    ${ask ? ask.Miner : ''}${ask ? this.attoFilToFilPerTiBPerMonth(ask.Price) : '-'}${ask ? ask.Price : '-'}${ask ? this.attoFilToFilPerTiBPerMonth(ask.VerifiedPrice) : '-'}${ask ? ask.VerifiedPrice : '-'}${ask ? this.formatBytes(ask.MinSize) : '-'}${ask ? this.formatBytes(ask.MaxSize) : '-'}${ask ? ask.Sequence : '-'} - -
    - ${this.updatingSpID !== null ? this.renderUpdateForm() : ''} -
    - `; + + + +
    +

    Storage Asks

    + + + + + + + + + + + + + + + + ${this.actorList.map((spID) => { + const ask = this.spAsks.get(spID); + return html` + + + + + + + + + + + + `; + })} + +
    SP IDPrice (FIL/TiB/Month)Price (attoFIL/GiB/Epoch)Verified Price (FIL/TiB/Month)Verified Price (attoFIL/GiB/Epoch)Min SizeMax SizeSequenceActions
    ${ask ? ask.Miner : ''}${ask ? this.attoFilToFilPerTiBPerMonth(ask.Price) : '-'}${ask ? ask.Price : '-'}${ask ? this.attoFilToFilPerTiBPerMonth(ask.VerifiedPrice) : '-'}${ask ? ask.VerifiedPrice : '-'}${ask ? this.formatBytes(ask.MinSize) : '-'}${ask ? this.formatBytes(ask.MaxSize) : '-'}${ask ? ask.Sequence : '-'} + +
    + ${this.updatingSpID !== null ? this.renderUpdateForm() : ''} +
    + `; } renderUpdateForm() { diff --git a/web/static/pages/mk12-deals/mk12-deals.mjs b/web/static/pages/mk12-deals/mk12-deals.mjs index 74b502525..bcf0bf1ee 100644 --- a/web/static/pages/mk12-deals/mk12-deals.mjs +++ b/web/static/pages/mk12-deals/mk12-deals.mjs @@ -89,13 +89,18 @@ class MK12DealList extends LitElement { ${this.deals.map( (deal) => html` - ${formatDate(deal.created_at)} - ${deal.id} - ${deal.miner} - ${deal.piece_cid} - ${this.formatBytes(deal.piece_size)} - - + ${formatDate(deal.created_at)} + ${deal.id} + ${deal.miner} + + ${deal.piece_cid_v2 && deal.piece_cid_v2 !== "" + ? html`${this.formatPieceCid(deal.piece_cid_v2)}` + : html`${this.formatPieceCid(deal.piece_cid)}` + } + + ${this.formatBytes(deal.piece_size)} + + ` )} @@ -133,6 +138,16 @@ class MK12DealList extends LitElement { } } + formatPieceCid(pieceCid) { + if (!pieceCid) return ''; + if (pieceCid.length <= 24) { + return pieceCid; + } + const start = pieceCid.substring(0, 16); + const end = pieceCid.substring(pieceCid.length - 8); + return `${start}...${end}`; + } + static styles = css` .pagination-controls { display: flex; diff --git a/web/static/pages/mk12-deals/mk12ddo-list.mjs b/web/static/pages/mk12-deals/mk12ddo-list.mjs index 1ccf283a3..609c8e4a9 100644 --- a/web/static/pages/mk12-deals/mk12ddo-list.mjs +++ b/web/static/pages/mk12-deals/mk12ddo-list.mjs @@ -82,20 +82,24 @@ class MK12DDODealList extends LitElement { Piece Size Processed Error - ${this.deals.map( (deal) => html` - ${formatDate(deal.created_at)} - ${deal.id} - ${deal.miner} - ${deal.piece_cid} - ${this.formatBytes(deal.piece_size)} - - + ${formatDate(deal.created_at)} + ${deal.id} + ${deal.miner} + + ${deal.piece_cid_v2 && deal.piece_cid_v2 !== "" + ? html`${this.formatPieceCid(deal.piece_cid_v2)}` + : html`${this.formatPieceCid(deal.piece_cid)}` + } + + ${this.formatBytes(deal.piece_size)} + + ` )} @@ -133,6 +137,16 @@ class MK12DDODealList extends LitElement { } } + formatPieceCid(pieceCid) { + if (!pieceCid) return ''; + if (pieceCid.length <= 24) { + return pieceCid; + } + const start = pieceCid.substring(0, 16); + const end = pieceCid.substring(pieceCid.length - 8); + return `${start}...${end}`; + } + static styles = css` .pagination-controls { display: flex; diff --git a/web/static/pages/mk20-deal/deal.mjs b/web/static/pages/mk20-deal/deal.mjs new file mode 100644 index 000000000..f0db5906f --- /dev/null +++ b/web/static/pages/mk20-deal/deal.mjs @@ -0,0 +1,262 @@ +import { LitElement, html, css } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; +import { formatDate } from '/lib/dateutil.mjs'; +import '/ux/epoch.mjs'; +import '/lib/cu-wallet.mjs'; +import '/ux/yesno.mjs'; + +class DealDetails extends LitElement { + constructor() { + super(); + this.loaddata(); + } + + createRenderRoot() { + return this; // Render into light DOM instead of shadow DOM + } + + + async loaddata() { + try { + const params = new URLSearchParams(window.location.search); + this.data = await RPCCall('MK20DDOStorageDeal', [params.get('id')]); + this.requestUpdate(); + } catch (error) { + console.error('Failed to load deal details:', error); + alert(`Failed to load deal details: ${error.message}`); + } + } + + render() { + if (!this.data) return html`

    No data.

    `; + + const { identifier, client, data, products, error } = this.data.deal; + + + return html` + + + + + + + + + + + +
    Identifier${identifier}
    Client
    Error
    PieceCID + ${data + ? html`${data.piece_cid['/']}` + : "Not Available"} +
    + +

    Piece Format

    + ${this.renderPieceFormat(data?.format)} + +

    Data Source

    + + + + + + + ${this.renderDataSource(data, identifier)} + +
    NameDetails
    + + ${products?.ddo_v1 ? this.renderDDOV1(products.ddo_v1) : ''} + ${products?.pdp_v1 ? this.renderPDPV1(products.pdp_v1) : ''} + ${products?.retrieval_v1 ? this.renderRetV1(products.retrieval_v1) : ''} + `; + } + + renderDataSource(data, id){ + if (!data) return ''; + if (data.source_http) { + return html` + + HTTP + ${data?.source_http ? this.renderSourceHTTP(data.source_http) : ''} + + ` + } + if (data.source_aggregate) { + return html` + + Aggregate + ${data?.source_aggregate ? this.renderSourceAggregate(data.source_aggregate) : ''} + + ` + } + if (data.source_offline) { + return html` + + Offline + ${data?.source_offline ? this.renderSourceOffline(data.source_offline) : ''} + + ` + } + if (data.source_httpput) { + return html` + + HTTP Put + ${data?.source_httpput ? this.renderSourceHttpPut(data.source_httpput) : ''} + + ` + } + } + + renderPieceFormat(format) { + if (!format) return ''; + return html` + + + + + + + ${format.car ? html`` : ''} + ${format.aggregate + ? html` + + ` + : ''} + ${format.raw ? html`` : ''} + +
    Format NameDetails
    Car
    AggregateType ${format.aggregate.type}
    Raw
    + `; + } + + renderSourceHTTP(src) { + return html` + + + +
    Raw Size${src.rawsize}
    ${src.urls ? this.renderUrls(src.urls) : ''}
    + `; + } + + renderUrls(urls) { + if (!urls?.length) return ''; + return html` + + + + + + + + + ${urls.map(u => html` + + + ${u.priority} + + + `)} + +
    URLHeadersPriorityFallback
    ${u.url} +
    + [SHOW] +
    ${JSON.stringify(u.headers, null, 2)}
    +
    +
    ${u.fallback}
    + ` + } + + renderSourceAggregate(src) { + return html` +
    + [Aggregate Details] +
    + ${src.pieces.map((piece, i) => html` +
    +

    + +

    +
    +
    +
      +
    • PieceCID: ${piece.piece_cid['/']}
    • +
    • ${this.renderPieceFormat(piece.format)}
    • +
    • ${this.renderDataSource(piece)}
    • +
    +
    +
    +
    + `)} +
    +
    + `; + } + + renderSourceOffline(src) { + return html` + + +
    Raw Size${src.raw_size}
    + `; + } + + renderSourceHttpPut(src) { + return html` + + +
    Raw Size${src.raw_size}
    + `; + } + + renderDDOV1(ddo) { + if (!ddo) return ''; + return html` +
    DDO v1
    + + + + + ${ddo.allocation_id ? html`` : ''} + + + +
    Provider${ddo.provider}
    Piece Manager
    Duration${ddo.duration}
    Allocation ID${ddo.allocation_id}
    Contract${ddo.contract_address}
    Verify Method${ddo.contract_verify_method}
    Notify Address${ddo.notification_address}
    + `; + } + + renderPDPV1(pdp) { + if (!pdp) return ''; + return html` +
    PDP V1
    + + + + + + + ${pdp.data_set_id ? html`` : ``} + ${pdp.piece_ids ? html`` : ``} +
    Create DataSet
    Create Piece
    Remove Piece
    Remove DataSet
    Record Keeper${pdp.record_keeper}>
    DataSet ID${pdp.data_set_id}
    Piece IDs${pdp.piece_ids}
    + `; + } + + renderRetV1(ret) { + if (!ret) return ''; + return html` +
    Retrieval v1
    + + + + +
    Indexing${ret.indexing ? 'Yes' : 'No'}
    Announce Piece to IPNI${ret.announce_payload ? 'Yes' : 'No'}
    Announce Payload to IPNI${ret.announce_payload ? 'Yes' : 'No'}
    + `; + } +} +customElements.define('deal-details', DealDetails); + diff --git a/web/static/pages/mk20-deal/index.html b/web/static/pages/mk20-deal/index.html new file mode 100644 index 000000000..6a8cefe55 --- /dev/null +++ b/web/static/pages/mk20-deal/index.html @@ -0,0 +1,43 @@ + + + + + Deals + + + + + + + + + +
    +
    +
    +
    +

    MK20 Deal Info

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/web/static/pages/mk20/ddo-pipeline.mjs b/web/static/pages/mk20/ddo-pipeline.mjs new file mode 100644 index 000000000..c1ce081a3 --- /dev/null +++ b/web/static/pages/mk20/ddo-pipeline.mjs @@ -0,0 +1,374 @@ +import { LitElement, html, css } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; +import { formatDate } from '/lib/dateutil.mjs'; + +class MK20DealPipelines extends LitElement { + static properties = { + deals: { type: Array }, + limit: { type: Number }, + offset: { type: Number }, + totalCount: { type: Number }, + failedTasks: { type: Object }, + restartingTaskType: { type: String }, + removingTaskType: { type: String } + }; + + constructor() { + super(); + this.deals = []; + this.limit = 25; + this.offset = 0; + this.totalCount = 0; + this.failedTasks = {}; + this.restartingTaskType = ''; + this.removingTaskType = ''; + this.loadData(); + } + + connectedCallback() { + super.connectedCallback(); + // Set up an interval to update data every 5 seconds + this.intervalId = setInterval(() => this.loadData(), 5000); + } + + disconnectedCallback() { + super.disconnectedCallback(); + // Clear the interval when the element is disconnected + clearInterval(this.intervalId); + } + + async loadData() { + try { + const params = [this.limit, this.offset]; + const deals = await RPCCall('MK20DDOPipelines', params); + this.deals = deals || []; + + // Load failed tasks data + const failed = await RPCCall('MK20PipelineFailedTasks', []); + this.failedTasks = failed || {}; + + this.requestUpdate(); + } catch (error) { + console.error('Failed to load deal pipelines or failed tasks:', error); + } + } + + nextPage() { + this.offset += this.limit; + this.loadData(); + } + + prevPage() { + if (this.offset >= this.limit) { + this.offset -= this.limit; + } else { + this.offset = 0; + } + this.loadData(); + } + + renderFailedTasks() { + const { DownloadingFailed, CommPFailed, AggFailed, IndexFailed } = this.failedTasks; + const entries = []; + + const renderLine = (label, count, type) => { + const isRestarting = this.restartingTaskType === type; + const isRemoving = this.removingTaskType === type; + const isWorking = isRestarting || isRemoving; + return html` +
    + ${label} Task: ${count} +
    + + ${isWorking ? 'Working...' : 'Actions'} + + + +
    +
    + `; + }; + + if (DownloadingFailed > 0) { + entries.push(renderLine('Downloading', DownloadingFailed, 'downloading')); + } + if (CommPFailed > 0) { + entries.push(renderLine('CommP', CommPFailed, 'commp')); + } + if (AggFailed > 0) { + entries.push(renderLine('Aggregate', AggFailed, 'aggregate')); + } + if (IndexFailed > 0) { + entries.push(renderLine('Index', IndexFailed, 'index')); + } + + if (entries.length === 0) { + return null; + } + + return html` +
    +

    Failed Tasks

    + ${entries} +
    + `; + } + + async restartFailedTasks(type) { + this.restartingTaskType = type; + this.removingTaskType = ''; + this.requestUpdate(); + + try { + await RPCCall('MK20BulkRestartFailedMarketTasks', [type]); + await this.loadData(); + } catch (err) { + console.error('Failed to restart tasks:', err); + alert(`Failed to restart ${type} tasks: ${err.message || err}`); + } finally { + this.restartingTaskType = ''; + this.requestUpdate(); + } + } + + async removeFailedPipelines(type) { + this.removingTaskType = type; + this.restartingTaskType = ''; + this.requestUpdate(); + + try { + await RPCCall('MK20BulkRemoveFailedMarketPipelines', [type]); + await this.loadData(); + } catch (err) { + console.error('Failed to remove pipelines:', err); + alert(`Failed to remove ${type} pipelines: ${err.message || err}`); + } finally { + this.removingTaskType = ''; + this.requestUpdate(); + } + } + + render() { + return html` + + + +
    + ${this.renderFailedTasks()} +

    + Deal Pipelines + +

    + + + + + + + + + + + + ${this.deals.map( + (deal) => html` + + + + + + + + ` + )} + +
    Created AtUUIDSP IDPiece CIDStatus
    ${formatDate(deal.created_at)} + ${deal.id} + ${deal.miner} + ${this.formatPieceCid(deal.piece_cid_v2)} + ${this.getDealStatus(deal)}
    +
    + + Page ${(this.offset / this.limit) + 1} + +
    +
    + `; + } + + formatPieceCid(pieceCid) { + if (!pieceCid) return ''; + if (pieceCid.length <= 24) { + return pieceCid; + } + const start = pieceCid.substring(0, 16); + const end = pieceCid.substring(pieceCid.length - 8); + return `${start}...${end}`; + } + + formatBytes(bytes) { + const units = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB']; + let i = 0; + let size = bytes; + while (size >= 1024 && i < units.length - 1) { + size /= 1024; + i++; + } + if (i === 0) { + return `${size} ${units[i]}`; + } else { + return `${size.toFixed(2)} ${units[i]}`; + } + } + + getDealStatus(deal) { + if (deal.complete) { + return '(#########) Complete'; + } else if (!deal.complete && deal.announce && deal.indexed) { + return '(########.) Announcing'; + } else if (deal.sealed && !deal.indexed) { + return '(#######..) Indexing'; + } else if (deal.sector?.Valid && !deal.sealed) { + return '(######...) Sealing'; + } else if (deal.aggregated && !deal.sector?.Valid) { + return '(#####....) Assigning Sector'; + } else if (deal.after_commp && !deal.aggregated) { + return '(####.....) Aggregating Deal'; + } else if (deal.downloaded && !deal.after_commp) { + return '(###......) CommP'; + } else if (deal.started && !deal.downloaded) { + return '(##.......) Downloading'; + } else { + return '(#........) Accepted'; + } + } + + static styles = css` + .pagination-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 1rem; + } + + .info-btn { + position: relative; + border: none; + background: transparent; + cursor: pointer; + color: #17a2b8; + font-size: 1em; + margin-left: 8px; + } + + .tooltip-text { + display: none; + position: absolute; + top: 50%; + left: 120%; + transform: translateY(-50%); + min-width: 440px; + max-width: 600px; + background-color: #333; + color: #fff; + padding: 8px; + border-radius: 4px; + font-size: 0.8em; + text-align: left; + white-space: normal; + z-index: 10; + } + + .info-btn:hover .tooltip-text { + display: block; + } + + .copy-btn { + border: none; + background: transparent; + cursor: pointer; + color: #17a2b8; + padding: 0 0 0 5px; + } + + .copy-btn svg { + vertical-align: middle; + } + + .copy-btn:hover { + color: #0d6efd; + } + + .failed-tasks { + margin-bottom: 1rem; + } + .failed-tasks h2 { + margin: 0 0 0.5rem 0; + } + + details > summary { + display: inline-block; + cursor: pointer; + outline: none; + } + + .btn { + margin: 0 4px; + } + `; +} + +customElements.define('mk20-deal-pipelines', MK20DealPipelines); diff --git a/web/static/pages/mk20/ddo.mjs b/web/static/pages/mk20/ddo.mjs new file mode 100644 index 000000000..8591448bc --- /dev/null +++ b/web/static/pages/mk20/ddo.mjs @@ -0,0 +1,190 @@ +import {css, html, LitElement} from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; +import { formatDate } from '/lib/dateutil.mjs'; +import '/ux/yesno.mjs'; + +class MK20DDODealList extends LitElement { + static properties = { + deals: { type: Array }, + limit: { type: Number }, + offset: { type: Number }, + totalCount: { type: Number }, + }; + + constructor() { + super(); + this.deals = []; + this.limit = 25; + this.offset = 0; + this.totalCount = 0; + this.loadData(); + } + + async loadData() { + try { + const params = [this.limit, this.offset]; + this.deals = await RPCCall('MK20DDOStorageDeals', params); + this.requestUpdate(); + } catch (error) { + console.error('Failed to load ddo deals:', error); + } + } + + nextPage() { + this.offset += this.limit; + this.loadData(); + } + + prevPage() { + if (this.offset >= this.limit) { + this.offset -= this.limit; + } else { + this.offset = 0; + } + this.loadData(); + } + + render() { + // Check if there's an error or if the deals array is empty + if (!this.deals || this.deals.length === 0) { + return html``; // Return an empty template if there's no data to render + } + + return html` + + + +
    +

    +

    DDO Deal List + +

    + + + + + + + + + + + + + + ${this.deals.map( + (deal) => html` + + + + + + + + + ` + )} + +
    Created AtIDProviderPiece CIDProcessedError
    ${formatDate(deal.created_at)}${deal.id}${deal.miner.Valid ? deal.miner.String : '-'} + ${deal.piece_cid_v2 + ? html`${this.formatPieceCid(deal.piece_cid_v2.String)}` + : 'Not Available'} +
    +
    + + Page ${(this.offset / this.limit) + 1} + +
    +
    + `; + } + + formatBytes(bytes) { + const units = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB']; + let i = 0; + let size = bytes; + while (size >= 1024 && i < units.length - 1) { + size /= 1024; + i++; + } + if (i === 0) { + return `${size} ${units[i]}`; + } else { + return `${size.toFixed(2)} ${units[i]}`; + } + } + + formatPieceCid(pieceCid) { + if (!pieceCid) return ''; + if (pieceCid.length <= 24) { + return pieceCid; + } + const start = pieceCid.substring(0, 16); + const end = pieceCid.substring(pieceCid.length - 8); + return `${start}...${end}`; + } + + static styles = css` + .pagination-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 1rem; + } + + .info-btn { + position: relative; + border: none; + background: transparent; + cursor: pointer; + color: #17a2b8; + font-size: 1em; + margin-left: 8px; + } + + .tooltip-text { + display: none; + position: absolute; + top: 50%; + left: 120%; /* Position the tooltip to the right of the button */ + transform: translateY(-50%); /* Center the tooltip vertically */ + min-width: 440px; + max-width: 600px; + background-color: #333; + color: #fff; + padding: 8px; + border-radius: 4px; + font-size: 0.8em; + text-align: left; + white-space: normal; + z-index: 10; + } + + .info-btn:hover .tooltip-text { + display: block; + } + `; +} + +customElements.define('mk20-ddo-deal-list', MK20DDODealList); \ No newline at end of file diff --git a/web/static/pages/mk20/deal-search.mjs b/web/static/pages/mk20/deal-search.mjs new file mode 100644 index 000000000..42f6430e0 --- /dev/null +++ b/web/static/pages/mk20/deal-search.mjs @@ -0,0 +1,68 @@ +import { html, css, LitElement } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; + +class DealSearch extends LitElement { + static properties = { + searchTerm: { type: String }, + }; + + constructor() { + super(); + this.searchTerm = ''; + } + + handleInput(event) { + this.searchTerm = event.target.value; + } + + handleSearch() { + if (this.searchTerm.trim() !== '') { + window.location.href = `/pages/mk20-deal/?id=${encodeURIComponent(this.searchTerm.trim())}`; + } + // If searchTerm is empty, do nothing + } + + render() { + return html` + +
    + + +
    + `; + } + + static styles = css` + .search-container { + display: grid; + grid-template-columns: 1fr max-content; + grid-column-gap: 0.75rem; + margin-bottom: 1rem; + } + + .btn { + padding: 0.4rem 1rem; + border: none; + border-radius: 0; + background-color: var(--color-form-default); + color: var(--color-text-primary); + + &:hover, &:focus, &:focus-visible { + background-color: var(--color-form-default-pressed); + color: var(--color-text-secondary); + } + } + `; +} + +customElements.define('deal-search', DealSearch); diff --git a/web/static/pages/mk20/index.html b/web/static/pages/mk20/index.html new file mode 100644 index 000000000..cbc497209 --- /dev/null +++ b/web/static/pages/mk20/index.html @@ -0,0 +1,52 @@ + + + + MK20 Storage Deals + + + + + + + + + +
    +
    +
    +

    Storage Deals

    +
    +
    +
    + +
    +
    +
    +
    +
    +

    Settings

    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + diff --git a/web/static/pages/mk20/settings.mjs b/web/static/pages/mk20/settings.mjs new file mode 100644 index 000000000..01a3bf9e4 --- /dev/null +++ b/web/static/pages/mk20/settings.mjs @@ -0,0 +1,300 @@ +import { html, css, LitElement } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; + +/** + * A custom Web Component for managing products, data sources, and market contracts. + * Extends the LitElement class to leverage the Lit library for efficient rendering. + */ +class MarketManager extends LitElement { + static properties = { + products: { type: Array }, + dataSources: { type: Array }, + contracts: { type: Array }, + selectedContract: { type: Object }, + }; + + constructor() { + super(); + this.products = []; + this.dataSources = []; + this.contracts = []; + this.selectedContract = null; // For modal + this.loadAllData(); + } + + async loadAllData() { + try { + const productsResult = await RPCCall('ListProducts', []); + this.products = Array.isArray(productsResult) + ? productsResult + : Object.entries(productsResult).map(([name, enabled]) => ({ name, enabled })); + + const dataSourcesResult = await RPCCall('ListDataSources', []); + this.dataSources = Array.isArray(dataSourcesResult) + ? dataSourcesResult + : Object.entries(dataSourcesResult).map(([name, enabled]) => ({ name, enabled })); + + // const contractsResult = await RPCCall('ListMarketContracts', []); + // this.contracts = Array.isArray(contractsResult) + // ? contractsResult + // : Object.entries(contractsResult).map(([address, abi]) => ({ address, abi })); + // + // this.requestUpdate(); + } catch (err) { + console.error('Failed to load data:', err); + this.products = []; + this.dataSources = []; + this.contracts = []; + } + } + + async toggleProductState(product) { + const confirmation = confirm( + `Are you sure you want to ${product.enabled ? 'disable' : 'enable'} the product "${product.name}"?` + ); + + if (!confirmation) return; + + try { + if (product.enabled) { + await RPCCall('DisableProduct', [product.name]); + } else { + await RPCCall('EnableProduct', [product.name]); + } + this.loadAllData(); // Refresh after toggling + } catch (err) { + console.error('Failed to toggle product state:', err); + } + } + + async toggleDataSourceState(dataSource) { + const confirmation = confirm( + `Are you sure you want to ${dataSource.enabled ? 'disable' : 'enable'} the data source "${dataSource.name}"?` + ); + + if (!confirmation) return; + + try { + if (dataSource.enabled) { + await RPCCall('DisableDataSource', [dataSource.name]); + } else { + await RPCCall('EnableDataSource', [dataSource.name]); + } + this.loadAllData(); // Refresh after toggling + } catch (err) { + console.error('Failed to toggle data source state:', err); + } + } + + openContractModal(contract) { + this.selectedContract = { ...contract }; + this.updateComplete.then(() => { + const modal = this.shadowRoot.querySelector('#contract-modal'); + if (modal && typeof modal.showModal === 'function') { + modal.showModal(); + } + }); + } + + async removeContract(contract) { + if (!confirm(`Are you sure you want to remove contract ${contract.address}?`)) return; + + try { + await RPCCall('RemoveMarketContract', [contract.address]); + await this.loadAllData(); + } catch (err) { + console.error('Failed to remove contract:', err); + alert(`Failed to remove contract: ${err.message}`); + } + } + + + async saveContractChanges() { + try { + const { address, abi } = this.selectedContract; + + if (!address || !abi) { + alert("Contract address and ABI are required."); + return; + } + + const method = this.contracts.find(c => c.address === address) + ? 'UpdateMarketContract' + : 'AddMarketContract'; + + await RPCCall(method, [address, abi]); + + this.loadAllData(); + this.closeModal(); + } catch (err) { + console.error('Failed to save contract changes:', err); + alert(`Failed to save contract: ${err.message}`); + } + } + + + closeModal() { + this.selectedContract = null; + const modal = this.shadowRoot.querySelector('#contract-modal'); + if (modal) modal.close(); + } + + render() { + return html` + + + +
    + + + + + + ` + )} + +
    +

    Products

    + + + + + + + + + + ${this.products?.map( + (product) => html` + + + + + + ` + )} + +
    NameEnabledAction
    ${product.name}${product.enabled ? 'Yes' : 'No'} + +
    +
    +

    Data Sources

    + + + + + + + + + + ${this.dataSources?.map( + (source) => html` + + + + + + ` + )} + +
    NameEnabledAction
    ${source.name}${source.enabled ? 'Yes' : 'No'} + +
    +
    + + ---> + + + ${this.renderContractModal()} +
    + `; + } + + renderContractModal() { + if (!this.selectedContract) return null; + + return html` + +

    + ${this.contracts.some(c => c.address === this.selectedContract.address) + ? html`Edit Contract: ${this.selectedContract.address}` + : html`Add New Contract`} +

    + +
    + + this.selectedContract.address = e.target.value} + placeholder="0x..." + /> +
    + +
    + + +
    + +
    + + +
    +
    + `; + } +} + +customElements.define('market-manager', MarketManager); \ No newline at end of file diff --git a/web/static/pages/pdp/index.html b/web/static/pages/pdp/index.html index 049237a94..bcbd23694 100644 --- a/web/static/pages/pdp/index.html +++ b/web/static/pages/pdp/index.html @@ -1,24 +1,41 @@ - - Node Info - - - - - -
    -
    -
    -

    Proof of Data Possession

    -
    -
    -
    -
    - -
    -
    -
    -
    - + + PDP Overview + + + + + + + + +
    +
    +
    +

    Proof of Data Possession

    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + diff --git a/web/static/pages/pdp/pdp.mjs b/web/static/pages/pdp/pdp.mjs index 74a05e853..107a81729 100644 --- a/web/static/pages/pdp/pdp.mjs +++ b/web/static/pages/pdp/pdp.mjs @@ -35,65 +35,10 @@ customElements.define('pdp-info', class PDPElement extends LitElement { } } - toggleAddServiceForm() { - this.showAddServiceForm = !this.showAddServiceForm; - } - toggleAddKeyForm() { this.showAddKeyForm = !this.showAddKeyForm; } - async addService(event) { - event.preventDefault(); - - const nameInput = this.shadowRoot.getElementById('service-name'); - const pubKeyInput = this.shadowRoot.getElementById('service-pubkey'); - - const name = nameInput.value.trim(); - const pubKey = pubKeyInput.value.trim(); - - if (!name || !pubKey) { - alert('Please provide both a name and a public key.'); - return; - } - - try { - // Call the RPC method to add the new PDP service - await RPCCall('AddPDPService', [name, pubKey]); - - // Reset the form - nameInput.value = ''; - pubKeyInput.value = ''; - - // Reload the services - await this.loadServices(); - - // Hide the form - this.showAddServiceForm = false; - } catch (error) { - console.error('Failed to add PDP service:', error); - alert('Failed to add PDP service: ' + (error.message || error)); - } - } - - async removeService(serviceId, serviceName) { - const confirmed = confirm(`Are you sure you want to remove the service "${serviceName}"?`); - if (!confirmed) { - return; - } - - try { - // Call the RPC method to remove the PDP service - await RPCCall('RemovePDPService', [serviceId]); - - // Reload the services - await this.loadServices(); - } catch (error) { - console.error('Failed to remove PDP service:', error); - alert('Failed to remove PDP service: ' + (error.message || error)); - } - } - async addKey(event) { event.preventDefault(); @@ -153,58 +98,6 @@ customElements.define('pdp-info', class PDPElement extends LitElement {
    -

    Services

    - ${this.services.length > 0 ? html` - - - - - - - - - - - ${this.services.map(service => html` - - - - - - - `)} - -
    IDNamePublic KeyAction
    ${service.id}${service.name} - - - -
    - ` : html` -

    No PDP services available.

    - `} - - - - ${this.showAddServiceForm ? html` -
    -
    - - -
    -
    - - -
    - -
    - ` : ''} - -
    -

    Owner Addresses

    ${this.keys.length > 0 ? html` diff --git a/web/static/pages/pdp/pdp_deals.mjs b/web/static/pages/pdp/pdp_deals.mjs new file mode 100644 index 000000000..e9971f10c --- /dev/null +++ b/web/static/pages/pdp/pdp_deals.mjs @@ -0,0 +1,188 @@ +import {css, html, LitElement} from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; +import { formatDate } from '/lib/dateutil.mjs'; +import '/ux/yesno.mjs'; + +class MK20PDPDealList extends LitElement { + static properties = { + deals: { type: Array }, + limit: { type: Number }, + offset: { type: Number }, + totalCount: { type: Number }, + }; + + constructor() { + super(); + this.deals = []; + this.limit = 25; + this.offset = 0; + this.totalCount = 0; + this.loadData(); + } + + async loadData() { + try { + const params = [this.limit, this.offset]; + this.deals = await RPCCall('MK20PDPStorageDeals', params); + this.requestUpdate(); + } catch (error) { + console.error('Failed to load pdp deals:', error); + } + } + + nextPage() { + this.offset += this.limit; + this.loadData(); + } + + prevPage() { + if (this.offset >= this.limit) { + this.offset -= this.limit; + } else { + this.offset = 0; + } + this.loadData(); + } + + render() { + // Check if there's an error or if the deals array is empty + if (!this.deals || this.deals.length === 0) { + return html``; // Return an empty template if there's no data to render + } + + return html` + + + +
    +

    +

    PDP Deal List + +

    + +
    + + + + + + + + + + + ${this.deals.map( + (deal) => html` + + + + + + + + ` + )} + +
    Created AtIDPiece CIDProcessedError
    ${formatDate(deal.created_at)}${deal.id} + ${deal.piece_cid_v2 + ? html`${this.formatPieceCid(deal.piece_cid_v2.String)}` + : 'Not Available'} +
    +
    + + Page ${(this.offset / this.limit) + 1} + +
    +
    + `; + } + + formatBytes(bytes) { + const units = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB']; + let i = 0; + let size = bytes; + while (size >= 1024 && i < units.length - 1) { + size /= 1024; + i++; + } + if (i === 0) { + return `${size} ${units[i]}`; + } else { + return `${size.toFixed(2)} ${units[i]}`; + } + } + + formatPieceCid(pieceCid) { + if (!pieceCid) return ''; + if (pieceCid.length <= 24) { + return pieceCid; + } + const start = pieceCid.substring(0, 16); + const end = pieceCid.substring(pieceCid.length - 8); + return `${start}...${end}`; + } + + static styles = css` + .pagination-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 1rem; + } + + .info-btn { + position: relative; + border: none; + background: transparent; + cursor: pointer; + color: #17a2b8; + font-size: 1em; + margin-left: 8px; + } + + .tooltip-text { + display: none; + position: absolute; + top: 50%; + left: 120%; /* Position the tooltip to the right of the button */ + transform: translateY(-50%); /* Center the tooltip vertically */ + min-width: 440px; + max-width: 600px; + background-color: #333; + color: #fff; + padding: 8px; + border-radius: 4px; + font-size: 0.8em; + text-align: left; + white-space: normal; + z-index: 10; + } + + .info-btn:hover .tooltip-text { + display: block; + } + `; +} + +customElements.define('mk20-pdp-deal-list', MK20PDPDealList); \ No newline at end of file diff --git a/web/static/pages/pdp/pipeline.mjs b/web/static/pages/pdp/pipeline.mjs new file mode 100644 index 000000000..764519a8c --- /dev/null +++ b/web/static/pages/pdp/pipeline.mjs @@ -0,0 +1,381 @@ +import { LitElement, html, css } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; +import { formatDate } from '/lib/dateutil.mjs'; + +class MK20PDPPipelines extends LitElement { + static properties = { + deals: { type: Array }, + limit: { type: Number }, + offset: { type: Number }, + totalCount: { type: Number }, + failedTasks: { type: Object }, + restartingTaskType: { type: String }, + removingTaskType: { type: String } + }; + + constructor() { + super(); + this.deals = []; + this.limit = 25; + this.offset = 0; + this.totalCount = 0; + this.failedTasks = {}; + this.restartingTaskType = ''; + this.removingTaskType = ''; + this.loadData(); + } + + connectedCallback() { + super.connectedCallback(); + // Set up an interval to update data every 5 seconds + this.intervalId = setInterval(() => this.loadData(), 5000); + } + + disconnectedCallback() { + super.disconnectedCallback(); + // Clear the interval when the element is disconnected + clearInterval(this.intervalId); + } + + async loadData() { + try { + const params = [this.limit, this.offset]; + const deals = await RPCCall('MK20PDPPipelines', params); + this.deals = deals || []; + + // Load failed tasks data + const failed = await RPCCall('MK20PDPPipelineFailedTasks', []); + this.failedTasks = failed || {}; + + this.requestUpdate(); + } catch (error) { + console.error('Failed to load deal pipelines or failed tasks:', error); + } + } + + nextPage() { + this.offset += this.limit; + this.loadData(); + } + + prevPage() { + if (this.offset >= this.limit) { + this.offset -= this.limit; + } else { + this.offset = 0; + } + this.loadData(); + } + + renderFailedTasks() { + const { DownloadingFailed, CommPFailed, AggFailed, AddPieceFailed, SaveCacheFailed, IndexFailed } = this.failedTasks; + const entries = []; + + const renderLine = (label, count, type) => { + const isRestarting = this.restartingTaskType === type; + const isRemoving = this.removingTaskType === type; + const isWorking = isRestarting || isRemoving; + return html` +
    + ${label} Task: ${count} +
    + + ${isWorking ? 'Working...' : 'Actions'} + + + +
    +
    + `; + }; + + if (DownloadingFailed > 0) { + entries.push(renderLine('Downloading', DownloadingFailed, 'downloading')); + } + if (CommPFailed > 0) { + entries.push(renderLine('CommP', CommPFailed, 'commp')); + } + if (AggFailed > 0) { + entries.push(renderLine('Aggregate', AggFailed, 'aggregate')); + } + if (AddPieceFailed > 0) { + entries.push(renderLine('AddPiece', AggFailed, 'add_piece')); + } + if (SaveCacheFailed > 0) { + entries.push(renderLine('SaveCache', AggFailed, 'save_cache')); + } + if (IndexFailed > 0) { + entries.push(renderLine('Index', IndexFailed, 'index')); + } + + if (entries.length === 0) { + return null; + } + + return html` +
    +

    Failed Tasks

    + ${entries} +
    + `; + } + + async restartFailedTasks(type) { + this.restartingTaskType = type; + this.removingTaskType = ''; + this.requestUpdate(); + + try { + await RPCCall('MK20BulkRestartFailedPDPTasks', [type]); + await this.loadData(); + } catch (err) { + console.error('Failed to restart tasks:', err); + alert(`Failed to restart ${type} tasks: ${err.message || err}`); + } finally { + this.restartingTaskType = ''; + this.requestUpdate(); + } + } + + async removeFailedPipelines(type) { + this.removingTaskType = type; + this.restartingTaskType = ''; + this.requestUpdate(); + + try { + await RPCCall('MK20BulkRemoveFailedPDPPipelines', [type]); + await this.loadData(); + } catch (err) { + console.error('Failed to remove pipelines:', err); + alert(`Failed to remove ${type} pipelines: ${err.message || err}`); + } finally { + this.removingTaskType = ''; + this.requestUpdate(); + } + } + + render() { + return html` + + + +
    +

    + ${this.renderFailedTasks()} +

    + PDP Pipelines + +

    + + + + + + + + + + + + ${this.deals.map( + (deal) => html` + + + + + + + + ` + )} + +
    Created AtUUIDSP IDPiece CIDStatus
    ${formatDate(deal.created_at)} + ${deal.id} + ${deal.miner} + ${this.formatPieceCid(deal.piece_cid_v2)} + ${this.getDealStatus(deal)}
    +
    + + Page ${(this.offset / this.limit) + 1} + +
    +
    + `; + } + + formatPieceCid(pieceCid) { + if (!pieceCid) return ''; + if (pieceCid.length <= 24) { + return pieceCid; + } + const start = pieceCid.substring(0, 16); + const end = pieceCid.substring(pieceCid.length - 8); + return `${start}...${end}`; + } + + formatBytes(bytes) { + const units = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB']; + let i = 0; + let size = bytes; + while (size >= 1024 && i < units.length - 1) { + size /= 1024; + i++; + } + if (i === 0) { + return `${size} ${units[i]}`; + } else { + return `${size.toFixed(2)} ${units[i]}`; + } + } + + getDealStatus(deal) { + if (deal.complete) { + return '(#########) Complete'; + } else if (!deal.complete && deal.announce && deal.indexed) { + return '(########.) Announcing'; + } else if (deal.after_save_cache && !deal.indexed) { + return '(#######..) Indexing'; + } else if (deal.after_add_piece && !deal.after_save_cache) { + return '(######...) Saving Proving Cache'; + } else if (deal.aggregated && !deal.after_add_piece) { + return '(#####....) Adding Piece'; + } else if (deal.after_commp && !deal.aggregated) { + return '(####.....) Aggregating Deal'; + } else if (deal.downloaded && !deal.after_commp) { + return '(###......) CommP'; + } else if (deal.started && !deal.downloaded) { + return '(##.......) Downloading'; + } else { + return '(#........) Accepted'; + } + } + + static styles = css` + .pagination-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 1rem; + } + + .info-btn { + position: relative; + border: none; + background: transparent; + cursor: pointer; + color: #17a2b8; + font-size: 1em; + margin-left: 8px; + } + + .tooltip-text { + display: none; + position: absolute; + top: 50%; + left: 120%; + transform: translateY(-50%); + min-width: 440px; + max-width: 600px; + background-color: #333; + color: #fff; + padding: 8px; + border-radius: 4px; + font-size: 0.8em; + text-align: left; + white-space: normal; + z-index: 10; + } + + .info-btn:hover .tooltip-text { + display: block; + } + + .copy-btn { + border: none; + background: transparent; + cursor: pointer; + color: #17a2b8; + padding: 0 0 0 5px; + } + + .copy-btn svg { + vertical-align: middle; + } + + .copy-btn:hover { + color: #0d6efd; + } + + .failed-tasks { + margin-bottom: 1rem; + } + .failed-tasks h2 { + margin: 0 0 0.5rem 0; + } + + details > summary { + display: inline-block; + cursor: pointer; + outline: none; + } + + .btn { + margin: 0 4px; + } + `; +} + +customElements.define('mk20-pdp-pipelines', MK20PDPPipelines); diff --git a/web/static/pages/piece/piece-info.mjs b/web/static/pages/piece/piece-info.mjs index 27489d6ca..b72c7bd5d 100644 --- a/web/static/pages/piece/piece-info.mjs +++ b/web/static/pages/piece/piece-info.mjs @@ -30,7 +30,7 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement { // Fetch piece info this.data = await RPCCall('PieceInfo', [pieceCid]); - this.mk12DealData = await RPCCall('MK12DealDetail', [pieceCid]); + this.DealData = await RPCCall('PieceDealDetail', [pieceCid]); this.pieceParkStates = await RPCCall('PieceParkStates', [pieceCid]); // TODO SNAP/POREP pipelines @@ -44,7 +44,7 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement { handleRemove(uuid) { if (confirm('Are you sure you want to remove the deal pipeline?')) { - RPCCall('MK12DealPipelineRemove', [uuid]) + RPCCall('DealPipelineRemove', [uuid]) .then(() => { alert('Deal pipeline removed successfully.'); this.loadData(); // Refresh data @@ -79,6 +79,10 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement { + + + + @@ -100,7 +104,9 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement {
    Piece CID${this.data.piece_cid_v2}
    Piece CID V1 ${this.data.piece_cid}
    IPNI AD - ${this.data.ipni_ad ? html`${this.data.ipni_ad}` : 'No Ad Found'} + ${this.data.ipni_ads && this.data.ipni_ads.length > 0 + ? this.data.ipni_ads.map(ad => html`${ad} `) + : 'No Ad Found'}
    @@ -122,12 +128,19 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement { ${this.data.deals.map((item) => html` - ${item.id} + + ${item.mk20 + ? html`${item.id}` + : html`${item.id}`} + ${item.boost_deal ? 'Boost' : (item.legacy_deal ? 'Legacy' : 'DDO')} ${item.miner} ${item.chain_deal_id} - ${item.sector} - ${item.offset} + + ${item.sector > 0 ? html`${item.sector}`: "NA" } + + ${item.offset.Valid ? item.offset.int64 : html`NA`} + ${this.toHumanBytes(item.length)} ${this.toHumanBytes(item.raw_size)} @@ -137,9 +150,9 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement { ${this.pieceParkStates ? this.renderPieceParkStates() : ''} - ${this.mk12DealData && this.mk12DealData.length > 0 ? html` -

    Related Deals

    - ${this.mk12DealData.map((entry) => html` + ${this.DealData?.mk12?.length > 0 ? html` +

    Related MK12 Deals

    + ${this.DealData.mk12.map((entry) => html`

    Deal ${entry.deal.uuid}

    @@ -208,7 +221,9 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement { - + @@ -219,7 +234,7 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement { `; } })()} - ${entry.pipeline ? html` + ${entry.mk12_pipeline ? html` @@ -227,88 +242,88 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement { - - - - - - - - + + + + + + + + - + - + - + - + - + - + - + - + - + - - - + + + - + @@ -319,6 +334,222 @@ customElements.define('piece-info', class PieceInfoElement extends LitElement {
    Top Level Info 📋
    ${item.miner} ${item.chain_deal_id} ${item.sector}${item.offset} + ${item.offset ? item.offset : html``} + ${this.toHumanBytes(item.length)} ${this.toHumanBytes(item.raw_size)}
    PIPELINE ACTIVE
    Controls
    Created At${formatDate(entry.pipeline.created_at)}
    Piece CID${entry.pipeline.piece_cid}
    Piece Size${this.toHumanBytes(entry.pipeline.piece_size)}
    Raw Size${entry.pipeline.raw_size.Valid ? this.toHumanBytes(entry.pipeline.raw_size.Int64) : 'N/A'}
    Offline
    URL${entry.pipeline.url.Valid ? entry.pipeline.url.String : 'N/A'}
    Headers
    ${JSON.stringify(entry.pipeline.headers, null, 2)}
    Should Index${this.renderNullableYesNo(entry.pipeline.should_index.Bool)}
    Created At${formatDate(entry.mk12_pipeline.created_at)}
    Piece CID${entry.mk12_pipeline.piece_cid}
    Piece Size${this.toHumanBytes(entry.mk12_pipeline.piece_size)}
    Raw Size${entry.mk12_pipeline.raw_size.Valid ? this.toHumanBytes(entry.mk12_pipeline.raw_size.Int64) : 'N/A'}
    Offline
    URL${entry.mk12_pipeline.url.Valid ? entry.mk12_pipeline.url.String : 'N/A'}
    Headers
    ${JSON.stringify(entry.mk12_pipeline.headers, null, 2)}
    Should Index${this.renderNullableYesNo(entry.mk12_pipeline.should_index.Bool)}
    Announce${this.renderNullableYesNo(entry.pipeline.announce.Bool)}${this.renderNullableYesNo(entry.mk12_pipeline.announce.Bool)}
    Progress 🛠️
    Data Fetched${this.renderNullableDoneNotDone(entry.pipeline.started.Bool)}${this.renderNullableDoneNotDone(entry.mk12_pipeline.started.Bool)}
    After Commp${this.renderNullableDoneNotDone(entry.pipeline.after_commp.Bool)}${this.renderNullableDoneNotDone(entry.mk12_pipeline.after_commp.Bool)}
    After PSD${this.renderNullableDoneNotDone(entry.pipeline.after_psd.Bool)}${this.renderNullableDoneNotDone(entry.mk12_pipeline.after_psd.Bool)}
    After Find Deal${this.renderNullableDoneNotDone(entry.pipeline.after_find_deal.Bool)}${this.renderNullableDoneNotDone(entry.mk12_pipeline.after_find_deal.Bool)}
    Sealed${this.renderNullableDoneNotDone(entry.pipeline.sealed.Bool)}${this.renderNullableDoneNotDone(entry.mk12_pipeline.sealed.Bool)}
    Indexed${this.renderNullableDoneNotDone(entry.pipeline.indexed.Bool)}${this.renderNullableDoneNotDone(entry.mk12_pipeline.indexed.Bool)}
    Announced
    Early States 🌿
    Commp Task ID - ${entry.pipeline.commp_task_id.Valid - ? html`` + ${entry.mk12_pipeline.commp_task_id.Valid + ? html`` : 'N/A'}
    PSD Task ID - ${entry.pipeline.psd_task_id.Valid - ? html`` + ${entry.mk12_pipeline.psd_task_id.Valid + ? html`` : 'N/A'}
    PSD Wait Time${entry.pipeline.psd_wait_time.Valid ? formatDate(entry.pipeline.psd_wait_time.Time) : 'N/A'}
    PSD Wait Time${entry.mk12_pipeline.psd_wait_time.Valid ? formatDate(entry.mk12_pipeline.psd_wait_time.Time) : 'N/A'}
    Find Deal Task ID - ${entry.pipeline.find_deal_task_id.Valid - ? html`` + ${entry.mk12_pipeline.find_deal_task_id.Valid + ? html`` : 'N/A'}
    Sealing 📦
    Sector${entry.pipeline.sector.Valid ? html`${entry.pipeline.sector.Int64}` : 'N/A'}
    Reg Seal Proof${entry.pipeline.reg_seal_proof.Valid ? entry.pipeline.reg_seal_proof.Int64 : 'N/A'}
    Sector Offset${entry.pipeline.sector_offset.Valid ? entry.pipeline.sector_offset.Int64 : 'N/A'}
    Sector${entry.mk12_pipeline.sector.Valid ? html`${entry.mk12_pipeline.sector.Int64}` : 'N/A'}
    Reg Seal Proof${entry.mk12_pipeline.reg_seal_proof.Valid ? entry.mk12_pipeline.reg_seal_proof.Int64 : 'N/A'}
    Sector Offset${entry.mk12_pipeline.sector_offset.Valid ? entry.mk12_pipeline.sector_offset.Int64 : 'N/A'}
    Indexing 🔍
    Indexing Created At${entry.pipeline.indexing_created_at.Valid ? formatDate(entry.pipeline.indexing_created_at.Time) : 'N/A'}
    Indexing Created At${entry.mk12_pipeline.indexing_created_at.Valid ? formatDate(entry.mk12_pipeline.indexing_created_at.Time) : 'N/A'}
    Indexing Task ID - ${entry.pipeline.indexing_task_id.Valid - ? html`` + ${entry.mk12_pipeline.indexing_task_id.Valid + ? html`` : 'N/A'}
    `)} ` : ''} + + ${this.DealData?.mk20?.length > 0 ? html` +

    Related MK20 Deals

    + ${this.DealData.mk20.map((entry) => html` +

    Deal ${entry.deal.deal.identifier}

    + + + + + + + + + + + + ${(() => { + const matchingPieceDeals = this.data.deals.filter(deal => deal.id === entry.deal.uuid); + if (matchingPieceDeals.length > 0) { + return html` + + + `; + } + })()} + ${entry.mk20_ddo_pipeline ? html` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ` : html``} + ${entry.mk20_pdp_pipeline ? html` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ` : html``} + +
    Top Level Info 📋
    ID${entry.deal.deal.identifier}
    Deal Data ⚙️
    Piece CID${entry.deal.deal.data.piece_cid['/']}
    Piece Size${this.toHumanBytes(entry.deal.deal.data.piece_size)}
    Status 🟢️🔴
    DDO Error${entry.deal.ddoerr.Valid ? entry.deal.ddoerr.String : 'N/A'}
    PDP Error${entry.deal.pdperr.Valid ? entry.deal.pdperr.String : 'N/A'}
    Associated Piece Deals 🔗️
    + + + + + + + + + + + + + + + ${matchingPieceDeals.map((item) => html` + + + + + + + + + + + `)} + +
    IDDeal TypeMinerChain Deal IDSectorOffsetLengthRaw Size
    ${item.id}${item.boost_deal ? 'Boost' : (item.legacy_deal ? 'Legacy' : 'DDO')}${item.miner}${item.chain_deal_id}${item.sector}${item.offset}${this.toHumanBytes(item.length)}${this.toHumanBytes(item.raw_size)}
    +
    DDO PIPELINE ACTIVE
    Controls + +
    Created At${formatDate(entry.mk20_ddo_pipeline.created_at)}
    Piece CID${entry.mk20_ddo_pipeline.piece_cid_v2}
    Should Index${this.renderNullableYesNo(entry.mk20_ddo_pipeline.indexing)}
    Announce${this.renderNullableYesNo(entry.mk20_ddo_pipeline.announce)}
    Progress 🛠️
    Data Fetched${this.renderNullableDoneNotDone(entry.mk20_ddo_pipeline.downloaded)}
    After Commp${this.renderNullableDoneNotDone(entry.mk20_ddo_pipeline.after_commp)}
    Aggregated${this.renderNullableDoneNotDone(entry.mk20_ddo_pipeline.aggregated)}
    Sealed${this.renderNullableDoneNotDone(entry.mk20_ddo_pipeline.sealed)}
    Indexed${this.renderNullableDoneNotDone(entry.mk20_ddo_pipeline.indexed)}
    Announced
    Early States 🌿
    Commp Task ID + ${entry.mk20_ddo_pipeline.commp_task_id.Valid ? html`` : 'N/A'} +
    Aggregation Task ID + ${entry.mk20_ddo_pipeline.agg_task_id.Valid ? html`` : 'N/A'} +
    Sealing 📦
    Sector${entry.mk20_ddo_pipeline.sector.Valid ? html`${entry.mk20_ddo_pipeline.sector.Int64}` : 'N/A'}
    Reg Seal Proof${entry.mk20_ddo_pipeline.reg_seal_proof.Valid ? entry.mk20_ddo_pipeline.reg_seal_proof.Int64 : 'N/A'}
    Sector Offset${entry.mk20_ddo_pipeline.sector_offset.Valid ? entry.mk20_ddo_pipeline.sector_offset.Int64 : 'N/A'}
    Indexing 🔍
    Indexing Created At${entry.mk20_ddo_pipeline.indexing_created_at.Valid ? formatDate(entry.mk20_ddo_pipeline.indexing_created_at.Time) : 'N/A'}
    Indexing Task ID + ${entry.mk20_ddo_pipeline.indexing_task_id.Valid ? html`` : 'N/A'} +
    No DDO Pipeline Data
    PDP PIPELINE ACTIVE
    Controls + +
    Created At${formatDate(entry.mk20_pdp_pipeline.created_at)}
    Piece CID${entry.mk20_pdp_pipeline.piece_cid_v2}
    Should Index${this.renderNullableYesNo(entry.mk20_pdp_pipeline.indexing)}
    Announce Piece${this.renderNullableYesNo(entry.mk20_pdp_pipeline.announce)}
    Announce Payload${this.renderNullableYesNo(entry.mk20_pdp_pipeline.announce_payload)}
    Progress 🛠️
    Data Fetched${this.renderNullableDoneNotDone(entry.mk20_pdp_pipeline.downloaded)}
    After Commp${this.renderNullableDoneNotDone(entry.mk20_pdp_pipeline.after_commp)}
    Aggregated${this.renderNullableDoneNotDone(entry.mk20_pdp_pipeline.aggregated)}
    Add Piece${this.renderNullableDoneNotDone(entry.mk20_pdp_pipeline.after_add_piece)}
    Add Piece Success${this.renderNullableDoneNotDone(entry.mk20_pdp_pipeline.after_add_piece_msg)}
    Save Cache${this.renderNullableDoneNotDone(entry.mk20_pdp_pipeline.after_save_cache)}
    Indexed${this.renderNullableDoneNotDone(entry.mk20_pdp_pipeline.indexed)}
    Announced
    Early States 🌿
    Commp Task ID + ${entry.mk20_pdp_pipeline.commp_task_id.Valid ? html`` : 'N/A'} +
    Aggregation Task ID + ${entry.mk20_pdp_pipeline.agg_task_id.Valid ? html`` : 'N/A'} +
    Add Piece Task ID + ${entry.mk20_pdp_pipeline.add_piece_task_id.Valid ? html`` : 'N/A'} +
    Save Cache Task ID + ${entry.mk20_pdp_pipeline.save_cache_task_id.Valid ? html`` : 'N/A'} +
    Indexing 🔍
    Indexing Created At${entry.mk20_pdp_pipeline.indexing_created_at.Valid ? formatDate(entry.mk20_pdp_pipeline.indexing_created_at.Time) : 'N/A'}
    Indexing Task ID + ${entry.mk20_pdp_pipeline.indexing_task_id.Valid ? html`` : 'N/A'} +
    No PDP Pipeline Data
    + `)} + ` : ''} `; } diff --git a/web/static/pages/proofshare/proofshare-client.mjs b/web/static/pages/proofshare/proofshare-client.mjs index b0601f77c..ff31969bb 100644 --- a/web/static/pages/proofshare/proofshare-client.mjs +++ b/web/static/pages/proofshare/proofshare-client.mjs @@ -175,10 +175,13 @@ class ProofShareClient extends LitElement { const address = prompt('Enter new SP address:'); if (!address) return; // cancelled + const wallet = prompt('Enter client wallet address (f1.. for payments, must be added to wallets first):'); + if (!wallet) return; + const newRow = { address, enabled: false, - wallet: null, + wallet, minimum_pending_seconds: 0, do_porep: false, do_snap: false, @@ -252,6 +255,22 @@ class ProofShareClient extends LitElement { await this.loadAllSettings(); } + /** + * Remove an SP row. + */ + async removeRow(spId, address) { + if (!confirm(`Are you sure you want to remove the SP configuration for ${address}?`)) return; + + try { + await RPCCall('PSClientRemove', [spId]); + console.log(`Removed SP configuration for ${address}`); + await this.loadAllSettings(); + } catch (err) { + console.error(`Error removing SP configuration for ${address}:`, err); + alert(`Failed to remove ${address}. See console for details.`); + } + } + /** * Render a sub-table of requests for a given SP. */ diff --git a/web/static/pages/sector/sector-info.mjs b/web/static/pages/sector/sector-info.mjs index 4d6efe072..023cb4911 100644 --- a/web/static/pages/sector/sector-info.mjs +++ b/web/static/pages/sector/sector-info.mjs @@ -111,6 +111,7 @@ customElements.define('sector-info',class SectorInfo extends LitElement { + @@ -130,7 +131,12 @@ customElements.define('sector-info',class SectorInfo extends LitElement { ${(this.data.Pieces||[]).map(piece => html` - + + diff --git a/web/static/pages/upload-status/index.html b/web/static/pages/upload-status/index.html new file mode 100644 index 000000000..c99099b27 --- /dev/null +++ b/web/static/pages/upload-status/index.html @@ -0,0 +1,31 @@ + + + + + Deals + + + + + + +
    +
    +
    +
    +

    Upload Status

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/web/static/pages/upload-status/status.mjs b/web/static/pages/upload-status/status.mjs new file mode 100644 index 000000000..b61c52fab --- /dev/null +++ b/web/static/pages/upload-status/status.mjs @@ -0,0 +1,94 @@ +import { LitElement, html, css } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; + +class UploadStatus extends LitElement { + constructor() { + super(); + this.loaddata(); + } + + static styles = css` + .chunk-box { + display: grid; + grid-template-columns: repeat(16, auto); + grid-template-rows: repeat(3, auto); + grid-gap: 1px; + } + .chunk-entry { + width: 10px; + height: 10px; + background-color: grey; + margin: 1px; + } + .chunk-complete { + background-color: green; + } + .chunk-missing + background-color: red; + } + ` + + async loaddata() { + try { + const params = new URLSearchParams(window.location.search); + this.data = await RPCCall('ChunkUploadStatus', [params.get('id')]); + this.requestUpdate(); + } catch (error) { + console.error('Failed to load upload status:', error); + alert(`Failed to load upload status: ${error.message}`); + } + } + + render() { + if (!this.data) return html`

    No data.

    `; + + return html` + + + +
    Piece IndexPiece CID V2 Piece CID Piece Size Deal ID
    ${piece.PieceIndex}${piece.PieceCid} + ${piece.PieceCidV2 && piece.PieceCidV2.trim() !== "" + ? html`${piece.PieceCidV2}` + : 'NA'} + ${piece.PieceCid} ${piece.PieceSize} ${piece.DealID} ${piece.DataUrl}
    + + + + + +
    Identifier${this.data.id}
    Total Chunks${this.data.status.total_chunks}
    Uploaded${this.data.status.uploaded}
    Missing${this.data.status.missing}
    Status${this.renderChunks(this.data.status)}
    + `; + } + + renderChunks(status) { + const totalChunks = status.total_chunks; + const missingChunks = status.missing_chunks || []; + const uploadedChunksSet = new Set(); + + if (status.uploaded_chunks) { + status.uploaded_chunks.forEach(chunk => uploadedChunksSet.add(chunk)); + } + + // Create chunk entries + const chunkEntries = Array.from({ length: totalChunks }, (_, i) => { + const chunkIndex = i + 1; // Chunks start from 1 + const isMissing = missingChunks.includes(chunkIndex); + const isUploaded = uploadedChunksSet.has(chunkIndex); + + return html` +
    +
    + `; + }); + + return html` +
    + ${chunkEntries} +
    + `; + } +} +customElements.define('upload-status', UploadStatus); + diff --git a/web/static/ux/curio-ux.mjs b/web/static/ux/curio-ux.mjs index 64ec6344d..fe0049995 100644 --- a/web/static/ux/curio-ux.mjs +++ b/web/static/ux/curio-ux.mjs @@ -199,7 +199,17 @@ class CurioUX extends LitElement { - Storage Deals + MK12 + + +
  • + + + + + + + MK20
  • @@ -251,7 +261,7 @@ class CurioUX extends LitElement { - Content + IPFS Content
  • From b0d5f9e3e418c785e48ac50d1a96574be105c3a7 Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Mon, 17 Nov 2025 10:17:34 -0600 Subject: [PATCH 64/67] gen --- deps/deps.go | 5 ++++- documentation/en/curio-cli/curio.md | 2 +- go.mod | 1 - market/indexstore/indexstore_test.go | 5 +++-- market/retrieval/retrieval.go | 1 + tasks/sealsupra/metrics.go | 14 +++++++------- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/deps/deps.go b/deps/deps.go index 5683a6a5e..d98d7becb 100644 --- a/deps/deps.go +++ b/deps/deps.go @@ -393,7 +393,10 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`, dbHost = cctx.String("db-host") } - deps.IndexStore = indexstore.NewIndexStore(strings.Split(dbHost, ","), cctx.Int("db-cassandra-port"), deps.Cfg) + deps.IndexStore, err = indexstore.NewIndexStore(strings.Split(dbHost, ","), cctx.Int("db-cassandra-port"), deps.Cfg) + if err != nil { + return xerrors.Errorf("failed to create index store: %w", err) + } err = deps.IndexStore.Start(cctx.Context, false) if err != nil { return xerrors.Errorf("failed to create index store: %w", err) diff --git a/documentation/en/curio-cli/curio.md b/documentation/en/curio-cli/curio.md index 508a3d2c6..03783809d 100644 --- a/documentation/en/curio-cli/curio.md +++ b/documentation/en/curio-cli/curio.md @@ -971,7 +971,7 @@ NAME: curio test supra - Supra consensus testing utilities USAGE: - curio test supra command [command options] + curio test supra [command options] COMMANDS: tree-r-file Test tree-r-file diff --git a/go.mod b/go.mod index 2fea3d981..f065850a9 100644 --- a/go.mod +++ b/go.mod @@ -279,7 +279,6 @@ require ( github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect - github.com/mr-tron/base58 v1.2.0 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.2 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect diff --git a/market/indexstore/indexstore_test.go b/market/indexstore/indexstore_test.go index 25737987e..d64e6684f 100644 --- a/market/indexstore/indexstore_test.go +++ b/market/indexstore/indexstore_test.go @@ -33,8 +33,9 @@ func TestNewIndexStore(t *testing.T) { ctx := context.Background() cfg := config.DefaultCurioConfig() - idxStore := NewIndexStore([]string{envElse("CURIO_HARMONYDB_HOSTS", "127.0.0.1")}, 9042, cfg) - err := idxStore.Start(ctx, true) + idxStore, err := NewIndexStore([]string{envElse("CURIO_HARMONYDB_HOSTS", "127.0.0.1")}, 9042, cfg) + require.NoError(t, err) + err = idxStore.Start(ctx, true) require.NoError(t, err) err = idxStore.Start(ctx, true) require.NoError(t, err) diff --git a/market/retrieval/retrieval.go b/market/retrieval/retrieval.go index 4d670aa58..be7e7e1b1 100644 --- a/market/retrieval/retrieval.go +++ b/market/retrieval/retrieval.go @@ -24,6 +24,7 @@ import ( "github.com/filecoin-project/curio/lib/cachedreader" "github.com/filecoin-project/curio/market/indexstore" "github.com/filecoin-project/curio/market/retrieval/remoteblockstore" + "github.com/filecoin-project/lotus/blockstore" ) diff --git a/tasks/sealsupra/metrics.go b/tasks/sealsupra/metrics.go index e1a913f3e..2964959a0 100644 --- a/tasks/sealsupra/metrics.go +++ b/tasks/sealsupra/metrics.go @@ -14,10 +14,10 @@ var ( // SupraSealMeasures groups all SupraSeal metrics. var SupraSealMeasures = struct { - PhaseLockCount *stats.Int64Measure - PhaseWaitingCount *stats.Int64Measure - PhaseAvgDuration *stats.Float64Measure - PhaseDurationSoFar *stats.Float64Measure + PhaseLockCount *stats.Int64Measure + PhaseWaitingCount *stats.Int64Measure + PhaseAvgDuration *stats.Float64Measure + PhaseDurationSoFar *stats.Float64Measure // NVMe Health measures NVMeTemperature *stats.Float64Measure @@ -35,9 +35,9 @@ var SupraSealMeasures = struct { NVMeReadIO *stats.Int64Measure NVMeWriteIO *stats.Int64Measure }{ - PhaseLockCount: stats.Int64(pre+"phase_lock_count", "Number of active locks in each phase", stats.UnitDimensionless), - PhaseWaitingCount: stats.Int64(pre+"phase_waiting_count", "Number of goroutines waiting for a phase lock", stats.UnitDimensionless), - PhaseAvgDuration: stats.Float64(pre+"phase_avg_duration", "Average duration of each phase in seconds", stats.UnitSeconds), + PhaseLockCount: stats.Int64(pre+"phase_lock_count", "Number of active locks in each phase", stats.UnitDimensionless), + PhaseWaitingCount: stats.Int64(pre+"phase_waiting_count", "Number of goroutines waiting for a phase lock", stats.UnitDimensionless), + PhaseAvgDuration: stats.Float64(pre+"phase_avg_duration", "Average duration of each phase in seconds", stats.UnitSeconds), PhaseDurationSoFar: stats.Float64(pre+"phase_duration_so_far", "Duration of the phase so far in seconds", stats.UnitSeconds), // NVMe Health measures From fa197792d70e11980dd0d81c50273c26aa950229 Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Mon, 17 Nov 2025 14:23:42 -0600 Subject: [PATCH 65/67] lint and tests --- cmd/curio/test-supra.go | 7 ++++--- harmony/resources/memsys.go | 22 ---------------------- lib/dealdata/urlpiecereader.go | 11 ----------- lib/dealdata/urlpiecereader_test.go | 13 ++++--------- lib/ffi/snap_funcs.go | 4 ++-- lib/paths/local.go | 2 +- lib/robusthttp/robusthttp.go | 10 +++++----- market/indexstore/indexstore.go | 15 --------------- 8 files changed, 16 insertions(+), 68 deletions(-) delete mode 100644 harmony/resources/memsys.go diff --git a/cmd/curio/test-supra.go b/cmd/curio/test-supra.go index 57122d4ab..28d8fbfa5 100644 --- a/cmd/curio/test-supra.go +++ b/cmd/curio/test-supra.go @@ -152,19 +152,19 @@ var testSnapEncodeCmd = &cli.Command{ if err != nil { return xerrors.Errorf("open sealed: %w", err) } - defer keyF.Close() + defer func() { _ = keyF.Close() }() dataF, err := os.Open(unsealedPath) if err != nil { return xerrors.Errorf("open unsealed: %w", err) } - defer dataF.Close() + defer func() { _ = dataF.Close() }() outF, err := os.OpenFile(updatePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o644) if err != nil { return xerrors.Errorf("create update: %w", err) } - defer outF.Close() + defer func() { _ = outF.Close() }() if err := cunative.EncodeSnap(spt, commD, commK, keyF, dataF, outF); err != nil { return xerrors.Errorf("EncodeSnap: %w", err) @@ -176,6 +176,7 @@ var testSnapEncodeCmd = &cli.Command{ _, _ = io.Copy(io.Discard, keyF) _, _ = io.Copy(io.Discard, dataF) + start = time.Now() } elapsed := time.Since(start) mbps := float64(ssize) / elapsed.Seconds() / 1024.0 / 1024.0 diff --git a/harmony/resources/memsys.go b/harmony/resources/memsys.go deleted file mode 100644 index 1a45b5b22..000000000 --- a/harmony/resources/memsys.go +++ /dev/null @@ -1,22 +0,0 @@ -//go:build darwin || freebsd || openbsd || dragonfly || netbsd -// +build darwin freebsd openbsd dragonfly netbsd - -package resources - -import ( - "encoding/binary" - "syscall" -) - -func sysctlUint64(name string) (uint64, error) { - s, err := syscall.Sysctl(name) - if err != nil { - return 0, err - } - // hack because the string conversion above drops a \0 - b := []byte(s) - if len(b) < 8 { - b = append(b, 0) - } - return binary.LittleEndian.Uint64(b), nil -} diff --git a/lib/dealdata/urlpiecereader.go b/lib/dealdata/urlpiecereader.go index aacaa9c7d..c58dd965b 100644 --- a/lib/dealdata/urlpiecereader.go +++ b/lib/dealdata/urlpiecereader.go @@ -5,7 +5,6 @@ import ( "io" "net/http" "net/url" - "strings" "github.com/google/uuid" "go.opencensus.io/stats" @@ -93,16 +92,6 @@ func (u *UrlPieceReader) initiateRequest() error { return nil } -// sanitize filters the input bytes, allowing only safe printable characters. -func sanitize(input []byte) string { - return strings.Map(func(r rune) rune { - if r >= 32 && r <= 126 { - return r - } - return '?' - }, string(input)) -} - func (u *UrlPieceReader) Read(p []byte) (n int, err error) { // Check if we have already read the required amount of data if u.readSoFar >= u.RawSize { diff --git a/lib/dealdata/urlpiecereader_test.go b/lib/dealdata/urlpiecereader_test.go index 5f827a7cf..7e4c68e02 100644 --- a/lib/dealdata/urlpiecereader_test.go +++ b/lib/dealdata/urlpiecereader_test.go @@ -35,11 +35,9 @@ func TestUrlPieceReader_Read(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { - reader := UrlPieceReader{ - Url: ts.URL, - RawSize: tt.rawSize, - } - buffer, err := io.ReadAll(&reader) + reader := NewUrlReader(nil, ts.URL, http.Header{}, tt.rawSize, "test") + + buffer, err := io.ReadAll(reader) if err != nil { if (err != io.EOF && !tt.expectError) || (err == io.EOF && !tt.expectEOF) { t.Errorf("Read() error = %v, expectError %v, expectEOF %v", err, tt.expectError, tt.expectEOF) @@ -61,10 +59,7 @@ func TestUrlPieceReader_Read_Error(t *testing.T) { })) defer ts.Close() - reader := UrlPieceReader{ - Url: ts.URL, - RawSize: 100, - } + reader := NewUrlReader(nil, ts.URL, http.Header{}, 100, "test") buffer := make([]byte, 200) _, err := reader.Read(buffer) diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index dde14861f..cdc16d42b 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -256,14 +256,14 @@ func (sb *SealCalls) EncodeUpdate( // copy r into keyFile // note: teeReader means that we avoid re-reading the sector key, saving I/O bandwidth - var keyRederForEncode io.Reader = io.TeeReader(sectorKeyReader, keyFile) + keyRederForEncode := io.TeeReader(sectorKeyReader, keyFile) encodeStart := time.Now() treeDFile, err := os.Open(treeDPath) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("open tree d file: %w", err) } - defer treeDFile.Close() + defer func() { _ = treeDFile.Close() }() err = cunative.EncodeSnap(sector.ProofType, commD, sectorKeyCid, keyRederForEncode, treeDFile, updateFile) diff --git a/lib/paths/local.go b/lib/paths/local.go index ac973a020..240c42efb 100644 --- a/lib/paths/local.go +++ b/lib/paths/local.go @@ -861,7 +861,7 @@ func (st *Local) Local(ctx context.Context) ([]storiface.StoragePath, error) { } var si storiface.StorageInfo - if p.lastSinfo == nil || time.Now().Sub(p.lastSinfoTime) > LocalSinfoTTL { + if p.lastSinfo == nil || time.Since(p.lastSinfoTime) > LocalSinfoTTL { var err error si, err = st.index.StorageInfo(ctx, id) if err != nil { diff --git a/lib/robusthttp/robusthttp.go b/lib/robusthttp/robusthttp.go index f633de816..d43fbec4e 100644 --- a/lib/robusthttp/robusthttp.go +++ b/lib/robusthttp/robusthttp.go @@ -56,7 +56,7 @@ func (r *robustHttpResponse) Read(p []byte) (n int, err error) { n, err = r.cur.Read(p) if err == io.EOF { - r.curCloser.Close() + _ = r.curCloser.Close() r.cur = nil log.Errorw("EOF reached in Read", "bytesRead", n) r.finalize(false) @@ -64,7 +64,7 @@ func (r *robustHttpResponse) Read(p []byte) (n int, err error) { } if err != nil { log.Errorw("Read error", "error", err) - r.curCloser.Close() + _ = r.curCloser.Close() r.cur = nil if n > 0 { @@ -78,7 +78,7 @@ func (r *robustHttpResponse) Read(p []byte) (n int, err error) { continue } if n == 0 { - r.curCloser.Close() + _ = r.curCloser.Close() r.cur = nil log.Errorw("Read 0 bytes", "bytesRead", n) return 0, xerrors.Errorf("read 0 bytes") @@ -160,13 +160,13 @@ func (r *robustHttpResponse) startReq() error { if resp.StatusCode != http.StatusPartialContent && resp.StatusCode != http.StatusOK { log.Errorw("Unexpected HTTP status", "status", resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() return xerrors.Errorf("http status: %d", resp.StatusCode) } if nc == nil { log.Errorw("Connection is nil after client.Do") - resp.Body.Close() + _ = resp.Body.Close() return xerrors.Errorf("nc was nil") } diff --git a/market/indexstore/indexstore.go b/market/indexstore/indexstore.go index 7aee0a438..20656d7b3 100644 --- a/market/indexstore/indexstore.go +++ b/market/indexstore/indexstore.go @@ -3,7 +3,6 @@ package indexstore import ( "context" "embed" - _ "embed" "errors" "fmt" "math" @@ -54,20 +53,6 @@ type Record struct { var ErrNotFound = errors.New("not found") -func isNotFoundErr(err error) bool { - if err == nil { - return false - } - - if errors.Is(err, gocql.ErrNotFound) { - return true - } - - // Unfortunately it seems like the Cassandra driver doesn't always return - // a specific not found error type, so we need to rely on string parsing - return strings.Contains(strings.ToLower(err.Error()), "not found") -} - func NewIndexStore(hosts []string, port int, cfg *config.CurioConfig) (*IndexStore, error) { cluster := gocql.NewCluster(hosts...) cluster.Timeout = 5 * time.Minute From 274587ce04aa98747953c436da522f2d1d59ce2c Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Mon, 17 Nov 2025 15:37:46 -0600 Subject: [PATCH 66/67] old linter making mistakes --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3be08478f..af11f1e66 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -259,7 +259,7 @@ jobs: - name: Install golangci-lint run: | - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.4.0 + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.6.2 shell: bash - name: Lint From f2e25d87cf501e709990f91681f5361eb1ea6a17 Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Mon, 17 Nov 2025 16:09:36 -0600 Subject: [PATCH 67/67] linty --- api/api_chain_all.go | 1 - api/api_chain_limited.go | 1 - build/params_2k.go | 1 - build/params_calibnet.go | 1 - build/params_mainnet.go | 1 - build/params_testnet.go | 1 - cmd/curio/test-supra.go | 2 +- harmony/resources/getGPU.go | 1 - harmony/resources/getGPU_darwin.go | 1 - lib/ffi/snap_funcs.go | 4 ++-- 10 files changed, 3 insertions(+), 11 deletions(-) diff --git a/api/api_chain_all.go b/api/api_chain_all.go index e055896db..2ad7811eb 100644 --- a/api/api_chain_all.go +++ b/api/api_chain_all.go @@ -1,5 +1,4 @@ //go:build !forest -// +build !forest package api diff --git a/api/api_chain_limited.go b/api/api_chain_limited.go index cd6fb1104..48e3032f7 100644 --- a/api/api_chain_limited.go +++ b/api/api_chain_limited.go @@ -1,5 +1,4 @@ //go:build forest -// +build forest package api diff --git a/build/params_2k.go b/build/params_2k.go index 6803030c0..e611a6a8b 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -1,5 +1,4 @@ //go:build 2k -// +build 2k package build diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 3cb080d4c..e5defa216 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -1,5 +1,4 @@ //go:build calibnet -// +build calibnet package build diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 86a00f7d5..a1d4fa702 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -1,5 +1,4 @@ //go:build !calibnet && !debug && !2k -// +build !calibnet,!debug,!2k package build diff --git a/build/params_testnet.go b/build/params_testnet.go index 02e700e1f..0822daabe 100644 --- a/build/params_testnet.go +++ b/build/params_testnet.go @@ -1,5 +1,4 @@ //go:build debug -// +build debug package build diff --git a/cmd/curio/test-supra.go b/cmd/curio/test-supra.go index 28d8fbfa5..26e220527 100644 --- a/cmd/curio/test-supra.go +++ b/cmd/curio/test-supra.go @@ -143,7 +143,7 @@ var testSnapEncodeCmd = &cli.Command{ var outBuf bytes.Buffer outBuf.Grow(int(ssize)) - start = time.Now() + start = time.Now() //nolint:staticcheck // false positive: used on line 181 if err := cunative.EncodeSnap(spt, commD, commK, bytes.NewReader(sealedBytes), bytes.NewReader(unsealedBytes), &outBuf); err != nil { return xerrors.Errorf("EncodeSnap: %w", err) } diff --git a/harmony/resources/getGPU.go b/harmony/resources/getGPU.go index a9a207125..c50c70f06 100644 --- a/harmony/resources/getGPU.go +++ b/harmony/resources/getGPU.go @@ -1,5 +1,4 @@ //go:build !darwin -// +build !darwin package resources diff --git a/harmony/resources/getGPU_darwin.go b/harmony/resources/getGPU_darwin.go index 6ba5c57a5..986172029 100644 --- a/harmony/resources/getGPU_darwin.go +++ b/harmony/resources/getGPU_darwin.go @@ -1,5 +1,4 @@ //go:build darwin -// +build darwin package resources diff --git a/lib/ffi/snap_funcs.go b/lib/ffi/snap_funcs.go index cdc16d42b..e4767b92a 100644 --- a/lib/ffi/snap_funcs.go +++ b/lib/ffi/snap_funcs.go @@ -46,7 +46,7 @@ func (sb *SealCalls) EncodeUpdate( return cid.Undef, cid.Undef, xerrors.Errorf("getting sector size: %w", err) } - paths, pathIDs, releaseSector, err := sb.Sectors.AcquireSector(ctx, &taskID, sector, storiface.FTNone, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) + paths, pathIDs, releaseSector, err := sb.Sectors.AcquireSector(ctx, &taskID, sector, storiface.FTNone, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) //nolint:staticcheck // false positive: used on line 383 if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("acquiring sector paths: %w", err) } @@ -258,7 +258,7 @@ func (sb *SealCalls) EncodeUpdate( // note: teeReader means that we avoid re-reading the sector key, saving I/O bandwidth keyRederForEncode := io.TeeReader(sectorKeyReader, keyFile) - encodeStart := time.Now() + encodeStart := time.Now() //nolint:staticcheck // false positive: used on line 292 treeDFile, err := os.Open(treeDPath) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("open tree d file: %w", err)