Don't spend eveything on message fees
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This commit is contained in:
parent
7a18578706
commit
f809e478f4
@ -116,7 +116,7 @@ type FullNode interface {
|
|||||||
BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error)
|
BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error)
|
||||||
|
|
||||||
// GasEstimateFeeCap estimates gas fee cap
|
// GasEstimateFeeCap estimates gas fee cap
|
||||||
GasEstimateFeeCap(context.Context, int64, types.TipSetKey) (types.BigInt, error)
|
GasEstimateFeeCap(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error)
|
||||||
|
|
||||||
// GasEstimateGasLimit estimates gas used by the message and returns it.
|
// GasEstimateGasLimit estimates gas used by the message and returns it.
|
||||||
// It fails if message fails to execute.
|
// It fails if message fails to execute.
|
||||||
|
@ -89,7 +89,7 @@ type FullNodeStruct struct {
|
|||||||
|
|
||||||
GasEsitmateGasPremium func(context.Context, uint64, address.Address, int64, types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
GasEsitmateGasPremium func(context.Context, uint64, address.Address, int64, types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
GasEstimateGasLimit func(context.Context, *types.Message, types.TipSetKey) (int64, error) `perm:"read"`
|
GasEstimateGasLimit func(context.Context, *types.Message, types.TipSetKey) (int64, error) `perm:"read"`
|
||||||
GasEstimateFeeCap func(context.Context, int64, types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
GasEstimateFeeCap func(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
SyncState func(context.Context) (*api.SyncState, error) `perm:"read"`
|
SyncState func(context.Context) (*api.SyncState, error) `perm:"read"`
|
||||||
SyncSubmitBlock func(ctx context.Context, blk *types.BlockMsg) error `perm:"write"`
|
SyncSubmitBlock func(ctx context.Context, blk *types.BlockMsg) error `perm:"write"`
|
||||||
@ -437,9 +437,9 @@ func (c *FullNodeStruct) GasEsitmateGasPremium(ctx context.Context, nblocksincl
|
|||||||
sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error) {
|
sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error) {
|
||||||
return c.Internal.GasEsitmateGasPremium(ctx, nblocksincl, sender, gaslimit, tsk)
|
return c.Internal.GasEsitmateGasPremium(ctx, nblocksincl, sender, gaslimit, tsk)
|
||||||
}
|
}
|
||||||
func (c *FullNodeStruct) GasEstimateFeeCap(ctx context.Context, maxqueueblks int64,
|
func (c *FullNodeStruct) GasEstimateFeeCap(ctx context.Context, msg *types.Message,
|
||||||
tsk types.TipSetKey) (types.BigInt, error) {
|
maxqueueblks int64, tsk types.TipSetKey) (types.BigInt, error) {
|
||||||
return c.Internal.GasEstimateFeeCap(ctx, maxqueueblks, tsk)
|
return c.Internal.GasEstimateFeeCap(ctx, msg, maxqueueblks, tsk)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FullNodeStruct) GasEstimateGasLimit(ctx context.Context, msg *types.Message,
|
func (c *FullNodeStruct) GasEstimateGasLimit(ctx context.Context, msg *types.Message,
|
||||||
|
@ -27,17 +27,35 @@ type GasAPI struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const MinGasPremium = 10e3
|
const MinGasPremium = 10e3
|
||||||
const BaseFeeEstimNBlocks = 20
|
const MaxSpendOnFeeDenom = 100
|
||||||
|
|
||||||
func (a *GasAPI) GasEstimateFeeCap(ctx context.Context, maxqueueblks int64,
|
func (a *GasAPI) GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64,
|
||||||
tsk types.TipSetKey) (types.BigInt, error) {
|
tsk types.TipSetKey) (types.BigInt, error) {
|
||||||
ts := a.Chain.GetHeaviestTipSet()
|
ts := a.Chain.GetHeaviestTipSet()
|
||||||
|
|
||||||
parentBaseFee := ts.Blocks()[0].ParentBaseFee
|
var act types.Actor
|
||||||
increaseFactor := math.Pow(1+float64(1/build.BaseFeeMaxChangeDenom), BaseFeeEstimNBlocks)
|
err := a.Stmgr.WithParentState(ts, a.Stmgr.WithActor(msg.From, stmgr.GetActor(&act)))
|
||||||
|
if err != nil {
|
||||||
|
return types.NewInt(0), xerrors.Errorf("getting actor: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
parentBaseFee := ts.Blocks()[0].ParentBaseFee
|
||||||
|
increaseFactor := math.Pow(1+float64(1/build.BaseFeeMaxChangeDenom), float64(maxqueueblks))
|
||||||
|
|
||||||
|
feeInFuture := types.BigMul(parentBaseFee, types.NewInt(uint64(increaseFactor*(1<<8))))
|
||||||
|
feeInFuture = types.BigDiv(feeInFuture, types.NewInt(1<<8))
|
||||||
|
|
||||||
|
gasLimitBig := types.NewInt(uint64(msg.GasLimit))
|
||||||
|
maxAccepted := types.BigDiv(act.Balance, types.NewInt(MaxSpendOnFeeDenom))
|
||||||
|
expectedFee := types.BigMul(feeInFuture, gasLimitBig)
|
||||||
|
|
||||||
|
out := feeInFuture
|
||||||
|
if types.BigCmp(expectedFee, maxAccepted) > 0 {
|
||||||
|
log.Warnf("Expected fee for message higher than tolerance: %s > %s, setting to tolerance",
|
||||||
|
types.FIL(expectedFee), types.FIL(maxAccepted))
|
||||||
|
out = types.BigDiv(maxAccepted, gasLimitBig)
|
||||||
|
}
|
||||||
|
|
||||||
out := types.BigMul(parentBaseFee, types.NewInt(uint64(increaseFactor*(1<<8))))
|
|
||||||
out = types.BigDiv(out, types.NewInt(1<<8))
|
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message) (*t
|
|||||||
}
|
}
|
||||||
|
|
||||||
if msg.GasFeeCap == types.EmptyInt || types.BigCmp(msg.GasFeeCap, types.NewInt(0)) == 0 {
|
if msg.GasFeeCap == types.EmptyInt || types.BigCmp(msg.GasFeeCap, types.NewInt(0)) == 0 {
|
||||||
feeCap, err := a.GasEstimateFeeCap(ctx, 20, types.EmptyTSK)
|
feeCap, err := a.GasEstimateFeeCap(ctx, msg, 20, types.EmptyTSK)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("estimating fee cap: %w", err)
|
return nil, xerrors.Errorf("estimating fee cap: %w", err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user