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
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,
in.InputID = id
e := tx.Entries[id]
switch e := e.(type) {
+ case *bc.VetoInput:
+ in.Type = "veto"
+ in.ControlProgram = orig.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.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
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 ""
}
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 ""
}
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
}