Skip to content

Commit

Permalink
[DFI-794] reversed asset price (#208)
Browse files Browse the repository at this point in the history
* [DFI-794] reverted asset price

* [DFI-794] change to sdk.Int prices from oracle

* [DFI-794] added reverse asset tests

* [DFI-794] fixed querier

* [DFI-794] typo fix
  • Loading branch information
g3co authored Oct 5, 2020
1 parent fe0d2a9 commit 90b37ca
Show file tree
Hide file tree
Showing 27 changed files with 483 additions and 188 deletions.
38 changes: 27 additions & 11 deletions app/cli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -426,26 +426,29 @@ func TestOracle_CLI(t *testing.T) {
postPrices := []struct {
assetCode dnTypes.AssetCode
sender string
price sdk.Int
askPrice sdk.Int
bidPrice sdk.Int
receivedAt time.Time
}{
{
assetCode: assetCode,
sender: assetOracle1,
price: sdk.NewInt(100),
askPrice: sdk.NewInt(100),
bidPrice: sdk.NewInt(95),
receivedAt: now,
},
{
assetCode: assetCode,
sender: assetOracle2,
price: sdk.NewInt(150),
askPrice: sdk.NewInt(150),
bidPrice: sdk.NewInt(149),
receivedAt: now.Add(1 * time.Second),
},
}

startBlockHeight := ct.WaitForNextBlocks(1)
for _, postPrice := range postPrices {
tx := ct.TxOraclePostPrice(postPrice.sender, postPrice.assetCode, postPrice.price, postPrice.receivedAt)
tx := ct.TxOraclePostPrice(postPrice.sender, postPrice.assetCode, postPrice.askPrice, postPrice.bidPrice, postPrice.receivedAt)
tx.CheckSucceeded()
}
endBlockHeight := ct.WaitForNextBlocks(1)
Expand All @@ -464,34 +467,37 @@ func TestOracle_CLI(t *testing.T) {
rawPrice := rawPricesRange[i]
require.Equal(t, postPrice.assetCode, rawPrice.AssetCode)
require.Equal(t, postPrice.sender, rawPrice.OracleAddress.String())
require.True(t, postPrice.price.Equal(rawPrice.Price))
require.True(t, postPrice.askPrice.Equal(rawPrice.AskPrice))
require.True(t, postPrice.bidPrice.Equal(rawPrice.BidPrice))
require.True(t, postPrice.receivedAt.Equal(rawPrice.ReceivedAt))
}

// check incorrect inputs
{
// invalid number of args
{
tx := ct.TxOraclePostPrice(assetOracle1, assetCode, sdk.OneInt(), time.Now())
tx := ct.TxOraclePostPrice(assetOracle1, assetCode, sdk.NewInt(3), sdk.NewInt(2), time.Now())
tx.RemoveCmdArg(assetCode.String())
tx.CheckFailedWithErrorSubstring("arg(s)")
}
// invalid price
{
tx := ct.TxOraclePostPrice(assetOracle1, assetCode, sdk.OneInt(), time.Now())
tx.ChangeCmdArg(sdk.OneInt().String(), "not_int")
tx.CheckFailedWithErrorSubstring("parsing Int")
ask := sdk.NewInt(3)
tx := ct.TxOraclePostPrice(assetOracle1, assetCode, ask, sdk.NewInt(2), time.Now())
tx.ChangeCmdArg(ask.String(), "not_int")
tx.CheckFailedWithErrorSubstring("parsing Int:")
}
// invalid receivedAt
{
now := time.Now()
tx := ct.TxOraclePostPrice(assetOracle1, assetCode, sdk.OneInt(), now)
tx := ct.TxOraclePostPrice(assetOracle1, assetCode, sdk.NewInt(3), sdk.NewInt(2), now)
tx.ChangeCmdArg(strconv.FormatInt(now.Unix(), 10), "not_time.Time")
tx.CheckFailedWithErrorSubstring("parsing Int")
}

// MsgPostPrice ValidateBasic
{
tx := ct.TxOraclePostPrice(assetOracle1, assetCode, sdk.NewIntWithDecimal(1, 20), time.Now())
tx := ct.TxOraclePostPrice(assetOracle1, assetCode, sdk.NewIntWithDecimal(1, 20), sdk.NewIntWithDecimal(1, 20), time.Now())
tx.CheckFailedWithErrorSubstring("bytes limit")
}
}
Expand Down Expand Up @@ -590,6 +596,16 @@ func TestOracle_CLI(t *testing.T) {
require.Equal(t, assetCode, price.AssetCode)
require.False(t, price.Price.IsZero())

// query reversed asset
{
rvAsset := assetCode.ReverseCode()
q, price := ct.QueryOraclePrice(rvAsset)
q.CheckSucceeded()

require.Equal(t, rvAsset, price.AssetCode)
require.False(t, price.Price.IsZero())
}

// check incorrect inputs
{
// invalid number of args
Expand Down
16 changes: 10 additions & 6 deletions app/rest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,8 @@ func TestOracle_REST(t *testing.T) {
SenderIdx uint
OracleName string
OracleAddress string
Price sdk.Int
AskPrice sdk.Int
BidPrice sdk.Int
ReceivedAt time.Time
BlockHeight int64
}{
Expand All @@ -610,7 +611,8 @@ func TestOracle_REST(t *testing.T) {
SenderIdx: 0,
OracleName: oracleName1,
OracleAddress: oracleAddr1,
Price: sdk.NewInt(100),
AskPrice: sdk.NewInt(100),
BidPrice: sdk.NewInt(99),
ReceivedAt: now,
BlockHeight: 0,
},
Expand All @@ -619,7 +621,8 @@ func TestOracle_REST(t *testing.T) {
SenderIdx: 1,
OracleName: oracleName2,
OracleAddress: oracleAddr2,
Price: sdk.NewInt(200),
AskPrice: sdk.NewInt(200),
BidPrice: sdk.NewInt(199),
ReceivedAt: now.Add(5 * time.Second),
},
}
Expand All @@ -630,7 +633,7 @@ func TestOracle_REST(t *testing.T) {
// it's not easy to find out when those TXs are Delivered
prevBlockHeight := ct.WaitForNextBlocks(1)
for _, postPrice := range postPrices {
req, _ := ct.RestTxOraclePostPrice(postPrice.OracleName, postPrice.AssetCode, postPrice.Price, postPrice.ReceivedAt)
req, _ := ct.RestTxOraclePostPrice(postPrice.OracleName, postPrice.AssetCode, postPrice.AskPrice, postPrice.BidPrice, postPrice.ReceivedAt)
req.CheckSucceeded()
}
curBlockHeight := ct.WaitForNextBlocks(1)
Expand All @@ -651,7 +654,8 @@ func TestOracle_REST(t *testing.T) {
postPrice := postPrices[i]
require.Equal(t, rawPrice.AssetCode, postPrice.AssetCode)
require.Equal(t, postPrice.OracleAddress, rawPrice.OracleAddress.String())
require.True(t, rawPrice.Price.Equal(postPrice.Price))
require.True(t, rawPrice.AskPrice.Equal(postPrice.AskPrice))
require.True(t, rawPrice.BidPrice.Equal(postPrice.BidPrice))
require.True(t, rawPrice.ReceivedAt.Equal(postPrice.ReceivedAt))
}
}
Expand Down Expand Up @@ -685,7 +689,7 @@ func TestOracle_REST(t *testing.T) {
req, respMsg := ct.RestQueryOraclePrice(ct.DefAssetCode)
req.CheckSucceeded()

require.True(t, respMsg.Price.Equal(postPrices[1].Price))
require.True(t, respMsg.Price.Equal(postPrices[1].AskPrice))
require.True(t, respMsg.ReceivedAt.Equal(postPrices[1].ReceivedAt))

// check invalid inputs
Expand Down
60 changes: 39 additions & 21 deletions app/unit_oracle_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,16 @@ func TestOracle_Queries(t *testing.T) {

// getCurrentPrice query check (no inputs yet)
{
response := oracle.CurrentPrice{}
response := oracle.CurrentAssetPrice{}
CheckRunQuery(t, app, nil, fmt.Sprintf(queryOracleGetCurrentPricePathFmt, assetCode), &response)
require.Empty(t, response.AssetCode)
require.True(t, response.Price.IsZero())
//require.True(t, response.ReceivedAt.IsZero())
}

now := time.Now()
priceValues := []sdk.Int{sdk.NewInt(1000), sdk.NewInt(2000), sdk.NewInt(1500)}
priceAskValues := []sdk.Int{sdk.NewInt(1001), sdk.NewInt(2002), sdk.NewInt(1501)}
priceBidValues := []sdk.Int{sdk.NewInt(1000), sdk.NewInt(2000), sdk.NewInt(1500)}
priceTimestamps := []time.Time{now.Add(1 * time.Second), now.Add(2 * time.Second), now.Add(3 * time.Second)}

// post prices
Expand All @@ -97,7 +98,8 @@ func TestOracle_Queries(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: priceValues[0],
AskPrice: priceAskValues[0],
BidPrice: priceBidValues[0],
ReceivedAt: priceTimestamps[0],
}

Expand All @@ -111,7 +113,8 @@ func TestOracle_Queries(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: priceValues[1],
AskPrice: priceAskValues[1],
BidPrice: priceBidValues[1],
ReceivedAt: priceTimestamps[1],
}

Expand All @@ -125,7 +128,8 @@ func TestOracle_Queries(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: priceValues[2],
AskPrice: priceAskValues[2],
BidPrice: priceBidValues[2],
ReceivedAt: priceTimestamps[2],
}

Expand All @@ -151,7 +155,8 @@ func TestOracle_Queries(t *testing.T) {
CheckRunQuery(t, app, nil, fmt.Sprintf(queryOracleGetRawPricesPathFmt, assetCode, GetContext(app, true).BlockHeight()-1), &response)
require.Len(t, response, 3)
for i, rawPrice := range response {
require.True(t, priceValues[i].Equal(rawPrice.Price))
require.True(t, priceAskValues[i].Equal(rawPrice.AskPrice))
require.True(t, priceBidValues[i].Equal(rawPrice.BidPrice))
require.True(t, priceTimestamps[i].Equal(rawPrice.ReceivedAt))
require.Equal(t, assetCode, rawPrice.AssetCode)
require.Equal(t, genAddrs[i], rawPrice.OracleAddress)
Expand All @@ -160,10 +165,10 @@ func TestOracle_Queries(t *testing.T) {

// getCurrentPrice query check (value should be calculated after BlockEnd)
{
response := oracle.CurrentPrice{}
response := oracle.CurrentAssetPrice{}
CheckRunQuery(t, app, nil, fmt.Sprintf(queryOracleGetCurrentPricePathFmt, assetCode), &response)
require.Equal(t, assetCode, response.AssetCode)
require.True(t, response.Price.Equal(priceValues[2]))
require.True(t, response.Price.Equal(priceAskValues[2]))
require.True(t, response.ReceivedAt.Equal(priceTimestamps[2]))
}
}
Expand Down Expand Up @@ -518,7 +523,8 @@ func TestOracle_PostPrices(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: sdk.OneInt(),
AskPrice: sdk.OneInt(),
BidPrice: sdk.OneInt(),
ReceivedAt: time.Now(),
}

Expand All @@ -534,7 +540,8 @@ func TestOracle_PostPrices(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: "non-existing-asset",
Price: sdk.OneInt(),
AskPrice: sdk.OneInt(),
BidPrice: sdk.OneInt(),
ReceivedAt: time.Now(),
}

Expand All @@ -560,7 +567,8 @@ func TestOracle_PostPrices(t *testing.T) {
// check posting price few times from the same oracle
{
now := time.Now()
priceAmount1, priceAmount2 := sdk.NewInt(200000000), sdk.NewInt(100000000)
priceAskAmount1, priceAskAmount2 := sdk.NewInt(200000002), sdk.NewInt(100000002)
priceBidAmount1, priceBidAmount2 := sdk.NewInt(200000000), sdk.NewInt(100000000)
priceTimestamp1, priceTimestamp2 := now.Add(1*time.Second), now.Add(2*time.Second)

// post prices
Expand All @@ -571,7 +579,8 @@ func TestOracle_PostPrices(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: priceAmount1,
AskPrice: priceAskAmount1,
BidPrice: priceBidAmount1,
ReceivedAt: priceTimestamp1,
}

Expand All @@ -585,7 +594,8 @@ func TestOracle_PostPrices(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: priceAmount2,
AskPrice: priceAskAmount2,
BidPrice: priceBidAmount2,
ReceivedAt: priceTimestamp2,
}

Expand All @@ -599,7 +609,8 @@ func TestOracle_PostPrices(t *testing.T) {
// check the last price is the current price
{
price := app.oracleKeeper.GetCurrentPrice(GetContext(app, true), assetCode)
require.True(t, price.Price.Equal(priceAmount2))
require.True(t, price.AskPrice.Equal(priceAskAmount2))
require.True(t, price.BidPrice.Equal(priceBidAmount2))
require.True(t, price.ReceivedAt.Equal(priceTimestamp2))
}

Expand All @@ -608,7 +619,8 @@ func TestOracle_PostPrices(t *testing.T) {
ctx := GetContext(app, true)
rawPrices := app.oracleKeeper.GetRawPrices(ctx, assetCode, ctx.BlockHeight()-1)
require.Len(t, rawPrices, 1)
require.True(t, priceAmount2.Equal(rawPrices[0].Price))
require.True(t, priceAskAmount2.Equal(rawPrices[0].AskPrice))
require.True(t, priceBidAmount2.Equal(rawPrices[0].BidPrice))
require.True(t, priceTimestamp2.Equal(rawPrices[0].ReceivedAt))
require.Equal(t, assetCode, rawPrices[0].AssetCode)
require.Equal(t, genAddrs[0], rawPrices[0].OracleAddress)
Expand All @@ -618,7 +630,8 @@ func TestOracle_PostPrices(t *testing.T) {
// check posting prices from different oracles
{
now := time.Now()
priceValues := []sdk.Int{sdk.NewInt(200000000), sdk.NewInt(100000000), sdk.NewInt(300000000)}
priceAskValues := []sdk.Int{sdk.NewInt(200000002), sdk.NewInt(100000001), sdk.NewInt(300000003)}
priceBidValues := []sdk.Int{sdk.NewInt(200000000), sdk.NewInt(100000000), sdk.NewInt(300000000)}
priceTimestamps := []time.Time{now.Add(1 * time.Second), now.Add(2 * time.Second), now.Add(3 * time.Second)}

// post prices
Expand All @@ -629,7 +642,8 @@ func TestOracle_PostPrices(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: priceValues[0],
AskPrice: priceAskValues[0],
BidPrice: priceBidValues[0],
ReceivedAt: priceTimestamps[0],
}

Expand All @@ -643,7 +657,8 @@ func TestOracle_PostPrices(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: priceValues[1],
AskPrice: priceAskValues[1],
BidPrice: priceBidValues[1],
ReceivedAt: priceTimestamps[1],
}

Expand All @@ -657,7 +672,8 @@ func TestOracle_PostPrices(t *testing.T) {
msg := oracle.MsgPostPrice{
From: senderAcc.GetAddress(),
AssetCode: assetCode,
Price: priceValues[2],
AskPrice: priceAskValues[2],
BidPrice: priceBidValues[2],
ReceivedAt: priceTimestamps[2],
}

Expand All @@ -671,7 +687,8 @@ func TestOracle_PostPrices(t *testing.T) {
// check the last price is the median price
{
price := app.oracleKeeper.GetCurrentPrice(GetContext(app, true), assetCode)
require.True(t, price.Price.Equal(priceValues[0]))
require.True(t, price.AskPrice.Equal(priceAskValues[0]))
require.True(t, price.BidPrice.Equal(priceBidValues[0]))
require.True(t, price.ReceivedAt.Equal(priceTimestamps[0]))
}

Expand All @@ -681,7 +698,8 @@ func TestOracle_PostPrices(t *testing.T) {
rawPrices := app.oracleKeeper.GetRawPrices(ctx, assetCode, ctx.BlockHeight()-1)
require.Len(t, rawPrices, 3)
for i, rawPrice := range rawPrices {
require.True(t, priceValues[i].Equal(rawPrice.Price))
require.True(t, priceAskValues[i].Equal(rawPrice.AskPrice))
require.True(t, priceBidValues[i].Equal(rawPrice.BidPrice))
require.True(t, priceTimestamps[i].Equal(rawPrice.ReceivedAt))
require.Equal(t, assetCode, rawPrice.AssetCode)
require.Equal(t, genAddrs[i], rawPrice.OracleAddress)
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ require (
github.com/swaggo/http-swagger v0.0.0-20200308142732-58ac5e232fba
github.com/swaggo/swag v1.6.7
github.com/tendermint/go-amino v0.15.1
github.com/shopspring/decimal v1.2.0
github.com/tendermint/tendermint v0.33.7
github.com/tendermint/tm-db v0.5.1
golang.org/x/net v0.0.0-20200904194848-62affa334b73 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,8 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
Expand Down
10 changes: 10 additions & 0 deletions helpers/input_parsers.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,16 @@ func ParseSdkIntParam(argName, argValue string, paramType ParamType) (sdk.Int, e
return v, nil
}

// ParseSdkDecParam parses sdk.Dec param.
func ParseSdkDecParam(argName, argValue string, paramType ParamType) (sdk.Dec, error) {
v, err := sdk.NewDecFromStr(argValue)
if err != nil {
return sdk.Dec{}, fmt.Errorf("%s %s %q: parsing Dec: failed(%s)", argName, paramType, argValue, err.Error())
}

return v, nil
}

// ParseSdkIntParam parses sdk.Uint param.
func ParseSdkUintParam(argName, argValue string, paramType ParamType) (sdk.Uint, error) {
vInt, ok := sdk.NewIntFromString(argValue)
Expand Down
Loading

0 comments on commit 90b37ca

Please sign in to comment.