--- /dev/null
+package segwit
+
+import (
+ "errors"
+
+ "github.com/vapor/consensus"
+ "github.com/vapor/protocol/vm"
+ "github.com/vapor/protocol/vm/vmutil"
+)
+
+func IsP2WScript(prog []byte) bool {
+ return IsP2WPKHScript(prog) || IsP2WSHScript(prog) || IsStraightforward(prog)
+}
+
+func IsStraightforward(prog []byte) bool {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return false
+ }
+ if len(insts) != 1 {
+ return false
+ }
+ return insts[0].Op == vm.OP_TRUE || insts[0].Op == vm.OP_FAIL
+}
+
+func IsP2WPKHScript(prog []byte) bool {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return false
+ }
+ if len(insts) != 2 {
+ return false
+ }
+ if insts[0].Op > vm.OP_16 {
+ return false
+ }
+ return insts[1].Op == vm.OP_DATA_20 && len(insts[1].Data) == consensus.PayToWitnessPubKeyHashDataSize
+}
+
+func IsP2WSHScript(prog []byte) bool {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return false
+ }
+ if len(insts) != 2 {
+ return false
+ }
+ if insts[0].Op > vm.OP_16 {
+ return false
+ }
+ return insts[1].Op == vm.OP_DATA_32 && len(insts[1].Data) == consensus.PayToWitnessScriptHashDataSize
+}
+
+func ConvertP2PKHSigProgram(prog []byte) ([]byte, error) {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return nil, err
+ }
+ if insts[0].Op == vm.OP_0 {
+ return vmutil.P2PKHSigProgram(insts[1].Data)
+ }
+ return nil, errors.New("unknow P2PKH version number")
+}
+
+func ConvertP2SHProgram(prog []byte) ([]byte, error) {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return nil, err
+ }
+ if insts[0].Op == vm.OP_0 {
+ return vmutil.P2SHProgram(insts[1].Data)
+ }
+ return nil, errors.New("unknow P2SHP version number")
+}
+
+func GetHashFromStandardProg(prog []byte) ([]byte, error) {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return nil, err
+ }
+
+ return insts[1].Data, nil
+}