0g-chain/x/pricefeed/simulation/genesis.go
jmahess 8d199746cd
[R4R] Pricefeed simulations (#420)
Co-authored-by: rhuairahrighairigh <ruaridh.odonnell@gmail.com>
Co-authored-by: John Maheswaran <john@kava.io>
Co-authored-by: Kevin Davis <kjydavis3@gmail.com>
2020-04-12 12:34:01 -04:00

66 lines
2.6 KiB
Go

package simulation
import (
"fmt"
"time"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/x/simulation"
"github.com/kava-labs/kava/x/pricefeed/types"
pricefeed "github.com/kava-labs/kava/x/pricefeed/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// RandomizedGenState generates a random GenesisState for pricefeed
func RandomizedGenState(simState *module.SimulationState) {
// get the params with xrp, btc and bnb to usd
// getPricefeedSimulationParams is defined to return params with xrp:usd, btc:usd, bnb:usd
params := getPricefeedSimulationParams()
markets := []types.Market{}
genPrices := []types.PostedPrice{}
// chose one account to be the oracle
oracle := simState.Accounts[simulation.RandIntBetween(simState.Rand, 0, len(simState.Accounts))]
for _, market := range params.Markets {
updatedMarket := types.Market{market.MarketID, market.BaseAsset, market.QuoteAsset, []sdk.AccAddress{oracle.Address}, true}
markets = append(markets, updatedMarket)
genPrice := types.PostedPrice{market.MarketID, oracle.Address, getInitialPrice(market.MarketID), simState.GenTimestamp.Add(time.Hour * 24)}
genPrices = append(genPrices, genPrice)
}
params = types.NewParams(markets)
pricefeedGenesis := types.NewGenesisState(params, genPrices)
fmt.Printf("Selected randomly generated %s parameters:\n%s\n", types.ModuleName, codec.MustMarshalJSONIndent(simState.Cdc, pricefeedGenesis))
simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(pricefeedGenesis)
}
// getPricefeedSimulationParams returns the params with xrp:usd, btc:usd, bnb:usd
func getPricefeedSimulationParams() types.Params {
// SET UP THE PRICEFEED GENESIS STATE
pricefeedGenesis := pricefeed.GenesisState{
Params: pricefeed.Params{
Markets: []pricefeed.Market{
pricefeed.Market{MarketID: "btc:usd", BaseAsset: "btc", QuoteAsset: "usd", Oracles: []sdk.AccAddress{}, Active: true},
pricefeed.Market{MarketID: "xrp:usd", BaseAsset: "xrp", QuoteAsset: "usd", Oracles: []sdk.AccAddress{}, Active: true},
pricefeed.Market{MarketID: "bnb:usd", BaseAsset: "bnb", QuoteAsset: "usd", Oracles: []sdk.AccAddress{}, Active: true},
},
},
}
return pricefeedGenesis.Params
}
// getInitialPrice gets the starting price for each of the base assets
func getInitialPrice(marketId string) (price sdk.Dec) {
switch marketId {
case "btc:usd":
return sdk.MustNewDecFromStr("7000")
case "bnb:usd":
return sdk.MustNewDecFromStr("14")
case "xrp:usd":
return sdk.MustNewDecFromStr("0.2")
}
panic(fmt.Sprintf("Invalid marketId in getInitialPrice: %s\n", marketId))
}