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
8cac51a7
Commit
8cac51a7
authored
Dec 30, 2019
by
hxzqlh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add dapp:exchange test
parent
2efb8249
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
809 additions
and
11 deletions
+809
-11
go.mod
go.mod
+0
-2
exchange.go
plugin/dapp/exchange/executor/exchange.go
+3
-3
exchange_test.go
plugin/dapp/exchange/executor/exchange_test.go
+6
-6
exchangedb.go
plugin/dapp/exchange/executor/exchangedb.go
+0
-0
client.go
plugin/dapp/exchange/test/client.go
+11
-0
main.go
plugin/dapp/exchange/test/cmd/main.go
+70
-0
exchange_test.go
plugin/dapp/exchange/test/exchange_test.go
+325
-0
exec_cli.go
plugin/dapp/exchange/test/exec_cli.go
+195
-0
grpc_cli.go
plugin/dapp/exchange/test/grpc_cli.go
+115
-0
prepare.sh
plugin/dapp/exchange/test/prepare.sh
+84
-0
No files found.
go.mod
View file @
8cac51a7
...
...
@@ -20,8 +20,6 @@ require (
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
github.com/golang/protobuf v1.3.2
github.com/hashicorp/golang-lru v0.5.0
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pkg/errors v0.8.0
github.com/prometheus/client_golang v1.1.0 // indirect
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d
...
...
plugin/dapp/exchange/executor/exchange.go
View file @
8cac51a7
...
...
@@ -21,7 +21,7 @@ var driverName = exchangetypes.ExchangeX
// Init register dapp
func
Init
(
name
string
,
cfg
*
types
.
Chain33Config
,
sub
[]
byte
)
{
drivers
.
Register
(
cfg
,
GetName
(),
n
ewExchange
,
cfg
.
GetDappFork
(
driverName
,
"Enable"
))
drivers
.
Register
(
cfg
,
GetName
(),
N
ewExchange
,
cfg
.
GetDappFork
(
driverName
,
"Enable"
))
InitExecType
()
}
...
...
@@ -35,7 +35,7 @@ type exchange struct {
drivers
.
DriverBase
}
func
n
ewExchange
()
drivers
.
Driver
{
func
N
ewExchange
()
drivers
.
Driver
{
t
:=
&
exchange
{}
t
.
SetChild
(
t
)
t
.
SetExecutorType
(
types
.
LoadExecutorType
(
driverName
))
...
...
@@ -44,7 +44,7 @@ func newExchange() drivers.Driver {
// GetName get driver name
func
GetName
()
string
{
return
n
ewExchange
()
.
GetName
()
return
N
ewExchange
()
.
GetName
()
}
func
(
e
*
exchange
)
GetDriverName
()
string
{
...
...
plugin/dapp/exchange/executor/exchange_test.go
View file @
8cac51a7
...
...
@@ -455,7 +455,7 @@ func Exec_LimitOrder(t *testing.T, limitOrder *et.LimitOrder, privKey string, st
if
err
!=
nil
{
return
err
}
exec
:=
n
ewExchange
()
exec
:=
N
ewExchange
()
e
:=
exec
.
(
*
exchange
)
err
=
e
.
CheckTx
(
tx
,
1
)
if
err
!=
nil
{
...
...
@@ -508,7 +508,7 @@ func Exec_RevokeOrder(t *testing.T, orderID int64, privKey string, stateDB db.DB
if
err
!=
nil
{
return
err
}
exec
:=
n
ewExchange
()
exec
:=
N
ewExchange
()
e
:=
exec
.
(
*
exchange
)
err
=
e
.
CheckTx
(
tx
,
1
)
assert
.
Nil
(
t
,
err
)
...
...
@@ -546,7 +546,7 @@ func Exec_RevokeOrder(t *testing.T, orderID int64, privKey string, stateDB db.DB
func
Exec_QueryOrderList
(
status
int32
,
addr
string
,
primaryKey
string
,
stateDB
db
.
KV
,
kvdb
db
.
KVDB
)
(
*
et
.
OrderList
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
n
ewExchange
()
exec
:=
N
ewExchange
()
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
api
,
_
:=
client
.
New
(
q
.
Client
(),
nil
)
...
...
@@ -563,7 +563,7 @@ func Exec_QueryOrderList(status int32, addr string, primaryKey string, stateDB d
func
Exec_QueryOrder
(
orderID
int64
,
stateDB
db
.
KV
,
kvdb
db
.
KVDB
)
(
*
et
.
Order
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
n
ewExchange
()
exec
:=
N
ewExchange
()
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
api
,
_
:=
client
.
New
(
q
.
Client
(),
nil
)
...
...
@@ -581,7 +581,7 @@ func Exec_QueryOrder(orderID int64, stateDB db.KV, kvdb db.KVDB) (*et.Order, err
func
Exec_QueryMarketDepth
(
query
*
et
.
QueryMarketDepth
,
stateDB
db
.
KV
,
kvdb
db
.
KVDB
)
(
*
et
.
MarketDepthList
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
n
ewExchange
()
exec
:=
N
ewExchange
()
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
api
,
_
:=
client
.
New
(
q
.
Client
(),
nil
)
...
...
@@ -599,7 +599,7 @@ func Exec_QueryMarketDepth(query *et.QueryMarketDepth, stateDB db.KV, kvdb db.KV
func
Exec_QueryHistoryOrder
(
query
*
et
.
QueryHistoryOrderList
,
stateDB
db
.
KV
,
kvdb
db
.
KVDB
)
(
*
et
.
OrderList
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
exec
:=
n
ewExchange
()
exec
:=
N
ewExchange
()
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
api
,
_
:=
client
.
New
(
q
.
Client
(),
nil
)
...
...
plugin/dapp/exchange/executor/exchangedb.go
View file @
8cac51a7
This diff is collapsed.
Click to expand it.
plugin/dapp/exchange/test/client.go
0 → 100644
View file @
8cac51a7
package
test
import
(
"github.com/33cn/chain33/types"
"github.com/gogo/protobuf/proto"
)
type
Cli
interface
{
Send
(
tx
*
types
.
Transaction
,
hexKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
Query
(
fn
string
,
msg
proto
.
Message
)
([]
byte
,
error
)
}
plugin/dapp/exchange/test/cmd/main.go
0 → 100644
View file @
8cac51a7
package
main
import
(
"fmt"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/exchange/test"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
)
var
(
cli
*
test
.
GRPCCli
Genesis
=
"0x3990969DF92A5914F7B71EEB9A4E58D6E255F32BF042FEA5318FC8B3D50EE6E8"
// 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
PrivKeyA
=
"0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b"
// 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
PrivKeyB
=
"0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4"
// 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
PrivKeyC
=
"0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115"
// 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
PrivKeyD
=
"0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71"
// 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
Nodes
=
[]
string
{
"1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"
,
"1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR"
,
"1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k"
,
"1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
,
}
)
func
main
()
{
cli
=
test
.
NewGRPCCli
(
"localhost:8802"
)
go
buy
()
go
sell
()
select
{}
}
func
sell
()
{
req
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
1
,
Amount
:
types
.
Coin
,
Op
:
et
.
OpSell
,
}
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
fmt
.
Println
(
"ety"
,
ety
)
for
i
:=
0
;
i
<
2000
;
i
++
{
fmt
.
Println
(
"sell "
,
i
)
tx
,
err
:=
ety
.
Create
(
"LimitOrder"
,
req
)
if
err
!=
nil
{
panic
(
err
)
}
go
cli
.
SendTx
(
tx
,
PrivKeyA
)
}
}
func
buy
()
{
req
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
1
,
Amount
:
types
.
Coin
,
Op
:
et
.
OpBuy
,
}
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
for
i
:=
0
;
i
<
2000
;
i
++
{
fmt
.
Println
(
"buy "
,
i
)
tx
,
err
:=
ety
.
Create
(
"LimitOrder"
,
req
)
if
err
!=
nil
{
panic
(
err
)
}
go
cli
.
SendTx
(
tx
,
PrivKeyB
)
}
}
plugin/dapp/exchange/test/exchange_test.go
0 → 100644
View file @
8cac51a7
package
test
import
(
"context"
"testing"
"github.com/33cn/plugin/plugin/dapp/exchange/executor"
"github.com/33cn/chain33/types"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
tt
"github.com/33cn/plugin/plugin/dapp/token/types"
"github.com/stretchr/testify/assert"
)
var
(
PrivKeyA
=
"0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b"
// 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
PrivKeyB
=
"0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4"
// 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
PrivKeyC
=
"0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115"
// 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
PrivKeyD
=
"0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71"
// 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
cli
Cli
orderId
int64
orderId2
int64
coin
=
"bty"
token
=
"CCNY"
)
func
init
()
{
//cli = NewExecCli()
cli
=
NewGRPCCli
(
":8802"
)
}
func
TestLimitOrder2
(
t
*
testing
.
T
)
{
req
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
4
,
Amount
:
10
*
types
.
Coin
,
Op
:
et
.
OpBuy
,
}
testLimitOrder
(
t
,
req
,
Nodes
[
0
],
PrivKeyA
)
}
func
TestLimitOrder
(
t
*
testing
.
T
)
{
//A 挂买 4x10
req
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
4
,
Amount
:
10
*
types
.
Coin
,
Op
:
et
.
OpBuy
,
}
_
,
err
:=
doLimitOrder
(
req
,
PrivKeyA
)
assert
.
Nil
(
t
,
err
)
}
func
TestOrderList
(
t
*
testing
.
T
)
{
orderList
,
err
:=
getOrderList
(
et
.
Ordered
,
Nodes
[
0
],
""
)
assert
.
Nil
(
t
,
err
)
t
.
Log
(
orderList
)
orderId
=
orderList
.
List
[
0
]
.
OrderID
}
func
TestGetOrder
(
t
*
testing
.
T
)
{
order
,
err
:=
getOrder
(
orderId
)
assert
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
int32
(
et
.
Ordered
),
order
.
Status
)
assert
.
Equal
(
t
,
10
*
types
.
Coin
,
order
.
Balance
)
}
func
TestMarketDepth
(
t
*
testing
.
T
)
{
depth
,
err
:=
getMarketDepth
(
&
et
.
QueryMarketDepth
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Op
:
et
.
OpBuy
,
})
assert
.
Nil
(
t
,
err
)
t
.
Log
(
depth
)
assert
.
Equal
(
t
,
10
*
types
.
Coin
,
depth
.
List
[
0
]
.
Amount
)
}
func
TestMatch
(
t
*
testing
.
T
)
{
//B 挂卖 4x5
req2
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
4
,
Amount
:
5
*
types
.
Coin
,
Op
:
et
.
OpSell
,
}
_
,
err
:=
doLimitOrder
(
req2
,
PrivKeyB
)
assert
.
Nil
(
t
,
err
)
orderList
,
err
:=
getOrderList
(
et
.
Completed
,
Nodes
[
1
],
""
)
assert
.
Nil
(
t
,
err
)
t
.
Log
(
orderList
)
orderId2
=
orderList
.
List
[
0
]
.
OrderID
//订单1的状态应该还是ordered
order
,
err
:=
getOrder
(
orderId
)
assert
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
int32
(
et
.
Ordered
),
order
.
Status
)
assert
.
Equal
(
t
,
5
*
types
.
Coin
,
order
.
Balance
)
//order2状态是completed
order
,
err
=
getOrder
(
orderId2
)
assert
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
int32
(
et
.
Completed
),
order
.
Status
)
//买盘还有 5
depth
,
err
:=
getMarketDepth
(
&
et
.
QueryMarketDepth
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Op
:
et
.
OpBuy
,
})
assert
.
Nil
(
t
,
err
)
t
.
Log
(
depth
)
assert
.
Equal
(
t
,
5
*
types
.
Coin
,
depth
.
List
[
0
]
.
Amount
)
}
func
TestHistoryOrderList
(
t
*
testing
.
T
)
{
historyq
:=
&
et
.
QueryHistoryOrderList
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
}
historyOrderList
,
err
:=
getHistoryOrderList
(
historyq
)
assert
.
Nil
(
t
,
err
)
t
.
Log
(
historyOrderList
)
assert
.
Equal
(
t
,
orderId2
,
historyOrderList
.
List
[
0
]
.
OrderID
)
}
func
TestRevokeOrder
(
t
*
testing
.
T
)
{
//A 撤回未完成订单
_
,
err
:=
doRevokeOrder
(
orderId
,
PrivKeyA
)
assert
.
Nil
(
t
,
err
)
//根据订单号,查询订单详情
order
,
err
:=
getOrder
(
orderId
)
assert
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
int32
(
et
.
Revoked
),
order
.
Status
)
assert
.
Equal
(
t
,
5
*
types
.
Coin
,
order
.
Balance
)
//查询市场深度,买盘应该为空
depth
,
err
:=
getMarketDepth
(
&
et
.
QueryMarketDepth
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Op
:
et
.
OpBuy
,
})
assert
.
Nil
(
t
,
depth
)
depth
,
err
=
getMarketDepth
(
&
et
.
QueryMarketDepth
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Op
:
et
.
OpSell
,
})
assert
.
Nil
(
t
,
depth
)
}
func
BenchmarkOrder
(
b
*
testing
.
B
)
{
req
:=
&
et
.
LimitOrder
{
LeftAsset
:
&
et
.
Asset
{
Symbol
:
"bty"
,
Execer
:
"coins"
},
RightAsset
:
&
et
.
Asset
{
Execer
:
"token"
,
Symbol
:
"CCNY"
},
Price
:
1
,
Amount
:
10
*
types
.
Coin
,
Op
:
et
.
OpSell
,
}
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
tx
,
_
:=
ety
.
Create
(
"LimitOrder"
,
req
)
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
cli
.
Send
(
tx
,
PrivKeyA
)
}
}
func
doLimitOrder
(
req
*
et
.
LimitOrder
,
privKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
{
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
tx
,
err
:=
ety
.
Create
(
"LimitOrder"
,
req
)
if
err
!=
nil
{
return
nil
,
err
}
return
cli
.
Send
(
tx
,
privKey
)
}
func
doRevokeOrder
(
orderID
int64
,
privKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
{
ety
:=
types
.
LoadExecutorType
(
et
.
ExchangeX
)
tx
,
err
:=
ety
.
Create
(
"RevokeOrder"
,
&
et
.
RevokeOrder
{
OrderID
:
orderID
})
if
err
!=
nil
{
return
nil
,
err
}
return
cli
.
Send
(
tx
,
privKey
)
}
func
getOrderList
(
status
int32
,
addr
string
,
primaryKey
string
)
(
*
et
.
OrderList
,
error
)
{
msg
,
err
:=
cli
.
Query
(
et
.
FuncNameQueryOrderList
,
&
et
.
QueryOrderList
{
Status
:
status
,
Address
:
addr
,
PrimaryKey
:
primaryKey
})
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
OrderList
err
=
types
.
Decode
(
msg
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
resp
,
nil
}
func
getOrder
(
orderID
int64
)
(
*
et
.
Order
,
error
)
{
msg
,
err
:=
cli
.
Query
(
et
.
FuncNameQueryOrder
,
&
et
.
QueryOrder
{
OrderID
:
orderID
})
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
Order
err
=
types
.
Decode
(
msg
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
resp
,
nil
}
func
getMarketDepth
(
query
*
et
.
QueryMarketDepth
)
(
*
et
.
MarketDepthList
,
error
)
{
msg
,
err
:=
cli
.
Query
(
et
.
FuncNameQueryMarketDepth
,
query
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
MarketDepthList
err
=
types
.
Decode
(
msg
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
resp
,
nil
}
func
getHistoryOrderList
(
query
*
et
.
QueryHistoryOrderList
)
(
*
et
.
OrderList
,
error
)
{
msg
,
err
:=
cli
.
Query
(
et
.
FuncNameQueryHistoryOrderList
,
query
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
et
.
OrderList
err
=
types
.
Decode
(
msg
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
resp
,
nil
}
func
getExcerBalance
(
addr
string
)
(
*
types
.
Account
,
error
)
{
var
addrs
[]
string
addrs
=
append
(
addrs
,
addr
)
params
:=
&
types
.
ReqBalance
{
Addresses
:
addrs
,
Execer
:
et
.
ExchangeX
,
}
accs
,
err
:=
cli
.
(
*
GRPCCli
)
.
client
.
GetBalance
(
context
.
Background
(),
params
)
if
err
!=
nil
{
return
nil
,
err
}
return
accs
.
Acc
[
0
],
nil
}
func
getExcerTokenBalance
(
addr
string
,
symbol
string
)
(
map
[
string
]
*
types
.
Account
,
error
)
{
var
addrs
[]
string
addrs
=
append
(
addrs
,
addr
)
param
:=
&
tt
.
ReqTokenBalance
{
Addresses
:
addrs
,
TokenSymbol
:
symbol
,
Execer
:
et
.
ExchangeX
,
}
msg
,
err
:=
cli
.
Query
(
"token.GetAccountTokenBalance"
,
param
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
tt
.
ReplyAccountTokenAssets
err
=
types
.
Decode
(
msg
,
&
resp
)
if
err
!=
nil
{
return
nil
,
err
}
assets
:=
make
(
map
[
string
]
*
types
.
Account
)
for
_
,
v
:=
range
resp
.
TokenAssets
{
assets
[
v
.
Symbol
]
=
v
.
Account
}
return
assets
,
nil
}
func
testLimitOrder
(
t
*
testing
.
T
,
req
*
et
.
LimitOrder
,
addr
string
,
privkey
string
)
{
accPrev
,
err
:=
getExcerBalance
(
addr
)
assert
.
Nil
(
t
,
err
)
t
.
Log
(
accPrev
)
tokenPrev
,
err
:=
getExcerTokenBalance
(
addr
,
"CCNY"
)
assert
.
Nil
(
t
,
err
)
t
.
Log
(
tokenPrev
)
_
,
err
=
doLimitOrder
(
req
,
privkey
)
assert
.
Nil
(
t
,
err
)
accAfter
,
err
:=
getExcerBalance
(
addr
)
assert
.
Nil
(
t
,
err
)
t
.
Log
(
accAfter
)
tokenAfter
,
err
:=
getExcerTokenBalance
(
addr
,
"CCNY"
)
assert
.
Nil
(
t
,
err
)
t
.
Log
(
tokenAfter
)
cost
:=
executor
.
SafeMul
(
req
.
Amount
,
req
.
Price
)
t
.
Log
(
req
.
Amount
,
req
.
Price
,
cost
)
// bty/ccny
if
req
.
Op
==
et
.
OpBuy
{
// bty
assert
.
Equal
(
t
,
accAfter
.
Balance
,
accPrev
.
Balance
)
assert
.
Equal
(
t
,
accAfter
.
Frozen
,
accPrev
.
Frozen
)
// ccny
assert
.
Equal
(
t
,
tokenAfter
[
token
]
.
Balance
,
tokenPrev
[
token
]
.
Balance
-
cost
)
assert
.
Equal
(
t
,
tokenAfter
[
token
]
.
Frozen
,
tokenPrev
[
token
]
.
Frozen
+
cost
)
}
else
{
// bty
assert
.
Equal
(
t
,
accAfter
.
Balance
,
accPrev
.
Balance
-
req
.
Amount
)
assert
.
Equal
(
t
,
accAfter
.
Frozen
,
accPrev
.
Frozen
+
req
.
Amount
)
// ccny
assert
.
Equal
(
t
,
tokenAfter
[
token
]
.
Balance
,
tokenPrev
[
token
]
.
Balance
)
assert
.
Equal
(
t
,
tokenAfter
[
token
]
.
Frozen
,
tokenPrev
[
token
]
.
Frozen
)
}
}
plugin/dapp/exchange/test/exec_cli.go
0 → 100644
View file @
8cac51a7
package
test
import
(
"log"
"time"
"github.com/33cn/chain33/common/db"
"github.com/33cn/plugin/plugin/dapp/exchange/executor"
"github.com/gogo/protobuf/proto"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util"
"github.com/33cn/chain33/client"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/queue"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
)
type
ExecCli
struct
{
ldb
db
.
KVDB
sdb
db
.
DB
height
int64
blockTime
int64
difficulty
uint64
}
var
(
Nodes
=
[]
string
{
"1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"
,
"1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR"
,
"1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k"
,
"1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
,
}
)
func
NewExecCli
()
*
ExecCli
{
dir
,
sdb
,
ldb
:=
util
.
CreateTestDB
()
log
.
Println
(
dir
)
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
executor
.
Init
(
et
.
ExchangeX
,
cfg
,
nil
)
total
:=
100
*
types
.
Coin
accountA
:=
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
Addr
:
Nodes
[
0
],
}
accountB
:=
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
Addr
:
Nodes
[
1
],
}
accountC
:=
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
Addr
:
Nodes
[
2
],
}
accountD
:=
types
.
Account
{
Balance
:
total
,
Frozen
:
0
,
Addr
:
Nodes
[
3
],
}
execAddr
:=
address
.
ExecAddress
(
et
.
ExchangeX
)
accA
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accA
.
SaveExecAccount
(
execAddr
,
&
accountA
)
accB
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accB
.
SaveExecAccount
(
execAddr
,
&
accountB
)
accC
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accC
.
SaveExecAccount
(
execAddr
,
&
accountC
)
accD
,
_
:=
account
.
NewAccountDB
(
cfg
,
"coins"
,
"bty"
,
sdb
)
accD
.
SaveExecAccount
(
execAddr
,
&
accountD
)
accA1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"token"
,
"CCNY"
,
sdb
)
accA1
.
SaveExecAccount
(
execAddr
,
&
accountA
)
accB1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"paracross"
,
"coins.bty"
,
sdb
)
accB1
.
SaveExecAccount
(
execAddr
,
&
accountB
)
accC1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"paracross"
,
"token.CCNY"
,
sdb
)
accC1
.
SaveExecAccount
(
execAddr
,
&
accountC
)
accD1
,
_
:=
account
.
NewAccountDB
(
cfg
,
"token"
,
"CCNY"
,
sdb
)
accD1
.
SaveExecAccount
(
execAddr
,
&
accountD
)
return
&
ExecCli
{
ldb
:
ldb
,
sdb
:
sdb
,
height
:
1
,
blockTime
:
time
.
Now
()
.
Unix
(),
difficulty
:
1539918074
,
}
}
func
(
c
*
ExecCli
)
Send
(
tx
*
types
.
Transaction
,
hexKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
{
var
err
error
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
tx
,
err
=
types
.
FormatTx
(
cfg
,
et
.
ExchangeX
,
tx
)
if
err
!=
nil
{
return
nil
,
err
}
tx
,
err
=
signTx
(
tx
,
hexKey
)
if
err
!=
nil
{
return
nil
,
err
}
exec
:=
executor
.
NewExchange
()
if
err
:=
exec
.
CheckTx
(
tx
,
int
(
1
));
err
!=
nil
{
return
nil
,
err
}
c
.
height
++
c
.
blockTime
+=
10
c
.
difficulty
++
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
api
,
_
:=
client
.
New
(
q
.
Client
(),
nil
)
exec
.
SetAPI
(
api
)
exec
.
SetStateDB
(
c
.
sdb
)
exec
.
SetLocalDB
(
c
.
ldb
)
exec
.
SetEnv
(
c
.
height
,
c
.
blockTime
,
c
.
difficulty
)
receipt
,
err
:=
exec
.
Exec
(
tx
,
int
(
1
))
if
err
!=
nil
{
return
nil
,
err
}
for
_
,
kv
:=
range
receipt
.
KV
{
c
.
sdb
.
Set
(
kv
.
Key
,
kv
.
Value
)
}
receiptDate
:=
&
types
.
ReceiptData
{
Ty
:
receipt
.
Ty
,
Logs
:
receipt
.
Logs
}
set
,
err
:=
exec
.
ExecLocal
(
tx
,
receiptDate
,
int
(
1
))
if
err
!=
nil
{
return
nil
,
err
}
for
_
,
kv
:=
range
set
.
KV
{
c
.
ldb
.
Set
(
kv
.
Key
,
kv
.
Value
)
}
//save to database
util
.
SaveKVList
(
c
.
sdb
,
set
.
KV
)
return
receipt
.
Logs
,
nil
}
func
(
c
*
ExecCli
)
Query
(
fn
string
,
msg
proto
.
Message
)
([]
byte
,
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
q
:=
queue
.
New
(
"channel"
)
q
.
SetConfig
(
cfg
)
api
,
_
:=
client
.
New
(
q
.
Client
(),
nil
)
exec
:=
executor
.
NewExchange
()
exec
.
SetAPI
(
api
)
exec
.
SetStateDB
(
c
.
sdb
)
exec
.
SetLocalDB
(
c
.
ldb
)
exec
.
SetEnv
(
c
.
height
,
c
.
blockTime
,
c
.
difficulty
)
r
,
err
:=
exec
.
Query
(
fn
,
types
.
Encode
(
msg
))
if
err
!=
nil
{
return
nil
,
err
}
return
types
.
Encode
(
r
),
nil
}
func
signTx
(
tx
*
types
.
Transaction
,
hexPrivKey
string
)
(
*
types
.
Transaction
,
error
)
{
signType
:=
types
.
SECP256K1
c
,
err
:=
crypto
.
New
(
types
.
GetSignName
(
""
,
signType
))
if
err
!=
nil
{
return
tx
,
err
}
bytes
,
err
:=
common
.
FromHex
(
hexPrivKey
[
:
])
if
err
!=
nil
{
return
tx
,
err
}
privKey
,
err
:=
c
.
PrivKeyFromBytes
(
bytes
)
if
err
!=
nil
{
return
tx
,
err
}
tx
.
Sign
(
int32
(
signType
),
privKey
)
return
tx
,
nil
}
plugin/dapp/exchange/test/grpc_cli.go
0 → 100644
View file @
8cac51a7
package
test
import
(
"context"
"errors"
"fmt"
"strings"
"time"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/exchange/executor"
et
"github.com/33cn/plugin/plugin/dapp/exchange/types"
"github.com/gogo/protobuf/proto"
"google.golang.org/grpc"
)
type
GRPCCli
struct
{
client
types
.
Chain33Client
}
func
NewGRPCCli
(
grpcAddr
string
)
*
GRPCCli
{
conn
,
err
:=
grpc
.
Dial
(
grpcAddr
,
grpc
.
WithInsecure
())
if
err
!=
nil
{
panic
(
err
)
}
client
:=
types
.
NewChain33Client
(
conn
)
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
executor
.
Init
(
et
.
ExchangeX
,
cfg
,
nil
)
return
&
GRPCCli
{
client
:
client
,
}
}
func
(
c
*
GRPCCli
)
Send
(
tx
*
types
.
Transaction
,
hexKey
string
)
([]
*
types
.
ReceiptLog
,
error
)
{
txHash
,
logs
,
err
:=
c
.
sendAndWaitReceipt
(
tx
,
hexKey
)
if
txHash
!=
nil
{
fmt
.
Println
(
"txHash: "
,
common
.
ToHex
(
txHash
))
}
if
err
!=
nil
{
return
nil
,
parseError
(
err
)
}
for
_
,
l
:=
range
logs
{
if
l
.
Ty
==
types
.
TyLogErr
{
return
nil
,
errors
.
New
(
string
(
l
.
Log
))
}
}
return
logs
,
nil
}
func
(
c
*
GRPCCli
)
Query
(
fn
string
,
msg
proto
.
Message
)
([]
byte
,
error
)
{
ss
:=
strings
.
Split
(
fn
,
"."
)
var
in
types
.
ChainExecutor
if
len
(
ss
)
==
2
{
in
.
Driver
=
ss
[
0
]
in
.
FuncName
=
ss
[
1
]
}
else
{
in
.
Driver
=
et
.
ExchangeX
in
.
FuncName
=
fn
}
in
.
Param
=
types
.
Encode
(
msg
)
r
,
err
:=
c
.
client
.
QueryChain
(
context
.
Background
(),
&
in
)
if
err
!=
nil
{
return
nil
,
err
}
if
!
r
.
IsOk
{
return
nil
,
errors
.
New
(
string
(
r
.
Msg
))
}
return
r
.
Msg
,
nil
}
// 发送交易并等待执行结果
// 如果交易非法,返回错误信息
// 如果交易执行成功,返回 交易哈希、回报
func
(
c
*
GRPCCli
)
sendAndWaitReceipt
(
tx
*
types
.
Transaction
,
hexKey
string
)
(
txHash
[]
byte
,
logs
[]
*
types
.
ReceiptLog
,
err
error
)
{
r
,
err
:=
c
.
SendTx
(
tx
,
hexKey
)
if
err
!=
nil
{
// rpc error: code = Unknown desc = ErrNotBank
return
nil
,
nil
,
err
}
if
!
r
.
IsOk
{
return
nil
,
nil
,
errors
.
New
(
string
(
r
.
Msg
))
}
time
.
Sleep
(
time
.
Second
)
d
,
_
:=
c
.
client
.
QueryTransaction
(
context
.
Background
(),
&
types
.
ReqHash
{
Hash
:
r
.
Msg
})
return
r
.
Msg
,
d
.
Receipt
.
Logs
,
nil
}
func
(
c
*
GRPCCli
)
SendTx
(
tx
*
types
.
Transaction
,
hexKey
string
)
(
reply
*
types
.
Reply
,
err
error
)
{
cfg
:=
types
.
NewChain33Config
(
types
.
GetDefaultCfgstring
())
cfg
.
SetTitleOnlyForTest
(
"chain33"
)
tx
,
err
=
types
.
FormatTx
(
cfg
,
et
.
ExchangeX
,
tx
)
if
err
!=
nil
{
return
nil
,
err
}
tx
,
err
=
signTx
(
tx
,
hexKey
)
if
err
!=
nil
{
return
nil
,
err
}
return
c
.
client
.
SendTransaction
(
context
.
Background
(),
tx
)
}
func
parseError
(
err
error
)
error
{
// rpc error: code = Unknown desc = ErrNotBank
str
:=
err
.
Error
()
sep
:=
"desc = "
i
:=
strings
.
Index
(
str
,
sep
)
if
i
!=
-
1
{
return
errors
.
New
(
str
[
i
+
len
(
sep
)
:
])
}
return
err
}
plugin/dapp/exchange/test/prepare.sh
0 → 100755
View file @
8cac51a7
#!/usr/bin/env bash
BUILD
=
$(
cd
`
dirname
$0
`
&&
cd
../../../../build
&&
pwd
)
echo
"
$BUILD
"
cd
$BUILD
seed
=
$(
./chain33-cli seed generate
-l
0
)
echo
$seed
./chain33-cli seed save
-p
bty123456
-s
"
$seed
"
sleep
1
./chain33-cli wallet unlock
-p
bty123456
sleep
1
./chain33-cli account list
## account
#genesis -- 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli account import_key
-k
3990969DF92A5914F7B71EEB9A4E58D6E255F32BF042FEA5318FC8B3D50EE6E8
-l
genesis
#A -- 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
./chain33-cli account import_key
-k
0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
-l
A
#B -- 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
./chain33-cli account import_key
-k
0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
-l
B
#C -- 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
./chain33-cli account import_key
-k
0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115
-l
C
#D -- 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
./chain33-cli account import_key
-k
0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71
-l
D
## config token
./chain33-cli send config config_tx
-c
token-finisher
-o
add
-v
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
./chain33-cli config query_config
-k
token-finisher
./chain33-cli send config config_tx
-c
token-blacklist
-o
add
-v
BTY
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
./chain33-cli config query_config
-k
token-blacklist
./chain33-cli send token precreate
-f
0.001
-i
"test ccny"
-n
"ccny"
-a
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-p
0
-s
CCNY
-t
100000000
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
./chain33-cli token get_precreated
./chain33-cli send token finish
-s
CCNY
-f
0.001
-a
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
sleep
1
./chain33-cli token get_finish_created
./chain33-cli token token_balance
-a
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
-s
CCNY
-e
token
## transfer bty
./chain33-cli send coins transfer
-a
10000
-t
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send coins transfer
-a
10000
-t
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send coins transfer
-a
10000
-t
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send coins transfer
-a
10000
-t
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli account list
## send bty to execer
./chain33-cli send coins send_exec
-e
exchange
-a
10000
-k
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
./chain33-cli send coins send_exec
-e
exchange
-a
10000
-k
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
./chain33-cli send coins send_exec
-e
exchange
-a
10000
-k
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
./chain33-cli send coins send_exec
-e
exchange
-a
10000
-k
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
echo
"account balance in execer"
./chain33-cli account balance
-e
exchange
-a
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
./chain33-cli account balance
-e
exchange
-a
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
./chain33-cli account balance
-e
exchange
-a
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
./chain33-cli account balance
-e
exchange
-a
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
##transfer token
./chain33-cli send token transfer
-a
10000000
-s
CCNY
-t
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send token transfer
-a
10000000
-s
CCNY
-t
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send token transfer
-a
10000000
-s
CCNY
-t
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
./chain33-cli send token transfer
-a
10000000
-s
CCNY
-t
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
-k
1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
## send token to excer
./chain33-cli send token send_exec
-a
10000000
-e
exchange
-s
CCNY
-k
1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
./chain33-cli send token send_exec
-a
10000000
-e
exchange
-s
CCNY
-k
1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
./chain33-cli send token send_exec
-a
10000000
-e
exchange
-s
CCNY
-k
1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k
./chain33-cli send token send_exec
-a
10000000
-e
exchange
-s
CCNY
-k
1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs
echo
"token balance in execer"
./chain33-cli token token_balance
-e
exchange
-s
CCNY
-a
"1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
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