6 "github.com/vapor/common"
7 "github.com/vapor/consensus"
8 "github.com/vapor/consensus/segwit"
9 "github.com/vapor/protocol/vm/vmutil"
12 func GetAddressFromControlProgram(prog []byte) string {
13 if segwit.IsP2WPKHScript(prog) {
14 if pubHash, err := segwit.GetHashFromStandardProg(prog); err == nil {
15 return buildP2PKHAddress(pubHash)
17 } else if segwit.IsP2WSHScript(prog) {
18 if scriptHash, err := segwit.GetHashFromStandardProg(prog); err == nil {
19 return buildP2SHAddress(scriptHash)
26 func buildP2PKHAddress(pubHash []byte) string {
27 address, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams)
32 return address.EncodeAddress()
35 func buildP2SHAddress(scriptHash []byte) string {
36 address, err := common.NewAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
41 return address.EncodeAddress()
44 func GetControlProgramFromAddress(address string) ([]byte, error) {
45 decodeaddress, err := common.DecodeAddress(address, &consensus.ActiveNetParams)
50 redeemContract := decodeaddress.ScriptAddress()
52 switch decodeaddress.(type) {
53 case *common.AddressWitnessPubKeyHash:
54 program, err = vmutil.P2WPKHProgram(redeemContract)
55 case *common.AddressWitnessScriptHash:
56 program, err = vmutil.P2WSHProgram(redeemContract)
58 return nil, errors.New("Invalid address")