lotus/chain/market/fundmgr.go

91 lines
2.0 KiB
Go
Raw Normal View History

2019-11-08 17:15:38 +00:00
package market
import (
"context"
"sync"
2020-02-13 03:50:37 +00:00
"github.com/filecoin-project/specs-actors/actors/builtin"
logging "github.com/ipfs/go-log"
2019-11-08 17:15:38 +00:00
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
2019-11-08 17:15:38 +00:00
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/stmgr"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/impl/full"
)
var log = logging.Logger("market_adapter")
2019-11-08 17:15:38 +00:00
type FundMgr struct {
sm *stmgr.StateManager
mpool full.MpoolAPI
lk sync.Mutex
available map[address.Address]types.BigInt
}
func NewFundMgr(sm *stmgr.StateManager, mpool full.MpoolAPI) *FundMgr {
return &FundMgr{
sm: sm,
mpool: mpool,
available: map[address.Address]types.BigInt{},
}
}
func (fm *FundMgr) EnsureAvailable(ctx context.Context, addr, wallet address.Address, amt types.BigInt) error {
2019-11-08 17:15:38 +00:00
fm.lk.Lock()
avail, ok := fm.available[addr]
if !ok {
bal, err := fm.sm.MarketBalance(ctx, addr, nil)
if err != nil {
fm.lk.Unlock()
return err
}
2020-02-08 02:18:32 +00:00
avail = types.BigSub(bal.Escrow, bal.Locked)
2019-11-08 17:15:38 +00:00
}
toAdd := types.NewInt(0)
avail = types.BigSub(avail, amt)
if avail.LessThan(types.NewInt(0)) {
// TODO: some rules around adding more to avoid doing stuff on-chain
// all the time
toAdd = types.BigSub(toAdd, avail)
avail = types.NewInt(0)
}
fm.available[addr] = avail
2019-11-08 20:11:56 +00:00
2019-11-08 17:15:38 +00:00
fm.lk.Unlock()
2020-02-13 03:50:37 +00:00
var err error
2020-02-23 15:50:36 +00:00
params, err := actors.SerializeParams(&addr)
2020-02-13 03:50:37 +00:00
if err != nil {
return err
}
2019-11-08 17:15:38 +00:00
smsg, err := fm.mpool.MpoolPushMessage(ctx, &types.Message{
2020-02-25 20:54:58 +00:00
To: builtin.StorageMarketActorAddr,
From: wallet,
2019-11-08 17:15:38 +00:00
Value: toAdd,
GasPrice: types.NewInt(0),
GasLimit: types.NewInt(1000000),
2020-02-13 03:50:37 +00:00
Method: builtin.MethodsMarket.AddBalance,
Params: params,
2019-11-08 17:15:38 +00:00
})
if err != nil {
return err
}
_, r, err := fm.sm.WaitForMessage(ctx, smsg.Cid())
if err != nil {
2020-02-29 02:02:40 +00:00
return xerrors.Errorf("failed waiting for market AddBalance message: %w", err)
2019-11-08 17:15:38 +00:00
}
if r.ExitCode != 0 {
return xerrors.Errorf("adding funds to storage miner market actor failed: exit %d", r.ExitCode)
}
return nil
}