From c9649de923c8d2bb4e278d948f1179afbd9abc71 Mon Sep 17 00:00:00 2001 From: Arkadiy Kukarkin Date: Wed, 22 Jul 2026 18:14:53 +0200 Subject: [PATCH 1/4] dealpusher: validate EAM namespace when parsing delegated address --- service/dealpusher/pdp_pull.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/service/dealpusher/pdp_pull.go b/service/dealpusher/pdp_pull.go index 9db96f14..105ef9fe 100644 --- a/service/dealpusher/pdp_pull.go +++ b/service/dealpusher/pdp_pull.go @@ -21,6 +21,7 @@ import ( "github.com/filecoin-project/go-address" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/ipfs/go-cid" + "github.com/multiformats/go-varint" "gorm.io/gorm" ) @@ -437,11 +438,18 @@ func delegatedToCommonAddress(s string) (common.Address, error) { if addr.Protocol() != address.Delegated { return common.Address{}, fmt.Errorf("address %s is not delegated (f410)", s) } - payload := addr.Payload() - if len(payload) < 21 { - return common.Address{}, fmt.Errorf("delegated payload too short: %d", len(payload)) + namespace, n, err := varint.FromUvarint(addr.Payload()) + if err != nil { + return common.Address{}, fmt.Errorf("failed to decode delegated namespace: %w", err) + } + if namespace != 10 { + return common.Address{}, fmt.Errorf("unsupported delegated namespace %d", namespace) + } + subaddr := addr.Payload()[n:] + if len(subaddr) != common.AddressLength { + return common.Address{}, fmt.Errorf("invalid delegated address length: %d", len(subaddr)) } - return common.BytesToAddress(payload[1:21]), nil + return common.BytesToAddress(subaddr), nil } func commonToDelegatedAddress(subaddr common.Address) (address.Address, error) { From 56a82ae81f80a3e5f8015b6fc1fba42ae6171637 Mon Sep 17 00:00:00 2001 From: Arkadiy Kukarkin Date: Wed, 22 Jul 2026 18:14:53 +0200 Subject: [PATCH 2/4] storagesystem: return early on rclone object open error --- storagesystem/rclone.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/storagesystem/rclone.go b/storagesystem/rclone.go index e591ce69..44c942d0 100644 --- a/storagesystem/rclone.go +++ b/storagesystem/rclone.go @@ -230,6 +230,9 @@ func (h RCloneHandler) Read(ctx context.Context, path string, offset int64, leng } option := &fs.SeekOption{Offset: offset} reader, err := object.Open(ctx, option) + if err != nil { + return nil, nil, errors.Wrapf(err, "failed to open object %s", path) + } readerWithRetry := &readerWithRetry{ ctx: ctx, object: object, From 6c98b80d47bcb0a870d80517281c23bc461b3d3e Mon Sep 17 00:00:00 2001 From: Arkadiy Kukarkin Date: Wed, 22 Jul 2026 18:14:53 +0200 Subject: [PATCH 3/4] replication: report absolute end epoch in deal analytics event --- replication/makedeal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/replication/makedeal.go b/replication/makedeal.go index 01f1fde7..9d0031de 100644 --- a/replication/makedeal.go +++ b/replication/makedeal.go @@ -648,7 +648,7 @@ func queueDealEvent(deal model.Deal) { Client: deal.ClientID, Verified: deal.Verified, StartEpoch: deal.StartEpoch, - EndEpoch: deal.EndEpoch - deal.StartEpoch, + EndEpoch: deal.EndEpoch, } analytics.Default.QueueDealEvent(dealEvent) } From 62b29a20726310a218ea0a9bcd2cf895b9029f13 Mon Sep 17 00:00:00 2001 From: Arkadiy Kukarkin Date: Wed, 22 Jul 2026 18:14:53 +0200 Subject: [PATCH 4/4] model: remove unused ProofSetProposed handoff state --- model/replication.go | 1 - 1 file changed, 1 deletion(-) diff --git a/model/replication.go b/model/replication.go index ec6d6392..28f6ff76 100644 --- a/model/replication.go +++ b/model/replication.go @@ -211,7 +211,6 @@ type ProofSetHandoffState string const ( ProofSetAssembling ProofSetHandoffState = "assembling" - ProofSetProposed ProofSetHandoffState = "proposed" ProofSetTransferred ProofSetHandoffState = "transferred" )