lotus/node/impl/full/wallet.go

98 lines
2.7 KiB
Go
Raw Normal View History

2019-08-20 16:48:33 +00:00
package full
import (
"context"
"github.com/filecoin-project/specs-actors/actors/abi/big"
2019-08-20 16:48:33 +00:00
"github.com/filecoin-project/lotus/lib/sigs"
2019-08-20 16:48:33 +00:00
"github.com/filecoin-project/go-address"
2020-02-12 23:52:36 +00:00
"github.com/filecoin-project/specs-actors/actors/crypto"
"github.com/filecoin-project/lotus/chain/stmgr"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet"
2019-08-20 16:48:33 +00:00
"go.uber.org/fx"
"golang.org/x/xerrors"
)
type WalletAPI struct {
fx.In
StateManager *stmgr.StateManager
Wallet *wallet.Wallet
2019-08-20 16:48:33 +00:00
}
2020-02-12 23:52:36 +00:00
func (a *WalletAPI) WalletNew(ctx context.Context, typ crypto.SigType) (address.Address, error) {
2019-08-20 16:48:33 +00:00
return a.Wallet.GenerateKey(typ)
}
func (a *WalletAPI) WalletHas(ctx context.Context, addr address.Address) (bool, error) {
return a.Wallet.HasKey(addr)
}
func (a *WalletAPI) WalletList(ctx context.Context) ([]address.Address, error) {
return a.Wallet.ListAddrs()
}
func (a *WalletAPI) WalletBalance(ctx context.Context, addr address.Address) (types.BigInt, error) {
var bal types.BigInt
err := a.StateManager.WithParentStateTsk(types.EmptyTSK, a.StateManager.WithActor(addr, func(act *types.Actor) error {
bal = act.Balance
return nil
}))
if xerrors.Is(err, types.ErrActorNotFound) {
return big.Zero(), nil
} else {
return bal, err
}
2019-08-20 16:48:33 +00:00
}
2020-02-12 23:52:36 +00:00
func (a *WalletAPI) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) {
2020-06-16 01:00:22 +00:00
keyAddr, err := a.StateManager.ResolveToKeyAddress(ctx, k, nil)
if err != nil {
return nil, xerrors.Errorf("failed to resolve ID address: %w", keyAddr)
}
return a.Wallet.Sign(ctx, keyAddr, msg)
2019-08-20 16:48:33 +00:00
}
func (a *WalletAPI) WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) {
mcid := msg.Cid()
2019-08-20 16:48:33 +00:00
sig, err := a.WalletSign(ctx, k, mcid.Bytes())
2019-08-20 16:48:33 +00:00
if err != nil {
return nil, xerrors.Errorf("failed to sign message: %w", err)
}
return &types.SignedMessage{
Message: *msg,
Signature: *sig,
}, nil
}
2020-03-08 00:46:12 +00:00
func (a *WalletAPI) WalletVerify(ctx context.Context, k address.Address, msg []byte, sig *crypto.Signature) bool {
return sigs.Verify(sig, k, msg) == nil
}
2019-08-20 16:48:33 +00:00
func (a *WalletAPI) WalletDefaultAddress(ctx context.Context) (address.Address, error) {
return a.Wallet.GetDefault()
}
2019-08-20 16:48:33 +00:00
func (a *WalletAPI) WalletSetDefault(ctx context.Context, addr address.Address) error {
return a.Wallet.SetDefault(addr)
2019-08-20 16:48:33 +00:00
}
2019-10-08 09:17:03 +00:00
2019-10-08 09:46:36 +00:00
func (a *WalletAPI) WalletExport(ctx context.Context, addr address.Address) (*types.KeyInfo, error) {
2019-10-08 09:17:03 +00:00
return a.Wallet.Export(addr)
}
2019-10-08 09:46:36 +00:00
func (a *WalletAPI) WalletImport(ctx context.Context, ki *types.KeyInfo) (address.Address, error) {
return a.Wallet.Import(ki)
2019-10-08 09:17:03 +00:00
}
2020-06-05 23:04:23 +00:00
func (a *WalletAPI) WalletDelete(ctx context.Context, addr address.Address) error {
return a.Wallet.DeleteKey(addr)
}