OSDN Git Service

Voter reward (#344)
[bytom/vapor.git] / toolbar / common / address.go
1 package common
2
3 import (
4         "errors"
5
6         "github.com/vapor/common"
7         "github.com/vapor/consensus"
8         "github.com/vapor/consensus/segwit"
9         "github.com/vapor/protocol/vm/vmutil"
10 )
11
12 func GetAddressFromControlProgram(prog []byte) string {
13         if segwit.IsP2WPKHScript(prog) {
14                 if pubHash, err := segwit.GetHashFromStandardProg(prog); err == nil {
15                         return buildP2PKHAddress(pubHash)
16                 }
17         } else if segwit.IsP2WSHScript(prog) {
18                 if scriptHash, err := segwit.GetHashFromStandardProg(prog); err == nil {
19                         return buildP2SHAddress(scriptHash)
20                 }
21         }
22
23         return ""
24 }
25
26 func buildP2PKHAddress(pubHash []byte) string {
27         address, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams)
28         if err != nil {
29                 return ""
30         }
31
32         return address.EncodeAddress()
33 }
34
35 func buildP2SHAddress(scriptHash []byte) string {
36         address, err := common.NewAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
37         if err != nil {
38                 return ""
39         }
40
41         return address.EncodeAddress()
42 }
43
44 func GetControlProgramFromAddress(address string) ([]byte, error) {
45         decodeaddress, err := common.DecodeAddress(address, &consensus.ActiveNetParams)
46         if err != nil {
47                 return nil, err
48         }
49
50         redeemContract := decodeaddress.ScriptAddress()
51         program := []byte{}
52         switch decodeaddress.(type) {
53         case *common.AddressWitnessPubKeyHash:
54                 program, err = vmutil.P2WPKHProgram(redeemContract)
55         case *common.AddressWitnessScriptHash:
56                 program, err = vmutil.P2WSHProgram(redeemContract)
57         default:
58                 return nil, errors.New("Invalid address")
59         }
60         if err != nil {
61                 return nil, err
62         }
63         return program, nil
64 }