/
contract_life_cycle_service.go
148 lines (134 loc) · 5.46 KB
/
contract_life_cycle_service.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package contractlifecycle
import (
"fmt"
"github.com/FISCO-BCOS/go-sdk/abi/bind"
"github.com/FISCO-BCOS/go-sdk/client"
"github.com/FISCO-BCOS/go-sdk/core/types"
"github.com/FISCO-BCOS/go-sdk/precompiled"
"github.com/ethereum/go-ethereum/common"
)
// ChainGovernance precompiled contract error code
const (
invalidNoAuthorized = -51905
invalidContractNotExist = -51904
invalidContractAddress = -51903
invalidContractRepeatAuthorization = -51902
invalidContractAvailable = -51901
invalidContractFrozen = -51900
)
// getErrorMessage returns the message of error code
func getErrorMessage(errorCode int64) string {
var message string
switch errorCode {
case invalidNoAuthorized:
message = "invalid no authorized"
case invalidContractNotExist:
message = "invalid contract not exist"
case invalidContractAddress:
message = "invalid contract address"
case invalidContractRepeatAuthorization:
message = "invalid contract repeat authorization"
case invalidContractAvailable:
message = "invalid contract available"
case invalidContractFrozen:
message = "invalid contract frozen"
default:
message = ""
}
return message
}
// errorCodeToError judges whether the error code represents an error
func errorCodeToError(errorCode int64) error {
var errorCodeMessage string
errorCodeMessage = precompiled.GetCommonErrorCodeMessage(errorCode)
if errorCodeMessage != "" {
return fmt.Errorf("error code: %v, error code message: %v", errorCode, errorCodeMessage)
}
errorCodeMessage = getErrorMessage(errorCode)
if errorCodeMessage != "" {
return fmt.Errorf("error code: %v, error code message: %v", errorCode, errorCodeMessage)
}
return nil
}
// Service is a precompile contract service.
type Service struct {
contractLifeCycle *ContractLifeCycle
contractLifeCycleAuth *bind.TransactOpts
client *client.Client
}
// contractLifeCyclePrecompileAddress is the contract address of ContractLifeCycle
var contractLifeCyclePrecompileAddress = common.HexToAddress("0x0000000000000000000000000000000000001007")
// NewService returns ptr of Service
func NewService(client *client.Client) (*Service, error) {
instance, err := NewContractLifeCycle(contractLifeCyclePrecompileAddress, client)
if err != nil {
return nil, fmt.Errorf("construct Service failed, err: %+v", err)
}
auth := client.GetTransactOpts()
return &Service{instance, auth, client}, nil
}
// Freeze freezes contract address
func (service *Service) Freeze(contractAddress common.Address) (int64, error) {
_, receipt, err := service.contractLifeCycle.Freeze(service.contractLifeCycleAuth, contractAddress)
if err != nil {
return precompiled.DefaultErrorCode, fmt.Errorf("ContractLifeCycleService Freeze failed, err: %v", err)
}
return parseReturnValue(receipt, "freeze")
}
// Unfreeze unfreezes contract address
func (service *Service) Unfreeze(contractAddress common.Address) (int64, error) {
_, receipt, err := service.contractLifeCycle.Unfreeze(service.contractLifeCycleAuth, contractAddress)
if err != nil {
return precompiled.DefaultErrorCode, fmt.Errorf("ContractLifeCycleService Unfreeze failed, err: %v", err)
}
return parseReturnValue(receipt, "unfreeze")
}
// GrantManager grants manager
func (service *Service) GrantManager(contractAddress, accountAddress common.Address) (int64, error) {
_, receipt, err := service.contractLifeCycle.GrantManager(service.contractLifeCycleAuth, contractAddress, accountAddress)
if err != nil {
return precompiled.DefaultErrorCode, fmt.Errorf("ContractLifeCycleService GrantManager failed, err: %v", err)
}
return parseReturnValue(receipt, "grantManager")
}
// GetStatus gets the status of contract account
func (service *Service) GetStatus(contractAddress common.Address) (uint64, string, error) {
opts := &bind.CallOpts{From: service.contractLifeCycleAuth.From}
bigNum, message, err := service.contractLifeCycle.GetStatus(opts, contractAddress)
if err != nil {
return types.PrecompiledError, "", fmt.Errorf("ContractLifeCycleService GetStatus failed, err: %v", err)
}
num, err := precompiled.BigIntToUint64(bigNum)
if err != nil {
return types.PrecompiledError, "", fmt.Errorf("ContractLifeCycleService GetStatus failed, err: %v", err)
}
return num, message, nil
}
// ListManager lists managers of contract
func (service *Service) ListManager(contractAddress common.Address) (uint64, []common.Address, error) {
opts := &bind.CallOpts{From: service.contractLifeCycleAuth.From}
bigNum, managerAddressList, err := service.contractLifeCycle.ListManager(opts, contractAddress)
if err != nil {
return types.PrecompiledError, nil, fmt.Errorf("ContractLifeCycleService ListManager failed, err: %v", err)
}
num, err := precompiled.BigIntToUint64(bigNum)
if err != nil {
return types.PrecompiledError, nil, fmt.Errorf("ContractLifeCycleService GetStatus failed, err: %v", err)
}
return num, managerAddressList, nil
}
func parseReturnValue(receipt *types.Receipt, name string) (int64, error) {
errorMessage := receipt.GetErrorMessage()
if errorMessage != "" {
return int64(receipt.GetStatus()), fmt.Errorf("receipt.Status err: %v", errorMessage)
}
bigNum, err := precompiled.ParseBigIntFromOutput(receipt)
if err != nil {
return precompiled.DefaultErrorCode, fmt.Errorf("parseReturnValue failed, err: %v", err)
}
errorCode, err := precompiled.BigIntToInt64(bigNum)
if err != nil {
return precompiled.DefaultErrorCode, fmt.Errorf("parseReturnValue failed, err: %v", err)
}
return errorCode, errorCodeToError(errorCode)
}