|
15 | 15 | package common |
16 | 16 |
|
17 | 17 | import ( |
| 18 | + "errors" |
18 | 19 | "fmt" |
19 | 20 |
|
20 | 21 | "github.com/blinklabs-io/gouroboros/cbor" |
21 | 22 | ) |
22 | 23 |
|
| 24 | +const ( |
| 25 | + ScriptRefTypeNativeScript = 0 |
| 26 | + ScriptRefTypePlutusV1 = 1 |
| 27 | + ScriptRefTypePlutusV2 = 2 |
| 28 | + ScriptRefTypePlutusV3 = 3 |
| 29 | +) |
| 30 | + |
| 31 | +type Script interface { |
| 32 | + isScript() |
| 33 | +} |
| 34 | + |
| 35 | +type ScriptRef struct { |
| 36 | + Type uint |
| 37 | + Script Script |
| 38 | +} |
| 39 | + |
| 40 | +func (s *ScriptRef) UnmarshalCBOR(data []byte) error { |
| 41 | + // Unwrap outer CBOR tag |
| 42 | + var tmpTag cbor.Tag |
| 43 | + if _, err := cbor.Decode(data, &tmpTag); err != nil { |
| 44 | + return err |
| 45 | + } |
| 46 | + innerCbor, ok := tmpTag.Content.([]byte) |
| 47 | + if !ok { |
| 48 | + return errors.New("unexpected tag type") |
| 49 | + } |
| 50 | + // Determine script type |
| 51 | + var rawScript struct { |
| 52 | + cbor.StructAsArray |
| 53 | + Type uint |
| 54 | + Raw cbor.RawMessage |
| 55 | + } |
| 56 | + if _, err := cbor.Decode(innerCbor, &rawScript); err != nil { |
| 57 | + return err |
| 58 | + } |
| 59 | + var tmpScript Script |
| 60 | + switch rawScript.Type { |
| 61 | + case ScriptRefTypeNativeScript: |
| 62 | + tmpScript = &NativeScript{} |
| 63 | + case ScriptRefTypePlutusV1: |
| 64 | + tmpScript = &PlutusV1Script{} |
| 65 | + case ScriptRefTypePlutusV2: |
| 66 | + tmpScript = &PlutusV2Script{} |
| 67 | + case ScriptRefTypePlutusV3: |
| 68 | + tmpScript = &PlutusV3Script{} |
| 69 | + default: |
| 70 | + return fmt.Errorf("unknown script type %d", rawScript.Type) |
| 71 | + } |
| 72 | + // Decode script |
| 73 | + if _, err := cbor.Decode(rawScript.Raw, tmpScript); err != nil { |
| 74 | + return err |
| 75 | + } |
| 76 | + s.Type = rawScript.Type |
| 77 | + s.Script = tmpScript |
| 78 | + return nil |
| 79 | +} |
| 80 | + |
| 81 | +type PlutusV1Script []byte |
| 82 | + |
| 83 | +func (PlutusV1Script) isScript() {} |
| 84 | + |
| 85 | +type PlutusV2Script []byte |
| 86 | + |
| 87 | +func (PlutusV2Script) isScript() {} |
| 88 | + |
| 89 | +type PlutusV3Script []byte |
| 90 | + |
| 91 | +func (PlutusV3Script) isScript() {} |
| 92 | + |
23 | 93 | type NativeScript struct { |
24 | 94 | item any |
25 | 95 | } |
26 | 96 |
|
| 97 | +func (NativeScript) isScript() {} |
| 98 | + |
27 | 99 | func (n *NativeScript) Item() any { |
28 | 100 | return n.item |
29 | 101 | } |
|
0 commit comments