6 "github.com/bytom/vapor/account"
7 "github.com/bytom/vapor/blockchain/pseudohsm"
8 "github.com/bytom/vapor/crypto/ed25519/chainkd"
9 "github.com/bytom/vapor/errors"
13 func (a *API) walletError() Response {
14 return NewErrorResponse(errors.New("wallet not found, please check that the wallet is open"))
17 // WalletImage hold the ziped wallet data
18 type WalletImage struct {
19 AccountImage *account.Image `json:"account_image"`
20 KeyImages *pseudohsm.KeyImage `json:"key_images"`
23 func (a *API) restoreWalletImage(ctx context.Context, image WalletImage) Response {
24 if err := a.wallet.Hsm.Restore(image.KeyImages); err != nil {
25 return NewErrorResponse(errors.Wrap(err, "restore key images"))
27 if err := a.wallet.AccountMgr.Restore(image.AccountImage); err != nil {
28 return NewErrorResponse(errors.Wrap(err, "restore account image"))
31 var allAccounts []*account.Account
32 for _, acctImage := range image.AccountImage.Slice {
33 allAccounts = append(allAccounts, acctImage.Account)
36 if err := a.wallet.RecoveryMgr.AddrResurrect(allAccounts); err != nil {
37 return NewErrorResponse(err)
40 a.wallet.RescanBlocks()
41 return NewSuccessResponse(nil)
44 func (a *API) backupWalletImage() Response {
45 keyImages, err := a.wallet.Hsm.Backup()
47 return NewErrorResponse(errors.Wrap(err, "backup key images"))
49 accountImage, err := a.wallet.AccountMgr.Backup()
51 return NewErrorResponse(errors.Wrap(err, "backup account image"))
54 image := &WalletImage{
56 AccountImage: accountImage,
58 return NewSuccessResponse(image)
61 func (a *API) rescanWallet() Response {
62 allAccounts, err := a.wallet.AccountMgr.ListAccounts("")
64 return NewErrorResponse(err)
67 if err := a.wallet.RecoveryMgr.AddrResurrect(allAccounts); err != nil {
68 return NewErrorResponse(err)
71 a.wallet.RescanBlocks()
72 return NewSuccessResponse(nil)
75 // WalletInfo return wallet information
76 type WalletInfo struct {
77 BestBlockHeight uint64 `json:"best_block_height"`
78 WalletHeight uint64 `json:"wallet_height"`
81 func (a *API) getWalletInfo() Response {
82 bestBlockHeight := a.chain.BestBlockHeight()
83 walletStatus := a.wallet.GetWalletStatusInfo()
85 return NewSuccessResponse(&WalletInfo{
86 BestBlockHeight: bestBlockHeight,
87 WalletHeight: walletStatus.WorkHeight,
91 func (a *API) recoveryFromRootXPubs(ctx context.Context, in struct {
92 XPubs []chainkd.XPub `json:"xpubs"`
94 if err := a.wallet.RecoveryMgr.AcctResurrect(in.XPubs); err != nil {
95 return NewErrorResponse(err)
98 a.wallet.RescanBlocks()
99 return NewSuccessResponse(nil)