Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
f9d4465d
Commit
f9d4465d
authored
Oct 19, 2018
by
任硕
Committed by
linj
Nov 26, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
unfreeze exec
parent
9b25d121
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
149 additions
and
81 deletions
+149
-81
action.go
executor/action.go
+122
-65
query.go
executor/query.go
+1
-1
unfreeze.proto
proto/unfreeze.proto
+23
-12
types.go
types/types.go
+3
-3
unfreeze.pb.go
types/unfreeze.pb.go
+0
-0
No files found.
executor/action.go
View file @
f9d4465d
...
...
@@ -2,8 +2,9 @@ package executor
import
(
"time"
"gitlab.33.cn/chain33/chain33/account"
"gitlab.33.cn/chain33/chain33/common"
dbm
"gitlab.33.cn/chain33/chain33/common/db"
uf
"gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types"
"gitlab.33.cn/chain33/chain33/system/dapp"
...
...
@@ -30,21 +31,21 @@ func newAction(u *Unfreeze, tx *types.Transaction, index int32) *action {
//创建解冻交易
func
(
a
*
action
)
UnfreezeCreate
(
create
*
uf
.
UnfreezeCreate
)
(
*
types
.
Receipt
,
error
)
{
/*
*参数检测
*时间等
*/
if
create
.
GetStartTime
()
<=
time
.
Unix
()
//构造ID - txHash
var
unfreezeID
string
=
a
.
txhash
receipt
,
err
:=
a
.
coinsAccount
.
TransferToExec
(
a
.
fromaddr
,
a
.
execaddr
,
create
.
TotalCount
)
var
unfreezeID
string
=
"unfreezeID_"
+
common
.
ToHex
(
a
.
txhash
)
tokenAccDB
,
err
:=
account
.
NewAccountDB
(
"token"
,
create
.
TokenName
,
a
.
db
)
if
err
!=
nil
{
return
nil
,
err
}
receipt
,
err
:=
tokenAccDB
.
ExecFrozen
(
a
.
fromaddr
,
a
.
execaddr
,
create
.
TotalCount
)
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze create "
,
"addr"
,
a
.
fromaddr
,
"execaddr"
,
a
.
execaddr
,
"ExecFrozen amount"
,
create
.
TotalCount
)
return
nil
,
err
}
var
logs
[]
*
types
.
ReceiptLog
var
kv
[]
*
types
.
KeyValue
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
unfreeze
:=
&
uf
.
Unfreeze
{
UnfreezeID
:
unfreezeID
,
StartTime
:
create
.
StartTime
,
...
...
@@ -57,30 +58,17 @@ func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, erro
Amount
:
create
.
Amount
,
}
a
.
saveStateDB
(
unfreeze
)
var
logs
[]
*
types
.
ReceiptLog
var
kv
[]
*
types
.
KeyValue
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
receiptLog
:=
a
.
getReceiptLog
(
unfreeze
)
//TODO 修改receiptLog
k
:=
[]
byte
(
unfreezeID
)
v
:=
types
.
Encode
(
unfreeze
)
kv
=
append
(
kv
,
&
types
.
KeyValue
{
k
,
v
})
receiptLog
:=
a
.
getCreateLog
(
unfreeze
)
logs
=
append
(
logs
,
receiptLog
)
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
}
//提取解冻币
func
(
a
*
action
)
UnfreezeWithdraw
(
withdraw
*
uf
.
UnfreezeWithdraw
)
(
*
types
.
Receipt
,
error
)
{
//TODO pseudocode
/*
*参数检测
*检测该地址是否存在对应解冻交易ID
*/
/*
*从合约转币到该地址(收币地址)
*/
value
,
err
:=
a
.
db
.
Get
(
key
(
withdraw
.
GetUnfreezeID
()))
value
,
err
:=
a
.
db
.
Get
(
key
(
withdraw
.
UnfreezeID
))
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
...
...
@@ -91,58 +79,109 @@ func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
}
/*
*检测可取款状态(时间)
*计算可取款额
*计算取款次数增加量
*/
var
amount
int64
var
withdrawTimes
int32
var
logs
[]
*
types
.
ReceiptLog
var
kv
[]
*
types
.
KeyValue
currentTime
:=
time
.
Now
()
.
Unix
()
expectTimes
:=
(
currentTime
+
unfreeze
.
Period
-
unfreeze
.
StartTime
)
/
unfreeze
.
Period
reaTimes
:=
expectTimes
-
int64
(
unfreeze
.
WithdrawTimes
)
if
reaTimes
<=
0
{
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeBeforeDue
)
return
nil
,
types
.
ErrUnfreezeBeforeDue
}
if
unfreeze
.
Remaining
<=
0
{
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeEmptied
)
return
nil
,
types
.
ErrUnfreezeEmptied
}
receipt
,
err
:=
a
.
coinsAccount
.
ExecTransferFrozen
(
unfreeze
.
Initiator
,
unfreeze
.
Beneficiary
,
a
.
execaddr
,
amount
)
var
available
int64
switch
unfreeze
.
Means
{
case
1
:
// 百分比
for
i
:=
int64
(
0
);
i
<
reaTimes
;
i
++
{
if
tmp
:=
unfreeze
.
Remaining
*
unfreeze
.
Amount
/
10000
;
tmp
==
0
{
available
=
unfreeze
.
Remaining
break
}
else
{
available
+=
tmp
}
}
case
2
:
// 固额
for
i
:=
int64
(
0
);
i
<
reaTimes
;
i
++
{
if
unfreeze
.
Remaining
<=
unfreeze
.
Amount
{
available
=
unfreeze
.
Remaining
break
}
available
+=
unfreeze
.
Amount
}
default
:
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeMeans
)
return
nil
,
types
.
ErrUnfreezeMeans
}
tokenAccDB
,
err
:=
account
.
NewAccountDB
(
"token"
,
unfreeze
.
TokenName
,
a
.
db
)
if
err
!=
nil
{
return
nil
,
err
}
receipt
,
err
:=
tokenAccDB
.
ExecTransferFrozen
(
unfreeze
.
Initiator
,
a
.
fromaddr
,
a
.
execaddr
,
available
)
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
}
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
unfreeze
.
WithdrawTimes
+=
withdrawTimes
unfreeze
.
WithdrawTimes
+=
int32
(
reaTimes
)
unfreeze
.
Remaining
-=
available
a
.
saveStateDB
(
&
unfreeze
)
receiptLog
:=
a
.
getWithdrawLog
(
&
unfreeze
)
logs
=
append
(
logs
,
receiptLog
)
k
:=
[]
byte
(
withdraw
.
UnfreezeID
)
v
:=
types
.
Encode
(
&
unfreeze
)
kv
=
append
(
kv
,
&
types
.
KeyValue
{
k
,
v
})
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
}
//中止定期解冻
func
(
a
*
action
)
UnfreezeTerminate
(
terminate
*
uf
.
UnfreezeTerminate
)
(
*
types
.
Receipt
,
error
)
{
//TODO pseudocode
/*
*参数检测
*检测该地址是否存在对应解冻交易ID
*/
/*
*从合约转币到该地址(发币地址)
*/
//计算合约中剩余币数
var
remain
int64
//获取发币地址
var
senderAddr
string
receipt
,
err
:=
a
.
coinsAccount
.
ExecActive
(
senderAddr
,
a
.
execaddr
,
remain
)
value
,
err
:=
a
.
db
.
Get
(
key
(
terminate
.
UnfreezeID
))
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze terminate "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
}
var
unfreeze
uf
.
Unfreeze
err
=
types
.
Decode
(
value
,
&
unfreeze
)
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze terminate "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
}
if
a
.
fromaddr
!=
unfreeze
.
Initiator
{
uflog
.
Error
(
"unfreeze terminate "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeID
)
return
nil
,
types
.
ErrUnfreezeID
}
if
unfreeze
.
Remaining
<=
0
{
uflog
.
Error
(
"unfreeze terminate "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeEmptied
)
return
nil
,
types
.
ErrUnfreezeEmptied
}
tokenAccDB
,
err
:=
account
.
NewAccountDB
(
"token"
,
unfreeze
.
TokenName
,
a
.
db
)
if
err
!=
nil
{
return
nil
,
err
}
receipt
,
err
:=
tokenAccDB
.
ExecActive
(
unfreeze
.
Initiator
,
a
.
execaddr
,
unfreeze
.
Remaining
)
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze terminate "
,
"addr"
,
senderAdd
r
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
uflog
.
Error
(
"unfreeze terminate "
,
"addr"
,
unfreeze
.
Initiato
r
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
}
var
logs
[]
*
types
.
ReceiptLog
var
kv
[]
*
types
.
KeyValue
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
/*修改receipt
*修改数据库中状态
*/
unfreeze
.
Remaining
=
0
a
.
saveStateDB
(
&
unfreeze
)
receiptLog
:=
a
.
getTerminateLog
(
&
unfreeze
)
logs
=
append
(
logs
,
receiptLog
)
k
:=
[]
byte
(
terminate
.
UnfreezeID
)
v
:=
types
.
Encode
(
&
unfreeze
)
kv
=
append
(
kv
,
&
types
.
KeyValue
{
k
,
v
})
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
}
...
...
@@ -156,19 +195,37 @@ func key(id string) (keys []byte) {
return
keys
}
func
(
a
*
action
)
getReceiptLog
(
unfreeze
*
uf
.
Unfreeze
)
*
types
.
ReceiptLog
{
//TODO 判断不同类型receipt
func
(
a
*
action
)
getCreateLog
(
unfreeze
*
uf
.
Unfreeze
)
*
types
.
ReceiptLog
{
log
:=
&
types
.
ReceiptLog
{}
log
.
Ty
=
uf
.
TyLogCreateUnfreeze
r
:=
&
uf
.
ReceiptCreate
{}
r
.
UnfreezeID
=
unfreeze
.
UnfreezeID
r
.
Initiator
=
unfreeze
.
Initiator
log
.
Log
=
types
.
Encode
(
r
)
return
log
}
func
(
a
*
action
)
getWithdrawLog
(
unfreeze
*
uf
.
Unfreeze
)
*
types
.
ReceiptLog
{
log
:=
&
types
.
ReceiptLog
{}
log
.
Ty
=
uf
.
TyLogCreateUnfreeze
r
:=
&
uf
.
ReceiptWithdraw
{}
r
.
WithdrawTimes
=
unfreeze
.
WithdrawTimes
r
.
Beneficiary
=
unfreeze
.
Beneficiary
log
.
Log
=
types
.
Encode
(
r
)
return
log
}
func
(
a
*
action
)
getTerminateLog
(
unfreeze
*
uf
.
Unfreeze
)
*
types
.
ReceiptLog
{
log
:=
&
types
.
ReceiptLog
{}
r
:=
&
uf
.
ReceiptUnfreeze
{}
r
.
TokenName
=
unfreeze
.
TokenName
r
.
CreateAddr
=
unfreeze
.
Initiator
r
.
ReceiveAddr
=
unfreeze
.
Beneficiary
log
.
Ty
=
uf
.
TyLogCreateUnfreeze
r
:=
&
uf
.
ReceiptTerminate
{}
r
.
UnfreezeID
=
unfreeze
.
UnfreezeID
log
.
Log
=
types
.
Encode
(
r
)
return
log
}
//查询可提币状态
func
QueryWithdraw
(
stateDB
dbm
.
KV
,
param
*
uf
.
QueryWithdraw
)
(
types
.
Message
,
error
)
{
func
QueryWithdraw
(
stateDB
dbm
.
KV
,
param
*
uf
.
QueryWithdraw
Status
)
(
types
.
Message
,
error
)
{
//查询提币次数
//计算当前可否提币
return
&
types
.
Reply
{},
nil
...
...
executor/query.go
View file @
f9d4465d
...
...
@@ -5,6 +5,6 @@ import (
"gitlab.33.cn/chain33/chain33/types"
)
func
(
u
*
Unfreeze
)
Query_QueryWithdraw
(
in
*
uf
.
QueryWithdraw
)
(
types
.
Message
,
error
)
{
func
(
u
*
Unfreeze
)
Query_QueryWithdraw
(
in
*
uf
.
QueryWithdraw
Status
)
(
types
.
Message
,
error
)
{
return
QueryWithdraw
(
u
.
GetStateDB
(),
in
)
}
proto/unfreeze.proto
View file @
f9d4465d
...
...
@@ -23,6 +23,8 @@ message Unfreeze {
int64
amount
=
9
;
//已解冻次数
int32
withdrawTimes
=
10
;
//解冻剩余币数
int64
remaining
=
11
;
}
// message for execs.unfreeze
...
...
@@ -32,18 +34,18 @@ message UnfreezeAction {
UnfreezeWithdraw
withdraw
=
2
;
UnfreezeTerminate
terminate
=
3
;
}
int32
ty
=
10
;
int32
ty
=
4
;
}
// action
message
UnfreezeCreate
{
int64
startTime
=
1
;
string
tokenName
=
2
;
int64
totalCount
=
3
;
string
initiator
=
4
;
string
beneficiary
=
5
;
int64
period
=
6
;
int32
means
=
7
;
int64
amount
=
8
;
string
beneficiary
=
4
;
int64
period
=
5
;
int32
means
=
6
;
int64
amount
=
7
;
}
message
UnfreezeWithdraw
{
...
...
@@ -54,13 +56,22 @@ message UnfreezeTerminate {
string
unfreezeID
=
1
;
}
//TODO: 更多receipt类型
message
ReceiptUnfreeze
{
string
tokenName
=
1
;
string
createAddr
=
2
;
string
receiveAddr
=
3
;
// receipt
message
ReceiptCreate
{
string
unfreezeID
=
1
;
string
initiator
=
2
;
}
message
ReceiptWithdraw
{
int32
withdrawTimes
=
1
;
string
beneficiary
=
3
;
}
message
ReceiptTerminate
{
string
unfreezeID
=
1
;
}
message
QueryWithdraw
{
// query
message
QueryWithdrawStatus
{
string
unfreezeID
=
1
;
}
types/types.go
View file @
f9d4465d
...
...
@@ -35,9 +35,9 @@ type UnfreezeType struct {
func
(
u
*
UnfreezeType
)
GetLogMap
()
map
[
int64
]
*
types
.
LogInfo
{
return
map
[
int64
]
*
types
.
LogInfo
{
TyLogCreateUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Unfreez
e
{}),
"LogCreateUnfreeze"
},
TyLogWithdrawUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Unfreeze
{}),
"LogWithdrawUnfreeze"
},
TyLogTerminateUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Unfreez
e
{}),
"LogTerminateUnfreeze"
},
TyLogCreateUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Creat
e
{}),
"LogCreateUnfreeze"
},
TyLogWithdrawUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Withdraw
{}),
"LogWithdrawUnfreeze"
},
TyLogTerminateUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Terminat
e
{}),
"LogTerminateUnfreeze"
},
}
}
...
...
types/unfreeze.pb.go
View file @
f9d4465d
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment