117 lines
3.9 KiB
Go
117 lines
3.9 KiB
Go
package contracts
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
appchainMgr "github.com/meshplus/bitxhub-core/appchain-mgr"
|
|
|
|
"github.com/meshplus/bitxhub-model/pb"
|
|
"github.com/meshplus/bitxhub/internal/constant"
|
|
"github.com/meshplus/bitxhub/pkg/vm/boltvm"
|
|
)
|
|
|
|
type AppchainManager struct {
|
|
boltvm.Stub
|
|
appchainMgr.AppchainManager
|
|
}
|
|
|
|
// Register appchain managers registers appchain info caller is the appchain
|
|
// manager address return appchain id and error
|
|
func (am *AppchainManager) Register(validators string, consensusType int32, chainType, name, desc, version, pubkey string) *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
res := am.CrossInvoke(constant.InterchainContractAddr.String(), "Register")
|
|
if !res.Ok {
|
|
return res
|
|
}
|
|
return responseWrapper(am.AppchainManager.Register(validators, consensusType, chainType, name, desc, version, pubkey))
|
|
}
|
|
|
|
// UpdateAppchain updates approved appchain
|
|
func (am *AppchainManager) UpdateAppchain(validators string, consensusType int32, chainType, name, desc, version, pubkey string) *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
return responseWrapper(am.AppchainManager.UpdateAppchain(validators, consensusType, chainType, name, desc, version, pubkey))
|
|
}
|
|
|
|
//FetchAuditRecords fetches audit records by appchain id
|
|
func (am *AppchainManager) FetchAuditRecords(id string) *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
return responseWrapper(am.AppchainManager.FetchAuditRecords(id))
|
|
}
|
|
|
|
// CountApprovedAppchains counts all approved appchains
|
|
func (am *AppchainManager) CountApprovedAppchains() *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
return responseWrapper(am.AppchainManager.CountApprovedAppchains())
|
|
}
|
|
|
|
// CountAppchains counts all appchains including approved, rejected or registered
|
|
func (am *AppchainManager) CountAppchains() *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
return responseWrapper(am.AppchainManager.CountAppchains())
|
|
}
|
|
|
|
// Appchains returns all appchains
|
|
func (am *AppchainManager) Appchains() *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
return responseWrapper(am.AppchainManager.Appchains())
|
|
}
|
|
|
|
// Appchain returns appchain info
|
|
func (am *AppchainManager) Appchain() *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
return responseWrapper(am.AppchainManager.Appchain())
|
|
}
|
|
|
|
func (am *AppchainManager) GetAppchain(id string) *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
return responseWrapper(am.AppchainManager.GetAppchain(id))
|
|
}
|
|
|
|
// GetPubKeyByChainID can get aim chain's public key using aim chain ID
|
|
func (am *AppchainManager) GetPubKeyByChainID(id string) *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
return responseWrapper(am.AppchainManager.GetPubKeyByChainID(id))
|
|
}
|
|
|
|
// Audit bitxhub manager audit appchain register info
|
|
func (am *AppchainManager) Audit(proposer string, isApproved int32, desc string) *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
if res := am.IsAdmin(); !res.Ok {
|
|
return res
|
|
}
|
|
return responseWrapper(am.AppchainManager.Audit(proposer, isApproved, desc))
|
|
}
|
|
|
|
func (am *AppchainManager) DeleteAppchain(cid string) *boltvm.Response {
|
|
am.AppchainManager.Persister = am.Stub
|
|
if res := am.IsAdmin(); !res.Ok {
|
|
return res
|
|
}
|
|
res := am.CrossInvoke(constant.InterchainContractAddr.String(), "DeleteInterchain", pb.String(cid))
|
|
if !res.Ok {
|
|
return res
|
|
}
|
|
return responseWrapper(am.AppchainManager.DeleteAppchain(cid))
|
|
}
|
|
|
|
func (am *AppchainManager) IsAdmin() *boltvm.Response {
|
|
ret := am.CrossInvoke(constant.RoleContractAddr.String(), "IsAdmin", pb.String(am.Caller()))
|
|
is, err := strconv.ParseBool(string(ret.Result))
|
|
if err != nil {
|
|
return boltvm.Error(fmt.Errorf("judge caller type: %w", err).Error())
|
|
}
|
|
|
|
if !is {
|
|
return boltvm.Error("caller is not an admin account")
|
|
}
|
|
return boltvm.Success([]byte("1"))
|
|
}
|
|
|
|
func responseWrapper(ok bool, data []byte) *boltvm.Response {
|
|
if ok {
|
|
return boltvm.Success(data)
|
|
}
|
|
return boltvm.Error(string(data))
|
|
}
|