From cdfc71285b666e0a1fbf53428edad4cc50c9e15c Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 1 Apr 2026 17:04:24 -0500 Subject: [PATCH 01/43] WIP porep --- .gitmodules | 3 + service_contracts/Makefile | 2 +- service_contracts/foundry.toml | 7 +- service_contracts/lib/fvm-solidity | 1 + service_contracts/src/PoRepService.sol | 90 ++++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 2 deletions(-) create mode 160000 service_contracts/lib/fvm-solidity create mode 100644 service_contracts/src/PoRepService.sol diff --git a/.gitmodules b/.gitmodules index 5abd0615..187add95 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,6 @@ [submodule "service_contracts/lib/openzeppelin-contracts-upgradeable"] path = service_contracts/lib/openzeppelin-contracts-upgradeable url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable +[submodule "service_contracts/lib/fvm-solidity"] + path = service_contracts/lib/fvm-solidity + url = https://github.com/filecoin-project/fvm-solidity diff --git a/service_contracts/Makefile b/service_contracts/Makefile index 7721a6f1..236d170c 100644 --- a/service_contracts/Makefile +++ b/service_contracts/Makefile @@ -8,7 +8,7 @@ CHALLENGE_FINALITY ?= # Default target .PHONY: default -default: build test +default: build # All target including installation .PHONY: all diff --git a/service_contracts/foundry.toml b/service_contracts/foundry.toml index 93a816ac..a9b0af6b 100644 --- a/service_contracts/foundry.toml +++ b/service_contracts/foundry.toml @@ -10,6 +10,11 @@ via_ir = true optimizer = true optimizer_runs = 200 +ignored_error_codes = [ + 2519, # shadowed declarations + 3628, # https://github.com/argotorg/solidity/issues/10159 +] + # For dependencies remappings = [ '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/', @@ -18,7 +23,7 @@ remappings = [ '@fws-payments/=lib/fws-payments/src/', '@pdp/=lib/pdp/src/', '@session-key-registry/=lib/session-key-registry/src/', - '@fvm-solidity/=lib/pdp/lib/fvm-solidity/src/', + '@fvm-solidity/=lib/fvm-solidity/src/', '@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/', ] diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity new file mode 160000 index 00000000..2bd48101 --- /dev/null +++ b/service_contracts/lib/fvm-solidity @@ -0,0 +1 @@ +Subproject commit 2bd481019b90293fd5f0fc8b8456932fa047089b diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol new file mode 100644 index 00000000..3ac27c2c --- /dev/null +++ b/service_contracts/src/PoRepService.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT +pragma solidity ^0.8.30; + +import {FVMAddress} from "@fvm-solidity/FVMAddress.sol"; +import {CBOR_CODEC} from "@fvm-solidity/FVMCodec.sol"; +import {SECTOR_CONTENT_CHANGED} from "@fvm-solidity/FVMMethod.sol"; +import { + CalldataSlice, + FVMSectorContentChanged, + PieceChangeIter, + SectorChangesHeader, + SectorContentChangedReturn, + SectorReturn +} from "@fvm-solidity/FVMSectorContentChanged.sol"; +import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; + +contract PoRepService is IValidator { + using FVMAddress for address; + using FVMSectorContentChanged for uint256; + using FVMSectorContentChanged for CalldataSlice; + + error ForbiddenMethod(uint64 method); + + FilecoinPayV1 private immutable PAYMENTS; + + constructor(FilecoinPayV1 payments) { + PAYMENTS = payments; + } + + /** + * Filecoin Actor ** + */ + function handle_filecoin_method(uint64 method, uint64, /*codec*/ bytes calldata) + public + view + returns (uint32 exitCode, uint64 returnDataCodec, bytes memory returnData) + { + require(method == SECTOR_CONTENT_CHANGED, ForbiddenMethod(method)); + uint64 minerActor = msg.sender.safeActorId(); + // TODO check miner is miner + + uint256 numSectors; + uint256 iter; + (numSectors, iter) = FVMSectorContentChanged.readParamsHeader(); + + SectorContentChangedReturn memory ret; + ret.sectors = new SectorReturn[](numSectors); + SectorChangesHeader memory header; + PieceChangeIter memory piece; + for (uint256 i = 0; i < numSectors; i++) { + iter = iter.readSectorHeader(header); + FVMSectorContentChanged.initSectorReturn(ret.sectors[i], header.numPieces); + for (uint256 j = 0; j < header.numPieces; j++) { + iter = iter.readPiece(piece); + // Materialise and validate: CID prefix was already stripped, so digest is 36 bytes + bytes memory digest = piece.digest.loadSlice(); + require(digest.length == 36); + // Decode and validate the allocation ID + uint64 allocationId = abi.decode(piece.payload.loadSlice(), (uint64)); + require(allocationId > 0); + FVMSectorContentChanged.accept(ret.sectors[i], j); + } + } + return (0, CBOR_CODEC, FVMSectorContentChanged.encodeReturn(ret)); + } + + /** + * IValidator ** + */ + function validatePayment( + uint256, + /*railId*/ + uint256 proposedAmount, + // the epoch up to and including which the rail has already been settled + uint256, + /*fromEpoch*/ + // the epoch up to and including which validation is requested; payment will be validated for (toEpoch - fromEpoch) epochs + uint256 toEpoch, + uint256 /*rate*/ + ) external pure returns (ValidationResult memory result) { + // TODO check terminated + result.modifiedAmount = proposedAmount; + result.settleUpto = toEpoch; + } + + function railTerminated(uint256, /*railId*/ address, /*terminator*/ uint256 /*endEpoch*/ ) external view { + require(msg.sender == address(PAYMENTS)); + // TODO cleanup + } +} From 87667b8165fd789b92131ea2ff8615c114fb95c8 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 15 Apr 2026 20:45:30 -0500 Subject: [PATCH 02/43] PoRepDeal --- service_contracts/foundry.toml | 2 + service_contracts/lib/fvm-solidity | 2 +- service_contracts/src/PoRepDeal.sol | 141 ++++++++++++++++++++++ service_contracts/src/PoRepService.sol | 138 +++++++++++---------- service_contracts/test/PoRepService.t.sol | 74 ++++++++++++ 5 files changed, 286 insertions(+), 71 deletions(-) create mode 100644 service_contracts/src/PoRepDeal.sol create mode 100644 service_contracts/test/PoRepService.t.sol diff --git a/service_contracts/foundry.toml b/service_contracts/foundry.toml index a9b0af6b..a6ff9e96 100644 --- a/service_contracts/foundry.toml +++ b/service_contracts/foundry.toml @@ -11,8 +11,10 @@ optimizer = true optimizer_runs = 200 ignored_error_codes = [ + 2394, # don't need to clear tstore 2519, # shadowed declarations 3628, # https://github.com/argotorg/solidity/issues/10159 + 3860, # tests exceed size limit ] # For dependencies diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index 2bd48101..dcc68514 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit 2bd481019b90293fd5f0fc8b8456932fa047089b +Subproject commit dcc68514be1fb37648f03179475662e7590f1b29 diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol new file mode 100644 index 00000000..05aa55bb --- /dev/null +++ b/service_contracts/src/PoRepDeal.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT +pragma solidity ^0.8.30; + +import {CalldataUtils, CalldataSlice} from "@fvm-solidity/CalldataUtils.sol"; +import {FVMAddress} from "@fvm-solidity/FVMAddress.sol"; +import {CBOR_CODEC} from "@fvm-solidity/FVMCodec.sol"; +import {SECTOR_CONTENT_CHANGED} from "@fvm-solidity/FVMMethod.sol"; +import { + CalldataSlice, + FVMSectorContentChanged, + PieceChangeIter, + SectorChangesHeader, + SectorContentChangedReturn, + SectorReturn +} from "@fvm-solidity/FVMSectorContentChanged.sol"; +import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +IERC20 constant NATIVE_TOKEN = IERC20(address(0)); + +contract PoRepDeal is IValidator { + using FVMAddress for address; + using FVMSectorContentChanged for uint256; + using CalldataUtils for CalldataSlice; + + error ForbiddenMethod(uint64 method); + + address public immutable SERVICE; + address public immutable CLIENT; + uint64 public immutable PROVIDER; + FilecoinPayV1 private immutable PAYMENTS; + uint256 RAIL_ID; + + uint256 faultedCount; + + enum PieceStatus { + UNAUTHORIZED, + AUTHORIZED, + ACTIVE + } + + // TODO move to child contract + mapping(bytes32 pieceId => PieceStatus) pieces; + + // TODO move to child contract + struct SectorStatus { + uint256 totalSize; + } + + constructor(address service, address client, uint64 provider, address receiver, FilecoinPayV1 payments) { + SERVICE = service; + CLIENT = client; + PROVIDER = provider; + PAYMENTS = payments; + RAIL_ID = PAYMENTS.createRail(NATIVE_TOKEN, client, receiver, address(this), 0, address(0)); + } + + function _onlyClient() internal view { + require(msg.sender == CLIENT); + } + + function _onlyService() internal view { + require(msg.sender == SERVICE); + } + + modifier onlyClient() { + _onlyClient(); + _; + } + + modifier onlyService() { + _onlyService(); + _; + } + + // TODO allow provider to addPieces with client authorization + function addPieces(bytes32[] calldata cidHashes) external onlyClient { + for (uint256 i = 0; i < cidHashes.length; i++) { + bytes32 cidHash = cidHashes[i]; + require(pieces[cidHash] == PieceStatus.UNAUTHORIZED); + pieces[cidHash] = PieceStatus.AUTHORIZED; + } + } + + function pieceAdded(bytes32 cidHash, uint64 sectorId) external onlyService { + // TODO + require(pieces[cidHash] == PieceStatus.AUTHORIZED); + pieces[cidHash] = PieceStatus.ACTIVE; + } + + /** + * IValidator + */ + function validatePayment( + uint256, // railId + uint256 proposedAmount, // the epoch up to and including which the rail has already been settled + uint256, // fromEpoch + uint256 toEpoch, + uint256 // rate + ) external pure returns (ValidationResult memory result) { + result.modifiedAmount = proposedAmount; + result.settleUpto = toEpoch; + } + + function railTerminated(uint256, /*railId*/ address, /*terminator*/ uint256 /*endEpoch*/ ) external view { + require(msg.sender == address(PAYMENTS)); + // TODO cleanup + } + + function handle_filecoin_method(uint64 method, uint64, bytes calldata) + public + view + returns (uint32 exitCode, uint64 returnDataCodec, bytes memory returnData) + { + require(method == SECTOR_CONTENT_CHANGED, ForbiddenMethod(method)); + uint64 minerActor = msg.sender.safeActorId(); + require(minerActor == PROVIDER); + + uint256 numSectors; + uint256 iter; + (numSectors, iter) = FVMSectorContentChanged.readParamsHeader(); + + SectorContentChangedReturn memory ret; + ret.sectors = new SectorReturn[](numSectors); + SectorChangesHeader memory header; + PieceChangeIter memory piece; + for (uint256 i = 0; i < numSectors; i++) { + iter = iter.readSectorHeader(header); + FVMSectorContentChanged.initSectorReturn(ret.sectors[i], header.numPieces); + for (uint256 j = 0; j < header.numPieces; j++) { + iter = iter.readPiece(piece); + bytes32 cidHash = piece.digest.keccak(); + // Decode and validate the allocation ID + uint64 allocationId = abi.decode(piece.payload.load(), (uint64)); + require(allocationId > 0); + FVMSectorContentChanged.accept(ret.sectors[i], j); + } + } + return (0, CBOR_CODEC, FVMSectorContentChanged.encodeReturn(ret)); + } +} diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index 3ac27c2c..c121484d 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -2,89 +2,87 @@ pragma solidity ^0.8.30; import {FVMAddress} from "@fvm-solidity/FVMAddress.sol"; -import {CBOR_CODEC} from "@fvm-solidity/FVMCodec.sol"; -import {SECTOR_CONTENT_CHANGED} from "@fvm-solidity/FVMMethod.sol"; -import { - CalldataSlice, - FVMSectorContentChanged, - PieceChangeIter, - SectorChangesHeader, - SectorContentChangedReturn, - SectorReturn -} from "@fvm-solidity/FVMSectorContentChanged.sol"; -import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; - -contract PoRepService is IValidator { +import {FVMMiner} from "@fvm-solidity/FVMMiner.sol"; +import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; +import {PoRepDeal} from "./PoRepDeal.sol"; + +contract PoRepPayee { using FVMAddress for address; - using FVMSectorContentChanged for uint256; - using FVMSectorContentChanged for CalldataSlice; + using FVMMiner for uint64; + + error Unauthorized(address caller); + + uint64 public immutable MINER; + + constructor() { + MINER = PoRepService(msg.sender).getMiner(); + } - error ForbiddenMethod(uint64 method); + function owner() public view returns (uint64) { + return MINER.getOwnerActorId(); + } + + function sudo(address payable, bytes calldata) external payable returns (bytes memory) { + require(msg.sender.actorId() == owner(), Unauthorized(msg.sender)); + assembly ("memory-safe") { + let insize := calldataload(68) + calldatacopy(0, 100, insize) + let success := call(gas(), calldataload(4), callvalue(), 0, insize, 0, 0) + mstore(0, 32) + mstore(32, returndatasize()) + returndatacopy(64, 0, returndatasize()) + if success { return(0, add(64, returndatasize())) } + revert(0, add(64, returndatasize())) + } + } +} +contract PoRepService { FilecoinPayV1 private immutable PAYMENTS; constructor(FilecoinPayV1 payments) { PAYMENTS = payments; } - /** - * Filecoin Actor ** - */ - function handle_filecoin_method(uint64 method, uint64, /*codec*/ bytes calldata) - public - view - returns (uint32 exitCode, uint64 returnDataCodec, bytes memory returnData) - { - require(method == SECTOR_CONTENT_CHANGED, ForbiddenMethod(method)); - uint64 minerActor = msg.sender.safeActorId(); - // TODO check miner is miner - - uint256 numSectors; - uint256 iter; - (numSectors, iter) = FVMSectorContentChanged.readParamsHeader(); - - SectorContentChangedReturn memory ret; - ret.sectors = new SectorReturn[](numSectors); - SectorChangesHeader memory header; - PieceChangeIter memory piece; - for (uint256 i = 0; i < numSectors; i++) { - iter = iter.readSectorHeader(header); - FVMSectorContentChanged.initSectorReturn(ret.sectors[i], header.numPieces); - for (uint256 j = 0; j < header.numPieces; j++) { - iter = iter.readPiece(piece); - // Materialise and validate: CID prefix was already stripped, so digest is 36 bytes - bytes memory digest = piece.digest.loadSlice(); - require(digest.length == 36); - // Decode and validate the allocation ID - uint64 allocationId = abi.decode(piece.payload.loadSlice(), (uint64)); - require(allocationId > 0); - FVMSectorContentChanged.accept(ret.sectors[i], j); - } + function getMiner() external view returns (uint64 payee) { + assembly ("memory-safe") { + payee := tload(0) } - return (0, CBOR_CODEC, FVMSectorContentChanged.encodeReturn(ret)); } - /** - * IValidator ** - */ - function validatePayment( - uint256, - /*railId*/ - uint256 proposedAmount, - // the epoch up to and including which the rail has already been settled - uint256, - /*fromEpoch*/ - // the epoch up to and including which validation is requested; payment will be validated for (toEpoch - fromEpoch) epochs - uint256 toEpoch, - uint256 /*rate*/ - ) external pure returns (ValidationResult memory result) { - // TODO check terminated - result.modifiedAmount = proposedAmount; - result.settleUpto = toEpoch; + function setMiner(uint64 payee) internal { + assembly ("memory-safe") { + tstore(0, payee) + } + } + + bytes32 constant RECEIVER_INITCODE_HASH = keccak256(type(PoRepPayee).creationCode); + + function getReceiverAddress(uint64 provider) public view returns (address receiver) { + receiver = address( + uint160( + uint256( + keccak256( + abi.encodePacked( + uint8(0xff), address(this), bytes32(uint256(uint64(provider))), RECEIVER_INITCODE_HASH + ) + ) + ) + ) + ); } - function railTerminated(uint256, /*railId*/ address, /*terminator*/ uint256 /*endEpoch*/ ) external view { - require(msg.sender == address(PAYMENTS)); - // TODO cleanup + function createReceiver(uint64 provider) public returns (address receiver) { + receiver = getReceiverAddress(provider); + if (receiver.code.length == 0) { + setMiner(provider); + new PoRepPayee{salt: bytes32(uint256(provider))}(); + } + } + + function createDeal(address client, uint64 provider) external returns (address deal) { + address receiver = createReceiver(provider); + + deal = address(new PoRepDeal(address(this), client, provider, receiver, PAYMENTS)); } } diff --git a/service_contracts/test/PoRepService.t.sol b/service_contracts/test/PoRepService.t.sol new file mode 100644 index 00000000..59671377 --- /dev/null +++ b/service_contracts/test/PoRepService.t.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT +pragma solidity ^0.8.30; + +import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; +import {PoRepPayee, PoRepService} from "../src/PoRepService.sol"; +import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; +import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; + +contract PoRepPayeeTest is MockFVMTest { + uint64 constant MINER_ID = 1643; + uint64 constant OWNER_ID = 151; + PoRepPayee payee; + + function setUp() public override { + super.setUp(); + + FVMMinerActor miner = mockMiner(MINER_ID); + ACTOR_PRECOMPILE.mockResolveAddress(address(this), OWNER_ID); + ACTOR_PRECOMPILE.mockResolveAddress(address(miner), MINER_ID); + miner.mockOwner(OWNER_ID); + + payee = new PoRepPayee(); + } + + function getMiner() external pure returns (uint64 payee) { + return MINER_ID; + } + + function testOwner() public view { + assertEq(payee.MINER(), MINER_ID); + assertEq(payee.owner(), OWNER_ID); + } + + function testSudoUnauthorized() public { + address payable notOwner = payable(0x9999999999999999999999999999999999999999); + vm.deal(notOwner, 1); + vm.expectRevert(abi.encodeWithSelector(PoRepPayee.Unauthorized.selector, notOwner)); + vm.prank(notOwner); + payee.sudo{value: 1}(notOwner, bytes("")); + } + + // FIXME + function testSudo() public { + address payable notOwner = payable(0x9999999999999999999999999999999999999999); + assertEq(notOwner.balance, 0); + payee.sudo{value: 1}(notOwner, bytes("")); + assertEq(notOwner.balance, 1); + } +} + +contract PoRepServiceTest is MockFVMTest { + FilecoinPayV1 payments; + PoRepService service; + + function setUp() public override { + super.setUp(); + + payments = new FilecoinPayV1(); + service = new PoRepService(payments); + } + + function testCreateReceiver() public { + uint64 minerId = 64; + + address receiver = service.getReceiverAddress(minerId); + assertEq(receiver.code.length, 0); + + address created = service.createReceiver(minerId); + assertEq(receiver, created); + assertNotEq(receiver.code.length, 0); + + assertEq(PoRepPayee(created).MINER(), minerId); + } +} From 6a31a9c9b36363b6b1dae66ab16e4b8a9f8bf8c5 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Thu, 16 Apr 2026 13:25:48 -0500 Subject: [PATCH 03/43] getActorId --- service_contracts/src/PoRepDeal.sol | 17 +++++++++++------ service_contracts/src/PoRepService.sol | 6 +++--- service_contracts/test/PoRepService.t.sol | 6 ++++++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 05aa55bb..9c3c3d4e 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -44,9 +44,12 @@ contract PoRepDeal is IValidator { // TODO move to child contract struct SectorStatus { - uint256 totalSize; + uint256 activeSize; } + mapping(uint256 sectorId => SectorStatus) public sectors; + uint256 public totalActiveSize; + constructor(address service, address client, uint64 provider, address receiver, FilecoinPayV1 payments) { SERVICE = service; CLIENT = client; @@ -82,10 +85,12 @@ contract PoRepDeal is IValidator { } } - function pieceAdded(bytes32 cidHash, uint64 sectorId) external onlyService { - // TODO + function pieceAdded(bytes32 cidHash, uint64 sectorId, uint64 paddedSize) internal { + // TODO expiry require(pieces[cidHash] == PieceStatus.AUTHORIZED); pieces[cidHash] = PieceStatus.ACTIVE; + sectors[sectorId].activeSize += paddedSize; + totalActiveSize += paddedSize; } /** @@ -109,7 +114,6 @@ contract PoRepDeal is IValidator { function handle_filecoin_method(uint64 method, uint64, bytes calldata) public - view returns (uint32 exitCode, uint64 returnDataCodec, bytes memory returnData) { require(method == SECTOR_CONTENT_CHANGED, ForbiddenMethod(method)); @@ -130,9 +134,10 @@ contract PoRepDeal is IValidator { for (uint256 j = 0; j < header.numPieces; j++) { iter = iter.readPiece(piece); bytes32 cidHash = piece.digest.keccak(); + pieceAdded(cidHash, header.sector, piece.paddedSize); // Decode and validate the allocation ID - uint64 allocationId = abi.decode(piece.payload.load(), (uint64)); - require(allocationId > 0); + address deal = abi.decode(piece.payload.load(), (address)); + // TODO deal FVMSectorContentChanged.accept(ret.sectors[i], j); } } diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index c121484d..b2904250 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: Apache-2.0 OR MIT pragma solidity ^0.8.30; -import {FVMAddress} from "@fvm-solidity/FVMAddress.sol"; +import {FVMActor} from "@fvm-solidity/FVMActor.sol"; import {FVMMiner} from "@fvm-solidity/FVMMiner.sol"; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {PoRepDeal} from "./PoRepDeal.sol"; contract PoRepPayee { - using FVMAddress for address; + using FVMActor for address; using FVMMiner for uint64; error Unauthorized(address caller); @@ -23,7 +23,7 @@ contract PoRepPayee { } function sudo(address payable, bytes calldata) external payable returns (bytes memory) { - require(msg.sender.actorId() == owner(), Unauthorized(msg.sender)); + require(msg.sender.getActorId() == owner(), Unauthorized(msg.sender)); assembly ("memory-safe") { let insize := calldataload(68) calldatacopy(0, 100, insize) diff --git a/service_contracts/test/PoRepService.t.sol b/service_contracts/test/PoRepService.t.sol index 59671377..e686bbc9 100644 --- a/service_contracts/test/PoRepService.t.sol +++ b/service_contracts/test/PoRepService.t.sol @@ -3,10 +3,13 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {PoRepPayee, PoRepService} from "../src/PoRepService.sol"; +import {FVMActor} from "@fvm-solidity/FVMActor.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; contract PoRepPayeeTest is MockFVMTest { + using FVMActor for address; + uint64 constant MINER_ID = 1643; uint64 constant OWNER_ID = 151; PoRepPayee payee; @@ -29,11 +32,14 @@ contract PoRepPayeeTest is MockFVMTest { function testOwner() public view { assertEq(payee.MINER(), MINER_ID); assertEq(payee.owner(), OWNER_ID); + assertEq(address(this).getActorId(), OWNER_ID); } function testSudoUnauthorized() public { address payable notOwner = payable(0x9999999999999999999999999999999999999999); vm.deal(notOwner, 1); + ACTOR_PRECOMPILE.mockResolveAddress(notOwner, OWNER_ID + 1); + vm.expectRevert(abi.encodeWithSelector(PoRepPayee.Unauthorized.selector, notOwner)); vm.prank(notOwner); payee.sudo{value: 1}(notOwner, bytes("")); From cd9af789de70a05aebb7b5fc3fef002ebfae5710 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Thu, 16 Apr 2026 13:59:00 -0500 Subject: [PATCH 04/43] allow multiple deals per sector --- service_contracts/lib/fvm-solidity | 2 +- service_contracts/src/PoRepDeal.sol | 71 ++++++----------------- service_contracts/src/PoRepService.sol | 51 +++++++++++++++- service_contracts/test/PoRepService.t.sol | 1 - 4 files changed, 67 insertions(+), 58 deletions(-) diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index dcc68514..6155ad46 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit dcc68514be1fb37648f03179475662e7590f1b29 +Subproject commit 6155ad4621d0934d0cd490c4545b6d8dac0a953f diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 9c3c3d4e..e93dead9 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -1,35 +1,18 @@ // SPDX-License-Identifier: Apache-2.0 OR MIT pragma solidity ^0.8.30; -import {CalldataUtils, CalldataSlice} from "@fvm-solidity/CalldataUtils.sol"; -import {FVMAddress} from "@fvm-solidity/FVMAddress.sol"; -import {CBOR_CODEC} from "@fvm-solidity/FVMCodec.sol"; -import {SECTOR_CONTENT_CHANGED} from "@fvm-solidity/FVMMethod.sol"; -import { - CalldataSlice, - FVMSectorContentChanged, - PieceChangeIter, - SectorChangesHeader, - SectorContentChangedReturn, - SectorReturn -} from "@fvm-solidity/FVMSectorContentChanged.sol"; import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; IERC20 constant NATIVE_TOKEN = IERC20(address(0)); contract PoRepDeal is IValidator { - using FVMAddress for address; - using FVMSectorContentChanged for uint256; - using CalldataUtils for CalldataSlice; - - error ForbiddenMethod(uint64 method); - address public immutable SERVICE; address public immutable CLIENT; uint64 public immutable PROVIDER; FilecoinPayV1 private immutable PAYMENTS; - uint256 RAIL_ID; + uint256 public immutable RAIL_ID; + uint256 public immutable FIL_PER_BYTE_PER_EPOCH; uint256 faultedCount; @@ -50,11 +33,19 @@ contract PoRepDeal is IValidator { mapping(uint256 sectorId => SectorStatus) public sectors; uint256 public totalActiveSize; - constructor(address service, address client, uint64 provider, address receiver, FilecoinPayV1 payments) { + constructor( + address service, + address client, + uint64 provider, + address receiver, + FilecoinPayV1 payments, + uint256 filPerByte + ) { SERVICE = service; CLIENT = client; PROVIDER = provider; PAYMENTS = payments; + FIL_PER_BYTE_PER_EPOCH = filPerByte; RAIL_ID = PAYMENTS.createRail(NATIVE_TOKEN, client, receiver, address(this), 0, address(0)); } @@ -85,12 +76,16 @@ contract PoRepDeal is IValidator { } } - function pieceAdded(bytes32 cidHash, uint64 sectorId, uint64 paddedSize) internal { - // TODO expiry + function pieceAdded(uint64 minerId, bytes32 cidHash, uint64 sectorId, uint64 paddedSize) external onlyService { + require(minerId == PROVIDER); + require(pieces[cidHash] == PieceStatus.AUTHORIZED); pieces[cidHash] = PieceStatus.ACTIVE; + sectors[sectorId].activeSize += paddedSize; totalActiveSize += paddedSize; + + PAYMENTS.modifyRailPayment(RAIL_ID, paddedSize * FIL_PER_BYTE_PER_EPOCH, 0); } /** @@ -111,36 +106,4 @@ contract PoRepDeal is IValidator { require(msg.sender == address(PAYMENTS)); // TODO cleanup } - - function handle_filecoin_method(uint64 method, uint64, bytes calldata) - public - returns (uint32 exitCode, uint64 returnDataCodec, bytes memory returnData) - { - require(method == SECTOR_CONTENT_CHANGED, ForbiddenMethod(method)); - uint64 minerActor = msg.sender.safeActorId(); - require(minerActor == PROVIDER); - - uint256 numSectors; - uint256 iter; - (numSectors, iter) = FVMSectorContentChanged.readParamsHeader(); - - SectorContentChangedReturn memory ret; - ret.sectors = new SectorReturn[](numSectors); - SectorChangesHeader memory header; - PieceChangeIter memory piece; - for (uint256 i = 0; i < numSectors; i++) { - iter = iter.readSectorHeader(header); - FVMSectorContentChanged.initSectorReturn(ret.sectors[i], header.numPieces); - for (uint256 j = 0; j < header.numPieces; j++) { - iter = iter.readPiece(piece); - bytes32 cidHash = piece.digest.keccak(); - pieceAdded(cidHash, header.sector, piece.paddedSize); - // Decode and validate the allocation ID - address deal = abi.decode(piece.payload.load(), (address)); - // TODO deal - FVMSectorContentChanged.accept(ret.sectors[i], j); - } - } - return (0, CBOR_CODEC, FVMSectorContentChanged.encodeReturn(ret)); - } } diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index b2904250..f1ed1243 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -1,6 +1,18 @@ // SPDX-License-Identifier: Apache-2.0 OR MIT pragma solidity ^0.8.30; +import {CalldataUtils, CalldataSlice} from "@fvm-solidity/CalldataUtils.sol"; +import {FVMAddress} from "@fvm-solidity/FVMAddress.sol"; +import {CBOR_CODEC} from "@fvm-solidity/FVMCodec.sol"; +import {SECTOR_CONTENT_CHANGED} from "@fvm-solidity/FVMMethod.sol"; +import { + CalldataSlice, + FVMSectorContentChanged, + PieceChangeIter, + SectorChangesHeader, + SectorContentChangedReturn, + SectorReturn +} from "@fvm-solidity/FVMSectorContentChanged.sol"; import {FVMActor} from "@fvm-solidity/FVMActor.sol"; import {FVMMiner} from "@fvm-solidity/FVMMiner.sol"; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; @@ -38,6 +50,12 @@ contract PoRepPayee { } contract PoRepService { + using FVMAddress for address; + using FVMSectorContentChanged for uint256; + using CalldataUtils for CalldataSlice; + + error ForbiddenMethod(uint64 method); + FilecoinPayV1 private immutable PAYMENTS; constructor(FilecoinPayV1 payments) { @@ -80,9 +98,38 @@ contract PoRepService { } } - function createDeal(address client, uint64 provider) external returns (address deal) { + function createDeal(address client, uint64 provider, uint256 filPerBytePerEpoch) external returns (address deal) { address receiver = createReceiver(provider); - deal = address(new PoRepDeal(address(this), client, provider, receiver, PAYMENTS)); + deal = address(new PoRepDeal(address(this), client, provider, receiver, PAYMENTS, filPerBytePerEpoch)); + } + + function handle_filecoin_method(uint64 method, uint64, bytes calldata) + public + returns (uint32 exitCode, uint64 returnDataCodec, bytes memory returnData) + { + require(method == SECTOR_CONTENT_CHANGED, ForbiddenMethod(method)); + uint64 minerActor = msg.sender.safeActorId(); + + uint256 numSectors; + uint256 iter; + (numSectors, iter) = FVMSectorContentChanged.readParamsHeader(); + + SectorContentChangedReturn memory ret; + ret.sectors = new SectorReturn[](numSectors); + SectorChangesHeader memory header; + PieceChangeIter memory piece; + for (uint256 i = 0; i < numSectors; i++) { + iter = iter.readSectorHeader(header); + FVMSectorContentChanged.initSectorReturn(ret.sectors[i], header.numPieces); + for (uint256 j = 0; j < header.numPieces; j++) { + iter = iter.readPiece(piece); + bytes32 cidHash = piece.digest.keccak(); + address deal = piece.payload.toAddress(); + PoRepDeal(deal).pieceAdded(minerActor, cidHash, header.sector, piece.paddedSize); + FVMSectorContentChanged.accept(ret.sectors[i], j); + } + } + return (0, CBOR_CODEC, FVMSectorContentChanged.encodeReturn(ret)); } } diff --git a/service_contracts/test/PoRepService.t.sol b/service_contracts/test/PoRepService.t.sol index e686bbc9..fb1f4be9 100644 --- a/service_contracts/test/PoRepService.t.sol +++ b/service_contracts/test/PoRepService.t.sol @@ -45,7 +45,6 @@ contract PoRepPayeeTest is MockFVMTest { payee.sudo{value: 1}(notOwner, bytes("")); } - // FIXME function testSudo() public { address payable notOwner = payable(0x9999999999999999999999999999999999999999); assertEq(notOwner.balance, 0); From 571af49a5c1f3d31c79acf7c6019452c09adbcf5 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 17 Apr 2026 05:00:02 -0500 Subject: [PATCH 05/43] authenticate with nonce and move payments operator back to service --- .gitmodules | 3 +++ service_contracts/foundry.toml | 1 + service_contracts/lib/fvm-solidity | 2 +- service_contracts/lib/solady | 1 + service_contracts/src/PoRepDeal.sol | 25 +++++++++++++++---------- service_contracts/src/PoRepService.sol | 25 +++++++++++++++++++++---- 6 files changed, 42 insertions(+), 15 deletions(-) create mode 160000 service_contracts/lib/solady diff --git a/.gitmodules b/.gitmodules index 187add95..1f62a127 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "service_contracts/lib/fvm-solidity"] path = service_contracts/lib/fvm-solidity url = https://github.com/filecoin-project/fvm-solidity +[submodule "service_contracts/lib/solady"] + path = service_contracts/lib/solady + url = https://github.com/Vectorized/solady diff --git a/service_contracts/foundry.toml b/service_contracts/foundry.toml index a6ff9e96..02a9546c 100644 --- a/service_contracts/foundry.toml +++ b/service_contracts/foundry.toml @@ -27,6 +27,7 @@ remappings = [ '@session-key-registry/=lib/session-key-registry/src/', '@fvm-solidity/=lib/fvm-solidity/src/', '@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/', + '@solady/=lib/solady/src/', ] # Allow reading test data files diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index 6155ad46..df68a11e 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit 6155ad4621d0934d0cd490c4545b6d8dac0a953f +Subproject commit df68a11e47869d354582e69c33e921a53d32d65f diff --git a/service_contracts/lib/solady b/service_contracts/lib/solady new file mode 160000 index 00000000..acd959aa --- /dev/null +++ b/service_contracts/lib/solady @@ -0,0 +1 @@ +Subproject commit acd959aa4bd04720d640bf4e6a5c71037510cc4b diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index e93dead9..60cdbcf2 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -2,9 +2,6 @@ pragma solidity ^0.8.30; import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -IERC20 constant NATIVE_TOKEN = IERC20(address(0)); contract PoRepDeal is IValidator { address public immutable SERVICE; @@ -13,6 +10,7 @@ contract PoRepDeal is IValidator { FilecoinPayV1 private immutable PAYMENTS; uint256 public immutable RAIL_ID; uint256 public immutable FIL_PER_BYTE_PER_EPOCH; + uint64 private immutable NONCE; uint256 faultedCount; @@ -37,16 +35,18 @@ contract PoRepDeal is IValidator { address service, address client, uint64 provider, - address receiver, FilecoinPayV1 payments, - uint256 filPerByte + uint256 railId, + uint256 filPerBytePerEpoch, + uint64 nonce ) { SERVICE = service; CLIENT = client; PROVIDER = provider; PAYMENTS = payments; - FIL_PER_BYTE_PER_EPOCH = filPerByte; - RAIL_ID = PAYMENTS.createRail(NATIVE_TOKEN, client, receiver, address(this), 0, address(0)); + FIL_PER_BYTE_PER_EPOCH = filPerBytePerEpoch; + RAIL_ID = railId; + NONCE = nonce; } function _onlyClient() internal view { @@ -76,7 +76,11 @@ contract PoRepDeal is IValidator { } } - function pieceAdded(uint64 minerId, bytes32 cidHash, uint64 sectorId, uint64 paddedSize) external onlyService { + function pieceAdded(uint64 minerId, bytes32 cidHash, uint64 sectorId, uint64 paddedSize) + external + onlyService + returns (uint256 railId, uint256 newRate) + { require(minerId == PROVIDER); require(pieces[cidHash] == PieceStatus.AUTHORIZED); @@ -85,7 +89,7 @@ contract PoRepDeal is IValidator { sectors[sectorId].activeSize += paddedSize; totalActiveSize += paddedSize; - PAYMENTS.modifyRailPayment(RAIL_ID, paddedSize * FIL_PER_BYTE_PER_EPOCH, 0); + return (RAIL_ID, paddedSize * FIL_PER_BYTE_PER_EPOCH); } /** @@ -102,8 +106,9 @@ contract PoRepDeal is IValidator { result.settleUpto = toEpoch; } - function railTerminated(uint256, /*railId*/ address, /*terminator*/ uint256 /*endEpoch*/ ) external view { + function railTerminated(uint256, address terminator, uint256 /*endEpoch*/ ) external view { require(msg.sender == address(PAYMENTS)); + require(terminator == SERVICE); // TODO cleanup } } diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index f1ed1243..d254a507 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -16,8 +16,12 @@ import { import {FVMActor} from "@fvm-solidity/FVMActor.sol"; import {FVMMiner} from "@fvm-solidity/FVMMiner.sol"; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {LibRLP} from "@solady/utils/LibRLP.sol"; import {PoRepDeal} from "./PoRepDeal.sol"; +IERC20 constant NATIVE_TOKEN = IERC20(address(0)); + contract PoRepPayee { using FVMActor for address; using FVMMiner for uint64; @@ -53,6 +57,7 @@ contract PoRepService { using FVMAddress for address; using FVMSectorContentChanged for uint256; using CalldataUtils for CalldataSlice; + using LibRLP for address; error ForbiddenMethod(uint64 method); @@ -90,9 +95,16 @@ contract PoRepService { ); } + uint64 private nonce; + + function authenticateDeal(uint64 nonce) internal view { + require(msg.sender == address(this).computeAddress(nonce)); + } + function createReceiver(uint64 provider) public returns (address receiver) { receiver = getReceiverAddress(provider); if (receiver.code.length == 0) { + ++nonce; setMiner(provider); new PoRepPayee{salt: bytes32(uint256(provider))}(); } @@ -100,8 +112,10 @@ contract PoRepService { function createDeal(address client, uint64 provider, uint256 filPerBytePerEpoch) external returns (address deal) { address receiver = createReceiver(provider); - - deal = address(new PoRepDeal(address(this), client, provider, receiver, PAYMENTS, filPerBytePerEpoch)); + ++nonce; + deal = address(this).computeAddress(nonce); + uint256 railId = PAYMENTS.createRail(NATIVE_TOKEN, client, receiver, deal, 0, address(0)); + new PoRepDeal(address(this), client, provider, PAYMENTS, railId, filPerBytePerEpoch, nonce); } function handle_filecoin_method(uint64 method, uint64, bytes calldata) @@ -125,8 +139,11 @@ contract PoRepService { for (uint256 j = 0; j < header.numPieces; j++) { iter = iter.readPiece(piece); bytes32 cidHash = piece.digest.keccak(); - address deal = piece.payload.toAddress(); - PoRepDeal(deal).pieceAdded(minerActor, cidHash, header.sector, piece.paddedSize); + uint64 nonce = piece.payload.toUint64(); + address deal = address(this).computeAddress(nonce); + (uint256 railId, uint256 newRate) = + PoRepDeal(deal).pieceAdded(minerActor, cidHash, header.sector, piece.paddedSize); + PAYMENTS.modifyRailPayment(railId, newRate, 0); FVMSectorContentChanged.accept(ret.sectors[i], j); } } From 6440ca391ee737b540f03db57965023287011a3d Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 17 Apr 2026 16:17:55 -0500 Subject: [PATCH 06/43] expiry and lockup --- service_contracts/src/PoRepDeal.sol | 30 +++++++++++++++++++++----- service_contracts/src/PoRepService.sol | 19 ++++++++++++---- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 60cdbcf2..00442a15 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -3,6 +3,10 @@ pragma solidity ^0.8.30; import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; +interface IPoRepService { + function updateLockups(uint64 nonce, uint256 railId, uint256 endEpoch) external; +} + contract PoRepDeal is IValidator { address public immutable SERVICE; address public immutable CLIENT; @@ -12,6 +16,7 @@ contract PoRepDeal is IValidator { uint256 public immutable FIL_PER_BYTE_PER_EPOCH; uint64 private immutable NONCE; + uint64 public endEpoch; uint256 faultedCount; enum PieceStatus { @@ -38,6 +43,7 @@ contract PoRepDeal is IValidator { FilecoinPayV1 payments, uint256 railId, uint256 filPerBytePerEpoch, + uint64 dealEndEpoch, uint64 nonce ) { SERVICE = service; @@ -46,6 +52,7 @@ contract PoRepDeal is IValidator { PAYMENTS = payments; FIL_PER_BYTE_PER_EPOCH = filPerBytePerEpoch; RAIL_ID = railId; + endEpoch = dealEndEpoch; NONCE = nonce; } @@ -76,12 +83,15 @@ contract PoRepDeal is IValidator { } } - function pieceAdded(uint64 minerId, bytes32 cidHash, uint64 sectorId, uint64 paddedSize) - external - onlyService - returns (uint256 railId, uint256 newRate) - { + function pieceAdded( + uint64 minerId, + bytes32 cidHash, + uint64 sectorId, + uint64 minimumCommitmentEpoch, + uint64 paddedSize + ) external onlyService returns (uint256 railId, uint256 newRate) { require(minerId == PROVIDER); + require(minimumCommitmentEpoch >= endEpoch); require(pieces[cidHash] == PieceStatus.AUTHORIZED); pieces[cidHash] = PieceStatus.ACTIVE; @@ -92,6 +102,16 @@ contract PoRepDeal is IValidator { return (RAIL_ID, paddedSize * FIL_PER_BYTE_PER_EPOCH); } + function extend(uint64 epochs) external onlyClient { + endEpoch += epochs; + IPoRepService(SERVICE).updateLockups(NONCE, RAIL_ID, endEpoch); + } + + function settleRail() external { + IPoRepService(SERVICE).updateLockups(NONCE, RAIL_ID, endEpoch); + PAYMENTS.settleRail(RAIL_ID, block.number); + } + /** * IValidator */ diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index d254a507..8185660e 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -110,12 +110,15 @@ contract PoRepService { } } - function createDeal(address client, uint64 provider, uint256 filPerBytePerEpoch) external returns (address deal) { + function createDeal(address client, uint64 provider, uint256 filPerBytePerEpoch, uint64 dealEndEpoch) + external + returns (address deal) + { address receiver = createReceiver(provider); ++nonce; deal = address(this).computeAddress(nonce); uint256 railId = PAYMENTS.createRail(NATIVE_TOKEN, client, receiver, deal, 0, address(0)); - new PoRepDeal(address(this), client, provider, PAYMENTS, railId, filPerBytePerEpoch, nonce); + new PoRepDeal(address(this), client, provider, PAYMENTS, railId, filPerBytePerEpoch, dealEndEpoch, nonce); } function handle_filecoin_method(uint64 method, uint64, bytes calldata) @@ -135,18 +138,26 @@ contract PoRepService { PieceChangeIter memory piece; for (uint256 i = 0; i < numSectors; i++) { iter = iter.readSectorHeader(header); + // require(header.minimumCommitmentEpoch > 0); FVMSectorContentChanged.initSectorReturn(ret.sectors[i], header.numPieces); for (uint256 j = 0; j < header.numPieces; j++) { iter = iter.readPiece(piece); bytes32 cidHash = piece.digest.keccak(); uint64 nonce = piece.payload.toUint64(); address deal = address(this).computeAddress(nonce); - (uint256 railId, uint256 newRate) = - PoRepDeal(deal).pieceAdded(minerActor, cidHash, header.sector, piece.paddedSize); + (uint256 railId, uint256 newRate) = PoRepDeal(deal).pieceAdded( + minerActor, cidHash, header.sector, uint64(header.minimumCommitmentEpoch), piece.paddedSize + ); PAYMENTS.modifyRailPayment(railId, newRate, 0); FVMSectorContentChanged.accept(ret.sectors[i], j); } } return (0, CBOR_CODEC, FVMSectorContentChanged.encodeReturn(ret)); } + + function updateLockups(uint64 nonce, uint256 railId, uint256 endEpoch) external { + authenticateDeal(nonce); + + PAYMENTS.modifyRailLockup(railId, endEpoch - block.number, 0); + } } From 850489d0b63364236021a1927821601b90dc3891 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Mon, 20 Apr 2026 15:38:16 -0500 Subject: [PATCH 07/43] fix overlock with one time payments --- service_contracts/src/PoRepDeal.sol | 47 +++++-- service_contracts/src/PoRepService.sol | 12 +- .../test/PoRepDealActivation.t.sol | 127 ++++++++++++++++++ 3 files changed, 168 insertions(+), 18 deletions(-) create mode 100644 service_contracts/test/PoRepDealActivation.t.sol diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 00442a15..02cc621f 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.30; import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; interface IPoRepService { - function updateLockups(uint64 nonce, uint256 railId, uint256 endEpoch) external; + function updateLockups(uint64 nonce, uint256 railId, uint256 payment, uint256 remaining) external; } contract PoRepDeal is IValidator { @@ -16,8 +16,14 @@ contract PoRepDeal is IValidator { uint256 public immutable FIL_PER_BYTE_PER_EPOCH; uint64 private immutable NONCE; - uint64 public endEpoch; - uint256 faultedCount; + struct Info { + uint64 settledEpoch; + uint64 endEpoch; + uint32 faultedCount; + uint96 totalActiveSize; + } + + Info public info; enum PieceStatus { UNAUTHORIZED, @@ -34,7 +40,6 @@ contract PoRepDeal is IValidator { } mapping(uint256 sectorId => SectorStatus) public sectors; - uint256 public totalActiveSize; constructor( address service, @@ -52,8 +57,8 @@ contract PoRepDeal is IValidator { PAYMENTS = payments; FIL_PER_BYTE_PER_EPOCH = filPerBytePerEpoch; RAIL_ID = railId; - endEpoch = dealEndEpoch; NONCE = nonce; + info.endEpoch = dealEndEpoch; } function _onlyClient() internal view { @@ -89,27 +94,41 @@ contract PoRepDeal is IValidator { uint64 sectorId, uint64 minimumCommitmentEpoch, uint64 paddedSize - ) external onlyService returns (uint256 railId, uint256 newRate) { + ) external onlyService { require(minerId == PROVIDER); - require(minimumCommitmentEpoch >= endEpoch); + require(minimumCommitmentEpoch >= info.endEpoch); require(pieces[cidHash] == PieceStatus.AUTHORIZED); pieces[cidHash] = PieceStatus.ACTIVE; sectors[sectorId].activeSize += paddedSize; - totalActiveSize += paddedSize; - return (RAIL_ID, paddedSize * FIL_PER_BYTE_PER_EPOCH); + uint256 prevSize = info.totalActiveSize; + uint256 newSize = prevSize + paddedSize; + uint256 prevRate = prevSize * FIL_PER_BYTE_PER_EPOCH; + uint256 newRate = newSize * FIL_PER_BYTE_PER_EPOCH; + amortize((block.number - info.settledEpoch) * prevRate, (info.endEpoch - block.number) * newRate); + info.settledEpoch = uint64(block.number); + info.totalActiveSize = uint96(newSize); } + // TODO move to service? function extend(uint64 epochs) external onlyClient { - endEpoch += epochs; - IPoRepService(SERVICE).updateLockups(NONCE, RAIL_ID, endEpoch); + uint256 rate = info.totalActiveSize * FIL_PER_BYTE_PER_EPOCH; + uint64 newEndEpoch = info.endEpoch + epochs; + amortize((block.number - info.settledEpoch) * rate, (newEndEpoch - block.number) * rate); + info.endEpoch = newEndEpoch; + info.settledEpoch = uint64(block.number); + } + + function amortize(uint256 payment, uint256 remaining) internal { + IPoRepService(SERVICE).updateLockups(NONCE, RAIL_ID, payment, remaining); } - function settleRail() external { - IPoRepService(SERVICE).updateLockups(NONCE, RAIL_ID, endEpoch); - PAYMENTS.settleRail(RAIL_ID, block.number); + function amortize() external { + uint256 rate = info.totalActiveSize * FIL_PER_BYTE_PER_EPOCH; + amortize((block.number - info.settledEpoch) * rate, (info.endEpoch - block.number) * rate); + info.settledEpoch = uint64(block.number); } /** diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index 8185660e..c93af568 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -145,19 +145,23 @@ contract PoRepService { bytes32 cidHash = piece.digest.keccak(); uint64 nonce = piece.payload.toUint64(); address deal = address(this).computeAddress(nonce); - (uint256 railId, uint256 newRate) = PoRepDeal(deal).pieceAdded( + PoRepDeal(deal).pieceAdded( minerActor, cidHash, header.sector, uint64(header.minimumCommitmentEpoch), piece.paddedSize ); - PAYMENTS.modifyRailPayment(railId, newRate, 0); + //PAYMENTS.modifyRailPayment(railId, 0, payment); + //PAYMENTS.modifyRailLockup(railId, 0, remaining); FVMSectorContentChanged.accept(ret.sectors[i], j); } } return (0, CBOR_CODEC, FVMSectorContentChanged.encodeReturn(ret)); } - function updateLockups(uint64 nonce, uint256 railId, uint256 endEpoch) external { + function updateLockups(uint64 nonce, uint256 railId, uint256 payment, uint256 remaining) external { authenticateDeal(nonce); - PAYMENTS.modifyRailLockup(railId, endEpoch - block.number, 0); + if (payment > 0) { + PAYMENTS.modifyRailPayment(railId, 0, payment); + } + PAYMENTS.modifyRailLockup(railId, 0, remaining); } } diff --git a/service_contracts/test/PoRepDealActivation.t.sol b/service_contracts/test/PoRepDealActivation.t.sol new file mode 100644 index 00000000..aa847b3b --- /dev/null +++ b/service_contracts/test/PoRepDealActivation.t.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT +pragma solidity ^0.8.30; + +import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; +import {PoRepDeal} from "../src/PoRepDeal.sol"; +import {NATIVE_TOKEN, PoRepService} from "../src/PoRepService.sol"; +import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; +import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; +import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +contract PoRepDealActivationTest is MockFVMTest { + uint64 constant MINER_ID = 42; + // 180 days at 30 seconds per epoch + uint64 constant MIN_COMMITMENT_EPOCHS = uint64(180 days / 30); + // 32 GB and 64 GB padded piece sizes + uint64 constant SIZE_32GB = 32 * 1024 * 1024 * 1024; + uint64 constant SIZE_64GB = 64 * 1024 * 1024 * 1024; + // 1 attoFIL per byte per epoch + uint256 constant RATE = 1; + + // CommP CIDs from the FVMSectorContentChanged test suite; prefix stripped to get the 36-byte digest + bytes constant COMMP_CID_1 = hex"0155912024cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + bytes constant COMMP_DIGEST_1 = hex"cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + FilecoinPayV1 payments; + PoRepService service; + FVMMinerActor miner; + address client; + + function setUp() public override { + super.setUp(); + client = makeAddr("client"); + vm.deal(client, 1000 ether); + + payments = new FilecoinPayV1(); + service = new PoRepService(payments); + miner = mockMiner(MINER_ID); + + // Approve the service as rail operator for the client on native token. + // Allowances are sized for a single 64 GB activation over the minimum commitment duration. + uint256 maxRate = uint256(SIZE_64GB) * RATE; + uint256 maxLockup = maxRate * MIN_COMMITMENT_EPOCHS; + vm.prank(client); + payments.setOperatorApproval( + IERC20(address(0)), address(service), true, maxRate, maxLockup, MIN_COMMITMENT_EPOCHS + ); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + /// @dev Scan CREATE nonces to find the one that produced `created` from `deployer`. + function _findDealNonce(address deployer, address created) internal pure returns (uint64) { + for (uint64 n = 1; n <= 20; n++) { + if (vm.computeCreateAddress(deployer, n) == created) return n; + } + revert("could not find deal nonce"); + } + + function _createDeal() internal returns (PoRepDeal deal, uint64 endEpoch) { + endEpoch = uint64(block.number) + MIN_COMMITMENT_EPOCHS; + deal = PoRepDeal(service.createDeal(client, MINER_ID, RATE, endEpoch)); + } + + function _authorize(PoRepDeal deal, bytes memory digest) internal { + bytes32[] memory cidHashes = new bytes32[](1); + cidHashes[0] = keccak256(digest); + vm.prank(client); + deal.addPieces(cidHashes); + } + + function _activate(PoRepDeal deal, bytes memory cid, uint64 paddedSize, uint64 sectorId, int64 minEpoch) internal { + uint64 nonce = _findDealNonce(address(service), address(deal)); + + PieceChange[] memory pieces = new PieceChange[](1); + // payload is read back via CalldataUtils.toUint64(), which expects exactly 8 raw big-endian bytes + pieces[0] = PieceChange({data: cid, size: paddedSize, payload: abi.encodePacked(nonce)}); + SectorChanges[] memory sectorChanges = new SectorChanges[](1); + sectorChanges[0] = SectorChanges({sector: sectorId, minimumCommitmentEpoch: minEpoch, added: pieces}); + miner.callSectorContentChanged(address(service), SectorContentChangedParams({sectors: sectorChanges})); + } + + function _deposit(uint256 amount) internal { + vm.prank(client); + payments.deposit{value: amount}(NATIVE_TOKEN, client, amount); + } + + /// The same piece (same CID hash) cannot be activated twice in the same deal. + function testCannotActivatePieceTwice() public { + uint256 required = uint256(SIZE_32GB) * RATE * MIN_COMMITMENT_EPOCHS; + _deposit(required); + + (PoRepDeal deal, uint64 endEpoch) = _createDeal(); + _authorize(deal, COMMP_DIGEST_1); + + int64 minEpoch = int64(endEpoch); + + // First activation succeeds. + _activate(deal, COMMP_CID_1, SIZE_32GB, 1, minEpoch); + + // Second activation of the same piece (even into a different sector) must revert because + // PoRepDeal.pieceAdded requires PieceStatus.AUTHORIZED but it is now ACTIVE. + uint64 nonce = _findDealNonce(address(service), address(deal)); + PieceChange[] memory pieces = new PieceChange[](1); + pieces[0] = PieceChange({data: COMMP_CID_1, size: SIZE_32GB, payload: abi.encodePacked(nonce)}); + SectorChanges[] memory sectorChanges = new SectorChanges[](1); + sectorChanges[0] = SectorChanges({sector: 2, minimumCommitmentEpoch: minEpoch, added: pieces}); + + vm.expectRevert(); + miner.callSectorContentChanged(address(service), SectorContentChangedParams({sectors: sectorChanges})); + } + + /// A client holding exactly size × rate × duration can successfully lock up and settle a 32 GB deal. + function testExactBalanceSufficient() public { + uint256 required = uint256(SIZE_32GB) * RATE * MIN_COMMITMENT_EPOCHS; + _deposit(required); + + (PoRepDeal deal, uint64 endEpoch) = _createDeal(); + _authorize(deal, COMMP_DIGEST_1); + _activate(deal, COMMP_CID_1, SIZE_32GB, 1, int64(endEpoch)); + + deal.amortize(); + vm.roll(endEpoch); + deal.amortize(); + } +} From c6ba636ba1bdbd5e500a48f2d7252bc5c43619b7 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Mon, 20 Apr 2026 16:53:34 -0500 Subject: [PATCH 08/43] handle amortization after endEpoch --- service_contracts/src/PoRepDeal.sol | 18 +++++++++++++----- .../test/PoRepDealActivation.t.sol | 3 +++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 02cc621f..f786b4c9 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -36,7 +36,7 @@ contract PoRepDeal is IValidator { // TODO move to child contract struct SectorStatus { - uint256 activeSize; + uint96 activeSize; } mapping(uint256 sectorId => SectorStatus) public sectors; @@ -96,6 +96,8 @@ contract PoRepDeal is IValidator { uint64 paddedSize ) external onlyService { require(minerId == PROVIDER); + + // this also enforces block.number < info.endEpoch because minimum commitment is 180 days require(minimumCommitmentEpoch >= info.endEpoch); require(pieces[cidHash] == PieceStatus.AUTHORIZED); @@ -103,6 +105,7 @@ contract PoRepDeal is IValidator { sectors[sectorId].activeSize += paddedSize; + // TODO only amortize once per SectorContentChanged notification uint256 prevSize = info.totalActiveSize; uint256 newSize = prevSize + paddedSize; uint256 prevRate = prevSize * FIL_PER_BYTE_PER_EPOCH; @@ -112,10 +115,10 @@ contract PoRepDeal is IValidator { info.totalActiveSize = uint96(newSize); } - // TODO move to service? function extend(uint64 epochs) external onlyClient { - uint256 rate = info.totalActiveSize * FIL_PER_BYTE_PER_EPOCH; + require(block.number < info.endEpoch); uint64 newEndEpoch = info.endEpoch + epochs; + uint256 rate = info.totalActiveSize * FIL_PER_BYTE_PER_EPOCH; amortize((block.number - info.settledEpoch) * rate, (newEndEpoch - block.number) * rate); info.endEpoch = newEndEpoch; info.settledEpoch = uint64(block.number); @@ -127,8 +130,13 @@ contract PoRepDeal is IValidator { function amortize() external { uint256 rate = info.totalActiveSize * FIL_PER_BYTE_PER_EPOCH; - amortize((block.number - info.settledEpoch) * rate, (info.endEpoch - block.number) * rate); - info.settledEpoch = uint64(block.number); + if (block.number <= info.endEpoch) { + amortize((block.number - info.settledEpoch) * rate, (info.endEpoch - block.number) * rate); + info.settledEpoch = uint64(block.number); + } else { + amortize((info.endEpoch - info.settledEpoch) * rate, 0); + info.settledEpoch = info.endEpoch; + } } /** diff --git a/service_contracts/test/PoRepDealActivation.t.sol b/service_contracts/test/PoRepDealActivation.t.sol index aa847b3b..a6bddd12 100644 --- a/service_contracts/test/PoRepDealActivation.t.sol +++ b/service_contracts/test/PoRepDealActivation.t.sol @@ -123,5 +123,8 @@ contract PoRepDealActivationTest is MockFVMTest { deal.amortize(); vm.roll(endEpoch); deal.amortize(); + + vm.roll(endEpoch + 1); + deal.amortize(); } } From d2bbf019a3fad2ba88487d14e1fc1eed6171f000 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Mon, 20 Apr 2026 19:50:34 -0500 Subject: [PATCH 09/43] onBadSector --- service_contracts/src/PoRepDeal.sol | 58 ++++++++-- .../test/PoRepDealSectorStatus.t.sol | 101 ++++++++++++++++++ 2 files changed, 153 insertions(+), 6 deletions(-) create mode 100644 service_contracts/test/PoRepDealSectorStatus.t.sol diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index f786b4c9..e8d3063c 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.30; import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; +import {FVMSector, SectorStatus, NO_DEADLINE, NO_PARTITION} from "@fvm-solidity/FVMSector.sol"; interface IPoRepService { function updateLockups(uint64 nonce, uint256 railId, uint256 payment, uint256 remaining) external; @@ -19,7 +20,7 @@ contract PoRepDeal is IValidator { struct Info { uint64 settledEpoch; uint64 endEpoch; - uint32 faultedCount; + uint32 faultedSectorCount; uint96 totalActiveSize; } @@ -35,11 +36,12 @@ contract PoRepDeal is IValidator { mapping(bytes32 pieceId => PieceStatus) pieces; // TODO move to child contract - struct SectorStatus { - uint96 activeSize; + struct SectorInfo { + uint96 dealSize; + uint8 failed; } - mapping(uint256 sectorId => SectorStatus) public sectors; + mapping(uint256 sectorId => SectorInfo) public sectors; constructor( address service, @@ -103,7 +105,7 @@ contract PoRepDeal is IValidator { require(pieces[cidHash] == PieceStatus.AUTHORIZED); pieces[cidHash] = PieceStatus.ACTIVE; - sectors[sectorId].activeSize += paddedSize; + sectors[sectorId].dealSize += paddedSize; // TODO only amortize once per SectorContentChanged notification uint256 prevSize = info.totalActiveSize; @@ -128,7 +130,7 @@ contract PoRepDeal is IValidator { IPoRepService(SERVICE).updateLockups(NONCE, RAIL_ID, payment, remaining); } - function amortize() external { + function amortize() public { uint256 rate = info.totalActiveSize * FIL_PER_BYTE_PER_EPOCH; if (block.number <= info.endEpoch) { amortize((block.number - info.settledEpoch) * rate, (info.endEpoch - block.number) * rate); @@ -139,6 +141,50 @@ contract PoRepDeal is IValidator { } } + function onBadSector(uint256 sectorId) internal { + sectors[sectorId].failed = 1; + if (info.faultedSectorCount == 0) { + amortize(); + info.faultedSectorCount = 1; + } else { + info.faultedSectorCount++; + } + } + + function onSectorRestored(uint256 sectorId) internal { + sectors[sectorId].failed = 0; + + if (--info.faultedSectorCount == 0) { + info.settledEpoch = block.number; + } + } + + function sectorExpired(uint64 sectorId) external { + require(block.number < info.endEpoch); + require(sectors[sectorId].dealSize > 0); + require(sectors[sectorId].failed == 0); + require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, NO_DEADLINE, NO_PARTITION)); + + onBadSector(sectorId); + } + + function sectorFaulty(uint64 sectorId, int64 deadline, int64 partition) external { + require(block.number < info.endEpoch); + require(sectors[sectorId].dealSize > 0); + require(sectors[sectorId].failed == 0); + require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Faulty, deadline, partition)); + + onBadSector(sectorId); + } + + function sectorActive(uint64 sectorId, int64 deadline, int64 partition) external { + require(sectors[sectorId].failed == 1); + require(sectors[sectorId].dealSize > 0); + require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Active, deadline, partition)); + + onSectorRestored(sectorId); + } + /** * IValidator */ diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol new file mode 100644 index 00000000..2067e6d7 --- /dev/null +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT +pragma solidity ^0.8.30; + +import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; +import {PoRepDeal} from "../src/PoRepDeal.sol"; +import {NATIVE_TOKEN, PoRepService} from "../src/PoRepService.sol"; +import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; +import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; +import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; +import {SectorStatus} from "@fvm-solidity/FVMSector.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +contract PoRepDealSectorStatusTest is MockFVMTest { + uint64 constant MINER_ID = 42; + uint64 constant SECTOR_ID = 1; + int64 constant DEADLINE = 3; + int64 constant PARTITION = 0; + uint64 constant MIN_COMMITMENT_EPOCHS = uint64(180 days / 30); + uint64 constant SIZE_32GB = 32 * 1024 * 1024 * 1024; + uint256 constant RATE = 1; + + bytes constant COMMP_CID_1 = hex"0155912024cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + bytes constant COMMP_DIGEST_1 = hex"cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + + FilecoinPayV1 payments; + PoRepService service; + FVMMinerActor miner; + address client; + PoRepDeal poRepDeal; + uint64 endEpoch; + + function setUp() public override { + super.setUp(); + client = makeAddr("client"); + vm.deal(client, 1000 ether); + + payments = new FilecoinPayV1(); + service = new PoRepService(payments); + miner = mockMiner(MINER_ID); + + uint256 maxRate = uint256(SIZE_32GB) * RATE; + uint256 maxLockup = maxRate * MIN_COMMITMENT_EPOCHS; + vm.prank(client); + payments.setOperatorApproval( + IERC20(address(0)), address(service), true, maxRate, maxLockup, MIN_COMMITMENT_EPOCHS + ); + + uint256 required = uint256(SIZE_32GB) * RATE * MIN_COMMITMENT_EPOCHS; + vm.prank(client); + payments.deposit{value: required}(NATIVE_TOKEN, client, required); + + endEpoch = uint64(block.number) + MIN_COMMITMENT_EPOCHS; + poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, RATE, endEpoch)); + + bytes32[] memory cidHashes = new bytes32[](1); + cidHashes[0] = keccak256(COMMP_DIGEST_1); + vm.prank(client); + poRepDeal.addPieces(cidHashes); + + // Mock sector as Active with location before activation + miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); + + uint64 nonce = _findDealNonce(address(service), address(poRepDeal)); + PieceChange[] memory pieces = new PieceChange[](1); + pieces[0] = PieceChange({data: COMMP_CID_1, size: SIZE_32GB, payload: abi.encodePacked(nonce)}); + SectorChanges[] memory sectorChanges = new SectorChanges[](1); + sectorChanges[0] = SectorChanges({sector: SECTOR_ID, minimumCommitmentEpoch: int64(endEpoch), added: pieces}); + miner.callSectorContentChanged(address(service), SectorContentChangedParams({sectors: sectorChanges})); + } + + function _findDealNonce(address deployer, address created) internal pure returns (uint64) { + for (uint64 n = 1; n <= 20; n++) { + if (vm.computeCreateAddress(deployer, n) == created) return n; + } + revert("could not find deal nonce"); + } + + function testSectorExpiredAfterActivation() public { + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); + poRepDeal.sectorExpired(SECTOR_ID); + } + + function testSectorFaultyAfterActivation() public { + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION); + } + + function testSectorExpiredRevertsIfStillActive() public { + vm.expectRevert(); + poRepDeal.sectorExpired(SECTOR_ID); + } + + function testSectorFaultyRevertsIfStillActive() public { + vm.expectRevert(); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION); + } + + function testSectorActive() public { + poRepDeal.sectorActive(SECTOR_ID, DEADLINE, PARTITION); + } +} From 73336179029ab1fff3314de29b1f4be72f6f9a7b Mon Sep 17 00:00:00 2001 From: William Morriss Date: Tue, 21 Apr 2026 15:14:21 -0500 Subject: [PATCH 10/43] bounty insurance via service fee --- service_contracts/src/PoRepDeal.sol | 60 +++++++++++++------ service_contracts/src/PoRepService.sol | 20 ++++--- .../test/PoRepDealActivation.t.sol | 6 +- .../test/PoRepDealSectorStatus.t.sol | 24 ++++---- 4 files changed, 72 insertions(+), 38 deletions(-) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index e8d3063c..ec248d33 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.30; import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; import {FVMSector, SectorStatus, NO_DEADLINE, NO_PARTITION} from "@fvm-solidity/FVMSector.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IPoRepService { function updateLockups(uint64 nonce, uint256 railId, uint256 payment, uint256 remaining) external; @@ -14,7 +15,8 @@ contract PoRepDeal is IValidator { uint64 public immutable PROVIDER; FilecoinPayV1 private immutable PAYMENTS; uint256 public immutable RAIL_ID; - uint256 public immutable FIL_PER_BYTE_PER_EPOCH; + IERC20 public immutable TOKEN; + uint256 public immutable TOKENS_PER_BYTE_PER_EPOCH; uint64 private immutable NONCE; struct Info { @@ -49,7 +51,8 @@ contract PoRepDeal is IValidator { uint64 provider, FilecoinPayV1 payments, uint256 railId, - uint256 filPerBytePerEpoch, + IERC20 token, + uint256 tokensPerBytePerEpoch, uint64 dealEndEpoch, uint64 nonce ) { @@ -57,7 +60,8 @@ contract PoRepDeal is IValidator { CLIENT = client; PROVIDER = provider; PAYMENTS = payments; - FIL_PER_BYTE_PER_EPOCH = filPerBytePerEpoch; + TOKEN = token; + TOKENS_PER_BYTE_PER_EPOCH = tokensPerBytePerEpoch; RAIL_ID = railId; NONCE = nonce; info.endEpoch = dealEndEpoch; @@ -107,11 +111,12 @@ contract PoRepDeal is IValidator { sectors[sectorId].dealSize += paddedSize; + // FIXME check if already terminated // TODO only amortize once per SectorContentChanged notification uint256 prevSize = info.totalActiveSize; uint256 newSize = prevSize + paddedSize; - uint256 prevRate = prevSize * FIL_PER_BYTE_PER_EPOCH; - uint256 newRate = newSize * FIL_PER_BYTE_PER_EPOCH; + uint256 prevRate = info.faultedSectorCount > 0 ? 0 : prevSize * TOKENS_PER_BYTE_PER_EPOCH; + uint256 newRate = newSize * TOKENS_PER_BYTE_PER_EPOCH; amortize((block.number - info.settledEpoch) * prevRate, (info.endEpoch - block.number) * newRate); info.settledEpoch = uint64(block.number); info.totalActiveSize = uint96(newSize); @@ -119,8 +124,10 @@ contract PoRepDeal is IValidator { function extend(uint64 epochs) external onlyClient { require(block.number < info.endEpoch); + require(info.faultedSectorCount == 0); + // FIXME prevent if terminated uint64 newEndEpoch = info.endEpoch + epochs; - uint256 rate = info.totalActiveSize * FIL_PER_BYTE_PER_EPOCH; + uint256 rate = info.totalActiveSize * TOKENS_PER_BYTE_PER_EPOCH; amortize((block.number - info.settledEpoch) * rate, (newEndEpoch - block.number) * rate); info.endEpoch = newEndEpoch; info.settledEpoch = uint64(block.number); @@ -130,8 +137,16 @@ contract PoRepDeal is IValidator { IPoRepService(SERVICE).updateLockups(NONCE, RAIL_ID, payment, remaining); } - function amortize() public { - uint256 rate = info.totalActiveSize * FIL_PER_BYTE_PER_EPOCH; + function amortize() external { + if (info.faultedSectorCount > 0) { + info.settledEpoch = uint64(block.number); + return; + } + amortizeHealthy(); + } + + function amortizeHealthy() internal { + uint256 rate = info.totalActiveSize * TOKENS_PER_BYTE_PER_EPOCH; if (block.number <= info.endEpoch) { amortize((block.number - info.settledEpoch) * rate, (info.endEpoch - block.number) * rate); info.settledEpoch = uint64(block.number); @@ -141,48 +156,57 @@ contract PoRepDeal is IValidator { } } - function onBadSector(uint256 sectorId) internal { + function payoutBounty(address recipient, uint256 bounty) internal { + PAYMENTS.withdrawTo(TOKEN, recipient, bounty); + } + + function onBadSector(uint256 sectorId, address recipient, uint256 bounty) internal { sectors[sectorId].failed = 1; if (info.faultedSectorCount == 0) { - amortize(); + amortizeHealthy(); info.faultedSectorCount = 1; + payoutBounty(recipient, bounty); } else { info.faultedSectorCount++; } } - function onSectorRestored(uint256 sectorId) internal { + function onSectorRecovered(uint256 sectorId) internal { sectors[sectorId].failed = 0; if (--info.faultedSectorCount == 0) { - info.settledEpoch = block.number; + info.settledEpoch = uint64(block.number); } } - function sectorExpired(uint64 sectorId) external { + function sectorExpired(uint64 sectorId, address recipient, uint256 bounty) external { require(block.number < info.endEpoch); require(sectors[sectorId].dealSize > 0); require(sectors[sectorId].failed == 0); require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, NO_DEADLINE, NO_PARTITION)); - onBadSector(sectorId); + // FIXME this is unrecoverable so should terminate instead + onBadSector(sectorId, recipient, bounty); } - function sectorFaulty(uint64 sectorId, int64 deadline, int64 partition) external { + function sectorFaulty(uint64 sectorId, int64 deadline, int64 partition, address recipient, uint256 bounty) + external + { require(block.number < info.endEpoch); require(sectors[sectorId].dealSize > 0); require(sectors[sectorId].failed == 0); require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Faulty, deadline, partition)); - onBadSector(sectorId); + onBadSector(sectorId, recipient, bounty); } - function sectorActive(uint64 sectorId, int64 deadline, int64 partition) external { + // SPs should call this after DeclareFaultsRecovered + function sectorRecovered(uint64 sectorId, int64 deadline, int64 partition) external { require(sectors[sectorId].failed == 1); require(sectors[sectorId].dealSize > 0); require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Active, deadline, partition)); - onSectorRestored(sectorId); + onSectorRecovered(sectorId); } /** diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index c93af568..61613c1f 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -20,8 +20,6 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {LibRLP} from "@solady/utils/LibRLP.sol"; import {PoRepDeal} from "./PoRepDeal.sol"; -IERC20 constant NATIVE_TOKEN = IERC20(address(0)); - contract PoRepPayee { using FVMActor for address; using FVMMiner for uint64; @@ -110,15 +108,21 @@ contract PoRepService { } } - function createDeal(address client, uint64 provider, uint256 filPerBytePerEpoch, uint64 dealEndEpoch) - external - returns (address deal) - { + function createDeal( + address client, + uint64 provider, + IERC20 token, + uint256 tokensPerBytePerEpoch, + uint64 dealEndEpoch, + uint256 insuranceBps + ) external returns (address deal) { address receiver = createReceiver(provider); ++nonce; deal = address(this).computeAddress(nonce); - uint256 railId = PAYMENTS.createRail(NATIVE_TOKEN, client, receiver, deal, 0, address(0)); - new PoRepDeal(address(this), client, provider, PAYMENTS, railId, filPerBytePerEpoch, dealEndEpoch, nonce); + uint256 railId = PAYMENTS.createRail(token, client, receiver, deal, insuranceBps, deal); + new PoRepDeal( + address(this), client, provider, PAYMENTS, railId, token, tokensPerBytePerEpoch, dealEndEpoch, nonce + ); } function handle_filecoin_method(uint64 method, uint64, bytes calldata) diff --git a/service_contracts/test/PoRepDealActivation.t.sol b/service_contracts/test/PoRepDealActivation.t.sol index a6bddd12..bab3dba9 100644 --- a/service_contracts/test/PoRepDealActivation.t.sol +++ b/service_contracts/test/PoRepDealActivation.t.sol @@ -3,12 +3,14 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {PoRepDeal} from "../src/PoRepDeal.sol"; -import {NATIVE_TOKEN, PoRepService} from "../src/PoRepService.sol"; +import {PoRepService} from "../src/PoRepService.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +IERC20 constant NATIVE_TOKEN = IERC20(address(0)); + contract PoRepDealActivationTest is MockFVMTest { uint64 constant MINER_ID = 42; // 180 days at 30 seconds per epoch @@ -60,7 +62,7 @@ contract PoRepDealActivationTest is MockFVMTest { function _createDeal() internal returns (PoRepDeal deal, uint64 endEpoch) { endEpoch = uint64(block.number) + MIN_COMMITMENT_EPOCHS; - deal = PoRepDeal(service.createDeal(client, MINER_ID, RATE, endEpoch)); + deal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, 0)); } function _authorize(PoRepDeal deal, bytes memory digest) internal { diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index 2067e6d7..94426355 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -3,13 +3,15 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {PoRepDeal} from "../src/PoRepDeal.sol"; -import {NATIVE_TOKEN, PoRepService} from "../src/PoRepService.sol"; +import {PoRepService} from "../src/PoRepService.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; import {SectorStatus} from "@fvm-solidity/FVMSector.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +IERC20 constant NATIVE_TOKEN = IERC20(address(0)); + contract PoRepDealSectorStatusTest is MockFVMTest { uint64 constant MINER_ID = 42; uint64 constant SECTOR_ID = 1; @@ -50,7 +52,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { payments.deposit{value: required}(NATIVE_TOKEN, client, required); endEpoch = uint64(block.number) + MIN_COMMITMENT_EPOCHS; - poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, RATE, endEpoch)); + poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, 0)); bytes32[] memory cidHashes = new bytes32[](1); cidHashes[0] = keccak256(COMMP_DIGEST_1); @@ -75,27 +77,29 @@ contract PoRepDealSectorStatusTest is MockFVMTest { revert("could not find deal nonce"); } + address constant RECIPIENT = address(0x4141414141414141414141414141414141414141); + function testSectorExpiredAfterActivation() public { miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); - poRepDeal.sectorExpired(SECTOR_ID); + poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT, 0); + miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); + poRepDeal.sectorActive(SECTOR_ID, DEADLINE, PARTITION); } function testSectorFaultyAfterActivation() public { miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); - poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT, 0); + miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); + poRepDeal.sectorActive(SECTOR_ID, DEADLINE, PARTITION); } function testSectorExpiredRevertsIfStillActive() public { vm.expectRevert(); - poRepDeal.sectorExpired(SECTOR_ID); + poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT, 0); } function testSectorFaultyRevertsIfStillActive() public { vm.expectRevert(); - poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION); - } - - function testSectorActive() public { - poRepDeal.sectorActive(SECTOR_ID, DEADLINE, PARTITION); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT, 0); } } From 7c17b8a61fbf7d3a5577fd1edd079938f209692d Mon Sep 17 00:00:00 2001 From: William Morriss Date: Tue, 21 Apr 2026 16:47:16 -0500 Subject: [PATCH 11/43] termination --- service_contracts/src/PoRepDeal.sol | 34 ++++++++++++------- service_contracts/src/PoRepService.sol | 11 ++++-- .../test/PoRepDealSectorStatus.t.sol | 13 ++++--- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index ec248d33..0d7303ad 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -7,6 +7,7 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IPoRepService { function updateLockups(uint64 nonce, uint256 railId, uint256 payment, uint256 remaining) external; + function terminate(uint64 nonce, uint256 railId, uint64 provider, address sender) external; } contract PoRepDeal is IValidator { @@ -111,7 +112,6 @@ contract PoRepDeal is IValidator { sectors[sectorId].dealSize += paddedSize; - // FIXME check if already terminated // TODO only amortize once per SectorContentChanged notification uint256 prevSize = info.totalActiveSize; uint256 newSize = prevSize + paddedSize; @@ -125,7 +125,6 @@ contract PoRepDeal is IValidator { function extend(uint64 epochs) external onlyClient { require(block.number < info.endEpoch); require(info.faultedSectorCount == 0); - // FIXME prevent if terminated uint64 newEndEpoch = info.endEpoch + epochs; uint256 rate = info.totalActiveSize * TOKENS_PER_BYTE_PER_EPOCH; amortize((block.number - info.settledEpoch) * rate, (newEndEpoch - block.number) * rate); @@ -138,22 +137,23 @@ contract PoRepDeal is IValidator { } function amortize() external { - if (info.faultedSectorCount > 0) { - info.settledEpoch = uint64(block.number); + if (info.faultedSectorCount == 0) { + amortizeHealthy(); return; } - amortizeHealthy(); + info.settledEpoch = uint64(block.number); } function amortizeHealthy() internal { uint256 rate = info.totalActiveSize * TOKENS_PER_BYTE_PER_EPOCH; - if (block.number <= info.endEpoch) { + if (block.number < info.endEpoch) { + // live amortize((block.number - info.settledEpoch) * rate, (info.endEpoch - block.number) * rate); - info.settledEpoch = uint64(block.number); } else { + // expired amortize((info.endEpoch - info.settledEpoch) * rate, 0); - info.settledEpoch = info.endEpoch; } + info.settledEpoch = uint64(block.number); } function payoutBounty(address recipient, uint256 bounty) internal { @@ -182,11 +182,12 @@ contract PoRepDeal is IValidator { function sectorExpired(uint64 sectorId, address recipient, uint256 bounty) external { require(block.number < info.endEpoch); require(sectors[sectorId].dealSize > 0); - require(sectors[sectorId].failed == 0); require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, NO_DEADLINE, NO_PARTITION)); - // FIXME this is unrecoverable so should terminate instead - onBadSector(sectorId, recipient, bounty); + // this is unrecoverable, so terminate + info.endEpoch = uint64(block.number); + payoutBounty(recipient, bounty); + amortize(0, 0); } function sectorFaulty(uint64 sectorId, int64 deadline, int64 partition, address recipient, uint256 bounty) @@ -200,7 +201,7 @@ contract PoRepDeal is IValidator { onBadSector(sectorId, recipient, bounty); } - // SPs should call this after DeclareFaultsRecovered + // SPs should call this after DeclareFaultsRecovered and a successful Window PoSt function sectorRecovered(uint64 sectorId, int64 deadline, int64 partition) external { require(sectors[sectorId].failed == 1); require(sectors[sectorId].dealSize > 0); @@ -209,6 +210,15 @@ contract PoRepDeal is IValidator { onSectorRecovered(sectorId); } + // After deal termination, the remainder of the insurance funds can be collected by the receiver in exchange for rail cleanup + // The SP should first call amortize() + function sweep(address recipient) external { + require(block.number > info.endEpoch); + IPoRepService(SERVICE).terminate(NONCE, RAIL_ID, PROVIDER, msg.sender); + (uint256 funds,,,) = PAYMENTS.accounts(TOKEN, address(this)); + PAYMENTS.withdrawTo(TOKEN, recipient, funds); + } + /** * IValidator */ diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index 61613c1f..c9909156 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -18,7 +18,7 @@ import {FVMMiner} from "@fvm-solidity/FVMMiner.sol"; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {LibRLP} from "@solady/utils/LibRLP.sol"; -import {PoRepDeal} from "./PoRepDeal.sol"; +import {IPoRepService, PoRepDeal} from "./PoRepDeal.sol"; contract PoRepPayee { using FVMActor for address; @@ -51,7 +51,7 @@ contract PoRepPayee { } } -contract PoRepService { +contract PoRepService is IPoRepService { using FVMAddress for address; using FVMSectorContentChanged for uint256; using CalldataUtils for CalldataSlice; @@ -168,4 +168,11 @@ contract PoRepService { } PAYMENTS.modifyRailLockup(railId, 0, remaining); } + + function terminate(uint64 nonce, uint256 railId, uint64 provider, address sender) external { + authenticateDeal(nonce); + require(getReceiverAddress(provider) == sender); + PAYMENTS.terminateRail(railId); + PAYMENTS.settleRail(railId, block.number); + } } diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index 94426355..da39cc79 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -82,15 +82,20 @@ contract PoRepDealSectorStatusTest is MockFVMTest { function testSectorExpiredAfterActivation() public { miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT, 0); - miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); - poRepDeal.sectorActive(SECTOR_ID, DEADLINE, PARTITION); } - function testSectorFaultyAfterActivation() public { + function testSectorRecoverFaultyAfterActivation() public { miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT, 0); miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); - poRepDeal.sectorActive(SECTOR_ID, DEADLINE, PARTITION); + poRepDeal.sectorRecovered(SECTOR_ID, DEADLINE, PARTITION); + } + + function testSectorExpiredAfterFaulty() public { + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT, 0); + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); + poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT, 0); } function testSectorExpiredRevertsIfStillActive() public { From 27d930d5c6da783a84d1bcc02657cddb92d51916 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Tue, 21 Apr 2026 17:29:06 -0500 Subject: [PATCH 12/43] move IValidator back to Service and share termination path --- service_contracts/src/PoRepDeal.sol | 65 ++++++++----------- service_contracts/src/PoRepService.sol | 31 +++++++-- .../test/PoRepDealSectorStatus.t.sol | 12 ++-- 3 files changed, 59 insertions(+), 49 deletions(-) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 0d7303ad..c87334b8 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 OR MIT pragma solidity ^0.8.30; -import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; +import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {FVMSector, SectorStatus, NO_DEADLINE, NO_PARTITION} from "@fvm-solidity/FVMSector.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -10,7 +10,7 @@ interface IPoRepService { function terminate(uint64 nonce, uint256 railId, uint64 provider, address sender) external; } -contract PoRepDeal is IValidator { +contract PoRepDeal { address public immutable SERVICE; address public immutable CLIENT; uint64 public immutable PROVIDER; @@ -136,7 +136,7 @@ contract PoRepDeal is IValidator { IPoRepService(SERVICE).updateLockups(NONCE, RAIL_ID, payment, remaining); } - function amortize() external { + function amortize() public { if (info.faultedSectorCount == 0) { amortizeHealthy(); return; @@ -156,16 +156,22 @@ contract PoRepDeal is IValidator { info.settledEpoch = uint64(block.number); } + function getInsuranceFunds() internal view returns (uint256 funds) { + (funds,,,) = PAYMENTS.accounts(TOKEN, address(this)); + } + function payoutBounty(address recipient, uint256 bounty) internal { - PAYMENTS.withdrawTo(TOKEN, recipient, bounty); + if (bounty > 0) { + PAYMENTS.withdrawTo(TOKEN, recipient, bounty); + } } - function onBadSector(uint256 sectorId, address recipient, uint256 bounty) internal { + function onBadSector(uint256 sectorId, address recipient) internal { sectors[sectorId].failed = 1; if (info.faultedSectorCount == 0) { amortizeHealthy(); info.faultedSectorCount = 1; - payoutBounty(recipient, bounty); + payoutBounty(recipient, getInsuranceFunds() / 2); } else { info.faultedSectorCount++; } @@ -179,26 +185,24 @@ contract PoRepDeal is IValidator { } } - function sectorExpired(uint64 sectorId, address recipient, uint256 bounty) external { + function sectorExpired(uint64 sectorId, address recipient) external { require(block.number < info.endEpoch); require(sectors[sectorId].dealSize > 0); require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, NO_DEADLINE, NO_PARTITION)); // this is unrecoverable, so terminate info.endEpoch = uint64(block.number); - payoutBounty(recipient, bounty); - amortize(0, 0); + amortize(); + terminate(recipient, 0, address(0)); } - function sectorFaulty(uint64 sectorId, int64 deadline, int64 partition, address recipient, uint256 bounty) - external - { + function sectorFaulty(uint64 sectorId, int64 deadline, int64 partition, address recipient) external { require(block.number < info.endEpoch); require(sectors[sectorId].dealSize > 0); require(sectors[sectorId].failed == 0); require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Faulty, deadline, partition)); - onBadSector(sectorId, recipient, bounty); + onBadSector(sectorId, recipient); } // SPs should call this after DeclareFaultsRecovered and a successful Window PoSt @@ -210,32 +214,17 @@ contract PoRepDeal is IValidator { onSectorRecovered(sectorId); } - // After deal termination, the remainder of the insurance funds can be collected by the receiver in exchange for rail cleanup - // The SP should first call amortize() + function terminate(address recipient, uint64 provider, address receiver) internal { + // if termination is caused by a dead sector, the keeper gets the insurance + // otherwise, the insurance is paid to the order of the PROVIDER + IPoRepService(SERVICE).terminate(NONCE, RAIL_ID, provider, receiver); + payoutBounty(recipient, getInsuranceFunds()); + } + + // After healthy deal termination, the remainder of the insurance funds can be collected by the receiver in exchange for rail cleanup function sweep(address recipient) external { require(block.number > info.endEpoch); - IPoRepService(SERVICE).terminate(NONCE, RAIL_ID, PROVIDER, msg.sender); - (uint256 funds,,,) = PAYMENTS.accounts(TOKEN, address(this)); - PAYMENTS.withdrawTo(TOKEN, recipient, funds); - } - - /** - * IValidator - */ - function validatePayment( - uint256, // railId - uint256 proposedAmount, // the epoch up to and including which the rail has already been settled - uint256, // fromEpoch - uint256 toEpoch, - uint256 // rate - ) external pure returns (ValidationResult memory result) { - result.modifiedAmount = proposedAmount; - result.settleUpto = toEpoch; - } - - function railTerminated(uint256, address terminator, uint256 /*endEpoch*/ ) external view { - require(msg.sender == address(PAYMENTS)); - require(terminator == SERVICE); - // TODO cleanup + amortize(); + terminate(recipient, PROVIDER, msg.sender); } } diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index c9909156..d2e2c07b 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -15,7 +15,7 @@ import { } from "@fvm-solidity/FVMSectorContentChanged.sol"; import {FVMActor} from "@fvm-solidity/FVMActor.sol"; import {FVMMiner} from "@fvm-solidity/FVMMiner.sol"; -import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; +import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {LibRLP} from "@solady/utils/LibRLP.sol"; import {IPoRepService, PoRepDeal} from "./PoRepDeal.sol"; @@ -51,7 +51,7 @@ contract PoRepPayee { } } -contract PoRepService is IPoRepService { +contract PoRepService is IPoRepService, IValidator { using FVMAddress for address; using FVMSectorContentChanged for uint256; using CalldataUtils for CalldataSlice; @@ -119,7 +119,7 @@ contract PoRepService is IPoRepService { address receiver = createReceiver(provider); ++nonce; deal = address(this).computeAddress(nonce); - uint256 railId = PAYMENTS.createRail(token, client, receiver, deal, insuranceBps, deal); + uint256 railId = PAYMENTS.createRail(token, client, receiver, address(this), insuranceBps, deal); new PoRepDeal( address(this), client, provider, PAYMENTS, railId, token, tokensPerBytePerEpoch, dealEndEpoch, nonce ); @@ -169,10 +169,31 @@ contract PoRepService is IPoRepService { PAYMENTS.modifyRailLockup(railId, 0, remaining); } - function terminate(uint64 nonce, uint256 railId, uint64 provider, address sender) external { + function terminate(uint64 nonce, uint256 railId, uint64 provider, address receiver) external { authenticateDeal(nonce); - require(getReceiverAddress(provider) == sender); + if (provider > 0) { + require(getReceiverAddress(provider) == receiver); + } PAYMENTS.terminateRail(railId); PAYMENTS.settleRail(railId, block.number); } + + /** + * IValidator + */ + function validatePayment( + uint256, // railId + uint256 proposedAmount, // the epoch up to and including which the rail has already been settled + uint256, // fromEpoch + uint256 toEpoch, + uint256 // rate + ) external pure returns (ValidationResult memory result) { + result.modifiedAmount = proposedAmount; + result.settleUpto = toEpoch; + } + + function railTerminated(uint256, address terminator, uint256 /*endEpoch*/ ) external view { + require(msg.sender == address(PAYMENTS)); + require(terminator == address(this)); + } } diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index da39cc79..17adb4e6 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -81,30 +81,30 @@ contract PoRepDealSectorStatusTest is MockFVMTest { function testSectorExpiredAfterActivation() public { miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); - poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT, 0); + poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); } function testSectorRecoverFaultyAfterActivation() public { miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); - poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT, 0); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); poRepDeal.sectorRecovered(SECTOR_ID, DEADLINE, PARTITION); } function testSectorExpiredAfterFaulty() public { miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); - poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT, 0); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); - poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT, 0); + poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); } function testSectorExpiredRevertsIfStillActive() public { vm.expectRevert(); - poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT, 0); + poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); } function testSectorFaultyRevertsIfStillActive() public { vm.expectRevert(); - poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT, 0); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); } } From 5b1f1af2335f52f53dc26f8a9a2928fa22fb3370 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Tue, 21 Apr 2026 19:35:46 -0500 Subject: [PATCH 13/43] test payments and bounties --- service_contracts/src/PoRepService.sol | 6 +- .../test/PoRepDealSectorStatus.t.sol | 85 ++++++++++++++++--- service_contracts/test/PoRepService.t.sol | 4 +- 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index d2e2c07b..b13f1a19 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -20,12 +20,12 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {LibRLP} from "@solady/utils/LibRLP.sol"; import {IPoRepService, PoRepDeal} from "./PoRepDeal.sol"; +error Unauthorized(address caller); + contract PoRepPayee { using FVMActor for address; using FVMMiner for uint64; - error Unauthorized(address caller); - uint64 public immutable MINER; constructor() { @@ -172,7 +172,7 @@ contract PoRepService is IPoRepService, IValidator { function terminate(uint64 nonce, uint256 railId, uint64 provider, address receiver) external { authenticateDeal(nonce); if (provider > 0) { - require(getReceiverAddress(provider) == receiver); + require(getReceiverAddress(provider) == receiver, Unauthorized(receiver)); } PAYMENTS.terminateRail(railId); PAYMENTS.settleRail(railId, block.number); diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index 17adb4e6..f679ffcd 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {PoRepDeal} from "../src/PoRepDeal.sol"; -import {PoRepService} from "../src/PoRepService.sol"; +import {PoRepPayee, PoRepService, Unauthorized} from "../src/PoRepService.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; @@ -13,13 +13,17 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; IERC20 constant NATIVE_TOKEN = IERC20(address(0)); contract PoRepDealSectorStatusTest is MockFVMTest { - uint64 constant MINER_ID = 42; + uint64 constant MINER_ID = 142; + uint64 constant OWNER_ID = 156; uint64 constant SECTOR_ID = 1; int64 constant DEADLINE = 3; int64 constant PARTITION = 0; - uint64 constant MIN_COMMITMENT_EPOCHS = uint64(180 days / 30); - uint64 constant SIZE_32GB = 32 * 1024 * 1024 * 1024; - uint256 constant RATE = 1; + uint64 constant DAYS_OF_EPOCHS = uint64(1 days / 30); + uint64 constant DURATION = 180 * DAYS_OF_EPOCHS; + uint64 constant FAULT_MAX_AGE = 42 * DAYS_OF_EPOCHS; + uint64 constant SIZE = 32 * 1024 * 1024 * 1024; + uint256 constant RATE = 10000; + uint256 constant INSURANCE_BIPS = 50; bytes constant COMMP_CID_1 = hex"0155912024cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; bytes constant COMMP_DIGEST_1 = hex"cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; @@ -30,6 +34,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { address client; PoRepDeal poRepDeal; uint64 endEpoch; + PoRepPayee payee; function setUp() public override { super.setUp(); @@ -39,20 +44,22 @@ contract PoRepDealSectorStatusTest is MockFVMTest { payments = new FilecoinPayV1(); service = new PoRepService(payments); miner = mockMiner(MINER_ID); + ACTOR_PRECOMPILE.mockResolveAddress(address(this), OWNER_ID); + ACTOR_PRECOMPILE.mockResolveAddress(address(miner), MINER_ID); + miner.mockOwner(OWNER_ID); - uint256 maxRate = uint256(SIZE_32GB) * RATE; - uint256 maxLockup = maxRate * MIN_COMMITMENT_EPOCHS; + uint256 maxRate = uint256(SIZE) * RATE; + uint256 maxLockup = maxRate * DURATION; vm.prank(client); - payments.setOperatorApproval( - IERC20(address(0)), address(service), true, maxRate, maxLockup, MIN_COMMITMENT_EPOCHS - ); + payments.setOperatorApproval(IERC20(address(0)), address(service), true, maxRate, maxLockup, DURATION); - uint256 required = uint256(SIZE_32GB) * RATE * MIN_COMMITMENT_EPOCHS; + uint256 required = uint256(SIZE) * RATE * DURATION; vm.prank(client); payments.deposit{value: required}(NATIVE_TOKEN, client, required); - endEpoch = uint64(block.number) + MIN_COMMITMENT_EPOCHS; - poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, 0)); + endEpoch = uint64(block.number) + DURATION; + poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, INSURANCE_BIPS)); + payee = PoRepPayee(service.getReceiverAddress(MINER_ID)); bytes32[] memory cidHashes = new bytes32[](1); cidHashes[0] = keccak256(COMMP_DIGEST_1); @@ -64,7 +71,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { uint64 nonce = _findDealNonce(address(service), address(poRepDeal)); PieceChange[] memory pieces = new PieceChange[](1); - pieces[0] = PieceChange({data: COMMP_CID_1, size: SIZE_32GB, payload: abi.encodePacked(nonce)}); + pieces[0] = PieceChange({data: COMMP_CID_1, size: SIZE, payload: abi.encodePacked(nonce)}); SectorChanges[] memory sectorChanges = new SectorChanges[](1); sectorChanges[0] = SectorChanges({sector: SECTOR_ID, minimumCommitmentEpoch: int64(endEpoch), added: pieces}); miner.callSectorContentChanged(address(service), SectorContentChangedParams({sectors: sectorChanges})); @@ -78,24 +85,74 @@ contract PoRepDealSectorStatusTest is MockFVMTest { } address constant RECIPIENT = address(0x4141414141414141414141414141414141414141); + address constant SWEEPER = address(0x4242424242424242424242424242424242424242); + // tests the case where nobody flagged the fault but someone did flag the expiry function testSectorExpiredAfterActivation() public { + vm.roll(vm.getBlockNumber() + FAULT_MAX_AGE); + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); + + assertEq(RECIPIENT.balance, FAULT_MAX_AGE * SIZE * INSURANCE_BIPS * 199 / 200); + + (uint256 paid,,,) = payments.accounts(NATIVE_TOKEN, address(payee)); + assertEq(paid, FAULT_MAX_AGE * SIZE * RATE * 199 / 200 * (10000 - INSURANCE_BIPS) / 10000); } + // tests recovery function testSectorRecoverFaultyAfterActivation() public { + vm.roll(vm.getBlockNumber() + 3 * DAYS_OF_EPOCHS); + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); + + uint256 bounty = RECIPIENT.balance; + assertEq(bounty, 3 * DAYS_OF_EPOCHS * SIZE * INSURANCE_BIPS * 199 / 400); + + vm.roll(vm.getBlockNumber() + FAULT_MAX_AGE / 2); + miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); poRepDeal.sectorRecovered(SECTOR_ID, DEADLINE, PARTITION); + + vm.roll(vm.getBlockNumber() + DURATION); + + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, address(this))); + poRepDeal.sweep(SWEEPER); + + ACTOR_PRECOMPILE.mockResolveAddress(SWEEPER, 999); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, SWEEPER)); + vm.prank(SWEEPER); + payee.sudo(payable(address(poRepDeal)), abi.encodeWithSelector(PoRepDeal.sweep.selector, SWEEPER)); + + payee.sudo(payable(address(poRepDeal)), abi.encodeWithSelector(PoRepDeal.sweep.selector, SWEEPER)); + + uint256 paidEpochs = DURATION - FAULT_MAX_AGE / 2; + assertEq(SWEEPER.balance, paidEpochs * SIZE * INSURANCE_BIPS * 199 / 200 - bounty); + + (uint256 paid,,,) = payments.accounts(NATIVE_TOKEN, address(payee)); + assertEq(paid, paidEpochs * SIZE * RATE * 199 / 200 * (10000 - INSURANCE_BIPS) / 10000); } + // tests expiration after fault function testSectorExpiredAfterFaulty() public { + vm.roll(vm.getBlockNumber() + 3 * DAYS_OF_EPOCHS); + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); + + vm.roll(vm.getBlockNumber() + FAULT_MAX_AGE); + + uint256 balanceBefore = RECIPIENT.balance; + assertEq(balanceBefore, 3 * DAYS_OF_EPOCHS * SIZE * INSURANCE_BIPS * 199 / 400); + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); + + assertEq(RECIPIENT.balance, balanceBefore * 2); + + (uint256 paid,,,) = payments.accounts(NATIVE_TOKEN, address(payee)); + assertEq(paid, 3 * DAYS_OF_EPOCHS * SIZE * RATE * 199 / 200 * (10000 - INSURANCE_BIPS) / 10000); } function testSectorExpiredRevertsIfStillActive() public { diff --git a/service_contracts/test/PoRepService.t.sol b/service_contracts/test/PoRepService.t.sol index fb1f4be9..df5e202e 100644 --- a/service_contracts/test/PoRepService.t.sol +++ b/service_contracts/test/PoRepService.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; -import {PoRepPayee, PoRepService} from "../src/PoRepService.sol"; +import {PoRepPayee, PoRepService, Unauthorized} from "../src/PoRepService.sol"; import {FVMActor} from "@fvm-solidity/FVMActor.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; @@ -40,7 +40,7 @@ contract PoRepPayeeTest is MockFVMTest { vm.deal(notOwner, 1); ACTOR_PRECOMPILE.mockResolveAddress(notOwner, OWNER_ID + 1); - vm.expectRevert(abi.encodeWithSelector(PoRepPayee.Unauthorized.selector, notOwner)); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, notOwner)); vm.prank(notOwner); payee.sudo{value: 1}(notOwner, bytes("")); } From dde7e37e49a9c8e061c3b99af6bb06829a4cc565 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Tue, 21 Apr 2026 19:40:41 -0500 Subject: [PATCH 14/43] test(PoRepDealSectorStatus): assert rail finalized after termination Assisted-by: Claude:claude-sonnet-4-6 --- service_contracts/test/PoRepDealSectorStatus.t.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index f679ffcd..6ede590f 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; +import {Errors} from "@fws-payments/Errors.sol"; import {PoRepDeal} from "../src/PoRepDeal.sol"; import {PoRepPayee, PoRepService, Unauthorized} from "../src/PoRepService.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; @@ -84,6 +85,12 @@ contract PoRepDealSectorStatusTest is MockFVMTest { revert("could not find deal nonce"); } + function assertRailFinalized() internal { + uint256 railId = poRepDeal.RAIL_ID(); + vm.expectRevert(abi.encodeWithSelector(Errors.RailInactiveOrSettled.selector, railId)); + payments.getRail(railId); + } + address constant RECIPIENT = address(0x4141414141414141414141414141414141414141); address constant SWEEPER = address(0x4242424242424242424242424242424242424242); @@ -98,6 +105,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { (uint256 paid,,,) = payments.accounts(NATIVE_TOKEN, address(payee)); assertEq(paid, FAULT_MAX_AGE * SIZE * RATE * 199 / 200 * (10000 - INSURANCE_BIPS) / 10000); + assertRailFinalized(); } // tests recovery @@ -132,6 +140,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { (uint256 paid,,,) = payments.accounts(NATIVE_TOKEN, address(payee)); assertEq(paid, paidEpochs * SIZE * RATE * 199 / 200 * (10000 - INSURANCE_BIPS) / 10000); + assertRailFinalized(); } // tests expiration after fault @@ -153,6 +162,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { (uint256 paid,,,) = payments.accounts(NATIVE_TOKEN, address(payee)); assertEq(paid, 3 * DAYS_OF_EPOCHS * SIZE * RATE * 199 / 200 * (10000 - INSURANCE_BIPS) / 10000); + assertRailFinalized(); } function testSectorExpiredRevertsIfStillActive() public { From 1831e48e9953781dc21f648dcfe75c3cca45bc54 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Tue, 21 Apr 2026 19:59:26 -0500 Subject: [PATCH 15/43] test(PoRepDealExtend): add test coverage for extend Assisted-by: Claude:claude-sonnet-4-6 --- service_contracts/test/PoRepDealExtend.t.sol | 117 +++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 service_contracts/test/PoRepDealExtend.t.sol diff --git a/service_contracts/test/PoRepDealExtend.t.sol b/service_contracts/test/PoRepDealExtend.t.sol new file mode 100644 index 00000000..e8bdf358 --- /dev/null +++ b/service_contracts/test/PoRepDealExtend.t.sol @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT +pragma solidity ^0.8.30; + +import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; +import {PoRepDeal} from "../src/PoRepDeal.sol"; +import {PoRepService} from "../src/PoRepService.sol"; +import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; +import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; +import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; +import {SectorStatus} from "@fvm-solidity/FVMSector.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +IERC20 constant NATIVE_TOKEN = IERC20(address(0)); + +contract PoRepDealExtendTest is MockFVMTest { + uint64 constant MINER_ID = 42; + uint64 constant SECTOR_ID = 1; + int64 constant DEADLINE = 3; + int64 constant PARTITION = 0; + uint64 constant DAYS_OF_EPOCHS = uint64(1 days / 30); + uint64 constant DURATION = 180 * DAYS_OF_EPOCHS; + uint64 constant EXTENSION = 42 * DAYS_OF_EPOCHS; + uint64 constant SIZE = 32 * 1024 * 1024 * 1024; + uint256 constant RATE = 1; + + bytes constant COMMP_CID_1 = hex"0155912024cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + bytes constant COMMP_DIGEST_1 = hex"cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + + FilecoinPayV1 payments; + PoRepService service; + FVMMinerActor miner; + address client; + PoRepDeal poRepDeal; + uint64 endEpoch; + + function setUp() public override { + super.setUp(); + client = makeAddr("client"); + vm.deal(client, 1000 ether); + + payments = new FilecoinPayV1(); + service = new PoRepService(payments); + miner = mockMiner(MINER_ID); + + uint256 maxRate = uint256(SIZE) * RATE; + // maxLockup must cover the initial DURATION lockup plus the EXTENSION re-lock + uint256 maxLockup = maxRate * (DURATION + EXTENSION); + vm.prank(client); + payments.setOperatorApproval(NATIVE_TOKEN, address(service), true, maxRate, maxLockup, DURATION + EXTENSION); + + // deposit covers initial lockup (DURATION) plus funds needed to re-lock after settling EXTENSION epochs + uint256 deposit = uint256(SIZE) * RATE * (DURATION + EXTENSION); + vm.prank(client); + payments.deposit{value: deposit}(NATIVE_TOKEN, client, deposit); + + endEpoch = uint64(block.number) + DURATION; + poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, 0)); + + bytes32[] memory cidHashes = new bytes32[](1); + cidHashes[0] = keccak256(COMMP_DIGEST_1); + vm.prank(client); + poRepDeal.addPieces(cidHashes); + + miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); + + uint64 nonce = _findDealNonce(address(service), address(poRepDeal)); + PieceChange[] memory pieces = new PieceChange[](1); + pieces[0] = PieceChange({data: COMMP_CID_1, size: SIZE, payload: abi.encodePacked(nonce)}); + SectorChanges[] memory sectorChanges = new SectorChanges[](1); + sectorChanges[0] = SectorChanges({sector: SECTOR_ID, minimumCommitmentEpoch: int64(endEpoch), added: pieces}); + miner.callSectorContentChanged(address(service), SectorContentChangedParams({sectors: sectorChanges})); + } + + function _findDealNonce(address deployer, address created) internal pure returns (uint64) { + for (uint64 n = 1; n <= 20; n++) { + if (vm.computeCreateAddress(deployer, n) == created) return n; + } + revert("could not find poRepDeal nonce"); + } + + function testExtend() public { + vm.roll(vm.getBlockNumber() + EXTENSION); + + vm.prank(client); + poRepDeal.extend(EXTENSION); + + (, uint64 newEndEpoch,,) = poRepDeal.info(); + assertEq(newEndEpoch, endEpoch + EXTENSION); + + // poRepDeal is still live past the original end epoch + vm.roll(endEpoch + 1); + vm.expectRevert(); + poRepDeal.sweep(address(this)); + } + + function testExtendRevertsAfterExpiry() public { + vm.roll(endEpoch); + vm.expectRevert(); + vm.prank(client); + poRepDeal.extend(EXTENSION); + } + + function testExtendRevertsWhenFaulted() public { + vm.roll(vm.getBlockNumber() + DAYS_OF_EPOCHS); + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, address(this)); + + vm.expectRevert(); + vm.prank(client); + poRepDeal.extend(EXTENSION); + } + + function testExtendRevertsIfNotClient() public { + vm.expectRevert(); + poRepDeal.extend(EXTENSION); + } +} From c1f34fc1bb80470cab835d975fec01c1be1f368e Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 22 Apr 2026 08:59:54 -0500 Subject: [PATCH 16/43] use LibClone for CREATE2 calculation --- service_contracts/src/PoRepService.sol | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index b13f1a19..57dc6cc1 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -18,6 +18,7 @@ import {FVMMiner} from "@fvm-solidity/FVMMiner.sol"; import {FilecoinPayV1, IValidator} from "@fws-payments/FilecoinPayV1.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {LibRLP} from "@solady/utils/LibRLP.sol"; +import {LibClone} from "@solady/utils/LibClone.sol"; import {IPoRepService, PoRepDeal} from "./PoRepDeal.sol"; error Unauthorized(address caller); @@ -55,6 +56,7 @@ contract PoRepService is IPoRepService, IValidator { using FVMAddress for address; using FVMSectorContentChanged for uint256; using CalldataUtils for CalldataSlice; + using LibClone for bytes32; using LibRLP for address; error ForbiddenMethod(uint64 method); @@ -80,17 +82,7 @@ contract PoRepService is IPoRepService, IValidator { bytes32 constant RECEIVER_INITCODE_HASH = keccak256(type(PoRepPayee).creationCode); function getReceiverAddress(uint64 provider) public view returns (address receiver) { - receiver = address( - uint160( - uint256( - keccak256( - abi.encodePacked( - uint8(0xff), address(this), bytes32(uint256(uint64(provider))), RECEIVER_INITCODE_HASH - ) - ) - ) - ) - ); + receiver = RECEIVER_INITCODE_HASH.predictDeterministicAddress(bytes32(uint256(uint64(provider))), address(this)); } uint64 private nonce; From 0fe7918f183780dbf33b96450a285267bda93b08 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 22 Apr 2026 09:09:58 -0500 Subject: [PATCH 17/43] rm extra cast --- service_contracts/src/PoRepService.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index 57dc6cc1..2f7f3f19 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -82,7 +82,7 @@ contract PoRepService is IPoRepService, IValidator { bytes32 constant RECEIVER_INITCODE_HASH = keccak256(type(PoRepPayee).creationCode); function getReceiverAddress(uint64 provider) public view returns (address receiver) { - receiver = RECEIVER_INITCODE_HASH.predictDeterministicAddress(bytes32(uint256(uint64(provider))), address(this)); + receiver = RECEIVER_INITCODE_HASH.predictDeterministicAddress(bytes32(uint256(provider)), address(this)); } uint64 private nonce; From d4ba9efaf912a8dd923992c4d6e16ee6c9ec5de2 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 22 Apr 2026 12:26:10 -0500 Subject: [PATCH 18/43] test(PoRepService): add test coverage for NotMiner error Assisted-by: Claude:claude-sonnet-4-6 --- service_contracts/test/PoRepService.t.sol | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/service_contracts/test/PoRepService.t.sol b/service_contracts/test/PoRepService.t.sol index df5e202e..8b631fb6 100644 --- a/service_contracts/test/PoRepService.t.sol +++ b/service_contracts/test/PoRepService.t.sol @@ -6,6 +6,7 @@ import {PoRepPayee, PoRepService, Unauthorized} from "../src/PoRepService.sol"; import {FVMActor} from "@fvm-solidity/FVMActor.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract PoRepPayeeTest is MockFVMTest { using FVMActor for address; @@ -76,4 +77,10 @@ contract PoRepServiceTest is MockFVMTest { assertEq(PoRepPayee(created).MINER(), minerId); } + + function testCreateDealNotMiner() public { + uint64 notMinerId = 999; + vm.expectRevert(abi.encodeWithSelector(PoRepService.NotMiner.selector, notMinerId)); + service.createDeal(address(this), notMinerId, IERC20(address(0)), 1, uint64(block.number + 1000), 0); + } } From 10d70784d26614a7f83c5eb54d002c61d5382269 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 22 Apr 2026 12:27:26 -0500 Subject: [PATCH 19/43] NotMiner error --- service_contracts/lib/fvm-solidity | 2 +- service_contracts/src/PoRepService.sol | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index df68a11e..7780ba25 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit df68a11e47869d354582e69c33e921a53d32d65f +Subproject commit 7780ba2572cbcbe1576103ee512c823c33a4fb1a diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index 2f7f3f19..a233172f 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -54,12 +54,14 @@ contract PoRepPayee { contract PoRepService is IPoRepService, IValidator { using FVMAddress for address; + using FVMMiner for uint64; using FVMSectorContentChanged for uint256; using CalldataUtils for CalldataSlice; using LibClone for bytes32; using LibRLP for address; error ForbiddenMethod(uint64 method); + error NotMiner(uint64 provider); FilecoinPayV1 private immutable PAYMENTS; @@ -108,6 +110,8 @@ contract PoRepService is IPoRepService, IValidator { uint64 dealEndEpoch, uint256 insuranceBps ) external returns (address deal) { + require(provider.isMiner(), NotMiner(provider)); + address receiver = createReceiver(provider); ++nonce; deal = address(this).computeAddress(nonce); From b2c26d9cfcfcbd741265f6d76aebec91a15cd2c4 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 22 Apr 2026 13:52:22 -0500 Subject: [PATCH 20/43] document that the minerActor is validated in the deal --- service_contracts/src/PoRepService.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index a233172f..a2eb3ab7 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -126,6 +126,7 @@ contract PoRepService is IPoRepService, IValidator { returns (uint32 exitCode, uint64 returnDataCodec, bytes memory returnData) { require(method == SECTOR_CONTENT_CHANGED, ForbiddenMethod(method)); + // The minerActor must match up with the deal uint64 minerActor = msg.sender.safeActorId(); uint256 numSectors; From c897e58c4f1a39ecca9bd81f89604d7000362d01 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 22 Apr 2026 17:43:38 -0500 Subject: [PATCH 21/43] CommP CIDv1 digest is 32 bytes --- service_contracts/lib/fvm-solidity | 2 +- service_contracts/src/PoRepDeal.sol | 16 ++++++++-------- service_contracts/src/PoRepService.sol | 3 +-- service_contracts/test/PoRepDealActivation.t.sol | 8 ++++---- service_contracts/test/PoRepDealExtend.t.sol | 6 +++--- .../test/PoRepDealSectorStatus.t.sol | 6 +++--- 6 files changed, 20 insertions(+), 21 deletions(-) diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index 7780ba25..3ddfb44e 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit 7780ba2572cbcbe1576103ee512c823c33a4fb1a +Subproject commit 3ddfb44ee1a7ef480b6e4b8820b2f61e106d5aa9 diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index c87334b8..11587d13 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -87,17 +87,17 @@ contract PoRepDeal { } // TODO allow provider to addPieces with client authorization - function addPieces(bytes32[] calldata cidHashes) external onlyClient { - for (uint256 i = 0; i < cidHashes.length; i++) { - bytes32 cidHash = cidHashes[i]; - require(pieces[cidHash] == PieceStatus.UNAUTHORIZED); - pieces[cidHash] = PieceStatus.AUTHORIZED; + function addPieces(bytes32[] calldata pieceDigests) external onlyClient { + for (uint256 i = 0; i < pieceDigests.length; i++) { + bytes32 pieceDigest = pieceDigests[i]; + require(pieces[pieceDigest] == PieceStatus.UNAUTHORIZED); + pieces[pieceDigest] = PieceStatus.AUTHORIZED; } } function pieceAdded( uint64 minerId, - bytes32 cidHash, + bytes32 pieceDigest, uint64 sectorId, uint64 minimumCommitmentEpoch, uint64 paddedSize @@ -107,8 +107,8 @@ contract PoRepDeal { // this also enforces block.number < info.endEpoch because minimum commitment is 180 days require(minimumCommitmentEpoch >= info.endEpoch); - require(pieces[cidHash] == PieceStatus.AUTHORIZED); - pieces[cidHash] = PieceStatus.ACTIVE; + require(pieces[pieceDigest] == PieceStatus.AUTHORIZED); + pieces[pieceDigest] = PieceStatus.ACTIVE; sectors[sectorId].dealSize += paddedSize; diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index a2eb3ab7..f53542f4 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -143,11 +143,10 @@ contract PoRepService is IPoRepService, IValidator { FVMSectorContentChanged.initSectorReturn(ret.sectors[i], header.numPieces); for (uint256 j = 0; j < header.numPieces; j++) { iter = iter.readPiece(piece); - bytes32 cidHash = piece.digest.keccak(); uint64 nonce = piece.payload.toUint64(); address deal = address(this).computeAddress(nonce); PoRepDeal(deal).pieceAdded( - minerActor, cidHash, header.sector, uint64(header.minimumCommitmentEpoch), piece.paddedSize + minerActor, piece.digest, header.sector, uint64(header.minimumCommitmentEpoch), piece.paddedSize ); //PAYMENTS.modifyRailPayment(railId, 0, payment); //PAYMENTS.modifyRailLockup(railId, 0, remaining); diff --git a/service_contracts/test/PoRepDealActivation.t.sol b/service_contracts/test/PoRepDealActivation.t.sol index bab3dba9..4c6a0c2a 100644 --- a/service_contracts/test/PoRepDealActivation.t.sol +++ b/service_contracts/test/PoRepDealActivation.t.sol @@ -22,8 +22,8 @@ contract PoRepDealActivationTest is MockFVMTest { uint256 constant RATE = 1; // CommP CIDs from the FVMSectorContentChanged test suite; prefix stripped to get the 36-byte digest - bytes constant COMMP_CID_1 = hex"0155912024cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; - bytes constant COMMP_DIGEST_1 = hex"cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + bytes constant COMMP_CID_1 = hex"0181e203922020cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36"; + bytes32 constant COMMP_DIGEST_1 = 0xcdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36; FilecoinPayV1 payments; PoRepService service; FVMMinerActor miner; @@ -65,9 +65,9 @@ contract PoRepDealActivationTest is MockFVMTest { deal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, 0)); } - function _authorize(PoRepDeal deal, bytes memory digest) internal { + function _authorize(PoRepDeal deal, bytes32 digest) internal { bytes32[] memory cidHashes = new bytes32[](1); - cidHashes[0] = keccak256(digest); + cidHashes[0] = digest; vm.prank(client); deal.addPieces(cidHashes); } diff --git a/service_contracts/test/PoRepDealExtend.t.sol b/service_contracts/test/PoRepDealExtend.t.sol index e8bdf358..19a3b830 100644 --- a/service_contracts/test/PoRepDealExtend.t.sol +++ b/service_contracts/test/PoRepDealExtend.t.sol @@ -23,8 +23,8 @@ contract PoRepDealExtendTest is MockFVMTest { uint64 constant SIZE = 32 * 1024 * 1024 * 1024; uint256 constant RATE = 1; - bytes constant COMMP_CID_1 = hex"0155912024cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; - bytes constant COMMP_DIGEST_1 = hex"cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + bytes constant COMMP_CID_1 = hex"0181e203922020cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b38"; + bytes32 constant COMMP_DIGEST_1 = 0xcdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b38; FilecoinPayV1 payments; PoRepService service; @@ -57,7 +57,7 @@ contract PoRepDealExtendTest is MockFVMTest { poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, 0)); bytes32[] memory cidHashes = new bytes32[](1); - cidHashes[0] = keccak256(COMMP_DIGEST_1); + cidHashes[0] = COMMP_DIGEST_1; vm.prank(client); poRepDeal.addPieces(cidHashes); diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index 6ede590f..15f089eb 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -26,8 +26,8 @@ contract PoRepDealSectorStatusTest is MockFVMTest { uint256 constant RATE = 10000; uint256 constant INSURANCE_BIPS = 50; - bytes constant COMMP_CID_1 = hex"0155912024cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; - bytes constant COMMP_DIGEST_1 = hex"cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b367a49ce18"; + bytes constant COMMP_CID_1 = hex"0181e203922020cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36"; + bytes32 constant COMMP_DIGEST_1 = 0xcdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36; FilecoinPayV1 payments; PoRepService service; @@ -63,7 +63,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { payee = PoRepPayee(service.getReceiverAddress(MINER_ID)); bytes32[] memory cidHashes = new bytes32[](1); - cidHashes[0] = keccak256(COMMP_DIGEST_1); + cidHashes[0] = COMMP_DIGEST_1; vm.prank(client); poRepDeal.addPieces(cidHashes); From f323c06621b8c0628b1983223c74d5c26a7491f6 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Thu, 23 Apr 2026 23:58:13 -0500 Subject: [PATCH 22/43] pull fvm-solidity fixes --- service_contracts/lib/fvm-solidity | 2 +- service_contracts/src/PoRepService.sol | 3 ++- service_contracts/test/PoRepDealActivation.t.sol | 1 - service_contracts/test/PoRepService.t.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index 3ddfb44e..50ae26c4 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit 3ddfb44ee1a7ef480b6e4b8820b2f61e106d5aa9 +Subproject commit 50ae26c4b4782271f9885bc7f38853bf2281c5f5 diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index f53542f4..f3673bf8 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -33,7 +33,8 @@ contract PoRepPayee { MINER = PoRepService(msg.sender).getMiner(); } - function owner() public view returns (uint64) { + // Reading owner sounds like it should be `view`, but the precompile will revert if you staticcall this method + function owner() public returns (uint64) { return MINER.getOwnerActorId(); } diff --git a/service_contracts/test/PoRepDealActivation.t.sol b/service_contracts/test/PoRepDealActivation.t.sol index 4c6a0c2a..dd710f21 100644 --- a/service_contracts/test/PoRepDealActivation.t.sol +++ b/service_contracts/test/PoRepDealActivation.t.sol @@ -21,7 +21,6 @@ contract PoRepDealActivationTest is MockFVMTest { // 1 attoFIL per byte per epoch uint256 constant RATE = 1; - // CommP CIDs from the FVMSectorContentChanged test suite; prefix stripped to get the 36-byte digest bytes constant COMMP_CID_1 = hex"0181e203922020cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36"; bytes32 constant COMMP_DIGEST_1 = 0xcdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36; FilecoinPayV1 payments; diff --git a/service_contracts/test/PoRepService.t.sol b/service_contracts/test/PoRepService.t.sol index 8b631fb6..ea1c3749 100644 --- a/service_contracts/test/PoRepService.t.sol +++ b/service_contracts/test/PoRepService.t.sol @@ -30,7 +30,7 @@ contract PoRepPayeeTest is MockFVMTest { return MINER_ID; } - function testOwner() public view { + function testOwner() public { assertEq(payee.MINER(), MINER_ID); assertEq(payee.owner(), OWNER_ID); assertEq(address(this).getActorId(), OWNER_ID); From 4c32e318429aa801ce614c10bc7f06fb491d91c7 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 24 Apr 2026 13:41:13 -0500 Subject: [PATCH 23/43] fix: update fws-payments submodule URL to filecoin-pay Assisted-by: Claude:claude-sonnet-4-6 --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 1f62a127..33461a4b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,7 +6,7 @@ url = https://github.com/OpenZeppelin/openzeppelin-contracts [submodule "service_contracts/lib/fws-payments"] path = service_contracts/lib/fws-payments - url = https://github.com/FilOzone/fws-payments + url = https://github.com/FilOzone/filecoin-pay [submodule "service_contracts/lib/pdp"] path = service_contracts/lib/pdp url = https://github.com/FilOzone/pdp From b5d75936067a61fae0a47ec9a70a5be849e0de2c Mon Sep 17 00:00:00 2001 From: William Morriss Date: Mon, 27 Apr 2026 14:48:56 -0500 Subject: [PATCH 24/43] feat(porep): define custom errors and add test coverage Assisted-by: Claude:claude-sonnet-4-6 --- service_contracts/lib/fvm-solidity | 2 +- service_contracts/src/PoRepDeal.sol | 56 ++++++++---- service_contracts/src/PoRepService.sol | 2 +- .../test/PoRepDealActivation.t.sol | 90 ++++++++++++++++++- service_contracts/test/PoRepDealExtend.t.sol | 11 ++- .../test/PoRepDealSectorStatus.t.sol | 52 ++++++++++- service_contracts/test/PoRepService.t.sol | 11 +++ 7 files changed, 196 insertions(+), 28 deletions(-) diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index 50ae26c4..1045c9c9 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit 50ae26c4b4782271f9885bc7f38853bf2281c5f5 +Subproject commit 1045c9c9b04297c817e9a404bd0943ca27b7eace diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 11587d13..0b36fbc0 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -46,6 +46,20 @@ contract PoRepDeal { mapping(uint256 sectorId => SectorInfo) public sectors; + error Unauthorized(); + error PieceAlreadyAuthorized(bytes32 pieceDigest); + error WrongProvider(uint64 minerId); + error CommitmentTooShort(uint64 minimumCommitmentEpoch, uint64 endEpoch); + error PieceNotAuthorized(bytes32 pieceDigest); + error DealExpired(); + error DealFaulted(); + error DealNotExpired(); + error SectorNotInDeal(uint64 sectorId); + error SectorAlreadyFailed(uint64 sectorId); + error SectorNotFailed(uint64 sectorId); + error SectorNotFaulty(uint64 sectorId); + error SectorNotActive(uint64 sectorId); + constructor( address service, address client, @@ -69,11 +83,11 @@ contract PoRepDeal { } function _onlyClient() internal view { - require(msg.sender == CLIENT); + require(msg.sender == CLIENT, Unauthorized()); } function _onlyService() internal view { - require(msg.sender == SERVICE); + require(msg.sender == SERVICE, Unauthorized()); } modifier onlyClient() { @@ -90,7 +104,7 @@ contract PoRepDeal { function addPieces(bytes32[] calldata pieceDigests) external onlyClient { for (uint256 i = 0; i < pieceDigests.length; i++) { bytes32 pieceDigest = pieceDigests[i]; - require(pieces[pieceDigest] == PieceStatus.UNAUTHORIZED); + require(pieces[pieceDigest] == PieceStatus.UNAUTHORIZED, PieceAlreadyAuthorized(pieceDigest)); pieces[pieceDigest] = PieceStatus.AUTHORIZED; } } @@ -102,12 +116,12 @@ contract PoRepDeal { uint64 minimumCommitmentEpoch, uint64 paddedSize ) external onlyService { - require(minerId == PROVIDER); + require(minerId == PROVIDER, WrongProvider(minerId)); // this also enforces block.number < info.endEpoch because minimum commitment is 180 days - require(minimumCommitmentEpoch >= info.endEpoch); + require(minimumCommitmentEpoch >= info.endEpoch, CommitmentTooShort(minimumCommitmentEpoch, info.endEpoch)); - require(pieces[pieceDigest] == PieceStatus.AUTHORIZED); + require(pieces[pieceDigest] == PieceStatus.AUTHORIZED, PieceNotAuthorized(pieceDigest)); pieces[pieceDigest] = PieceStatus.ACTIVE; sectors[sectorId].dealSize += paddedSize; @@ -123,8 +137,8 @@ contract PoRepDeal { } function extend(uint64 epochs) external onlyClient { - require(block.number < info.endEpoch); - require(info.faultedSectorCount == 0); + require(block.number < info.endEpoch, DealExpired()); + require(info.faultedSectorCount == 0, DealFaulted()); uint64 newEndEpoch = info.endEpoch + epochs; uint256 rate = info.totalActiveSize * TOKENS_PER_BYTE_PER_EPOCH; amortize((block.number - info.settledEpoch) * rate, (newEndEpoch - block.number) * rate); @@ -186,8 +200,8 @@ contract PoRepDeal { } function sectorExpired(uint64 sectorId, address recipient) external { - require(block.number < info.endEpoch); - require(sectors[sectorId].dealSize > 0); + require(block.number < info.endEpoch, DealExpired()); + require(sectors[sectorId].dealSize > 0, SectorNotInDeal(sectorId)); require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, NO_DEADLINE, NO_PARTITION)); // this is unrecoverable, so terminate @@ -197,19 +211,25 @@ contract PoRepDeal { } function sectorFaulty(uint64 sectorId, int64 deadline, int64 partition, address recipient) external { - require(block.number < info.endEpoch); - require(sectors[sectorId].dealSize > 0); - require(sectors[sectorId].failed == 0); - require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Faulty, deadline, partition)); + require(block.number < info.endEpoch, DealExpired()); + require(sectors[sectorId].dealSize > 0, SectorNotInDeal(sectorId)); + require(sectors[sectorId].failed == 0, SectorAlreadyFailed(sectorId)); + require( + FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Faulty, deadline, partition), + SectorNotFaulty(sectorId) + ); onBadSector(sectorId, recipient); } // SPs should call this after DeclareFaultsRecovered and a successful Window PoSt function sectorRecovered(uint64 sectorId, int64 deadline, int64 partition) external { - require(sectors[sectorId].failed == 1); - require(sectors[sectorId].dealSize > 0); - require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Active, deadline, partition)); + require(sectors[sectorId].failed == 1, SectorNotFailed(sectorId)); + require(sectors[sectorId].dealSize > 0, SectorNotInDeal(sectorId)); + require( + FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Active, deadline, partition), + SectorNotActive(sectorId) + ); onSectorRecovered(sectorId); } @@ -223,7 +243,7 @@ contract PoRepDeal { // After healthy deal termination, the remainder of the insurance funds can be collected by the receiver in exchange for rail cleanup function sweep(address recipient) external { - require(block.number > info.endEpoch); + require(block.number > info.endEpoch, DealNotExpired()); amortize(); terminate(recipient, PROVIDER, msg.sender); } diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index f3673bf8..20867cdf 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -91,7 +91,7 @@ contract PoRepService is IPoRepService, IValidator { uint64 private nonce; function authenticateDeal(uint64 nonce) internal view { - require(msg.sender == address(this).computeAddress(nonce)); + require(msg.sender == address(this).computeAddress(nonce), Unauthorized(msg.sender)); } function createReceiver(uint64 provider) public returns (address receiver) { diff --git a/service_contracts/test/PoRepDealActivation.t.sol b/service_contracts/test/PoRepDealActivation.t.sol index dd710f21..cca8fa0d 100644 --- a/service_contracts/test/PoRepDealActivation.t.sol +++ b/service_contracts/test/PoRepDealActivation.t.sol @@ -3,10 +3,11 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {PoRepDeal} from "../src/PoRepDeal.sol"; -import {PoRepService} from "../src/PoRepService.sol"; +import {PoRepPayee, PoRepService} from "../src/PoRepService.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; +import {SectorStatus} from "@fvm-solidity/FVMSector.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; IERC20 constant NATIVE_TOKEN = IERC20(address(0)); @@ -87,6 +88,64 @@ contract PoRepDealActivationTest is MockFVMTest { payments.deposit{value: amount}(NATIVE_TOKEN, client, amount); } + function _setupActiveDeal() internal returns (PoRepDeal deal, uint64 endEpoch) { + _deposit(uint256(SIZE_32GB) * RATE * MIN_COMMITMENT_EPOCHS); + (deal, endEpoch) = _createDeal(); + _authorize(deal, COMMP_DIGEST_1); + _activate(deal, COMMP_CID_1, SIZE_32GB, 1, int64(endEpoch)); + } + + function _makeSectorFaulty(PoRepDeal deal, uint64 sectorId) internal { + miner.mockSectorStatus(sectorId, SectorStatus.Faulty); + miner.mockSectorLocation(sectorId, 0, 0); + deal.sectorFaulty(sectorId, 0, 0, address(this)); + } + + // ------------------------------------------------------------------------- + // addPieces + // ------------------------------------------------------------------------- + + function testAddPiecesUnauthorized() public { + (PoRepDeal deal,) = _createDeal(); + bytes32[] memory digests = new bytes32[](1); + digests[0] = COMMP_DIGEST_1; + vm.expectRevert(PoRepDeal.Unauthorized.selector); + deal.addPieces(digests); + } + + function testAddPiecesDuplicate() public { + (PoRepDeal deal,) = _createDeal(); + _authorize(deal, COMMP_DIGEST_1); + bytes32[] memory digests = new bytes32[](1); + digests[0] = COMMP_DIGEST_1; + vm.prank(client); + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.PieceAlreadyAuthorized.selector, COMMP_DIGEST_1)); + deal.addPieces(digests); + } + + function testPieceAddedWrongProvider() public { + (PoRepDeal deal, uint64 endEpoch) = _createDeal(); + vm.prank(address(service)); + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.WrongProvider.selector, uint64(MINER_ID + 1))); + deal.pieceAdded(MINER_ID + 1, COMMP_DIGEST_1, 1, endEpoch, SIZE_32GB); + } + + function testPieceAddedCommitmentTooShort() public { + (PoRepDeal deal, uint64 endEpoch) = _createDeal(); + vm.prank(address(service)); + vm.expectRevert( + abi.encodeWithSelector(PoRepDeal.CommitmentTooShort.selector, uint64(endEpoch - 1), uint64(endEpoch)) + ); + deal.pieceAdded(MINER_ID, COMMP_DIGEST_1, 1, endEpoch - 1, SIZE_32GB); + } + + function testPieceAddedUnauthorized() public { + (PoRepDeal deal, uint64 endEpoch) = _createDeal(); + vm.prank(address(service)); + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.PieceNotAuthorized.selector, COMMP_DIGEST_1)); + deal.pieceAdded(MINER_ID, COMMP_DIGEST_1, 1, endEpoch, SIZE_32GB); + } + /// The same piece (same CID hash) cannot be activated twice in the same deal. function testCannotActivatePieceTwice() public { uint256 required = uint256(SIZE_32GB) * RATE * MIN_COMMITMENT_EPOCHS; @@ -108,7 +167,7 @@ contract PoRepDealActivationTest is MockFVMTest { SectorChanges[] memory sectorChanges = new SectorChanges[](1); sectorChanges[0] = SectorChanges({sector: 2, minimumCommitmentEpoch: minEpoch, added: pieces}); - vm.expectRevert(); + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.PieceNotAuthorized.selector, COMMP_DIGEST_1)); miner.callSectorContentChanged(address(service), SectorContentChangedParams({sectors: sectorChanges})); } @@ -128,4 +187,31 @@ contract PoRepDealActivationTest is MockFVMTest { vm.roll(endEpoch + 1); deal.amortize(); } + + /// After amortizing elapsed earnings into the receiver, the miner owner can sudo-withdraw them. + function testSudoWithdrawAfterAmortize() public { + uint64 OWNER_ID = 151; + address owner = makeAddr("owner"); + ACTOR_PRECOMPILE.mockResolveAddress(owner, OWNER_ID); + miner.mockOwner(OWNER_ID); + + (PoRepDeal deal,) = _setupActiveDeal(); + + uint64 elapsed = 1000; + vm.roll(block.number + elapsed); + deal.amortize(); + + address receiver = service.getReceiverAddress(MINER_ID); + (uint256 receiverFunds,,,) = payments.accounts(NATIVE_TOKEN, receiver); + assertGt(receiverFunds, 0); + + bytes memory withdrawCalldata = + abi.encodeCall(payments.withdrawTo, (NATIVE_TOKEN, payable(owner), receiverFunds)); + vm.prank(owner); + PoRepPayee(receiver).sudo(payable(address(payments)), withdrawCalldata); + + (uint256 remainingFunds,,,) = payments.accounts(NATIVE_TOKEN, receiver); + assertEq(remainingFunds, 0); + assertEq(owner.balance, receiverFunds); + } } diff --git a/service_contracts/test/PoRepDealExtend.t.sol b/service_contracts/test/PoRepDealExtend.t.sol index 19a3b830..f15fa98d 100644 --- a/service_contracts/test/PoRepDealExtend.t.sol +++ b/service_contracts/test/PoRepDealExtend.t.sol @@ -95,8 +95,8 @@ contract PoRepDealExtendTest is MockFVMTest { function testExtendRevertsAfterExpiry() public { vm.roll(endEpoch); - vm.expectRevert(); vm.prank(client); + vm.expectRevert(PoRepDeal.DealExpired.selector); poRepDeal.extend(EXTENSION); } @@ -105,13 +105,18 @@ contract PoRepDealExtendTest is MockFVMTest { miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, address(this)); - vm.expectRevert(); vm.prank(client); + vm.expectRevert(PoRepDeal.DealFaulted.selector); poRepDeal.extend(EXTENSION); } function testExtendRevertsIfNotClient() public { - vm.expectRevert(); + vm.expectRevert(PoRepDeal.Unauthorized.selector); poRepDeal.extend(EXTENSION); } + + function testSweepRevertsBeforeExpiry() public { + vm.expectRevert(PoRepDeal.DealNotExpired.selector); + poRepDeal.sweep(address(this)); + } } diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index 15f089eb..6bb28644 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -8,7 +8,8 @@ import {PoRepPayee, PoRepService, Unauthorized} from "../src/PoRepService.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; -import {SectorStatus} from "@fvm-solidity/FVMSector.sol"; +import {FVMSector, SectorStatus} from "@fvm-solidity/FVMSector.sol"; +import {USR_NOT_FOUND} from "@fvm-solidity/FVMErrors.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; IERC20 constant NATIVE_TOKEN = IERC20(address(0)); @@ -166,12 +167,57 @@ contract PoRepDealSectorStatusTest is MockFVMTest { } function testSectorExpiredRevertsIfStillActive() public { - vm.expectRevert(); + vm.expectRevert( + abi.encodeWithSelector(FVMSector.ValidateSectorStatusFailed.selector, int256(int32(USR_NOT_FOUND))) + ); poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); } function testSectorFaultyRevertsIfStillActive() public { - vm.expectRevert(); + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorNotFaulty.selector, uint64(SECTOR_ID))); poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); } + + function testSectorExpiredAfterDealEnd() public { + vm.roll(endEpoch); + vm.expectRevert(PoRepDeal.DealExpired.selector); + poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); + } + + function testSectorExpiredNotInDeal() public { + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorNotInDeal.selector, uint64(99))); + poRepDeal.sectorExpired(99, RECIPIENT); + } + + function testSectorFaultyAfterDealEnd() public { + vm.roll(endEpoch); + vm.expectRevert(PoRepDeal.DealExpired.selector); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); + } + + function testSectorFaultyNotInDeal() public { + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorNotInDeal.selector, uint64(99))); + poRepDeal.sectorFaulty(99, DEADLINE, PARTITION, RECIPIENT); + } + + function testSectorFaultyAlreadyFailed() public { + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); + + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorAlreadyFailed.selector, uint64(SECTOR_ID))); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); + } + + function testSectorRecoveredNotFailed() public { + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorNotFailed.selector, uint64(SECTOR_ID))); + poRepDeal.sectorRecovered(SECTOR_ID, DEADLINE, PARTITION); + } + + function testSectorRecoveredStillFaulty() public { + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); + + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorNotActive.selector, uint64(SECTOR_ID))); + poRepDeal.sectorRecovered(SECTOR_ID, DEADLINE, PARTITION); + } } diff --git a/service_contracts/test/PoRepService.t.sol b/service_contracts/test/PoRepService.t.sol index ea1c3749..7be228da 100644 --- a/service_contracts/test/PoRepService.t.sol +++ b/service_contracts/test/PoRepService.t.sol @@ -83,4 +83,15 @@ contract PoRepServiceTest is MockFVMTest { vm.expectRevert(abi.encodeWithSelector(PoRepService.NotMiner.selector, notMinerId)); service.createDeal(address(this), notMinerId, IERC20(address(0)), 1, uint64(block.number + 1000), 0); } + + function testForbiddenMethod() public { + uint64 wrongMethod = 999; + vm.expectRevert(abi.encodeWithSelector(PoRepService.ForbiddenMethod.selector, wrongMethod)); + service.handle_filecoin_method(wrongMethod, 0, ""); + } + + function testUpdateLockupsNotDeal() public { + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, address(this))); + service.updateLockups(1, 0, 0, 0); + } } From 516c13ae15976829a27b93482965ededdfece590 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Mon, 27 Apr 2026 15:11:54 -0500 Subject: [PATCH 25/43] feat(porep): emit DealCreated event and verify in tests Assisted-by: Claude:claude-sonnet-4-6 --- service_contracts/src/PoRepService.sol | 3 +++ service_contracts/test/PoRepDealActivation.t.sol | 10 ++++++++++ service_contracts/test/PoRepDealExtend.t.sol | 10 ++++++++++ service_contracts/test/PoRepDealSectorStatus.t.sol | 10 ++++++++++ 4 files changed, 33 insertions(+) diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index 20867cdf..957f3e5e 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -64,6 +64,8 @@ contract PoRepService is IPoRepService, IValidator { error ForbiddenMethod(uint64 method); error NotMiner(uint64 provider); + event DealCreated(address indexed client, uint64 indexed provider, address deal); + FilecoinPayV1 private immutable PAYMENTS; constructor(FilecoinPayV1 payments) { @@ -120,6 +122,7 @@ contract PoRepService is IPoRepService, IValidator { new PoRepDeal( address(this), client, provider, PAYMENTS, railId, token, tokensPerBytePerEpoch, dealEndEpoch, nonce ); + emit DealCreated(client, provider, deal); } function handle_filecoin_method(uint64 method, uint64, bytes calldata) diff --git a/service_contracts/test/PoRepDealActivation.t.sol b/service_contracts/test/PoRepDealActivation.t.sol index cca8fa0d..3ba208af 100644 --- a/service_contracts/test/PoRepDealActivation.t.sol +++ b/service_contracts/test/PoRepDealActivation.t.sol @@ -60,8 +60,18 @@ contract PoRepDealActivationTest is MockFVMTest { revert("could not find deal nonce"); } + function _predictDealAddress(uint64 provider) internal view returns (address) { + uint64 nextNonce = uint64(vm.getNonce(address(service))); + if (service.getReceiverAddress(provider).code.length == 0) { + nextNonce++; + } + return vm.computeCreateAddress(address(service), nextNonce); + } + function _createDeal() internal returns (PoRepDeal deal, uint64 endEpoch) { endEpoch = uint64(block.number) + MIN_COMMITMENT_EPOCHS; + vm.expectEmit(address(service)); + emit PoRepService.DealCreated(client, MINER_ID, _predictDealAddress(MINER_ID)); deal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, 0)); } diff --git a/service_contracts/test/PoRepDealExtend.t.sol b/service_contracts/test/PoRepDealExtend.t.sol index f15fa98d..4c9e65d4 100644 --- a/service_contracts/test/PoRepDealExtend.t.sol +++ b/service_contracts/test/PoRepDealExtend.t.sol @@ -54,6 +54,8 @@ contract PoRepDealExtendTest is MockFVMTest { payments.deposit{value: deposit}(NATIVE_TOKEN, client, deposit); endEpoch = uint64(block.number) + DURATION; + vm.expectEmit(address(service)); + emit PoRepService.DealCreated(client, MINER_ID, _predictDealAddress(MINER_ID)); poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, 0)); bytes32[] memory cidHashes = new bytes32[](1); @@ -78,6 +80,14 @@ contract PoRepDealExtendTest is MockFVMTest { revert("could not find poRepDeal nonce"); } + function _predictDealAddress(uint64 provider) internal view returns (address) { + uint64 nextNonce = uint64(vm.getNonce(address(service))); + if (service.getReceiverAddress(provider).code.length == 0) { + nextNonce++; + } + return vm.computeCreateAddress(address(service), nextNonce); + } + function testExtend() public { vm.roll(vm.getBlockNumber() + EXTENSION); diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index 6bb28644..45d5161a 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -60,6 +60,8 @@ contract PoRepDealSectorStatusTest is MockFVMTest { payments.deposit{value: required}(NATIVE_TOKEN, client, required); endEpoch = uint64(block.number) + DURATION; + vm.expectEmit(address(service)); + emit PoRepService.DealCreated(client, MINER_ID, _predictDealAddress(MINER_ID)); poRepDeal = PoRepDeal(service.createDeal(client, MINER_ID, NATIVE_TOKEN, RATE, endEpoch, INSURANCE_BIPS)); payee = PoRepPayee(service.getReceiverAddress(MINER_ID)); @@ -86,6 +88,14 @@ contract PoRepDealSectorStatusTest is MockFVMTest { revert("could not find deal nonce"); } + function _predictDealAddress(uint64 provider) internal view returns (address) { + uint64 nextNonce = uint64(vm.getNonce(address(service))); + if (service.getReceiverAddress(provider).code.length == 0) { + nextNonce++; + } + return vm.computeCreateAddress(address(service), nextNonce); + } + function assertRailFinalized() internal { uint256 railId = poRepDeal.RAIL_ID(); vm.expectRevert(abi.encodeWithSelector(Errors.RailInactiveOrSettled.selector, railId)); From e75d634711b964b9fe9e429b7c2b5ede3ddefa71 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Tue, 28 Apr 2026 10:25:25 -0500 Subject: [PATCH 26/43] test(porep): add authenticateDeal unauthorized coverage for payee, receiver nonce, and stranger Assisted-by: Claude:claude-sonnet-4-6 --- .../test/PoRepDealSectorStatus.t.sol | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index 45d5161a..ff5652d5 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -230,4 +230,64 @@ contract PoRepDealSectorStatusTest is MockFVMTest { vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorNotActive.selector, uint64(SECTOR_ID))); poRepDeal.sectorRecovered(SECTOR_ID, DEADLINE, PARTITION); } + + // ------------------------------------------------------------------------- + // authenticateDeal authorization tests + // ------------------------------------------------------------------------- + + function testUpdateLockupsPayeeReceiverUnauthorized() public { + uint64 dealNonce = _findDealNonce(address(service), address(poRepDeal)); + uint256 railId = poRepDeal.RAIL_ID(); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, address(payee))); + vm.prank(address(payee)); + service.updateLockups(dealNonce, railId, 0, 0); + } + + function testTerminatePayeeReceiverUnauthorized() public { + uint64 dealNonce = _findDealNonce(address(service), address(poRepDeal)); + uint256 railId = poRepDeal.RAIL_ID(); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, address(payee))); + vm.prank(address(payee)); + service.terminate(dealNonce, railId, uint64(0), address(0)); + } + + // The receiver is deployed via CREATE2, so its nonce slot (dealNonce-1) does NOT map to + // address(payee) under CREATE address derivation. These tests catch a regression where + // the receiver is changed from CREATE2 to CREATE, which would let the owner authenticate + // as a deal and manipulate rails. + function testUpdateLockupsReceiverNonceUnauthorized() public { + uint64 dealNonce = _findDealNonce(address(service), address(poRepDeal)); + uint256 railId = poRepDeal.RAIL_ID(); + uint64 receiverNonce = dealNonce - 1; + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, address(payee))); + vm.prank(address(payee)); + service.updateLockups(receiverNonce, railId, 0, 0); + } + + function testTerminateReceiverNonceUnauthorized() public { + uint64 dealNonce = _findDealNonce(address(service), address(poRepDeal)); + uint256 railId = poRepDeal.RAIL_ID(); + uint64 receiverNonce = dealNonce - 1; + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, address(payee))); + vm.prank(address(payee)); + service.terminate(receiverNonce, railId, uint64(0), address(0)); + } + + function testUpdateLockupsStrangerUnauthorized() public { + uint64 dealNonce = _findDealNonce(address(service), address(poRepDeal)); + uint256 railId = poRepDeal.RAIL_ID(); + address stranger = makeAddr("stranger"); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, stranger)); + vm.prank(stranger); + service.updateLockups(dealNonce, railId, 0, 0); + } + + function testTerminateStrangerUnauthorized() public { + uint64 dealNonce = _findDealNonce(address(service), address(poRepDeal)); + uint256 railId = poRepDeal.RAIL_ID(); + address stranger = makeAddr("stranger"); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, stranger)); + vm.prank(stranger); + service.terminate(dealNonce, railId, uint64(0), address(0)); + } } From 40a3eadaf1e575af7ea5c684ed47b3375f95a194 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 29 Apr 2026 13:52:11 -0500 Subject: [PATCH 27/43] rm duplicated import --- service_contracts/src/PoRepService.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index 957f3e5e..58a5994d 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -6,7 +6,6 @@ import {FVMAddress} from "@fvm-solidity/FVMAddress.sol"; import {CBOR_CODEC} from "@fvm-solidity/FVMCodec.sol"; import {SECTOR_CONTENT_CHANGED} from "@fvm-solidity/FVMMethod.sol"; import { - CalldataSlice, FVMSectorContentChanged, PieceChangeIter, SectorChangesHeader, From b2d00aa1753466d75df9f10077f629874b29da39 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 29 Apr 2026 15:24:41 -0500 Subject: [PATCH 28/43] fix(PoRepDeal): pass sector location to sectorExpired for Dead validation Assisted-by: Claude:claude-sonnet-4-6 --- service_contracts/lib/fvm-solidity | 2 +- service_contracts/src/PoRepDeal.sol | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index 1045c9c9..0db5d44d 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit 1045c9c9b04297c817e9a404bd0943ca27b7eace +Subproject commit 0db5d44d8a467226600a34f6234f478b33beb43b diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 0b36fbc0..c892688f 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; -import {FVMSector, SectorStatus, NO_DEADLINE, NO_PARTITION} from "@fvm-solidity/FVMSector.sol"; +import {FVMSector, SectorStatus} from "@fvm-solidity/FVMSector.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IPoRepService { @@ -199,10 +199,11 @@ contract PoRepDeal { } } - function sectorExpired(uint64 sectorId, address recipient) external { + // Pass NO_DEADLINE and NO_PARTITION once the sector has been compacted via CompactPartitions. + function sectorExpired(uint64 sectorId, int64 deadline, int64 partition, address recipient) external { require(block.number < info.endEpoch, DealExpired()); require(sectors[sectorId].dealSize > 0, SectorNotInDeal(sectorId)); - require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, NO_DEADLINE, NO_PARTITION)); + require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, deadline, partition)); // this is unrecoverable, so terminate info.endEpoch = uint64(block.number); From a1dca342f7bd204f1a92ba8c65fecac6e61c8e75 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 29 Apr 2026 16:32:11 -0500 Subject: [PATCH 29/43] test: SectorNotDead --- service_contracts/src/PoRepDeal.sol | 6 +++++- .../test/PoRepDealSectorStatus.t.sol | 19 ++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index c892688f..924d8272 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -59,6 +59,7 @@ contract PoRepDeal { error SectorNotFailed(uint64 sectorId); error SectorNotFaulty(uint64 sectorId); error SectorNotActive(uint64 sectorId); + error SectorNotDead(uint64 sectorId); constructor( address service, @@ -203,7 +204,10 @@ contract PoRepDeal { function sectorExpired(uint64 sectorId, int64 deadline, int64 partition, address recipient) external { require(block.number < info.endEpoch, DealExpired()); require(sectors[sectorId].dealSize > 0, SectorNotInDeal(sectorId)); - require(FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, deadline, partition)); + require( + FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Dead, deadline, partition), + SectorNotDead(sectorId) + ); // this is unrecoverable, so terminate info.endEpoch = uint64(block.number); diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index ff5652d5..d565c62a 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -8,7 +8,7 @@ import {PoRepPayee, PoRepService, Unauthorized} from "../src/PoRepService.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; -import {FVMSector, SectorStatus} from "@fvm-solidity/FVMSector.sol"; +import {FVMSector, NO_DEADLINE, NO_PARTITION, SectorStatus} from "@fvm-solidity/FVMSector.sol"; import {USR_NOT_FOUND} from "@fvm-solidity/FVMErrors.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -110,7 +110,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { vm.roll(vm.getBlockNumber() + FAULT_MAX_AGE); miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); - poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); + poRepDeal.sectorExpired(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); assertEq(RECIPIENT.balance, FAULT_MAX_AGE * SIZE * INSURANCE_BIPS * 199 / 200); @@ -167,7 +167,7 @@ contract PoRepDealSectorStatusTest is MockFVMTest { assertEq(balanceBefore, 3 * DAYS_OF_EPOCHS * SIZE * INSURANCE_BIPS * 199 / 400); miner.mockSectorStatus(SECTOR_ID, SectorStatus.Dead); - poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); + poRepDeal.sectorExpired(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); assertEq(RECIPIENT.balance, balanceBefore * 2); @@ -176,11 +176,16 @@ contract PoRepDealSectorStatusTest is MockFVMTest { assertRailFinalized(); } - function testSectorExpiredRevertsIfStillActive() public { + function testSectorExpiredRevertsNotYetCompacted() public { vm.expectRevert( abi.encodeWithSelector(FVMSector.ValidateSectorStatusFailed.selector, int256(int32(USR_NOT_FOUND))) ); - poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); + poRepDeal.sectorExpired(SECTOR_ID, NO_DEADLINE, NO_PARTITION, RECIPIENT); + } + + function testSectorExpiredRevertsIfStillActive() public { + vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorNotDead.selector, SECTOR_ID)); + poRepDeal.sectorExpired(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); } function testSectorFaultyRevertsIfStillActive() public { @@ -191,12 +196,12 @@ contract PoRepDealSectorStatusTest is MockFVMTest { function testSectorExpiredAfterDealEnd() public { vm.roll(endEpoch); vm.expectRevert(PoRepDeal.DealExpired.selector); - poRepDeal.sectorExpired(SECTOR_ID, RECIPIENT); + poRepDeal.sectorExpired(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); } function testSectorExpiredNotInDeal() public { vm.expectRevert(abi.encodeWithSelector(PoRepDeal.SectorNotInDeal.selector, uint64(99))); - poRepDeal.sectorExpired(99, RECIPIENT); + poRepDeal.sectorExpired(99, DEADLINE, PARTITION, RECIPIENT); } function testSectorFaultyAfterDealEnd() public { From 101ca0a70bafbb90674d2d096a7152d2f62dfc3f Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 29 Apr 2026 17:26:30 -0500 Subject: [PATCH 30/43] .gas-snapshot --- .github/workflows/gas.yml | 37 ++ service_contracts/.gas-snapshot | 642 ++++++++++++++++++++++++++++++++ service_contracts/Makefile | 1 + 3 files changed, 680 insertions(+) create mode 100644 .github/workflows/gas.yml create mode 100644 service_contracts/.gas-snapshot diff --git a/.github/workflows/gas.yml b/.github/workflows/gas.yml new file mode 100644 index 00000000..48deffa9 --- /dev/null +++ b/.github/workflows/gas.yml @@ -0,0 +1,37 @@ +name: Gas Snapshot + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + gas-snapshot: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: v1.3.5 + + - name: Delete gas snapshot + run: rm -f service_contracts/.gas-snapshot + + - name: Regenerate gas snapshot + run: | + export PATH="/home/runner/.config/.foundry/bin:$PATH" + make -C service_contracts test + + - name: Check for uncommitted changes + run: | + git add service_contracts/.gas-snapshot + git diff --cached --exit-code service_contracts/.gas-snapshot || { + echo "Gas snapshot is out of date. Run 'make test' locally and commit the updated .gas-snapshot file." + exit 1 + } diff --git a/service_contracts/.gas-snapshot b/service_contracts/.gas-snapshot new file mode 100644 index 00000000..db0573e4 --- /dev/null +++ b/service_contracts/.gas-snapshot @@ -0,0 +1,642 @@ +BigEndianTest:test_decode() (gas: 10223) +BigEndianTest:test_encode() (gas: 392495) +BloomSetTest:testDifferent() (gas: 29550) +BloomSetTest:testIdentical() (gas: 23854) +ClientDataSetPaginationTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407854) +ClientDataSetPaginationTest:testAddPiecesNonceReplayProtection() (gas: 1339978) +ClientDataSetPaginationTest:testAddPiecesNonceUniquePerPayer() (gas: 2073508) +ClientDataSetPaginationTest:testAddPieces_RateUpdatedImmediately() (gas: 1353526) +ClientDataSetPaginationTest:testClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5755572) +ClientDataSetPaginationTest:testClientDataSetsPaginated_Empty() (gas: 24160) +ClientDataSetPaginationTest:testClientDataSetsPaginated_FullPage() (gas: 4190962) +ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitExceedsRemaining() (gas: 2644525) +ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 4195619) +ClientDataSetPaginationTest:testClientDataSetsPaginated_OffsetBeyondLength() (gas: 2640609) +ClientDataSetPaginationTest:testClientDataSetsPaginated_SecondPage() (gas: 4188629) +ClientDataSetPaginationTest:testCreateDataSetAddPieces() (gas: 2486616) +ClientDataSetPaginationTest:testCreateDataSetCreatesRail() (gas: 2188134) +ClientDataSetPaginationTest:testCreateDataSetNoCDN() (gas: 2152656) +ClientDataSetPaginationTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2112290) +ClientDataSetPaginationTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2122351) +ClientDataSetPaginationTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1275124) +ClientDataSetPaginationTest:testDataSetMetaDataWithAllBoundaries() (gas: 7004487) +ClientDataSetPaginationTest:testDataSetMetadataEmpty() (gas: 1052147) +ClientDataSetPaginationTest:testDataSetMetadataKeyCountBoundaries() (gas: 4336248) +ClientDataSetPaginationTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2156381) +ClientDataSetPaginationTest:testDataSetMetadataStorage() (gas: 1143759) +ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909217) +ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300267) +ClientDataSetPaginationTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356757) +ClientDataSetPaginationTest:testEmptyStringMetadata() (gas: 2081527) +ClientDataSetPaginationTest:testFilecoinServiceDeployedEvent() (gas: 5102366) +ClientDataSetPaginationTest:testGetClientDataSetsLength_AfterCreation() (gas: 4185772) +ClientDataSetPaginationTest:testGetClientDataSetsLength_Empty() (gas: 23038) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5092687) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_Empty() (gas: 23118) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ExcludesDeletedDataSets() (gas: 3565620) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_FullPage() (gas: 4231180) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_IncludesTerminatedDataSets() (gas: 2747595) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 3466064) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_OffsetBeyondLength() (gas: 2641150) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_SecondPage() (gas: 4215382) +ClientDataSetPaginationTest:testGetClientDataSets_EmptyClient() (gas: 27405) +ClientDataSetPaginationTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797642) +ClientDataSetPaginationTest:testGetClientDataSets_MultipleDataSets() (gas: 1933755) +ClientDataSetPaginationTest:testGetClientDataSets_SingleDataSet() (gas: 1143313) +ClientDataSetPaginationTest:testGetClientDataSets_TerminatedDataSets() (gas: 2782128) +ClientDataSetPaginationTest:testGetEffectiveRatesValues() (gas: 21620) +ClientDataSetPaginationTest:testGetPieceMetadata() (gas: 2083158) +ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) +ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentKey() (gas: 1866327) +ClientDataSetPaginationTest:testGetPieceMetdataAllKeys() (gas: 2071140) +ClientDataSetPaginationTest:testGetServicePriceValues() (gas: 28477) +ClientDataSetPaginationTest:testGlobalParameters() (gas: 25061) +ClientDataSetPaginationTest:testInitialState() (gas: 55118) +ClientDataSetPaginationTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1318859) +ClientDataSetPaginationTest:testInsufficientFunds_BelowMinimum() (gas: 538094) +ClientDataSetPaginationTest:testInsufficientFunds_ExactMinimum() (gas: 1117986) +ClientDataSetPaginationTest:testInsufficientFunds_JustAboveMinimum() (gas: 1119349) +ClientDataSetPaginationTest:testMetadataQueries() (gas: 4554441) +ClientDataSetPaginationTest:testMinimumPricing_CrossoverPoint() (gas: 21586) +ClientDataSetPaginationTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20980) +ClientDataSetPaginationTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 22705) +ClientDataSetPaginationTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 25208) +ClientDataSetPaginationTest:testNonceCannotBeReusedAcrossOperations() (gas: 1359931) +ClientDataSetPaginationTest:testOperatorApproval_AllSufficient() (gas: 1118647) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 546908) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 545206) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientRateAllowance() (gas: 545027) +ClientDataSetPaginationTest:testOperatorApproval_NotApproved() (gas: 464923) +ClientDataSetPaginationTest:testPieceMetadataAllBoundaries() (gas: 7727676) +ClientDataSetPaginationTest:testPieceMetadataArrayMismatchErrors() (gas: 1219157) +ClientDataSetPaginationTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1747699) +ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1171902) +ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1173508) +ClientDataSetPaginationTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1352470) +ClientDataSetPaginationTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2111816) +ClientDataSetPaginationTest:testPieceMetadataKeyCountBoundaries() (gas: 3809995) +ClientDataSetPaginationTest:testPieceMetadataKeyLengthBoundaries() (gas: 3235038) +ClientDataSetPaginationTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 1889441) +ClientDataSetPaginationTest:testPieceMetadataStorageAndRetrieval() (gas: 2070377) +ClientDataSetPaginationTest:testPieceMetadataValueLengthBoundaries() (gas: 3433662) +ClientDataSetPaginationTest:testProvenPeriods() (gas: 71805184) +ClientDataSetPaginationTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1786600) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1062395) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19731) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062437) +ClientDataSetPaginationTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773474) +ClientDataSetPaginationTest:testRegression_CDNDataSetCleanup() (gas: 4217379) +ClientDataSetPaginationTest:testServiceNameAndDescriptionValidation() (gas: 19832586) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118343) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119641) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121545) +ClientDataSetPaginationTest:testServiceProviderChangedSuccessDecoupled() (gas: 1121009) +ClientDataSetPaginationTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1122795) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 1938279) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 1881220) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 1875219) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1829118) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1049681) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 1874999) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1775809) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1737519) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 24116) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1730020) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1832648) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1833951) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1739379) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 1875807) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1734497) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1727560) +ClientDataSetPaginationTest:testTerminateCDNServiceLifecycle() (gas: 1904119) +ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 1679147) +ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1778833) +ClientDataSetPaginationTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 1895353) +ClientDataSetPaginationTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1052877) +ClientDataSetPaginationTest:testTerminateServiceLifecycle() (gas: 1871830) +ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 1754166) +ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 1840008) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 1843142) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 21875) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1772656) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1044831) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1780544) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 1835697) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 1884990) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 1915069) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_Success() (gas: 1802391) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766136) +ClientDataSetPaginationTest:testTransferCDNController() (gas: 34590) +ClientDataSetPaginationTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19065) +ClientDataSetPaginationTest:testUpgrade() (gas: 11539764) +ExtsloadTest:test_extsload() (gas: 40763) +ExtsloadTest:test_extsloadStruct() (gas: 61981) +FilecoinWarmStorageServiceOwnerTest:testOwnerFieldSetCorrectlyOnDataSetCreation() (gas: 1117542) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForUnregisteredProvider() (gas: 1097796) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForWrongOldOwner() (gas: 1102078) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedSucceedsForAnyRegisteredProvider() (gas: 1100034) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedUpdatesOnlyOwnerField() (gas: 1102148) +FilecoinWarmStorageServiceSignatureTest:testRecoverSignerInvalidLength() (gas: 13126) +FilecoinWarmStorageServiceSignatureTest:testRecoverSignerInvalidValue() (gas: 13067) +FilecoinWarmStorageServiceSignatureTest:testRecoverSignerWithValidSignature() (gas: 21927) +FilecoinWarmStorageServiceSignatureTest:testRecoverSignerWithWrongSigner() (gas: 24579) +FilecoinWarmStorageServiceTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407722) +FilecoinWarmStorageServiceTest:testAddPiecesNonceReplayProtection() (gas: 1339604) +FilecoinWarmStorageServiceTest:testAddPiecesNonceUniquePerPayer() (gas: 2073310) +FilecoinWarmStorageServiceTest:testAddPieces_RateUpdatedImmediately() (gas: 1353152) +FilecoinWarmStorageServiceTest:testCreateDataSetAddPieces() (gas: 2486440) +FilecoinWarmStorageServiceTest:testCreateDataSetCreatesRail() (gas: 2187755) +FilecoinWarmStorageServiceTest:testCreateDataSetNoCDN() (gas: 2152585) +FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2111916) +FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2122197) +FilecoinWarmStorageServiceTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1274992) +FilecoinWarmStorageServiceTest:testDataSetMetaDataWithAllBoundaries() (gas: 7004399) +FilecoinWarmStorageServiceTest:testDataSetMetadataEmpty() (gas: 1051905) +FilecoinWarmStorageServiceTest:testDataSetMetadataKeyCountBoundaries() (gas: 4336248) +FilecoinWarmStorageServiceTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2156293) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorage() (gas: 1143407) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909085) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300091) +FilecoinWarmStorageServiceTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356405) +FilecoinWarmStorageServiceTest:testEmptyStringMetadata() (gas: 2081395) +FilecoinWarmStorageServiceTest:testFilecoinServiceDeployedEvent() (gas: 5102168) +FilecoinWarmStorageServiceTest:testGetClientDataSets_EmptyClient() (gas: 27053) +FilecoinWarmStorageServiceTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797528) +FilecoinWarmStorageServiceTest:testGetClientDataSets_MultipleDataSets() (gas: 1933358) +FilecoinWarmStorageServiceTest:testGetClientDataSets_SingleDataSet() (gas: 1143269) +FilecoinWarmStorageServiceTest:testGetClientDataSets_TerminatedDataSets() (gas: 2781886) +FilecoinWarmStorageServiceTest:testGetEffectiveRatesValues() (gas: 21488) +FilecoinWarmStorageServiceTest:testGetPieceMetadata() (gas: 2082850) +FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) +FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentKey() (gas: 1865953) +FilecoinWarmStorageServiceTest:testGetPieceMetdataAllKeys() (gas: 2070788) +FilecoinWarmStorageServiceTest:testGetServicePriceValues() (gas: 28169) +FilecoinWarmStorageServiceTest:testGlobalParameters() (gas: 24995) +FilecoinWarmStorageServiceTest:testInitialState() (gas: 54876) +FilecoinWarmStorageServiceTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1318815) +FilecoinWarmStorageServiceTest:testInsufficientFunds_BelowMinimum() (gas: 537940) +FilecoinWarmStorageServiceTest:testInsufficientFunds_ExactMinimum() (gas: 1117810) +FilecoinWarmStorageServiceTest:testInsufficientFunds_JustAboveMinimum() (gas: 1118997) +FilecoinWarmStorageServiceTest:testMetadataQueries() (gas: 4554265) +FilecoinWarmStorageServiceTest:testMinimumPricing_CrossoverPoint() (gas: 21454) +FilecoinWarmStorageServiceTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20672) +FilecoinWarmStorageServiceTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 22551) +FilecoinWarmStorageServiceTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 25164) +FilecoinWarmStorageServiceTest:testNonceCannotBeReusedAcrossOperations() (gas: 1359777) +FilecoinWarmStorageServiceTest:testOperatorApproval_AllSufficient() (gas: 1118427) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 546534) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 545030) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientRateAllowance() (gas: 544851) +FilecoinWarmStorageServiceTest:testOperatorApproval_NotApproved() (gas: 464769) +FilecoinWarmStorageServiceTest:testPieceMetadataAllBoundaries() (gas: 7727610) +FilecoinWarmStorageServiceTest:testPieceMetadataArrayMismatchErrors() (gas: 1219025) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1747457) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1171902) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1173354) +FilecoinWarmStorageServiceTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1352294) +FilecoinWarmStorageServiceTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2111542) +FilecoinWarmStorageServiceTest:testPieceMetadataKeyCountBoundaries() (gas: 3809907) +FilecoinWarmStorageServiceTest:testPieceMetadataKeyLengthBoundaries() (gas: 3234796) +FilecoinWarmStorageServiceTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 1889309) +FilecoinWarmStorageServiceTest:testPieceMetadataStorageAndRetrieval() (gas: 2070003) +FilecoinWarmStorageServiceTest:testPieceMetadataValueLengthBoundaries() (gas: 3433288) +FilecoinWarmStorageServiceTest:testProvenPeriods() (gas: 71805043) +FilecoinWarmStorageServiceTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1786248) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1062307) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19665) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062305) +FilecoinWarmStorageServiceTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773320) +FilecoinWarmStorageServiceTest:testRegression_CDNDataSetCleanup() (gas: 4217097) +FilecoinWarmStorageServiceTest:testServiceNameAndDescriptionValidation() (gas: 19832586) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118145) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119509) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121303) +FilecoinWarmStorageServiceTest:testServiceProviderChangedSuccessDecoupled() (gas: 1120921) +FilecoinWarmStorageServiceTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1122619) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 1938191) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 1881132) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 1875087) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1828942) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1049373) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 1874911) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1775655) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1737387) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 23764) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1729822) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1832472) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1833577) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1739027) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 1875675) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1734299) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1727428) +FilecoinWarmStorageServiceTest:testTerminateCDNServiceLifecycle() (gas: 1903943) +FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 1679076) +FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1778833) +FilecoinWarmStorageServiceTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 1895199) +FilecoinWarmStorageServiceTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1052679) +FilecoinWarmStorageServiceTest:testTerminateServiceLifecycle() (gas: 1871724) +FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 1753884) +FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 1839700) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 1843054) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 21567) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1772524) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1044677) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1780522) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 1835653) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 1884704) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 1914981) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1765938) +FilecoinWarmStorageServiceTest:testTransferCDNController() (gas: 34524) +FilecoinWarmStorageServiceTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) +FilecoinWarmStorageServiceTest:testUpgrade() (gas: 11539566) +FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriod() (gas: 1657587) +FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriodWithInvalidParameters() (gas: 45444) +FilecoinWarmStorageServiceUpgradeTest:testMigrate() (gas: 35120) +FilecoinWarmStorageServiceUpgradeTest:testMigrateOnlyOnce() (gas: 28727) +FilecoinWarmStorageServiceUpgradeTest:testMigrateWithViewContract() (gas: 1661613) +FilecoinWarmStorageServiceUpgradeTest:testNextPDPChallengeWindowStartThroughView() (gas: 1644508) +FilecoinWarmStorageServiceUpgradeTest:testSetViewContract() (gas: 1645209) +MetadataSignatureFixturesTest:testContract() (gas: 2593) +MetadataSignatureFixturesTest:testEIP712TypeStructures() (gas: 27096) +MetadataSignatureFixturesTest:testExternalSignatures() (gas: 58165) +MetadataSignatureFixturesTest:testGenerateFixtures() (gas: 161303) +PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1749642) +PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1723591) +PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 1972492) +PoRepDealActivationTest:testExactBalanceSufficient() (gas: 1993841) +PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1724915) +PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1726711) +PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1724376) +PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2163922) +PoRepDealExtendTest:testExtend() (gas: 160793) +PoRepDealExtendTest:testExtendRevertsAfterExpiry() (gas: 14364) +PoRepDealExtendTest:testExtendRevertsIfNotClient() (gas: 8948) +PoRepDealExtendTest:testExtendRevertsWhenFaulted() (gas: 200637) +PoRepDealExtendTest:testSweepRevertsBeforeExpiry() (gas: 10838) +PoRepDealSectorStatusTest:testSectorExpiredAfterActivation() (gas: 307765) +PoRepDealSectorStatusTest:testSectorExpiredAfterDealEnd() (gas: 12126) +PoRepDealSectorStatusTest:testSectorExpiredAfterFaulty() (gas: 342632) +PoRepDealSectorStatusTest:testSectorExpiredNotInDeal() (gas: 13893) +PoRepDealSectorStatusTest:testSectorExpiredRevertsIfStillActive() (gas: 28396) +PoRepDealSectorStatusTest:testSectorExpiredRevertsNotYetCompacted() (gas: 27934) +PoRepDealSectorStatusTest:testSectorFaultyAfterDealEnd() (gas: 12319) +PoRepDealSectorStatusTest:testSectorFaultyAlreadyFailed() (gas: 92651) +PoRepDealSectorStatusTest:testSectorFaultyNotInDeal() (gas: 14096) +PoRepDealSectorStatusTest:testSectorFaultyRevertsIfStillActive() (gas: 28519) +PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 486337) +PoRepDealSectorStatusTest:testSectorRecoveredNotFailed() (gas: 12052) +PoRepDealSectorStatusTest:testSectorRecoveredStillFaulty() (gas: 100309) +PoRepDealSectorStatusTest:testTerminatePayeeReceiverUnauthorized() (gas: 19523) +PoRepDealSectorStatusTest:testTerminateReceiverNonceUnauthorized() (gas: 19309) +PoRepDealSectorStatusTest:testTerminateStrangerUnauthorized() (gas: 18826) +PoRepDealSectorStatusTest:testUpdateLockupsPayeeReceiverUnauthorized() (gas: 18994) +PoRepDealSectorStatusTest:testUpdateLockupsReceiverNonceUnauthorized() (gas: 18890) +PoRepDealSectorStatusTest:testUpdateLockupsStrangerUnauthorized() (gas: 18209) +PoRepPayeeTest:testOwner() (gas: 29635) +PoRepPayeeTest:testSudo() (gas: 70669) +PoRepPayeeTest:testSudoUnauthorized() (gas: 59734) +PoRepServiceTest:testCreateDealNotMiner() (gas: 18766) +PoRepServiceTest:testCreateReceiver() (gas: 285512) +PoRepServiceTest:testForbiddenMethod() (gas: 11458) +PoRepServiceTest:testUpdateLockupsNotDeal() (gas: 9469) +ProductTypesTest:testPDPKeys() (gas: 14050) +ProviderIdSetTest:testAddDuplicates() (gas: 120993) +ProviderIdSetTest:testAddGet() (gas: 86192835) +ProviderIdSetTest:testAddManyDuplicates() (gas: 781593) +ProviderIdSetTest:testAddRemoveLargeIds() (gas: 1648446) +ProviderIdSetTest:testOwnable() (gas: 27132) +ProviderIdSetTest:testProviderIdTooLarge() (gas: 64247) +ProviderIdSetTest:testRemoveFIFO() (gas: 8539655) +ProviderIdSetTest:testRemoveLIFO() (gas: 8434985) +ProviderValidationTest:testAddAndRemoveApprovedProvider() (gas: 83676) +ProviderValidationTest:testAddApprovedProviderAlreadyApproved() (gas: 94744) +ProviderValidationTest:testConsistencyBetweenIsApprovedAndGetAll() (gas: 281862) +ProviderValidationTest:testGetApprovedProviders() (gas: 180772) +ProviderValidationTest:testGetApprovedProvidersLength() (gas: 161037) +ProviderValidationTest:testGetApprovedProvidersPaginated() (gas: 319380) +ProviderValidationTest:testGetApprovedProvidersPaginatedConsistency() (gas: 567595) +ProviderValidationTest:testGetApprovedProvidersPaginatedEdgeCases() (gas: 105171) +ProviderValidationTest:testGetApprovedProvidersPaginatedGasEfficiency() (gas: 4868016) +ProviderValidationTest:testGetApprovedProvidersWithSingleProvider() (gas: 78641) +ProviderValidationTest:testOnlyOwnerCanManageApprovedProviders() (gas: 98546) +ProviderValidationTest:testProviderApprovedCanCreateDataset() (gas: 1895500) +ProviderValidationTest:testProviderNotRegistered() (gas: 45803) +ProviderValidationTest:testProviderRegisteredButNotApproved() (gas: 1753221) +ProviderValidationTest:testRemoveApprovedProviderNotInList() (gas: 77221) +ServiceProviderRegistryFullTest:testCanRemoveLastProduct() (gas: 652413) +ServiceProviderRegistryFullTest:testCanReregisterAfterRemoval() (gas: 1231197) +ServiceProviderRegistryFullTest:testCannotAddProductTwice() (gas: 799103) +ServiceProviderRegistryFullTest:testCannotRegisterTwice() (gas: 770143) +ServiceProviderRegistryFullTest:testCannotRemoveAlreadyRemoved() (gas: 618286) +ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionIfNotOwner() (gas: 762500) +ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionTooLong() (gas: 759871) +ServiceProviderRegistryFullTest:testCannotUpdateRemovedProvider() (gas: 622228) +ServiceProviderRegistryFullTest:testCapabilityUpdateClearsOldValues() (gas: 1123096) +ServiceProviderRegistryFullTest:testDescriptionTooLong() (gas: 57764) +ServiceProviderRegistryFullTest:testDirectMappingAccess() (gas: 968502) +ServiceProviderRegistryFullTest:testEmptyCapabilityKey() (gas: 229552) +ServiceProviderRegistryFullTest:testEmptyCapabilityValue() (gas: 229707) +ServiceProviderRegistryFullTest:testEventTimestampsEmittedCorrectly() (gas: 943613) +ServiceProviderRegistryFullTest:testGetActiveProvidersByProductType() (gas: 1670316) +ServiceProviderRegistryFullTest:testGetAllActiveProviders() (gas: 1584014) +ServiceProviderRegistryFullTest:testGetNonExistentProvider() (gas: 43321) +ServiceProviderRegistryFullTest:testGetProduct() (gas: 855430) +ServiceProviderRegistryFullTest:testGetProductCapabilities() (gas: 1004927) +ServiceProviderRegistryFullTest:testGetProductCapability() (gas: 929980) +ServiceProviderRegistryFullTest:testGetProviderCount() (gas: 1101737) +ServiceProviderRegistryFullTest:testGetProvidersByProductType() (gas: 2091446) +ServiceProviderRegistryFullTest:testInitialState() (gas: 40206) +ServiceProviderRegistryFullTest:testInvalidCapabilityArrayLengthMismatch() (gas: 190885) +ServiceProviderRegistryFullTest:testInvalidCapabilityKeyTooLong() (gas: 222904) +ServiceProviderRegistryFullTest:testInvalidCapabilityValueTooLong() (gas: 223369) +ServiceProviderRegistryFullTest:testMaxCapabilitiesAllowed() (gas: 1719465) +ServiceProviderRegistryFullTest:testMultipleUpdatesInSameBlock() (gas: 1030579) +ServiceProviderRegistryFullTest:testNameTooLongOnRegister() (gas: 74138) +ServiceProviderRegistryFullTest:testNameTooLongOnUpdate() (gas: 794995) +ServiceProviderRegistryFullTest:testOnlyOwnerCanRemove() (gas: 761988) +ServiceProviderRegistryFullTest:testOnlyOwnerCanUpdate() (gas: 767730) +ServiceProviderRegistryFullTest:testProviderHasProduct() (gas: 758883) +ServiceProviderRegistryFullTest:testRegisterMultipleProviders() (gas: 1819919) +ServiceProviderRegistryFullTest:testRegisterProvider() (gas: 1181523) +ServiceProviderRegistryFullTest:testRegisterWithCapabilities() (gas: 1112008) +ServiceProviderRegistryFullTest:testRegisterWithExcessFee() (gas: 69123) +ServiceProviderRegistryFullTest:testRegisterWithInsufficientFee() (gas: 72733) +ServiceProviderRegistryFullTest:testRegisterWithInvalidData() (gas: 409371) +ServiceProviderRegistryFullTest:testRemoveProvider() (gas: 646425) +ServiceProviderRegistryFullTest:testTooManyCapabilities() (gas: 290957) +ServiceProviderRegistryFullTest:testUpdateProduct() (gas: 1039571) +ServiceProviderRegistryFullTest:testUpdateProviderDescription() (gas: 799513) +ServiceProviderRegistryFullTest:testUpdateWithCapabilities() (gas: 1119096) +ServiceProviderRegistryFullTest:testUpdateWithTooManyCapabilities() (gas: 900241) +ServiceProviderRegistryPaginationTest:testActiveProviderCountTracking() (gas: 1620572) +ServiceProviderRegistryPaginationTest:testPaginationConsistencyWithGetAll() (gas: 3423767) +ServiceProviderRegistryPaginationTest:testPaginationEdgeLimits() (gas: 1970846) +ServiceProviderRegistryPaginationTest:testPaginationNoProviders() (gas: 22522) +ServiceProviderRegistryPaginationTest:testPaginationPageBoundaries() (gas: 3196070) +ServiceProviderRegistryPaginationTest:testPaginationSingleProvider() (gas: 771119) +ServiceProviderRegistryPaginationTest:testPaginationWithInactiveProviders() (gas: 2573055) +ServiceProviderRegistryPaginationTest:testSequentialPagination() (gas: 6195116) +ServiceProviderRegistryTest:testAnnouncePlannedUpgrade() (gas: 3754366) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidEpoch() (gas: 3702138) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidImplementation() (gas: 19753) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 3704244) +ServiceProviderRegistryTest:testBeneficiaryIsSetCorrectly() (gas: 769225) +ServiceProviderRegistryTest:testCannotRegisterWithZeroBeneficiary() (gas: 37559) +ServiceProviderRegistryTest:testCannotReinitialize() (gas: 16157) +ServiceProviderRegistryTest:testGetProviderPayeeReturnsCorrectAddress() (gas: 762314) +ServiceProviderRegistryTest:testGetProviderPayeeRevertsForInvalidProviderId() (gas: 23125) +ServiceProviderRegistryTest:testGetProviderWorks() (gas: 766462) +ServiceProviderRegistryTest:testGetProvidersByIdsEmptyArray() (gas: 19076) +ServiceProviderRegistryTest:testGetProvidersByIdsInactiveProvider() (gas: 671836) +ServiceProviderRegistryTest:testGetProvidersByIdsInvalidIds() (gas: 44583) +ServiceProviderRegistryTest:testGetProvidersByIdsMixedValidAndInvalid() (gas: 842971) +ServiceProviderRegistryTest:testGetProvidersByIdsMultipleValidProviders() (gas: 1506539) +ServiceProviderRegistryTest:testGetProvidersByIdsSingleValidProvider() (gas: 827350) +ServiceProviderRegistryTest:testInitialState() (gas: 27401) +ServiceProviderRegistryTest:testIsRegisteredProviderReturnsFalse() (gas: 25300) +ServiceProviderRegistryTest:testOnlyOwnerCanUpgrade() (gas: 3739251) +ServiceProviderRegistryTest:testRegisterProviderWithCapabilities() (gas: 989353) +ServiceProviderRegistryTest:testTransferOwnership() (gas: 25812) +SybilFeeTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407744) +SybilFeeTest:testAddPiecesNonceReplayProtection() (gas: 1339692) +SybilFeeTest:testAddPiecesNonceUniquePerPayer() (gas: 2073376) +SybilFeeTest:testAddPieces_RateUpdatedImmediately() (gas: 1353240) +SybilFeeTest:testCreateDataSetAddPieces() (gas: 2486506) +SybilFeeTest:testCreateDataSetCreatesRail() (gas: 2187871) +SybilFeeTest:testCreateDataSetNoCDN() (gas: 2152585) +SybilFeeTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2112004) +SybilFeeTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2122219) +SybilFeeTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1275014) +SybilFeeTest:testDataSetCreation_BurnRailTerminated() (gas: 1066281) +SybilFeeTest:testDataSetCreation_InsufficientFundsForSybilFee() (gas: 464494) +SybilFeeTest:testDataSetCreation_SybilFeeBurned() (gas: 1056843) +SybilFeeTest:testDataSetCreation_SybilFeeWithCDN() (gas: 1751635) +SybilFeeTest:testDataSetMetaDataWithAllBoundaries() (gas: 7004399) +SybilFeeTest:testDataSetMetadataEmpty() (gas: 1051993) +SybilFeeTest:testDataSetMetadataKeyCountBoundaries() (gas: 4336248) +SybilFeeTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2156293) +SybilFeeTest:testDataSetMetadataStorage() (gas: 1143495) +SybilFeeTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909107) +SybilFeeTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300157) +SybilFeeTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356493) +SybilFeeTest:testEmptyStringMetadata() (gas: 2081417) +SybilFeeTest:testFilecoinServiceDeployedEvent() (gas: 5102234) +SybilFeeTest:testGetClientDataSets_EmptyClient() (gas: 27141) +SybilFeeTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797528) +SybilFeeTest:testGetClientDataSets_MultipleDataSets() (gas: 1933446) +SybilFeeTest:testGetClientDataSets_SingleDataSet() (gas: 1143269) +SybilFeeTest:testGetClientDataSets_TerminatedDataSets() (gas: 2781974) +SybilFeeTest:testGetEffectiveRatesValues() (gas: 21510) +SybilFeeTest:testGetPieceMetadata() (gas: 2082938) +SybilFeeTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) +SybilFeeTest:testGetPieceMetadata_NonExistentKey() (gas: 1866028) +SybilFeeTest:testGetPieceMetdataAllKeys() (gas: 2070876) +SybilFeeTest:testGetServicePriceValues() (gas: 28257) +SybilFeeTest:testGlobalParameters() (gas: 24995) +SybilFeeTest:testInitialState() (gas: 54964) +SybilFeeTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1318815) +SybilFeeTest:testInsufficientFunds_BelowMinimum() (gas: 537984) +SybilFeeTest:testInsufficientFunds_ExactMinimum() (gas: 1117876) +SybilFeeTest:testInsufficientFunds_JustAboveMinimum() (gas: 1119085) +SybilFeeTest:testMetadataQueries() (gas: 4554331) +SybilFeeTest:testMinimumPricing_CrossoverPoint() (gas: 21476) +SybilFeeTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20760) +SybilFeeTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 22595) +SybilFeeTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 25164) +SybilFeeTest:testNonceCannotBeReusedAcrossOperations() (gas: 1359821) +SybilFeeTest:testOperatorApproval_AllSufficient() (gas: 1118515) +SybilFeeTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 546622) +SybilFeeTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 545096) +SybilFeeTest:testOperatorApproval_InsufficientRateAllowance() (gas: 544895) +SybilFeeTest:testOperatorApproval_NotApproved() (gas: 464791) +SybilFeeTest:testPieceMetadataAllBoundaries() (gas: 7727610) +SybilFeeTest:testPieceMetadataArrayMismatchErrors() (gas: 1219047) +SybilFeeTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1747545) +SybilFeeTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1171902) +SybilFeeTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1173398) +SybilFeeTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1352338) +SybilFeeTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2111706) +SybilFeeTest:testPieceMetadataKeyCountBoundaries() (gas: 3809907) +SybilFeeTest:testPieceMetadataKeyLengthBoundaries() (gas: 3234884) +SybilFeeTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 1889331) +SybilFeeTest:testPieceMetadataStorageAndRetrieval() (gas: 2070091) +SybilFeeTest:testPieceMetadataValueLengthBoundaries() (gas: 3433376) +SybilFeeTest:testProvenPeriods() (gas: 71805096) +SybilFeeTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1786336) +SybilFeeTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1062307) +SybilFeeTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19665) +SybilFeeTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062327) +SybilFeeTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773364) +SybilFeeTest:testRegression_CDNDataSetCleanup() (gas: 4217189) +SybilFeeTest:testServiceNameAndDescriptionValidation() (gas: 19832586) +SybilFeeTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118211) +SybilFeeTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119531) +SybilFeeTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121391) +SybilFeeTest:testServiceProviderChangedSuccessDecoupled() (gas: 1120921) +SybilFeeTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1122685) +SybilFeeTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 1938191) +SybilFeeTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 1881132) +SybilFeeTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 1875109) +SybilFeeTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1829008) +SybilFeeTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1049461) +SybilFeeTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 1874911) +SybilFeeTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1775699) +SybilFeeTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1737409) +SybilFeeTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 23852) +SybilFeeTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1729910) +SybilFeeTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1832538) +SybilFeeTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1833665) +SybilFeeTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1739115) +SybilFeeTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 1875697) +SybilFeeTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1734387) +SybilFeeTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1727450) +SybilFeeTest:testTerminateCDNServiceLifecycle() (gas: 1904009) +SybilFeeTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 1679076) +SybilFeeTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1778833) +SybilFeeTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 1895221) +SybilFeeTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1052745) +SybilFeeTest:testTerminateServiceLifecycle() (gas: 1871742) +SybilFeeTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 1753955) +SybilFeeTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 1839788) +SybilFeeTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 1843054) +SybilFeeTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 21655) +SybilFeeTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1772546) +SybilFeeTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1044721) +SybilFeeTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1780522) +SybilFeeTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 1835653) +SybilFeeTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 1884792) +SybilFeeTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 1915003) +SybilFeeTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) +SybilFeeTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766004) +SybilFeeTest:testTransferCDNController() (gas: 34524) +SybilFeeTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) +SybilFeeTest:testUpgrade() (gas: 11539654) +ValidatePaymentTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407788) +ValidatePaymentTest:testAddPiecesNonceReplayProtection() (gas: 1340000) +ValidatePaymentTest:testAddPiecesNonceUniquePerPayer() (gas: 2073464) +ValidatePaymentTest:testAddPieces_RateUpdatedImmediately() (gas: 1353548) +ValidatePaymentTest:testCreateDataSetAddPieces() (gas: 2486572) +ValidatePaymentTest:testCreateDataSetCreatesRail() (gas: 2188085) +ValidatePaymentTest:testCreateDataSetNoCDN() (gas: 2152620) +ValidatePaymentTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2112312) +ValidatePaymentTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2122329) +ValidatePaymentTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1275328) +ValidatePaymentTest:testDataSetDeleted_RevertsIfRailNotSettled() (gas: 1212015) +ValidatePaymentTest:testDataSetDeleted_SucceedsAfterRailSettled() (gas: 1266804) +ValidatePaymentTest:testDataSetMetaDataWithAllBoundaries() (gas: 7004443) +ValidatePaymentTest:testDataSetMetadataEmpty() (gas: 1052169) +ValidatePaymentTest:testDataSetMetadataKeyCountBoundaries() (gas: 4336248) +ValidatePaymentTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2156337) +ValidatePaymentTest:testDataSetMetadataStorage() (gas: 1143759) +ValidatePaymentTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909151) +ValidatePaymentTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300223) +ValidatePaymentTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356735) +ValidatePaymentTest:testEmptyStringMetadata() (gas: 2081461) +ValidatePaymentTest:testFilecoinServiceDeployedEvent() (gas: 5102344) +ValidatePaymentTest:testFullFlow_SPAbandonsService_ClientCanSettleAndCleanup() (gas: 1232565) +ValidatePaymentTest:testGetClientDataSets_EmptyClient() (gas: 27383) +ValidatePaymentTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797607) +ValidatePaymentTest:testGetClientDataSets_MultipleDataSets() (gas: 1933710) +ValidatePaymentTest:testGetClientDataSets_SingleDataSet() (gas: 1143291) +ValidatePaymentTest:testGetClientDataSets_TerminatedDataSets() (gas: 2782150) +ValidatePaymentTest:testGetEffectiveRatesValues() (gas: 21554) +ValidatePaymentTest:testGetPieceMetadata() (gas: 2083158) +ValidatePaymentTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) +ValidatePaymentTest:testGetPieceMetadata_NonExistentKey() (gas: 1866336) +ValidatePaymentTest:testGetPieceMetdataAllKeys() (gas: 2071118) +ValidatePaymentTest:testGetServicePriceValues() (gas: 28477) +ValidatePaymentTest:testGlobalParameters() (gas: 25039) +ValidatePaymentTest:testInitialState() (gas: 55140) +ValidatePaymentTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1318837) +ValidatePaymentTest:testInsufficientFunds_BelowMinimum() (gas: 538072) +ValidatePaymentTest:testInsufficientFunds_ExactMinimum() (gas: 1117942) +ValidatePaymentTest:testInsufficientFunds_JustAboveMinimum() (gas: 1119327) +ValidatePaymentTest:testMetadataQueries() (gas: 4554397) +ValidatePaymentTest:testMinimumPricing_CrossoverPoint() (gas: 21520) +ValidatePaymentTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20980) +ValidatePaymentTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 22683) +ValidatePaymentTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 25186) +ValidatePaymentTest:testMultiplePieceMetadataRemovalAtNextProvingPeriod() (gas: 1619504) +ValidatePaymentTest:testNonceCannotBeReusedAcrossOperations() (gas: 1359909) +ValidatePaymentTest:testOperatorApproval_AllSufficient() (gas: 1118625) +ValidatePaymentTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 546930) +ValidatePaymentTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 545162) +ValidatePaymentTest:testOperatorApproval_InsufficientRateAllowance() (gas: 544983) +ValidatePaymentTest:testOperatorApproval_NotApproved() (gas: 464901) +ValidatePaymentTest:testPieceMetadataAllBoundaries() (gas: 7727654) +ValidatePaymentTest:testPieceMetadataArrayMismatchErrors() (gas: 1219091) +ValidatePaymentTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1747721) +ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1171902) +ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1173486) +ValidatePaymentTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1352426) +ValidatePaymentTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2111794) +ValidatePaymentTest:testPieceMetadataKeyCountBoundaries() (gas: 3809951) +ValidatePaymentTest:testPieceMetadataKeyLengthBoundaries() (gas: 3235060) +ValidatePaymentTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 1889402) +ValidatePaymentTest:testPieceMetadataRemovalDeferredToNextProvingPeriod() (gas: 2097024) +ValidatePaymentTest:testPieceMetadataStorageAndRetrieval() (gas: 2070377) +ValidatePaymentTest:testPieceMetadataValueLengthBoundaries() (gas: 3433662) +ValidatePaymentTest:testProvenPeriods() (gas: 71862548) +ValidatePaymentTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1786578) +ValidatePaymentTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1062351) +ValidatePaymentTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19709) +ValidatePaymentTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062371) +ValidatePaymentTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773452) +ValidatePaymentTest:testRegression_CDNDataSetCleanup() (gas: 4217360) +ValidatePaymentTest:testServiceNameAndDescriptionValidation() (gas: 19832586) +ValidatePaymentTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118321) +ValidatePaymentTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119575) +ValidatePaymentTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121545) +ValidatePaymentTest:testServiceProviderChangedSuccessDecoupled() (gas: 1120965) +ValidatePaymentTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1122751) +ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 1938235) +ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 1881176) +ValidatePaymentTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 1875153) +ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1829074) +ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1049659) +ValidatePaymentTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 1874955) +ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1775787) +ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1737453) +ValidatePaymentTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 24094) +ValidatePaymentTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1729998) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1832604) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1833973) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1739357) +ValidatePaymentTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 1875741) +ValidatePaymentTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1734475) +ValidatePaymentTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1727494) +ValidatePaymentTest:testTerminateCDNServiceLifecycle() (gas: 1904110) +ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 1679112) +ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1778833) +ValidatePaymentTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 1895401) +ValidatePaymentTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1052833) +ValidatePaymentTest:testTerminateServiceLifecycle() (gas: 1871858) +ValidatePaymentTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 1754148) +ValidatePaymentTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 1840008) +ValidatePaymentTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 1843098) +ValidatePaymentTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 21875) +ValidatePaymentTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1772590) +ValidatePaymentTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1044809) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1780522) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 1835675) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 1884990) +ValidatePaymentTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 1915025) +ValidatePaymentTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) +ValidatePaymentTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766114) +ValidatePaymentTest:testTransferCDNController() (gas: 34568) +ValidatePaymentTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) +ValidatePaymentTest:testUpgrade() (gas: 11539751) +ValidatePaymentTest:testValidatePayment_AdvancesPastUnprovenPeriodsWithPassedDeadlines() (gas: 1205685) +ValidatePaymentTest:testValidatePayment_AllEpochsProven() (gas: 1273022) +ValidatePaymentTest:testValidatePayment_BeforeActivation() (gas: 1202182) +ValidatePaymentTest:testValidatePayment_BlocksOnUnprovenPeriodWithOpenDeadline() (gas: 1201125) +ValidatePaymentTest:testValidatePayment_FirstPeriodUnproven() (gas: 1321262) +ValidatePaymentTest:testValidatePayment_InvalidEpochRange() (gas: 1141670) +ValidatePaymentTest:testValidatePayment_InvalidRailId() (gas: 22358) +ValidatePaymentTest:testValidatePayment_MixedProvenAndUnprovenWithPassedDeadlines() (gas: 1252061) +ValidatePaymentTest:testValidatePayment_NoEpochsProven() (gas: 1258383) +ValidatePaymentTest:testValidatePayment_PartialPeriodCoverage() (gas: 1259320) +ValidatePaymentTest:testValidatePayment_ProvingNeverActivated() (gas: 1144857) +ValidatePaymentTest:testValidatePayment_SomeEpochsProven() (gas: 1269260) +ValidatePaymentTest:testValidatePayment_ToEpochExactlyOnDeadline() (gas: 1250972) \ No newline at end of file diff --git a/service_contracts/Makefile b/service_contracts/Makefile index 236d170c..8b6adb00 100644 --- a/service_contracts/Makefile +++ b/service_contracts/Makefile @@ -80,6 +80,7 @@ check-tools: .PHONY: test test: forge test --via-ir -vv + @forge snapshot --no-match-test "Fuzz" # Clean build artifacts .PHONY: clean From f4b767fc7c7accce8bacb718d37c0e8f5e9995ea Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 29 Apr 2026 17:33:44 -0500 Subject: [PATCH 31/43] avoid recalculating slot for sectors[sectorId] --- service_contracts/.gas-snapshot | 34 +++++++++++----------- service_contracts/src/PoRepDeal.sol | 45 +++++++++++++---------------- 2 files changed, 37 insertions(+), 42 deletions(-) diff --git a/service_contracts/.gas-snapshot b/service_contracts/.gas-snapshot index db0573e4..92c26aa8 100644 --- a/service_contracts/.gas-snapshot +++ b/service_contracts/.gas-snapshot @@ -261,32 +261,32 @@ MetadataSignatureFixturesTest:testContract() (gas: 2593) MetadataSignatureFixturesTest:testEIP712TypeStructures() (gas: 27096) MetadataSignatureFixturesTest:testExternalSignatures() (gas: 58165) MetadataSignatureFixturesTest:testGenerateFixtures() (gas: 161303) -PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1749642) -PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1723591) -PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 1972492) -PoRepDealActivationTest:testExactBalanceSufficient() (gas: 1993841) -PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1724915) -PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1726711) -PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1724376) -PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2163922) +PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1742026) +PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1715975) +PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 1964876) +PoRepDealActivationTest:testExactBalanceSufficient() (gas: 1986225) +PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1717299) +PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1719095) +PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1716760) +PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2156306) PoRepDealExtendTest:testExtend() (gas: 160793) PoRepDealExtendTest:testExtendRevertsAfterExpiry() (gas: 14364) PoRepDealExtendTest:testExtendRevertsIfNotClient() (gas: 8948) -PoRepDealExtendTest:testExtendRevertsWhenFaulted() (gas: 200637) +PoRepDealExtendTest:testExtendRevertsWhenFaulted() (gas: 200422) PoRepDealExtendTest:testSweepRevertsBeforeExpiry() (gas: 10838) PoRepDealSectorStatusTest:testSectorExpiredAfterActivation() (gas: 307765) PoRepDealSectorStatusTest:testSectorExpiredAfterDealEnd() (gas: 12126) -PoRepDealSectorStatusTest:testSectorExpiredAfterFaulty() (gas: 342632) +PoRepDealSectorStatusTest:testSectorExpiredAfterFaulty() (gas: 342460) PoRepDealSectorStatusTest:testSectorExpiredNotInDeal() (gas: 13893) PoRepDealSectorStatusTest:testSectorExpiredRevertsIfStillActive() (gas: 28396) PoRepDealSectorStatusTest:testSectorExpiredRevertsNotYetCompacted() (gas: 27934) -PoRepDealSectorStatusTest:testSectorFaultyAfterDealEnd() (gas: 12319) -PoRepDealSectorStatusTest:testSectorFaultyAlreadyFailed() (gas: 92651) -PoRepDealSectorStatusTest:testSectorFaultyNotInDeal() (gas: 14096) -PoRepDealSectorStatusTest:testSectorFaultyRevertsIfStillActive() (gas: 28519) -PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 486337) -PoRepDealSectorStatusTest:testSectorRecoveredNotFailed() (gas: 12052) -PoRepDealSectorStatusTest:testSectorRecoveredStillFaulty() (gas: 100309) +PoRepDealSectorStatusTest:testSectorFaultyAfterDealEnd() (gas: 12322) +PoRepDealSectorStatusTest:testSectorFaultyAlreadyFailed() (gas: 92282) +PoRepDealSectorStatusTest:testSectorFaultyNotInDeal() (gas: 14111) +PoRepDealSectorStatusTest:testSectorFaultyRevertsIfStillActive() (gas: 28365) +PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 485991) +PoRepDealSectorStatusTest:testSectorRecoveredNotFailed() (gas: 12058) +PoRepDealSectorStatusTest:testSectorRecoveredStillFaulty() (gas: 99937) PoRepDealSectorStatusTest:testTerminatePayeeReceiverUnauthorized() (gas: 19523) PoRepDealSectorStatusTest:testTerminateReceiverNonceUnauthorized() (gas: 19309) PoRepDealSectorStatusTest:testTerminateStrangerUnauthorized() (gas: 18826) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 924d8272..98dfafc7 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -181,25 +181,6 @@ contract PoRepDeal { } } - function onBadSector(uint256 sectorId, address recipient) internal { - sectors[sectorId].failed = 1; - if (info.faultedSectorCount == 0) { - amortizeHealthy(); - info.faultedSectorCount = 1; - payoutBounty(recipient, getInsuranceFunds() / 2); - } else { - info.faultedSectorCount++; - } - } - - function onSectorRecovered(uint256 sectorId) internal { - sectors[sectorId].failed = 0; - - if (--info.faultedSectorCount == 0) { - info.settledEpoch = uint64(block.number); - } - } - // Pass NO_DEADLINE and NO_PARTITION once the sector has been compacted via CompactPartitions. function sectorExpired(uint64 sectorId, int64 deadline, int64 partition, address recipient) external { require(block.number < info.endEpoch, DealExpired()); @@ -217,26 +198,40 @@ contract PoRepDeal { function sectorFaulty(uint64 sectorId, int64 deadline, int64 partition, address recipient) external { require(block.number < info.endEpoch, DealExpired()); - require(sectors[sectorId].dealSize > 0, SectorNotInDeal(sectorId)); - require(sectors[sectorId].failed == 0, SectorAlreadyFailed(sectorId)); + + SectorInfo storage sectorInfo = sectors[sectorId]; + require(sectorInfo.dealSize > 0, SectorNotInDeal(sectorId)); + require(sectorInfo.failed == 0, SectorAlreadyFailed(sectorId)); require( FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Faulty, deadline, partition), SectorNotFaulty(sectorId) ); - onBadSector(sectorId, recipient); + sectorInfo.failed = 1; + if (info.faultedSectorCount == 0) { + amortizeHealthy(); + info.faultedSectorCount = 1; + payoutBounty(recipient, getInsuranceFunds() / 2); + } else { + info.faultedSectorCount++; + } } // SPs should call this after DeclareFaultsRecovered and a successful Window PoSt function sectorRecovered(uint64 sectorId, int64 deadline, int64 partition) external { - require(sectors[sectorId].failed == 1, SectorNotFailed(sectorId)); - require(sectors[sectorId].dealSize > 0, SectorNotInDeal(sectorId)); + SectorInfo storage sectorInfo = sectors[sectorId]; + require(sectorInfo.failed == 1, SectorNotFailed(sectorId)); + require(sectorInfo.dealSize > 0, SectorNotInDeal(sectorId)); require( FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Active, deadline, partition), SectorNotActive(sectorId) ); - onSectorRecovered(sectorId); + sectorInfo.failed = 0; + + if (--info.faultedSectorCount == 0) { + info.settledEpoch = uint64(block.number); + } } function terminate(address recipient, uint64 provider, address receiver) internal { From 37ef8651708aafea1e2686aaf400644df131b957 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 29 Apr 2026 19:57:30 -0500 Subject: [PATCH 32/43] test(PoRepDeal): expand revert coverage and remove dead SectorNotInDeal check Assisted-by: Claude:claude-sonnet-4-6 --- service_contracts/.gas-snapshot | 59 +++++++------ service_contracts/src/PoRepDeal.sol | 2 +- service_contracts/src/PoRepService.sol | 5 +- .../test/PoRepDealActivation.t.sol | 6 ++ .../test/PoRepDealSectorStatus.t.sol | 87 ++++++++++++++++++- 5 files changed, 128 insertions(+), 31 deletions(-) diff --git a/service_contracts/.gas-snapshot b/service_contracts/.gas-snapshot index 92c26aa8..7edefe86 100644 --- a/service_contracts/.gas-snapshot +++ b/service_contracts/.gas-snapshot @@ -261,38 +261,43 @@ MetadataSignatureFixturesTest:testContract() (gas: 2593) MetadataSignatureFixturesTest:testEIP712TypeStructures() (gas: 27096) MetadataSignatureFixturesTest:testExternalSignatures() (gas: 58165) MetadataSignatureFixturesTest:testGenerateFixtures() (gas: 161303) -PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1742026) -PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1715975) -PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 1964876) -PoRepDealActivationTest:testExactBalanceSufficient() (gas: 1986225) -PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1717299) -PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1719095) -PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1716760) -PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2156306) +PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1737632) +PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1711581) +PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 1960482) +PoRepDealActivationTest:testExactBalanceSufficient() (gas: 1981809) +PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1712905) +PoRepDealActivationTest:testPieceAddedOnlyService() (gas: 1711192) +PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1714701) +PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1712366) +PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2151912) PoRepDealExtendTest:testExtend() (gas: 160793) PoRepDealExtendTest:testExtendRevertsAfterExpiry() (gas: 14364) PoRepDealExtendTest:testExtendRevertsIfNotClient() (gas: 8948) PoRepDealExtendTest:testExtendRevertsWhenFaulted() (gas: 200422) PoRepDealExtendTest:testSweepRevertsBeforeExpiry() (gas: 10838) -PoRepDealSectorStatusTest:testSectorExpiredAfterActivation() (gas: 307765) -PoRepDealSectorStatusTest:testSectorExpiredAfterDealEnd() (gas: 12126) -PoRepDealSectorStatusTest:testSectorExpiredAfterFaulty() (gas: 342460) -PoRepDealSectorStatusTest:testSectorExpiredNotInDeal() (gas: 13893) -PoRepDealSectorStatusTest:testSectorExpiredRevertsIfStillActive() (gas: 28396) -PoRepDealSectorStatusTest:testSectorExpiredRevertsNotYetCompacted() (gas: 27934) -PoRepDealSectorStatusTest:testSectorFaultyAfterDealEnd() (gas: 12322) -PoRepDealSectorStatusTest:testSectorFaultyAlreadyFailed() (gas: 92282) -PoRepDealSectorStatusTest:testSectorFaultyNotInDeal() (gas: 14111) -PoRepDealSectorStatusTest:testSectorFaultyRevertsIfStillActive() (gas: 28365) -PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 485991) -PoRepDealSectorStatusTest:testSectorRecoveredNotFailed() (gas: 12058) -PoRepDealSectorStatusTest:testSectorRecoveredStillFaulty() (gas: 99937) -PoRepDealSectorStatusTest:testTerminatePayeeReceiverUnauthorized() (gas: 19523) -PoRepDealSectorStatusTest:testTerminateReceiverNonceUnauthorized() (gas: 19309) -PoRepDealSectorStatusTest:testTerminateStrangerUnauthorized() (gas: 18826) -PoRepDealSectorStatusTest:testUpdateLockupsPayeeReceiverUnauthorized() (gas: 18994) -PoRepDealSectorStatusTest:testUpdateLockupsReceiverNonceUnauthorized() (gas: 18890) -PoRepDealSectorStatusTest:testUpdateLockupsStrangerUnauthorized() (gas: 18209) +PoRepDealSectorStatusTest:testBothSectorsRecovered() (gas: 579741) +PoRepDealSectorStatusTest:testClientCannotDirectlyTerminateRail() (gas: 68775) +PoRepDealSectorStatusTest:testSectorExpiredAfterActivation() (gas: 307833) +PoRepDealSectorStatusTest:testSectorExpiredAfterDealEnd() (gas: 12221) +PoRepDealSectorStatusTest:testSectorExpiredAfterFaulty() (gas: 342575) +PoRepDealSectorStatusTest:testSectorExpiredNotInDeal() (gas: 13944) +PoRepDealSectorStatusTest:testSectorExpiredRevertsIfStillActive() (gas: 28491) +PoRepDealSectorStatusTest:testSectorExpiredRevertsNotYetCompacted() (gas: 27985) +PoRepDealSectorStatusTest:testSectorFaultyAfterDealEnd() (gas: 12439) +PoRepDealSectorStatusTest:testSectorFaultyAlreadyFailed() (gas: 92362) +PoRepDealSectorStatusTest:testSectorFaultyNotInDeal() (gas: 14206) +PoRepDealSectorStatusTest:testSectorFaultyRevertsIfStillActive() (gas: 28416) +PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 485999) +PoRepDealSectorStatusTest:testSectorRecoveredNotFailed() (gas: 12143) +PoRepDealSectorStatusTest:testSectorRecoveredStillFaulty() (gas: 99979) +PoRepDealSectorStatusTest:testSweepUnauthorized() (gas: 165634) +PoRepDealSectorStatusTest:testTerminateClientUnauthorized() (gas: 19353) +PoRepDealSectorStatusTest:testTerminatePayeeReceiverUnauthorized() (gas: 19611) +PoRepDealSectorStatusTest:testTerminateReceiverNonceUnauthorized() (gas: 19331) +PoRepDealSectorStatusTest:testTerminateStrangerUnauthorized() (gas: 18892) +PoRepDealSectorStatusTest:testUpdateLockupsPayeeReceiverUnauthorized() (gas: 19016) +PoRepDealSectorStatusTest:testUpdateLockupsReceiverNonceUnauthorized() (gas: 18912) +PoRepDealSectorStatusTest:testUpdateLockupsStrangerUnauthorized() (gas: 18231) PoRepPayeeTest:testOwner() (gas: 29635) PoRepPayeeTest:testSudo() (gas: 70669) PoRepPayeeTest:testSudoUnauthorized() (gas: 59734) diff --git a/service_contracts/src/PoRepDeal.sol b/service_contracts/src/PoRepDeal.sol index 98dfafc7..5dcd3053 100644 --- a/service_contracts/src/PoRepDeal.sol +++ b/service_contracts/src/PoRepDeal.sol @@ -220,8 +220,8 @@ contract PoRepDeal { // SPs should call this after DeclareFaultsRecovered and a successful Window PoSt function sectorRecovered(uint64 sectorId, int64 deadline, int64 partition) external { SectorInfo storage sectorInfo = sectors[sectorId]; + // a sector cannot have been marked faulty unless it is already in the deal require(sectorInfo.failed == 1, SectorNotFailed(sectorId)); - require(sectorInfo.dealSize > 0, SectorNotInDeal(sectorId)); require( FVMSector.validateSectorStatus(PROVIDER, sectorId, SectorStatus.Active, deadline, partition), SectorNotActive(sectorId) diff --git a/service_contracts/src/PoRepService.sol b/service_contracts/src/PoRepService.sol index 58a5994d..0bc5b411 100644 --- a/service_contracts/src/PoRepService.sol +++ b/service_contracts/src/PoRepService.sol @@ -21,6 +21,7 @@ import {LibClone} from "@solady/utils/LibClone.sol"; import {IPoRepService, PoRepDeal} from "./PoRepDeal.sol"; error Unauthorized(address caller); +error TerminationForbidden(); contract PoRepPayee { using FVMActor for address; @@ -192,7 +193,7 @@ contract PoRepService is IPoRepService, IValidator { } function railTerminated(uint256, address terminator, uint256 /*endEpoch*/ ) external view { - require(msg.sender == address(PAYMENTS)); - require(terminator == address(this)); + // require(msg.sender == address(PAYMENTS)); + require(terminator == address(this), TerminationForbidden()); } } diff --git a/service_contracts/test/PoRepDealActivation.t.sol b/service_contracts/test/PoRepDealActivation.t.sol index 3ba208af..e0554c94 100644 --- a/service_contracts/test/PoRepDealActivation.t.sol +++ b/service_contracts/test/PoRepDealActivation.t.sol @@ -149,6 +149,12 @@ contract PoRepDealActivationTest is MockFVMTest { deal.pieceAdded(MINER_ID, COMMP_DIGEST_1, 1, endEpoch - 1, SIZE_32GB); } + function testPieceAddedOnlyService() public { + (PoRepDeal deal, uint64 endEpoch) = _createDeal(); + vm.expectRevert(PoRepDeal.Unauthorized.selector); + deal.pieceAdded(MINER_ID, COMMP_DIGEST_1, 1, endEpoch, SIZE_32GB); + } + function testPieceAddedUnauthorized() public { (PoRepDeal deal, uint64 endEpoch) = _createDeal(); vm.prank(address(service)); diff --git a/service_contracts/test/PoRepDealSectorStatus.t.sol b/service_contracts/test/PoRepDealSectorStatus.t.sol index d565c62a..028adf1b 100644 --- a/service_contracts/test/PoRepDealSectorStatus.t.sol +++ b/service_contracts/test/PoRepDealSectorStatus.t.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.30; import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol"; import {Errors} from "@fws-payments/Errors.sol"; import {PoRepDeal} from "../src/PoRepDeal.sol"; -import {PoRepPayee, PoRepService, Unauthorized} from "../src/PoRepService.sol"; +import {PoRepPayee, PoRepService, TerminationForbidden, Unauthorized} from "../src/PoRepService.sol"; import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; import {PieceChange, SectorChanges, SectorContentChangedParams} from "@fvm-solidity/FVMSectorContentChanged.sol"; @@ -29,6 +29,9 @@ contract PoRepDealSectorStatusTest is MockFVMTest { bytes constant COMMP_CID_1 = hex"0181e203922020cdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36"; bytes32 constant COMMP_DIGEST_1 = 0xcdf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36; + bytes constant COMMP_CID_2 = hex"0181e203922020adf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36"; + bytes32 constant COMMP_DIGEST_2 = 0xadf33e17483f8397390b0a963ded6e34a18f2fce6daa671716057f905f645b36; + uint64 constant SECTOR_ID_2 = 2; FilecoinPayV1 payments; PoRepService service; @@ -154,6 +157,65 @@ contract PoRepDealSectorStatusTest is MockFVMTest { assertRailFinalized(); } + function testBothSectorsRecovered() public { + // Extend approval and deposit to cover two sectors + vm.prank(client); + payments.setOperatorApproval( + NATIVE_TOKEN, + address(service), + true, + uint256(2 * SIZE) * RATE, + uint256(2 * SIZE) * RATE * DURATION, + DURATION + ); + vm.prank(client); + payments.deposit{value: uint256(SIZE) * RATE * DURATION}(NATIVE_TOKEN, client, uint256(SIZE) * RATE * DURATION); + + // Authorize and activate second piece in a second sector + bytes32[] memory cidHashes = new bytes32[](1); + cidHashes[0] = COMMP_DIGEST_2; + vm.prank(client); + poRepDeal.addPieces(cidHashes); + + uint64 nonce = _findDealNonce(address(service), address(poRepDeal)); + miner.mockSector(SECTOR_ID_2, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); + PieceChange[] memory pieces = new PieceChange[](1); + pieces[0] = PieceChange({data: COMMP_CID_2, size: SIZE, payload: abi.encodePacked(nonce)}); + SectorChanges[] memory sectorChanges = new SectorChanges[](1); + sectorChanges[0] = SectorChanges({sector: SECTOR_ID_2, minimumCommitmentEpoch: int64(endEpoch), added: pieces}); + miner.callSectorContentChanged(address(service), SectorContentChangedParams({sectors: sectorChanges})); + + vm.roll(vm.getBlockNumber() + 3 * DAYS_OF_EPOCHS); + + // First fault pays bounty; second does not + miner.mockSectorStatus(SECTOR_ID, SectorStatus.Faulty); + poRepDeal.sectorFaulty(SECTOR_ID, DEADLINE, PARTITION, RECIPIENT); + uint256 bounty = RECIPIENT.balance; + assertGt(bounty, 0); + + miner.mockSectorStatus(SECTOR_ID_2, SectorStatus.Faulty); + poRepDeal.sectorFaulty(SECTOR_ID_2, DEADLINE, PARTITION, RECIPIENT); + assertEq(RECIPIENT.balance, bounty); + + vm.roll(vm.getBlockNumber() + FAULT_MAX_AGE / 2); + + // First recovery leaves the deal faulted + miner.mockSector(SECTOR_ID, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); + poRepDeal.sectorRecovered(SECTOR_ID, DEADLINE, PARTITION); + (,, uint32 faultedCount,) = poRepDeal.info(); + assertEq(faultedCount, 1); + + // Second recovery fully restores the deal + miner.mockSector(SECTOR_ID_2, SectorStatus.Active, DEADLINE, PARTITION, endEpoch); + poRepDeal.sectorRecovered(SECTOR_ID_2, DEADLINE, PARTITION); + (,, faultedCount,) = poRepDeal.info(); + assertEq(faultedCount, 0); + + vm.roll(endEpoch + 1); + payee.sudo(payable(address(poRepDeal)), abi.encodeWithSelector(PoRepDeal.sweep.selector, SWEEPER)); + assertRailFinalized(); + } + // tests expiration after fault function testSectorExpiredAfterFaulty() public { vm.roll(vm.getBlockNumber() + 3 * DAYS_OF_EPOCHS); @@ -295,4 +357,27 @@ contract PoRepDealSectorStatusTest is MockFVMTest { vm.prank(stranger); service.terminate(dealNonce, railId, uint64(0), address(0)); } + + function testSweepUnauthorized() public { + vm.roll(endEpoch + 1); + address stranger = makeAddr("stranger"); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, stranger)); + vm.prank(stranger); + poRepDeal.sweep(stranger); + } + + function testTerminateClientUnauthorized() public { + uint64 dealNonce = _findDealNonce(address(service), address(poRepDeal)); + uint256 railId = poRepDeal.RAIL_ID(); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, client)); + vm.prank(client); + service.terminate(dealNonce, railId, uint64(0), address(0)); + } + + function testClientCannotDirectlyTerminateRail() public { + uint256 railId = poRepDeal.RAIL_ID(); + vm.expectRevert(TerminationForbidden.selector); + vm.prank(client); + payments.terminateRail(railId); + } } From a9dfa5d3fc58328d3fcb0151226d80e3a3b5e083 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Thu, 30 Apr 2026 10:40:19 -0500 Subject: [PATCH 33/43] test(PoRepPayee): assert sudo forwards inner call revert data Assisted-by: Claude:claude-sonnet-4-6 --- service_contracts/test/PoRepService.t.sol | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/service_contracts/test/PoRepService.t.sol b/service_contracts/test/PoRepService.t.sol index 7be228da..64ef78a0 100644 --- a/service_contracts/test/PoRepService.t.sol +++ b/service_contracts/test/PoRepService.t.sol @@ -8,6 +8,14 @@ import {FVMMinerActor} from "@fvm-solidity/mocks/FVMMinerActor.sol"; import {MockFVMTest} from "@fvm-solidity/mocks/MockFVMTest.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +contract RevertingTarget { + error TargetError(uint256 value); + + function run() external pure { + revert TargetError(42); + } +} + contract PoRepPayeeTest is MockFVMTest { using FVMActor for address; @@ -52,6 +60,13 @@ contract PoRepPayeeTest is MockFVMTest { payee.sudo{value: 1}(notOwner, bytes("")); assertEq(notOwner.balance, 1); } + + function testSudoForwardsInnerRevert() public { + RevertingTarget target = new RevertingTarget(); + bytes memory innerRevertData = abi.encodeWithSelector(RevertingTarget.TargetError.selector, uint256(42)); + vm.expectRevert(abi.encode(innerRevertData)); + payee.sudo(payable(address(target)), abi.encodeCall(RevertingTarget.run, ())); + } } contract PoRepServiceTest is MockFVMTest { From 1f4dc90bd0d4e0b2796cf4d42f88a36665718d94 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Thu, 30 Apr 2026 10:48:13 -0500 Subject: [PATCH 34/43] update .gas-snapshot --- service_contracts/.gas-snapshot | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/service_contracts/.gas-snapshot b/service_contracts/.gas-snapshot index 7edefe86..a003559b 100644 --- a/service_contracts/.gas-snapshot +++ b/service_contracts/.gas-snapshot @@ -298,9 +298,10 @@ PoRepDealSectorStatusTest:testTerminateStrangerUnauthorized() (gas: 18892) PoRepDealSectorStatusTest:testUpdateLockupsPayeeReceiverUnauthorized() (gas: 19016) PoRepDealSectorStatusTest:testUpdateLockupsReceiverNonceUnauthorized() (gas: 18912) PoRepDealSectorStatusTest:testUpdateLockupsStrangerUnauthorized() (gas: 18231) -PoRepPayeeTest:testOwner() (gas: 29635) -PoRepPayeeTest:testSudo() (gas: 70669) -PoRepPayeeTest:testSudoUnauthorized() (gas: 59734) +PoRepPayeeTest:testOwner() (gas: 29657) +PoRepPayeeTest:testSudo() (gas: 70691) +PoRepPayeeTest:testSudoForwardsInnerRevert() (gas: 87633) +PoRepPayeeTest:testSudoUnauthorized() (gas: 59756) PoRepServiceTest:testCreateDealNotMiner() (gas: 18766) PoRepServiceTest:testCreateReceiver() (gas: 285512) PoRepServiceTest:testForbiddenMethod() (gas: 11458) From 166bd893cd526c86d2ccc2a4afee729562136d9f Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 1 May 2026 03:13:08 -0500 Subject: [PATCH 35/43] drop trailing cbor metadata from contract bytecode --- service_contracts/.gas-snapshot | 68 ++++++++++++++++----------------- service_contracts/foundry.toml | 3 ++ 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/service_contracts/.gas-snapshot b/service_contracts/.gas-snapshot index a003559b..8ec6bd58 100644 --- a/service_contracts/.gas-snapshot +++ b/service_contracts/.gas-snapshot @@ -28,7 +28,7 @@ ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1 ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300267) ClientDataSetPaginationTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356757) ClientDataSetPaginationTest:testEmptyStringMetadata() (gas: 2081527) -ClientDataSetPaginationTest:testFilecoinServiceDeployedEvent() (gas: 5102366) +ClientDataSetPaginationTest:testFilecoinServiceDeployedEvent() (gas: 5080928) ClientDataSetPaginationTest:testGetClientDataSetsLength_AfterCreation() (gas: 4185772) ClientDataSetPaginationTest:testGetClientDataSetsLength_Empty() (gas: 23038) ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5092687) @@ -86,7 +86,7 @@ ClientDataSetPaginationTest:testRailTerminated_RevertsIfRailNotAssociated() (gas ClientDataSetPaginationTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062437) ClientDataSetPaginationTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773474) ClientDataSetPaginationTest:testRegression_CDNDataSetCleanup() (gas: 4217379) -ClientDataSetPaginationTest:testServiceNameAndDescriptionValidation() (gas: 19832586) +ClientDataSetPaginationTest:testServiceNameAndDescriptionValidation() (gas: 19790104) ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118343) ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119641) ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121545) @@ -128,7 +128,7 @@ ClientDataSetPaginationTest:testTopUpCDNPaymentRails_Success() (gas: 1802391) ClientDataSetPaginationTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766136) ClientDataSetPaginationTest:testTransferCDNController() (gas: 34590) ClientDataSetPaginationTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19065) -ClientDataSetPaginationTest:testUpgrade() (gas: 11539764) +ClientDataSetPaginationTest:testUpgrade() (gas: 11496887) ExtsloadTest:test_extsload() (gas: 40763) ExtsloadTest:test_extsloadStruct() (gas: 61981) FilecoinWarmStorageServiceOwnerTest:testOwnerFieldSetCorrectlyOnDataSetCreation() (gas: 1117542) @@ -159,7 +159,7 @@ FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleDataSets() (gas FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300091) FilecoinWarmStorageServiceTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356405) FilecoinWarmStorageServiceTest:testEmptyStringMetadata() (gas: 2081395) -FilecoinWarmStorageServiceTest:testFilecoinServiceDeployedEvent() (gas: 5102168) +FilecoinWarmStorageServiceTest:testFilecoinServiceDeployedEvent() (gas: 5080730) FilecoinWarmStorageServiceTest:testGetClientDataSets_EmptyClient() (gas: 27053) FilecoinWarmStorageServiceTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797528) FilecoinWarmStorageServiceTest:testGetClientDataSets_MultipleDataSets() (gas: 1933358) @@ -207,7 +207,7 @@ FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfRailNotAssociated() ( FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062305) FilecoinWarmStorageServiceTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773320) FilecoinWarmStorageServiceTest:testRegression_CDNDataSetCleanup() (gas: 4217097) -FilecoinWarmStorageServiceTest:testServiceNameAndDescriptionValidation() (gas: 19832586) +FilecoinWarmStorageServiceTest:testServiceNameAndDescriptionValidation() (gas: 19790104) FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118145) FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119509) FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121303) @@ -249,33 +249,33 @@ FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1765938) FilecoinWarmStorageServiceTest:testTransferCDNController() (gas: 34524) FilecoinWarmStorageServiceTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) -FilecoinWarmStorageServiceTest:testUpgrade() (gas: 11539566) -FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriod() (gas: 1657587) +FilecoinWarmStorageServiceTest:testUpgrade() (gas: 11496689) +FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriod() (gas: 1646755) FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriodWithInvalidParameters() (gas: 45444) FilecoinWarmStorageServiceUpgradeTest:testMigrate() (gas: 35120) FilecoinWarmStorageServiceUpgradeTest:testMigrateOnlyOnce() (gas: 28727) -FilecoinWarmStorageServiceUpgradeTest:testMigrateWithViewContract() (gas: 1661613) -FilecoinWarmStorageServiceUpgradeTest:testNextPDPChallengeWindowStartThroughView() (gas: 1644508) -FilecoinWarmStorageServiceUpgradeTest:testSetViewContract() (gas: 1645209) +FilecoinWarmStorageServiceUpgradeTest:testMigrateWithViewContract() (gas: 1650781) +FilecoinWarmStorageServiceUpgradeTest:testNextPDPChallengeWindowStartThroughView() (gas: 1633676) +FilecoinWarmStorageServiceUpgradeTest:testSetViewContract() (gas: 1634377) MetadataSignatureFixturesTest:testContract() (gas: 2593) MetadataSignatureFixturesTest:testEIP712TypeStructures() (gas: 27096) MetadataSignatureFixturesTest:testExternalSignatures() (gas: 58165) MetadataSignatureFixturesTest:testGenerateFixtures() (gas: 161303) -PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1737632) -PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1711581) -PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 1960482) -PoRepDealActivationTest:testExactBalanceSufficient() (gas: 1981809) -PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1712905) -PoRepDealActivationTest:testPieceAddedOnlyService() (gas: 1711192) -PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1714701) -PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1712366) -PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2151912) +PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1715966) +PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1689915) +PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 1938816) +PoRepDealActivationTest:testExactBalanceSufficient() (gas: 1960143) +PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1691239) +PoRepDealActivationTest:testPieceAddedOnlyService() (gas: 1689526) +PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1693035) +PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1690700) +PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2130233) PoRepDealExtendTest:testExtend() (gas: 160793) PoRepDealExtendTest:testExtendRevertsAfterExpiry() (gas: 14364) PoRepDealExtendTest:testExtendRevertsIfNotClient() (gas: 8948) PoRepDealExtendTest:testExtendRevertsWhenFaulted() (gas: 200422) PoRepDealExtendTest:testSweepRevertsBeforeExpiry() (gas: 10838) -PoRepDealSectorStatusTest:testBothSectorsRecovered() (gas: 579741) +PoRepDealSectorStatusTest:testBothSectorsRecovered() (gas: 579728) PoRepDealSectorStatusTest:testClientCannotDirectlyTerminateRail() (gas: 68775) PoRepDealSectorStatusTest:testSectorExpiredAfterActivation() (gas: 307833) PoRepDealSectorStatusTest:testSectorExpiredAfterDealEnd() (gas: 12221) @@ -287,10 +287,10 @@ PoRepDealSectorStatusTest:testSectorFaultyAfterDealEnd() (gas: 12439) PoRepDealSectorStatusTest:testSectorFaultyAlreadyFailed() (gas: 92362) PoRepDealSectorStatusTest:testSectorFaultyNotInDeal() (gas: 14206) PoRepDealSectorStatusTest:testSectorFaultyRevertsIfStillActive() (gas: 28416) -PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 485999) +PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 485979) PoRepDealSectorStatusTest:testSectorRecoveredNotFailed() (gas: 12143) PoRepDealSectorStatusTest:testSectorRecoveredStillFaulty() (gas: 99979) -PoRepDealSectorStatusTest:testSweepUnauthorized() (gas: 165634) +PoRepDealSectorStatusTest:testSweepUnauthorized() (gas: 165622) PoRepDealSectorStatusTest:testTerminateClientUnauthorized() (gas: 19353) PoRepDealSectorStatusTest:testTerminatePayeeReceiverUnauthorized() (gas: 19611) PoRepDealSectorStatusTest:testTerminateReceiverNonceUnauthorized() (gas: 19331) @@ -300,10 +300,10 @@ PoRepDealSectorStatusTest:testUpdateLockupsReceiverNonceUnauthorized() (gas: 189 PoRepDealSectorStatusTest:testUpdateLockupsStrangerUnauthorized() (gas: 18231) PoRepPayeeTest:testOwner() (gas: 29657) PoRepPayeeTest:testSudo() (gas: 70691) -PoRepPayeeTest:testSudoForwardsInnerRevert() (gas: 87633) +PoRepPayeeTest:testSudoForwardsInnerRevert() (gas: 76817) PoRepPayeeTest:testSudoUnauthorized() (gas: 59756) PoRepServiceTest:testCreateDealNotMiner() (gas: 18766) -PoRepServiceTest:testCreateReceiver() (gas: 285512) +PoRepServiceTest:testCreateReceiver() (gas: 274659) PoRepServiceTest:testForbiddenMethod() (gas: 11458) PoRepServiceTest:testUpdateLockupsNotDeal() (gas: 9469) ProductTypesTest:testPDPKeys() (gas: 14050) @@ -383,10 +383,10 @@ ServiceProviderRegistryPaginationTest:testPaginationPageBoundaries() (gas: 31960 ServiceProviderRegistryPaginationTest:testPaginationSingleProvider() (gas: 771119) ServiceProviderRegistryPaginationTest:testPaginationWithInactiveProviders() (gas: 2573055) ServiceProviderRegistryPaginationTest:testSequentialPagination() (gas: 6195116) -ServiceProviderRegistryTest:testAnnouncePlannedUpgrade() (gas: 3754366) -ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidEpoch() (gas: 3702138) +ServiceProviderRegistryTest:testAnnouncePlannedUpgrade() (gas: 3743739) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidEpoch() (gas: 3691511) ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidImplementation() (gas: 19753) -ServiceProviderRegistryTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 3704244) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 3693617) ServiceProviderRegistryTest:testBeneficiaryIsSetCorrectly() (gas: 769225) ServiceProviderRegistryTest:testCannotRegisterWithZeroBeneficiary() (gas: 37559) ServiceProviderRegistryTest:testCannotReinitialize() (gas: 16157) @@ -401,7 +401,7 @@ ServiceProviderRegistryTest:testGetProvidersByIdsMultipleValidProviders() (gas: ServiceProviderRegistryTest:testGetProvidersByIdsSingleValidProvider() (gas: 827350) ServiceProviderRegistryTest:testInitialState() (gas: 27401) ServiceProviderRegistryTest:testIsRegisteredProviderReturnsFalse() (gas: 25300) -ServiceProviderRegistryTest:testOnlyOwnerCanUpgrade() (gas: 3739251) +ServiceProviderRegistryTest:testOnlyOwnerCanUpgrade() (gas: 3728624) ServiceProviderRegistryTest:testRegisterProviderWithCapabilities() (gas: 989353) ServiceProviderRegistryTest:testTransferOwnership() (gas: 25812) SybilFeeTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407744) @@ -427,7 +427,7 @@ SybilFeeTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909107) SybilFeeTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300157) SybilFeeTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356493) SybilFeeTest:testEmptyStringMetadata() (gas: 2081417) -SybilFeeTest:testFilecoinServiceDeployedEvent() (gas: 5102234) +SybilFeeTest:testFilecoinServiceDeployedEvent() (gas: 5080796) SybilFeeTest:testGetClientDataSets_EmptyClient() (gas: 27141) SybilFeeTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797528) SybilFeeTest:testGetClientDataSets_MultipleDataSets() (gas: 1933446) @@ -475,7 +475,7 @@ SybilFeeTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19665) SybilFeeTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062327) SybilFeeTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773364) SybilFeeTest:testRegression_CDNDataSetCleanup() (gas: 4217189) -SybilFeeTest:testServiceNameAndDescriptionValidation() (gas: 19832586) +SybilFeeTest:testServiceNameAndDescriptionValidation() (gas: 19790104) SybilFeeTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118211) SybilFeeTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119531) SybilFeeTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121391) @@ -517,7 +517,7 @@ SybilFeeTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) SybilFeeTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766004) SybilFeeTest:testTransferCDNController() (gas: 34524) SybilFeeTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) -SybilFeeTest:testUpgrade() (gas: 11539654) +SybilFeeTest:testUpgrade() (gas: 11496777) ValidatePaymentTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407788) ValidatePaymentTest:testAddPiecesNonceReplayProtection() (gas: 1340000) ValidatePaymentTest:testAddPiecesNonceUniquePerPayer() (gas: 2073464) @@ -539,7 +539,7 @@ ValidatePaymentTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909151) ValidatePaymentTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300223) ValidatePaymentTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356735) ValidatePaymentTest:testEmptyStringMetadata() (gas: 2081461) -ValidatePaymentTest:testFilecoinServiceDeployedEvent() (gas: 5102344) +ValidatePaymentTest:testFilecoinServiceDeployedEvent() (gas: 5080906) ValidatePaymentTest:testFullFlow_SPAbandonsService_ClientCanSettleAndCleanup() (gas: 1232565) ValidatePaymentTest:testGetClientDataSets_EmptyClient() (gas: 27383) ValidatePaymentTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797607) @@ -590,7 +590,7 @@ ValidatePaymentTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19709) ValidatePaymentTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062371) ValidatePaymentTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773452) ValidatePaymentTest:testRegression_CDNDataSetCleanup() (gas: 4217360) -ValidatePaymentTest:testServiceNameAndDescriptionValidation() (gas: 19832586) +ValidatePaymentTest:testServiceNameAndDescriptionValidation() (gas: 19790104) ValidatePaymentTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118321) ValidatePaymentTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119575) ValidatePaymentTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121545) @@ -632,7 +632,7 @@ ValidatePaymentTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) ValidatePaymentTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766114) ValidatePaymentTest:testTransferCDNController() (gas: 34568) ValidatePaymentTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) -ValidatePaymentTest:testUpgrade() (gas: 11539751) +ValidatePaymentTest:testUpgrade() (gas: 11496874) ValidatePaymentTest:testValidatePayment_AdvancesPastUnprovenPeriodsWithPassedDeadlines() (gas: 1205685) ValidatePaymentTest:testValidatePayment_AllEpochsProven() (gas: 1273022) ValidatePaymentTest:testValidatePayment_BeforeActivation() (gas: 1202182) diff --git a/service_contracts/foundry.toml b/service_contracts/foundry.toml index 02a9546c..2e2463ee 100644 --- a/service_contracts/foundry.toml +++ b/service_contracts/foundry.toml @@ -9,6 +9,9 @@ solc = "0.8.30" via_ir = true optimizer = true optimizer_runs = 200 +# deterministic compilation output +cbor_metadata = false +bytecode_hash = "none" ignored_error_codes = [ 2394, # don't need to clear tstore From b465f3459425e392339a7ee4af00335f4d7f4e28 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 1 May 2026 03:44:44 -0500 Subject: [PATCH 36/43] ci(gas): fetch full depth to resolve nested submodule commits Assisted-by: Claude:claude-sonnet-4-6 --- .github/workflows/gas.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/gas.yml b/.github/workflows/gas.yml index 48deffa9..29abd6fc 100644 --- a/.github/workflows/gas.yml +++ b/.github/workflows/gas.yml @@ -14,6 +14,7 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + fetch-depth: 0 - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 From 6e4f99796f3084065e3d48cedd3ccb86068b7c8f Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 1 May 2026 16:18:16 -0500 Subject: [PATCH 37/43] Revert "ci(gas): fetch full depth to resolve nested submodule commits" This reverts commit b465f3459425e392339a7ee4af00335f4d7f4e28. --- .github/workflows/gas.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/gas.yml b/.github/workflows/gas.yml index 29abd6fc..48deffa9 100644 --- a/.github/workflows/gas.yml +++ b/.github/workflows/gas.yml @@ -14,7 +14,6 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive - fetch-depth: 0 - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 From efc9c997d7edda864e98580cfaea1d522d8521bd Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 1 May 2026 16:30:10 -0500 Subject: [PATCH 38/43] dump submodule info --- .github/workflows/gas.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/gas.yml b/.github/workflows/gas.yml index 48deffa9..0690bcc8 100644 --- a/.github/workflows/gas.yml +++ b/.github/workflows/gas.yml @@ -28,6 +28,14 @@ jobs: export PATH="/home/runner/.config/.foundry/bin:$PATH" make -C service_contracts test + - name: Dump submodules + run: | + git submodule foreach --recursive ' + depth=$(echo "$displaypath" | tr -cd "/" | wc -c) + indent=$(printf " %.0s" $(seq 1 $depth)) + printf "%s%s → %s\n" "$indent" "$displaypath" "$sha1" + ' + - name: Check for uncommitted changes run: | git add service_contracts/.gas-snapshot From 173af1229815fa3cc61f0bb16b5b8c026b133cc1 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 1 May 2026 17:13:06 -0500 Subject: [PATCH 39/43] test: forge snapshot --isolate --- service_contracts/.gas-snapshot | 1218 +++++++++++++++---------------- service_contracts/Makefile | 2 +- 2 files changed, 610 insertions(+), 610 deletions(-) diff --git a/service_contracts/.gas-snapshot b/service_contracts/.gas-snapshot index 8ec6bd58..5a2bac30 100644 --- a/service_contracts/.gas-snapshot +++ b/service_contracts/.gas-snapshot @@ -2,647 +2,647 @@ BigEndianTest:test_decode() (gas: 10223) BigEndianTest:test_encode() (gas: 392495) BloomSetTest:testDifferent() (gas: 29550) BloomSetTest:testIdentical() (gas: 23854) -ClientDataSetPaginationTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407854) -ClientDataSetPaginationTest:testAddPiecesNonceReplayProtection() (gas: 1339978) -ClientDataSetPaginationTest:testAddPiecesNonceUniquePerPayer() (gas: 2073508) -ClientDataSetPaginationTest:testAddPieces_RateUpdatedImmediately() (gas: 1353526) -ClientDataSetPaginationTest:testClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5755572) +ClientDataSetPaginationTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1522558) +ClientDataSetPaginationTest:testAddPiecesNonceReplayProtection() (gas: 1401874) +ClientDataSetPaginationTest:testAddPiecesNonceUniquePerPayer() (gas: 2057144) +ClientDataSetPaginationTest:testAddPieces_RateUpdatedImmediately() (gas: 1496650) +ClientDataSetPaginationTest:testClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5858739) ClientDataSetPaginationTest:testClientDataSetsPaginated_Empty() (gas: 24160) -ClientDataSetPaginationTest:testClientDataSetsPaginated_FullPage() (gas: 4190962) -ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitExceedsRemaining() (gas: 2644525) -ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 4195619) -ClientDataSetPaginationTest:testClientDataSetsPaginated_OffsetBeyondLength() (gas: 2640609) -ClientDataSetPaginationTest:testClientDataSetsPaginated_SecondPage() (gas: 4188629) -ClientDataSetPaginationTest:testCreateDataSetAddPieces() (gas: 2486616) -ClientDataSetPaginationTest:testCreateDataSetCreatesRail() (gas: 2188134) -ClientDataSetPaginationTest:testCreateDataSetNoCDN() (gas: 2152656) -ClientDataSetPaginationTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2112290) -ClientDataSetPaginationTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2122351) -ClientDataSetPaginationTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1275124) -ClientDataSetPaginationTest:testDataSetMetaDataWithAllBoundaries() (gas: 7004487) -ClientDataSetPaginationTest:testDataSetMetadataEmpty() (gas: 1052147) -ClientDataSetPaginationTest:testDataSetMetadataKeyCountBoundaries() (gas: 4336248) -ClientDataSetPaginationTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2156381) -ClientDataSetPaginationTest:testDataSetMetadataStorage() (gas: 1143759) -ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909217) -ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300267) -ClientDataSetPaginationTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356757) -ClientDataSetPaginationTest:testEmptyStringMetadata() (gas: 2081527) -ClientDataSetPaginationTest:testFilecoinServiceDeployedEvent() (gas: 5080928) -ClientDataSetPaginationTest:testGetClientDataSetsLength_AfterCreation() (gas: 4185772) +ClientDataSetPaginationTest:testClientDataSetsPaginated_FullPage() (gas: 4222256) +ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitExceedsRemaining() (gas: 2655490) +ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 4249577) +ClientDataSetPaginationTest:testClientDataSetsPaginated_OffsetBeyondLength() (gas: 2646595) +ClientDataSetPaginationTest:testClientDataSetsPaginated_SecondPage() (gas: 4217340) +ClientDataSetPaginationTest:testCreateDataSetAddPieces() (gas: 2912480) +ClientDataSetPaginationTest:testCreateDataSetCreatesRail() (gas: 2304722) +ClientDataSetPaginationTest:testCreateDataSetNoCDN() (gas: 2811811) +ClientDataSetPaginationTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2060878) +ClientDataSetPaginationTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2129939) +ClientDataSetPaginationTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1229916) +ClientDataSetPaginationTest:testDataSetMetaDataWithAllBoundaries() (gas: 8459991) +ClientDataSetPaginationTest:testDataSetMetadataEmpty() (gas: 992963) +ClientDataSetPaginationTest:testDataSetMetadataKeyCountBoundaries() (gas: 5360988) +ClientDataSetPaginationTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2419693) +ClientDataSetPaginationTest:testDataSetMetadataStorage() (gas: 1104655) +ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1901849) +ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleKeys() (gas: 1316787) +ClientDataSetPaginationTest:testDataSetMetadataValueLengthBoundaries() (gas: 2652293) +ClientDataSetPaginationTest:testEmptyStringMetadata() (gas: 2172143) +ClientDataSetPaginationTest:testFilecoinServiceDeployedEvent() (gas: 5586024) +ClientDataSetPaginationTest:testGetClientDataSetsLength_AfterCreation() (gas: 4209769) ClientDataSetPaginationTest:testGetClientDataSetsLength_Empty() (gas: 23038) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5092687) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5426272) ClientDataSetPaginationTest:testGetClientDataSetsPaginated_Empty() (gas: 23118) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ExcludesDeletedDataSets() (gas: 3565620) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_FullPage() (gas: 4231180) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_IncludesTerminatedDataSets() (gas: 2747595) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 3466064) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_OffsetBeyondLength() (gas: 2641150) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_SecondPage() (gas: 4215382) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ExcludesDeletedDataSets() (gas: 3910992) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_FullPage() (gas: 4318529) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_IncludesTerminatedDataSets() (gas: 2876167) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 3558274) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_OffsetBeyondLength() (gas: 2647271) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_SecondPage() (gas: 4282781) ClientDataSetPaginationTest:testGetClientDataSets_EmptyClient() (gas: 27405) -ClientDataSetPaginationTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797642) -ClientDataSetPaginationTest:testGetClientDataSets_MultipleDataSets() (gas: 1933755) -ClientDataSetPaginationTest:testGetClientDataSets_SingleDataSet() (gas: 1143313) -ClientDataSetPaginationTest:testGetClientDataSets_TerminatedDataSets() (gas: 2782128) +ClientDataSetPaginationTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3195196) +ClientDataSetPaginationTest:testGetClientDataSets_MultipleDataSets() (gas: 1942887) +ClientDataSetPaginationTest:testGetClientDataSets_SingleDataSet() (gas: 1105209) +ClientDataSetPaginationTest:testGetClientDataSets_TerminatedDataSets() (gas: 3031736) ClientDataSetPaginationTest:testGetEffectiveRatesValues() (gas: 21620) -ClientDataSetPaginationTest:testGetPieceMetadata() (gas: 2083158) +ClientDataSetPaginationTest:testGetPieceMetadata() (gas: 2150678) ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) -ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentKey() (gas: 1866327) -ClientDataSetPaginationTest:testGetPieceMetdataAllKeys() (gas: 2071140) +ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentKey() (gas: 1895767) +ClientDataSetPaginationTest:testGetPieceMetdataAllKeys() (gas: 2107660) ClientDataSetPaginationTest:testGetServicePriceValues() (gas: 28477) ClientDataSetPaginationTest:testGlobalParameters() (gas: 25061) -ClientDataSetPaginationTest:testInitialState() (gas: 55118) -ClientDataSetPaginationTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1318859) -ClientDataSetPaginationTest:testInsufficientFunds_BelowMinimum() (gas: 538094) -ClientDataSetPaginationTest:testInsufficientFunds_ExactMinimum() (gas: 1117986) -ClientDataSetPaginationTest:testInsufficientFunds_JustAboveMinimum() (gas: 1119349) -ClientDataSetPaginationTest:testMetadataQueries() (gas: 4554441) -ClientDataSetPaginationTest:testMinimumPricing_CrossoverPoint() (gas: 21586) +ClientDataSetPaginationTest:testInitialState() (gas: 97618) +ClientDataSetPaginationTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1375699) +ClientDataSetPaginationTest:testInsufficientFunds_BelowMinimum() (gas: 690826) +ClientDataSetPaginationTest:testInsufficientFunds_ExactMinimum() (gas: 1087630) +ClientDataSetPaginationTest:testInsufficientFunds_JustAboveMinimum() (gas: 1088957) +ClientDataSetPaginationTest:testMetadataQueries() (gas: 4787129) +ClientDataSetPaginationTest:testMinimumPricing_CrossoverPoint() (gas: 32586) ClientDataSetPaginationTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20980) -ClientDataSetPaginationTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 22705) -ClientDataSetPaginationTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 25208) -ClientDataSetPaginationTest:testNonceCannotBeReusedAcrossOperations() (gas: 1359931) -ClientDataSetPaginationTest:testOperatorApproval_AllSufficient() (gas: 1118647) -ClientDataSetPaginationTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 546908) -ClientDataSetPaginationTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 545206) -ClientDataSetPaginationTest:testOperatorApproval_InsufficientRateAllowance() (gas: 545027) -ClientDataSetPaginationTest:testOperatorApproval_NotApproved() (gas: 464923) -ClientDataSetPaginationTest:testPieceMetadataAllBoundaries() (gas: 7727676) -ClientDataSetPaginationTest:testPieceMetadataArrayMismatchErrors() (gas: 1219157) -ClientDataSetPaginationTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1747699) -ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1171902) -ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1173508) -ClientDataSetPaginationTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1352470) -ClientDataSetPaginationTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2111816) -ClientDataSetPaginationTest:testPieceMetadataKeyCountBoundaries() (gas: 3809995) -ClientDataSetPaginationTest:testPieceMetadataKeyLengthBoundaries() (gas: 3235038) -ClientDataSetPaginationTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 1889441) -ClientDataSetPaginationTest:testPieceMetadataStorageAndRetrieval() (gas: 2070377) -ClientDataSetPaginationTest:testPieceMetadataValueLengthBoundaries() (gas: 3433662) -ClientDataSetPaginationTest:testProvenPeriods() (gas: 71805184) -ClientDataSetPaginationTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1786600) -ClientDataSetPaginationTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1062395) -ClientDataSetPaginationTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19731) -ClientDataSetPaginationTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062437) -ClientDataSetPaginationTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773474) -ClientDataSetPaginationTest:testRegression_CDNDataSetCleanup() (gas: 4217379) -ClientDataSetPaginationTest:testServiceNameAndDescriptionValidation() (gas: 19790104) -ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118343) -ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119641) -ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121545) -ClientDataSetPaginationTest:testServiceProviderChangedSuccessDecoupled() (gas: 1121009) -ClientDataSetPaginationTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1122795) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 1938279) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 1881220) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 1875219) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1829118) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1049681) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 1874999) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1775809) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1737519) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 24116) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1730020) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1832648) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1833951) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1739379) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 1875807) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1734497) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1727560) -ClientDataSetPaginationTest:testTerminateCDNServiceLifecycle() (gas: 1904119) -ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 1679147) -ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1778833) -ClientDataSetPaginationTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 1895353) -ClientDataSetPaginationTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1052877) -ClientDataSetPaginationTest:testTerminateServiceLifecycle() (gas: 1871830) -ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 1754166) -ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 1840008) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 1843142) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 21875) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1772656) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1044831) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1780544) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 1835697) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 1884990) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 1915069) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_Success() (gas: 1802391) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766136) -ClientDataSetPaginationTest:testTransferCDNController() (gas: 34590) -ClientDataSetPaginationTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19065) -ClientDataSetPaginationTest:testUpgrade() (gas: 11496887) -ExtsloadTest:test_extsload() (gas: 40763) -ExtsloadTest:test_extsloadStruct() (gas: 61981) -FilecoinWarmStorageServiceOwnerTest:testOwnerFieldSetCorrectlyOnDataSetCreation() (gas: 1117542) -FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForUnregisteredProvider() (gas: 1097796) -FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForWrongOldOwner() (gas: 1102078) -FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedSucceedsForAnyRegisteredProvider() (gas: 1100034) -FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedUpdatesOnlyOwnerField() (gas: 1102148) +ClientDataSetPaginationTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 39705) +ClientDataSetPaginationTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 58208) +ClientDataSetPaginationTest:testNonceCannotBeReusedAcrossOperations() (gas: 1417171) +ClientDataSetPaginationTest:testOperatorApproval_AllSufficient() (gas: 1088303) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 707736) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 706010) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientRateAllowance() (gas: 705795) +ClientDataSetPaginationTest:testOperatorApproval_NotApproved() (gas: 625427) +ClientDataSetPaginationTest:testPieceMetadataAllBoundaries() (gas: 8082945) +ClientDataSetPaginationTest:testPieceMetadataArrayMismatchErrors() (gas: 1226097) +ClientDataSetPaginationTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1715295) +ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1145714) +ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1147356) +ClientDataSetPaginationTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1399570) +ClientDataSetPaginationTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2212200) +ClientDataSetPaginationTest:testPieceMetadataKeyCountBoundaries() (gas: 4489583) +ClientDataSetPaginationTest:testPieceMetadataKeyLengthBoundaries() (gas: 3707886) +ClientDataSetPaginationTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2081509) +ClientDataSetPaginationTest:testPieceMetadataStorageAndRetrieval() (gas: 2106897) +ClientDataSetPaginationTest:testPieceMetadataValueLengthBoundaries() (gas: 3939166) +ClientDataSetPaginationTest:testProvenPeriods() (gas: 358323545) +ClientDataSetPaginationTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1872648) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1049423) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41455) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1047249) +ClientDataSetPaginationTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1791798) +ClientDataSetPaginationTest:testRegression_CDNDataSetCleanup() (gas: 6041179) +ClientDataSetPaginationTest:testServiceNameAndDescriptionValidation() (gas: 21834208) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1074707) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1078289) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1080193) +ClientDataSetPaginationTest:testServiceProviderChangedSuccessDecoupled() (gas: 1087185) +ClientDataSetPaginationTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1090007) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2258123) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2183864) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2056447) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1962646) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1009005) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2056251) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1847681) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1703283) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45648) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1683092) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1986528) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1987855) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1705143) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2104559) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1707625) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1680632) +ClientDataSetPaginationTest:testTerminateCDNServiceLifecycle() (gas: 2331443) +ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2042063) +ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1993053) +ClientDataSetPaginationTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2370369) +ClientDataSetPaginationTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1016897) +ClientDataSetPaginationTest:testTerminateServiceLifecycle() (gas: 2899405) +ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2259017) +ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2110632) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2129970) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43467) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1859892) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1006155) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1949700) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2024053) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2298530) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2345513) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_Success() (gas: 1972623) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1862208) +ClientDataSetPaginationTest:testTransferCDNController() (gas: 132350) +ClientDataSetPaginationTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40257) +ClientDataSetPaginationTest:testUpgrade() (gas: 12835627) +ExtsloadTest:test_extsload() (gas: 85079) +ExtsloadTest:test_extsloadStruct() (gas: 118113) +FilecoinWarmStorageServiceOwnerTest:testOwnerFieldSetCorrectlyOnDataSetCreation() (gas: 1079962) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForUnregisteredProvider() (gas: 1056480) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForWrongOldOwner() (gas: 1060750) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedSucceedsForAnyRegisteredProvider() (gas: 1058706) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedUpdatesOnlyOwnerField() (gas: 1068348) FilecoinWarmStorageServiceSignatureTest:testRecoverSignerInvalidLength() (gas: 13126) FilecoinWarmStorageServiceSignatureTest:testRecoverSignerInvalidValue() (gas: 13067) -FilecoinWarmStorageServiceSignatureTest:testRecoverSignerWithValidSignature() (gas: 21927) -FilecoinWarmStorageServiceSignatureTest:testRecoverSignerWithWrongSigner() (gas: 24579) -FilecoinWarmStorageServiceTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407722) -FilecoinWarmStorageServiceTest:testAddPiecesNonceReplayProtection() (gas: 1339604) -FilecoinWarmStorageServiceTest:testAddPiecesNonceUniquePerPayer() (gas: 2073310) -FilecoinWarmStorageServiceTest:testAddPieces_RateUpdatedImmediately() (gas: 1353152) -FilecoinWarmStorageServiceTest:testCreateDataSetAddPieces() (gas: 2486440) -FilecoinWarmStorageServiceTest:testCreateDataSetCreatesRail() (gas: 2187755) -FilecoinWarmStorageServiceTest:testCreateDataSetNoCDN() (gas: 2152585) -FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2111916) -FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2122197) -FilecoinWarmStorageServiceTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1274992) -FilecoinWarmStorageServiceTest:testDataSetMetaDataWithAllBoundaries() (gas: 7004399) -FilecoinWarmStorageServiceTest:testDataSetMetadataEmpty() (gas: 1051905) -FilecoinWarmStorageServiceTest:testDataSetMetadataKeyCountBoundaries() (gas: 4336248) -FilecoinWarmStorageServiceTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2156293) -FilecoinWarmStorageServiceTest:testDataSetMetadataStorage() (gas: 1143407) -FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909085) -FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300091) -FilecoinWarmStorageServiceTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356405) -FilecoinWarmStorageServiceTest:testEmptyStringMetadata() (gas: 2081395) -FilecoinWarmStorageServiceTest:testFilecoinServiceDeployedEvent() (gas: 5080730) +FilecoinWarmStorageServiceSignatureTest:testRecoverSignerWithValidSignature() (gas: 24427) +FilecoinWarmStorageServiceSignatureTest:testRecoverSignerWithWrongSigner() (gas: 27079) +FilecoinWarmStorageServiceTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1522426) +FilecoinWarmStorageServiceTest:testAddPiecesNonceReplayProtection() (gas: 1401500) +FilecoinWarmStorageServiceTest:testAddPiecesNonceUniquePerPayer() (gas: 2056946) +FilecoinWarmStorageServiceTest:testAddPieces_RateUpdatedImmediately() (gas: 1496276) +FilecoinWarmStorageServiceTest:testCreateDataSetAddPieces() (gas: 2912304) +FilecoinWarmStorageServiceTest:testCreateDataSetCreatesRail() (gas: 2304343) +FilecoinWarmStorageServiceTest:testCreateDataSetNoCDN() (gas: 2811723) +FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2060504) +FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2129785) +FilecoinWarmStorageServiceTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1229784) +FilecoinWarmStorageServiceTest:testDataSetMetaDataWithAllBoundaries() (gas: 8459903) +FilecoinWarmStorageServiceTest:testDataSetMetadataEmpty() (gas: 992721) +FilecoinWarmStorageServiceTest:testDataSetMetadataKeyCountBoundaries() (gas: 5360988) +FilecoinWarmStorageServiceTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2419605) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorage() (gas: 1104303) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1901717) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleKeys() (gas: 1316611) +FilecoinWarmStorageServiceTest:testDataSetMetadataValueLengthBoundaries() (gas: 2651941) +FilecoinWarmStorageServiceTest:testEmptyStringMetadata() (gas: 2172011) +FilecoinWarmStorageServiceTest:testFilecoinServiceDeployedEvent() (gas: 5585826) FilecoinWarmStorageServiceTest:testGetClientDataSets_EmptyClient() (gas: 27053) -FilecoinWarmStorageServiceTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797528) -FilecoinWarmStorageServiceTest:testGetClientDataSets_MultipleDataSets() (gas: 1933358) -FilecoinWarmStorageServiceTest:testGetClientDataSets_SingleDataSet() (gas: 1143269) -FilecoinWarmStorageServiceTest:testGetClientDataSets_TerminatedDataSets() (gas: 2781886) +FilecoinWarmStorageServiceTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3195054) +FilecoinWarmStorageServiceTest:testGetClientDataSets_MultipleDataSets() (gas: 1942490) +FilecoinWarmStorageServiceTest:testGetClientDataSets_SingleDataSet() (gas: 1105165) +FilecoinWarmStorageServiceTest:testGetClientDataSets_TerminatedDataSets() (gas: 3031494) FilecoinWarmStorageServiceTest:testGetEffectiveRatesValues() (gas: 21488) -FilecoinWarmStorageServiceTest:testGetPieceMetadata() (gas: 2082850) +FilecoinWarmStorageServiceTest:testGetPieceMetadata() (gas: 2150370) FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) -FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentKey() (gas: 1865953) -FilecoinWarmStorageServiceTest:testGetPieceMetdataAllKeys() (gas: 2070788) +FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentKey() (gas: 1895393) +FilecoinWarmStorageServiceTest:testGetPieceMetdataAllKeys() (gas: 2107308) FilecoinWarmStorageServiceTest:testGetServicePriceValues() (gas: 28169) FilecoinWarmStorageServiceTest:testGlobalParameters() (gas: 24995) -FilecoinWarmStorageServiceTest:testInitialState() (gas: 54876) -FilecoinWarmStorageServiceTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1318815) -FilecoinWarmStorageServiceTest:testInsufficientFunds_BelowMinimum() (gas: 537940) -FilecoinWarmStorageServiceTest:testInsufficientFunds_ExactMinimum() (gas: 1117810) -FilecoinWarmStorageServiceTest:testInsufficientFunds_JustAboveMinimum() (gas: 1118997) -FilecoinWarmStorageServiceTest:testMetadataQueries() (gas: 4554265) -FilecoinWarmStorageServiceTest:testMinimumPricing_CrossoverPoint() (gas: 21454) +FilecoinWarmStorageServiceTest:testInitialState() (gas: 97376) +FilecoinWarmStorageServiceTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1375655) +FilecoinWarmStorageServiceTest:testInsufficientFunds_BelowMinimum() (gas: 690672) +FilecoinWarmStorageServiceTest:testInsufficientFunds_ExactMinimum() (gas: 1087454) +FilecoinWarmStorageServiceTest:testInsufficientFunds_JustAboveMinimum() (gas: 1088605) +FilecoinWarmStorageServiceTest:testMetadataQueries() (gas: 4786953) +FilecoinWarmStorageServiceTest:testMinimumPricing_CrossoverPoint() (gas: 32454) FilecoinWarmStorageServiceTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20672) -FilecoinWarmStorageServiceTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 22551) -FilecoinWarmStorageServiceTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 25164) -FilecoinWarmStorageServiceTest:testNonceCannotBeReusedAcrossOperations() (gas: 1359777) -FilecoinWarmStorageServiceTest:testOperatorApproval_AllSufficient() (gas: 1118427) -FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 546534) -FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 545030) -FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientRateAllowance() (gas: 544851) -FilecoinWarmStorageServiceTest:testOperatorApproval_NotApproved() (gas: 464769) -FilecoinWarmStorageServiceTest:testPieceMetadataAllBoundaries() (gas: 7727610) -FilecoinWarmStorageServiceTest:testPieceMetadataArrayMismatchErrors() (gas: 1219025) -FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1747457) -FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1171902) -FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1173354) -FilecoinWarmStorageServiceTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1352294) -FilecoinWarmStorageServiceTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2111542) -FilecoinWarmStorageServiceTest:testPieceMetadataKeyCountBoundaries() (gas: 3809907) -FilecoinWarmStorageServiceTest:testPieceMetadataKeyLengthBoundaries() (gas: 3234796) -FilecoinWarmStorageServiceTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 1889309) -FilecoinWarmStorageServiceTest:testPieceMetadataStorageAndRetrieval() (gas: 2070003) -FilecoinWarmStorageServiceTest:testPieceMetadataValueLengthBoundaries() (gas: 3433288) -FilecoinWarmStorageServiceTest:testProvenPeriods() (gas: 71805043) -FilecoinWarmStorageServiceTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1786248) -FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1062307) -FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19665) -FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062305) -FilecoinWarmStorageServiceTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773320) -FilecoinWarmStorageServiceTest:testRegression_CDNDataSetCleanup() (gas: 4217097) -FilecoinWarmStorageServiceTest:testServiceNameAndDescriptionValidation() (gas: 19790104) -FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118145) -FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119509) -FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121303) -FilecoinWarmStorageServiceTest:testServiceProviderChangedSuccessDecoupled() (gas: 1120921) -FilecoinWarmStorageServiceTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1122619) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 1938191) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 1881132) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 1875087) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1828942) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1049373) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 1874911) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1775655) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1737387) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 23764) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1729822) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1832472) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1833577) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1739027) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 1875675) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1734299) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1727428) -FilecoinWarmStorageServiceTest:testTerminateCDNServiceLifecycle() (gas: 1903943) -FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 1679076) -FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1778833) -FilecoinWarmStorageServiceTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 1895199) -FilecoinWarmStorageServiceTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1052679) -FilecoinWarmStorageServiceTest:testTerminateServiceLifecycle() (gas: 1871724) -FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 1753884) -FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 1839700) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 1843054) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 21567) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1772524) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1044677) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1780522) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 1835653) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 1884704) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 1914981) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1765938) -FilecoinWarmStorageServiceTest:testTransferCDNController() (gas: 34524) -FilecoinWarmStorageServiceTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) -FilecoinWarmStorageServiceTest:testUpgrade() (gas: 11496689) -FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriod() (gas: 1646755) -FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriodWithInvalidParameters() (gas: 45444) -FilecoinWarmStorageServiceUpgradeTest:testMigrate() (gas: 35120) -FilecoinWarmStorageServiceUpgradeTest:testMigrateOnlyOnce() (gas: 28727) -FilecoinWarmStorageServiceUpgradeTest:testMigrateWithViewContract() (gas: 1650781) -FilecoinWarmStorageServiceUpgradeTest:testNextPDPChallengeWindowStartThroughView() (gas: 1633676) -FilecoinWarmStorageServiceUpgradeTest:testSetViewContract() (gas: 1634377) +FilecoinWarmStorageServiceTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 39551) +FilecoinWarmStorageServiceTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 58164) +FilecoinWarmStorageServiceTest:testNonceCannotBeReusedAcrossOperations() (gas: 1417017) +FilecoinWarmStorageServiceTest:testOperatorApproval_AllSufficient() (gas: 1088083) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 707362) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 705834) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientRateAllowance() (gas: 705619) +FilecoinWarmStorageServiceTest:testOperatorApproval_NotApproved() (gas: 625273) +FilecoinWarmStorageServiceTest:testPieceMetadataAllBoundaries() (gas: 8082879) +FilecoinWarmStorageServiceTest:testPieceMetadataArrayMismatchErrors() (gas: 1225965) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1715053) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1145714) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1147202) +FilecoinWarmStorageServiceTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1399394) +FilecoinWarmStorageServiceTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2211926) +FilecoinWarmStorageServiceTest:testPieceMetadataKeyCountBoundaries() (gas: 4489495) +FilecoinWarmStorageServiceTest:testPieceMetadataKeyLengthBoundaries() (gas: 3707644) +FilecoinWarmStorageServiceTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2081377) +FilecoinWarmStorageServiceTest:testPieceMetadataStorageAndRetrieval() (gas: 2106523) +FilecoinWarmStorageServiceTest:testPieceMetadataValueLengthBoundaries() (gas: 3938792) +FilecoinWarmStorageServiceTest:testProvenPeriods() (gas: 358323369) +FilecoinWarmStorageServiceTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1872296) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1049335) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41389) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1047117) +FilecoinWarmStorageServiceTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1791644) +FilecoinWarmStorageServiceTest:testRegression_CDNDataSetCleanup() (gas: 6040827) +FilecoinWarmStorageServiceTest:testServiceNameAndDescriptionValidation() (gas: 21834208) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1074509) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1078157) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1079951) +FilecoinWarmStorageServiceTest:testServiceProviderChangedSuccessDecoupled() (gas: 1087097) +FilecoinWarmStorageServiceTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1089831) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2258035) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2183776) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2056315) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1962470) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1008697) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2056163) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1847527) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1703151) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45296) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1682894) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1986352) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1987481) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1704791) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2104427) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1707427) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1680500) +FilecoinWarmStorageServiceTest:testTerminateCDNServiceLifecycle() (gas: 2331267) +FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2041975) +FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1993053) +FilecoinWarmStorageServiceTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2370215) +FilecoinWarmStorageServiceTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1016699) +FilecoinWarmStorageServiceTest:testTerminateServiceLifecycle() (gas: 2899273) +FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2258665) +FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2110324) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2129882) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43159) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1859760) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1006001) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1949678) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2024009) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2298244) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2345425) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_Success() (gas: 1972601) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1862010) +FilecoinWarmStorageServiceTest:testTransferCDNController() (gas: 132284) +FilecoinWarmStorageServiceTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40235) +FilecoinWarmStorageServiceTest:testUpgrade() (gas: 12835429) +FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriod() (gas: 1880553) +FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriodWithInvalidParameters() (gas: 130796) +FilecoinWarmStorageServiceUpgradeTest:testMigrate() (gas: 67312) +FilecoinWarmStorageServiceUpgradeTest:testMigrateOnlyOnce() (gas: 79611) +FilecoinWarmStorageServiceUpgradeTest:testMigrateWithViewContract() (gas: 1864235) +FilecoinWarmStorageServiceUpgradeTest:testNextPDPChallengeWindowStartThroughView() (gas: 1835630) +FilecoinWarmStorageServiceUpgradeTest:testSetViewContract() (gas: 1865547) MetadataSignatureFixturesTest:testContract() (gas: 2593) MetadataSignatureFixturesTest:testEIP712TypeStructures() (gas: 27096) -MetadataSignatureFixturesTest:testExternalSignatures() (gas: 58165) -MetadataSignatureFixturesTest:testGenerateFixtures() (gas: 161303) -PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1715966) -PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1689915) -PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 1938816) -PoRepDealActivationTest:testExactBalanceSufficient() (gas: 1960143) -PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1691239) -PoRepDealActivationTest:testPieceAddedOnlyService() (gas: 1689526) -PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1693035) -PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1690700) -PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2130233) -PoRepDealExtendTest:testExtend() (gas: 160793) -PoRepDealExtendTest:testExtendRevertsAfterExpiry() (gas: 14364) -PoRepDealExtendTest:testExtendRevertsIfNotClient() (gas: 8948) -PoRepDealExtendTest:testExtendRevertsWhenFaulted() (gas: 200422) -PoRepDealExtendTest:testSweepRevertsBeforeExpiry() (gas: 10838) -PoRepDealSectorStatusTest:testBothSectorsRecovered() (gas: 579728) -PoRepDealSectorStatusTest:testClientCannotDirectlyTerminateRail() (gas: 68775) -PoRepDealSectorStatusTest:testSectorExpiredAfterActivation() (gas: 307833) -PoRepDealSectorStatusTest:testSectorExpiredAfterDealEnd() (gas: 12221) -PoRepDealSectorStatusTest:testSectorExpiredAfterFaulty() (gas: 342575) -PoRepDealSectorStatusTest:testSectorExpiredNotInDeal() (gas: 13944) -PoRepDealSectorStatusTest:testSectorExpiredRevertsIfStillActive() (gas: 28491) -PoRepDealSectorStatusTest:testSectorExpiredRevertsNotYetCompacted() (gas: 27985) -PoRepDealSectorStatusTest:testSectorFaultyAfterDealEnd() (gas: 12439) -PoRepDealSectorStatusTest:testSectorFaultyAlreadyFailed() (gas: 92362) -PoRepDealSectorStatusTest:testSectorFaultyNotInDeal() (gas: 14206) -PoRepDealSectorStatusTest:testSectorFaultyRevertsIfStillActive() (gas: 28416) -PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 485979) -PoRepDealSectorStatusTest:testSectorRecoveredNotFailed() (gas: 12143) -PoRepDealSectorStatusTest:testSectorRecoveredStillFaulty() (gas: 99979) -PoRepDealSectorStatusTest:testSweepUnauthorized() (gas: 165622) -PoRepDealSectorStatusTest:testTerminateClientUnauthorized() (gas: 19353) -PoRepDealSectorStatusTest:testTerminatePayeeReceiverUnauthorized() (gas: 19611) -PoRepDealSectorStatusTest:testTerminateReceiverNonceUnauthorized() (gas: 19331) -PoRepDealSectorStatusTest:testTerminateStrangerUnauthorized() (gas: 18892) -PoRepDealSectorStatusTest:testUpdateLockupsPayeeReceiverUnauthorized() (gas: 19016) -PoRepDealSectorStatusTest:testUpdateLockupsReceiverNonceUnauthorized() (gas: 18912) -PoRepDealSectorStatusTest:testUpdateLockupsStrangerUnauthorized() (gas: 18231) -PoRepPayeeTest:testOwner() (gas: 29657) -PoRepPayeeTest:testSudo() (gas: 70691) -PoRepPayeeTest:testSudoForwardsInnerRevert() (gas: 76817) -PoRepPayeeTest:testSudoUnauthorized() (gas: 59756) -PoRepServiceTest:testCreateDealNotMiner() (gas: 18766) -PoRepServiceTest:testCreateReceiver() (gas: 274659) -PoRepServiceTest:testForbiddenMethod() (gas: 11458) -PoRepServiceTest:testUpdateLockupsNotDeal() (gas: 9469) +MetadataSignatureFixturesTest:testExternalSignatures() (gas: 75665) +MetadataSignatureFixturesTest:testGenerateFixtures() (gas: 223803) +PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1787998) +PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1736698) +PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 2100228) +PoRepDealActivationTest:testExactBalanceSufficient() (gas: 2307379) +PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1741707) +PoRepDealActivationTest:testPieceAddedOnlyService() (gas: 1737096) +PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1743515) +PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1740206) +PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2442253) +PoRepDealExtendTest:testExtend() (gas: 197953) +PoRepDealExtendTest:testExtendRevertsAfterExpiry() (gas: 35592) +PoRepDealExtendTest:testExtendRevertsIfNotClient() (gas: 30176) +PoRepDealExtendTest:testExtendRevertsWhenFaulted() (gas: 265734) +PoRepDealExtendTest:testSweepRevertsBeforeExpiry() (gas: 32270) +PoRepDealSectorStatusTest:testBothSectorsRecovered() (gas: 1107078) +PoRepDealSectorStatusTest:testClientCannotDirectlyTerminateRail() (gas: 89979) +PoRepDealSectorStatusTest:testSectorExpiredAfterActivation() (gas: 304131) +PoRepDealSectorStatusTest:testSectorExpiredAfterDealEnd() (gas: 34061) +PoRepDealSectorStatusTest:testSectorExpiredAfterFaulty() (gas: 521954) +PoRepDealSectorStatusTest:testSectorExpiredNotInDeal() (gas: 35784) +PoRepDealSectorStatusTest:testSectorExpiredRevertsIfStillActive() (gas: 50331) +PoRepDealSectorStatusTest:testSectorExpiredRevertsNotYetCompacted() (gas: 50581) +PoRepDealSectorStatusTest:testSectorFaultyAfterDealEnd() (gas: 34279) +PoRepDealSectorStatusTest:testSectorFaultyAlreadyFailed() (gas: 163086) +PoRepDealSectorStatusTest:testSectorFaultyNotInDeal() (gas: 36046) +PoRepDealSectorStatusTest:testSectorFaultyRevertsIfStillActive() (gas: 50256) +PoRepDealSectorStatusTest:testSectorRecoverFaultyAfterActivation() (gas: 856349) +PoRepDealSectorStatusTest:testSectorRecoveredNotFailed() (gas: 33615) +PoRepDealSectorStatusTest:testSectorRecoveredStillFaulty() (gas: 175335) +PoRepDealSectorStatusTest:testSweepUnauthorized() (gas: 216654) +PoRepDealSectorStatusTest:testTerminateClientUnauthorized() (gas: 45562) +PoRepDealSectorStatusTest:testTerminatePayeeReceiverUnauthorized() (gas: 45820) +PoRepDealSectorStatusTest:testTerminateReceiverNonceUnauthorized() (gas: 45540) +PoRepDealSectorStatusTest:testTerminateStrangerUnauthorized() (gas: 45101) +PoRepDealSectorStatusTest:testUpdateLockupsPayeeReceiverUnauthorized() (gas: 45439) +PoRepDealSectorStatusTest:testUpdateLockupsReceiverNonceUnauthorized() (gas: 45335) +PoRepDealSectorStatusTest:testUpdateLockupsStrangerUnauthorized() (gas: 44654) +PoRepPayeeTest:testOwner() (gas: 53221) +PoRepPayeeTest:testSudo() (gas: 94891) +PoRepPayeeTest:testSudoForwardsInnerRevert() (gas: 155667) +PoRepPayeeTest:testSudoUnauthorized() (gas: 107528) +PoRepServiceTest:testCreateDealNotMiner() (gas: 40898) +PoRepServiceTest:testCreateReceiver() (gas: 300863) +PoRepServiceTest:testForbiddenMethod() (gas: 33401) +PoRepServiceTest:testUpdateLockupsNotDeal() (gas: 31362) ProductTypesTest:testPDPKeys() (gas: 14050) -ProviderIdSetTest:testAddDuplicates() (gas: 120993) -ProviderIdSetTest:testAddGet() (gas: 86192835) -ProviderIdSetTest:testAddManyDuplicates() (gas: 781593) -ProviderIdSetTest:testAddRemoveLargeIds() (gas: 1648446) -ProviderIdSetTest:testOwnable() (gas: 27132) -ProviderIdSetTest:testProviderIdTooLarge() (gas: 64247) -ProviderIdSetTest:testRemoveFIFO() (gas: 8539655) -ProviderIdSetTest:testRemoveLIFO() (gas: 8434985) -ProviderValidationTest:testAddAndRemoveApprovedProvider() (gas: 83676) -ProviderValidationTest:testAddApprovedProviderAlreadyApproved() (gas: 94744) -ProviderValidationTest:testConsistencyBetweenIsApprovedAndGetAll() (gas: 281862) -ProviderValidationTest:testGetApprovedProviders() (gas: 180772) -ProviderValidationTest:testGetApprovedProvidersLength() (gas: 161037) -ProviderValidationTest:testGetApprovedProvidersPaginated() (gas: 319380) -ProviderValidationTest:testGetApprovedProvidersPaginatedConsistency() (gas: 567595) -ProviderValidationTest:testGetApprovedProvidersPaginatedEdgeCases() (gas: 105171) -ProviderValidationTest:testGetApprovedProvidersPaginatedGasEfficiency() (gas: 4868016) -ProviderValidationTest:testGetApprovedProvidersWithSingleProvider() (gas: 78641) -ProviderValidationTest:testOnlyOwnerCanManageApprovedProviders() (gas: 98546) -ProviderValidationTest:testProviderApprovedCanCreateDataset() (gas: 1895500) -ProviderValidationTest:testProviderNotRegistered() (gas: 45803) -ProviderValidationTest:testProviderRegisteredButNotApproved() (gas: 1753221) -ProviderValidationTest:testRemoveApprovedProviderNotInList() (gas: 77221) -ServiceProviderRegistryFullTest:testCanRemoveLastProduct() (gas: 652413) -ServiceProviderRegistryFullTest:testCanReregisterAfterRemoval() (gas: 1231197) -ServiceProviderRegistryFullTest:testCannotAddProductTwice() (gas: 799103) -ServiceProviderRegistryFullTest:testCannotRegisterTwice() (gas: 770143) -ServiceProviderRegistryFullTest:testCannotRemoveAlreadyRemoved() (gas: 618286) -ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionIfNotOwner() (gas: 762500) -ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionTooLong() (gas: 759871) -ServiceProviderRegistryFullTest:testCannotUpdateRemovedProvider() (gas: 622228) -ServiceProviderRegistryFullTest:testCapabilityUpdateClearsOldValues() (gas: 1123096) -ServiceProviderRegistryFullTest:testDescriptionTooLong() (gas: 57764) -ServiceProviderRegistryFullTest:testDirectMappingAccess() (gas: 968502) -ServiceProviderRegistryFullTest:testEmptyCapabilityKey() (gas: 229552) -ServiceProviderRegistryFullTest:testEmptyCapabilityValue() (gas: 229707) -ServiceProviderRegistryFullTest:testEventTimestampsEmittedCorrectly() (gas: 943613) -ServiceProviderRegistryFullTest:testGetActiveProvidersByProductType() (gas: 1670316) -ServiceProviderRegistryFullTest:testGetAllActiveProviders() (gas: 1584014) -ServiceProviderRegistryFullTest:testGetNonExistentProvider() (gas: 43321) -ServiceProviderRegistryFullTest:testGetProduct() (gas: 855430) -ServiceProviderRegistryFullTest:testGetProductCapabilities() (gas: 1004927) -ServiceProviderRegistryFullTest:testGetProductCapability() (gas: 929980) -ServiceProviderRegistryFullTest:testGetProviderCount() (gas: 1101737) -ServiceProviderRegistryFullTest:testGetProvidersByProductType() (gas: 2091446) -ServiceProviderRegistryFullTest:testInitialState() (gas: 40206) -ServiceProviderRegistryFullTest:testInvalidCapabilityArrayLengthMismatch() (gas: 190885) -ServiceProviderRegistryFullTest:testInvalidCapabilityKeyTooLong() (gas: 222904) -ServiceProviderRegistryFullTest:testInvalidCapabilityValueTooLong() (gas: 223369) -ServiceProviderRegistryFullTest:testMaxCapabilitiesAllowed() (gas: 1719465) -ServiceProviderRegistryFullTest:testMultipleUpdatesInSameBlock() (gas: 1030579) -ServiceProviderRegistryFullTest:testNameTooLongOnRegister() (gas: 74138) -ServiceProviderRegistryFullTest:testNameTooLongOnUpdate() (gas: 794995) -ServiceProviderRegistryFullTest:testOnlyOwnerCanRemove() (gas: 761988) -ServiceProviderRegistryFullTest:testOnlyOwnerCanUpdate() (gas: 767730) -ServiceProviderRegistryFullTest:testProviderHasProduct() (gas: 758883) -ServiceProviderRegistryFullTest:testRegisterMultipleProviders() (gas: 1819919) -ServiceProviderRegistryFullTest:testRegisterProvider() (gas: 1181523) -ServiceProviderRegistryFullTest:testRegisterWithCapabilities() (gas: 1112008) -ServiceProviderRegistryFullTest:testRegisterWithExcessFee() (gas: 69123) -ServiceProviderRegistryFullTest:testRegisterWithInsufficientFee() (gas: 72733) -ServiceProviderRegistryFullTest:testRegisterWithInvalidData() (gas: 409371) -ServiceProviderRegistryFullTest:testRemoveProvider() (gas: 646425) -ServiceProviderRegistryFullTest:testTooManyCapabilities() (gas: 290957) -ServiceProviderRegistryFullTest:testUpdateProduct() (gas: 1039571) -ServiceProviderRegistryFullTest:testUpdateProviderDescription() (gas: 799513) -ServiceProviderRegistryFullTest:testUpdateWithCapabilities() (gas: 1119096) -ServiceProviderRegistryFullTest:testUpdateWithTooManyCapabilities() (gas: 900241) -ServiceProviderRegistryPaginationTest:testActiveProviderCountTracking() (gas: 1620572) -ServiceProviderRegistryPaginationTest:testPaginationConsistencyWithGetAll() (gas: 3423767) -ServiceProviderRegistryPaginationTest:testPaginationEdgeLimits() (gas: 1970846) -ServiceProviderRegistryPaginationTest:testPaginationNoProviders() (gas: 22522) -ServiceProviderRegistryPaginationTest:testPaginationPageBoundaries() (gas: 3196070) -ServiceProviderRegistryPaginationTest:testPaginationSingleProvider() (gas: 771119) -ServiceProviderRegistryPaginationTest:testPaginationWithInactiveProviders() (gas: 2573055) -ServiceProviderRegistryPaginationTest:testSequentialPagination() (gas: 6195116) -ServiceProviderRegistryTest:testAnnouncePlannedUpgrade() (gas: 3743739) -ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidEpoch() (gas: 3691511) -ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidImplementation() (gas: 19753) -ServiceProviderRegistryTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 3693617) -ServiceProviderRegistryTest:testBeneficiaryIsSetCorrectly() (gas: 769225) -ServiceProviderRegistryTest:testCannotRegisterWithZeroBeneficiary() (gas: 37559) -ServiceProviderRegistryTest:testCannotReinitialize() (gas: 16157) -ServiceProviderRegistryTest:testGetProviderPayeeReturnsCorrectAddress() (gas: 762314) -ServiceProviderRegistryTest:testGetProviderPayeeRevertsForInvalidProviderId() (gas: 23125) -ServiceProviderRegistryTest:testGetProviderWorks() (gas: 766462) +ProviderIdSetTest:testAddDuplicates() (gas: 539153) +ProviderIdSetTest:testAddGet() (gas: 145816659) +ProviderIdSetTest:testAddManyDuplicates() (gas: 4221789) +ProviderIdSetTest:testAddRemoveLargeIds() (gas: 5820584) +ProviderIdSetTest:testOwnable() (gas: 177292) +ProviderIdSetTest:testProviderIdTooLarge() (gas: 134767) +ProviderIdSetTest:testRemoveFIFO() (gas: 56310423) +ProviderIdSetTest:testRemoveLIFO() (gas: 55504153) +ProviderValidationTest:testAddAndRemoveApprovedProvider() (gas: 268735) +ProviderValidationTest:testAddApprovedProviderAlreadyApproved() (gas: 156652) +ProviderValidationTest:testConsistencyBetweenIsApprovedAndGetAll() (gas: 734967) +ProviderValidationTest:testGetApprovedProviders() (gas: 475420) +ProviderValidationTest:testGetApprovedProvidersLength() (gas: 365893) +ProviderValidationTest:testGetApprovedProvidersPaginated() (gas: 550600) +ProviderValidationTest:testGetApprovedProvidersPaginatedConsistency() (gas: 966335) +ProviderValidationTest:testGetApprovedProvidersPaginatedEdgeCases() (gas: 162375) +ProviderValidationTest:testGetApprovedProvidersPaginatedGasEfficiency() (gas: 8157616) +ProviderValidationTest:testGetApprovedProvidersWithSingleProvider() (gas: 175073) +ProviderValidationTest:testOnlyOwnerCanManageApprovedProviders() (gas: 168786) +ProviderValidationTest:testProviderApprovedCanCreateDataset() (gas: 1898320) +ProviderValidationTest:testProviderNotRegistered() (gas: 69775) +ProviderValidationTest:testProviderRegisteredButNotApproved() (gas: 1731401) +ProviderValidationTest:testRemoveApprovedProviderNotInList() (gas: 197962) +ServiceProviderRegistryFullTest:testCanRemoveLastProduct() (gas: 976390) +ServiceProviderRegistryFullTest:testCanReregisterAfterRemoval() (gas: 1734718) +ServiceProviderRegistryFullTest:testCannotAddProductTwice() (gas: 877155) +ServiceProviderRegistryFullTest:testCannotRegisterTwice() (gas: 847298) +ServiceProviderRegistryFullTest:testCannotRemoveAlreadyRemoved() (gas: 912219) +ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionIfNotOwner() (gas: 820680) +ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionTooLong() (gas: 830123) +ServiceProviderRegistryFullTest:testCannotUpdateRemovedProvider() (gas: 932529) +ServiceProviderRegistryFullTest:testCapabilityUpdateClearsOldValues() (gas: 1361971) +ServiceProviderRegistryFullTest:testDescriptionTooLong() (gas: 106463) +ServiceProviderRegistryFullTest:testDirectMappingAccess() (gas: 1021306) +ServiceProviderRegistryFullTest:testEmptyCapabilityKey() (gas: 263232) +ServiceProviderRegistryFullTest:testEmptyCapabilityValue() (gas: 263303) +ServiceProviderRegistryFullTest:testEventTimestampsEmittedCorrectly() (gas: 1239208) +ServiceProviderRegistryFullTest:testGetActiveProvidersByProductType() (gas: 2404816) +ServiceProviderRegistryFullTest:testGetAllActiveProviders() (gas: 2226514) +ServiceProviderRegistryFullTest:testGetNonExistentProvider() (gas: 52321) +ServiceProviderRegistryFullTest:testGetProduct() (gas: 991214) +ServiceProviderRegistryFullTest:testGetProductCapabilities() (gas: 1072527) +ServiceProviderRegistryFullTest:testGetProductCapability() (gas: 998644) +ServiceProviderRegistryFullTest:testGetProviderCount() (gas: 1590953) +ServiceProviderRegistryFullTest:testGetProvidersByProductType() (gas: 2405198) +ServiceProviderRegistryFullTest:testInitialState() (gas: 98206) +ServiceProviderRegistryFullTest:testInvalidCapabilityArrayLengthMismatch() (gas: 215157) +ServiceProviderRegistryFullTest:testInvalidCapabilityKeyTooLong() (gas: 256148) +ServiceProviderRegistryFullTest:testInvalidCapabilityValueTooLong() (gas: 258745) +ServiceProviderRegistryFullTest:testMaxCapabilitiesAllowed() (gas: 1896657) +ServiceProviderRegistryFullTest:testMultipleUpdatesInSameBlock() (gas: 1223631) +ServiceProviderRegistryFullTest:testNameTooLongOnRegister() (gas: 118438) +ServiceProviderRegistryFullTest:testNameTooLongOnUpdate() (gas: 863659) +ServiceProviderRegistryFullTest:testOnlyOwnerCanRemove() (gas: 819336) +ServiceProviderRegistryFullTest:testOnlyOwnerCanUpdate() (gas: 840460) +ServiceProviderRegistryFullTest:testProviderHasProduct() (gas: 803667) +ServiceProviderRegistryFullTest:testRegisterMultipleProviders() (gas: 2139227) +ServiceProviderRegistryFullTest:testRegisterProvider() (gas: 1470255) +ServiceProviderRegistryFullTest:testRegisterWithCapabilities() (gas: 1263952) +ServiceProviderRegistryFullTest:testRegisterWithExcessFee() (gas: 110467) +ServiceProviderRegistryFullTest:testRegisterWithInsufficientFee() (gas: 150421) +ServiceProviderRegistryFullTest:testRegisterWithInvalidData() (gas: 473839) +ServiceProviderRegistryFullTest:testRemoveProvider() (gas: 1005829) +ServiceProviderRegistryFullTest:testTooManyCapabilities() (gas: 343261) +ServiceProviderRegistryFullTest:testUpdateProduct() (gas: 1244623) +ServiceProviderRegistryFullTest:testUpdateProviderDescription() (gas: 914777) +ServiceProviderRegistryFullTest:testUpdateWithCapabilities() (gas: 1353468) +ServiceProviderRegistryFullTest:testUpdateWithTooManyCapabilities() (gas: 1004797) +ServiceProviderRegistryPaginationTest:testActiveProviderCountTracking() (gas: 2485324) +ServiceProviderRegistryPaginationTest:testPaginationConsistencyWithGetAll() (gas: 4328415) +ServiceProviderRegistryPaginationTest:testPaginationEdgeLimits() (gas: 2174446) +ServiceProviderRegistryPaginationTest:testPaginationNoProviders() (gas: 40522) +ServiceProviderRegistryPaginationTest:testPaginationPageBoundaries() (gas: 3560870) +ServiceProviderRegistryPaginationTest:testPaginationSingleProvider() (gas: 850519) +ServiceProviderRegistryPaginationTest:testPaginationWithInactiveProviders() (gas: 3701880) +ServiceProviderRegistryPaginationTest:testSequentialPagination() (gas: 6867428) +ServiceProviderRegistryTest:testAnnouncePlannedUpgrade() (gas: 4265051) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidEpoch() (gas: 4061643) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidImplementation() (gas: 41109) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 4061261) +ServiceProviderRegistryTest:testBeneficiaryIsSetCorrectly() (gas: 824101) +ServiceProviderRegistryTest:testCannotRegisterWithZeroBeneficiary() (gas: 78800) +ServiceProviderRegistryTest:testCannotReinitialize() (gas: 37221) +ServiceProviderRegistryTest:testGetProviderPayeeReturnsCorrectAddress() (gas: 809190) +ServiceProviderRegistryTest:testGetProviderPayeeRevertsForInvalidProviderId() (gas: 27625) +ServiceProviderRegistryTest:testGetProviderWorks() (gas: 819338) ServiceProviderRegistryTest:testGetProvidersByIdsEmptyArray() (gas: 19076) -ServiceProviderRegistryTest:testGetProvidersByIdsInactiveProvider() (gas: 671836) +ServiceProviderRegistryTest:testGetProvidersByIdsInactiveProvider() (gas: 970622) ServiceProviderRegistryTest:testGetProvidersByIdsInvalidIds() (gas: 44583) -ServiceProviderRegistryTest:testGetProvidersByIdsMixedValidAndInvalid() (gas: 842971) -ServiceProviderRegistryTest:testGetProvidersByIdsMultipleValidProviders() (gas: 1506539) -ServiceProviderRegistryTest:testGetProvidersByIdsSingleValidProvider() (gas: 827350) -ServiceProviderRegistryTest:testInitialState() (gas: 27401) -ServiceProviderRegistryTest:testIsRegisteredProviderReturnsFalse() (gas: 25300) -ServiceProviderRegistryTest:testOnlyOwnerCanUpgrade() (gas: 3728624) -ServiceProviderRegistryTest:testRegisterProviderWithCapabilities() (gas: 989353) -ServiceProviderRegistryTest:testTransferOwnership() (gas: 25812) -SybilFeeTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407744) -SybilFeeTest:testAddPiecesNonceReplayProtection() (gas: 1339692) -SybilFeeTest:testAddPiecesNonceUniquePerPayer() (gas: 2073376) -SybilFeeTest:testAddPieces_RateUpdatedImmediately() (gas: 1353240) -SybilFeeTest:testCreateDataSetAddPieces() (gas: 2486506) -SybilFeeTest:testCreateDataSetCreatesRail() (gas: 2187871) -SybilFeeTest:testCreateDataSetNoCDN() (gas: 2152585) -SybilFeeTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2112004) -SybilFeeTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2122219) -SybilFeeTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1275014) -SybilFeeTest:testDataSetCreation_BurnRailTerminated() (gas: 1066281) -SybilFeeTest:testDataSetCreation_InsufficientFundsForSybilFee() (gas: 464494) -SybilFeeTest:testDataSetCreation_SybilFeeBurned() (gas: 1056843) -SybilFeeTest:testDataSetCreation_SybilFeeWithCDN() (gas: 1751635) -SybilFeeTest:testDataSetMetaDataWithAllBoundaries() (gas: 7004399) -SybilFeeTest:testDataSetMetadataEmpty() (gas: 1051993) -SybilFeeTest:testDataSetMetadataKeyCountBoundaries() (gas: 4336248) -SybilFeeTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2156293) -SybilFeeTest:testDataSetMetadataStorage() (gas: 1143495) -SybilFeeTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909107) -SybilFeeTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300157) -SybilFeeTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356493) -SybilFeeTest:testEmptyStringMetadata() (gas: 2081417) -SybilFeeTest:testFilecoinServiceDeployedEvent() (gas: 5080796) +ServiceProviderRegistryTest:testGetProvidersByIdsMixedValidAndInvalid() (gas: 896699) +ServiceProviderRegistryTest:testGetProvidersByIdsMultipleValidProviders() (gas: 1633503) +ServiceProviderRegistryTest:testGetProvidersByIdsSingleValidProvider() (gas: 881054) +ServiceProviderRegistryTest:testInitialState() (gas: 41401) +ServiceProviderRegistryTest:testIsRegisteredProviderReturnsFalse() (gas: 32300) +ServiceProviderRegistryTest:testOnlyOwnerCanUpgrade() (gas: 4171412) +ServiceProviderRegistryTest:testRegisterProviderWithCapabilities() (gas: 1131277) +ServiceProviderRegistryTest:testTransferOwnership() (gas: 55516) +SybilFeeTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1522448) +SybilFeeTest:testAddPiecesNonceReplayProtection() (gas: 1401588) +SybilFeeTest:testAddPiecesNonceUniquePerPayer() (gas: 2057012) +SybilFeeTest:testAddPieces_RateUpdatedImmediately() (gas: 1496364) +SybilFeeTest:testCreateDataSetAddPieces() (gas: 2912370) +SybilFeeTest:testCreateDataSetCreatesRail() (gas: 2304459) +SybilFeeTest:testCreateDataSetNoCDN() (gas: 2811723) +SybilFeeTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2060592) +SybilFeeTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2129807) +SybilFeeTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1229806) +SybilFeeTest:testDataSetCreation_BurnRailTerminated() (gas: 1064749) +SybilFeeTest:testDataSetCreation_InsufficientFundsForSybilFee() (gas: 616086) +SybilFeeTest:testDataSetCreation_SybilFeeBurned() (gas: 1056835) +SybilFeeTest:testDataSetCreation_SybilFeeWithCDN() (gas: 1748435) +SybilFeeTest:testDataSetMetaDataWithAllBoundaries() (gas: 8459903) +SybilFeeTest:testDataSetMetadataEmpty() (gas: 992809) +SybilFeeTest:testDataSetMetadataKeyCountBoundaries() (gas: 5360988) +SybilFeeTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2419605) +SybilFeeTest:testDataSetMetadataStorage() (gas: 1104391) +SybilFeeTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1901739) +SybilFeeTest:testDataSetMetadataStorageMultipleKeys() (gas: 1316677) +SybilFeeTest:testDataSetMetadataValueLengthBoundaries() (gas: 2652029) +SybilFeeTest:testEmptyStringMetadata() (gas: 2172033) +SybilFeeTest:testFilecoinServiceDeployedEvent() (gas: 5585892) SybilFeeTest:testGetClientDataSets_EmptyClient() (gas: 27141) -SybilFeeTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797528) -SybilFeeTest:testGetClientDataSets_MultipleDataSets() (gas: 1933446) -SybilFeeTest:testGetClientDataSets_SingleDataSet() (gas: 1143269) -SybilFeeTest:testGetClientDataSets_TerminatedDataSets() (gas: 2781974) +SybilFeeTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3195054) +SybilFeeTest:testGetClientDataSets_MultipleDataSets() (gas: 1942578) +SybilFeeTest:testGetClientDataSets_SingleDataSet() (gas: 1105165) +SybilFeeTest:testGetClientDataSets_TerminatedDataSets() (gas: 3031582) SybilFeeTest:testGetEffectiveRatesValues() (gas: 21510) -SybilFeeTest:testGetPieceMetadata() (gas: 2082938) +SybilFeeTest:testGetPieceMetadata() (gas: 2150458) SybilFeeTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) -SybilFeeTest:testGetPieceMetadata_NonExistentKey() (gas: 1866028) -SybilFeeTest:testGetPieceMetdataAllKeys() (gas: 2070876) +SybilFeeTest:testGetPieceMetadata_NonExistentKey() (gas: 1895468) +SybilFeeTest:testGetPieceMetdataAllKeys() (gas: 2107396) SybilFeeTest:testGetServicePriceValues() (gas: 28257) SybilFeeTest:testGlobalParameters() (gas: 24995) -SybilFeeTest:testInitialState() (gas: 54964) -SybilFeeTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1318815) -SybilFeeTest:testInsufficientFunds_BelowMinimum() (gas: 537984) -SybilFeeTest:testInsufficientFunds_ExactMinimum() (gas: 1117876) -SybilFeeTest:testInsufficientFunds_JustAboveMinimum() (gas: 1119085) -SybilFeeTest:testMetadataQueries() (gas: 4554331) -SybilFeeTest:testMinimumPricing_CrossoverPoint() (gas: 21476) +SybilFeeTest:testInitialState() (gas: 97464) +SybilFeeTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1375655) +SybilFeeTest:testInsufficientFunds_BelowMinimum() (gas: 690716) +SybilFeeTest:testInsufficientFunds_ExactMinimum() (gas: 1087520) +SybilFeeTest:testInsufficientFunds_JustAboveMinimum() (gas: 1088693) +SybilFeeTest:testMetadataQueries() (gas: 4787019) +SybilFeeTest:testMinimumPricing_CrossoverPoint() (gas: 32476) SybilFeeTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20760) -SybilFeeTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 22595) -SybilFeeTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 25164) -SybilFeeTest:testNonceCannotBeReusedAcrossOperations() (gas: 1359821) -SybilFeeTest:testOperatorApproval_AllSufficient() (gas: 1118515) -SybilFeeTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 546622) -SybilFeeTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 545096) -SybilFeeTest:testOperatorApproval_InsufficientRateAllowance() (gas: 544895) -SybilFeeTest:testOperatorApproval_NotApproved() (gas: 464791) -SybilFeeTest:testPieceMetadataAllBoundaries() (gas: 7727610) -SybilFeeTest:testPieceMetadataArrayMismatchErrors() (gas: 1219047) -SybilFeeTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1747545) -SybilFeeTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1171902) -SybilFeeTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1173398) -SybilFeeTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1352338) -SybilFeeTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2111706) -SybilFeeTest:testPieceMetadataKeyCountBoundaries() (gas: 3809907) -SybilFeeTest:testPieceMetadataKeyLengthBoundaries() (gas: 3234884) -SybilFeeTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 1889331) -SybilFeeTest:testPieceMetadataStorageAndRetrieval() (gas: 2070091) -SybilFeeTest:testPieceMetadataValueLengthBoundaries() (gas: 3433376) -SybilFeeTest:testProvenPeriods() (gas: 71805096) -SybilFeeTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1786336) -SybilFeeTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1062307) -SybilFeeTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19665) -SybilFeeTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062327) -SybilFeeTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773364) -SybilFeeTest:testRegression_CDNDataSetCleanup() (gas: 4217189) -SybilFeeTest:testServiceNameAndDescriptionValidation() (gas: 19790104) -SybilFeeTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118211) -SybilFeeTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119531) -SybilFeeTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121391) -SybilFeeTest:testServiceProviderChangedSuccessDecoupled() (gas: 1120921) -SybilFeeTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1122685) -SybilFeeTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 1938191) -SybilFeeTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 1881132) -SybilFeeTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 1875109) -SybilFeeTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1829008) -SybilFeeTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1049461) -SybilFeeTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 1874911) -SybilFeeTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1775699) -SybilFeeTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1737409) -SybilFeeTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 23852) -SybilFeeTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1729910) -SybilFeeTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1832538) -SybilFeeTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1833665) -SybilFeeTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1739115) -SybilFeeTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 1875697) -SybilFeeTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1734387) -SybilFeeTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1727450) -SybilFeeTest:testTerminateCDNServiceLifecycle() (gas: 1904009) -SybilFeeTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 1679076) -SybilFeeTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1778833) -SybilFeeTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 1895221) -SybilFeeTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1052745) -SybilFeeTest:testTerminateServiceLifecycle() (gas: 1871742) -SybilFeeTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 1753955) -SybilFeeTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 1839788) -SybilFeeTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 1843054) -SybilFeeTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 21655) -SybilFeeTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1772546) -SybilFeeTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1044721) -SybilFeeTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1780522) -SybilFeeTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 1835653) -SybilFeeTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 1884792) -SybilFeeTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 1915003) -SybilFeeTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) -SybilFeeTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766004) -SybilFeeTest:testTransferCDNController() (gas: 34524) -SybilFeeTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) -SybilFeeTest:testUpgrade() (gas: 11496777) -ValidatePaymentTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1407788) -ValidatePaymentTest:testAddPiecesNonceReplayProtection() (gas: 1340000) -ValidatePaymentTest:testAddPiecesNonceUniquePerPayer() (gas: 2073464) -ValidatePaymentTest:testAddPieces_RateUpdatedImmediately() (gas: 1353548) -ValidatePaymentTest:testCreateDataSetAddPieces() (gas: 2486572) -ValidatePaymentTest:testCreateDataSetCreatesRail() (gas: 2188085) -ValidatePaymentTest:testCreateDataSetNoCDN() (gas: 2152620) -ValidatePaymentTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2112312) -ValidatePaymentTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2122329) -ValidatePaymentTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1275328) -ValidatePaymentTest:testDataSetDeleted_RevertsIfRailNotSettled() (gas: 1212015) -ValidatePaymentTest:testDataSetDeleted_SucceedsAfterRailSettled() (gas: 1266804) -ValidatePaymentTest:testDataSetMetaDataWithAllBoundaries() (gas: 7004443) -ValidatePaymentTest:testDataSetMetadataEmpty() (gas: 1052169) -ValidatePaymentTest:testDataSetMetadataKeyCountBoundaries() (gas: 4336248) -ValidatePaymentTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2156337) -ValidatePaymentTest:testDataSetMetadataStorage() (gas: 1143759) -ValidatePaymentTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1909151) -ValidatePaymentTest:testDataSetMetadataStorageMultipleKeys() (gas: 1300223) -ValidatePaymentTest:testDataSetMetadataValueLengthBoundaries() (gas: 2356735) -ValidatePaymentTest:testEmptyStringMetadata() (gas: 2081461) -ValidatePaymentTest:testFilecoinServiceDeployedEvent() (gas: 5080906) -ValidatePaymentTest:testFullFlow_SPAbandonsService_ClientCanSettleAndCleanup() (gas: 1232565) +SybilFeeTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 39595) +SybilFeeTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 58164) +SybilFeeTest:testNonceCannotBeReusedAcrossOperations() (gas: 1417061) +SybilFeeTest:testOperatorApproval_AllSufficient() (gas: 1088171) +SybilFeeTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 707450) +SybilFeeTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 705900) +SybilFeeTest:testOperatorApproval_InsufficientRateAllowance() (gas: 705663) +SybilFeeTest:testOperatorApproval_NotApproved() (gas: 625295) +SybilFeeTest:testPieceMetadataAllBoundaries() (gas: 8082879) +SybilFeeTest:testPieceMetadataArrayMismatchErrors() (gas: 1225987) +SybilFeeTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1715141) +SybilFeeTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1145714) +SybilFeeTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1147246) +SybilFeeTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1399438) +SybilFeeTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2212090) +SybilFeeTest:testPieceMetadataKeyCountBoundaries() (gas: 4489495) +SybilFeeTest:testPieceMetadataKeyLengthBoundaries() (gas: 3707732) +SybilFeeTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2081399) +SybilFeeTest:testPieceMetadataStorageAndRetrieval() (gas: 2106611) +SybilFeeTest:testPieceMetadataValueLengthBoundaries() (gas: 3938880) +SybilFeeTest:testProvenPeriods() (gas: 358323435) +SybilFeeTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1872384) +SybilFeeTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1049335) +SybilFeeTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41389) +SybilFeeTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1047139) +SybilFeeTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1791688) +SybilFeeTest:testRegression_CDNDataSetCleanup() (gas: 6040942) +SybilFeeTest:testServiceNameAndDescriptionValidation() (gas: 21834208) +SybilFeeTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1074575) +SybilFeeTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1078179) +SybilFeeTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1080039) +SybilFeeTest:testServiceProviderChangedSuccessDecoupled() (gas: 1087097) +SybilFeeTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1089897) +SybilFeeTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2258035) +SybilFeeTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2183776) +SybilFeeTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2056337) +SybilFeeTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1962536) +SybilFeeTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1008785) +SybilFeeTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2056163) +SybilFeeTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1847571) +SybilFeeTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1703173) +SybilFeeTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45384) +SybilFeeTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1682982) +SybilFeeTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1986418) +SybilFeeTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1987569) +SybilFeeTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1704879) +SybilFeeTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2104449) +SybilFeeTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1707515) +SybilFeeTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1680522) +SybilFeeTest:testTerminateCDNServiceLifecycle() (gas: 2331333) +SybilFeeTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2041975) +SybilFeeTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1993053) +SybilFeeTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2370237) +SybilFeeTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1016765) +SybilFeeTest:testTerminateServiceLifecycle() (gas: 2899295) +SybilFeeTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2258753) +SybilFeeTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2110412) +SybilFeeTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2129882) +SybilFeeTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43247) +SybilFeeTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1859782) +SybilFeeTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1006045) +SybilFeeTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1949678) +SybilFeeTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2024009) +SybilFeeTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2298332) +SybilFeeTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2345447) +SybilFeeTest:testTopUpCDNPaymentRails_Success() (gas: 1972601) +SybilFeeTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1862076) +SybilFeeTest:testTransferCDNController() (gas: 132284) +SybilFeeTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40235) +SybilFeeTest:testUpgrade() (gas: 12835517) +ValidatePaymentTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1522492) +ValidatePaymentTest:testAddPiecesNonceReplayProtection() (gas: 1401896) +ValidatePaymentTest:testAddPiecesNonceUniquePerPayer() (gas: 2057100) +ValidatePaymentTest:testAddPieces_RateUpdatedImmediately() (gas: 1496672) +ValidatePaymentTest:testCreateDataSetAddPieces() (gas: 2912436) +ValidatePaymentTest:testCreateDataSetCreatesRail() (gas: 2304673) +ValidatePaymentTest:testCreateDataSetNoCDN() (gas: 2811767) +ValidatePaymentTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2060900) +ValidatePaymentTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2129917) +ValidatePaymentTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1230120) +ValidatePaymentTest:testDataSetDeleted_RevertsIfRailNotSettled() (gas: 1336155) +ValidatePaymentTest:testDataSetDeleted_SucceedsAfterRailSettled() (gas: 1653617) +ValidatePaymentTest:testDataSetMetaDataWithAllBoundaries() (gas: 8459947) +ValidatePaymentTest:testDataSetMetadataEmpty() (gas: 992985) +ValidatePaymentTest:testDataSetMetadataKeyCountBoundaries() (gas: 5360988) +ValidatePaymentTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2419649) +ValidatePaymentTest:testDataSetMetadataStorage() (gas: 1104655) +ValidatePaymentTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1901783) +ValidatePaymentTest:testDataSetMetadataStorageMultipleKeys() (gas: 1316743) +ValidatePaymentTest:testDataSetMetadataValueLengthBoundaries() (gas: 2652271) +ValidatePaymentTest:testEmptyStringMetadata() (gas: 2172077) +ValidatePaymentTest:testFilecoinServiceDeployedEvent() (gas: 5586002) +ValidatePaymentTest:testFullFlow_SPAbandonsService_ClientCanSettleAndCleanup() (gas: 1597002) ValidatePaymentTest:testGetClientDataSets_EmptyClient() (gas: 27383) -ValidatePaymentTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 2797607) -ValidatePaymentTest:testGetClientDataSets_MultipleDataSets() (gas: 1933710) -ValidatePaymentTest:testGetClientDataSets_SingleDataSet() (gas: 1143291) -ValidatePaymentTest:testGetClientDataSets_TerminatedDataSets() (gas: 2782150) +ValidatePaymentTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3195152) +ValidatePaymentTest:testGetClientDataSets_MultipleDataSets() (gas: 1942842) +ValidatePaymentTest:testGetClientDataSets_SingleDataSet() (gas: 1105187) +ValidatePaymentTest:testGetClientDataSets_TerminatedDataSets() (gas: 3031758) ValidatePaymentTest:testGetEffectiveRatesValues() (gas: 21554) -ValidatePaymentTest:testGetPieceMetadata() (gas: 2083158) +ValidatePaymentTest:testGetPieceMetadata() (gas: 2150678) ValidatePaymentTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) -ValidatePaymentTest:testGetPieceMetadata_NonExistentKey() (gas: 1866336) -ValidatePaymentTest:testGetPieceMetdataAllKeys() (gas: 2071118) +ValidatePaymentTest:testGetPieceMetadata_NonExistentKey() (gas: 1895776) +ValidatePaymentTest:testGetPieceMetdataAllKeys() (gas: 2107638) ValidatePaymentTest:testGetServicePriceValues() (gas: 28477) ValidatePaymentTest:testGlobalParameters() (gas: 25039) -ValidatePaymentTest:testInitialState() (gas: 55140) -ValidatePaymentTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1318837) -ValidatePaymentTest:testInsufficientFunds_BelowMinimum() (gas: 538072) -ValidatePaymentTest:testInsufficientFunds_ExactMinimum() (gas: 1117942) -ValidatePaymentTest:testInsufficientFunds_JustAboveMinimum() (gas: 1119327) -ValidatePaymentTest:testMetadataQueries() (gas: 4554397) -ValidatePaymentTest:testMinimumPricing_CrossoverPoint() (gas: 21520) +ValidatePaymentTest:testInitialState() (gas: 97640) +ValidatePaymentTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1375677) +ValidatePaymentTest:testInsufficientFunds_BelowMinimum() (gas: 690804) +ValidatePaymentTest:testInsufficientFunds_ExactMinimum() (gas: 1087586) +ValidatePaymentTest:testInsufficientFunds_JustAboveMinimum() (gas: 1088935) +ValidatePaymentTest:testMetadataQueries() (gas: 4787085) +ValidatePaymentTest:testMinimumPricing_CrossoverPoint() (gas: 32520) ValidatePaymentTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20980) -ValidatePaymentTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 22683) -ValidatePaymentTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 25186) -ValidatePaymentTest:testMultiplePieceMetadataRemovalAtNextProvingPeriod() (gas: 1619504) -ValidatePaymentTest:testNonceCannotBeReusedAcrossOperations() (gas: 1359909) -ValidatePaymentTest:testOperatorApproval_AllSufficient() (gas: 1118625) -ValidatePaymentTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 546930) -ValidatePaymentTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 545162) -ValidatePaymentTest:testOperatorApproval_InsufficientRateAllowance() (gas: 544983) -ValidatePaymentTest:testOperatorApproval_NotApproved() (gas: 464901) -ValidatePaymentTest:testPieceMetadataAllBoundaries() (gas: 7727654) -ValidatePaymentTest:testPieceMetadataArrayMismatchErrors() (gas: 1219091) -ValidatePaymentTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1747721) -ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1171902) -ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1173486) -ValidatePaymentTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1352426) -ValidatePaymentTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2111794) -ValidatePaymentTest:testPieceMetadataKeyCountBoundaries() (gas: 3809951) -ValidatePaymentTest:testPieceMetadataKeyLengthBoundaries() (gas: 3235060) -ValidatePaymentTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 1889402) -ValidatePaymentTest:testPieceMetadataRemovalDeferredToNextProvingPeriod() (gas: 2097024) -ValidatePaymentTest:testPieceMetadataStorageAndRetrieval() (gas: 2070377) -ValidatePaymentTest:testPieceMetadataValueLengthBoundaries() (gas: 3433662) -ValidatePaymentTest:testProvenPeriods() (gas: 71862548) -ValidatePaymentTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1786578) -ValidatePaymentTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1062351) -ValidatePaymentTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 19709) -ValidatePaymentTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1062371) -ValidatePaymentTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1773452) -ValidatePaymentTest:testRegression_CDNDataSetCleanup() (gas: 4217360) -ValidatePaymentTest:testServiceNameAndDescriptionValidation() (gas: 19790104) -ValidatePaymentTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1118321) -ValidatePaymentTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1119575) -ValidatePaymentTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1121545) -ValidatePaymentTest:testServiceProviderChangedSuccessDecoupled() (gas: 1120965) -ValidatePaymentTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1122751) -ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 1938235) -ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 1881176) -ValidatePaymentTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 1875153) -ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1829074) -ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1049659) -ValidatePaymentTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 1874955) -ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1775787) -ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1737453) -ValidatePaymentTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 24094) -ValidatePaymentTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1729998) -ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1832604) -ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1833973) -ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1739357) -ValidatePaymentTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 1875741) -ValidatePaymentTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1734475) -ValidatePaymentTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1727494) -ValidatePaymentTest:testTerminateCDNServiceLifecycle() (gas: 1904110) -ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 1679112) -ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1778833) -ValidatePaymentTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 1895401) -ValidatePaymentTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1052833) -ValidatePaymentTest:testTerminateServiceLifecycle() (gas: 1871858) -ValidatePaymentTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 1754148) -ValidatePaymentTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 1840008) -ValidatePaymentTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 1843098) -ValidatePaymentTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 21875) -ValidatePaymentTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1772590) -ValidatePaymentTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1044809) -ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1780522) -ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 1835675) -ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 1884990) -ValidatePaymentTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 1915025) -ValidatePaymentTest:testTopUpCDNPaymentRails_Success() (gas: 1802369) -ValidatePaymentTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1766114) -ValidatePaymentTest:testTransferCDNController() (gas: 34568) -ValidatePaymentTest:testTransferCDNController_revertsIfZeroAddress() (gas: 19043) -ValidatePaymentTest:testUpgrade() (gas: 11496874) -ValidatePaymentTest:testValidatePayment_AdvancesPastUnprovenPeriodsWithPassedDeadlines() (gas: 1205685) -ValidatePaymentTest:testValidatePayment_AllEpochsProven() (gas: 1273022) -ValidatePaymentTest:testValidatePayment_BeforeActivation() (gas: 1202182) -ValidatePaymentTest:testValidatePayment_BlocksOnUnprovenPeriodWithOpenDeadline() (gas: 1201125) -ValidatePaymentTest:testValidatePayment_FirstPeriodUnproven() (gas: 1321262) -ValidatePaymentTest:testValidatePayment_InvalidEpochRange() (gas: 1141670) +ValidatePaymentTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 39683) +ValidatePaymentTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 58186) +ValidatePaymentTest:testMultiplePieceMetadataRemovalAtNextProvingPeriod() (gas: 2074967) +ValidatePaymentTest:testNonceCannotBeReusedAcrossOperations() (gas: 1417149) +ValidatePaymentTest:testOperatorApproval_AllSufficient() (gas: 1088281) +ValidatePaymentTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 707758) +ValidatePaymentTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 705966) +ValidatePaymentTest:testOperatorApproval_InsufficientRateAllowance() (gas: 705751) +ValidatePaymentTest:testOperatorApproval_NotApproved() (gas: 625405) +ValidatePaymentTest:testPieceMetadataAllBoundaries() (gas: 8082923) +ValidatePaymentTest:testPieceMetadataArrayMismatchErrors() (gas: 1226031) +ValidatePaymentTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1715317) +ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1145714) +ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1147334) +ValidatePaymentTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1399526) +ValidatePaymentTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2212178) +ValidatePaymentTest:testPieceMetadataKeyCountBoundaries() (gas: 4489539) +ValidatePaymentTest:testPieceMetadataKeyLengthBoundaries() (gas: 3707908) +ValidatePaymentTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2081470) +ValidatePaymentTest:testPieceMetadataRemovalDeferredToNextProvingPeriod() (gas: 2440984) +ValidatePaymentTest:testPieceMetadataStorageAndRetrieval() (gas: 2106897) +ValidatePaymentTest:testPieceMetadataValueLengthBoundaries() (gas: 3939166) +ValidatePaymentTest:testProvenPeriods() (gas: 358395251) +ValidatePaymentTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1872626) +ValidatePaymentTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1049379) +ValidatePaymentTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41433) +ValidatePaymentTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1047183) +ValidatePaymentTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1791776) +ValidatePaymentTest:testRegression_CDNDataSetCleanup() (gas: 6041156) +ValidatePaymentTest:testServiceNameAndDescriptionValidation() (gas: 21834208) +ValidatePaymentTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1074685) +ValidatePaymentTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1078223) +ValidatePaymentTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1080193) +ValidatePaymentTest:testServiceProviderChangedSuccessDecoupled() (gas: 1087141) +ValidatePaymentTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1089963) +ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2258079) +ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2183820) +ValidatePaymentTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2056381) +ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1962602) +ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1008983) +ValidatePaymentTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2056207) +ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1847659) +ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1703217) +ValidatePaymentTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45626) +ValidatePaymentTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1683070) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1986484) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1987877) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1705121) +ValidatePaymentTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2104493) +ValidatePaymentTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1707603) +ValidatePaymentTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1680566) +ValidatePaymentTest:testTerminateCDNServiceLifecycle() (gas: 2331434) +ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2042019) +ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1993053) +ValidatePaymentTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2370417) +ValidatePaymentTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1016853) +ValidatePaymentTest:testTerminateServiceLifecycle() (gas: 2899440) +ValidatePaymentTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2258995) +ValidatePaymentTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2110632) +ValidatePaymentTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2129926) +ValidatePaymentTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43467) +ValidatePaymentTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1859826) +ValidatePaymentTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1006133) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1949678) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2024031) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2298530) +ValidatePaymentTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2345469) +ValidatePaymentTest:testTopUpCDNPaymentRails_Success() (gas: 1972601) +ValidatePaymentTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1862186) +ValidatePaymentTest:testTransferCDNController() (gas: 132328) +ValidatePaymentTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40235) +ValidatePaymentTest:testUpgrade() (gas: 12835614) +ValidatePaymentTest:testValidatePayment_AdvancesPastUnprovenPeriodsWithPassedDeadlines() (gas: 1221845) +ValidatePaymentTest:testValidatePayment_AllEpochsProven() (gas: 1526018) +ValidatePaymentTest:testValidatePayment_BeforeActivation() (gas: 1220842) +ValidatePaymentTest:testValidatePayment_BlocksOnUnprovenPeriodWithOpenDeadline() (gas: 1217285) +ValidatePaymentTest:testValidatePayment_FirstPeriodUnproven() (gas: 1664222) +ValidatePaymentTest:testValidatePayment_InvalidEpochRange() (gas: 1108066) ValidatePaymentTest:testValidatePayment_InvalidRailId() (gas: 22358) -ValidatePaymentTest:testValidatePayment_MixedProvenAndUnprovenWithPassedDeadlines() (gas: 1252061) -ValidatePaymentTest:testValidatePayment_NoEpochsProven() (gas: 1258383) -ValidatePaymentTest:testValidatePayment_PartialPeriodCoverage() (gas: 1259320) -ValidatePaymentTest:testValidatePayment_ProvingNeverActivated() (gas: 1144857) -ValidatePaymentTest:testValidatePayment_SomeEpochsProven() (gas: 1269260) -ValidatePaymentTest:testValidatePayment_ToEpochExactlyOnDeadline() (gas: 1250972) \ No newline at end of file +ValidatePaymentTest:testValidatePayment_MixedProvenAndUnprovenWithPassedDeadlines() (gas: 1306357) +ValidatePaymentTest:testValidatePayment_NoEpochsProven() (gas: 1399107) +ValidatePaymentTest:testValidatePayment_PartialPeriodCoverage() (gas: 1335116) +ValidatePaymentTest:testValidatePayment_ProvingNeverActivated() (gas: 1113753) +ValidatePaymentTest:testValidatePayment_SomeEpochsProven() (gas: 1466220) +ValidatePaymentTest:testValidatePayment_ToEpochExactlyOnDeadline() (gas: 1309768) \ No newline at end of file diff --git a/service_contracts/Makefile b/service_contracts/Makefile index 8b6adb00..66afe41b 100644 --- a/service_contracts/Makefile +++ b/service_contracts/Makefile @@ -80,7 +80,7 @@ check-tools: .PHONY: test test: forge test --via-ir -vv - @forge snapshot --no-match-test "Fuzz" + @forge snapshot --isolate --no-match-test "Fuzz" # Clean build artifacts .PHONY: clean From 6155d6e5653acf996cc14f7fa38e77085019902b Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 1 May 2026 17:30:21 -0500 Subject: [PATCH 40/43] workaround with no-match --- service_contracts/.gas-snapshot | 4 ---- service_contracts/Makefile | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/service_contracts/.gas-snapshot b/service_contracts/.gas-snapshot index 5a2bac30..6e86462b 100644 --- a/service_contracts/.gas-snapshot +++ b/service_contracts/.gas-snapshot @@ -257,10 +257,6 @@ FilecoinWarmStorageServiceUpgradeTest:testMigrateOnlyOnce() (gas: 79611) FilecoinWarmStorageServiceUpgradeTest:testMigrateWithViewContract() (gas: 1864235) FilecoinWarmStorageServiceUpgradeTest:testNextPDPChallengeWindowStartThroughView() (gas: 1835630) FilecoinWarmStorageServiceUpgradeTest:testSetViewContract() (gas: 1865547) -MetadataSignatureFixturesTest:testContract() (gas: 2593) -MetadataSignatureFixturesTest:testEIP712TypeStructures() (gas: 27096) -MetadataSignatureFixturesTest:testExternalSignatures() (gas: 75665) -MetadataSignatureFixturesTest:testGenerateFixtures() (gas: 223803) PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1787998) PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1736698) PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 2100228) diff --git a/service_contracts/Makefile b/service_contracts/Makefile index 66afe41b..4219a88a 100644 --- a/service_contracts/Makefile +++ b/service_contracts/Makefile @@ -80,7 +80,7 @@ check-tools: .PHONY: test test: forge test --via-ir -vv - @forge snapshot --isolate --no-match-test "Fuzz" + @forge snapshot --isolate --no-match-test "Fuzz" --no-match-contract "MetadataSignatureFixturesTest" # Clean build artifacts .PHONY: clean From e3ceb73c660da00c01f25e9700ed63e4c28080b8 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Fri, 1 May 2026 17:36:18 -0500 Subject: [PATCH 41/43] dep: point lib/fvm-solidity to main after merge --- service_contracts/lib/fvm-solidity | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service_contracts/lib/fvm-solidity b/service_contracts/lib/fvm-solidity index 0db5d44d..2b3412a8 160000 --- a/service_contracts/lib/fvm-solidity +++ b/service_contracts/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit 0db5d44d8a467226600a34f6234f478b33beb43b +Subproject commit 2b3412a8555cfa7451199e0ba82c1ca870f2f45b From 58c3ab5b64fd322ab69323faca69c69c7a3d72c4 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 29 Jul 2026 14:42:14 -0500 Subject: [PATCH 42/43] chore: update .gas-snapshot --- service_contracts/.gas-snapshot | 1415 ++++++++++++++++++------------- 1 file changed, 817 insertions(+), 598 deletions(-) diff --git a/service_contracts/.gas-snapshot b/service_contracts/.gas-snapshot index 6e86462b..a58a248c 100644 --- a/service_contracts/.gas-snapshot +++ b/service_contracts/.gas-snapshot @@ -1,277 +1,456 @@ +AbandonmentTest:testAbandonmentBlockedBeforeWindowByFWSS() (gas: 1456995) +AbandonmentTest:testAbandonmentBlockedBeforeWindowByPDPVerifier() (gas: 1132772) +AbandonmentTest:testAbandonmentClears() (gas: 1462361) +AbandonmentTest:testAbandonmentClearsActivatedFaultedDataSet() (gas: 2165944) +AbandonmentTest:testAbandonmentClearsActivatedProvenThenFaultedDataSet() (gas: 2222753) +AbandonmentTest:testAbandonmentClearsCDN() (gas: 2248033) +AbandonmentTest:testAbandonmentClearsCDNActivatedFaultedDataSet() (gas: 2975860) +AbandonmentTest:testAbandonmentClearsCDNPreFinalized() (gas: 2408941) +AbandonmentTest:testAbandonmentClearsCDNPreTerminated() (gas: 2373954) +AbandonmentTest:testAbandonment_underfundedPayer() (gas: 2013943) +AbandonmentTest:testAbandonment_underfundedPayer_lockupFixedReleased() (gas: 2402462) +AbandonmentTest:testTerminateService_underfundedPayer() (gas: 1745769) BigEndianTest:test_decode() (gas: 10223) BigEndianTest:test_encode() (gas: 392495) BloomSetTest:testDifferent() (gas: 29550) BloomSetTest:testIdentical() (gas: 23854) -ClientDataSetPaginationTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1522558) -ClientDataSetPaginationTest:testAddPiecesNonceReplayProtection() (gas: 1401874) -ClientDataSetPaginationTest:testAddPiecesNonceUniquePerPayer() (gas: 2057144) -ClientDataSetPaginationTest:testAddPieces_RateUpdatedImmediately() (gas: 1496650) -ClientDataSetPaginationTest:testClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5858739) -ClientDataSetPaginationTest:testClientDataSetsPaginated_Empty() (gas: 24160) -ClientDataSetPaginationTest:testClientDataSetsPaginated_FullPage() (gas: 4222256) -ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitExceedsRemaining() (gas: 2655490) -ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 4249577) -ClientDataSetPaginationTest:testClientDataSetsPaginated_OffsetBeyondLength() (gas: 2646595) -ClientDataSetPaginationTest:testClientDataSetsPaginated_SecondPage() (gas: 4217340) -ClientDataSetPaginationTest:testCreateDataSetAddPieces() (gas: 2912480) -ClientDataSetPaginationTest:testCreateDataSetCreatesRail() (gas: 2304722) -ClientDataSetPaginationTest:testCreateDataSetNoCDN() (gas: 2811811) -ClientDataSetPaginationTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2060878) -ClientDataSetPaginationTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2129939) -ClientDataSetPaginationTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1229916) -ClientDataSetPaginationTest:testDataSetMetaDataWithAllBoundaries() (gas: 8459991) -ClientDataSetPaginationTest:testDataSetMetadataEmpty() (gas: 992963) -ClientDataSetPaginationTest:testDataSetMetadataKeyCountBoundaries() (gas: 5360988) -ClientDataSetPaginationTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2419693) -ClientDataSetPaginationTest:testDataSetMetadataStorage() (gas: 1104655) -ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1901849) -ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleKeys() (gas: 1316787) -ClientDataSetPaginationTest:testDataSetMetadataValueLengthBoundaries() (gas: 2652293) -ClientDataSetPaginationTest:testEmptyStringMetadata() (gas: 2172143) -ClientDataSetPaginationTest:testFilecoinServiceDeployedEvent() (gas: 5586024) -ClientDataSetPaginationTest:testGetClientDataSetsLength_AfterCreation() (gas: 4209769) -ClientDataSetPaginationTest:testGetClientDataSetsLength_Empty() (gas: 23038) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5426272) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_Empty() (gas: 23118) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ExcludesDeletedDataSets() (gas: 3910992) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_FullPage() (gas: 4318529) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_IncludesTerminatedDataSets() (gas: 2876167) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 3558274) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_OffsetBeyondLength() (gas: 2647271) -ClientDataSetPaginationTest:testGetClientDataSetsPaginated_SecondPage() (gas: 4282781) -ClientDataSetPaginationTest:testGetClientDataSets_EmptyClient() (gas: 27405) -ClientDataSetPaginationTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3195196) -ClientDataSetPaginationTest:testGetClientDataSets_MultipleDataSets() (gas: 1942887) -ClientDataSetPaginationTest:testGetClientDataSets_SingleDataSet() (gas: 1105209) -ClientDataSetPaginationTest:testGetClientDataSets_TerminatedDataSets() (gas: 3031736) -ClientDataSetPaginationTest:testGetEffectiveRatesValues() (gas: 21620) -ClientDataSetPaginationTest:testGetPieceMetadata() (gas: 2150678) -ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) -ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentKey() (gas: 1895767) -ClientDataSetPaginationTest:testGetPieceMetdataAllKeys() (gas: 2107660) -ClientDataSetPaginationTest:testGetServicePriceValues() (gas: 28477) -ClientDataSetPaginationTest:testGlobalParameters() (gas: 25061) -ClientDataSetPaginationTest:testInitialState() (gas: 97618) -ClientDataSetPaginationTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1375699) -ClientDataSetPaginationTest:testInsufficientFunds_BelowMinimum() (gas: 690826) -ClientDataSetPaginationTest:testInsufficientFunds_ExactMinimum() (gas: 1087630) -ClientDataSetPaginationTest:testInsufficientFunds_JustAboveMinimum() (gas: 1088957) -ClientDataSetPaginationTest:testMetadataQueries() (gas: 4787129) -ClientDataSetPaginationTest:testMinimumPricing_CrossoverPoint() (gas: 32586) -ClientDataSetPaginationTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20980) -ClientDataSetPaginationTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 39705) -ClientDataSetPaginationTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 58208) -ClientDataSetPaginationTest:testNonceCannotBeReusedAcrossOperations() (gas: 1417171) -ClientDataSetPaginationTest:testOperatorApproval_AllSufficient() (gas: 1088303) -ClientDataSetPaginationTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 707736) -ClientDataSetPaginationTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 706010) -ClientDataSetPaginationTest:testOperatorApproval_InsufficientRateAllowance() (gas: 705795) -ClientDataSetPaginationTest:testOperatorApproval_NotApproved() (gas: 625427) -ClientDataSetPaginationTest:testPieceMetadataAllBoundaries() (gas: 8082945) -ClientDataSetPaginationTest:testPieceMetadataArrayMismatchErrors() (gas: 1226097) -ClientDataSetPaginationTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1715295) -ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1145714) -ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1147356) -ClientDataSetPaginationTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1399570) -ClientDataSetPaginationTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2212200) -ClientDataSetPaginationTest:testPieceMetadataKeyCountBoundaries() (gas: 4489583) -ClientDataSetPaginationTest:testPieceMetadataKeyLengthBoundaries() (gas: 3707886) -ClientDataSetPaginationTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2081509) -ClientDataSetPaginationTest:testPieceMetadataStorageAndRetrieval() (gas: 2106897) -ClientDataSetPaginationTest:testPieceMetadataValueLengthBoundaries() (gas: 3939166) -ClientDataSetPaginationTest:testProvenPeriods() (gas: 358323545) -ClientDataSetPaginationTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1872648) -ClientDataSetPaginationTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1049423) -ClientDataSetPaginationTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41455) -ClientDataSetPaginationTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1047249) -ClientDataSetPaginationTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1791798) -ClientDataSetPaginationTest:testRegression_CDNDataSetCleanup() (gas: 6041179) -ClientDataSetPaginationTest:testServiceNameAndDescriptionValidation() (gas: 21834208) -ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1074707) -ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1078289) -ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1080193) -ClientDataSetPaginationTest:testServiceProviderChangedSuccessDecoupled() (gas: 1087185) -ClientDataSetPaginationTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1090007) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2258123) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2183864) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2056447) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1962646) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1009005) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2056251) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1847681) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1703283) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45648) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1683092) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1986528) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1987855) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1705143) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2104559) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1707625) -ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1680632) -ClientDataSetPaginationTest:testTerminateCDNServiceLifecycle() (gas: 2331443) -ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2042063) -ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1993053) -ClientDataSetPaginationTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2370369) -ClientDataSetPaginationTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1016897) -ClientDataSetPaginationTest:testTerminateServiceLifecycle() (gas: 2899405) -ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2259017) -ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2110632) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2129970) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43467) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1859892) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1006155) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1949700) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2024053) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2298530) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2345513) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_Success() (gas: 1972623) -ClientDataSetPaginationTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1862208) -ClientDataSetPaginationTest:testTransferCDNController() (gas: 132350) -ClientDataSetPaginationTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40257) -ClientDataSetPaginationTest:testUpgrade() (gas: 12835627) -ExtsloadTest:test_extsload() (gas: 85079) -ExtsloadTest:test_extsloadStruct() (gas: 118113) -FilecoinWarmStorageServiceOwnerTest:testOwnerFieldSetCorrectlyOnDataSetCreation() (gas: 1079962) -FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForUnregisteredProvider() (gas: 1056480) -FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForWrongOldOwner() (gas: 1060750) -FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedSucceedsForAnyRegisteredProvider() (gas: 1058706) -FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedUpdatesOnlyOwnerField() (gas: 1068348) +ClientDataSetPaginationTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1706712) +ClientDataSetPaginationTest:testAddPiecesNonceReplayProtection() (gas: 1524229) +ClientDataSetPaginationTest:testAddPiecesNonceUniquePerPayer() (gas: 2267317) +ClientDataSetPaginationTest:testAddPieces_RateUpdatedImmediately() (gas: 1622136) +ClientDataSetPaginationTest:testAnnouncePlannedUpgrade() (gas: 12658130) +ClientDataSetPaginationTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 5061549) +ClientDataSetPaginationTest:testAnnounceUpgradePlan() (gas: 12686455) +ClientDataSetPaginationTest:testAnnounceUpgradePlanOnlyOwner() (gas: 5060305) +ClientDataSetPaginationTest:testClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 6444799) +ClientDataSetPaginationTest:testClientDataSetsPaginated_Empty() (gas: 24321) +ClientDataSetPaginationTest:testClientDataSetsPaginated_FullPage() (gas: 4630731) +ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitExceedsRemaining() (gas: 2893514) +ClientDataSetPaginationTest:testClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 4660515) +ClientDataSetPaginationTest:testClientDataSetsPaginated_OffsetBeyondLength() (gas: 2884685) +ClientDataSetPaginationTest:testClientDataSetsPaginated_SecondPage() (gas: 4625691) +ClientDataSetPaginationTest:testCreateDataSetAddPieces() (gas: 3164678) +ClientDataSetPaginationTest:testCreateDataSetCreatesRail() (gas: 2348883) +ClientDataSetPaginationTest:testCreateDataSetNoCDN() (gas: 3093298) +ClientDataSetPaginationTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2089614) +ClientDataSetPaginationTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2161143) +ClientDataSetPaginationTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1283642) +ClientDataSetPaginationTest:testDataSetMetaDataWithAllBoundaries() (gas: 8217900) +ClientDataSetPaginationTest:testDataSetMetadataEmpty() (gas: 1061009) +ClientDataSetPaginationTest:testDataSetMetadataKeyCountBoundaries() (gas: 5559601) +ClientDataSetPaginationTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2580782) +ClientDataSetPaginationTest:testDataSetMetadataStorage() (gas: 1175201) +ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleDataSets() (gas: 2057328) +ClientDataSetPaginationTest:testDataSetMetadataStorageMultipleKeys() (gas: 1392162) +ClientDataSetPaginationTest:testDataSetMetadataValueLengthBoundaries() (gas: 2745920) +ClientDataSetPaginationTest:testDatasetFee_AllSizesIncludeFee() (gas: 7756) +ClientDataSetPaginationTest:testDatasetFee_ExactlyPoint024USDFC() (gas: 6475) +ClientDataSetPaginationTest:testDatasetFee_IsAdditive() (gas: 5937) +ClientDataSetPaginationTest:testEmptyStringMetadata() (gas: 2295912) +ClientDataSetPaginationTest:testFilecoinServiceDeployedEvent() (gas: 5338689) +ClientDataSetPaginationTest:testGetClientDataSetsLength_AfterCreation() (gas: 4618273) +ClientDataSetPaginationTest:testGetClientDataSetsLength_Empty() (gas: 23127) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ConsistencyWithUnpaginated() (gas: 5933384) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_Empty() (gas: 23102) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_ExcludesDeletedDataSets() (gas: 4369882) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_FullPage() (gas: 4728574) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_IncludesTerminatedDataSets() (gas: 3233726) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_LimitZeroReturnsAll() (gas: 3883736) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_OffsetBeyondLength() (gas: 2885361) +ClientDataSetPaginationTest:testGetClientDataSetsPaginated_SecondPage() (gas: 4692334) +ClientDataSetPaginationTest:testGetClientDataSets_EmptyClient() (gas: 27610) +ClientDataSetPaginationTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3569742) +ClientDataSetPaginationTest:testGetClientDataSets_MultipleDataSets() (gas: 2097126) +ClientDataSetPaginationTest:testGetClientDataSets_SingleDataSet() (gas: 1173515) +ClientDataSetPaginationTest:testGetClientDataSets_TerminatedDataSets() (gas: 3396288) +ClientDataSetPaginationTest:testGetDataSetSizeInBytes_ReturnsRawSize() (gas: 26372) +ClientDataSetPaginationTest:testGetEffectiveRatesValues() (gas: 17397) +ClientDataSetPaginationTest:testGetPieceMetadata() (gas: 2210564) +ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23355) +ClientDataSetPaginationTest:testGetPieceMetadata_NonExistentKey() (gas: 1950841) +ClientDataSetPaginationTest:testGetPieceMetdataAllKeys() (gas: 2162712) +ClientDataSetPaginationTest:testGetServicePriceValues() (gas: 24578) +ClientDataSetPaginationTest:testGlobalParameters() (gas: 25045) +ClientDataSetPaginationTest:testInitialState() (gas: 97750) +ClientDataSetPaginationTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1494222) +ClientDataSetPaginationTest:testInsufficientFunds_BelowMinimum() (gas: 687713) +ClientDataSetPaginationTest:testInsufficientFunds_ExactMinimum() (gas: 1156063) +ClientDataSetPaginationTest:testInsufficientFunds_JustAboveMinimum() (gas: 1157315) +ClientDataSetPaginationTest:testMetadataQueries() (gas: 5015785) +ClientDataSetPaginationTest:testNonceCannotBeReusedAcrossOperations() (gas: 1539559) +ClientDataSetPaginationTest:testOperatorApproval_AllSufficient() (gas: 1156445) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 704667) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 702948) +ClientDataSetPaginationTest:testOperatorApproval_InsufficientRateAllowance() (gas: 702759) +ClientDataSetPaginationTest:testOperatorApproval_NotApproved() (gas: 622300) +ClientDataSetPaginationTest:testPieceMetadataAllBoundaries() (gas: 7011887) +ClientDataSetPaginationTest:testPieceMetadataArrayMismatchErrors() (gas: 1294654) +ClientDataSetPaginationTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1783381) +ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1213836) +ClientDataSetPaginationTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1215712) +ClientDataSetPaginationTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1459615) +ClientDataSetPaginationTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2310904) +ClientDataSetPaginationTest:testPieceMetadataKeyCountBoundaries() (gas: 4184715) +ClientDataSetPaginationTest:testPieceMetadataKeyLengthBoundaries() (gas: 3884496) +ClientDataSetPaginationTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2156333) +ClientDataSetPaginationTest:testPieceMetadataStorageAndRetrieval() (gas: 2161950) +ClientDataSetPaginationTest:testPieceMetadataValueLengthBoundaries() (gas: 4047797) +ClientDataSetPaginationTest:testProvenPeriods() (gas: 416252897) +ClientDataSetPaginationTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1907313) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1117739) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41417) +ClientDataSetPaginationTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1115755) +ClientDataSetPaginationTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1823385) +ClientDataSetPaginationTest:testRegression_CDNDataSetCleanup() (gas: 6625836) +ClientDataSetPaginationTest:testServiceNameAndDescriptionValidation() (gas: 21032021) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1142797) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1124709) +ClientDataSetPaginationTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1126472) +ClientDataSetPaginationTest:testServiceProviderChangedSuccessDecoupled() (gas: 1154993) +ClientDataSetPaginationTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1158054) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2346385) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2266778) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2134131) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 2032331) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1074832) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2133663) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1880200) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1732481) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45926) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1712336) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 2059065) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 2060654) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1734399) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2177194) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1735479) +ClientDataSetPaginationTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1709844) +ClientDataSetPaginationTest:testTerminateCDNServiceLifecycle() (gas: 2618903) +ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2073461) +ClientDataSetPaginationTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 2026937) +ClientDataSetPaginationTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2642585) +ClientDataSetPaginationTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1087337) +ClientDataSetPaginationTest:testTerminateServiceLifecycle() (gas: 3405516) +ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2706185) +ClientDataSetPaginationTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2553427) +ClientDataSetPaginationTest:testTerminateService_directPayer_emitsApprover() (gas: 1410259) +ClientDataSetPaginationTest:testTerminateService_directSP_emitsApprover() (gas: 1447310) +ClientDataSetPaginationTest:testTerminateService_extraData_callerNotServiceProvider() (gas: 1155084) +ClientDataSetPaginationTest:testTerminateService_sessionKey() (gas: 1500358) +ClientDataSetPaginationTest:testTerminateService_sessionKey_expiredKey() (gas: 1231339) +ClientDataSetPaginationTest:testTerminateService_sessionKey_unauthorizedKey() (gas: 1176493) +ClientDataSetPaginationTest:testTerminateService_sessionKey_wrongPermission() (gas: 1231406) +ClientDataSetPaginationTest:testTerminateService_signatureApprover() (gas: 1665599) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2172293) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43718) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1891422) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1074239) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1983846) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2218969) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2340093) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2389654) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_Success() (gas: 2011710) +ClientDataSetPaginationTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1896466) +ClientDataSetPaginationTest:testTransferCDNController() (gas: 132399) +ClientDataSetPaginationTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40196) +ClientDataSetPaginationTest:testUpdatePaymentRates_NextProvingPeriodAfterRemovalUsesRawSize() (gas: 2059450) +ClientDataSetPaginationTest:testUpdatePaymentRates_PiecesAddedUsesRawSize() (gas: 1580045) +ExtsloadTest:test_extsload() (gas: 97579) +ExtsloadTest:test_extsloadStruct() (gas: 120613) +FilecoinWarmStorageServiceOwnerTest:testOwnerFieldSetCorrectlyOnDataSetCreation() (gas: 1148365) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForUnregisteredProvider() (gas: 1105036) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedRevertsForWrongOldOwner() (gas: 1109318) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedSucceedsForAnyRegisteredProvider() (gas: 1107274) +FilecoinWarmStorageServiceOwnerTest:testStorageProviderChangedUpdatesOnlyOwnerField() (gas: 1138649) FilecoinWarmStorageServiceSignatureTest:testRecoverSignerInvalidLength() (gas: 13126) FilecoinWarmStorageServiceSignatureTest:testRecoverSignerInvalidValue() (gas: 13067) FilecoinWarmStorageServiceSignatureTest:testRecoverSignerWithValidSignature() (gas: 24427) FilecoinWarmStorageServiceSignatureTest:testRecoverSignerWithWrongSigner() (gas: 27079) -FilecoinWarmStorageServiceTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1522426) -FilecoinWarmStorageServiceTest:testAddPiecesNonceReplayProtection() (gas: 1401500) -FilecoinWarmStorageServiceTest:testAddPiecesNonceUniquePerPayer() (gas: 2056946) -FilecoinWarmStorageServiceTest:testAddPieces_RateUpdatedImmediately() (gas: 1496276) -FilecoinWarmStorageServiceTest:testCreateDataSetAddPieces() (gas: 2912304) -FilecoinWarmStorageServiceTest:testCreateDataSetCreatesRail() (gas: 2304343) -FilecoinWarmStorageServiceTest:testCreateDataSetNoCDN() (gas: 2811723) -FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2060504) -FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2129785) -FilecoinWarmStorageServiceTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1229784) -FilecoinWarmStorageServiceTest:testDataSetMetaDataWithAllBoundaries() (gas: 8459903) -FilecoinWarmStorageServiceTest:testDataSetMetadataEmpty() (gas: 992721) -FilecoinWarmStorageServiceTest:testDataSetMetadataKeyCountBoundaries() (gas: 5360988) -FilecoinWarmStorageServiceTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2419605) -FilecoinWarmStorageServiceTest:testDataSetMetadataStorage() (gas: 1104303) -FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1901717) -FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleKeys() (gas: 1316611) -FilecoinWarmStorageServiceTest:testDataSetMetadataValueLengthBoundaries() (gas: 2651941) -FilecoinWarmStorageServiceTest:testEmptyStringMetadata() (gas: 2172011) -FilecoinWarmStorageServiceTest:testFilecoinServiceDeployedEvent() (gas: 5585826) -FilecoinWarmStorageServiceTest:testGetClientDataSets_EmptyClient() (gas: 27053) -FilecoinWarmStorageServiceTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3195054) -FilecoinWarmStorageServiceTest:testGetClientDataSets_MultipleDataSets() (gas: 1942490) -FilecoinWarmStorageServiceTest:testGetClientDataSets_SingleDataSet() (gas: 1105165) -FilecoinWarmStorageServiceTest:testGetClientDataSets_TerminatedDataSets() (gas: 3031494) -FilecoinWarmStorageServiceTest:testGetEffectiveRatesValues() (gas: 21488) -FilecoinWarmStorageServiceTest:testGetPieceMetadata() (gas: 2150370) -FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) -FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentKey() (gas: 1895393) -FilecoinWarmStorageServiceTest:testGetPieceMetdataAllKeys() (gas: 2107308) -FilecoinWarmStorageServiceTest:testGetServicePriceValues() (gas: 28169) -FilecoinWarmStorageServiceTest:testGlobalParameters() (gas: 24995) -FilecoinWarmStorageServiceTest:testInitialState() (gas: 97376) -FilecoinWarmStorageServiceTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1375655) -FilecoinWarmStorageServiceTest:testInsufficientFunds_BelowMinimum() (gas: 690672) -FilecoinWarmStorageServiceTest:testInsufficientFunds_ExactMinimum() (gas: 1087454) -FilecoinWarmStorageServiceTest:testInsufficientFunds_JustAboveMinimum() (gas: 1088605) -FilecoinWarmStorageServiceTest:testMetadataQueries() (gas: 4786953) -FilecoinWarmStorageServiceTest:testMinimumPricing_CrossoverPoint() (gas: 32454) -FilecoinWarmStorageServiceTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20672) -FilecoinWarmStorageServiceTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 39551) -FilecoinWarmStorageServiceTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 58164) -FilecoinWarmStorageServiceTest:testNonceCannotBeReusedAcrossOperations() (gas: 1417017) -FilecoinWarmStorageServiceTest:testOperatorApproval_AllSufficient() (gas: 1088083) -FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 707362) -FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 705834) -FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientRateAllowance() (gas: 705619) -FilecoinWarmStorageServiceTest:testOperatorApproval_NotApproved() (gas: 625273) -FilecoinWarmStorageServiceTest:testPieceMetadataAllBoundaries() (gas: 8082879) -FilecoinWarmStorageServiceTest:testPieceMetadataArrayMismatchErrors() (gas: 1225965) -FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1715053) -FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1145714) -FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1147202) -FilecoinWarmStorageServiceTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1399394) -FilecoinWarmStorageServiceTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2211926) -FilecoinWarmStorageServiceTest:testPieceMetadataKeyCountBoundaries() (gas: 4489495) -FilecoinWarmStorageServiceTest:testPieceMetadataKeyLengthBoundaries() (gas: 3707644) -FilecoinWarmStorageServiceTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2081377) -FilecoinWarmStorageServiceTest:testPieceMetadataStorageAndRetrieval() (gas: 2106523) -FilecoinWarmStorageServiceTest:testPieceMetadataValueLengthBoundaries() (gas: 3938792) -FilecoinWarmStorageServiceTest:testProvenPeriods() (gas: 358323369) -FilecoinWarmStorageServiceTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1872296) -FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1049335) -FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41389) -FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1047117) -FilecoinWarmStorageServiceTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1791644) -FilecoinWarmStorageServiceTest:testRegression_CDNDataSetCleanup() (gas: 6040827) -FilecoinWarmStorageServiceTest:testServiceNameAndDescriptionValidation() (gas: 21834208) -FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1074509) -FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1078157) -FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1079951) -FilecoinWarmStorageServiceTest:testServiceProviderChangedSuccessDecoupled() (gas: 1087097) -FilecoinWarmStorageServiceTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1089831) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2258035) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2183776) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2056315) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1962470) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1008697) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2056163) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1847527) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1703151) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45296) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1682894) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1986352) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1987481) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1704791) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2104427) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1707427) -FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1680500) -FilecoinWarmStorageServiceTest:testTerminateCDNServiceLifecycle() (gas: 2331267) -FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2041975) -FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1993053) -FilecoinWarmStorageServiceTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2370215) -FilecoinWarmStorageServiceTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1016699) -FilecoinWarmStorageServiceTest:testTerminateServiceLifecycle() (gas: 2899273) -FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2258665) -FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2110324) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2129882) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43159) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1859760) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1006001) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1949678) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2024009) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2298244) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2345425) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_Success() (gas: 1972601) -FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1862010) -FilecoinWarmStorageServiceTest:testTransferCDNController() (gas: 132284) -FilecoinWarmStorageServiceTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40235) -FilecoinWarmStorageServiceTest:testUpgrade() (gas: 12835429) -FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriod() (gas: 1880553) -FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriodWithInvalidParameters() (gas: 130796) -FilecoinWarmStorageServiceUpgradeTest:testMigrate() (gas: 67312) -FilecoinWarmStorageServiceUpgradeTest:testMigrateOnlyOnce() (gas: 79611) -FilecoinWarmStorageServiceUpgradeTest:testMigrateWithViewContract() (gas: 1864235) -FilecoinWarmStorageServiceUpgradeTest:testNextPDPChallengeWindowStartThroughView() (gas: 1835630) -FilecoinWarmStorageServiceUpgradeTest:testSetViewContract() (gas: 1865547) -PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1787998) -PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1736698) -PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 2100228) -PoRepDealActivationTest:testExactBalanceSufficient() (gas: 2307379) -PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1741707) -PoRepDealActivationTest:testPieceAddedOnlyService() (gas: 1737096) -PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1743515) -PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1740206) -PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2442253) -PoRepDealExtendTest:testExtend() (gas: 197953) +FilecoinWarmStorageServiceTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1706580) +FilecoinWarmStorageServiceTest:testAddPiecesNonceReplayProtection() (gas: 1523855) +FilecoinWarmStorageServiceTest:testAddPiecesNonceUniquePerPayer() (gas: 2267119) +FilecoinWarmStorageServiceTest:testAddPieces_RateUpdatedImmediately() (gas: 1621762) +FilecoinWarmStorageServiceTest:testAnnouncePlannedUpgrade() (gas: 12658042) +FilecoinWarmStorageServiceTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 5061395) +FilecoinWarmStorageServiceTest:testAnnounceUpgradePlan() (gas: 12686367) +FilecoinWarmStorageServiceTest:testAnnounceUpgradePlanOnlyOwner() (gas: 5060151) +FilecoinWarmStorageServiceTest:testCreateDataSetAddPieces() (gas: 3164502) +FilecoinWarmStorageServiceTest:testCreateDataSetCreatesRail() (gas: 2348504) +FilecoinWarmStorageServiceTest:testCreateDataSetNoCDN() (gas: 3093210) +FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2089240) +FilecoinWarmStorageServiceTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2160989) +FilecoinWarmStorageServiceTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1283510) +FilecoinWarmStorageServiceTest:testDataSetMetaDataWithAllBoundaries() (gas: 8217812) +FilecoinWarmStorageServiceTest:testDataSetMetadataEmpty() (gas: 1060767) +FilecoinWarmStorageServiceTest:testDataSetMetadataKeyCountBoundaries() (gas: 5559601) +FilecoinWarmStorageServiceTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2580694) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorage() (gas: 1174849) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleDataSets() (gas: 2057196) +FilecoinWarmStorageServiceTest:testDataSetMetadataStorageMultipleKeys() (gas: 1391986) +FilecoinWarmStorageServiceTest:testDataSetMetadataValueLengthBoundaries() (gas: 2745568) +FilecoinWarmStorageServiceTest:testDatasetFee_AllSizesIncludeFee() (gas: 7404) +FilecoinWarmStorageServiceTest:testDatasetFee_ExactlyPoint024USDFC() (gas: 6233) +FilecoinWarmStorageServiceTest:testDatasetFee_IsAdditive() (gas: 5783) +FilecoinWarmStorageServiceTest:testEmptyStringMetadata() (gas: 2295780) +FilecoinWarmStorageServiceTest:testFilecoinServiceDeployedEvent() (gas: 5338491) +FilecoinWarmStorageServiceTest:testGetClientDataSets_EmptyClient() (gas: 27258) +FilecoinWarmStorageServiceTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3569600) +FilecoinWarmStorageServiceTest:testGetClientDataSets_MultipleDataSets() (gas: 2096729) +FilecoinWarmStorageServiceTest:testGetClientDataSets_SingleDataSet() (gas: 1173471) +FilecoinWarmStorageServiceTest:testGetClientDataSets_TerminatedDataSets() (gas: 3396046) +FilecoinWarmStorageServiceTest:testGetDataSetSizeInBytes_ReturnsRawSize() (gas: 25998) +FilecoinWarmStorageServiceTest:testGetEffectiveRatesValues() (gas: 17265) +FilecoinWarmStorageServiceTest:testGetPieceMetadata() (gas: 2210256) +FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23355) +FilecoinWarmStorageServiceTest:testGetPieceMetadata_NonExistentKey() (gas: 1950467) +FilecoinWarmStorageServiceTest:testGetPieceMetdataAllKeys() (gas: 2162360) +FilecoinWarmStorageServiceTest:testGetServicePriceValues() (gas: 24270) +FilecoinWarmStorageServiceTest:testGlobalParameters() (gas: 24979) +FilecoinWarmStorageServiceTest:testInitialState() (gas: 97508) +FilecoinWarmStorageServiceTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1494178) +FilecoinWarmStorageServiceTest:testInsufficientFunds_BelowMinimum() (gas: 687559) +FilecoinWarmStorageServiceTest:testInsufficientFunds_ExactMinimum() (gas: 1155887) +FilecoinWarmStorageServiceTest:testInsufficientFunds_JustAboveMinimum() (gas: 1156963) +FilecoinWarmStorageServiceTest:testMetadataQueries() (gas: 5015609) +FilecoinWarmStorageServiceTest:testNonceCannotBeReusedAcrossOperations() (gas: 1539405) +FilecoinWarmStorageServiceTest:testOperatorApproval_AllSufficient() (gas: 1156225) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 704293) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 702772) +FilecoinWarmStorageServiceTest:testOperatorApproval_InsufficientRateAllowance() (gas: 702583) +FilecoinWarmStorageServiceTest:testOperatorApproval_NotApproved() (gas: 622146) +FilecoinWarmStorageServiceTest:testPieceMetadataAllBoundaries() (gas: 7011821) +FilecoinWarmStorageServiceTest:testPieceMetadataArrayMismatchErrors() (gas: 1294522) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1783139) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1213836) +FilecoinWarmStorageServiceTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1215558) +FilecoinWarmStorageServiceTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1459439) +FilecoinWarmStorageServiceTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2310750) +FilecoinWarmStorageServiceTest:testPieceMetadataKeyCountBoundaries() (gas: 4184627) +FilecoinWarmStorageServiceTest:testPieceMetadataKeyLengthBoundaries() (gas: 3884254) +FilecoinWarmStorageServiceTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2156201) +FilecoinWarmStorageServiceTest:testPieceMetadataStorageAndRetrieval() (gas: 2161576) +FilecoinWarmStorageServiceTest:testPieceMetadataValueLengthBoundaries() (gas: 4047423) +FilecoinWarmStorageServiceTest:testProvenPeriods() (gas: 416252721) +FilecoinWarmStorageServiceTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1906961) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1117651) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41351) +FilecoinWarmStorageServiceTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1115623) +FilecoinWarmStorageServiceTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1823231) +FilecoinWarmStorageServiceTest:testRegression_CDNDataSetCleanup() (gas: 6625484) +FilecoinWarmStorageServiceTest:testServiceNameAndDescriptionValidation() (gas: 21032021) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1142599) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1124577) +FilecoinWarmStorageServiceTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1126230) +FilecoinWarmStorageServiceTest:testServiceProviderChangedSuccessDecoupled() (gas: 1154905) +FilecoinWarmStorageServiceTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1157878) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2346297) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2266690) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2133999) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 2032155) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1074524) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2133575) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1880046) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1732349) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45574) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1712138) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 2058889) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 2060280) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1734047) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2177062) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1735281) +FilecoinWarmStorageServiceTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1709712) +FilecoinWarmStorageServiceTest:testTerminateCDNServiceLifecycle() (gas: 2618727) +FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2073373) +FilecoinWarmStorageServiceTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 2026937) +FilecoinWarmStorageServiceTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2642431) +FilecoinWarmStorageServiceTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1087139) +FilecoinWarmStorageServiceTest:testTerminateServiceLifecycle() (gas: 3405384) +FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2705833) +FilecoinWarmStorageServiceTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2553119) +FilecoinWarmStorageServiceTest:testTerminateService_directPayer_emitsApprover() (gas: 1410193) +FilecoinWarmStorageServiceTest:testTerminateService_directSP_emitsApprover() (gas: 1447178) +FilecoinWarmStorageServiceTest:testTerminateService_extraData_callerNotServiceProvider() (gas: 1154776) +FilecoinWarmStorageServiceTest:testTerminateService_sessionKey() (gas: 1500226) +FilecoinWarmStorageServiceTest:testTerminateService_sessionKey_expiredKey() (gas: 1231185) +FilecoinWarmStorageServiceTest:testTerminateService_sessionKey_unauthorizedKey() (gas: 1176163) +FilecoinWarmStorageServiceTest:testTerminateService_sessionKey_wrongPermission() (gas: 1231208) +FilecoinWarmStorageServiceTest:testTerminateService_signatureApprover() (gas: 1665401) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2172205) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43410) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1891290) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1074085) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1983824) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2218925) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2339807) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2389566) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_Success() (gas: 2011688) +FilecoinWarmStorageServiceTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1896268) +FilecoinWarmStorageServiceTest:testTransferCDNController() (gas: 132333) +FilecoinWarmStorageServiceTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40174) +FilecoinWarmStorageServiceTest:testUpdatePaymentRates_NextProvingPeriodAfterRemovalUsesRawSize() (gas: 2059318) +FilecoinWarmStorageServiceTest:testUpdatePaymentRates_PiecesAddedUsesRawSize() (gas: 1579693) +FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriod() (gas: 2060999) +FilecoinWarmStorageServiceUpgradeTest:testConfigureProvingPeriodWithInvalidParameters() (gas: 130708) +FilecoinWarmStorageServiceUpgradeTest:testMigrate() (gas: 69746) +FilecoinWarmStorageServiceUpgradeTest:testMigrateOnlyOnce() (gas: 79567) +FilecoinWarmStorageServiceUpgradeTest:testMigrateWithViewContract() (gas: 2044659) +FilecoinWarmStorageServiceUpgradeTest:testNextPDPChallengeWindowStartThroughView() (gas: 2025594) +FilecoinWarmStorageServiceUpgradeTest:testSetViewContract() (gas: 2048427) +OpFeesTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1706690) +OpFeesTest:testAddPiecesNonceReplayProtection() (gas: 1524229) +OpFeesTest:testAddPiecesNonceUniquePerPayer() (gas: 2267295) +OpFeesTest:testAddPieces_RateUpdatedImmediately() (gas: 1622134) +OpFeesTest:testAnnouncePlannedUpgrade() (gas: 12658634) +OpFeesTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 5061549) +OpFeesTest:testAnnounceUpgradePlan() (gas: 12686958) +OpFeesTest:testAnnounceUpgradePlanOnlyOwner() (gas: 5060283) +OpFeesTest:testCreateDataSetAddPieces() (gas: 3164792) +OpFeesTest:testCreateDataSetCreatesRail() (gas: 2348812) +OpFeesTest:testCreateDataSetNoCDN() (gas: 3093500) +OpFeesTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2089658) +OpFeesTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2161132) +OpFeesTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1283620) +OpFeesTest:testDataSetMetaDataWithAllBoundaries() (gas: 8218169) +OpFeesTest:testDataSetMetadataEmpty() (gas: 1060987) +OpFeesTest:testDataSetMetadataKeyCountBoundaries() (gas: 5559601) +OpFeesTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2580937) +OpFeesTest:testDataSetMetadataStorage() (gas: 1175201) +OpFeesTest:testDataSetMetadataStorageMultipleDataSets() (gas: 2057306) +OpFeesTest:testDataSetMetadataStorageMultipleKeys() (gas: 1392162) +OpFeesTest:testDataSetMetadataValueLengthBoundaries() (gas: 2745876) +OpFeesTest:testDatasetFee_AllSizesIncludeFee() (gas: 7734) +OpFeesTest:testDatasetFee_ExactlyPoint024USDFC() (gas: 6453) +OpFeesTest:testDatasetFee_IsAdditive() (gas: 5915) +OpFeesTest:testEmptyStringMetadata() (gas: 2295890) +OpFeesTest:testFilecoinServiceDeployedEvent() (gas: 5338667) +OpFeesTest:testGetClientDataSets_EmptyClient() (gas: 27566) +OpFeesTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3569871) +OpFeesTest:testGetClientDataSets_MultipleDataSets() (gas: 2097081) +OpFeesTest:testGetClientDataSets_SingleDataSet() (gas: 1173471) +OpFeesTest:testGetClientDataSets_TerminatedDataSets() (gas: 3396310) +OpFeesTest:testGetDataSetSizeInBytes_ReturnsRawSize() (gas: 26350) +OpFeesTest:testGetEffectiveRatesValues() (gas: 17375) +OpFeesTest:testGetPieceMetadata() (gas: 2210506) +OpFeesTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23355) +OpFeesTest:testGetPieceMetadata_NonExistentKey() (gas: 1950841) +OpFeesTest:testGetPieceMetdataAllKeys() (gas: 2162690) +OpFeesTest:testGetServicePriceValues() (gas: 24578) +OpFeesTest:testGlobalParameters() (gas: 25023) +OpFeesTest:testInitialState() (gas: 97750) +OpFeesTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1494251) +OpFeesTest:testInsufficientFunds_BelowMinimum() (gas: 687713) +OpFeesTest:testInsufficientFunds_ExactMinimum() (gas: 1156099) +OpFeesTest:testInsufficientFunds_JustAboveMinimum() (gas: 1157307) +OpFeesTest:testMetadataQueries() (gas: 5015785) +OpFeesTest:testNonceCannotBeReusedAcrossOperations() (gas: 1539537) +OpFeesTest:testOperatorApproval_AllSufficient() (gas: 1156423) +OpFeesTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 704667) +OpFeesTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 702948) +OpFeesTest:testOperatorApproval_InsufficientRateAllowance() (gas: 702737) +OpFeesTest:testOperatorApproval_NotApproved() (gas: 622314) +OpFeesTest:testPieceMetadataAllBoundaries() (gas: 7011865) +OpFeesTest:testPieceMetadataArrayMismatchErrors() (gas: 1294632) +OpFeesTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1783402) +OpFeesTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1213836) +OpFeesTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1215712) +OpFeesTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1459593) +OpFeesTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2310874) +OpFeesTest:testPieceMetadataKeyCountBoundaries() (gas: 4185177) +OpFeesTest:testPieceMetadataKeyLengthBoundaries() (gas: 3884474) +OpFeesTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2156311) +OpFeesTest:testPieceMetadataStorageAndRetrieval() (gas: 2161928) +OpFeesTest:testPieceMetadataValueLengthBoundaries() (gas: 4047775) +OpFeesTest:testProvenPeriods() (gas: 416252897) +OpFeesTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1907269) +OpFeesTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1118005) +OpFeesTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41395) +OpFeesTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1115733) +OpFeesTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1823363) +OpFeesTest:testRegression_CDNDataSetCleanup() (gas: 6625813) +OpFeesTest:testServiceNameAndDescriptionValidation() (gas: 21032021) +OpFeesTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1142797) +OpFeesTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1124687) +OpFeesTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1126507) +OpFeesTest:testServiceProviderChangedSuccessDecoupled() (gas: 1155246) +OpFeesTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1158054) +OpFeesTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2346643) +OpFeesTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2267036) +OpFeesTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2134109) +OpFeesTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 2032331) +OpFeesTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1074832) +OpFeesTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2133891) +OpFeesTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1880178) +OpFeesTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1732459) +OpFeesTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45926) +OpFeesTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1712336) +OpFeesTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 2059065) +OpFeesTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 2060654) +OpFeesTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1734355) +OpFeesTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2177172) +OpFeesTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1735593) +OpFeesTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1709822) +OpFeesTest:testTerminateCDNServiceLifecycle() (gas: 2618960) +OpFeesTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2073685) +OpFeesTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 2026937) +OpFeesTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2642563) +OpFeesTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1087315) +OpFeesTest:testTerminateServiceLifecycle() (gas: 3405494) +OpFeesTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2706141) +OpFeesTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2553427) +OpFeesTest:testTerminateService_directPayer_emitsApprover() (gas: 1410237) +OpFeesTest:testTerminateService_directSP_emitsApprover() (gas: 1447266) +OpFeesTest:testTerminateService_extraData_callerNotServiceProvider() (gas: 1155108) +OpFeesTest:testTerminateService_sessionKey() (gas: 1500336) +OpFeesTest:testTerminateService_sessionKey_expiredKey() (gas: 1231396) +OpFeesTest:testTerminateService_sessionKey_unauthorizedKey() (gas: 1176528) +OpFeesTest:testTerminateService_sessionKey_wrongPermission() (gas: 1231463) +OpFeesTest:testTerminateService_signatureApprover() (gas: 1665599) +OpFeesTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2172249) +OpFeesTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43718) +OpFeesTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1891400) +OpFeesTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1074217) +OpFeesTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1983824) +OpFeesTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2218947) +OpFeesTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2340115) +OpFeesTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2389654) +OpFeesTest:testTopUpCDNPaymentRails_Success() (gas: 2011688) +OpFeesTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1896444) +OpFeesTest:testTransferCDNController() (gas: 132377) +OpFeesTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40174) +OpFeesTest:testUpdatePaymentRates_NextProvingPeriodAfterRemovalUsesRawSize() (gas: 2059500) +OpFeesTest:testUpdatePaymentRates_PiecesAddedUsesRawSize() (gas: 1579985) +OpFeesTest:test_addPiecesFee_immediateFlush() (gas: 1604154) +OpFeesTest:test_addPiecesFee_largeBatch_revertsInsufficientFunds() (gas: 8709069) +OpFeesTest:test_addPiecesFee_largeBatch_triggersReplenishment() (gas: 9080496) +OpFeesTest:test_addPieces_depleted_reserve_reverts() (gas: 8765788) +OpFeesTest:test_createTerminate_createFeeFlushes() (gas: 1534192) +OpFeesTest:test_multipleRemovalFees_accumulate() (gas: 2454610) +OpFeesTest:test_nextProvingPeriod_postTermination_withExhaustedReserve() (gas: 4933605) +OpFeesTest:test_schedulePieceRemoval_depleted_reserve_reverts_remainingPaid() (gas: 8914374) +OpFeesTest:test_scheduledRemovalFee_deferredThenFlushed() (gas: 2134439) +OpFeesTest:test_terminateFee_chargedOnConsentCase() (gas: 1982178) +OpFeesTest:test_terminateFee_flushedWithoutRemovals() (gas: 1981519) +OpFeesTest:test_terminateFee_notChargedOnPayerDirectCall() (gas: 1844681) +OpFeesTest:test_terminateFee_notChargedOnSpInitiated() (gas: 1843632) +OpFeesTest:test_topUpLifecycleReserve_bit97_truncated() (gas: 1330140) +OpFeesTest:test_topUpLifecycleReserve_callerNotPayer_reverts() (gas: 1149888) +OpFeesTest:test_topUpLifecycleReserve_nonExistentDataSet_reverts() (gas: 42885) +OpFeesTest:test_topUpLifecycleReserve_overflow_reverts() (gas: 1202731) +OpFeesTest:test_topUpLifecycleReserve_terminated_reverts() (gas: 1394913) +PoRepDealActivationTest:testAddPiecesDuplicate() (gas: 1790498) +PoRepDealActivationTest:testAddPiecesUnauthorized() (gas: 1739198) +PoRepDealActivationTest:testCannotActivatePieceTwice() (gas: 2102728) +PoRepDealActivationTest:testExactBalanceSufficient() (gas: 2309879) +PoRepDealActivationTest:testPieceAddedCommitmentTooShort() (gas: 1744207) +PoRepDealActivationTest:testPieceAddedOnlyService() (gas: 1739596) +PoRepDealActivationTest:testPieceAddedUnauthorized() (gas: 1746015) +PoRepDealActivationTest:testPieceAddedWrongProvider() (gas: 1742706) +PoRepDealActivationTest:testSudoWithdrawAfterAmortize() (gas: 2447253) +PoRepDealExtendTest:testExtend() (gas: 200453) PoRepDealExtendTest:testExtendRevertsAfterExpiry() (gas: 35592) PoRepDealExtendTest:testExtendRevertsIfNotClient() (gas: 30176) PoRepDealExtendTest:testExtendRevertsWhenFaulted() (gas: 265734) PoRepDealExtendTest:testSweepRevertsBeforeExpiry() (gas: 32270) -PoRepDealSectorStatusTest:testBothSectorsRecovered() (gas: 1107078) +PoRepDealSectorStatusTest:testBothSectorsRecovered() (gas: 1112078) PoRepDealSectorStatusTest:testClientCannotDirectlyTerminateRail() (gas: 89979) PoRepDealSectorStatusTest:testSectorExpiredAfterActivation() (gas: 304131) PoRepDealSectorStatusTest:testSectorExpiredAfterDealEnd() (gas: 34061) @@ -294,351 +473,391 @@ PoRepDealSectorStatusTest:testTerminateStrangerUnauthorized() (gas: 45101) PoRepDealSectorStatusTest:testUpdateLockupsPayeeReceiverUnauthorized() (gas: 45439) PoRepDealSectorStatusTest:testUpdateLockupsReceiverNonceUnauthorized() (gas: 45335) PoRepDealSectorStatusTest:testUpdateLockupsStrangerUnauthorized() (gas: 44654) -PoRepPayeeTest:testOwner() (gas: 53221) +PoRepPayeeTest:testOwner() (gas: 55721) PoRepPayeeTest:testSudo() (gas: 94891) PoRepPayeeTest:testSudoForwardsInnerRevert() (gas: 155667) PoRepPayeeTest:testSudoUnauthorized() (gas: 107528) PoRepServiceTest:testCreateDealNotMiner() (gas: 40898) -PoRepServiceTest:testCreateReceiver() (gas: 300863) +PoRepServiceTest:testCreateReceiver() (gas: 303363) PoRepServiceTest:testForbiddenMethod() (gas: 33401) PoRepServiceTest:testUpdateLockupsNotDeal() (gas: 31362) +PriceListTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1706602) +PriceListTest:testAddPiecesNonceReplayProtection() (gas: 1523943) +PriceListTest:testAddPiecesNonceUniquePerPayer() (gas: 2267163) +PriceListTest:testAddPieces_RateUpdatedImmediately() (gas: 1621850) +PriceListTest:testAnnouncePlannedUpgrade() (gas: 12658042) +PriceListTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 5061417) +PriceListTest:testAnnounceUpgradePlan() (gas: 12686389) +PriceListTest:testAnnounceUpgradePlanOnlyOwner() (gas: 5060173) +PriceListTest:testCreateDataSetAddPieces() (gas: 3164524) +PriceListTest:testCreateDataSetCreatesRail() (gas: 2348570) +PriceListTest:testCreateDataSetNoCDN() (gas: 3093210) +PriceListTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2089328) +PriceListTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2161011) +PriceListTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1283532) +PriceListTest:testDataSetMetaDataWithAllBoundaries() (gas: 8217812) +PriceListTest:testDataSetMetadataEmpty() (gas: 1060833) +PriceListTest:testDataSetMetadataKeyCountBoundaries() (gas: 5559601) +PriceListTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2580716) +PriceListTest:testDataSetMetadataStorage() (gas: 1174937) +PriceListTest:testDataSetMetadataStorageMultipleDataSets() (gas: 2057218) +PriceListTest:testDataSetMetadataStorageMultipleKeys() (gas: 1392008) +PriceListTest:testDataSetMetadataValueLengthBoundaries() (gas: 2745656) +PriceListTest:testDatasetFee_AllSizesIncludeFee() (gas: 7492) +PriceListTest:testDatasetFee_ExactlyPoint024USDFC() (gas: 6299) +PriceListTest:testDatasetFee_IsAdditive() (gas: 5805) +PriceListTest:testEmptyStringMetadata() (gas: 2295802) +PriceListTest:testFilecoinServiceDeployedEvent() (gas: 5338557) +PriceListTest:testGetClientDataSets_EmptyClient() (gas: 27324) +PriceListTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3569600) +PriceListTest:testGetClientDataSets_MultipleDataSets() (gas: 2096817) +PriceListTest:testGetClientDataSets_SingleDataSet() (gas: 1173471) +PriceListTest:testGetClientDataSets_TerminatedDataSets() (gas: 3396112) +PriceListTest:testGetDataSetSizeInBytes_ReturnsRawSize() (gas: 26086) +PriceListTest:testGetEffectiveRatesValues() (gas: 17287) +PriceListTest:testGetPieceMetadata() (gas: 2210322) +PriceListTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23355) +PriceListTest:testGetPieceMetadata_NonExistentKey() (gas: 1950555) +PriceListTest:testGetPieceMetdataAllKeys() (gas: 2162448) +PriceListTest:testGetServicePriceValues() (gas: 24357) +PriceListTest:testGlobalParameters() (gas: 24979) +PriceListTest:testInitialState() (gas: 97574) +PriceListTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1494178) +PriceListTest:testInsufficientFunds_BelowMinimum() (gas: 687581) +PriceListTest:testInsufficientFunds_ExactMinimum() (gas: 1155909) +PriceListTest:testInsufficientFunds_JustAboveMinimum() (gas: 1157029) +PriceListTest:testMetadataQueries() (gas: 5015631) +PriceListTest:testNonceCannotBeReusedAcrossOperations() (gas: 1539427) +PriceListTest:testOperatorApproval_AllSufficient() (gas: 1156291) +PriceListTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 704381) +PriceListTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 702794) +PriceListTest:testOperatorApproval_InsufficientRateAllowance() (gas: 702605) +PriceListTest:testOperatorApproval_NotApproved() (gas: 622168) +PriceListTest:testPieceMetadataAllBoundaries() (gas: 7011821) +PriceListTest:testPieceMetadataArrayMismatchErrors() (gas: 1294544) +PriceListTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1783205) +PriceListTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1213836) +PriceListTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1215580) +PriceListTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1459461) +PriceListTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2310772) +PriceListTest:testPieceMetadataKeyCountBoundaries() (gas: 4184627) +PriceListTest:testPieceMetadataKeyLengthBoundaries() (gas: 3884320) +PriceListTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2156223) +PriceListTest:testPieceMetadataStorageAndRetrieval() (gas: 2161664) +PriceListTest:testPieceMetadataValueLengthBoundaries() (gas: 4047511) +PriceListTest:testProvenPeriods() (gas: 416252743) +PriceListTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1907027) +PriceListTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1117651) +PriceListTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41351) +PriceListTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1115645) +PriceListTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1823253) +PriceListTest:testRegression_CDNDataSetCleanup() (gas: 6625572) +PriceListTest:testServiceNameAndDescriptionValidation() (gas: 21032021) +PriceListTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1142665) +PriceListTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1124599) +PriceListTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1126296) +PriceListTest:testServiceProviderChangedSuccessDecoupled() (gas: 1154905) +PriceListTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1157900) +PriceListTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2346297) +PriceListTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2266690) +PriceListTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2134021) +PriceListTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 2032177) +PriceListTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1074590) +PriceListTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2133597) +PriceListTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1880068) +PriceListTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1732371) +PriceListTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45662) +PriceListTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1712204) +PriceListTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 2058911) +PriceListTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 2060368) +PriceListTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1734113) +PriceListTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2177084) +PriceListTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1735347) +PriceListTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1709734) +PriceListTest:testTerminateCDNServiceLifecycle() (gas: 2618749) +PriceListTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2073373) +PriceListTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 2026937) +PriceListTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2642453) +PriceListTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1087183) +PriceListTest:testTerminateServiceLifecycle() (gas: 3405406) +PriceListTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2705921) +PriceListTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2553185) +PriceListTest:testTerminateService_directPayer_emitsApprover() (gas: 1410193) +PriceListTest:testTerminateService_directSP_emitsApprover() (gas: 1447200) +PriceListTest:testTerminateService_extraData_callerNotServiceProvider() (gas: 1154842) +PriceListTest:testTerminateService_sessionKey() (gas: 1500248) +PriceListTest:testTerminateService_sessionKey_expiredKey() (gas: 1231207) +PriceListTest:testTerminateService_sessionKey_unauthorizedKey() (gas: 1176229) +PriceListTest:testTerminateService_sessionKey_wrongPermission() (gas: 1231274) +PriceListTest:testTerminateService_signatureApprover() (gas: 1665467) +PriceListTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2172205) +PriceListTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43476) +PriceListTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1891312) +PriceListTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1074107) +PriceListTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1983824) +PriceListTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2218925) +PriceListTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2339873) +PriceListTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2389588) +PriceListTest:testTopUpCDNPaymentRails_Success() (gas: 2011688) +PriceListTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1896334) +PriceListTest:testTransferCDNController() (gas: 132333) +PriceListTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40174) +PriceListTest:testUpdatePaymentRates_NextProvingPeriodAfterRemovalUsesRawSize() (gas: 2059340) +PriceListTest:testUpdatePaymentRates_PiecesAddedUsesRawSize() (gas: 1579759) +PriceListTest:test_getPriceList_fees() (gas: 27846) +PriceListTest:test_getPriceList_lockups() (gas: 29658) +PriceListTest:test_getPriceList_rates() (gas: 27047) +PriceListTest:test_getPriceList_token() (gas: 25161) ProductTypesTest:testPDPKeys() (gas: 14050) -ProviderIdSetTest:testAddDuplicates() (gas: 539153) -ProviderIdSetTest:testAddGet() (gas: 145816659) -ProviderIdSetTest:testAddManyDuplicates() (gas: 4221789) -ProviderIdSetTest:testAddRemoveLargeIds() (gas: 5820584) -ProviderIdSetTest:testOwnable() (gas: 177292) +ProviderIdSetTest:testAddDuplicates() (gas: 589153) +ProviderIdSetTest:testAddGet() (gas: 148064159) +ProviderIdSetTest:testAddManyDuplicates() (gas: 4226789) +ProviderIdSetTest:testAddRemoveLargeIds() (gas: 6300584) +ProviderIdSetTest:testOwnable() (gas: 182292) ProviderIdSetTest:testProviderIdTooLarge() (gas: 134767) -ProviderIdSetTest:testRemoveFIFO() (gas: 56310423) -ProviderIdSetTest:testRemoveLIFO() (gas: 55504153) -ProviderValidationTest:testAddAndRemoveApprovedProvider() (gas: 268735) -ProviderValidationTest:testAddApprovedProviderAlreadyApproved() (gas: 156652) -ProviderValidationTest:testConsistencyBetweenIsApprovedAndGetAll() (gas: 734967) -ProviderValidationTest:testGetApprovedProviders() (gas: 475420) -ProviderValidationTest:testGetApprovedProvidersLength() (gas: 365893) -ProviderValidationTest:testGetApprovedProvidersPaginated() (gas: 550600) -ProviderValidationTest:testGetApprovedProvidersPaginatedConsistency() (gas: 966335) -ProviderValidationTest:testGetApprovedProvidersPaginatedEdgeCases() (gas: 162375) -ProviderValidationTest:testGetApprovedProvidersPaginatedGasEfficiency() (gas: 8157616) -ProviderValidationTest:testGetApprovedProvidersWithSingleProvider() (gas: 175073) -ProviderValidationTest:testOnlyOwnerCanManageApprovedProviders() (gas: 168786) -ProviderValidationTest:testProviderApprovedCanCreateDataset() (gas: 1898320) -ProviderValidationTest:testProviderNotRegistered() (gas: 69775) -ProviderValidationTest:testProviderRegisteredButNotApproved() (gas: 1731401) -ProviderValidationTest:testRemoveApprovedProviderNotInList() (gas: 197962) -ServiceProviderRegistryFullTest:testCanRemoveLastProduct() (gas: 976390) -ServiceProviderRegistryFullTest:testCanReregisterAfterRemoval() (gas: 1734718) -ServiceProviderRegistryFullTest:testCannotAddProductTwice() (gas: 877155) -ServiceProviderRegistryFullTest:testCannotRegisterTwice() (gas: 847298) -ServiceProviderRegistryFullTest:testCannotRemoveAlreadyRemoved() (gas: 912219) -ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionIfNotOwner() (gas: 820680) -ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionTooLong() (gas: 830123) -ServiceProviderRegistryFullTest:testCannotUpdateRemovedProvider() (gas: 932529) -ServiceProviderRegistryFullTest:testCapabilityUpdateClearsOldValues() (gas: 1361971) +ProviderIdSetTest:testRemoveFIFO() (gas: 57215423) +ProviderIdSetTest:testRemoveLIFO() (gas: 56229153) +ProviderValidationTest:testAddAndRemoveApprovedProvider() (gas: 271033) +ProviderValidationTest:testAddApprovedProviderAlreadyApproved() (gas: 156586) +ProviderValidationTest:testConsistencyBetweenIsApprovedAndGetAll() (gas: 766891) +ProviderValidationTest:testGetApprovedProviders() (gas: 484998) +ProviderValidationTest:testGetApprovedProvidersLength() (gas: 373195) +ProviderValidationTest:testGetApprovedProvidersPaginated() (gas: 562682) +ProviderValidationTest:testGetApprovedProvidersPaginatedConsistency() (gas: 975785) +ProviderValidationTest:testGetApprovedProvidersPaginatedEdgeCases() (gas: 167199) +ProviderValidationTest:testGetApprovedProvidersPaginatedGasEfficiency() (gas: 8157784) +ProviderValidationTest:testGetApprovedProvidersWithSingleProvider() (gas: 177437) +ProviderValidationTest:testOnlyOwnerCanManageApprovedProviders() (gas: 168698) +ProviderValidationTest:testProviderApprovedCanCreateDataset() (gas: 1966195) +ProviderValidationTest:testProviderNotRegistered() (gas: 69843) +ProviderValidationTest:testProviderRegisteredButNotApproved() (gas: 1799228) +ProviderValidationTest:testRemoveApprovedProviderNotInList() (gas: 197826) +ServiceProviderRegistryFullTest:testCanRemoveLastProduct() (gas: 981632) +ServiceProviderRegistryFullTest:testCanReregisterAfterRemoval() (gas: 1737404) +ServiceProviderRegistryFullTest:testCannotAddProductTwice() (gas: 877231) +ServiceProviderRegistryFullTest:testCannotRegisterTwice() (gas: 847320) +ServiceProviderRegistryFullTest:testCannotRemoveAlreadyRemoved() (gas: 912304) +ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionIfNotOwner() (gas: 820724) +ServiceProviderRegistryFullTest:testCannotUpdateProviderDescriptionTooLong() (gas: 830167) +ServiceProviderRegistryFullTest:testCannotUpdateRemovedProvider() (gas: 932595) +ServiceProviderRegistryFullTest:testCapabilityUpdateClearsOldValues() (gas: 1372069) ServiceProviderRegistryFullTest:testDescriptionTooLong() (gas: 106463) -ServiceProviderRegistryFullTest:testDirectMappingAccess() (gas: 1021306) -ServiceProviderRegistryFullTest:testEmptyCapabilityKey() (gas: 263232) -ServiceProviderRegistryFullTest:testEmptyCapabilityValue() (gas: 263303) -ServiceProviderRegistryFullTest:testEventTimestampsEmittedCorrectly() (gas: 1239208) -ServiceProviderRegistryFullTest:testGetActiveProvidersByProductType() (gas: 2404816) -ServiceProviderRegistryFullTest:testGetAllActiveProviders() (gas: 2226514) -ServiceProviderRegistryFullTest:testGetNonExistentProvider() (gas: 52321) -ServiceProviderRegistryFullTest:testGetProduct() (gas: 991214) -ServiceProviderRegistryFullTest:testGetProductCapabilities() (gas: 1072527) -ServiceProviderRegistryFullTest:testGetProductCapability() (gas: 998644) -ServiceProviderRegistryFullTest:testGetProviderCount() (gas: 1590953) -ServiceProviderRegistryFullTest:testGetProvidersByProductType() (gas: 2405198) -ServiceProviderRegistryFullTest:testInitialState() (gas: 98206) -ServiceProviderRegistryFullTest:testInvalidCapabilityArrayLengthMismatch() (gas: 215157) -ServiceProviderRegistryFullTest:testInvalidCapabilityKeyTooLong() (gas: 256148) -ServiceProviderRegistryFullTest:testInvalidCapabilityValueTooLong() (gas: 258745) -ServiceProviderRegistryFullTest:testMaxCapabilitiesAllowed() (gas: 1896657) -ServiceProviderRegistryFullTest:testMultipleUpdatesInSameBlock() (gas: 1223631) +ServiceProviderRegistryFullTest:testDirectMappingAccess() (gas: 1023828) +ServiceProviderRegistryFullTest:testEmptyCapabilityKey() (gas: 263254) +ServiceProviderRegistryFullTest:testEmptyCapabilityValue() (gas: 263325) +ServiceProviderRegistryFullTest:testEventTimestampsEmittedCorrectly() (gas: 1239352) +ServiceProviderRegistryFullTest:testGetActiveProvidersByProductType() (gas: 2404980) +ServiceProviderRegistryFullTest:testGetAllActiveProviders() (gas: 2226624) +ServiceProviderRegistryFullTest:testGetNonExistentProvider() (gas: 57419) +ServiceProviderRegistryFullTest:testGetProduct() (gas: 993861) +ServiceProviderRegistryFullTest:testGetProductCapabilities() (gas: 1075147) +ServiceProviderRegistryFullTest:testGetProductCapability() (gas: 1006166) +ServiceProviderRegistryFullTest:testGetProviderCount() (gas: 1598541) +ServiceProviderRegistryFullTest:testGetProvidersByProductType() (gas: 2405345) +ServiceProviderRegistryFullTest:testInitialState() (gas: 118316) +ServiceProviderRegistryFullTest:testInvalidCapabilityArrayLengthMismatch() (gas: 215179) +ServiceProviderRegistryFullTest:testInvalidCapabilityKeyTooLong() (gas: 256170) +ServiceProviderRegistryFullTest:testInvalidCapabilityValueTooLong() (gas: 258767) +ServiceProviderRegistryFullTest:testMaxCapabilitiesAllowed() (gas: 1899255) +ServiceProviderRegistryFullTest:testMultipleUpdatesInSameBlock() (gas: 1223805) ServiceProviderRegistryFullTest:testNameTooLongOnRegister() (gas: 118438) -ServiceProviderRegistryFullTest:testNameTooLongOnUpdate() (gas: 863659) -ServiceProviderRegistryFullTest:testOnlyOwnerCanRemove() (gas: 819336) -ServiceProviderRegistryFullTest:testOnlyOwnerCanUpdate() (gas: 840460) -ServiceProviderRegistryFullTest:testProviderHasProduct() (gas: 803667) -ServiceProviderRegistryFullTest:testRegisterMultipleProviders() (gas: 2139227) -ServiceProviderRegistryFullTest:testRegisterProvider() (gas: 1470255) -ServiceProviderRegistryFullTest:testRegisterWithCapabilities() (gas: 1263952) +ServiceProviderRegistryFullTest:testNameTooLongOnUpdate() (gas: 863703) +ServiceProviderRegistryFullTest:testOnlyOwnerCanRemove() (gas: 819377) +ServiceProviderRegistryFullTest:testOnlyOwnerCanUpdate() (gas: 840482) +ServiceProviderRegistryFullTest:testProviderHasProduct() (gas: 803738) +ServiceProviderRegistryFullTest:testRegisterMultipleProviders() (gas: 2152021) +ServiceProviderRegistryFullTest:testRegisterProvider() (gas: 1488054) +ServiceProviderRegistryFullTest:testRegisterWithCapabilities() (gas: 1266599) ServiceProviderRegistryFullTest:testRegisterWithExcessFee() (gas: 110467) ServiceProviderRegistryFullTest:testRegisterWithInsufficientFee() (gas: 150421) -ServiceProviderRegistryFullTest:testRegisterWithInvalidData() (gas: 473839) -ServiceProviderRegistryFullTest:testRemoveProvider() (gas: 1005829) -ServiceProviderRegistryFullTest:testTooManyCapabilities() (gas: 343261) -ServiceProviderRegistryFullTest:testUpdateProduct() (gas: 1244623) -ServiceProviderRegistryFullTest:testUpdateProviderDescription() (gas: 914777) -ServiceProviderRegistryFullTest:testUpdateWithCapabilities() (gas: 1353468) -ServiceProviderRegistryFullTest:testUpdateWithTooManyCapabilities() (gas: 1004797) -ServiceProviderRegistryPaginationTest:testActiveProviderCountTracking() (gas: 2485324) -ServiceProviderRegistryPaginationTest:testPaginationConsistencyWithGetAll() (gas: 4328415) -ServiceProviderRegistryPaginationTest:testPaginationEdgeLimits() (gas: 2174446) -ServiceProviderRegistryPaginationTest:testPaginationNoProviders() (gas: 40522) -ServiceProviderRegistryPaginationTest:testPaginationPageBoundaries() (gas: 3560870) -ServiceProviderRegistryPaginationTest:testPaginationSingleProvider() (gas: 850519) -ServiceProviderRegistryPaginationTest:testPaginationWithInactiveProviders() (gas: 3701880) -ServiceProviderRegistryPaginationTest:testSequentialPagination() (gas: 6867428) -ServiceProviderRegistryTest:testAnnouncePlannedUpgrade() (gas: 4265051) -ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidEpoch() (gas: 4061643) -ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidImplementation() (gas: 41109) -ServiceProviderRegistryTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 4061261) -ServiceProviderRegistryTest:testBeneficiaryIsSetCorrectly() (gas: 824101) -ServiceProviderRegistryTest:testCannotRegisterWithZeroBeneficiary() (gas: 78800) -ServiceProviderRegistryTest:testCannotReinitialize() (gas: 37221) -ServiceProviderRegistryTest:testGetProviderPayeeReturnsCorrectAddress() (gas: 809190) -ServiceProviderRegistryTest:testGetProviderPayeeRevertsForInvalidProviderId() (gas: 27625) -ServiceProviderRegistryTest:testGetProviderWorks() (gas: 819338) -ServiceProviderRegistryTest:testGetProvidersByIdsEmptyArray() (gas: 19076) -ServiceProviderRegistryTest:testGetProvidersByIdsInactiveProvider() (gas: 970622) -ServiceProviderRegistryTest:testGetProvidersByIdsInvalidIds() (gas: 44583) -ServiceProviderRegistryTest:testGetProvidersByIdsMixedValidAndInvalid() (gas: 896699) -ServiceProviderRegistryTest:testGetProvidersByIdsMultipleValidProviders() (gas: 1633503) -ServiceProviderRegistryTest:testGetProvidersByIdsSingleValidProvider() (gas: 881054) -ServiceProviderRegistryTest:testInitialState() (gas: 41401) -ServiceProviderRegistryTest:testIsRegisteredProviderReturnsFalse() (gas: 32300) -ServiceProviderRegistryTest:testOnlyOwnerCanUpgrade() (gas: 4171412) -ServiceProviderRegistryTest:testRegisterProviderWithCapabilities() (gas: 1131277) -ServiceProviderRegistryTest:testTransferOwnership() (gas: 55516) -SybilFeeTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1522448) -SybilFeeTest:testAddPiecesNonceReplayProtection() (gas: 1401588) -SybilFeeTest:testAddPiecesNonceUniquePerPayer() (gas: 2057012) -SybilFeeTest:testAddPieces_RateUpdatedImmediately() (gas: 1496364) -SybilFeeTest:testCreateDataSetAddPieces() (gas: 2912370) -SybilFeeTest:testCreateDataSetCreatesRail() (gas: 2304459) -SybilFeeTest:testCreateDataSetNoCDN() (gas: 2811723) -SybilFeeTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2060592) -SybilFeeTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2129807) -SybilFeeTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1229806) -SybilFeeTest:testDataSetCreation_BurnRailTerminated() (gas: 1064749) -SybilFeeTest:testDataSetCreation_InsufficientFundsForSybilFee() (gas: 616086) -SybilFeeTest:testDataSetCreation_SybilFeeBurned() (gas: 1056835) -SybilFeeTest:testDataSetCreation_SybilFeeWithCDN() (gas: 1748435) -SybilFeeTest:testDataSetMetaDataWithAllBoundaries() (gas: 8459903) -SybilFeeTest:testDataSetMetadataEmpty() (gas: 992809) -SybilFeeTest:testDataSetMetadataKeyCountBoundaries() (gas: 5360988) -SybilFeeTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2419605) -SybilFeeTest:testDataSetMetadataStorage() (gas: 1104391) -SybilFeeTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1901739) -SybilFeeTest:testDataSetMetadataStorageMultipleKeys() (gas: 1316677) -SybilFeeTest:testDataSetMetadataValueLengthBoundaries() (gas: 2652029) -SybilFeeTest:testEmptyStringMetadata() (gas: 2172033) -SybilFeeTest:testFilecoinServiceDeployedEvent() (gas: 5585892) -SybilFeeTest:testGetClientDataSets_EmptyClient() (gas: 27141) -SybilFeeTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3195054) -SybilFeeTest:testGetClientDataSets_MultipleDataSets() (gas: 1942578) -SybilFeeTest:testGetClientDataSets_SingleDataSet() (gas: 1105165) -SybilFeeTest:testGetClientDataSets_TerminatedDataSets() (gas: 3031582) -SybilFeeTest:testGetEffectiveRatesValues() (gas: 21510) -SybilFeeTest:testGetPieceMetadata() (gas: 2150458) -SybilFeeTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) -SybilFeeTest:testGetPieceMetadata_NonExistentKey() (gas: 1895468) -SybilFeeTest:testGetPieceMetdataAllKeys() (gas: 2107396) -SybilFeeTest:testGetServicePriceValues() (gas: 28257) -SybilFeeTest:testGlobalParameters() (gas: 24995) -SybilFeeTest:testInitialState() (gas: 97464) -SybilFeeTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1375655) -SybilFeeTest:testInsufficientFunds_BelowMinimum() (gas: 690716) -SybilFeeTest:testInsufficientFunds_ExactMinimum() (gas: 1087520) -SybilFeeTest:testInsufficientFunds_JustAboveMinimum() (gas: 1088693) -SybilFeeTest:testMetadataQueries() (gas: 4787019) -SybilFeeTest:testMinimumPricing_CrossoverPoint() (gas: 32476) -SybilFeeTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20760) -SybilFeeTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 39595) -SybilFeeTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 58164) -SybilFeeTest:testNonceCannotBeReusedAcrossOperations() (gas: 1417061) -SybilFeeTest:testOperatorApproval_AllSufficient() (gas: 1088171) -SybilFeeTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 707450) -SybilFeeTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 705900) -SybilFeeTest:testOperatorApproval_InsufficientRateAllowance() (gas: 705663) -SybilFeeTest:testOperatorApproval_NotApproved() (gas: 625295) -SybilFeeTest:testPieceMetadataAllBoundaries() (gas: 8082879) -SybilFeeTest:testPieceMetadataArrayMismatchErrors() (gas: 1225987) -SybilFeeTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1715141) -SybilFeeTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1145714) -SybilFeeTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1147246) -SybilFeeTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1399438) -SybilFeeTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2212090) -SybilFeeTest:testPieceMetadataKeyCountBoundaries() (gas: 4489495) -SybilFeeTest:testPieceMetadataKeyLengthBoundaries() (gas: 3707732) -SybilFeeTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2081399) -SybilFeeTest:testPieceMetadataStorageAndRetrieval() (gas: 2106611) -SybilFeeTest:testPieceMetadataValueLengthBoundaries() (gas: 3938880) -SybilFeeTest:testProvenPeriods() (gas: 358323435) -SybilFeeTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1872384) -SybilFeeTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1049335) -SybilFeeTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41389) -SybilFeeTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1047139) -SybilFeeTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1791688) -SybilFeeTest:testRegression_CDNDataSetCleanup() (gas: 6040942) -SybilFeeTest:testServiceNameAndDescriptionValidation() (gas: 21834208) -SybilFeeTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1074575) -SybilFeeTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1078179) -SybilFeeTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1080039) -SybilFeeTest:testServiceProviderChangedSuccessDecoupled() (gas: 1087097) -SybilFeeTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1089897) -SybilFeeTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2258035) -SybilFeeTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2183776) -SybilFeeTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2056337) -SybilFeeTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1962536) -SybilFeeTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1008785) -SybilFeeTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2056163) -SybilFeeTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1847571) -SybilFeeTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1703173) -SybilFeeTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45384) -SybilFeeTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1682982) -SybilFeeTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1986418) -SybilFeeTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1987569) -SybilFeeTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1704879) -SybilFeeTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2104449) -SybilFeeTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1707515) -SybilFeeTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1680522) -SybilFeeTest:testTerminateCDNServiceLifecycle() (gas: 2331333) -SybilFeeTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2041975) -SybilFeeTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1993053) -SybilFeeTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2370237) -SybilFeeTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1016765) -SybilFeeTest:testTerminateServiceLifecycle() (gas: 2899295) -SybilFeeTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2258753) -SybilFeeTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2110412) -SybilFeeTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2129882) -SybilFeeTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43247) -SybilFeeTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1859782) -SybilFeeTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1006045) -SybilFeeTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1949678) -SybilFeeTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2024009) -SybilFeeTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2298332) -SybilFeeTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2345447) -SybilFeeTest:testTopUpCDNPaymentRails_Success() (gas: 1972601) -SybilFeeTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1862076) -SybilFeeTest:testTransferCDNController() (gas: 132284) -SybilFeeTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40235) -SybilFeeTest:testUpgrade() (gas: 12835517) -ValidatePaymentTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1522492) -ValidatePaymentTest:testAddPiecesNonceReplayProtection() (gas: 1401896) -ValidatePaymentTest:testAddPiecesNonceUniquePerPayer() (gas: 2057100) -ValidatePaymentTest:testAddPieces_RateUpdatedImmediately() (gas: 1496672) -ValidatePaymentTest:testCreateDataSetAddPieces() (gas: 2912436) -ValidatePaymentTest:testCreateDataSetCreatesRail() (gas: 2304673) -ValidatePaymentTest:testCreateDataSetNoCDN() (gas: 2811767) -ValidatePaymentTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2060900) -ValidatePaymentTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2129917) -ValidatePaymentTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1230120) -ValidatePaymentTest:testDataSetDeleted_RevertsIfRailNotSettled() (gas: 1336155) -ValidatePaymentTest:testDataSetDeleted_SucceedsAfterRailSettled() (gas: 1653617) -ValidatePaymentTest:testDataSetMetaDataWithAllBoundaries() (gas: 8459947) -ValidatePaymentTest:testDataSetMetadataEmpty() (gas: 992985) -ValidatePaymentTest:testDataSetMetadataKeyCountBoundaries() (gas: 5360988) -ValidatePaymentTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2419649) -ValidatePaymentTest:testDataSetMetadataStorage() (gas: 1104655) -ValidatePaymentTest:testDataSetMetadataStorageMultipleDataSets() (gas: 1901783) -ValidatePaymentTest:testDataSetMetadataStorageMultipleKeys() (gas: 1316743) -ValidatePaymentTest:testDataSetMetadataValueLengthBoundaries() (gas: 2652271) -ValidatePaymentTest:testEmptyStringMetadata() (gas: 2172077) -ValidatePaymentTest:testFilecoinServiceDeployedEvent() (gas: 5586002) -ValidatePaymentTest:testFullFlow_SPAbandonsService_ClientCanSettleAndCleanup() (gas: 1597002) -ValidatePaymentTest:testGetClientDataSets_EmptyClient() (gas: 27383) -ValidatePaymentTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3195152) -ValidatePaymentTest:testGetClientDataSets_MultipleDataSets() (gas: 1942842) -ValidatePaymentTest:testGetClientDataSets_SingleDataSet() (gas: 1105187) -ValidatePaymentTest:testGetClientDataSets_TerminatedDataSets() (gas: 3031758) -ValidatePaymentTest:testGetEffectiveRatesValues() (gas: 21554) -ValidatePaymentTest:testGetPieceMetadata() (gas: 2150678) -ValidatePaymentTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23371) -ValidatePaymentTest:testGetPieceMetadata_NonExistentKey() (gas: 1895776) -ValidatePaymentTest:testGetPieceMetdataAllKeys() (gas: 2107638) -ValidatePaymentTest:testGetServicePriceValues() (gas: 28477) -ValidatePaymentTest:testGlobalParameters() (gas: 25039) -ValidatePaymentTest:testInitialState() (gas: 97640) -ValidatePaymentTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1375677) -ValidatePaymentTest:testInsufficientFunds_BelowMinimum() (gas: 690804) -ValidatePaymentTest:testInsufficientFunds_ExactMinimum() (gas: 1087586) -ValidatePaymentTest:testInsufficientFunds_JustAboveMinimum() (gas: 1088935) -ValidatePaymentTest:testMetadataQueries() (gas: 4787085) -ValidatePaymentTest:testMinimumPricing_CrossoverPoint() (gas: 32520) -ValidatePaymentTest:testMinimumPricing_ExactlyPoint06USDFC() (gas: 20980) -ValidatePaymentTest:testMinimumPricing_LargeDataSetsUseProportionalPricing() (gas: 39683) -ValidatePaymentTest:testMinimumPricing_SmallDataSetsPayFloorRate() (gas: 58186) -ValidatePaymentTest:testMultiplePieceMetadataRemovalAtNextProvingPeriod() (gas: 2074967) -ValidatePaymentTest:testNonceCannotBeReusedAcrossOperations() (gas: 1417149) -ValidatePaymentTest:testOperatorApproval_AllSufficient() (gas: 1088281) -ValidatePaymentTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 707758) -ValidatePaymentTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 705966) -ValidatePaymentTest:testOperatorApproval_InsufficientRateAllowance() (gas: 705751) -ValidatePaymentTest:testOperatorApproval_NotApproved() (gas: 625405) -ValidatePaymentTest:testPieceMetadataAllBoundaries() (gas: 8082923) -ValidatePaymentTest:testPieceMetadataArrayMismatchErrors() (gas: 1226031) -ValidatePaymentTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1715317) -ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1145714) -ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1147334) -ValidatePaymentTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1399526) -ValidatePaymentTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2212178) -ValidatePaymentTest:testPieceMetadataKeyCountBoundaries() (gas: 4489539) -ValidatePaymentTest:testPieceMetadataKeyLengthBoundaries() (gas: 3707908) -ValidatePaymentTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2081470) -ValidatePaymentTest:testPieceMetadataRemovalDeferredToNextProvingPeriod() (gas: 2440984) -ValidatePaymentTest:testPieceMetadataStorageAndRetrieval() (gas: 2106897) -ValidatePaymentTest:testPieceMetadataValueLengthBoundaries() (gas: 3939166) -ValidatePaymentTest:testProvenPeriods() (gas: 358395251) -ValidatePaymentTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1872626) -ValidatePaymentTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1049379) -ValidatePaymentTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41433) -ValidatePaymentTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1047183) -ValidatePaymentTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1791776) -ValidatePaymentTest:testRegression_CDNDataSetCleanup() (gas: 6041156) -ValidatePaymentTest:testServiceNameAndDescriptionValidation() (gas: 21834208) -ValidatePaymentTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1074685) -ValidatePaymentTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1078223) -ValidatePaymentTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1080193) -ValidatePaymentTest:testServiceProviderChangedSuccessDecoupled() (gas: 1087141) -ValidatePaymentTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1089963) -ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2258079) -ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2183820) -ValidatePaymentTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2056381) -ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 1962602) -ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1008983) -ValidatePaymentTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2056207) -ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1847659) -ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1703217) -ValidatePaymentTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 45626) -ValidatePaymentTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1683070) -ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 1986484) -ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 1987877) -ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1705121) -ValidatePaymentTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2104493) -ValidatePaymentTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1707603) -ValidatePaymentTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1680566) -ValidatePaymentTest:testTerminateCDNServiceLifecycle() (gas: 2331434) -ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2042019) -ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 1993053) -ValidatePaymentTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2370417) -ValidatePaymentTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1016853) -ValidatePaymentTest:testTerminateServiceLifecycle() (gas: 2899440) -ValidatePaymentTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2258995) -ValidatePaymentTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2110632) -ValidatePaymentTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2129926) -ValidatePaymentTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43467) -ValidatePaymentTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1859826) -ValidatePaymentTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1006133) -ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1949678) -ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2024031) -ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2298530) -ValidatePaymentTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2345469) -ValidatePaymentTest:testTopUpCDNPaymentRails_Success() (gas: 1972601) -ValidatePaymentTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1862186) -ValidatePaymentTest:testTransferCDNController() (gas: 132328) -ValidatePaymentTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40235) -ValidatePaymentTest:testUpgrade() (gas: 12835614) -ValidatePaymentTest:testValidatePayment_AdvancesPastUnprovenPeriodsWithPassedDeadlines() (gas: 1221845) -ValidatePaymentTest:testValidatePayment_AllEpochsProven() (gas: 1526018) -ValidatePaymentTest:testValidatePayment_BeforeActivation() (gas: 1220842) -ValidatePaymentTest:testValidatePayment_BlocksOnUnprovenPeriodWithOpenDeadline() (gas: 1217285) -ValidatePaymentTest:testValidatePayment_FirstPeriodUnproven() (gas: 1664222) -ValidatePaymentTest:testValidatePayment_InvalidEpochRange() (gas: 1108066) -ValidatePaymentTest:testValidatePayment_InvalidRailId() (gas: 22358) -ValidatePaymentTest:testValidatePayment_MixedProvenAndUnprovenWithPassedDeadlines() (gas: 1306357) -ValidatePaymentTest:testValidatePayment_NoEpochsProven() (gas: 1399107) -ValidatePaymentTest:testValidatePayment_PartialPeriodCoverage() (gas: 1335116) -ValidatePaymentTest:testValidatePayment_ProvingNeverActivated() (gas: 1113753) -ValidatePaymentTest:testValidatePayment_SomeEpochsProven() (gas: 1466220) -ValidatePaymentTest:testValidatePayment_ToEpochExactlyOnDeadline() (gas: 1309768) \ No newline at end of file +ServiceProviderRegistryFullTest:testRegisterWithInvalidData() (gas: 473883) +ServiceProviderRegistryFullTest:testRemoveProvider() (gas: 1018547) +ServiceProviderRegistryFullTest:testTooManyCapabilities() (gas: 343283) +ServiceProviderRegistryFullTest:testUpdateProduct() (gas: 1244797) +ServiceProviderRegistryFullTest:testUpdateProviderDescription() (gas: 917375) +ServiceProviderRegistryFullTest:testUpdateWithCapabilities() (gas: 1356142) +ServiceProviderRegistryFullTest:testUpdateWithTooManyCapabilities() (gas: 1007395) +ServiceProviderRegistryPaginationTest:testActiveProviderCountTracking() (gas: 2500676) +ServiceProviderRegistryPaginationTest:testPaginationConsistencyWithGetAll() (gas: 4338591) +ServiceProviderRegistryPaginationTest:testPaginationEdgeLimits() (gas: 2182012) +ServiceProviderRegistryPaginationTest:testPaginationNoProviders() (gas: 45522) +ServiceProviderRegistryPaginationTest:testPaginationPageBoundaries() (gas: 3570980) +ServiceProviderRegistryPaginationTest:testPaginationSingleProvider() (gas: 858041) +ServiceProviderRegistryPaginationTest:testPaginationWithInactiveProviders() (gas: 3707078) +ServiceProviderRegistryPaginationTest:testSequentialPagination() (gas: 6875148) +ServiceProviderRegistryTest:testAnnouncePlannedUpgrade() (gas: 4163061) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeInvalidImplementation() (gas: 41405) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeMinimumDelay() (gas: 3987005) +ServiceProviderRegistryTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 3955047) +ServiceProviderRegistryTest:testAnnounceUpgradePlan() (gas: 4162720) +ServiceProviderRegistryTest:testAnnounceUpgradePlanInvalidImplementation() (gas: 40097) +ServiceProviderRegistryTest:testAnnounceUpgradePlanMinimumDelay() (gas: 3985677) +ServiceProviderRegistryTest:testAnnounceUpgradePlanOnlyOwner() (gas: 3953791) +ServiceProviderRegistryTest:testBeneficiaryIsSetCorrectly() (gas: 824194) +ServiceProviderRegistryTest:testCannotRegisterWithZeroBeneficiary() (gas: 78844) +ServiceProviderRegistryTest:testCannotReinitialize() (gas: 37287) +ServiceProviderRegistryTest:testGetProviderPayeeReturnsCorrectAddress() (gas: 809261) +ServiceProviderRegistryTest:testGetProviderPayeeRevertsForInvalidProviderId() (gas: 30249) +ServiceProviderRegistryTest:testGetProviderWorks() (gas: 819475) +ServiceProviderRegistryTest:testGetProvidersByIdsEmptyArray() (gas: 19120) +ServiceProviderRegistryTest:testGetProvidersByIdsInactiveProvider() (gas: 970734) +ServiceProviderRegistryTest:testGetProvidersByIdsInvalidIds() (gas: 44649) +ServiceProviderRegistryTest:testGetProvidersByIdsMixedValidAndInvalid() (gas: 896787) +ServiceProviderRegistryTest:testGetProvidersByIdsMultipleValidProviders() (gas: 1633635) +ServiceProviderRegistryTest:testGetProvidersByIdsSingleValidProvider() (gas: 881164) +ServiceProviderRegistryTest:testInitialState() (gas: 46555) +ServiceProviderRegistryTest:testIsRegisteredProviderReturnsFalse() (gas: 34866) +ServiceProviderRegistryTest:testOnlyOwnerCanUpgrade() (gas: 4064490) +ServiceProviderRegistryTest:testRegisterProviderWithCapabilities() (gas: 1141463) +ServiceProviderRegistryTest:testTransferOwnership() (gas: 55648) +ValidatePaymentTest:testAddPiecesNonceIndependentFromFirstAdded() (gas: 1706788) +ValidatePaymentTest:testAddPiecesNonceReplayProtection() (gas: 1524437) +ValidatePaymentTest:testAddPiecesNonceUniquePerPayer() (gas: 2267437) +ValidatePaymentTest:testAddPieces_RateUpdatedImmediately() (gas: 1622367) +ValidatePaymentTest:testAnnouncePlannedUpgrade() (gas: 12658676) +ValidatePaymentTest:testAnnouncePlannedUpgradeOnlyOwner() (gas: 5061677) +ValidatePaymentTest:testAnnounceUpgradePlan() (gas: 12686951) +ValidatePaymentTest:testAnnounceUpgradePlanOnlyOwner() (gas: 5060433) +ValidatePaymentTest:testCreateDataSetAddPieces() (gas: 3164914) +ValidatePaymentTest:testCreateDataSetCreatesRail() (gas: 2348978) +ValidatePaymentTest:testCreateDataSetNoCDN() (gas: 3094485) +ValidatePaymentTest:testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() (gas: 2089855) +ValidatePaymentTest:testCreateDataSetWithCDN_VerifyDefaultBehavior() (gas: 2161264) +ValidatePaymentTest:testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() (gas: 1283827) +ValidatePaymentTest:testDataSetDeleted_ClearsScheduledPieceMetadataRemovals() (gas: 2276137) +ValidatePaymentTest:testDataSetDeleted_RevertsIfRailNotSettled() (gas: 1524662) +ValidatePaymentTest:testDataSetDeleted_SucceedsAfterRailSettled() (gas: 1988645) +ValidatePaymentTest:testDataSetMetaDataWithAllBoundaries() (gas: 8218260) +ValidatePaymentTest:testDataSetMetadataEmpty() (gas: 1061195) +ValidatePaymentTest:testDataSetMetadataKeyCountBoundaries() (gas: 5560211) +ValidatePaymentTest:testDataSetMetadataKeyLengthBoundaries() (gas: 2580993) +ValidatePaymentTest:testDataSetMetadataStorage() (gas: 1175365) +ValidatePaymentTest:testDataSetMetadataStorageMultipleDataSets() (gas: 2057404) +ValidatePaymentTest:testDataSetMetadataStorageMultipleKeys() (gas: 1392283) +ValidatePaymentTest:testDataSetMetadataValueLengthBoundaries() (gas: 2746064) +ValidatePaymentTest:testDatasetFee_AllSizesIncludeFee() (gas: 7897) +ValidatePaymentTest:testDatasetFee_ExactlyPoint024USDFC() (gas: 6660) +ValidatePaymentTest:testDatasetFee_IsAdditive() (gas: 6056) +ValidatePaymentTest:testEmptyDataset_CannotProveAfterAllPiecesRemoved() (gas: 2044074) +ValidatePaymentTest:testEmptyDataset_CannotProveWhenNoPieces() (gas: 1152520) +ValidatePaymentTest:testEmptyDataset_NoPaymentWhenNoPieces() (gas: 1214434) +ValidatePaymentTest:testEmptyDataset_ReactivationPreservesProvingTimeline() (gas: 2814211) +ValidatePaymentTest:testEmptyDataset_ReactivationRejectsFarFutureChallengeEpoch() (gas: 2312831) +ValidatePaymentTest:testEmptyDataset_ReactivationRejectsPreviouslyProvenPeriod() (gas: 2468902) +ValidatePaymentTest:testEmptyStringMetadata() (gas: 2295966) +ValidatePaymentTest:testFilecoinServiceDeployedEvent() (gas: 5338839) +ValidatePaymentTest:testFullFlow_SPAbandonsService_ClientCanSettleAndCleanup() (gas: 1922743) +ValidatePaymentTest:testGetClientDataSets_EmptyClient() (gas: 27729) +ValidatePaymentTest:testGetClientDataSets_ExcludesDeletedDataSets() (gas: 3570010) +ValidatePaymentTest:testGetClientDataSets_MultipleDataSets() (gas: 2097246) +ValidatePaymentTest:testGetClientDataSets_SingleDataSet() (gas: 1173591) +ValidatePaymentTest:testGetClientDataSets_TerminatedDataSets() (gas: 3396477) +ValidatePaymentTest:testGetDataSetSizeInBytes_ReturnsRawSize() (gas: 26557) +ValidatePaymentTest:testGetEffectiveRatesValues() (gas: 17473) +ValidatePaymentTest:testGetPieceMetadata() (gas: 2210730) +ValidatePaymentTest:testGetPieceMetadata_NonExistentDataSet() (gas: 23364) +ValidatePaymentTest:testGetPieceMetadata_NonExistentKey() (gas: 1951071) +ValidatePaymentTest:testGetPieceMetdataAllKeys() (gas: 2162855) +ValidatePaymentTest:testGetServicePriceValues() (gas: 24742) +ValidatePaymentTest:testGlobalParameters() (gas: 25095) +ValidatePaymentTest:testInitialState() (gas: 97936) +ValidatePaymentTest:testInsufficientFunds_AddPiecesFailsImmediately() (gas: 1494562) +ValidatePaymentTest:testInsufficientFunds_BelowMinimum() (gas: 687833) +ValidatePaymentTest:testInsufficientFunds_ExactMinimum() (gas: 1156183) +ValidatePaymentTest:testInsufficientFunds_JustAboveMinimum() (gas: 1157435) +ValidatePaymentTest:testMetadataQueries() (gas: 5015907) +ValidatePaymentTest:testMultiplePieceMetadataRemovalAtNextProvingPeriod() (gas: 2237285) +ValidatePaymentTest:testNonceCannotBeReusedAcrossOperations() (gas: 1539679) +ValidatePaymentTest:testOperatorApproval_AllSufficient() (gas: 1156587) +ValidatePaymentTest:testOperatorApproval_InsufficientLockupAllowance() (gas: 704875) +ValidatePaymentTest:testOperatorApproval_InsufficientMaxLockupPeriod() (gas: 703068) +ValidatePaymentTest:testOperatorApproval_InsufficientRateAllowance() (gas: 702857) +ValidatePaymentTest:testOperatorApproval_NotApproved() (gas: 622456) +ValidatePaymentTest:testPieceMetadataAllBoundaries() (gas: 7012238) +ValidatePaymentTest:testPieceMetadataArrayMismatchErrors() (gas: 1294709) +ValidatePaymentTest:testPieceMetadataCannotBeAddedByNonPDPVerifier() (gas: 1783589) +ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreKeys() (gas: 1214015) +ValidatePaymentTest:testPieceMetadataCannotBeCalledWithMoreValues() (gas: 1215833) +ValidatePaymentTest:testPieceMetadataEmptyMetadataForAllPieces() (gas: 1459713) +ValidatePaymentTest:testPieceMetadataForSameKeyCannotRewrite() (gas: 2311026) +ValidatePaymentTest:testPieceMetadataKeyCountBoundaries() (gas: 4185258) +ValidatePaymentTest:testPieceMetadataKeyLengthBoundaries() (gas: 3884686) +ValidatePaymentTest:testPieceMetadataPerPieceDifferentMetadata() (gas: 2156417) +ValidatePaymentTest:testPieceMetadataRemovalDeferredToNextProvingPeriod() (gas: 2638294) +ValidatePaymentTest:testPieceMetadataStorageAndRetrieval() (gas: 2162137) +ValidatePaymentTest:testPieceMetadataValueLengthBoundaries() (gas: 4047987) +ValidatePaymentTest:testProvenPeriods() (gas: 416253185) +ValidatePaymentTest:testRailTerminated_DoesNotOverwritePdpEndEpoch() (gas: 1907433) +ValidatePaymentTest:testRailTerminated_RevertsIfCallerNotPaymentsContract() (gas: 1117974) +ValidatePaymentTest:testRailTerminated_RevertsIfRailNotAssociated() (gas: 41566) +ValidatePaymentTest:testRailTerminated_RevertsIfTerminatorNotServiceContract() (gas: 1115809) +ValidatePaymentTest:testRailTerminated_SetsPdpEndEpochAndEmitsEvent() (gas: 1823505) +ValidatePaymentTest:testRegression_CDNDataSetCleanup() (gas: 6625985) +ValidatePaymentTest:testServiceNameAndDescriptionValidation() (gas: 21032256) +ValidatePaymentTest:testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() (gas: 1142938) +ValidatePaymentTest:testServiceProviderChangedRevertsIfOldServiceProviderMismatch() (gas: 1124784) +ValidatePaymentTest:testServiceProviderChangedRevertsIfUnauthorizedCaller() (gas: 1126692) +ValidatePaymentTest:testServiceProviderChangedSuccessDecoupled() (gas: 1155321) +ValidatePaymentTest:testServiceProviderChangedWithArbitraryExtraData() (gas: 1158173) +ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterServiceTermination() (gas: 2346719) +ValidatePaymentTest:testSettleFilBeamPaymentRails_AfterTermination() (gas: 2267112) +ValidatePaymentTest:testSettleFilBeamPaymentRails_BothAmounts() (gas: 2134185) +ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() (gas: 2032451) +ValidatePaymentTest:testSettleFilBeamPaymentRails_DataSetWithoutCDN() (gas: 1074974) +ValidatePaymentTest:testSettleFilBeamPaymentRails_EmitsCorrectEvents() (gas: 2133945) +ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() (gas: 1880320) +ValidatePaymentTest:testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() (gas: 1732557) +ValidatePaymentTest:testSettleFilBeamPaymentRails_InvalidDataSetId() (gas: 46067) +ValidatePaymentTest:testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() (gas: 1712478) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCacheMissAmount() (gas: 2059185) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyCdnAmount() (gas: 2060884) +ValidatePaymentTest:testSettleFilBeamPaymentRails_OnlyfilBeamController() (gas: 1734519) +ValidatePaymentTest:testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() (gas: 2177246) +ValidatePaymentTest:testSettleFilBeamPaymentRails_RevertIfNotController() (gas: 1735735) +ValidatePaymentTest:testSettleFilBeamPaymentRails_ZeroAmounts() (gas: 1709920) +ValidatePaymentTest:testSettleRail_EndEpochAtActivationBoundaryFinalizes() (gas: 2147821) +ValidatePaymentTest:testSettleRail_MultiplePreActivationRateSegmentsSettleWithZeroPayment() (gas: 2085746) +ValidatePaymentTest:testTerminateCDNServiceLifecycle() (gas: 2619082) +ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailFinalization() (gas: 2073740) +ValidatePaymentTest:testTerminateCDNService_AfterExternalCDNRailTermination() (gas: 2027143) +ValidatePaymentTest:testTerminateCDNService_checkPDPPaymentRate() (gas: 2642706) +ValidatePaymentTest:testTerminateCDNService_dataSetHasNoCDNEnabled() (gas: 1087457) +ValidatePaymentTest:testTerminateServiceLifecycle() (gas: 3405991) +ValidatePaymentTest:testTerminateService_AfterExternalCDNRailFinalization() (gas: 2706330) +ValidatePaymentTest:testTerminateService_AfterExternalCDNRailTermination() (gas: 2553593) +ValidatePaymentTest:testTerminateService_directPayer_emitsApprover() (gas: 1410408) +ValidatePaymentTest:testTerminateService_directSP_emitsApprover() (gas: 1447342) +ValidatePaymentTest:testTerminateService_extraData_callerNotServiceProvider() (gas: 1155248) +ValidatePaymentTest:testTerminateService_sessionKey() (gas: 1500413) +ValidatePaymentTest:testTerminateService_sessionKey_expiredKey() (gas: 1231516) +ValidatePaymentTest:testTerminateService_sessionKey_unauthorizedKey() (gas: 1176691) +ValidatePaymentTest:testTerminateService_sessionKey_wrongPermission() (gas: 1231605) +ValidatePaymentTest:testTerminateService_signatureApprover() (gas: 1665742) +ValidatePaymentTest:testTopUpCDNPaymentRails_IncrementalTopUps() (gas: 2172514) +ValidatePaymentTest:testTopUpCDNPaymentRails_InvalidDataSetId() (gas: 43881) +ValidatePaymentTest:testTopUpCDNPaymentRails_OnlyPayerCanTopUp() (gas: 1891476) +ValidatePaymentTest:testTopUpCDNPaymentRails_RequiresCDNEnabled() (gas: 1074359) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterCDNTermination() (gas: 1984132) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsAfterServiceTermination() (gas: 2219247) +ValidatePaymentTest:testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() (gas: 2340257) +ValidatePaymentTest:testTopUpCDNPaymentRails_SucceedsBeforeTermination() (gas: 2389730) +ValidatePaymentTest:testTopUpCDNPaymentRails_Success() (gas: 2011849) +ValidatePaymentTest:testTopUpCDNPaymentRails_ZeroAmounts() (gas: 1896609) +ValidatePaymentTest:testTransferCDNController() (gas: 132681) +ValidatePaymentTest:testTransferCDNController_revertsIfZeroAddress() (gas: 40348) +ValidatePaymentTest:testUpdatePaymentRates_NextProvingPeriodAfterRemovalUsesRawSize() (gas: 2059583) +ValidatePaymentTest:testUpdatePaymentRates_PiecesAddedUsesRawSize() (gas: 1580156) +ValidatePaymentTest:testValidatePayment_ActivationBoundarySettlesWithZeroPayment() (gas: 1508441) +ValidatePaymentTest:testValidatePayment_AdvancesPastUnprovenPeriodsWithPassedDeadlines() (gas: 1512458) +ValidatePaymentTest:testValidatePayment_AllEpochsProven() (gas: 1837636) +ValidatePaymentTest:testValidatePayment_BeforeActivationSettlesWithZeroPayment() (gas: 1522844) +ValidatePaymentTest:testValidatePayment_BlocksOnUnprovenPeriodWithOpenDeadline() (gas: 1507648) +ValidatePaymentTest:testValidatePayment_FirstPeriodUnproven() (gas: 2004575) +ValidatePaymentTest:testValidatePayment_InvalidEpochRange() (gas: 1176899) +ValidatePaymentTest:testValidatePayment_InvalidRailId() (gas: 25049) +ValidatePaymentTest:testValidatePayment_MixedProvenAndUnprovenWithPassedDeadlines() (gas: 1596865) +ValidatePaymentTest:testValidatePayment_NoEpochsProven() (gas: 1715931) +ValidatePaymentTest:testValidatePayment_PartialPeriodCoverage() (gas: 1628401) +ValidatePaymentTest:testValidatePayment_ProvingNeverActivated() (gas: 1182528) +ValidatePaymentTest:testValidatePayment_SomeEpochsProven() (gas: 1777634) +ValidatePaymentTest:testValidatePayment_ToEpochExactlyOnDeadline() (gas: 1600213) \ No newline at end of file From 345ba4109b48abb6ca1758dac76276d5ae4408ed Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 29 Jul 2026 14:45:02 -0500 Subject: [PATCH 43/43] chore: bump gas CI forge from 1.3.5 to 1.7.1 --- .github/workflows/gas.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gas.yml b/.github/workflows/gas.yml index 0690bcc8..51e33250 100644 --- a/.github/workflows/gas.yml +++ b/.github/workflows/gas.yml @@ -18,7 +18,7 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: v1.3.5 + version: v1.7.1 - name: Delete gas snapshot run: rm -f service_contracts/.gas-snapshot