Skip to content

Commit fc812ab

Browse files
authored
feat: use fvm precompiles for native payments, burn, beacon randomness (#207)
* use FVMPay library for native transfers and burns * fix: vm.getBlockNumber * rm unused import * rm unused * use getBeaconRandomness, mock with mockBeaconRandomness * explicit library use
1 parent 6045b45 commit fc812ab

File tree

5 files changed

+64
-57
lines changed

5 files changed

+64
-57
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@
1010
[submodule "lib/pyth-sdk-solidity"]
1111
path = lib/pyth-sdk-solidity
1212
url = https://github.com/pyth-network/pyth-sdk-solidity
13+
[submodule "lib/fvm-solidity"]
14+
path = lib/fvm-solidity
15+
url = https://github.com/filecoin-project/fvm-solidity

lib/fvm-solidity

Submodule fvm-solidity added at d8d2fb5

src/PDPVerifier.sol

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import {ERC1967Utils} from "../lib/openzeppelin-contracts/contracts/proxy/ERC196
99
import {Initializable} from "../lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol";
1010
import {UUPSUpgradeable} from "../lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol";
1111
import {OwnableUpgradeable} from "../lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol";
12+
import {FVMPay} from "fvm-solidity/FVMPay.sol";
13+
import {FVMRandom} from "fvm-solidity/FVMRandom.sol";
1214
import {IPDPTypes} from "./interfaces/IPDPTypes.sol";
1315

1416
/// @title PDPListener
@@ -39,10 +41,8 @@ uint256 constant NEW_DATA_SET_SENTINEL = 0;
3941

4042
contract PDPVerifier is Initializable, UUPSUpgradeable, OwnableUpgradeable {
4143
// Constants
42-
address public constant BURN_ACTOR = 0xff00000000000000000000000000000000000063;
4344
uint256 public constant MAX_PIECE_SIZE_LOG2 = 50;
4445
uint256 public constant MAX_ENQUEUED_REMOVALS = 2000;
45-
address public constant RANDOMNESS_PRECOMPILE = 0xfE00000000000000000000000000000000000006;
4646
uint256 public constant EXTRA_DATA_MAX_SIZE = 2048;
4747
uint256 public constant NO_CHALLENGE_SCHEDULED = 0;
4848
uint256 public constant NO_PROVEN_EPOCH = 0;
@@ -173,7 +173,7 @@ contract PDPVerifier is Initializable, UUPSUpgradeable, OwnableUpgradeable {
173173

174174
function burnFee(uint256 amount) internal {
175175
require(msg.value >= amount, "Incorrect fee amount");
176-
(bool success,) = BURN_ACTOR.call{value: amount}("");
176+
bool success = FVMPay.burn(amount);
177177
require(success, "Burn failed");
178178
}
179179

@@ -595,7 +595,7 @@ contract PDPVerifier is Initializable, UUPSUpgradeable, OwnableUpgradeable {
595595
// Return the overpayment after doing everything else to avoid re-entrancy issues (all state has been updated by this point). If this
596596
// call fails, the entire operation reverts.
597597
if (refund > 0) {
598-
(bool success,) = msg.sender.call{value: refund}("");
598+
bool success = FVMPay.pay(msg.sender, refund);
599599
require(success, "Transfer failed.");
600600
}
601601
}
@@ -648,13 +648,7 @@ contract PDPVerifier is Initializable, UUPSUpgradeable, OwnableUpgradeable {
648648

649649
function getRandomness(uint256 epoch) public view returns (uint256) {
650650
// Call the precompile
651-
(bool success, bytes memory result) = RANDOMNESS_PRECOMPILE.staticcall(abi.encodePacked(epoch));
652-
653-
// Check if the call was successful
654-
require(success, "Randomness precompile call failed");
655-
656-
// Decode and return the result
657-
return abi.decode(result, (uint256));
651+
return FVMRandom.getBeaconRandomness(epoch);
658652
}
659653

660654
function drawChallengeSeed(uint256 setId) internal view returns (uint256) {

test/PDPVerifier.t.sol

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// SPDX-License-Identifier: Apache-2.0 OR MIT
22
pragma solidity ^0.8.13;
33

4-
import {UUPSUpgradeable} from "../lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol";
4+
import {MockFVMTest} from "fvm-solidity/mocks/MockFVMTest.sol";
55
import {Test} from "forge-std/Test.sol";
6+
import {UUPSUpgradeable} from "../lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol";
67
import {Cids} from "../src/Cids.sol";
78
import {PDPVerifier, PDPListener} from "../src/PDPVerifier.sol";
89
import {MyERC1967Proxy} from "../src/ERC1967Proxy.sol";
@@ -15,12 +16,13 @@ import {PieceHelper} from "./PieceHelper.t.sol";
1516
import {ProofBuilderHelper} from "./ProofBuilderHelper.t.sol";
1617
import {NEW_DATA_SET_SENTINEL} from "../src/PDPVerifier.sol";
1718

18-
contract PDPVerifierDataSetCreateDeleteTest is Test, PieceHelper {
19+
contract PDPVerifierDataSetCreateDeleteTest is MockFVMTest, PieceHelper {
1920
TestingRecordKeeperService listener;
2021
PDPVerifier pdpVerifier;
2122
bytes empty = new bytes(0);
2223

23-
function setUp() public {
24+
function setUp() public override {
25+
super.setUp();
2426
PDPVerifier pdpVerifierImpl = new PDPVerifier();
2527
uint256 challengeFinality = 2;
2628
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, challengeFinality);
@@ -248,15 +250,16 @@ contract PDPVerifierDataSetCreateDeleteTest is Test, PieceHelper {
248250
}
249251
}
250252

251-
contract PDPVerifierStorageProviderTest is Test, PieceHelper {
253+
contract PDPVerifierStorageProviderTest is MockFVMTest, PieceHelper {
252254
PDPVerifier pdpVerifier;
253255
TestingRecordKeeperService listener;
254256
address public storageProvider;
255257
address public nextStorageProvider;
256258
address public nonStorageProvider;
257259
bytes empty = new bytes(0);
258260

259-
function setUp() public {
261+
function setUp() public override {
262+
super.setUp();
260263
PDPVerifier pdpVerifierImpl = new PDPVerifier();
261264
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, 2);
262265
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);
@@ -348,14 +351,15 @@ contract PDPVerifierStorageProviderTest is Test, PieceHelper {
348351
}
349352
}
350353

351-
contract PDPVerifierDataSetMutateTest is Test, PieceHelper {
354+
contract PDPVerifierDataSetMutateTest is MockFVMTest, PieceHelper {
352355
uint256 constant CHALLENGE_FINALITY_DELAY = 2;
353356

354357
PDPVerifier pdpVerifier;
355358
TestingRecordKeeperService listener;
356359
bytes empty = new bytes(0);
357360

358-
function setUp() public {
361+
function setUp() public override {
362+
super.setUp();
359363
PDPVerifier pdpVerifierImpl = new PDPVerifier();
360364
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, CHALLENGE_FINALITY_DELAY);
361365
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);
@@ -835,12 +839,13 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper {
835839
}
836840
}
837841

838-
contract PDPVerifierPaginationTest is Test, PieceHelper {
842+
contract PDPVerifierPaginationTest is MockFVMTest, PieceHelper {
839843
PDPVerifier pdpVerifier;
840844
TestingRecordKeeperService listener;
841845
bytes empty = new bytes(0);
842846

843-
function setUp() public {
847+
function setUp() public override {
848+
super.setUp();
844849
PDPVerifier pdpVerifierImpl = new PDPVerifier();
845850
uint256 challengeFinality = 2;
846851
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, challengeFinality);
@@ -1128,10 +1133,11 @@ contract SumTreeInternalTestPDPVerifier is PDPVerifier {
11281133
}
11291134
}
11301135

1131-
contract SumTreeHeightTest is Test {
1136+
contract SumTreeHeightTest is MockFVMTest {
11321137
SumTreeInternalTestPDPVerifier pdpVerifier;
11331138

1134-
function setUp() public {
1139+
function setUp() public override {
1140+
super.setUp();
11351141
PDPVerifier pdpVerifierImpl = new SumTreeInternalTestPDPVerifier();
11361142
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, 2);
11371143
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);
@@ -1257,14 +1263,15 @@ contract SumTreeHeightTest is Test {
12571263
}
12581264
}
12591265

1260-
contract SumTreeAddTest is Test, PieceHelper {
1266+
contract SumTreeAddTest is MockFVMTest, PieceHelper {
12611267
SumTreeInternalTestPDPVerifier pdpVerifier;
12621268
TestingRecordKeeperService listener;
12631269
uint256 testSetId;
12641270
uint256 constant CHALLENGE_FINALITY_DELAY = 100;
12651271
bytes empty = new bytes(0);
12661272

1267-
function setUp() public {
1273+
function setUp() public override {
1274+
super.setUp();
12681275
PDPVerifier pdpVerifierImpl = new SumTreeInternalTestPDPVerifier();
12691276
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, CHALLENGE_FINALITY_DELAY);
12701277
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);
@@ -1553,13 +1560,14 @@ contract BadListener is PDPListener {
15531560
}
15541561
}
15551562

1556-
contract PDPListenerIntegrationTest is Test, PieceHelper {
1563+
contract PDPListenerIntegrationTest is MockFVMTest, PieceHelper {
15571564
PDPVerifier pdpVerifier;
15581565
BadListener badListener;
15591566
uint256 constant CHALLENGE_FINALITY_DELAY = 2;
15601567
bytes empty = new bytes(0);
15611568

1562-
function setUp() public {
1569+
function setUp() public override {
1570+
super.setUp();
15631571
PDPVerifier pdpVerifierImpl = new PDPVerifier();
15641572
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, CHALLENGE_FINALITY_DELAY);
15651573
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);
@@ -1642,13 +1650,14 @@ contract ExtraDataListener is PDPListener {
16421650
}
16431651
}
16441652

1645-
contract PDPVerifierExtraDataTest is Test, PieceHelper {
1653+
contract PDPVerifierExtraDataTest is MockFVMTest, PieceHelper {
16461654
PDPVerifier pdpVerifier;
16471655
ExtraDataListener extraDataListener;
16481656
uint256 constant CHALLENGE_FINALITY_DELAY = 2;
16491657
bytes empty = new bytes(0);
16501658

1651-
function setUp() public {
1659+
function setUp() public override {
1660+
super.setUp();
16521661
PDPVerifier pdpVerifierImpl = new PDPVerifier();
16531662
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, CHALLENGE_FINALITY_DELAY);
16541663
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);
@@ -1697,13 +1706,14 @@ contract PDPVerifierExtraDataTest is Test, PieceHelper {
16971706
}
16981707
}
16991708

1700-
contract PDPVerifierE2ETest is Test, ProofBuilderHelper, PieceHelper {
1709+
contract PDPVerifierE2ETest is MockFVMTest, ProofBuilderHelper, PieceHelper {
17011710
PDPVerifier pdpVerifier;
17021711
TestingRecordKeeperService listener;
17031712
uint256 constant CHALLENGE_FINALITY_DELAY = 2;
17041713
bytes empty = new bytes(0);
17051714

1706-
function setUp() public {
1715+
function setUp() public override {
1716+
super.setUp();
17071717
PDPVerifier pdpVerifierImpl = new PDPVerifier();
17081718
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, CHALLENGE_FINALITY_DELAY);
17091719
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);
@@ -1794,10 +1804,8 @@ contract PDPVerifierE2ETest is Test, ProofBuilderHelper, PieceHelper {
17941804
// Proving trees for ProofPeriod1 are just treesA
17951805
IPDPTypes.Proof[] memory proofsProofPeriod1 = buildProofs(pdpVerifier, setId, 5, treesA, leafCountsA);
17961806

1797-
vm.mockCall(
1798-
pdpVerifier.RANDOMNESS_PRECOMPILE(),
1799-
abi.encode(pdpVerifier.getNextChallengeEpoch(setId)),
1800-
abi.encode(pdpVerifier.getNextChallengeEpoch(setId))
1807+
RANDOMNESS_PRECOMPILE.mockBeaconRandomness(
1808+
pdpVerifier.getNextChallengeEpoch(setId), pdpVerifier.getNextChallengeEpoch(setId)
18011809
);
18021810

18031811
pdpVerifier.provePossession{value: 1e18}(setId, proofsProofPeriod1);
@@ -1862,13 +1870,14 @@ contract PDPVerifierMigrateTest is Test {
18621870
}
18631871
}
18641872

1865-
contract PDPVerifierFeeTest is Test, PieceHelper, ProofBuilderHelper {
1873+
contract PDPVerifierFeeTest is MockFVMTest, PieceHelper, ProofBuilderHelper {
18661874
PDPVerifier pdpVerifier;
18671875
uint256 constant CHALLENGE_FINALITY_DELAY = 2;
18681876
bytes empty = new bytes(0);
18691877
TestingRecordKeeperService listener;
18701878

1871-
function setUp() public {
1879+
function setUp() public override {
1880+
super.setUp();
18721881
PDPVerifier pdpVerifierImpl = new PDPVerifier();
18731882
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, CHALLENGE_FINALITY_DELAY);
18741883
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);
@@ -1937,7 +1946,7 @@ contract PDPVerifierFeeTest is Test, PieceHelper, ProofBuilderHelper {
19371946

19381947
// Roll to challenge epoch and mock randomness precompile to return epoch
19391948
vm.roll(challengeEpoch);
1940-
vm.mockCall(pdpVerifier.RANDOMNESS_PRECOMPILE(), abi.encode(challengeEpoch), abi.encode(challengeEpoch));
1949+
RANDOMNESS_PRECOMPILE.mockBeaconRandomness(challengeEpoch, challengeEpoch);
19411950

19421951
// Build minimum valid proofs (3 challenges)
19431952
bytes32[][][] memory trees = new bytes32[][][](1);
@@ -1999,15 +2008,16 @@ contract MockStorageProviderChangedListener is PDPListener {
19992008
function nextProvingPeriod(uint256, uint256, uint256, bytes calldata) external override {}
20002009
}
20012010

2002-
contract PDPVerifierStorageProviderListenerTest is Test {
2011+
contract PDPVerifierStorageProviderListenerTest is MockFVMTest {
20032012
PDPVerifier pdpVerifier;
20042013
MockStorageProviderChangedListener listener;
20052014
address public storageProvider;
20062015
address public nextStorageProvider;
20072016
address public nonStorageProvider;
20082017
bytes empty = new bytes(0);
20092018

2010-
function setUp() public {
2019+
function setUp() public override {
2020+
super.setUp();
20112021
PDPVerifier pdpVerifierImpl = new PDPVerifier();
20122022
bytes memory initializeData = abi.encodeWithSelector(PDPVerifier.initialize.selector, 2);
20132023
MyERC1967Proxy proxy = new MyERC1967Proxy(address(pdpVerifierImpl), initializeData);

0 commit comments

Comments
 (0)