From 81ad1fa770c319f81a18ea464ad14ab8f94dcb2d Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Mon, 30 Sep 2024 15:13:40 +1000 Subject: [PATCH] feat(fip0081): implement pledge calculation change + ramp Closes: https://github.com/filecoin-project/lotus/issues/12494 --- build/buildconstants/params_mainnet.go | 2 +- chain/actors/builtin/power/actor.go.template | 12 +++++ chain/actors/builtin/power/power.go | 12 +++++ chain/actors/builtin/power/state.go.template | 8 ++++ chain/actors/builtin/power/v0.go | 8 ++++ chain/actors/builtin/power/v10.go | 8 ++++ chain/actors/builtin/power/v11.go | 8 ++++ chain/actors/builtin/power/v12.go | 8 ++++ chain/actors/builtin/power/v13.go | 8 ++++ chain/actors/builtin/power/v14.go | 8 ++++ chain/actors/builtin/power/v15.go | 8 ++++ chain/actors/builtin/power/v2.go | 8 ++++ chain/actors/builtin/power/v3.go | 8 ++++ chain/actors/builtin/power/v4.go | 8 ++++ chain/actors/builtin/power/v5.go | 8 ++++ chain/actors/builtin/power/v6.go | 8 ++++ chain/actors/builtin/power/v7.go | 8 ++++ chain/actors/builtin/power/v8.go | 8 ++++ chain/actors/builtin/power/v9.go | 8 ++++ chain/actors/builtin/reward/actor.go.template | 9 +++- chain/actors/builtin/reward/reward.go | 9 +++- chain/actors/builtin/reward/state.go.template | 20 ++++++-- chain/actors/builtin/reward/v0.go | 2 +- chain/actors/builtin/reward/v10.go | 2 +- chain/actors/builtin/reward/v11.go | 2 +- chain/actors/builtin/reward/v12.go | 2 +- chain/actors/builtin/reward/v13.go | 2 +- chain/actors/builtin/reward/v14.go | 2 +- chain/actors/builtin/reward/v15.go | 4 +- chain/actors/builtin/reward/v2.go | 2 +- chain/actors/builtin/reward/v3.go | 2 +- chain/actors/builtin/reward/v4.go | 2 +- chain/actors/builtin/reward/v5.go | 2 +- chain/actors/builtin/reward/v6.go | 2 +- chain/actors/builtin/reward/v7.go | 2 +- chain/actors/builtin/reward/v8.go | 2 +- chain/actors/builtin/reward/v9.go | 2 +- chain/gen/genesis/miners.go | 48 ++++++++++++++----- cmd/lotus-shed/balances.go | 17 +++++++ go.mod | 5 +- go.sum | 10 ++-- itests/kit/node_unmanaged.go | 25 ++-------- node/impl/full/state.go | 34 +++++++++++++ 43 files changed, 300 insertions(+), 63 deletions(-) diff --git a/build/buildconstants/params_mainnet.go b/build/buildconstants/params_mainnet.go index cf00c8d830e..1ded76d8e5b 100644 --- a/build/buildconstants/params_mainnet.go +++ b/build/buildconstants/params_mainnet.go @@ -174,7 +174,7 @@ var WhitelistedBlock = cid.MustParse("bafy2bzaceapyg2uyzk7vueh3xccxkuwbz3nxewjyg var F3ManifestServerID = MustParseID("12D3KooWENMwUF9YxvQxar7uBWJtZkA6amvK4xWmKXfSiHUo2Qq7") // The initial F3 power table CID. -var F3InitialPowerTableCID cid.Cid = cid.Undef +var F3InitialPowerTableCID = cid.Undef const F3Enabled = true const F3BootstrapEpoch abi.ChainEpoch = -1 diff --git a/chain/actors/builtin/power/actor.go.template b/chain/actors/builtin/power/actor.go.template index ed2d3fa77a3..2dbb04dc1ea 100644 --- a/chain/actors/builtin/power/actor.go.template +++ b/chain/actors/builtin/power/actor.go.template @@ -84,6 +84,18 @@ type State interface { // MinerCounts returns the number of miners. Participating is the number // with power above the minimum miner threshold. MinerCounts() (participating, total uint64, err error) + // RampStartEpoch returns the epoch at which the FIP0081 pledge calculation + // change begins. At and before RampStartEpoch, we use the old calculation. At + // RampStartEpoch + RampDurationEpochs, we use 70% old rules + 30% new + // calculation. + // + // This method always returns 0 prior to actors version 15. + RampStartEpoch() int64 + // RampDurationEpochs returns the number of epochs over which the new FIP0081 + // pledge calculation is ramped up. + // + // This method always returns 0 prior to actors version 15. + RampDurationEpochs() uint64 MinerPower(address.Address) (Claim, bool, error) MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) ListAllMiners() ([]address.Address, error) diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index 64e9a8989c1..9d0a2067d54 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -162,6 +162,18 @@ type State interface { // MinerCounts returns the number of miners. Participating is the number // with power above the minimum miner threshold. MinerCounts() (participating, total uint64, err error) + // RampStartEpoch returns the epoch at which the FIP0081 pledge calculation + // change begins. At and before RampStartEpoch, we use the old calculation. At + // RampStartEpoch + RampDurationEpochs, we use 70% old rules + 30% new + // calculation. + // + // This method always returns 0 prior to actors version 15. + RampStartEpoch() int64 + // RampDurationEpochs returns the number of epochs over which the new FIP0081 + // pledge calculation is ramped up. + // + // This method always returns 0 prior to actors version 15. + RampDurationEpochs() uint64 MinerPower(address.Address) (Claim, bool, error) MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) ListAllMiners() ([]address.Address, error) diff --git a/chain/actors/builtin/power/state.go.template b/chain/actors/builtin/power/state.go.template index d37a8b98ac8..876fc31d538 100644 --- a/chain/actors/builtin/power/state.go.template +++ b/chain/actors/builtin/power/state.go.template @@ -117,6 +117,14 @@ func (s *state{{.v}}) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state{{.v}}) RampStartEpoch() int64 { + return {{if (ge .v 15)}}s.State.RampStartEpoch{{else}}0{{end}} +} + +func (s *state{{.v}}) RampDurationEpochs() uint64 { + return {{if (ge .v 15)}}s.State.RampDurationEpochs{{else}}0{{end}} +} + func (s *state{{.v}}) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v0.go b/chain/actors/builtin/power/v0.go index 4cf550616b2..66ffa23c6df 100644 --- a/chain/actors/builtin/power/v0.go +++ b/chain/actors/builtin/power/v0.go @@ -100,6 +100,14 @@ func (s *state0) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state0) RampStartEpoch() int64 { + return 0 +} + +func (s *state0) RampDurationEpochs() uint64 { + return 0 +} + func (s *state0) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v10.go b/chain/actors/builtin/power/v10.go index dd7a9decf0f..bf51b014873 100644 --- a/chain/actors/builtin/power/v10.go +++ b/chain/actors/builtin/power/v10.go @@ -96,6 +96,14 @@ func (s *state10) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state10) RampStartEpoch() int64 { + return 0 +} + +func (s *state10) RampDurationEpochs() uint64 { + return 0 +} + func (s *state10) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v11.go b/chain/actors/builtin/power/v11.go index 0ec1e2bdc5f..817b400c3bf 100644 --- a/chain/actors/builtin/power/v11.go +++ b/chain/actors/builtin/power/v11.go @@ -96,6 +96,14 @@ func (s *state11) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state11) RampStartEpoch() int64 { + return 0 +} + +func (s *state11) RampDurationEpochs() uint64 { + return 0 +} + func (s *state11) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v12.go b/chain/actors/builtin/power/v12.go index 2e910902269..d8f8ee51b50 100644 --- a/chain/actors/builtin/power/v12.go +++ b/chain/actors/builtin/power/v12.go @@ -96,6 +96,14 @@ func (s *state12) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state12) RampStartEpoch() int64 { + return 0 +} + +func (s *state12) RampDurationEpochs() uint64 { + return 0 +} + func (s *state12) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v13.go b/chain/actors/builtin/power/v13.go index 4cf761b16d5..8583e19ea79 100644 --- a/chain/actors/builtin/power/v13.go +++ b/chain/actors/builtin/power/v13.go @@ -96,6 +96,14 @@ func (s *state13) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state13) RampStartEpoch() int64 { + return 0 +} + +func (s *state13) RampDurationEpochs() uint64 { + return 0 +} + func (s *state13) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v14.go b/chain/actors/builtin/power/v14.go index 8c0249894f9..0377003cb07 100644 --- a/chain/actors/builtin/power/v14.go +++ b/chain/actors/builtin/power/v14.go @@ -96,6 +96,14 @@ func (s *state14) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state14) RampStartEpoch() int64 { + return 0 +} + +func (s *state14) RampDurationEpochs() uint64 { + return 0 +} + func (s *state14) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v15.go b/chain/actors/builtin/power/v15.go index a31f4ad3985..6bdebf9df72 100644 --- a/chain/actors/builtin/power/v15.go +++ b/chain/actors/builtin/power/v15.go @@ -96,6 +96,14 @@ func (s *state15) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state15) RampStartEpoch() int64 { + return s.State.RampStartEpoch +} + +func (s *state15) RampDurationEpochs() uint64 { + return s.State.RampDurationEpochs +} + func (s *state15) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v2.go b/chain/actors/builtin/power/v2.go index bac0fa1792d..6a36f81cd93 100644 --- a/chain/actors/builtin/power/v2.go +++ b/chain/actors/builtin/power/v2.go @@ -100,6 +100,14 @@ func (s *state2) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state2) RampStartEpoch() int64 { + return 0 +} + +func (s *state2) RampDurationEpochs() uint64 { + return 0 +} + func (s *state2) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v3.go b/chain/actors/builtin/power/v3.go index bdb66e3842a..3db90fbe731 100644 --- a/chain/actors/builtin/power/v3.go +++ b/chain/actors/builtin/power/v3.go @@ -96,6 +96,14 @@ func (s *state3) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state3) RampStartEpoch() int64 { + return 0 +} + +func (s *state3) RampDurationEpochs() uint64 { + return 0 +} + func (s *state3) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v4.go b/chain/actors/builtin/power/v4.go index b2dc953475f..cac6d1cad54 100644 --- a/chain/actors/builtin/power/v4.go +++ b/chain/actors/builtin/power/v4.go @@ -96,6 +96,14 @@ func (s *state4) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state4) RampStartEpoch() int64 { + return 0 +} + +func (s *state4) RampDurationEpochs() uint64 { + return 0 +} + func (s *state4) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v5.go b/chain/actors/builtin/power/v5.go index 3a3adaf32da..7e2450f81b7 100644 --- a/chain/actors/builtin/power/v5.go +++ b/chain/actors/builtin/power/v5.go @@ -96,6 +96,14 @@ func (s *state5) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state5) RampStartEpoch() int64 { + return 0 +} + +func (s *state5) RampDurationEpochs() uint64 { + return 0 +} + func (s *state5) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v6.go b/chain/actors/builtin/power/v6.go index 7e8eb36546c..493b278ec09 100644 --- a/chain/actors/builtin/power/v6.go +++ b/chain/actors/builtin/power/v6.go @@ -96,6 +96,14 @@ func (s *state6) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state6) RampStartEpoch() int64 { + return 0 +} + +func (s *state6) RampDurationEpochs() uint64 { + return 0 +} + func (s *state6) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go index 893c58667d5..bfa3fea2ffd 100644 --- a/chain/actors/builtin/power/v7.go +++ b/chain/actors/builtin/power/v7.go @@ -96,6 +96,14 @@ func (s *state7) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state7) RampStartEpoch() int64 { + return 0 +} + +func (s *state7) RampDurationEpochs() uint64 { + return 0 +} + func (s *state7) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v8.go b/chain/actors/builtin/power/v8.go index b15fe435590..e3ee24c831d 100644 --- a/chain/actors/builtin/power/v8.go +++ b/chain/actors/builtin/power/v8.go @@ -96,6 +96,14 @@ func (s *state8) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state8) RampStartEpoch() int64 { + return 0 +} + +func (s *state8) RampDurationEpochs() uint64 { + return 0 +} + func (s *state8) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v9.go b/chain/actors/builtin/power/v9.go index 126fbbfbf66..d8d49858748 100644 --- a/chain/actors/builtin/power/v9.go +++ b/chain/actors/builtin/power/v9.go @@ -96,6 +96,14 @@ func (s *state9) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state9) RampStartEpoch() int64 { + return 0 +} + +func (s *state9) RampDurationEpochs() uint64 { + return 0 +} + func (s *state9) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/reward/actor.go.template b/chain/actors/builtin/reward/actor.go.template index 81bf91ac317..fa84a1ac30f 100644 --- a/chain/actors/builtin/reward/actor.go.template +++ b/chain/actors/builtin/reward/actor.go.template @@ -84,7 +84,14 @@ type State interface { CumsumBaseline() (abi.StoragePower, error) CumsumRealized() (abi.StoragePower, error) - InitialPledgeForPower(abi.StoragePower, abi.TokenAmount, *builtin.FilterEstimate, abi.TokenAmount) (abi.TokenAmount, error) + // InitialPledgeForPower computes the pledge requirement for committing new quality-adjusted power + // to the network, given the current network total and baseline power, per-epoch reward, and + // circulating token supply. + // + // Prior to actors version 15, the epochsSinceRampStart and rampDurationEpochs arguments have + // no effect. After actors version 15, these values can be derived from the power actor state + // properties RampStartEpoch and RampDurationEpochs. + InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) PreCommitDepositForPower(builtin.FilterEstimate, abi.StoragePower) (abi.TokenAmount, error) GetState() interface{} } diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index b3021b82960..56fb0d0b82d 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -163,7 +163,14 @@ type State interface { CumsumBaseline() (abi.StoragePower, error) CumsumRealized() (abi.StoragePower, error) - InitialPledgeForPower(abi.StoragePower, abi.TokenAmount, *builtin.FilterEstimate, abi.TokenAmount) (abi.TokenAmount, error) + // InitialPledgeForPower computes the pledge requirement for committing new quality-adjusted power + // to the network, given the current network total and baseline power, per-epoch reward, and + // circulating token supply. + // + // Prior to actors version 15, the epochsSinceRampStart and rampDurationEpochs arguments have + // no effect. After actors version 15, these values can be derived from the power actor state + // properties RampStartEpoch and RampDurationEpochs. + InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) PreCommitDepositForPower(builtin.FilterEstimate, abi.StoragePower) (abi.TokenAmount, error) GetState() interface{} } diff --git a/chain/actors/builtin/reward/state.go.template b/chain/actors/builtin/reward/state.go.template index 28ddb80f054..d870c654278 100644 --- a/chain/actors/builtin/reward/state.go.template +++ b/chain/actors/builtin/reward/state.go.template @@ -83,8 +83,8 @@ func (s *state{{.v}}) CumsumRealized() (reward{{.v}}.Spacetime, error) { return s.State.CumsumRealized, nil } {{if (ge .v 2)}} -func (s *state{{.v}}) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner{{.v}}.InitialPledgeForPower( +func (s *state{{.v}}) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { +{{if (ge .v 15)}}return miner{{.v}}.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, s.State.ThisEpochRewardSmoothed, @@ -93,10 +93,22 @@ func (s *state{{.v}}) InitialPledgeForPower(qaPower abi.StoragePower, networkTot VelocityEstimate: networkQAPower.VelocityEstimate, }, circSupply, + epochsSinceRampStart, + rampDurationEpochs, ), nil -} +{{else}}return miner{{.v}}.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing{{.v}}.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +{{end}}} {{else}} -func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, _ int64, _ uint64) (abi.TokenAmount, error) { return miner0.InitialPledgeForPower( sectorWeight, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v0.go b/chain/actors/builtin/reward/v0.go index 66736f9e009..e8c35c52d9b 100644 --- a/chain/actors/builtin/reward/v0.go +++ b/chain/actors/builtin/reward/v0.go @@ -73,7 +73,7 @@ func (s *state0) CumsumRealized() (reward0.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, _ int64, _ uint64) (abi.TokenAmount, error) { return miner0.InitialPledgeForPower( sectorWeight, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v10.go b/chain/actors/builtin/reward/v10.go index 3ffe9a26749..1979230cb2f 100644 --- a/chain/actors/builtin/reward/v10.go +++ b/chain/actors/builtin/reward/v10.go @@ -76,7 +76,7 @@ func (s *state10) CumsumRealized() (reward10.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state10) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state10) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner10.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v11.go b/chain/actors/builtin/reward/v11.go index 1d6a5fdf479..27d5c91ff2f 100644 --- a/chain/actors/builtin/reward/v11.go +++ b/chain/actors/builtin/reward/v11.go @@ -76,7 +76,7 @@ func (s *state11) CumsumRealized() (reward11.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state11) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state11) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner11.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v12.go b/chain/actors/builtin/reward/v12.go index ecc8ff5a0c4..8ceb2f5e051 100644 --- a/chain/actors/builtin/reward/v12.go +++ b/chain/actors/builtin/reward/v12.go @@ -76,7 +76,7 @@ func (s *state12) CumsumRealized() (reward12.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state12) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state12) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner12.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v13.go b/chain/actors/builtin/reward/v13.go index e8d343cab29..3200f6ca2fb 100644 --- a/chain/actors/builtin/reward/v13.go +++ b/chain/actors/builtin/reward/v13.go @@ -76,7 +76,7 @@ func (s *state13) CumsumRealized() (reward13.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state13) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state13) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner13.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v14.go b/chain/actors/builtin/reward/v14.go index 89fa295a352..b86260cfde9 100644 --- a/chain/actors/builtin/reward/v14.go +++ b/chain/actors/builtin/reward/v14.go @@ -76,7 +76,7 @@ func (s *state14) CumsumRealized() (reward14.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state14) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state14) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner14.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v15.go b/chain/actors/builtin/reward/v15.go index 1b781f462a4..03188c62c41 100644 --- a/chain/actors/builtin/reward/v15.go +++ b/chain/actors/builtin/reward/v15.go @@ -76,7 +76,7 @@ func (s *state15) CumsumRealized() (reward15.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state15) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state15) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner15.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, @@ -86,6 +86,8 @@ func (s *state15) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPl VelocityEstimate: networkQAPower.VelocityEstimate, }, circSupply, + epochsSinceRampStart, + rampDurationEpochs, ), nil } diff --git a/chain/actors/builtin/reward/v2.go b/chain/actors/builtin/reward/v2.go index 6d640f2e970..d36d535f02c 100644 --- a/chain/actors/builtin/reward/v2.go +++ b/chain/actors/builtin/reward/v2.go @@ -76,7 +76,7 @@ func (s *state2) CumsumRealized() (reward2.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state2) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state2) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner2.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v3.go b/chain/actors/builtin/reward/v3.go index fe8e555c914..75b6be88688 100644 --- a/chain/actors/builtin/reward/v3.go +++ b/chain/actors/builtin/reward/v3.go @@ -76,7 +76,7 @@ func (s *state3) CumsumRealized() (reward3.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state3) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state3) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner3.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v4.go b/chain/actors/builtin/reward/v4.go index f0decd39217..89e325571df 100644 --- a/chain/actors/builtin/reward/v4.go +++ b/chain/actors/builtin/reward/v4.go @@ -76,7 +76,7 @@ func (s *state4) CumsumRealized() (reward4.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state4) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state4) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner4.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v5.go b/chain/actors/builtin/reward/v5.go index 82be12c0aea..4343deb4f66 100644 --- a/chain/actors/builtin/reward/v5.go +++ b/chain/actors/builtin/reward/v5.go @@ -76,7 +76,7 @@ func (s *state5) CumsumRealized() (reward5.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state5) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state5) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner5.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v6.go b/chain/actors/builtin/reward/v6.go index 71884dadaaf..b26ea7edbf0 100644 --- a/chain/actors/builtin/reward/v6.go +++ b/chain/actors/builtin/reward/v6.go @@ -76,7 +76,7 @@ func (s *state6) CumsumRealized() (reward6.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state6) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state6) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner6.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v7.go b/chain/actors/builtin/reward/v7.go index bc39f366619..ec0e5af9f2a 100644 --- a/chain/actors/builtin/reward/v7.go +++ b/chain/actors/builtin/reward/v7.go @@ -76,7 +76,7 @@ func (s *state7) CumsumRealized() (reward7.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner7.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v8.go b/chain/actors/builtin/reward/v8.go index 5f6b96d29bf..54496f03ade 100644 --- a/chain/actors/builtin/reward/v8.go +++ b/chain/actors/builtin/reward/v8.go @@ -76,7 +76,7 @@ func (s *state8) CumsumRealized() (reward8.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state8) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state8) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner8.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/actors/builtin/reward/v9.go b/chain/actors/builtin/reward/v9.go index 6118e2b3029..f9a106d6007 100644 --- a/chain/actors/builtin/reward/v9.go +++ b/chain/actors/builtin/reward/v9.go @@ -76,7 +76,7 @@ func (s *state9) CumsumRealized() (reward9.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state9) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state9) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner9.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 02b4f0f83cb..316669ea860 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -19,10 +19,11 @@ import ( builtintypes "github.com/filecoin-project/go-state-types/builtin" power11 "github.com/filecoin-project/go-state-types/builtin/v11/power" miner14 "github.com/filecoin-project/go-state-types/builtin/v14/miner" + miner15 "github.com/filecoin-project/go-state-types/builtin/v15/miner" + power15 "github.com/filecoin-project/go-state-types/builtin/v15/power" + smoothing15 "github.com/filecoin-project/go-state-types/builtin/v15/util/smoothing" minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" - miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" - smoothing9 "github.com/filecoin-project/go-state-types/builtin/v9/util/smoothing" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -473,19 +474,36 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal return cid.Undef, xerrors.Errorf("getting current epoch reward: %w", err) } - tpow, err := currentTotalPower(ctx, genesisVm, minerInfos[i].maddr) + qaps, err := currentQualityAdjPowerSmoothed(ctx, nv, genesisVm, minerInfos[i].maddr) if err != nil { return cid.Undef, xerrors.Errorf("getting current total power: %w", err) } - pcd := miner9.PreCommitDepositForPower(smoothing9.FilterEstimate(rewardSmoothed), smoothing9.FilterEstimate(*tpow.QualityAdjPowerSmoothed), miner9.QAPowerMax(m.SectorSize)) + pcd := miner15.PreCommitDepositForPower(smoothing15.FilterEstimate(rewardSmoothed), qaps, miner15.QAPowerMax(m.SectorSize)) - pledge := miner9.InitialPledgeForPower( + powerActor, err := nst.GetActor(power.Address) + if err != nil { + return cid.Undef, xerrors.Errorf("loading power actor: %w", err) + } + + powerState, err := power.Load(adt.WrapStore(ctx, cst), powerActor) + if err != nil { + return cid.Undef, xerrors.Errorf("loading power actor state: %w", err) + } + + var epochsSinceRampStart int64 + if powerState.RampStartEpoch() > 0 { + epochsSinceRampStart = -powerState.RampStartEpoch() + } + + pledge := miner15.InitialPledgeForPower( sectorWeight, baselinePower, - smoothing9.FilterEstimate(rewardSmoothed), - smoothing9.FilterEstimate(*tpow.QualityAdjPowerSmoothed), + smoothing15.FilterEstimate(rewardSmoothed), + qaps, big.Zero(), + epochsSinceRampStart, + powerState.RampDurationEpochs(), ) pledge = big.Add(pcd, pledge) @@ -658,17 +676,23 @@ func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, randEpoch abi.Chain return *(*[32]byte)(out), nil } -func currentTotalPower(ctx context.Context, vm vm.Interface, maddr address.Address) (*power0.CurrentTotalPowerReturn, error) { +func currentQualityAdjPowerSmoothed(ctx context.Context, nv network.Version, vm vm.Interface, maddr address.Address) (smoothing15.FilterEstimate, error) { pwret, err := doExecValue(ctx, vm, power.Address, maddr, big.Zero(), builtin0.MethodsPower.CurrentTotalPower, nil) if err != nil { - return nil, err + return smoothing15.FilterEstimate{}, err + } + if nv >= network.Version24 { + var pwr power15.CurrentTotalPowerReturn + if err := pwr.UnmarshalCBOR(bytes.NewReader(pwret)); err != nil { + return smoothing15.FilterEstimate{}, err + } + return pwr.QualityAdjPowerSmoothed, nil } var pwr power0.CurrentTotalPowerReturn if err := pwr.UnmarshalCBOR(bytes.NewReader(pwret)); err != nil { - return nil, err + return smoothing15.FilterEstimate{}, err } - - return &pwr, nil + return smoothing15.FilterEstimate(*pwr.QualityAdjPowerSmoothed), nil } func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address.Address, av actorstypes.Version) (abi.StoragePower, builtin.FilterEstimate, error) { diff --git a/cmd/lotus-shed/balances.go b/cmd/lotus-shed/balances.go index 9be42914705..fd48dd51d5a 100644 --- a/cmd/lotus-shed/balances.go +++ b/cmd/lotus-shed/balances.go @@ -784,6 +784,21 @@ var chainPledgeCmd = &cli.Command{ return xerrors.Errorf("loading reward actor state: %w", err) } + powerActor, err := state.GetActor(power.Address) + if err != nil { + return xerrors.Errorf("loading power actor: %w", err) + } + + powerState, err := power.Load(store, powerActor) + if err != nil { + return xerrors.Errorf("loading power actor state: %w", err) + } + + var epochsSinceRampStart int64 + if powerState.RampStartEpoch() > 0 { + epochsSinceRampStart = epoch - powerState.RampStartEpoch() + } + fmt.Println("FilVested", types.FIL(circ.FilVested)) fmt.Println("FilMined", types.FIL(circ.FilMined)) fmt.Println("FilBurnt", types.FIL(circ.FilBurnt)) @@ -801,6 +816,8 @@ var chainPledgeCmd = &cli.Command{ pledgeCollateral, &powerSmoothed, circ.FilCirculating, + epochsSinceRampStart, + powerState.RampDurationEpochs(), ) if err != nil { return xerrors.Errorf("calculating initial pledge: %w", err) diff --git a/go.mod b/go.mod index 543faf226d8..b4aa14f1234 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/filecoin-project/go-jsonrpc v0.6.0 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.15.0-dev + github.com/filecoin-project/go-state-types v0.15.0-dev.0.20240930040600-f1e9746dbeaa github.com/filecoin-project/go-statemachine v1.0.3 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 @@ -162,7 +162,7 @@ require ( golang.org/x/term v0.24.0 golang.org/x/time v0.5.0 golang.org/x/tools v0.24.0 - golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da gotest.tools v2.2.0+incompatible ) @@ -218,7 +218,6 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20240509144519-723abb6459b7 // indirect - github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/huin/goupnp v1.3.0 // indirect diff --git a/go.sum b/go.sum index 90f924215e1..ea52a7f8063 100644 --- a/go.sum +++ b/go.sum @@ -292,8 +292,10 @@ github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.15.0-dev h1:6lR4q5QSCUqOEfy2RWEsOLADd82T/K9CwGNMj27Fpwo= -github.com/filecoin-project/go-state-types v0.15.0-dev/go.mod h1:dMXsOsurh57in11qTmPpYyrhGQAOhVtHQXnyV0X+QQk= +github.com/filecoin-project/go-state-types v0.15.0-dev.0.20240930015632-1fa1b9336831 h1:2uM70AEdo1vS3GEo3k5NjttH3kQM2+Z75a7nmlqRNCw= +github.com/filecoin-project/go-state-types v0.15.0-dev.0.20240930015632-1fa1b9336831/go.mod h1:YcWoJE/24XGEL6w9FjUoMBu7+eHEkgwKnkGZkTBX9TE= +github.com/filecoin-project/go-state-types v0.15.0-dev.0.20240930040600-f1e9746dbeaa h1:bFoshr5ETGO0UWCeBD4LLwkk/BVCvwLO5gpgOojB268= +github.com/filecoin-project/go-state-types v0.15.0-dev.0.20240930040600-f1e9746dbeaa/go.mod h1:YcWoJE/24XGEL6w9FjUoMBu7+eHEkgwKnkGZkTBX9TE= github.com/filecoin-project/go-statemachine v1.0.3 h1:N07o6alys+V1tNoSTi4WuuoeNC4erS/6jE74+NsgQuk= github.com/filecoin-project/go-statemachine v1.0.3/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= @@ -1757,8 +1759,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= diff --git a/itests/kit/node_unmanaged.go b/itests/kit/node_unmanaged.go index 799034372e0..1771bea3ff2 100644 --- a/itests/kit/node_unmanaged.go +++ b/itests/kit/node_unmanaged.go @@ -23,6 +23,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-commp-utils/v2" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/batch" "github.com/filecoin-project/go-state-types/builtin" miner14 "github.com/filecoin-project/go-state-types/builtin/v14/miner" "github.com/filecoin-project/go-state-types/crypto" @@ -787,9 +788,9 @@ func (tm *TestUnmanagedMiner) submitProveCommit( req.True(msgReturn.Receipt.ExitCode.IsSuccess()) } - var returnValue miner14.BatchReturn + var returnValue batch.BatchReturn req.NoError(returnValue.UnmarshalCBOR(bytes.NewReader(msgReturn.Receipt.Return))) - exitCodes := exitCodesFromBatchReturn(returnValue) + exitCodes := returnValue.Codes() for i, sector := range sectors { si, err := tm.FullNode.StateSectorGetInfo(tm.ctx, tm.ActorAddr, sector.sectorNumber, msgReturn.TipSet) @@ -1595,23 +1596,3 @@ func CurrentDeadlineIndex(di *dline.Info) uint64 { } return uint64(didx) } - -// TODO: remove when https://github.com/filecoin-project/go-state-types/pull/286 is available -func exitCodesFromBatchReturn(b miner14.BatchReturn) []exitcode.ExitCode { - size := int(b.SuccessCount) + len(b.FailCodes) - codes := make([]exitcode.ExitCode, size) - i := 0 - for _, fc := range b.FailCodes { - if fc.Idx > uint64(i) { - for ; i < int(fc.Idx); i++ { - codes[i] = exitcode.Ok - } - } - codes[i] = fc.Code - i++ - } - for ; i < len(codes); i++ { - codes[i] = exitcode.Ok - } - return codes -} diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 977e1655cf9..1406e70f106 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -1558,11 +1558,28 @@ func (a *StateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, maddr return types.EmptyInt, xerrors.Errorf("getting circulating supply: %w", err) } + powerActor, err := state.GetActor(power.Address) + if err != nil { + return types.EmptyInt, xerrors.Errorf("loading power actor: %w", err) + } + + powerState, err := power.Load(a.Chain.ActorStore(ctx), powerActor) + if err != nil { + return types.EmptyInt, xerrors.Errorf("loading power actor state: %w", err) + } + + var epochsSinceRampStart int64 + if powerState.RampStartEpoch() > 0 { + epochsSinceRampStart = int64(ts.Height()) - powerState.RampStartEpoch() + } + initialPledge, err := rewardState.InitialPledgeForPower( sectorWeight, pledgeCollateral, powerSmoothed, circSupply.FilCirculating, + epochsSinceRampStart, + powerState.RampDurationEpochs(), ) if err != nil { return types.EmptyInt, xerrors.Errorf("calculating initial pledge: %w", err) @@ -1615,11 +1632,28 @@ func (a *StateAPI) StateMinerInitialPledgeForSector(ctx context.Context, sectorD verifiedWeight := big.Mul(big.NewIntUnsigned(verifiedSize), big.NewInt(int64(sectorDuration))) sectorWeight := builtin.QAPowerForWeight(sectorSize, sectorDuration, big.Zero(), verifiedWeight) + powerActor, err := state.GetActor(power.Address) + if err != nil { + return types.EmptyInt, xerrors.Errorf("loading power actor: %w", err) + } + + powerState, err := power.Load(a.Chain.ActorStore(ctx), powerActor) + if err != nil { + return types.EmptyInt, xerrors.Errorf("loading power actor state: %w", err) + } + + var epochsSinceRampStart int64 + if powerState.RampStartEpoch() > 0 { + epochsSinceRampStart = int64(ts.Height()) - powerState.RampStartEpoch() + } + initialPledge, err := rewardState.InitialPledgeForPower( sectorWeight, pledgeCollateral, powerSmoothed, circSupply.FilCirculating, + epochsSinceRampStart, + powerState.RampDurationEpochs(), ) if err != nil { return types.EmptyInt, xerrors.Errorf("calculating initial pledge: %w", err)