lotus/node/impl/full/wallet.go

98 lines
2.8 KiB
Go
Raw Normal View History

2019-08-20 16:48:33 +00:00
package full
import (
"context"
"go.uber.org/fx"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
2020-09-07 03:49:10 +00:00
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/crypto"
2020-02-12 23:52:36 +00:00
2020-09-05 19:36:32 +00:00
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/messagesigner"
"github.com/filecoin-project/lotus/chain/stmgr"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet"
"github.com/filecoin-project/lotus/chain/wallet/key"
"github.com/filecoin-project/lotus/lib/sigs"
2019-08-20 16:48:33 +00:00
)
type WalletAPI struct {
fx.In
StateManagerAPI stmgr.StateManagerAPI
Default wallet.Default
api.Wallet
2019-08-20 16:48:33 +00:00
}
func (a *WalletAPI) WalletBalance(ctx context.Context, addr address.Address) (types.BigInt, error) {
act, err := a.StateManagerAPI.LoadActorTsk(ctx, addr, types.EmptyTSK)
if xerrors.Is(err, types.ErrActorNotFound) {
return big.Zero(), nil
2020-09-15 18:16:35 +00:00
} else if err != nil {
return big.Zero(), err
}
2020-09-15 18:16:35 +00:00
return act.Balance, nil
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) {
keyAddr, err := a.StateManagerAPI.ResolveToDeterministicAddress(ctx, k, nil)
2020-06-16 01:00:22 +00:00
if err != nil {
return nil, xerrors.Errorf("failed to resolve ID address: %w", keyAddr)
}
return a.Wallet.WalletSign(ctx, keyAddr, msg, api.MsgMeta{
2020-10-08 23:50:33 +00:00
Type: api.MTUnknown,
2020-10-08 23:33:50 +00:00
})
2019-08-20 16:48:33 +00:00
}
func (a *WalletAPI) WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) {
keyAddr, err := a.StateManagerAPI.ResolveToDeterministicAddress(ctx, k, nil)
2019-08-20 16:48:33 +00:00
if err != nil {
2020-09-04 20:17:28 +00:00
return nil, xerrors.Errorf("failed to resolve ID address: %w", keyAddr)
2019-08-20 16:48:33 +00:00
}
keyInfo, err := a.Wallet.WalletExport(ctx, k)
if err != nil {
return nil, err
}
sb, err := messagesigner.SigningBytes(msg, key.ActSigType(keyInfo.Type))
if err != nil {
return nil, err
}
mb, err := msg.ToStorageBlock()
if err != nil {
return nil, xerrors.Errorf("serializing message: %w", err)
}
sig, err := a.Wallet.WalletSign(ctx, keyAddr, sb, api.MsgMeta{
Type: api.MTChainMsg,
Extra: mb.RawData(),
})
if err != nil {
return nil, xerrors.Errorf("failed to sign message: %w", err)
}
return &types.SignedMessage{
Message: *msg,
Signature: *sig,
}, nil
2019-08-20 16:48:33 +00:00
}
2020-09-17 10:22:56 +00:00
func (a *WalletAPI) WalletVerify(ctx context.Context, k address.Address, msg []byte, sig *crypto.Signature) (bool, error) {
return sigs.Verify(sig, k, msg) == nil, nil
}
2019-08-20 16:48:33 +00:00
func (a *WalletAPI) WalletDefaultAddress(ctx context.Context) (address.Address, error) {
2020-09-04 20:17:28 +00:00
return a.Default.GetDefault()
}
2019-08-20 16:48:33 +00:00
func (a *WalletAPI) WalletSetDefault(ctx context.Context, addr address.Address) error {
2020-09-04 20:17:28 +00:00
return a.Default.SetDefault(addr)
2020-06-05 23:04:23 +00:00
}
func (a *WalletAPI) WalletValidateAddress(ctx context.Context, str string) (address.Address, error) {
return address.NewFromString(str)
}