/
types.go
143 lines (127 loc) · 4.9 KB
/
types.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
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package types
import (
"encoding/json"
"reflect"
log "github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/types"
)
var tokenlog = log.New("module", "execs.token.types")
func init() {
types.AllowUserExec = append(types.AllowUserExec, []byte(TokenX))
types.RegFork(TokenX, InitFork)
types.RegExec(TokenX, InitExecutor)
}
//InitFork ...
func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(TokenX, "Enable", 100899)
cfg.RegisterDappFork(TokenX, ForkTokenBlackListX, 190000)
cfg.RegisterDappFork(TokenX, ForkBadTokenSymbolX, 184000)
cfg.RegisterDappFork(TokenX, ForkTokenPriceX, 560000)
cfg.RegisterDappFork(TokenX, ForkTokenSymbolWithNumberX, 1298600)
cfg.RegisterDappFork(TokenX, ForkTokenCheckX, 1600000)
}
//InitExecutor ...
func InitExecutor(cfg *types.Chain33Config) {
types.RegistorExecutor(TokenX, NewType(cfg))
}
// TokenType 执行器基类结构体
type TokenType struct {
types.ExecTypeBase
}
// NewType 创建执行器类型
func NewType(cfg *types.Chain33Config) *TokenType {
c := &TokenType{}
c.SetChild(c)
c.SetConfig(cfg)
return c
}
// GetName 获取执行器名称
func (t *TokenType) GetName() string {
return TokenX
}
// GetPayload 获取token action
func (t *TokenType) GetPayload() types.Message {
return &TokenAction{}
}
// GetTypeMap 根据action的name获取type
func (t *TokenType) GetTypeMap() map[string]int32 {
return map[string]int32{
"Transfer": ActionTransfer,
"Genesis": ActionGenesis,
"Withdraw": ActionWithdraw,
"TokenPreCreate": TokenActionPreCreate,
"TokenFinishCreate": TokenActionFinishCreate,
"TokenRevokeCreate": TokenActionRevokeCreate,
"TransferToExec": TokenActionTransferToExec,
"TokenMint": TokenActionMint,
"TokenBurn": TokenActionBurn,
}
}
// GetLogMap 获取log的映射对应关系
func (t *TokenType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{
TyLogTokenTransfer: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogTokenTransfer"},
TyLogTokenDeposit: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogTokenDeposit"},
TyLogTokenExecTransfer: {Ty: reflect.TypeOf(types.ReceiptExecAccountTransfer{}), Name: "LogTokenExecTransfer"},
TyLogTokenExecWithdraw: {Ty: reflect.TypeOf(types.ReceiptExecAccountTransfer{}), Name: "LogTokenExecWithdraw"},
TyLogTokenExecDeposit: {Ty: reflect.TypeOf(types.ReceiptExecAccountTransfer{}), Name: "LogTokenExecDeposit"},
TyLogTokenExecFrozen: {Ty: reflect.TypeOf(types.ReceiptExecAccountTransfer{}), Name: "LogTokenExecFrozen"},
TyLogTokenExecActive: {Ty: reflect.TypeOf(types.ReceiptExecAccountTransfer{}), Name: "LogTokenExecActive"},
TyLogTokenGenesisTransfer: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogTokenGenesisTransfer"},
TyLogTokenGenesisDeposit: {Ty: reflect.TypeOf(types.ReceiptExecAccountTransfer{}), Name: "LogTokenGenesisDeposit"},
TyLogPreCreateToken: {Ty: reflect.TypeOf(ReceiptToken{}), Name: "LogPreCreateToken"},
TyLogFinishCreateToken: {Ty: reflect.TypeOf(ReceiptToken{}), Name: "LogFinishCreateToken"},
TyLogRevokeCreateToken: {Ty: reflect.TypeOf(ReceiptToken{}), Name: "LogRevokeCreateToken"},
TyLogTokenMint: {Ty: reflect.TypeOf(ReceiptTokenAmount{}), Name: "LogMintToken"},
TyLogTokenBurn: {Ty: reflect.TypeOf(ReceiptTokenAmount{}), Name: "LogBurnToken"},
}
}
// RPC_Default_Process rpc 默认处理
func (t *TokenType) RPC_Default_Process(action string, msg interface{}) (*types.Transaction, error) {
var create *types.CreateTx
if _, ok := msg.(*types.CreateTx); !ok {
return nil, types.ErrInvalidParam
}
create = msg.(*types.CreateTx)
if !create.IsToken {
return nil, types.ErrNotSupport
}
tx, err := t.AssertCreate(create)
if err != nil {
return nil, err
}
//to地址的问题,如果是主链交易,to地址就是直接是设置to
cfg := t.GetConfig()
if !cfg.IsPara() {
tx.To = create.To
}
return tx, err
}
// CreateTx token 创建合约
func (t *TokenType) CreateTx(action string, msg json.RawMessage) (*types.Transaction, error) {
tx, err := t.ExecTypeBase.CreateTx(action, msg)
if err != nil {
tokenlog.Error("token CreateTx failed", "err", err, "action", action, "msg", string(msg))
return nil, err
}
cfg := t.GetConfig()
if !cfg.IsPara() {
var transfer TokenAction
err = types.Decode(tx.Payload, &transfer)
if err != nil {
tokenlog.Error("token CreateTx failed", "decode payload err", err, "action", action, "msg", string(msg))
return nil, err
}
if action == "Transfer" {
tx.To = transfer.GetTransfer().To
} else if action == "Withdraw" {
tx.To = transfer.GetWithdraw().To
} else if action == "TransferToExec" {
tx.To = transfer.GetTransferToExec().To
}
}
return tx, nil
}