// errors
var (
- ErrFindAccount = errors.New("Failed to find account")
- errAccntTxIDNotFound = errors.New("account TXID not found")
+ // ErrFindAccount = errors.New("Failed to find account")
+ errAccntTxIDNotFound = errors.New("account TXID not found")
+ errGetAssetDefinition = errors.New("Failed to find asset definition")
)
func accountIndexKey(xpubs []chainkd.XPub) []byte {
}
// GetAssetDefinition get asset definition by assetiD
-func (store *WalletStore) GetAssetDefinition(assetID *bc.AssetID) []byte {
- return store.walletDB.Get(asset.ExtAssetKey(assetID))
+func (store *WalletStore) GetAssetDefinition(assetID *bc.AssetID) (*asset.Asset, error) {
+ definitionByte := store.walletDB.Get(asset.ExtAssetKey(assetID))
+ if definitionByte == nil {
+ return nil, errGetAssetDefinition
+ }
+ definitionMap := make(map[string]interface{})
+ if err := json.Unmarshal(definitionByte, &definitionMap); err != nil {
+ return nil, err
+ }
+ alias := assetID.String()
+ externalAsset := &asset.Asset{
+ AssetID: *assetID,
+ Alias: &alias,
+ DefinitionMap: definitionMap,
+ RawDefinitionByte: definitionByte,
+ }
+ return externalAsset, nil
}
// SetAssetDefinition set assetID and definition
}
func (w *Wallet) getExternalDefinition(assetID *bc.AssetID) json.RawMessage {
- definitionByte := w.store.GetAssetDefinition(assetID)
- if definitionByte == nil {
- return nil
+ externalAsset, err := w.store.GetAssetDefinition(assetID)
+ if err != nil {
+ log.WithFields(log.Fields{"module": logModule, "err": err}).Warning("fail on get asset definition.")
}
-
- definitionMap := make(map[string]interface{})
- if err := json.Unmarshal(definitionByte, &definitionMap); err != nil {
+ if externalAsset == nil {
return nil
}
- alias := assetID.String()
- externalAsset := &asset.Asset{
- AssetID: *assetID,
- Alias: &alias,
- DefinitionMap: definitionMap,
- RawDefinitionByte: definitionByte,
- }
-
- if err := w.AssetReg.SaveAsset(externalAsset, alias); err != nil {
- log.WithFields(log.Fields{"module": logModule, "err": err, "assetID": alias}).Warning("fail on save external asset to internal asset DB")
+ if err := w.AssetReg.SaveAsset(externalAsset, *externalAsset.Alias); err != nil {
+ log.WithFields(log.Fields{"module": logModule, "err": err, "assetAlias": *externalAsset.Alias}).Warning("fail on save external asset to internal asset DB")
}
- return definitionByte
+ return json.RawMessage(externalAsset.RawDefinitionByte)
}
func (w *Wallet) getAliasDefinition(assetID bc.AssetID) (string, json.RawMessage) {
// saveExternalAssetDefinition save external and local assets definition,
// when query ,query local first and if have no then query external
// details see getAliasDefinition
-func saveExternalAssetDefinition(b *types.Block, store WalletStorer) {
+func saveExternalAssetDefinition(b *types.Block, store WalletStorer) error {
store.InitBatch()
defer store.CommitBatch()
for _, orig := range tx.Inputs {
if cci, ok := orig.TypedInput.(*types.CrossChainInput); ok {
assetID := cci.AssetId
- if assetExist := store.GetAssetDefinition(assetID); assetExist == nil {
+ assetExist, err := store.GetAssetDefinition(assetID)
+ if err != nil {
+ return err
+ }
+ if assetExist == nil {
store.SetAssetDefinition(assetID, cci.AssetDefinition)
}
}
}
}
+ return nil
}
// Summary is the struct of transaction's input and output summary
package wallet
import (
+ "github.com/vapor/asset"
"github.com/vapor/blockchain/query"
"github.com/vapor/common"
"github.com/vapor/protocol/bc"
type WalletStorer interface {
InitBatch()
CommitBatch()
- GetAssetDefinition(*bc.AssetID) []byte
+ GetAssetDefinition(*bc.AssetID) (*asset.Asset, error)
SetAssetDefinition(*bc.AssetID, []byte)
GetRawProgram(common.Hash) []byte
GetAccountByAccountID(string) []byte
DeleteRecoveryStatus([]byte)
GetRecoveryStatus([]byte) []byte
}
-
}
annotatedTxs := w.filterAccountTxs(block, txStatus)
- saveExternalAssetDefinition(block, w.store)
+ if err := saveExternalAssetDefinition(block, w.store); err != nil {
+ return err
+ }
annotateTxsAccount(annotatedTxs, w.store)
w.store.InitBatch()