Unverified Commit ed28512b authored by vipwzw's avatar vipwzw Committed by GitHub

Merge pull request #786 from mdj33/issue776_relay_support_token

relay 支持多资产兑换
parents e0449943 0e86b911
......@@ -148,6 +148,9 @@ function para_transfer() {
main_transfer2account "1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj"
main_transfer2account "1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH" 10
main_transfer2account "1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB" 10
#relay test
main_transfer2account "1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3" 10
main_transfer2account "1EZKahMRfoMiKp1BewjWrQWoaJ9kmC4hum" 10
#relay rpc test
para_transfer2account "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
para_transfer2account "1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY"
......@@ -290,42 +293,49 @@ function token_create() {
fi
}
#1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3 also be used in relay rpc_test
function token_transfer() {
echo "=========== # 2.token transfer ============="
hash=$(${1} send token transfer -a 11 -s GD -t 1GGF8toZd96wCnfJngTwXZnWCBdWHYYvjw -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
hash=$(${1} send token transfer -a 100 -s GD -t 1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3 -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
hash2=$(${1} send token transfer -a 100 -s GD -t 1EZKahMRfoMiKp1BewjWrQWoaJ9kmC4hum -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
echo "${hash}"
echo "${hash2}"
query_tx "${1}" "${hash}"
${1} token balance -a 1GGF8toZd96wCnfJngTwXZnWCBdWHYYvjw -e token -s GD
balance=$(${1} token balance -a 1GGF8toZd96wCnfJngTwXZnWCBdWHYYvjw -e token -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "11.0000" ]; then
${1} token balance -a 1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3 -e token -s GD
balance=$(${1} token balance -a 1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3 -e token -s GD | jq -r '.[]|.balance')
balance2=$(${1} token balance -a 1EZKahMRfoMiKp1BewjWrQWoaJ9kmC4hum -e token -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "100.0000" ] || [ "${balance2}" != "100.0000" ]; then
echo "wrong para token transfer, should be 11.0000"
exit 1
fi
echo "=========== # 3.token send exec ============="
hash=$(${1} send token send_exec -a 11 -s GD -e paracross -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
hash=$(${1} send token send_exec -a 100 -s GD -e relay -k 0x22968d29c6de695381a8719ef7bf00e2edb6cce500bb59a4fc73c41887610962)
hash2=$(${1} send token send_exec -a 100 -s GD -e relay -k ec9162ea5fc2f473ab8240619a0a0f495ba9e9e5d4d9c434b8794a68280236c4)
echo "${hash}"
echo "${hash2}"
query_tx "${1}" "${hash}"
# $ ./build/chain33-cli exec addr -e user.p.para.paracross
# 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii
${1} token balance -a 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii -e token -s GD
balance=$(${1} token balance -a 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii -e token -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "11.0000" ]; then
echo "wrong para token send exec, should be 11.0000"
#user.p.para.relay addr
# 1464s4B8HbPdUZNR74EBWSH8QLGYgpjr2q
${1} token balance -a 1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3 -e token -s GD
balance=$(${1} token balance -a 1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3 -e relay -s GD | jq -r '.[]|.balance')
balance2=$(${1} token balance -a 1EZKahMRfoMiKp1BewjWrQWoaJ9kmC4hum -e relay -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "100.0000" ] || [ "${balance2}" != "100.0000" ]; then
echo "wrong para token send exec, should be 100.0000, balance=$balance,balance1=$balance2"
exit 1
fi
echo "=========== # 4.token withdraw ============="
hash=$(${1} send token withdraw -a 11 -s GD -e paracross -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
hash=$(${1} send token withdraw -a 20 -s GD -e relay -k 0x22968d29c6de695381a8719ef7bf00e2edb6cce500bb59a4fc73c41887610962)
echo "${hash}"
query_tx "${1}" "${hash}"
${1} token balance -a 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii -e token -s GD
balance=$(${1} token balance -a 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii -e token -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "0.0000" ]; then
echo "wrong para token withdraw, should be 0.0000"
${1} token balance -a 1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3 -e relay -s GD
balance=$(${1} token balance -a 1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3 -e relay -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "80.0000" ]; then
echo "wrong para token withdraw, should be 80.0000"
exit 1
fi
}
......
......@@ -4,14 +4,14 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*}
#OUT_DIR="${1}/$strapp"
#SRC_RELAYD=github.com/33cn/plugin/plugin/dapp/relay/cmd/relayd
#FLAG=$2
#
## shellcheck disable=SC2086,1072
#go build -i ${FLAG} -v -o "${OUT_DIR}/relayd" "${SRC_RELAYD}"
#cp ./relayd/relayd.toml "${OUT_DIR}/relayd.toml"
#cp ./build/* "${OUT_DIR}"
OUT_DIR="${1}/$strapp"
SRC_RELAYD=github.com/33cn/plugin/plugin/dapp/relay/cmd/relayd
FLAG=$2
# shellcheck disable=SC2086,1072
go build -i ${FLAG} -v -o "${OUT_DIR}/relayd" "${SRC_RELAYD}"
cp ./relayd/relayd.toml "${OUT_DIR}/relayd.toml"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}"
......
This diff is collapsed.
......@@ -10,8 +10,8 @@ syncSetup = 100
syncSetupCount = 10
[auth]
# test private key
privateKey = "4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01"
# test private key 1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3
privateKey = "22968d29c6de695381a8719ef7bf00e2edb6cce500bb59a4fc73c41887610962"
publicKey = ""
address = ""
......
......@@ -344,7 +344,7 @@ func (r *Relayd) dealOrder() {
for _, value := range result.GetOrders() {
// TODO save db ???
tx, err := r.btcClient.GetTransaction(value.CoinTxHash)
tx, err := r.btcClient.GetTransaction(value.XTxHash)
if err != nil {
log.Error("dealOrder", "dealOrder GetTransaction error: ", err)
continue
......
......@@ -11,6 +11,9 @@ import (
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/types"
typesmocks "github.com/33cn/chain33/types/mocks"
types2 "github.com/33cn/plugin/plugin/dapp/relay/types"
"github.com/stretchr/testify/mock"
)
func TestGeneratePrivateKey(t *testing.T) {
......@@ -28,3 +31,27 @@ func TestGeneratePrivateKey(t *testing.T) {
t.Log("publick key: ", common.ToHex(key.PubKey().Bytes()))
t.Log(" address: ", address.PubKeyToAddress(key.PubKey().Bytes()))
}
func TestDealOrder(t *testing.T) {
grpcClient := &typesmocks.Chain33Client{}
relayd := &Relayd{}
relayd.client33 = &Client33{}
relayd.client33.Chain33Client = grpcClient
relayd.btcClient = &btcdClient{
connConfig: nil,
chainParams: mainNetParams.Params,
reconnectAttempts: 3,
enqueueNotification: make(chan interface{}),
dequeueNotification: make(chan interface{}),
currentBlock: make(chan *blockStamp),
quit: make(chan struct{}),
}
relayorder := &types2.RelayOrder{Id: string("id"), XTxHash: "hash"}
rst := &types2.QueryRelayOrderResult{Orders: []*types2.RelayOrder{relayorder}}
reply := &types.Reply{}
reply.Msg = types.Encode(rst)
grpcClient.On("QueryChain", mock.Anything, mock.Anything).Return(reply, nil).Once()
grpcClient.On("SendTransaction", mock.Anything, mock.Anything).Return(nil, nil).Once()
relayd.dealOrder()
}
......@@ -5,20 +5,24 @@ source ../dapp-test-common.sh
MAIN_HTTP=""
relay_parallel_exec=""
relay_CreateRawRelaySaveBTCHeadTx() {
local req='{"method":"relay.CreateRawRelaySaveBTCHeadTx","params":[{"hash":"5e7d9c599cd040ec2ba53f4dee28028710be8c135e779f65c56feadaae34c3f2","height":10,"version":536870912,"merkleRoot":"ab91cd4160e1379c337eee6b7a4bdbb7399d70268d86045aba150743c00c90b6","time":1530862108,"nonce":0,"bits":545259519,"previousHash":"604efe53975ab06cad8748fd703ad5bc960e8b752b2aae98f0f871a4a05abfc7","isReset":true}]}'
local req='{"method":"Chain33.CreateTransaction","params":[{"execer":"'"${relay_parallel_exec}"'","actionName":"BtcHeaders","payload":{"btcHeader":[{"hash":"5e7d9c599cd040ec2ba53f4dee28028710be8c135e779f65c56feadaae34c3f2","height":10,"version":536870912,"merkleRoot":"ab91cd4160e1379c337eee6b7a4bdbb7399d70268d86045aba150743c00c90b6","time":1530862108,"nonce":0,"bits":545259519,"previousHash":"604efe53975ab06cad8748fd703ad5bc960e8b752b2aae98f0f871a4a05abfc7","isReset":true}]}}]}'
chain33_Http "$req" ${MAIN_HTTP} '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
chain33_SignAndSendTx "$RETURN_RESP" "0x22968d29c6de695381a8719ef7bf00e2edb6cce500bb59a4fc73c41887610962" "${MAIN_HTTP}"
}
relay_CreateRawRelaySaveBTCHeadTx_11() {
local req='{"method":"relay.CreateRawRelaySaveBTCHeadTx","params":[{"hash":"7b7a4a9b49db5a1162be515d380cd186e98c2bf0bb90f1145485d7c43343fc7c","height":11,"version":536870912,"merkleRoot":"cfa9b66696aea63b7266ffaa1cb4b96c8dd6959eaabf2eb14173f4adaa551f6f","time":1530862108,"nonce":1,"bits":545259519,"previousHash":"5e7d9c599cd040ec2ba53f4dee28028710be8c135e779f65c56feadaae34c3f2","isReset":false}]}'
local req='{"method":"Chain33.CreateTransaction","params":[{"execer":"'"${relay_parallel_exec}"'","actionName":"BtcHeaders","payload":{"btcHeader":[{"hash":"7b7a4a9b49db5a1162be515d380cd186e98c2bf0bb90f1145485d7c43343fc7c","height":11,"version":536870912,"merkleRoot":"cfa9b66696aea63b7266ffaa1cb4b96c8dd6959eaabf2eb14173f4adaa551f6f","time":1530862108,"nonce":1,"bits":545259519,"previousHash":"5e7d9c599cd040ec2ba53f4dee28028710be8c135e779f65c56feadaae34c3f2","isReset":false}]}}]}'
chain33_Http "$req" ${MAIN_HTTP} '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
chain33_SignAndSendTx "$RETURN_RESP" "0x22968d29c6de695381a8719ef7bf00e2edb6cce500bb59a4fc73c41887610962" "${MAIN_HTTP}"
}
relay_CreateRawRelayOrderTx() {
local req='{"method":"relay.CreateRawRelayOrderTx","params":[{"operation":0,"coin":"BTC","amount":299000000,"addr":"1Am9UTGfdnxabvcywYG2hvzr6qK8T3oUZT","btyAmount":1000000000,"coinWaits":6}]}'
localCoinSymbol="$1"
localCoinExec="$2"
local req='{"method":"Chain33.CreateTransaction","params":[{"execer":"'"${relay_parallel_exec}"'","actionName":"Create","payload":{"operation":0,"xCoin":"BTC","xAmount":299000000,"xAddr":"1Am9UTGfdnxabvcywYG2hvzr6qK8T3oUZT","localCoinAmount":1000000000,"localCoinSymbol":"'"$localCoinSymbol"'","localCoinExec":"'"$localCoinExec"'","xBlockWaits":6}}]}'
chain33_Http "$req" ${MAIN_HTTP} '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
chain33_SignAndSendTx "$RETURN_RESP" "0x22968d29c6de695381a8719ef7bf00e2edb6cce500bb59a4fc73c41887610962" "${MAIN_HTTP}"
}
......@@ -33,7 +37,7 @@ relay_CreateRawRelayAcceptTx() {
exit 1
fi
local req='{"method":"relay.CreateRawRelayAcceptTx","params":[{"orderId":"'"$id"'","coinAddr":"1Am9UTGfdnxabvcywYG2hvzr6qK8T3oUZT"}]}'
local req='{"method":"Chain33.CreateTransaction","params":[{"execer":"'"${relay_parallel_exec}"'","actionName":"Accept","payload":{"orderId":"'"$id"'","xAddr":"1Am9UTGfdnxabvcywYG2hvzr6qK8T3oUZT"}}]}'
chain33_Http "$req" ${MAIN_HTTP} '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
chain33_SignAndSendTx "$RETURN_RESP" "0xec9162ea5fc2f473ab8240619a0a0f495ba9e9e5d4d9c434b8794a68280236c4" "${MAIN_HTTP}"
}
......@@ -48,7 +52,7 @@ relay_CreateRawRelayRevokeTx() {
exit 1
fi
local req='{"method":"relay.CreateRawRelayRevokeTx","params":[{"orderId":"'"$id"'","target":0,"action":1}]}'
local req='{"method":"Chain33.CreateTransaction","params":[{"execer":"'"${relay_parallel_exec}"'","actionName":"Revoke","payload":{"orderId":"'"$id"'","target":0,"action":1}}]}'
chain33_Http "$req" ${MAIN_HTTP} '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
chain33_SignAndSendTx "$RETURN_RESP" "0x22968d29c6de695381a8719ef7bf00e2edb6cce500bb59a4fc73c41887610962" "${MAIN_HTTP}"
}
......@@ -63,7 +67,7 @@ relay_CreateRawRelayConfirmTx() {
exit 1
fi
local req='{"method":"relay.CreateRawRelayConfirmTx","params":[{"orderId":"'"$id"'","rawTx":"6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4"}]}'
local req='{"method":"Chain33.CreateTransaction","params":[{"execer":"'"${relay_parallel_exec}"'","actionName":"ConfirmTx","payload":{"orderId":"'"$id"'","txHash":"6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4"}}]}'
chain33_Http "$req" ${MAIN_HTTP} '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
chain33_SignAndSendTx "$RETURN_RESP" "0xec9162ea5fc2f473ab8240619a0a0f495ba9e9e5d4d9c434b8794a68280236c4" "${MAIN_HTTP}"
}
......@@ -76,7 +80,7 @@ query_GetRelayOrderByStatus() {
query_GetSellRelayOrder() {
local req='{"method":"Chain33.Query", "params":[{"execer":"relay","funcName":"GetSellRelayOrder","payload":{"addr":"1G5Cjy8LuQex2fuYv3gzb7B8MxAnxLEqt3","status":"pending","coins":["BTC"],"pageNumber":0,"pageSize":0}}]}'
resok='(.error|not) and (.result.relayorders[0].status == "pending") and (.result.relayorders[0].coinOperation == 0) and (.result.relayorders[0].id != null)'
resok='(.error|not) and (.result.relayorders[0].status == "pending") and (.result.relayorders[0].operation == 0) and (.result.relayorders[0].id != null)'
chain33_Http "$req" ${MAIN_HTTP} "$resok" "$FUNCNAME"
}
......@@ -100,8 +104,10 @@ init() {
echo "ipara=$ispara"
local relay_addr=""
if [ "$ispara" == true ]; then
relay_parallel_exec="user.p.para.relay"
relay_addr=$(curl -ksd '{"method":"Chain33.ConvertExectoAddr","params":[{"execname":"user.p.para.relay"}]}' ${MAIN_HTTP} | jq -r ".result")
else
relay_parallel_exec="relay"
relay_addr=$(curl -ksd '{"method":"Chain33.ConvertExectoAddr","params":[{"execname":"relay"}]}' ${MAIN_HTTP} | jq -r ".result")
fi
echo "relayaddr=$relay_addr"
......@@ -146,7 +152,13 @@ function run_testcases() {
relay_CreateRawRelaySaveBTCHeadTx
query_GetBTCHeaderCurHeight
ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")')
if [ "$ispara" == true ]; then
relay_CreateRawRelayOrderTx "GD"
else
relay_CreateRawRelayOrderTx
fi
query_GetSellRelayOrder
query_GetRelayOrderByStatus "pending"
......
......@@ -36,7 +36,6 @@ func RelayCmd() *cobra.Command {
CreateRawRelayAcceptTxCmd(),
CreateRawRevokeTxCmd(),
CreateRawRelayConfirmTxCmd(),
CreateRawRelayBtcHeaderCmd(),
)
return cmd
......@@ -302,12 +301,12 @@ func parseRelayOrders(res ty.ReplyRelayOrders) {
show.OrderID = order.Id
show.Status = order.Status.String()
show.Creator = order.CreaterAddr
show.CoinOperation = ty.RelayOrderOperation[order.CoinOperation]
show.Amount = strconv.FormatFloat(float64(order.Amount)/float64(types.Coin), 'f', 4, 64)
show.Coin = order.Coin
show.CoinAddr = order.CoinAddr
show.CoinAmount = strconv.FormatFloat(float64(order.CoinAmount)/float64(types.Coin), 'f', 4, 64)
show.CoinWaits = order.CoinWaits
show.CoinOperation = order.Operation
show.Amount = strconv.FormatFloat(float64(order.LocalCoinAmount)/float64(types.Coin), 'f', 4, 64)
show.Coin = order.XCoin
show.CoinAddr = order.XAddr
show.CoinAmount = strconv.FormatFloat(float64(order.XAmount)/float64(types.Coin), 'f', 4, 64)
show.CoinWaits = order.XBlockWaits
show.CreateTime = order.CreateTime
show.AcceptAddr = order.AcceptAddr
show.AcceptTime = order.AcceptTime
......@@ -315,6 +314,8 @@ func parseRelayOrders(res ty.ReplyRelayOrders) {
show.FinishTime = order.FinishTime
show.FinishTxHash = order.FinishTxHash
show.Height = order.Height
show.LocalCoinExec = order.LocalCoinExec
show.LocalCoinSym = order.LocalCoinSymbol
data, err := json.MarshalIndent(show, "", " ")
if err != nil {
......@@ -372,7 +373,7 @@ func addExchangeFlags(cmd *cobra.Command) {
}
func relayOrder(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
oper, _ := cmd.Flags().GetUint32("operation")
coin, _ := cmd.Flags().GetString("coin")
coinamount, _ := cmd.Flags().GetFloat64("coin_amount")
......@@ -389,15 +390,35 @@ func relayOrder(cmd *cobra.Command, args []string) {
params := &ty.RelayCreate{
Operation: oper,
Amount: coinUInt64 * 1e4,
Coin: coin,
Addr: coinaddr,
CoinWaits: coinwait,
BtyAmount: btyUInt64 * 1e4,
XAmount: coinUInt64 * 1e4,
XCoin: coin,
XAddr: coinaddr,
XBlockWaits: coinwait,
LocalCoinAmount: btyUInt64 * 1e4,
}
payLoad, err := json.Marshal(params)
if err != nil {
return
}
createTx(cmd, payLoad, "Create")
}
func createTx(cmd *cobra.Command, payLoad []byte, action string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
pm := &rpctypes.CreateTxIn{
Execer: cfg.ExecName(ty.RelayX),
ActionName: action,
Payload: payLoad,
}
var res string
ctx := jsonclient.NewRPCCtx(rpcLaddr, "relay.CreateRawRelayOrderTx", params, &res)
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", pm, &res)
ctx.RunWithoutMarshal()
}
......@@ -424,7 +445,6 @@ func addRelayAcceptFlags(cmd *cobra.Command) {
}
func relayAccept(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
orderID, _ := cmd.Flags().GetString("order_id")
coinaddr, _ := cmd.Flags().GetString("coin_addr")
coinwait, _ := cmd.Flags().GetUint32("coin_wait")
......@@ -435,12 +455,16 @@ func relayAccept(cmd *cobra.Command, args []string) {
params := &ty.RelayAccept{
OrderId: orderID,
CoinAddr: coinaddr,
CoinWaits: coinwait,
XAddr: coinaddr,
XBlockWaits: coinwait,
}
var res string
ctx := jsonclient.NewRPCCtx(rpcLaddr, "relay.CreateRawRelayAcceptTx", params, &res)
ctx.RunWithoutMarshal()
payLoad, err := json.Marshal(params)
if err != nil {
return
}
createTx(cmd, payLoad, "Accept")
}
// CreateRawRevokeTxCmd revoke order
......@@ -467,7 +491,6 @@ func addRevokeFlags(cmd *cobra.Command) {
}
func relayRevoke(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
orderID, _ := cmd.Flags().GetString("order_id")
target, _ := cmd.Flags().GetUint32("target")
act, _ := cmd.Flags().GetUint32("action")
......@@ -477,9 +500,13 @@ func relayRevoke(cmd *cobra.Command, args []string) {
Target: target,
Action: act,
}
var res string
ctx := jsonclient.NewRPCCtx(rpcLaddr, "relay.CreateRawRelayRevokeTx", params, &res)
ctx.RunWithoutMarshal()
payLoad, err := json.Marshal(params)
if err != nil {
return
}
createTx(cmd, payLoad, "Revoke")
}
// CreateRawRelayConfirmTxCmd confirm tx
......@@ -503,7 +530,6 @@ func addConfirmFlags(cmd *cobra.Command) {
}
func relayConfirm(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
orderID, _ := cmd.Flags().GetString("order_id")
txHash, _ := cmd.Flags().GetString("tx_hash")
......@@ -511,56 +537,10 @@ func relayConfirm(cmd *cobra.Command, args []string) {
OrderId: orderID,
TxHash: txHash,
}
var res string
ctx := jsonclient.NewRPCCtx(rpcLaddr, "relay.CreateRawRelayConfirmTx", params, &res)
ctx.RunWithoutMarshal()
}
// CreateRawRelayBtcHeaderCmd save btc header from cli
func CreateRawRelayBtcHeaderCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "save_header",
Short: "save BTC header",
Run: relaySaveBtcHead,
}
addSaveBtcHeadFlags(cmd)
return cmd
}
func addSaveBtcHeadFlags(cmd *cobra.Command) {
cmd.Flags().StringP("block_hash", "b", "", "block hash")
cmd.MarkFlagRequired("block_hash")
cmd.Flags().StringP("pre_hash", "p", "", "previous block hash")
cmd.MarkFlagRequired("pre_hash")
cmd.Flags().StringP("merkle_root", "m", "", "merkle root")
cmd.MarkFlagRequired("merkle_root")
cmd.Flags().Uint64P("height", "t", 0, "block height")
cmd.MarkFlagRequired("height")
cmd.Flags().Int32P("flag", "g", 0, "reset height and save from current height")
}
func relaySaveBtcHead(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
blockhash, _ := cmd.Flags().GetString("block_hash")
prehash, _ := cmd.Flags().GetString("pre_hash")
merkleroot, _ := cmd.Flags().GetString("merkle_root")
height, _ := cmd.Flags().GetUint64("height")
flag, _ := cmd.Flags().GetInt32("flag")
params := &ty.BtcHeader{
Hash: blockhash,
PreviousHash: prehash,
MerkleRoot: merkleroot,
Height: height,
IsReset: flag == 1,
payLoad, err := json.Marshal(params)
if err != nil {
return
}
var res string
ctx := jsonclient.NewRPCCtx(rpcLaddr, "relay.CreateRawRelaySaveBTCHeadTx", params, &res)
ctx.RunWithoutMarshal()
createTx(cmd, payLoad, "ConfirmTx")
}
......@@ -9,7 +9,7 @@ type relayOrder2Show struct {
Status string `json:"status"`
Creator string `json:"address"`
Amount string `json:"amount"`
CoinOperation string `json:"coinoperation"`
CoinOperation uint32 `json:"coinoperation"`
Coin string `json:"coin"`
CoinAmount string `json:"coinamount"`
CoinAddr string `json:"coinaddr"`
......@@ -21,4 +21,6 @@ type relayOrder2Show struct {
FinishTime int64 `json:"finishtime"`
FinishTxHash string `json:"finishtxhash"`
Height int64 `json:"height"`
LocalCoinExec string `json:"localCoinExec"`
LocalCoinSym string `json:"localCoinSym"`
}
......@@ -7,6 +7,8 @@ package executor
import (
"fmt"
"strings"
ty "github.com/33cn/plugin/plugin/dapp/relay/types"
)
......@@ -46,25 +48,25 @@ func calcBtcHeaderKeyHeightList(height int64) []byte {
func calcOrderKeyStatus(order *ty.RelayOrder, status int32) []byte {
key := fmt.Sprintf(relayOrderSCAIH+"%d:%s:%s:%s:%d",
status, order.Coin, order.CreaterAddr, order.Id, order.Height)
status, order.XCoin, order.CreaterAddr, order.Id, order.Height)
return []byte(key)
}
func calcOrderKeyCoin(order *ty.RelayOrder, status int32) []byte {
key := fmt.Sprintf(relayOrderCSAIH+"%s:%d:%s:%s:%d",
order.Coin, status, order.CreaterAddr, order.Id, order.Height)
order.XCoin, status, order.CreaterAddr, order.Id, order.Height)
return []byte(key)
}
func calcOrderKeyAddrStatus(order *ty.RelayOrder, status int32) []byte {
key := fmt.Sprintf(relayOrderASCIH+"%s:%d:%s:%s:%d",
order.CreaterAddr, status, order.Coin, order.Id, order.Height)
order.CreaterAddr, status, order.XCoin, order.Id, order.Height)
return []byte(key)
}
func calcOrderKeyAddrCoin(order *ty.RelayOrder, status int32) []byte {
key := fmt.Sprintf(relayOrderACSIH+"%s:%s:%d:%s:%d",
order.CreaterAddr, order.Coin, status, order.Id, order.Height)
order.CreaterAddr, order.XCoin, status, order.Id, order.Height)
return []byte(key)
}
......@@ -90,7 +92,7 @@ func calcOrderPrefixAddr(addr string) []byte {
func calcAcceptKeyAddr(order *ty.RelayOrder, status int32) []byte {
if order.AcceptAddr != "" {
return []byte(fmt.Sprintf(relayBuyOrderACSIH+"%s:%s:%d:%s:%d",
order.AcceptAddr, order.Coin, status, order.Id, order.Height))
order.AcceptAddr, order.XCoin, status, order.Id, order.Height))
}
return nil
......@@ -111,3 +113,9 @@ func calcRelayOrderID(hash string) string {
func calcCoinHash(hash string) string {
return coinHashPrefix + hash
}
func getRealTxHashID(id string) string {
ids := strings.Split(id, "-")
return ids[len(ids)-1]
}
......@@ -133,6 +133,10 @@ func (r *relay) getRelayOrderReply(OrderIDs [][]byte) (types.Message, error) {
orderIDGot[string(orderID)] = true
}
}
//get remove mavl-xx- prefix
for _, order := range reply.Relayorders {
order.Id = getRealTxHashID(order.Id)
}
return &reply, nil
}
......@@ -142,7 +146,7 @@ func insertOrderDescending(toBeInserted *ty.RelayOrder, orders []*ty.RelayOrder)
} else {
index := len(orders)
for i, element := range orders {
if toBeInserted.Amount >= element.Amount {
if toBeInserted.LocalCoinAmount >= element.LocalCoinAmount {
index = i
break
}
......
......@@ -124,10 +124,10 @@ func (s *suiteRelay) testExecDelLocal(tx *types.Transaction, receipt *types.Rece
func (s *suiteRelay) TestExec_1() {
order := &ty.RelayCreate{
Operation: ty.RelayOrderSell,
Coin: "BTC",
Amount: 0.299 * 1e8,
Addr: addrBtc,
BtyAmount: 200 * 1e8,
XCoin: "BTC",
XAmount: 0.299 * 1e8,
XAddr: addrBtc,
LocalCoinAmount: 200 * 1e8,
}
sell := &ty.RelayAction{
......@@ -156,10 +156,10 @@ func (s *suiteRelay) TestExec_1() {
var log ty.ReceiptRelayLog
types.Decode(receipt.Logs[len(receipt.Logs)-1].Log, &log)
s.Equal("200.0000", log.TxAmount)
s.Equal(uint64(10), log.CoinHeight)
s.Equal("200.0000", log.LocalCoinAmount)
s.Equal(uint64(10), log.XHeight)
s.orderID = log.OrderId
s.orderID = getRealTxHashID(log.OrderId)
//s.testExecLocal(tx, receipt)
//s.testExecDelLocal(tx, receipt)
......@@ -170,7 +170,7 @@ func (s *suiteRelay) TestExec_1() {
func (s *suiteRelay) TestExec_2() {
order := &ty.RelayAccept{
OrderId: s.orderID,
CoinAddr: addrBtc,
XAddr: addrBtc,
}
sell := &ty.RelayAction{
......@@ -197,8 +197,8 @@ func (s *suiteRelay) TestExec_2() {
var log ty.ReceiptRelayLog
types.Decode(receipt.Logs[len(receipt.Logs)-1].Log, &log)
s.Equal("200.0000", log.TxAmount)
s.Equal(uint64(20), log.CoinHeight)
s.Equal("200.0000", log.LocalCoinAmount)
s.Equal(uint64(20), log.XHeight)
s.Equal(ty.RelayOrderStatus_locking.String(), log.CurStatus)
}
......@@ -233,8 +233,8 @@ func (s *suiteRelay) TestExec_3() {
var log ty.ReceiptRelayLog
types.Decode(receipt.Logs[len(receipt.Logs)-1].Log, &log)
s.Equal("200.0000", log.TxAmount)
s.Equal(uint64(30), log.CoinHeight)
s.Equal("200.0000", log.LocalCoinAmount)
s.Equal(uint64(30), log.XHeight)
s.Equal(ty.RelayOrderStatus_confirming.String(), log.CurStatus)
}
......@@ -319,45 +319,15 @@ func (s *suiteRelay) TestExec_9_QryStatus1() {
}
var OrderIds [][]byte
OrderIds = append(OrderIds, []byte(s.orderID))
OrderIds = append(OrderIds, []byte(calcRelayOrderID(s.orderID)))
s.kvdb.On("List", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(OrderIds, nil).Once()
msg, err := s.relay.Query_GetRelayOrderByStatus(addrCoins)
s.Nil(err)
//s.T().Log(msg.String())
s.T().Log(msg.String())
s.Contains(msg.String(), "status:finished")
//s.Equal(ty.RelayOrderStatus_finished,)
}
func (s *suiteRelay) TestExec_9_QryStatus2() {
addrCoins := &ty.ReqRelayAddrCoins{
Addr: addrFrom,
//Status: ty.RelayOrderStatus_finished,
Coins: []string{"BTC"},
}
var OrderIds [][]byte
OrderIds = append(OrderIds, []byte(s.orderID))
s.kvdb.On("List", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(OrderIds, nil).Once()
msg, err := s.relay.Query_GetSellRelayOrder(addrCoins)
s.Nil(err)
s.Contains(msg.String(), "status:finished")
}
func (s *suiteRelay) TestExec_9_QryStatus3() {
addrCoins := &ty.ReqRelayAddrCoins{
Addr: addrTo,
//Status: ty.RelayOrderStatus_finished,
Coins: []string{"BTC"},
}
var OrderIds [][]byte
OrderIds = append(OrderIds, []byte(s.orderID))
s.kvdb.On("List", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(OrderIds, nil).Once()
msg, err := s.relay.Query_GetBuyRelayOrder(addrCoins)
s.Nil(err)
s.Contains(msg.String(), "status:finished")
}
func (s *suiteRelay) TestExec_9_QryStatus4() {
addrCoins := &ty.ReqRelayBtcHeaderHeightList{
ReqHeight: 12,
......
......@@ -197,7 +197,7 @@ func (b *btcStore) getMerkleRootFromHeader(blockhash string) (string, error) {
func (b *btcStore) verifyBtcTx(verify *ty.RelayVerify, order *ty.RelayOrder) error {
var foundtx bool
for _, outtx := range verify.GetTx().GetVout() {
if outtx.Address == order.CoinAddr && outtx.Value >= order.CoinAmount {
if outtx.Address == order.XAddr && outtx.Value >= order.XAmount {
foundtx = true
}
}
......@@ -220,7 +220,7 @@ func (b *btcStore) verifyBtcTx(verify *ty.RelayVerify, order *ty.RelayOrder) err
return err
}
if verify.Tx.BlockHeight+uint64(order.CoinWaits) > uint64(height) {
if verify.Tx.BlockHeight+uint64(order.XBlockWaits) > uint64(height) {
return ty.ErrRelayWaitBlocksErr
}
......
......@@ -197,8 +197,8 @@ func (s *suiteBtcStore) TestGetMerkleRootFromHeader() {
func (s *suiteBtcStore) TestVerifyBtcTx() {
order := &ty.RelayOrder{
CoinAddr: "1Am9UTGfdnxabvcywYG2hvzr6qK8T3oUZT",
CoinAmount: 29900000,
XAddr: "1Am9UTGfdnxabvcywYG2hvzr6qK8T3oUZT",
XAmount: 29900000,
AcceptTime: 100,
ConfirmTime: 200,
}
......
This diff is collapsed.
This diff is collapsed.
......@@ -28,13 +28,13 @@ message RelayOrder {
string id = 1;
RelayOrderStatus status = 2;
RelayOrderStatus preStatus = 3;
uint64 amount = 4;
uint64 localCoinAmount = 4;
string createrAddr = 5;
uint32 coinOperation = 6;
string coin = 7;
uint64 coinAmount = 8;
string coinAddr = 9;
string coinTxHash = 10;
uint32 operation = 6;
string xCoin = 7;
uint64 xAmount = 8;
string xAddr = 9;
string xTxHash = 10;
int64 createTime = 11;
string acceptAddr = 12;
int64 acceptTime = 13;
......@@ -42,23 +42,27 @@ message RelayOrder {
int64 finishTime = 15;
string finishTxHash = 16;
int64 height = 17;
uint64 coinHeight = 18;
uint32 coinWaits = 19;
uint64 XHeight = 18;
uint32 xBlockWaits = 19;
string localCoinSymbol = 20;
string localCoinExec = 21;
}
message RelayCreate {
uint32 operation = 1; // 0: buy, 1: sell
string coin = 2; // outside coin BTC, ETH...
uint64 amount = 3;
string addr = 4;
uint64 btyAmount = 5;
uint32 coinWaits = 6; // the coin blocks to wait
string xCoin = 2; // outside cross coin BTC, ETH...
uint64 xAmount = 3;
string xAddr = 4;
uint64 localCoinAmount = 5;
uint32 xBlockWaits = 6; // the coin blocks to wait
string localCoinSymbol = 7;
string localCoinExec = 8;
}
message RelayAccept {
string orderId = 1;
string coinAddr = 2; // for sell coin case needed
uint32 coinWaits = 3;
string xAddr = 2; // for sell coin case needed
uint32 xBlockWaits = 3;
}
message RelayRevoke {
......@@ -154,21 +158,23 @@ message ReceiptRelayLog {
string orderId = 1;
string curStatus = 2;
string preStatus = 3;
string txAmount = 4;
string localCoinAmount = 4;
string createrAddr = 5;
string coinOperation = 6;
string coin = 7;
string coinAmount = 8;
string coinAddr = 9;
string coinTxHash = 10;
uint32 coinOperation = 6;
string xCoin = 7;
string xAmount = 8;
string xAddr = 9;
string xTxHash = 10;
int64 createTime = 11;
string acceptAddr = 12;
int64 acceptTime = 13;
int64 confirmTime = 14;
int64 finishTime = 15;
string finishTxHash = 16;
uint64 coinHeight = 17;
uint32 coinWaits = 18;
uint64 xHeight = 17;
uint32 xBlockWaits = 18;
string localCoinSymbol = 19;
string localCoinExec = 20;
}
message ReqRelayAddrCoins {
......
......@@ -42,11 +42,6 @@ func TestJRPCChannel(t *testing.T) {
{fn: testShowOnesAcceptRelayOrdersCmd},
{fn: testShowOnesStatusOrdersCmd},
{fn: testShowBTCHeadHeightListCmd},
{fn: testCreateRawRelayOrderTxCmd},
{fn: testCreateRawRelayAcceptTxCmd},
{fn: testCreateRawRevokeTxCmd},
{fn: testCreateRawRelayConfirmTxCmd},
{fn: testCreateRawRelayBtcHeaderCmd},
{fn: testGetBTCHeaderCurHeight},
}
for index, testCase := range testCases {
......@@ -105,36 +100,6 @@ func testShowBTCHeadHeightListCmd(t *testing.T, jrpc *jsonclient.JSONClient) err
return jrpc.Call("Chain33.Query", params, rep)
}
func testCreateRawRelayOrderTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.RelayCreate{}
var res string
return jrpc.Call("relay.CreateRawRelayOrderTx", params, &res)
}
func testCreateRawRelayAcceptTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.RelayAccept{}
var res string
return jrpc.Call("relay.CreateRawRelayAcceptTx", params, &res)
}
func testCreateRawRevokeTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.RelayRevoke{}
var res string
return jrpc.Call("relay.CreateRawRelayRevokeTx", params, &res)
}
func testCreateRawRelayConfirmTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.RelayConfirmTx{}
var res string
return jrpc.Call("relay.CreateRawRelayConfirmTx", params, &res)
}
func testCreateRawRelayBtcHeaderCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.BtcHeader{}
var res string
return jrpc.Call("relay.CreateRawRelaySaveBTCHeadTx", params, &res)
}
func testGetBTCHeaderCurHeight(t *testing.T, jrpc *jsonclient.JSONClient) error {
var params rpctypes.Query4Jrpc
req := &pty.ReqRelayBtcHeaderHeightList{}
......
......@@ -3,119 +3,3 @@
// license that can be found in the LICENSE file.
package rpc
import (
"encoding/hex"
"github.com/33cn/chain33/types"
ty "github.com/33cn/plugin/plugin/dapp/relay/types"
)
func createRawRelayOrderTx(cfg *types.Chain33Config, parm *ty.RelayCreate) ([]byte, error) {
if parm == nil {
return nil, types.ErrInvalidParam
}
v := *parm
return types.CallCreateTx(cfg, cfg.ExecName(ty.RelayX), "Create", &v)
}
func createRawRelayAcceptTx(cfg *types.Chain33Config, parm *ty.RelayAccept) ([]byte, error) {
if parm == nil {
return nil, types.ErrInvalidParam
}
return types.CallCreateTx(cfg, cfg.ExecName(ty.RelayX), "Accept", parm)
}
func createRawRelayRevokeTx(cfg *types.Chain33Config, parm *ty.RelayRevoke) ([]byte, error) {
if parm == nil {
return nil, types.ErrInvalidParam
}
return types.CallCreateTx(cfg, cfg.ExecName(ty.RelayX), "Revoke", parm)
}
func createRawRelayConfirmTx(cfg *types.Chain33Config, parm *ty.RelayConfirmTx) ([]byte, error) {
if parm == nil {
return nil, types.ErrInvalidParam
}
return types.CallCreateTx(cfg, cfg.ExecName(ty.RelayX), "ConfirmTx", parm)
}
func createRawRelaySaveBTCHeadTx(cfg *types.Chain33Config, parm *ty.BtcHeader) ([]byte, error) {
if parm == nil {
return nil, types.ErrInvalidParam
}
head := &ty.BtcHeader{
Hash: parm.Hash,
PreviousHash: parm.PreviousHash,
MerkleRoot: parm.MerkleRoot,
Height: parm.Height,
Version: parm.Version,
Time: parm.Time,
Nonce: parm.Nonce,
Bits: parm.Bits,
IsReset: parm.IsReset,
}
v := &ty.BtcHeaders{}
v.BtcHeader = append(v.BtcHeader, head)
return types.CallCreateTx(cfg, cfg.ExecName(ty.RelayX), "BtcHeaders", v)
}
//CreateRawRelayOrderTx jrpc create raw relay order
func (c *Jrpc) CreateRawRelayOrderTx(in *ty.RelayCreate, result *interface{}) error {
cfg := c.cli.GetConfig()
reply, err := createRawRelayOrderTx(cfg, in)
if err != nil {
return err
}
*result = hex.EncodeToString(reply)
return nil
}
//CreateRawRelayAcceptTx jrpc creat relay accept tx
func (c *Jrpc) CreateRawRelayAcceptTx(in *ty.RelayAccept, result *interface{}) error {
cfg := c.cli.GetConfig()
reply, err := createRawRelayAcceptTx(cfg, in)
if err != nil {
return err
}
*result = hex.EncodeToString(reply)
return nil
}
//CreateRawRelayRevokeTx jrpc create revoke tx
func (c *Jrpc) CreateRawRelayRevokeTx(in *ty.RelayRevoke, result *interface{}) error {
cfg := c.cli.GetConfig()
reply, err := createRawRelayRevokeTx(cfg, in)
if err != nil {
return err
}
*result = hex.EncodeToString(reply)
return nil
}
//CreateRawRelayConfirmTx jrpc create confirm tx
func (c *Jrpc) CreateRawRelayConfirmTx(in *ty.RelayConfirmTx, result *interface{}) error {
cfg := c.cli.GetConfig()
reply, err := createRawRelayConfirmTx(cfg, in)
if err != nil {
return err
}
*result = hex.EncodeToString(reply)
return nil
}
//CreateRawRelaySaveBTCHeadTx jrpc save btc header
func (c *Jrpc) CreateRawRelaySaveBTCHeadTx(in *ty.BtcHeader, result *interface{}) error {
cfg := c.cli.GetConfig()
reply, err := createRawRelaySaveBTCHeadTx(cfg, in)
if err != nil {
return err
}
*result = hex.EncodeToString(reply)
return nil
}
......@@ -5,7 +5,6 @@
package types
import (
"encoding/json"
"reflect"
//log "github.com/33cn/chain33/common/log/log15"
......@@ -42,12 +41,6 @@ const (
RelayOrderSell
)
// RelayOrderOperation buy or sell operation
var RelayOrderOperation = map[uint32]string{
RelayOrderBuy: "buy",
RelayOrderSell: "sell",
}
const (
// RelayUnlock revoke order
RelayUnlock = iota
......@@ -171,13 +164,7 @@ func (r *RelayType) Amount(tx *types.Transaction) (int64, error) {
}
relay := data.(*RelayAction)
if RelayActionCreate == relay.Ty && relay.GetCreate() != nil {
return int64(relay.GetCreate().BtyAmount), nil
return int64(relay.GetCreate().LocalCoinAmount), nil
}
return 0, nil
}
// CreateTx relay create tx TODO 暂时不修改实现, 先完成结构的重构
func (r *RelayType) CreateTx(action string, message json.RawMessage) (*types.Transaction, error) {
var tx *types.Transaction
return tx, nil
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment