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
4a057142
Commit
4a057142
authored
Dec 17, 2019
by
pengjun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
#627 add table to issuance & collateralize
parent
8cbc6018
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
384 additions
and
652 deletions
+384
-652
collateralize.go
plugin/dapp/collateralize/executor/collateralize.go
+0
-105
collateralizedb.go
plugin/dapp/collateralize/executor/collateralizedb.go
+0
-0
exec_del_local.go
plugin/dapp/collateralize/executor/exec_del_local.go
+6
-53
exec_local.go
plugin/dapp/collateralize/executor/exec_local.go
+26
-41
keys.go
plugin/dapp/collateralize/executor/keys.go
+0
-52
query.go
plugin/dapp/collateralize/executor/query.go
+4
-4
collateralize.proto
plugin/dapp/collateralize/proto/collateralize.proto
+7
-24
collateralize.pb.go
plugin/dapp/collateralize/types/collateralize.pb.go
+0
-0
table.go
plugin/dapp/collateralize/types/table.go
+124
-0
cmd.go
plugin/dapp/issuance/commands/cmd.go
+3
-3
exec_del_local.go
plugin/dapp/issuance/executor/exec_del_local.go
+6
-40
exec_local.go
plugin/dapp/issuance/executor/exec_local.go
+26
-29
issuance.go
plugin/dapp/issuance/executor/issuance.go
+0
-104
issuance_test.go
plugin/dapp/issuance/executor/issuance_test.go
+7
-7
issuancedb.go
plugin/dapp/issuance/executor/issuancedb.go
+43
-103
keys.go
plugin/dapp/issuance/executor/keys.go
+0
-47
query.go
plugin/dapp/issuance/executor/query.go
+8
-8
issuance.proto
plugin/dapp/issuance/proto/issuance.proto
+7
-31
issuance.pb.go
plugin/dapp/issuance/types/issuance.pb.go
+0
-0
table.go
plugin/dapp/issuance/types/table.go
+116
-0
types.go
plugin/dapp/issuance/types/types.go
+1
-1
No files found.
plugin/dapp/collateralize/executor/collateralize.go
View file @
4a057142
...
...
@@ -54,111 +54,6 @@ func (c *Collateralize) GetDriverName() string {
return
pty
.
CollateralizeX
}
func
(
c
*
Collateralize
)
addCollateralizeID
(
collateralizeID
string
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeKey
(
collateralizeID
,
index
)
record
:=
&
pty
.
CollateralizeRecord
{
CollateralizeId
:
collateralizeID
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
deleteCollateralizeID
(
collateralizeID
string
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeKey
(
collateralizeID
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
addCollateralizeStatus
(
status
int32
,
collateralizeID
string
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeStatusKey
(
status
,
index
)
record
:=
&
pty
.
CollateralizeRecord
{
CollateralizeId
:
collateralizeID
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
deleteCollateralizeStatus
(
status
int32
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeStatusKey
(
status
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
addCollateralizeAddr
(
addr
string
,
collateralizeID
string
,
status
int32
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeAddrKey
(
addr
,
index
)
record
:=
&
pty
.
CollateralizeRecord
{
CollateralizeId
:
collateralizeID
,
Status
:
status
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
deleteCollateralizeAddr
(
addr
string
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeAddrKey
(
addr
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
addCollateralizeRecordStatus
(
recordStatus
int32
,
collateralizeID
string
,
recordID
string
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeRecordStatusKey
(
recordStatus
,
index
)
record
:=
&
pty
.
CollateralizeRecord
{
CollateralizeId
:
collateralizeID
,
RecordId
:
recordID
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
deleteCollateralizeRecordStatus
(
recordStatus
int32
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeRecordStatusKey
(
recordStatus
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
addCollateralizeRecordAddr
(
recordAddr
string
,
collateralizeID
string
,
recordID
string
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeRecordAddrKey
(
recordAddr
,
index
)
record
:=
&
pty
.
CollateralizeRecord
{
CollateralizeId
:
collateralizeID
,
RecordId
:
recordID
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Collateralize
)
deleteCollateralizeRecordAddr
(
recordAddr
string
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcCollateralizeRecordAddrKey
(
recordAddr
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
// CheckReceiptExecOk return true to check if receipt ty is ok
func
(
c
*
Collateralize
)
CheckReceiptExecOk
()
bool
{
return
true
...
...
plugin/dapp/collateralize/executor/collateralizedb.go
View file @
4a057142
This diff is collapsed.
Click to expand it.
plugin/dapp/collateralize/executor/exec_del_local.go
View file @
4a057142
...
...
@@ -10,60 +10,13 @@ import (
)
func
(
c
*
Collateralize
)
execDelLocal
(
tx
*
types
.
Transaction
,
receiptData
*
types
.
ReceiptData
)
(
*
types
.
LocalDBSet
,
error
)
{
set
:=
&
types
.
LocalDBSet
{}
for
_
,
item
:=
range
receiptData
.
Logs
{
if
item
.
Ty
==
pty
.
TyLogCollateralizeCreate
||
item
.
Ty
==
pty
.
TyLogCollateralizeBorrow
||
item
.
Ty
==
pty
.
TyLogCollateralizeAppend
||
item
.
Ty
==
pty
.
TyLogCollateralizeRepay
||
item
.
Ty
==
pty
.
TyLogCollateralizeFeed
||
item
.
Ty
==
pty
.
TyLogCollateralizeRetrieve
{
var
collateralizeLog
pty
.
ReceiptCollateralize
err
:=
types
.
Decode
(
item
.
Log
,
&
collateralizeLog
)
if
err
!=
nil
{
return
nil
,
err
}
switch
item
.
Ty
{
case
pty
.
TyLogCollateralizeCreate
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeAddr
(
collateralizeLog
.
CreateAddr
,
collateralizeLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeAddr
(
collateralizeLog
.
CreateAddr
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
PreStatus
,
collateralizeLog
.
PreIndex
)
...
)
case
pty
.
TyLogCollateralizeBorrow
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeRecordAddr
(
collateralizeLog
.
AccountAddr
,
collateralizeLog
.
Index
)
...
)
case
pty
.
TyLogCollateralizeAppend
:
if
collateralizeLog
.
Status
==
pty
.
CollateralizeUserStatusWarning
{
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeRecordStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
RecordId
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
Index
)
...
)
//set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
//set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.Index)...)
}
case
pty
.
TyLogCollateralizeRepay
:
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeRecordStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
RecordId
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
Index
)
...
)
//set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
case
pty
.
TyLogCollateralizeFeed
:
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
RecordId
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
Index
)
...
)
//set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
//// 如果没有被清算,需要把地址索引更新
//if collateralizeLog.Status == pty.CollateralizeUserStatusWarning || collateralizeLog.Status == pty.CollateralizeUserStatusExpire {
// set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.Index)...)
//}
case
pty
.
TyLogCollateralizeRetrieve
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeAddr
(
collateralizeLog
.
CreateAddr
,
collateralizeLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeAddr
(
collateralizeLog
.
CreateAddr
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
PreStatus
,
collateralizeLog
.
PreIndex
)
...
)
}
}
kvs
,
err
:=
c
.
DelRollbackKV
(
tx
,
tx
.
Execer
)
if
err
!=
nil
{
return
nil
,
err
}
return
set
,
nil
dbSet
:=
&
types
.
LocalDBSet
{}
dbSet
.
KV
=
append
(
dbSet
.
KV
,
kvs
...
)
return
dbSet
,
nil
}
// ExecDelLocal_Create Action
...
...
plugin/dapp/collateralize/executor/exec_local.go
View file @
4a057142
...
...
@@ -13,57 +13,42 @@ import (
func
(
c
*
Collateralize
)
execLocal
(
tx
*
types
.
Transaction
,
receipt
*
types
.
ReceiptData
)
(
*
types
.
LocalDBSet
,
error
)
{
set
:=
&
types
.
LocalDBSet
{}
for
_
,
item
:=
range
receipt
.
Logs
{
if
item
.
Ty
==
pty
.
TyLogCollateralizeCreate
||
item
.
Ty
==
pty
.
TyLogCollateralizeBorrow
||
item
.
Ty
==
pty
.
TyLogCollateralizeAppend
||
item
.
Ty
==
pty
.
TyLogCollateralizeRepay
||
item
.
Ty
==
pty
.
TyLogCollateralizeFeed
||
item
.
Ty
==
pty
.
TyLogCollateralizeRetrieve
{
if
item
.
Ty
>=
pty
.
TyLogCollateralizeCreate
&&
item
.
Ty
<=
pty
.
TyLogCollateralizeRetrieve
{
var
collateralizeLog
pty
.
ReceiptCollateralize
err
:=
types
.
Decode
(
item
.
Log
,
&
collateralizeLog
)
if
err
!=
nil
{
return
nil
,
err
}
switch
item
.
Ty
{
case
pty
.
TyLogCollateralizeCreate
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeAddr
(
collateralizeLog
.
CreateAddr
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeAddr
(
collateralizeLog
.
CreateAddr
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
Status
,
collateralizeLog
.
Index
)
...
)
case
pty
.
TyLogCollateralizeBorrow
:
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
RecordId
,
collateralizeLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeRecordAddr
(
collateralizeLog
.
AccountAddr
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
RecordId
,
collateralizeLog
.
Index
)
...
)
case
pty
.
TyLogCollateralizeAppend
:
if
collateralizeLog
.
Status
==
pty
.
CollateralizeUserStatusWarning
{
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeRecordStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
RecordId
,
collateralizeLog
.
Index
)
...
)
//set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.PreIndex)...)
//set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.Index)...)
if
item
.
Ty
==
pty
.
TyLogCollateralizeCreate
||
item
.
Ty
==
pty
.
TyLogCollateralizeRetrieve
{
collTable
:=
pty
.
NewCollateralizeTable
(
c
.
GetLocalDB
())
err
=
collTable
.
Replace
(
&
pty
.
ReceiptCollateralize
{
CollateralizeId
:
collateralizeLog
.
CollateralizeId
,
Status
:
collateralizeLog
.
Status
,
AccountAddr
:
collateralizeLog
.
AccountAddr
})
if
err
!=
nil
{
return
nil
,
err
}
case
pty
.
TyLogCollateralizeRepay
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeRecordStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
RecordId
,
collateralizeLog
.
Index
)
...
)
//set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.PreIndex)...)
case
pty
.
TyLogCollateralizeFeed
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeRecordStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeRecordStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
RecordId
,
collateralizeLog
.
Index
)
...
)
//set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.PreIndex)...)
//// 如果没有被清算,需要把地址索引更新
//if collateralizeLog.Status == pty.CollateralizeUserStatusWarning || collateralizeLog.Status == pty.CollateralizeUserStatusExpire {
// set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.Index)...)
//}
case
pty
.
TyLogCollateralizeRetrieve
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeStatus
(
collateralizeLog
.
PreStatus
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteCollateralizeAddr
(
collateralizeLog
.
CreateAddr
,
collateralizeLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeStatus
(
collateralizeLog
.
Status
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addCollateralizeAddr
(
collateralizeLog
.
CreateAddr
,
collateralizeLog
.
CollateralizeId
,
collateralizeLog
.
Status
,
collateralizeLog
.
Index
)
...
)
kvs
,
err
:=
collTable
.
Save
()
if
err
!=
nil
{
return
nil
,
err
}
set
.
KV
=
append
(
set
.
KV
,
kvs
...
)
}
else
{
recordTable
:=
pty
.
NewRecordTable
(
c
.
GetLocalDB
())
err
=
recordTable
.
Replace
(
&
pty
.
ReceiptCollateralize
{
CollateralizeId
:
collateralizeLog
.
CollateralizeId
,
Status
:
collateralizeLog
.
Status
,
RecordId
:
collateralizeLog
.
RecordId
,
AccountAddr
:
collateralizeLog
.
AccountAddr
})
if
err
!=
nil
{
return
nil
,
err
}
kvs
,
err
:=
recordTable
.
Save
()
if
err
!=
nil
{
return
nil
,
err
}
set
.
KV
=
append
(
set
.
KV
,
kvs
...
)
}
}
}
set
.
KV
=
c
.
AddRollbackKV
(
tx
,
[]
byte
(
pty
.
CollateralizeX
),
set
.
KV
)
return
set
,
nil
}
...
...
plugin/dapp/collateralize/executor/keys.go
deleted
100644 → 0
View file @
8cbc6018
// 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
executor
import
"fmt"
func
calcCollateralizeKey
(
collateralizeID
string
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-ID:%s:%018d"
,
collateralizeID
,
index
)
return
[]
byte
(
key
)
}
func
calcCollateralizeStatusPrefix
(
status
int32
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-status:%d"
,
status
)
return
[]
byte
(
key
)
}
func
calcCollateralizeStatusKey
(
status
int32
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-status:%d:%018d"
,
status
,
index
)
return
[]
byte
(
key
)
}
func
calcCollateralizeAddrPrefix
(
addr
string
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-addr:%s"
,
addr
)
return
[]
byte
(
key
)
}
func
calcCollateralizeAddrKey
(
addr
string
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-addr:%s:%018d"
,
addr
,
index
)
return
[]
byte
(
key
)
}
func
calcCollateralizeRecordAddrPrefix
(
addr
string
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-record-addr:%s"
,
addr
)
return
[]
byte
(
key
)
}
func
calcCollateralizeRecordAddrKey
(
addr
string
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-record-addr:%s:%018d"
,
addr
,
index
)
return
[]
byte
(
key
)
}
func
calcCollateralizeRecordStatusPrefix
(
status
string
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-record-status:%s"
,
status
)
return
[]
byte
(
key
)
}
func
calcCollateralizeRecordStatusKey
(
status
int32
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-collateralize-record-status:%d:%018d"
,
status
,
index
)
return
[]
byte
(
key
)
}
plugin/dapp/collateralize/executor/query.go
View file @
4a057142
...
...
@@ -66,7 +66,7 @@ func (c *Collateralize) Query_CollateralizeInfoByIDs(req *pty.ReqCollateralizeIn
func
(
c
*
Collateralize
)
Query_CollateralizeByStatus
(
req
*
pty
.
ReqCollateralizeByStatus
)
(
types
.
Message
,
error
)
{
ids
:=
&
pty
.
RepCollateralizeIDs
{}
collIDRecords
,
err
:=
queryCollateralizeByStatus
(
c
.
GetLocalDB
(),
req
.
Status
,
req
.
Index
)
collIDRecords
,
err
:=
queryCollateralizeByStatus
(
c
.
GetLocalDB
(),
req
.
Status
,
req
.
CollID
)
if
err
!=
nil
{
clog
.
Error
(
"Query_CollateralizeByStatus"
,
"get collateralize record error"
,
err
)
return
nil
,
err
...
...
@@ -78,7 +78,7 @@ func (c *Collateralize) Query_CollateralizeByStatus(req *pty.ReqCollateralizeByS
func
(
c
*
Collateralize
)
Query_CollateralizeByAddr
(
req
*
pty
.
ReqCollateralizeByAddr
)
(
types
.
Message
,
error
)
{
ids
:=
&
pty
.
RepCollateralizeIDs
{}
collIDRecords
,
err
:=
queryCollateralizeByAddr
(
c
.
GetLocalDB
(),
req
.
Addr
,
req
.
Status
,
req
.
Index
)
collIDRecords
,
err
:=
queryCollateralizeByAddr
(
c
.
GetLocalDB
(),
req
.
Addr
,
req
.
Status
,
req
.
CollID
)
if
err
!=
nil
{
clog
.
Error
(
"Query_CollateralizeByAddr"
,
"get collateralize record error"
,
err
)
return
nil
,
err
...
...
@@ -102,7 +102,7 @@ func (c *Collateralize) Query_CollateralizeRecordByID(req *pty.ReqCollateralizeR
func
(
c
*
Collateralize
)
Query_CollateralizeRecordByAddr
(
req
*
pty
.
ReqCollateralizeRecordByAddr
)
(
types
.
Message
,
error
)
{
ret
:=
&
pty
.
RepCollateralizeRecords
{}
records
,
err
:=
queryCollateralizeRecordByAddr
(
c
.
GetStateDB
(),
c
.
GetLocalDB
(),
req
.
Addr
,
req
.
Index
)
records
,
err
:=
queryCollateralizeRecordByAddr
(
c
.
GetStateDB
(),
c
.
GetLocalDB
(),
req
.
Addr
,
req
.
CollateralizeId
,
req
.
RecordId
)
if
err
!=
nil
{
clog
.
Error
(
"Query_CollateralizeRecordByAddr"
,
"get collateralize record error"
,
err
)
return
nil
,
err
...
...
@@ -122,7 +122,7 @@ func (c *Collateralize) Query_CollateralizeRecordByAddr(req *pty.ReqCollateraliz
func
(
c
*
Collateralize
)
Query_CollateralizeRecordByStatus
(
req
*
pty
.
ReqCollateralizeRecordByStatus
)
(
types
.
Message
,
error
)
{
ret
:=
&
pty
.
RepCollateralizeRecords
{}
records
,
err
:=
queryCollateralizeRecordByStatus
(
c
.
GetStateDB
(),
c
.
GetLocalDB
(),
req
.
Status
,
req
.
Index
)
records
,
err
:=
queryCollateralizeRecordByStatus
(
c
.
GetStateDB
(),
c
.
GetLocalDB
(),
req
.
Status
,
req
.
CollateralizeId
,
req
.
RecordId
)
if
err
!=
nil
{
clog
.
Error
(
"Query_CollateralizeRecordByStatus"
,
"get collateralize record error"
,
err
)
return
nil
,
err
...
...
plugin/dapp/collateralize/proto/collateralize.proto
View file @
4a057142
...
...
@@ -17,10 +17,8 @@ message Collateralize {
double
latestLiquidationPrice
=
11
;
//最高清算价格
int64
period
=
12
;
//借贷最大期限
int64
latestExpireTime
=
13
;
//最近超期时间
int64
index
=
14
;
//当前索引
int64
preIndex
=
15
;
//上一个索引
int64
collBalance
=
16
;
//抵押bty
int32
preStatus
=
17
;
//上一个状态
int64
collBalance
=
14
;
//抵押bty
int32
preStatus
=
15
;
//上一个状态
}
// 借出记录
...
...
@@ -37,8 +35,6 @@ message BorrowRecord {
int32
preStatus
=
10
;
//上一次抵押状态,用于告警恢复
string
recordId
=
11
;
//借贷id,标识一次借出记录
string
collateralizeId
=
12
;
//放贷id
int64
index
=
13
;
//当前索引
int64
preIndex
=
14
;
//上级索引
}
// 资产价格记录
...
...
@@ -115,27 +111,14 @@ message CollateralizeRetrieve {
// exec_local 放贷信息
message
ReceiptCollateralize
{
string
collateralizeId
=
1
;
string
createAddr
=
2
;
string
accountAddr
=
3
;
string
recordId
=
4
;
int32
status
=
5
;
int32
PreStatus
=
6
;
int64
index
=
7
;
int64
preIndex
=
8
;
}
// exec_local 放贷记录信息
message
CollateralizeRecord
{
string
collateralizeId
=
1
;
string
addr
=
2
;
string
recordId
=
3
;
int32
status
=
4
;
int64
index
=
5
;
}
// exec_local 放贷记录信息列表
message
CollateralizeRecords
{
repeated
CollateralizeRecord
records
=
1
;
repeated
ReceiptCollateralize
records
=
1
;
}
// 根据ID查询一期放贷信息
...
...
@@ -171,14 +154,14 @@ message RepCollateralizeCurrentInfos {
// 根据放贷状态查询
message
ReqCollateralizeByStatus
{
int32
status
=
1
;
int64
index
=
2
;
string
collID
=
2
;
}
// 根据用户地址查询
message
ReqCollateralizeByAddr
{
string
addr
=
1
;
int32
status
=
2
;
int64
index
=
3
;
string
collID
=
3
;
}
// 返回放贷ID列表
...
...
@@ -191,14 +174,14 @@ message ReqCollateralizeRecordByAddr {
string
collateralizeId
=
1
;
string
addr
=
2
;
int32
status
=
3
;
int64
index
=
4
;
string
recordId
=
4
;
}
// 根据状态和借贷ID混合查询具体借贷记录
message
ReqCollateralizeRecordByStatus
{
string
collateralizeId
=
1
;
int32
status
=
2
;
int64
index
=
3
;
string
recordId
=
3
;
}
// 返回借贷记录
...
...
plugin/dapp/collateralize/types/collateralize.pb.go
View file @
4a057142
This diff is collapsed.
Click to expand it.
plugin/dapp/collateralize/types/table.go
0 → 100644
View file @
4a057142
package
types
import
(
"fmt"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
)
var
opt
=
&
table
.
Option
{
Prefix
:
"LODB-collateralize"
,
Name
:
"coller"
,
Primary
:
"collateralizeid"
,
Index
:
[]
string
{
"status"
,
"addr"
,
"addr_status"
},
}
//NewTable 新建表
func
NewCollateralizeTable
(
kvdb
db
.
KV
)
*
table
.
Table
{
rowmeta
:=
NewCollatetalizeRow
()
table
,
err
:=
table
.
NewTable
(
rowmeta
,
kvdb
,
opt
)
if
err
!=
nil
{
panic
(
err
)
}
return
table
}
//CollatetalizeRow table meta 结构
type
CollatetalizeRow
struct
{
*
ReceiptCollateralize
}
//NewIssuanceRow 新建一个meta 结构
func
NewCollatetalizeRow
()
*
CollatetalizeRow
{
return
&
CollatetalizeRow
{
ReceiptCollateralize
:
&
ReceiptCollateralize
{}}
}
//CreateRow 新建数据行
func
(
tx
*
CollatetalizeRow
)
CreateRow
()
*
table
.
Row
{
return
&
table
.
Row
{
Data
:
&
ReceiptCollateralize
{}}
}
//SetPayload 设置数据
func
(
tx
*
CollatetalizeRow
)
SetPayload
(
data
types
.
Message
)
error
{
if
txdata
,
ok
:=
data
.
(
*
ReceiptCollateralize
);
ok
{
tx
.
ReceiptCollateralize
=
txdata
return
nil
}
return
types
.
ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func
(
tx
*
CollatetalizeRow
)
Get
(
key
string
)
([]
byte
,
error
)
{
if
key
==
"collateralizeid"
{
return
[]
byte
(
tx
.
CollateralizeId
),
nil
}
else
if
key
==
"status"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%2d"
,
tx
.
Status
)),
nil
}
else
if
key
==
"addr"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%s"
,
tx
.
AccountAddr
)),
nil
}
else
if
key
==
"addr_status"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%s:%2d"
,
tx
.
AccountAddr
,
tx
.
Status
)),
nil
}
return
nil
,
types
.
ErrNotFound
}
var
optRecord
=
&
table
.
Option
{
Prefix
:
"LODB-collateralize"
,
Name
:
"borrow"
,
Primary
:
"borrowid"
,
Index
:
[]
string
{
"status"
,
"addr"
,
"id_status"
,
"id_addr"
},
}
/*
借贷记录表
*/
func
NewRecordTable
(
kvdb
db
.
KV
)
*
table
.
Table
{
rowmeta
:=
NewRecordRow
()
table
,
err
:=
table
.
NewTable
(
rowmeta
,
kvdb
,
optRecord
)
if
err
!=
nil
{
panic
(
err
)
}
return
table
}
//CollatetalizeRow table meta 结构
type
CollateralizeRecordRow
struct
{
*
ReceiptCollateralize
}
//NewIssuanceRow 新建一个meta 结构
func
NewRecordRow
()
*
CollateralizeRecordRow
{
return
&
CollateralizeRecordRow
{
ReceiptCollateralize
:
&
ReceiptCollateralize
{}}
}
//CreateRow 新建数据行
func
(
tx
*
CollateralizeRecordRow
)
CreateRow
()
*
table
.
Row
{
return
&
table
.
Row
{
Data
:
&
ReceiptCollateralize
{}}
}
//SetPayload 设置数据
func
(
tx
*
CollateralizeRecordRow
)
SetPayload
(
data
types
.
Message
)
error
{
if
txdata
,
ok
:=
data
.
(
*
ReceiptCollateralize
);
ok
{
tx
.
ReceiptCollateralize
=
txdata
return
nil
}
return
types
.
ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func
(
tx
*
CollateralizeRecordRow
)
Get
(
key
string
)
([]
byte
,
error
)
{
if
key
==
"borrowid"
{
return
[]
byte
(
tx
.
RecordId
),
nil
}
else
if
key
==
"status"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%2d"
,
tx
.
Status
)),
nil
}
else
if
key
==
"addr"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%s"
,
tx
.
AccountAddr
)),
nil
}
else
if
key
==
"id_status"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%s:%2d"
,
tx
.
CollateralizeId
,
tx
.
Status
)),
nil
}
else
if
key
==
"id_addr"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%s:%s"
,
tx
.
CollateralizeId
,
tx
.
AccountAddr
)),
nil
}
return
nil
,
types
.
ErrNotFound
}
plugin/dapp/issuance/commands/cmd.go
View file @
4a057142
...
...
@@ -350,7 +350,7 @@ func IssuanceQuery(cmd *cobra.Command, args []string) {
if
address
!=
""
{
params
.
FuncName
=
"IssuanceRecordsByAddr"
req
:=
&
pkt
.
ReqIssuanceRecords
ByAddr
{
req
:=
&
pkt
.
ReqIssuanceRecords
{
IssuanceId
:
issuanceID
,
Status
:
int32
(
status
),
Addr
:
address
,
...
...
@@ -362,7 +362,7 @@ func IssuanceQuery(cmd *cobra.Command, args []string) {
}
else
if
statusStr
!=
""
{
params
.
FuncName
=
"IssuanceRecordsByStatus"
req
:=
&
pkt
.
ReqIssuanceRecords
ByStatus
{
req
:=
&
pkt
.
ReqIssuanceRecords
{
IssuanceId
:
issuanceID
,
Status
:
int32
(
status
),
}
...
...
@@ -373,7 +373,7 @@ func IssuanceQuery(cmd *cobra.Command, args []string) {
}
else
if
debtID
!=
""
{
params
.
FuncName
=
"IssuanceRecordByID"
req
:=
&
pkt
.
ReqIssuance
DebtInfo
{
req
:=
&
pkt
.
ReqIssuance
Records
{
IssuanceId
:
issuanceID
,
DebtId
:
debtID
,
}
...
...
plugin/dapp/issuance/executor/exec_del_local.go
View file @
4a057142
...
...
@@ -10,47 +10,13 @@ import (
)
func
(
c
*
Issuance
)
execDelLocal
(
tx
*
types
.
Transaction
,
receiptData
*
types
.
ReceiptData
)
(
*
types
.
LocalDBSet
,
error
)
{
set
:=
&
types
.
LocalDBSet
{}
for
_
,
item
:=
range
receiptData
.
Logs
{
if
item
.
Ty
==
pty
.
TyLogIssuanceCreate
||
item
.
Ty
==
pty
.
TyLogIssuanceDebt
||
item
.
Ty
==
pty
.
TyLogIssuanceRepay
||
item
.
Ty
==
pty
.
TyLogIssuanceFeed
||
item
.
Ty
==
pty
.
TyLogIssuanceClose
{
var
issuanceLog
pty
.
ReceiptIssuance
err
:=
types
.
Decode
(
item
.
Log
,
&
issuanceLog
)
if
err
!=
nil
{
return
nil
,
err
}
switch
item
.
Ty
{
case
pty
.
TyLogIssuanceCreate
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceStatus
(
issuanceLog
.
Status
,
issuanceLog
.
Index
)
...
)
case
pty
.
TyLogIssuanceDebt
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceRecordStatus
(
issuanceLog
.
Status
,
issuanceLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceRecordAddr
(
issuanceLog
.
AccountAddr
,
issuanceLog
.
Index
)
...
)
case
pty
.
TyLogIssuanceRepay
:
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceRecordStatus
(
issuanceLog
.
PreStatus
,
issuanceLog
.
AccountAddr
,
issuanceLog
.
PreIndex
,
issuanceLog
.
DebtId
,
issuanceLog
.
IssuanceId
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceRecordStatus
(
issuanceLog
.
Status
,
issuanceLog
.
Index
)
...
)
//set.KV = append(set.KV, c.addIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.PreIndex, issuanceLog.DebtId,
// issuanceLog.IssuanceId)...)
case
pty
.
TyLogIssuanceFeed
:
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceRecordStatus
(
issuanceLog
.
Status
,
issuanceLog
.
AccountAddr
,
issuanceLog
.
PreIndex
,
issuanceLog
.
DebtId
,
issuanceLog
.
IssuanceId
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceRecordStatus
(
issuanceLog
.
Status
,
issuanceLog
.
Index
)
...
)
//set.KV = append(set.KV, c.addIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.PreIndex, issuanceLog.DebtId,
// issuanceLog.IssuanceId)...)
//// 如果没有被清算,需要把地址索引更新
//if issuanceLog.Status == pty.IssuanceUserStatusWarning || issuanceLog.Status == pty.IssuanceUserStatusExpire {
// set.KV = append(set.KV, c.deleteIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.Index)...)
//}
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuancePriceRecord
(
issuanceLog
.
RecordTime
)
...
)
case
pty
.
TyLogIssuanceClose
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceStatus
(
issuanceLog
.
Status
,
issuanceLog
.
Index
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceStatus
(
issuanceLog
.
PreStatus
,
issuanceLog
.
PreIndex
,
issuanceLog
.
IssuanceId
)
...
)
}
}
kvs
,
err
:=
c
.
DelRollbackKV
(
tx
,
tx
.
Execer
)
if
err
!=
nil
{
return
nil
,
err
}
return
set
,
nil
dbSet
:=
&
types
.
LocalDBSet
{}
dbSet
.
KV
=
append
(
dbSet
.
KV
,
kvs
...
)
return
dbSet
,
nil
}
// ExecDelLocal_Create Action
...
...
plugin/dapp/issuance/executor/exec_local.go
View file @
4a057142
...
...
@@ -13,44 +13,41 @@ import (
func
(
c
*
Issuance
)
execLocal
(
tx
*
types
.
Transaction
,
receipt
*
types
.
ReceiptData
)
(
*
types
.
LocalDBSet
,
error
)
{
set
:=
&
types
.
LocalDBSet
{}
for
_
,
item
:=
range
receipt
.
Logs
{
if
item
.
Ty
==
pty
.
TyLogIssuanceCreate
||
item
.
Ty
==
pty
.
TyLogIssuanceDebt
||
item
.
Ty
==
pty
.
TyLogIssuanceRepay
||
item
.
Ty
==
pty
.
TyLogIssuanceFeed
||
item
.
Ty
==
pty
.
TyLogIssuanceClose
{
if
item
.
Ty
>=
pty
.
TyLogIssuanceCreate
&&
item
.
Ty
<=
pty
.
TyLogIssuanceClose
{
var
issuanceLog
pty
.
ReceiptIssuance
err
:=
types
.
Decode
(
item
.
Log
,
&
issuanceLog
)
if
err
!=
nil
{
return
nil
,
err
}
switch
item
.
Ty
{
case
pty
.
TyLogIssuanceCreate
:
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceStatus
(
issuanceLog
.
Status
,
issuanceLog
.
Index
,
issuanceLog
.
IssuanceId
)
...
)
case
pty
.
TyLogIssuanceDebt
:
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceRecordStatus
(
issuanceLog
.
Status
,
issuanceLog
.
AccountAddr
,
issuanceLog
.
Index
,
issuanceLog
.
DebtId
,
issuanceLog
.
IssuanceId
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceRecordAddr
(
issuanceLog
.
AccountAddr
,
issuanceLog
.
Index
,
issuanceLog
.
DebtId
,
issuanceLog
.
IssuanceId
)
...
)
case
pty
.
TyLogIssuanceRepay
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceRecordStatus
(
issuanceLog
.
PreStatus
,
issuanceLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceRecordStatus
(
issuanceLog
.
Status
,
issuanceLog
.
AccountAddr
,
issuanceLog
.
Index
,
issuanceLog
.
DebtId
,
issuanceLog
.
IssuanceId
)
...
)
//set.KV = append(set.KV, c.deleteIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.PreIndex)...)
case
pty
.
TyLogIssuanceFeed
:
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceRecordStatus
(
issuanceLog
.
PreStatus
,
issuanceLog
.
PreIndex
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceRecordStatus
(
issuanceLog
.
Status
,
issuanceLog
.
AccountAddr
,
issuanceLog
.
Index
,
issuanceLog
.
DebtId
,
issuanceLog
.
IssuanceId
)
...
)
//set.KV = append(set.KV, c.deleteIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.PreIndex)...)
//// 如果没有被清算,需要把地址索引更新
//if issuanceLog.Status == pty.IssuanceUserStatusWarning || issuanceLog.Status == pty.IssuanceUserStatusExpire {
// set.KV = append(set.KV, c.addIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.Index, issuanceLog.DebtId,
// issuanceLog.IssuanceId)...)
//}
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuancePriceRecord
(
issuanceLog
.
RecordTime
,
issuanceLog
.
BtyPrice
)
...
)
case
pty
.
TyLogIssuanceClose
:
set
.
KV
=
append
(
set
.
KV
,
c
.
addIssuanceStatus
(
issuanceLog
.
Status
,
issuanceLog
.
Index
,
issuanceLog
.
IssuanceId
)
...
)
set
.
KV
=
append
(
set
.
KV
,
c
.
deleteIssuanceStatus
(
issuanceLog
.
PreStatus
,
issuanceLog
.
PreIndex
)
...
)
if
item
.
Ty
==
pty
.
TyLogIssuanceCreate
||
item
.
Ty
==
pty
.
TyLogIssuanceClose
{
IDtable
:=
pty
.
NewIssuanceTable
(
c
.
GetLocalDB
())
err
=
IDtable
.
Replace
(
&
pty
.
ReceiptIssuanceID
{
IssuanceId
:
issuanceLog
.
IssuanceId
,
Status
:
issuanceLog
.
Status
})
if
err
!=
nil
{
return
nil
,
err
}
kvs
,
err
:=
IDtable
.
Save
()
if
err
!=
nil
{
return
nil
,
err
}
set
.
KV
=
append
(
set
.
KV
,
kvs
...
)
}
else
{
recordTable
:=
pty
.
NewRecordTable
(
c
.
GetLocalDB
())
err
=
recordTable
.
Replace
(
&
pty
.
ReceiptIssuance
{
IssuanceId
:
issuanceLog
.
IssuanceId
,
Status
:
issuanceLog
.
Status
,
DebtId
:
issuanceLog
.
DebtId
,
AccountAddr
:
issuanceLog
.
AccountAddr
})
if
err
!=
nil
{
return
nil
,
err
}
kvs
,
err
:=
recordTable
.
Save
()
if
err
!=
nil
{
return
nil
,
err
}
set
.
KV
=
append
(
set
.
KV
,
kvs
...
)
}
}
}
set
.
KV
=
c
.
AddRollbackKV
(
tx
,
[]
byte
(
pty
.
IssuanceX
),
set
.
KV
)
return
set
,
nil
}
...
...
plugin/dapp/issuance/executor/issuance.go
View file @
4a057142
...
...
@@ -54,110 +54,6 @@ func (c *Issuance) GetDriverName() string {
return
pty
.
IssuanceX
}
func
(
c
*
Issuance
)
addIssuanceID
(
index
int64
,
issuanceID
string
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuanceKey
(
issuanceID
,
index
)
record
:=
&
pty
.
IssuanceRecord
{
IssuanceId
:
issuanceID
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
deleteIssuanceID
(
index
int64
,
issuanceID
string
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuanceKey
(
issuanceID
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
addIssuanceStatus
(
status
int32
,
index
int64
,
issuanceID
string
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuanceStatusKey
(
status
,
index
)
record
:=
&
pty
.
IssuanceRecord
{
IssuanceId
:
issuanceID
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
deleteIssuanceStatus
(
status
int32
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuanceStatusKey
(
status
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
addIssuanceRecordAddr
(
accountAddr
string
,
index
int64
,
debtID
string
,
issuanceID
string
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuanceRecordAddrKey
(
accountAddr
,
index
)
record
:=
&
pty
.
IssuanceRecord
{
IssuanceId
:
issuanceID
,
DebtId
:
debtID
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
deleteIssuanceRecordAddr
(
accountAddr
string
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuanceRecordAddrKey
(
accountAddr
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
addIssuanceRecordStatus
(
recordStatus
int32
,
accountAddr
string
,
index
int64
,
debtID
string
,
issuanceID
string
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuanceRecordStatusKey
(
recordStatus
,
index
)
record
:=
&
pty
.
IssuanceRecord
{
IssuanceId
:
issuanceID
,
DebtId
:
debtID
,
Addr
:
accountAddr
,
Index
:
index
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
deleteIssuanceRecordStatus
(
status
int32
,
index
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuanceRecordStatusKey
(
status
,
index
)
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
addIssuancePriceRecord
(
recordTime
int64
,
price
float64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuancePriceKey
(
string
(
recordTime
))
record
:=
&
pty
.
IssuanceAssetPriceRecord
{
RecordTime
:
recordTime
,
BtyPrice
:
price
,
}
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
types
.
Encode
(
record
)}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
func
(
c
*
Issuance
)
deleteIssuancePriceRecord
(
recordTime
int64
)
(
kvs
[]
*
types
.
KeyValue
)
{
key
:=
calcIssuancePriceKey
(
string
(
recordTime
))
kv
:=
&
types
.
KeyValue
{
Key
:
key
,
Value
:
nil
}
kvs
=
append
(
kvs
,
kv
)
return
kvs
}
// CheckReceiptExecOk return true to check if receipt ty is ok
func
(
c
*
Issuance
)
CheckReceiptExecOk
()
bool
{
return
true
...
...
plugin/dapp/issuance/executor/issuance_test.go
View file @
4a057142
...
...
@@ -274,17 +274,17 @@ func TestIssuance(t *testing.T) {
debtID
:=
createTx
.
Hash
()
// query issuance by id
res
,
err
=
exec
.
Query
(
"IssuanceRecordByID"
,
types
.
Encode
(
&
pkt
.
ReqIssuance
DebtInfo
{
IssuanceId
:
common
.
ToHex
(
issuanceID
),
DebtId
:
common
.
ToHex
(
debtID
)}))
types
.
Encode
(
&
pkt
.
ReqIssuance
Records
{
IssuanceId
:
common
.
ToHex
(
issuanceID
),
DebtId
:
common
.
ToHex
(
debtID
)}))
assert
.
Nil
(
t
,
err
)
assert
.
NotNil
(
t
,
res
)
// query issuance by status
res
,
err
=
exec
.
Query
(
"IssuanceRecordsByStatus"
,
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
ByStatus
{
IssuanceId
:
common
.
ToHex
(
issuanceID
),
Status
:
1
}))
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
{
Status
:
1
}))
assert
.
Nil
(
t
,
err
)
assert
.
NotNil
(
t
,
res
)
// query issuance by addr
res
,
err
=
exec
.
Query
(
"IssuanceRecordsByAddr"
,
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
ByAddr
{
IssuanceId
:
common
.
ToHex
(
issuanceID
),
Addr
:
string
(
Nodes
[
1
]),
Status
:
1
}))
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
{
Addr
:
string
(
Nodes
[
1
])
}))
assert
.
Nil
(
t
,
err
)
assert
.
NotNil
(
t
,
res
)
...
...
@@ -320,12 +320,12 @@ func TestIssuance(t *testing.T) {
}
// query issuance by status
res
,
err
=
exec
.
Query
(
"IssuanceRecordsByStatus"
,
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
ByStatus
{
IssuanceId
:
common
.
ToHex
(
issuanceID
),
Status
:
6
}))
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
{
Status
:
6
}))
assert
.
Nil
(
t
,
err
)
assert
.
NotNil
(
t
,
res
)
// query issuance by addr
res
,
err
=
exec
.
Query
(
"IssuanceRecordsByAddr"
,
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
ByAddr
{
IssuanceId
:
common
.
ToHex
(
issuanceID
),
Addr
:
string
(
Nodes
[
1
]),
Status
:
6
}))
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
{
Addr
:
string
(
Nodes
[
1
])
}))
assert
.
Nil
(
t
,
err
)
assert
.
NotNil
(
t
,
res
)
...
...
@@ -390,7 +390,7 @@ func TestIssuance(t *testing.T) {
}
// query issuance by status
res
,
err
=
exec
.
Query
(
"IssuanceRecordsByStatus"
,
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
ByStatus
{
IssuanceId
:
common
.
ToHex
(
issuanceID
),
Status
:
3
}))
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
{
Status
:
3
}))
assert
.
Nil
(
t
,
err
)
assert
.
NotNil
(
t
,
res
)
...
...
@@ -455,7 +455,7 @@ func TestIssuance(t *testing.T) {
}
// query issuance by status
res
,
err
=
exec
.
Query
(
"IssuanceRecordsByStatus"
,
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
ByStatus
{
IssuanceId
:
common
.
ToHex
(
issuanceID
),
Status
:
5
}))
types
.
Encode
(
&
pkt
.
ReqIssuanceRecords
{
Status
:
5
}))
assert
.
Nil
(
t
,
err
)
assert
.
NotNil
(
t
,
res
)
...
...
plugin/dapp/issuance/executor/issuancedb.go
View file @
4a057142
This diff is collapsed.
Click to expand it.
plugin/dapp/issuance/executor/keys.go
deleted
100644 → 0
View file @
8cbc6018
// 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
executor
import
"fmt"
func
calcIssuanceKey
(
issuanceID
string
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-issuance-ID:%s:%018d"
,
issuanceID
,
index
)
return
[]
byte
(
key
)
}
func
calcIssuanceStatusPrefix
(
status
int32
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-issuance-status:%d"
,
status
)
return
[]
byte
(
key
)
}
func
calcIssuanceStatusKey
(
status
int32
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-issuance-status:%d:%018d"
,
status
,
index
)
return
[]
byte
(
key
)
}
func
calcIssuanceRecordAddrPrefix
(
addr
string
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-issuance-record-addr:%s"
,
addr
)
return
[]
byte
(
key
)
}
func
calcIssuanceRecordAddrKey
(
addr
string
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-issuance-record-addr:%s:%018d"
,
addr
,
index
)
return
[]
byte
(
key
)
}
func
calcIssuancePriceKey
(
time
string
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-issuance-price:%s"
,
time
)
return
[]
byte
(
key
)
}
func
calcIssuanceRecordStatusPrefix
(
status
string
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-issuance-record-status:%s"
,
status
)
return
[]
byte
(
key
)
}
func
calcIssuanceRecordStatusKey
(
status
int32
,
index
int64
)
[]
byte
{
key
:=
fmt
.
Sprintf
(
"LODB-issuance-record-status:%d:%018d"
,
status
,
index
)
return
[]
byte
(
key
)
}
plugin/dapp/issuance/executor/query.go
View file @
4a057142
...
...
@@ -58,17 +58,17 @@ func (c *Issuance) Query_IssuanceInfoByIDs(req *pty.ReqIssuanceInfos) (types.Mes
func
(
c
*
Issuance
)
Query_IssuanceByStatus
(
req
*
pty
.
ReqIssuanceByStatus
)
(
types
.
Message
,
error
)
{
ids
:=
&
pty
.
RepIssuanceIDs
{}
issuID
Records
,
err
:=
queryIssuanceByStatus
(
c
.
GetLocalDB
(),
req
.
Status
,
req
.
Index
)
issuID
s
,
err
:=
queryIssuanceByStatus
(
c
.
GetLocalDB
(),
req
.
Status
,
req
.
IssuanceId
)
if
err
!=
nil
{
clog
.
Error
(
"Query_IssuanceByStatus"
,
"get issuance error"
,
err
)
return
nil
,
err
}
ids
.
IDs
=
append
(
ids
.
IDs
,
issuID
Record
s
...
)
ids
.
IDs
=
append
(
ids
.
IDs
,
issuIDs
...
)
return
ids
,
nil
}
func
(
c
*
Issuance
)
Query_IssuanceRecordByID
(
req
*
pty
.
ReqIssuance
DebtInfo
)
(
types
.
Message
,
error
)
{
func
(
c
*
Issuance
)
Query_IssuanceRecordByID
(
req
*
pty
.
ReqIssuance
Records
)
(
types
.
Message
,
error
)
{
ret
:=
&
pty
.
RepIssuanceDebtInfo
{}
issuRecord
,
err
:=
queryIssuanceRecordByID
(
c
.
GetStateDB
(),
req
.
IssuanceId
,
req
.
DebtId
)
if
err
!=
nil
{
...
...
@@ -80,9 +80,9 @@ func (c *Issuance) Query_IssuanceRecordByID(req *pty.ReqIssuanceDebtInfo) (types
return
ret
,
nil
}
func
(
c
*
Issuance
)
Query_IssuanceRecordsByAddr
(
req
*
pty
.
ReqIssuanceRecords
ByAddr
)
(
types
.
Message
,
error
)
{
func
(
c
*
Issuance
)
Query_IssuanceRecordsByAddr
(
req
*
pty
.
ReqIssuanceRecords
)
(
types
.
Message
,
error
)
{
ret
:=
&
pty
.
RepIssuanceRecords
{}
records
,
err
:=
queryIssuanceRecordByAddr
(
c
.
GetStateDB
(),
c
.
GetLocalDB
(),
req
.
Addr
,
req
.
Index
)
records
,
err
:=
queryIssuanceRecordByAddr
(
c
.
GetStateDB
(),
c
.
GetLocalDB
(),
req
.
Addr
,
req
.
DebtId
)
if
err
!=
nil
{
clog
.
Error
(
"Query_IssuanceDebtInfoByAddr"
,
"get issuance record error"
,
err
)
return
nil
,
err
...
...
@@ -101,9 +101,9 @@ func (c *Issuance) Query_IssuanceRecordsByAddr(req *pty.ReqIssuanceRecordsByAddr
return
ret
,
nil
}
func
(
c
*
Issuance
)
Query_IssuanceRecordsByStatus
(
req
*
pty
.
ReqIssuanceRecords
ByStatus
)
(
types
.
Message
,
error
)
{
func
(
c
*
Issuance
)
Query_IssuanceRecordsByStatus
(
req
*
pty
.
ReqIssuanceRecords
)
(
types
.
Message
,
error
)
{
ret
:=
&
pty
.
RepIssuanceRecords
{}
records
,
err
:=
queryIssuanceRecordsByStatus
(
c
.
GetStateDB
(),
c
.
GetLocalDB
(),
req
.
Status
,
req
.
Index
)
records
,
err
:=
queryIssuanceRecordsByStatus
(
c
.
GetStateDB
(),
c
.
GetLocalDB
(),
req
.
Status
,
req
.
DebtId
)
if
err
!=
nil
{
clog
.
Error
(
"Query_IssuanceDebtInfoByStatus"
,
"get issuance record error"
,
err
)
return
nil
,
err
...
...
@@ -113,7 +113,7 @@ func (c *Issuance) Query_IssuanceRecordsByStatus(req *pty.ReqIssuanceRecordsBySt
return
ret
,
nil
}
func
(
c
*
Issuance
)
Query_IssuancePrice
(
req
*
pty
.
ReqIssuanceRecords
ByStatus
)
(
types
.
Message
,
error
)
{
func
(
c
*
Issuance
)
Query_IssuancePrice
(
req
*
pty
.
ReqIssuanceRecords
)
(
types
.
Message
,
error
)
{
price
,
err
:=
getLatestPrice
(
c
.
GetStateDB
())
if
err
!=
nil
{
clog
.
Error
(
"Query_CollateralizePrice"
,
"error"
,
err
)
...
...
plugin/dapp/issuance/proto/issuance.proto
View file @
4a057142
...
...
@@ -19,8 +19,6 @@ message Issuance {
int64
createTime
=
13
;
//创建时间
int64
balance
=
14
;
//剩余可发行ccny
string
issuerAddr
=
15
;
//发行地址
int64
index
=
16
;
//当前索引
int64
preIndex
=
17
;
//上级索引
}
// 抵押记录
...
...
@@ -37,8 +35,6 @@ message DebtRecord {
int32
preStatus
=
10
;
//上一次抵押状态,用于告警恢复
string
debtId
=
11
;
//借贷id
string
issuId
=
12
;
//发行id
int64
index
=
13
;
//当前索引
int64
preIndex
=
14
;
//上级索引
}
// 资产价格记录
...
...
@@ -102,24 +98,17 @@ message ReceiptIssuance {
string
accountAddr
=
2
;
string
debtId
=
3
;
int32
status
=
4
;
int32
preStatus
=
5
;
int64
index
=
6
;
int64
preIndex
=
7
;
int64
recordTime
=
8
;
//价格记录时间
double
btyPrice
=
9
;
//bty价格
}
// exec_local
抵押
记录信息
message
IssuanceRecord
{
// exec_local
issuid
记录信息
message
ReceiptIssuanceID
{
string
issuanceId
=
1
;
string
addr
=
2
;
string
debtId
=
3
;
int64
index
=
4
;
int32
status
=
2
;
}
// exec_local 抵押记录信息列表
message
IssuanceRecords
{
repeated
IssuanceRecord
records
=
1
;
repeated
ReceiptIssuance
records
=
1
;
}
// 根据ID查询发行信息
...
...
@@ -154,7 +143,7 @@ message RepIssuanceCurrentInfos {
// 根据发行状态查询
message
ReqIssuanceByStatus
{
int32
status
=
1
;
int64
index
=
2
;
string
issuanceId
=
2
;
}
// 返回发行ID列表
...
...
@@ -163,18 +152,11 @@ message RepIssuanceIDs {
}
// 根据用户地址查询抵押记录
message
ReqIssuanceRecords
ByAddr
{
message
ReqIssuanceRecords
{
string
issuanceId
=
1
;
string
addr
=
2
;
int32
status
=
3
;
int64
index
=
4
;
}
// 根据状态查询抵押记录
message
ReqIssuanceRecordsByStatus
{
string
issuanceId
=
1
;
int32
status
=
2
;
int64
index
=
3
;
string
debtId
=
4
;
}
// 返回记录列表
...
...
@@ -182,12 +164,6 @@ message RepIssuanceRecords {
repeated
DebtRecord
records
=
1
;
}
// 精确查找抵押记录
message
ReqIssuanceDebtInfo
{
string
issuanceId
=
1
;
string
debtId
=
2
;
}
// 返回记录
message
RepIssuanceDebtInfo
{
DebtRecord
record
=
1
;
...
...
plugin/dapp/issuance/types/issuance.pb.go
View file @
4a057142
This diff is collapsed.
Click to expand it.
plugin/dapp/issuance/types/table.go
0 → 100644
View file @
4a057142
package
types
import
(
"fmt"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
)
var
opt
=
&
table
.
Option
{
Prefix
:
"LODB-issuance"
,
Name
:
"issuer"
,
Primary
:
"issuanceid"
,
Index
:
[]
string
{
"status"
},
}
//NewTable 新建表
func
NewIssuanceTable
(
kvdb
db
.
KV
)
*
table
.
Table
{
rowmeta
:=
NewIssuanceRow
()
table
,
err
:=
table
.
NewTable
(
rowmeta
,
kvdb
,
opt
)
if
err
!=
nil
{
panic
(
err
)
}
return
table
}
//IssuanceRow table meta 结构
type
IssuanceRow
struct
{
*
ReceiptIssuanceID
}
//NewIssuanceRow 新建一个meta 结构
func
NewIssuanceRow
()
*
IssuanceRow
{
return
&
IssuanceRow
{
ReceiptIssuanceID
:
&
ReceiptIssuanceID
{}}
}
//CreateRow 新建数据行
func
(
tx
*
IssuanceRow
)
CreateRow
()
*
table
.
Row
{
return
&
table
.
Row
{
Data
:
&
ReceiptIssuanceID
{}}
}
//SetPayload 设置数据
func
(
tx
*
IssuanceRow
)
SetPayload
(
data
types
.
Message
)
error
{
if
txdata
,
ok
:=
data
.
(
*
ReceiptIssuanceID
);
ok
{
tx
.
ReceiptIssuanceID
=
txdata
return
nil
}
return
types
.
ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func
(
tx
*
IssuanceRow
)
Get
(
key
string
)
([]
byte
,
error
)
{
if
key
==
"issuanceid"
{
return
[]
byte
(
tx
.
IssuanceId
),
nil
}
else
if
key
==
"status"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%2d"
,
tx
.
Status
)),
nil
}
return
nil
,
types
.
ErrNotFound
}
var
optRecord
=
&
table
.
Option
{
Prefix
:
"LODB-issuance"
,
Name
:
"debt"
,
Primary
:
"debtid"
,
Index
:
[]
string
{
"status"
,
"addr"
},
}
/*
大户发行记录表
*/
func
NewRecordTable
(
kvdb
db
.
KV
)
*
table
.
Table
{
rowmeta
:=
NewRecordRow
()
table
,
err
:=
table
.
NewTable
(
rowmeta
,
kvdb
,
optRecord
)
if
err
!=
nil
{
panic
(
err
)
}
return
table
}
//IssuanceRow table meta 结构
type
IssuanceRecordRow
struct
{
*
ReceiptIssuance
}
//NewIssuanceRow 新建一个meta 结构
func
NewRecordRow
()
*
IssuanceRecordRow
{
return
&
IssuanceRecordRow
{
ReceiptIssuance
:
&
ReceiptIssuance
{}}
}
//CreateRow 新建数据行
func
(
tx
*
IssuanceRecordRow
)
CreateRow
()
*
table
.
Row
{
return
&
table
.
Row
{
Data
:
&
ReceiptIssuance
{}}
}
//SetPayload 设置数据
func
(
tx
*
IssuanceRecordRow
)
SetPayload
(
data
types
.
Message
)
error
{
if
txdata
,
ok
:=
data
.
(
*
ReceiptIssuance
);
ok
{
tx
.
ReceiptIssuance
=
txdata
return
nil
}
return
types
.
ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func
(
tx
*
IssuanceRecordRow
)
Get
(
key
string
)
([]
byte
,
error
)
{
if
key
==
"debtid"
{
return
[]
byte
(
tx
.
DebtId
),
nil
}
else
if
key
==
"status"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%2d"
,
tx
.
Status
)),
nil
}
else
if
key
==
"addr"
{
return
[]
byte
(
fmt
.
Sprintf
(
"%s"
,
tx
.
AccountAddr
)),
nil
}
return
nil
,
types
.
ErrNotFound
}
plugin/dapp/issuance/types/types.go
View file @
4a057142
...
...
@@ -18,7 +18,7 @@ const (
TyLogIssuanceDebt
=
742
TyLogIssuanceRepay
=
743
TyLogIssuanceFeed
=
745
TyLogIssuanceClose
=
7
5
6
TyLogIssuanceClose
=
7
4
6
)
// Issuance name
...
...
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