-
Notifications
You must be signed in to change notification settings - Fork 0
/
contract.go
91 lines (71 loc) · 1.99 KB
/
contract.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package ergo
/*
#include "ergo.h"
*/
import "C"
import (
"runtime"
"unsafe"
)
// Contract defines the contract(script) that will be guarding box contents
type Contract interface {
// Tree returns the ergo Tree of the Contract
Tree() Tree
// Equals checks if provided Contract is same
Equals(contract Contract) bool
pointer() C.ContractPtr
}
type contract struct {
p C.ContractPtr
}
func newContract(c *contract) Contract {
runtime.SetFinalizer(c, finalizeContract)
return c
}
// NewContractFromTree creates a new Contract from ergo Tree
func NewContractFromTree(ergoTree Tree) Contract {
var p C.ContractPtr
C.ergo_lib_contract_new(ergoTree.pointer(), &p)
c := &contract{p: p}
return newContract(c)
}
// NewContractCompileFromString compiles a contract from ErgoScript source code
func NewContractCompileFromString(compileFromString string) (Contract, error) {
contractStr := C.CString(compileFromString)
defer C.free(unsafe.Pointer(contractStr))
var p C.ContractPtr
errPtr := C.ergo_lib_contract_compile(contractStr, &p)
err := newError(errPtr)
if err.isError() {
return nil, err.error()
}
c := &contract{p: p}
return newContract(c), nil
}
// NewContractPayToAddress creates a new Contract that allows spending of the guarded box by a given recipient (Address)
func NewContractPayToAddress(payToAddress Address) (Contract, error) {
var p C.ContractPtr
errPtr := C.ergo_lib_contract_pay_to_address(payToAddress.pointer(), &p)
err := newError(errPtr)
if err.isError() {
return nil, err.error()
}
c := &contract{p: p}
return newContract(c), nil
}
func (c *contract) Tree() Tree {
var ergoTreePtr C.ErgoTreePtr
C.ergo_lib_contract_ergo_tree(c.p, &ergoTreePtr)
newErgoTree := &tree{p: ergoTreePtr}
return newTree(newErgoTree)
}
func (c *contract) Equals(contract Contract) bool {
res := C.ergo_lib_contract_eq(c.p, contract.pointer())
return bool(res)
}
func (c *contract) pointer() C.ContractPtr {
return c.p
}
func finalizeContract(c *contract) {
C.ergo_lib_contract_delete(c.p)
}