X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=wallet%2Fannotated.go;h=4bcc507d3801111fb20d25b960c3de601a15632f;hb=8da5d90ecadf13f1510dbbc4bce05645684142a2;hp=4d25ce804f31918d74bcde4d76416e1593c15bf3;hpb=089cb9074ed375e28850d2ff8b5e91164a04046d;p=bytom%2Fvapor.git diff --git a/wallet/annotated.go b/wallet/annotated.go index 4d25ce80..4bcc507d 100644 --- a/wallet/annotated.go +++ b/wallet/annotated.go @@ -16,7 +16,6 @@ import ( dbm "github.com/vapor/database/leveldb" "github.com/vapor/protocol/bc" "github.com/vapor/protocol/bc/types" - "github.com/vapor/protocol/vm/vmutil" ) // annotateTxs adds asset data to transactions @@ -138,12 +137,6 @@ func getAccountFromACP(program []byte, walletDB dbm.DB) (*account.Account, error var emptyJSONObject = json.RawMessage(`{}`) -func isValidJSON(b []byte) bool { - var v interface{} - err := json.Unmarshal(b, &v) - return err == nil -} - func (w *Wallet) buildAnnotatedTransaction(orig *types.Tx, b *types.Block, statusFail bool, indexInBlock int) *query.AnnotatedTx { tx := &query.AnnotatedTx{ ID: orig.ID, @@ -181,15 +174,26 @@ func (w *Wallet) BuildAnnotatedInput(tx *types.Tx, i uint32) *query.AnnotatedInp in.InputID = id e := tx.Entries[id] switch e := e.(type) { + case *bc.CrossChainInput: + in.Type = "cross_chain_in" + in.ControlProgram = orig.ControlProgram() + in.Address = w.getAddressFromControlProgram(in.ControlProgram, true) + in.SpentOutputID = e.MainchainOutputId + arguments := orig.Arguments() + for _, arg := range arguments { + in.WitnessArguments = append(in.WitnessArguments, arg) + } + case *bc.Spend: in.Type = "spend" in.ControlProgram = orig.ControlProgram() - in.Address = w.getAddressFromControlProgram(in.ControlProgram) + in.Address = w.getAddressFromControlProgram(in.ControlProgram, false) in.SpentOutputID = e.SpentOutputId arguments := orig.Arguments() for _, arg := range arguments { in.WitnessArguments = append(in.WitnessArguments, arg) } + case *bc.Coinbase: in.Type = "coinbase" in.Arbitrary = e.Arbitrary @@ -197,22 +201,27 @@ func (w *Wallet) BuildAnnotatedInput(tx *types.Tx, i uint32) *query.AnnotatedInp return in } -func (w *Wallet) getAddressFromControlProgram(prog []byte) string { +func (w *Wallet) getAddressFromControlProgram(prog []byte, isMainchain bool) string { + netParams := &consensus.ActiveNetParams + if isMainchain { + netParams = &consensus.MainNetParams + } + if segwit.IsP2WPKHScript(prog) { if pubHash, err := segwit.GetHashFromStandardProg(prog); err == nil { - return buildP2PKHAddress(pubHash) + return buildP2PKHAddress(pubHash, netParams) } } else if segwit.IsP2WSHScript(prog) { if scriptHash, err := segwit.GetHashFromStandardProg(prog); err == nil { - return buildP2SHAddress(scriptHash) + return buildP2SHAddress(scriptHash, netParams) } } return "" } -func buildP2PKHAddress(pubHash []byte) string { - address, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams) +func buildP2PKHAddress(pubHash []byte, netParams *consensus.Params) string { + address, err := common.NewAddressWitnessPubKeyHash(pubHash, netParams) if err != nil { return "" } @@ -220,8 +229,8 @@ func buildP2PKHAddress(pubHash []byte) string { return address.EncodeAddress() } -func buildP2SHAddress(scriptHash []byte) string { - address, err := common.NewAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams) +func buildP2SHAddress(scriptHash []byte, netParams *consensus.Params) string { + address, err := common.NewAddressWitnessScriptHash(scriptHash, netParams) if err != nil { return "" } @@ -240,13 +249,24 @@ func (w *Wallet) BuildAnnotatedOutput(tx *types.Tx, idx int) *query.AnnotatedOut AssetDefinition: &emptyJSONObject, Amount: orig.AssetAmount().Amount, ControlProgram: orig.ControlProgram(), - Address: w.getAddressFromControlProgram(orig.ControlProgram()), } - if vmutil.IsUnspendable(out.ControlProgram) { - out.Type = "retire" - } else { + var isMainchainAddress bool + switch e := tx.Entries[*outid].(type) { + case *bc.IntraChainOutput: out.Type = "control" + isMainchainAddress = false + + case *bc.CrossChainOutput: + out.Type = "cross_chain_out" + isMainchainAddress = true + + case *bc.VoteOutput: + out.Type = "vote" + out.Vote = e.Vote + isMainchainAddress = false } + + out.Address = w.getAddressFromControlProgram(orig.ControlProgram(), isMainchainAddress) return out }