Merge pull request #3676 from filecoin-project/feat/mpool-replace-auto
add an auto flag to mpool replace
This commit is contained in:
commit
1d78ffc04d
@ -11,6 +11,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
lru "github.com/hashicorp/golang-lru"
|
lru "github.com/hashicorp/golang-lru"
|
||||||
@ -154,6 +155,11 @@ func newMsgSet(nonce uint64) *msgSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ComputeMinRBF(curPrem abi.TokenAmount) abi.TokenAmount {
|
||||||
|
minPrice := types.BigAdd(curPrem, types.BigDiv(types.BigMul(curPrem, rbfNumBig), rbfDenomBig))
|
||||||
|
return types.BigAdd(minPrice, types.NewInt(1))
|
||||||
|
}
|
||||||
|
|
||||||
func (ms *msgSet) add(m *types.SignedMessage, mp *MessagePool, strict bool) (bool, error) {
|
func (ms *msgSet) add(m *types.SignedMessage, mp *MessagePool, strict bool) (bool, error) {
|
||||||
nextNonce := ms.nextNonce
|
nextNonce := ms.nextNonce
|
||||||
nonceGap := false
|
nonceGap := false
|
||||||
@ -181,9 +187,7 @@ func (ms *msgSet) add(m *types.SignedMessage, mp *MessagePool, strict bool) (boo
|
|||||||
|
|
||||||
if m.Cid() != exms.Cid() {
|
if m.Cid() != exms.Cid() {
|
||||||
// check if RBF passes
|
// check if RBF passes
|
||||||
minPrice := exms.Message.GasPremium
|
minPrice := ComputeMinRBF(exms.Message.GasPremium)
|
||||||
minPrice = types.BigAdd(minPrice, types.BigDiv(types.BigMul(minPrice, rbfNumBig), rbfDenomBig))
|
|
||||||
minPrice = types.BigAdd(minPrice, types.NewInt(1))
|
|
||||||
if types.BigCmp(m.Message.GasPremium, minPrice) >= 0 {
|
if types.BigCmp(m.Message.GasPremium, minPrice) >= 0 {
|
||||||
log.Infow("add with RBF", "oldpremium", exms.Message.GasPremium,
|
log.Infow("add with RBF", "oldpremium", exms.Message.GasPremium,
|
||||||
"newpremium", m.Message.GasPremium, "addr", m.Message.From, "nonce", m.Message.Nonce)
|
"newpremium", m.Message.GasPremium, "addr", m.Message.From, "nonce", m.Message.Nonce)
|
||||||
|
21
cli/mpool.go
21
cli/mpool.go
@ -11,7 +11,10 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
|
"github.com/filecoin-project/go-state-types/big"
|
||||||
|
|
||||||
|
lapi "github.com/filecoin-project/lotus/api"
|
||||||
|
"github.com/filecoin-project/lotus/chain/messagepool"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -293,6 +296,10 @@ var mpoolReplaceCmd = &cli.Command{
|
|||||||
Name: "gas-limit",
|
Name: "gas-limit",
|
||||||
Usage: "gas price for new message",
|
Usage: "gas price for new message",
|
||||||
},
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "auto",
|
||||||
|
Usage: "automatically reprice the specified message",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
ArgsUsage: "[from] [nonce]",
|
ArgsUsage: "[from] [nonce]",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
@ -342,6 +349,19 @@ var mpoolReplaceCmd = &cli.Command{
|
|||||||
|
|
||||||
msg := found.Message
|
msg := found.Message
|
||||||
|
|
||||||
|
if cctx.Bool("auto") {
|
||||||
|
// msg.GasLimit = 0 // TODO: need to fix the way we estimate gas limits to account for the messages already being in the mempool
|
||||||
|
msg.GasFeeCap = abi.NewTokenAmount(0)
|
||||||
|
msg.GasPremium = abi.NewTokenAmount(0)
|
||||||
|
retm, err := api.GasEstimateMessageGas(ctx, &msg, &lapi.MessageSendSpec{}, types.EmptyTSK)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to estimate gas values: %w", err)
|
||||||
|
}
|
||||||
|
msg.GasFeeCap = retm.GasFeeCap
|
||||||
|
|
||||||
|
minRBF := messagepool.ComputeMinRBF(msg.GasPremium)
|
||||||
|
msg.GasPremium = big.Max(retm.GasPremium, minRBF)
|
||||||
|
} else {
|
||||||
msg.GasLimit = cctx.Int64("gas-limit")
|
msg.GasLimit = cctx.Int64("gas-limit")
|
||||||
msg.GasPremium, err = types.BigFromString(cctx.String("gas-premium"))
|
msg.GasPremium, err = types.BigFromString(cctx.String("gas-premium"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -352,6 +372,7 @@ var mpoolReplaceCmd = &cli.Command{
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("parsing gas-feecap: %w", err)
|
return fmt.Errorf("parsing gas-feecap: %w", err)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
smsg, err := api.WalletSignMessage(ctx, msg.From, &msg)
|
smsg, err := api.WalletSignMessage(ctx, msg.From, &msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user