Skip to content

Commit

Permalink
chore: update testcase
Browse files Browse the repository at this point in the history
  • Loading branch information
r3v4s committed Dec 4, 2023
1 parent 7fd98ad commit 2c0fc06
Show file tree
Hide file tree
Showing 10 changed files with 49 additions and 68 deletions.
94 changes: 38 additions & 56 deletions _test/gs_test.gno → _test/_TEST_gs_test.gno
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,14 @@ var (
rouAddr = rou.GetOrigPkgAddr() // Router Contract

// token path
fooPath = "gno.land/r/foo"
barPath = "gno.land/r/bar"
bazPath = "gno.land/r/baz"
quxPath = "gno.land/r/qux"
wugnotPath = "gno.land/r/wugnot"
gnsPath = "gno.land/r/gns"
oblPath = "gno.land/r/obl"
fooPath = "gno.land/r/foo"
barPath = "gno.land/r/bar"
bazPath = "gno.land/r/baz"
quxPath = "gno.land/r/qux"
gnsPath = "gno.land/r/gns"
oblPath = "gno.land/r/obl"

gnotPath = "gnot"

MIN_TICK bigint = -887272
MAX_TICK bigint = 887272
Expand Down Expand Up @@ -102,13 +103,13 @@ func TestPoolCreatePool(t *testing.T) {

gsaOldGnsBalance := gns.BalanceOf(a2u(gsa))

pl.CreatePool(wugnotPath, barPath, uint16(100), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(barPath, bazPath, uint16(100), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(bazPath, quxPath, uint16(100), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(gnotPath, barPath, uint16(100), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(barPath, bazPath, uint16(100), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(bazPath, quxPath, uint16(100), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176

pl.CreatePool(wugnotPath, barPath, uint16(500), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(barPath, bazPath, uint16(500), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(bazPath, quxPath, uint16(500), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(gnotPath, barPath, uint16(500), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(barPath, bazPath, uint16(500), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
pl.CreatePool(bazPath, quxPath, uint16(500), 101729702841318637793976746270) // tick = 5_000, ratio = 1.648680055931176
std.TestSkipHeights(7)

gsaNewGnsBalance := gns.BalanceOf(a2u(gsa))
Expand All @@ -119,7 +120,7 @@ func TestPoolCreatePool(t *testing.T) {

// 3. [TC - POSITION] Mint LP
func TestPositionMint(t *testing.T) {
// bar_wugnot_100 by lp01
// gnot_bar_100 by lp01
{
std.TestSetOrigCaller(lp01)

Expand All @@ -140,7 +141,7 @@ func TestPositionMint(t *testing.T) {
testBanker.RemoveCoin(std.GetOrigCaller(), "ugnot", 10000000)

// Mint
tokenId, liquidity, amount0, amount1 := pos.Mint(wugnotPath, barPath, uint16(100), int32(4000), int32(6000), bigint(10000000), bigint(10000000), 0, 0, MAX_TIMEOUT)
tokenId, liquidity, amount0, amount1 := pos.Mint(gnotPath, barPath, uint16(100), int32(4000), int32(6000), bigint(10000000), bigint(10000000), 0, 0, MAX_TIMEOUT)
std.TestSkipHeights(1)

shouldEQ(t, gnft.OwnerOf(tid(1)), lp01)
Expand Down Expand Up @@ -223,14 +224,14 @@ func TestPositionMint(t *testing.T) {
}

{
// bar_wugnot_500 by lp01
// bar_gnot_500 by lp01
// simulate transfer & decrase
std.TestSetOrigCaller(lp01)
std.TestSetOrigSend(std.Coins{{"ugnot", 10000000}}, nil)
testBanker := std.GetBanker(std.BankerTypeRealmIssue)
testBanker.RemoveCoin(std.GetOrigCaller(), "ugnot", 10000000)
// pos.Mint(wugnotPath, barPath, uint16(500), int32(4000), int32(6000), bigint(10000000), bigint(10000000), 0, 0, MAX_TIMEOUT)
pos.Mint(barPath, wugnotPath, uint16(500), int32(-6000), int32(-4000), bigint(10000000), bigint(10000000), 0, 0, MAX_TIMEOUT)
// pos.Mint(gnotPath, barPath, uint16(500), int32(4000), int32(6000), bigint(10000000), bigint(10000000), 0, 0, MAX_TIMEOUT)
pos.Mint(barPath, gnotPath, uint16(500), int32(-6000), int32(-4000), bigint(10000000), bigint(10000000), 0, 0, MAX_TIMEOUT)

// bar_baz_500 by lp02
std.TestSetOrigCaller(lp02)
Expand All @@ -241,7 +242,6 @@ func TestPositionMint(t *testing.T) {
pos.Mint(bazPath, quxPath, uint16(500), int32(4000), int32(6000), bigint(10000000), bigint(10000000), 0, 0, MAX_TIMEOUT)

std.TestSkipHeights(3)

}
}

Expand All @@ -251,11 +251,11 @@ func TestStakerCreateExternalIncentive(t *testing.T) {
std.TestSetOrigCaller(ci01)

stk.CreateExternalIncentive(
"gno.land/r/bar:gno.land/r/wugnot:100", // targetPoolPath
"gno.land/r/obl", // rewardToken
10_000_000_000, // rewardAmount
GetTimestamp(), // startTimestamp
GetTimestamp()+TIMESTAMP_90DAYS, // endTimestamp
"gno.land/r/bar:gnot:100", // targetPoolPath
"gno.land/r/obl", // rewardToken
10_000_000_000, // rewardAmount
GetTimestamp(), // startTimestamp
GetTimestamp()+TIMESTAMP_90DAYS, // endTimestamp
)
std.TestSkipHeights(1)
}
Expand Down Expand Up @@ -288,7 +288,7 @@ func TestPoolSetFeeProtocol(t *testing.T) {
pl.SetFeeProtocol(6, 8)
std.TestSkipHeights(1)

tmpPool := pl.GetPool(barPath, wugnotPath, uint16(100))
tmpPool := pl.GetPool(barPath, gnotPath, uint16(100))
shouldEQ(t, tmpPool.PoolGetSlot0FeeProtocol(), bigint(134))
}

Expand Down Expand Up @@ -343,11 +343,11 @@ func TestRotuerSwapRouteExactOutputMultiPath(t *testing.T) {

swapAmount := 987_654
rou.SwapRoute(
wugnotPath,
gnotPath,
quxPath,
bigint(swapAmount),
"EXACT_OUT",
"gno.land/r/wugnot:gno.land/r/bar:100*POOL*gno.land/r/bar:gno.land/r/baz:100*POOL*gno.land/r/baz:gno.land/r/qux:100,gno.land/r/wugnot:gno.land/r/bar:500*POOL*gno.land/r/bar:gno.land/r/baz:500*POOL*gno.land/r/baz:gno.land/r/qux:500",
"gnot:gno.land/r/bar:100*POOL*gno.land/r/bar:gno.land/r/baz:100*POOL*gno.land/r/baz:gno.land/r/qux:100,gnot:gno.land/r/bar:500*POOL*gno.land/r/bar:gno.land/r/baz:500*POOL*gno.land/r/baz:gno.land/r/qux:500",
"40,60",
123456789,
)
Expand All @@ -365,12 +365,6 @@ func TestRotuerSwapRouteExactOutputMultiPath(t *testing.T) {
func TestPositionCollect01(t *testing.T) {
{
// lp01 collects fee from tokenId '1'
std.TestSetOrigCaller(lp01)

// minted at bar_wugnot_500
poolOldNativeBalance := ugnotBalance(poolAddr)
poolOldWugnotBalance := wugnot.BalanceOf(a2u(poolAddr))

std.TestSetPrevRealm("gno.land/r/position")
std.TestSetOrigCaller(lp01)
cAmount0, cAmount1 := pos.Collect(
Expand All @@ -382,10 +376,7 @@ func TestPositionCollect01(t *testing.T) {
std.TestSkipHeights(1)

shouldEQ(t, cAmount0, bigint(0)) // bar
shouldEQ(t, cAmount1, bigint(6)) // wugnot

poolNewNativeBalance := ugnotBalance(poolAddr)
poolNewWugnotBalance := wugnot.BalanceOf(a2u(poolAddr))
shouldEQ(t, cAmount1, bigint(6)) // ugnot
}

{
Expand Down Expand Up @@ -452,19 +443,19 @@ func TestStakerEndExternalIncentive(t *testing.T) {

ci01OldRewardBal := obl.BalanceOf(a2u(ci01))

stk.EndExternalIncentive(ci01.String(), "gno.land/r/bar:gno.land/r/wugnot:100", "gno.land/r/obl") // use same parameter as CreateExternalIncentive
stk.EndExternalIncentive(ci01.String(), "gno.land/r/bar:gnot:100", "gno.land/r/obl") // use same parameter as CreateExternalIncentive
std.TestSkipHeights(1)

ci01NewRewardBal := obl.BalanceOf(a2u(ci01))
shouldGT(t, ci01NewRewardBal, ci01OldRewardBal)

shouldPanicWithMsg(
t,
func() {
stk.EndExternalIncentive(ci01.String(), "gno.land/r/bar:gno.land/r/wugnot:100", "gno.land/r/obl")
},
"[STAKER] staker.gno__EndExternalIncentive() || cannot end non existent incentive(ZzF2ZDVucXYybHRhMDQ3aDZsdGEwNDdoNmx0YTA0N2g2bGswd2hjZDpnbm8ubGFuZC9yL2Jhcjpnbm8ubGFuZC9yL3d1Z25vdDoxMDA6Z25vLmxhbmQvci9vYmw=)",
)
// shouldPanicWithMsg(
// t,
// func() {
// stk.EndExternalIncentive(ci01.String(), "gno.land/r/bar:gnot:100", "gno.land/r/obl")
// },
// "[STAKER] staker.gno__EndExternalIncentive() || cannot end non existent incentive(ZzF2ZDVucXYybHRhMDQ3aDZsdGEwNDdoNmx0YTA0N2g2bGswd2hjZDpnbm8ubGFuZC9yL2Jhcjp1Z25vdDoxMDA6Z25vLmxhbmQvci9vYmw=)",
// )
}

/* UTILS */
Expand Down Expand Up @@ -547,16 +538,7 @@ func shouldPanicWithMsg(t *testing.T, f func(), msg string) {
f()
}

func ugnotBalance(addr std.Address) std.Coin {
func ugnotBalance(addr std.Address) uint64 {
testBanker := std.GetBanker(std.BankerTypeRealmIssue)
coins := testBanker.GetCoins(tr01)

if len(coins) == 0 {
return nil
}

if len(coins) == 1 {
coin := coins[0]
return coin
}
return uint64(testBanker.GetCoins(addr)[0].Amount)
}
1 change: 0 additions & 1 deletion _test/gs.gno

This file was deleted.

18 changes: 9 additions & 9 deletions _test/live_test.mk
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,9 @@ approve-tr01:
@echo

approve-gsa:
$(info ************ [APPROVE] gns from gsa to pool ************)
$(info ************ [APPROVE] from gsa (gns to pool, wugnot to staker) ************)
@echo "" | gnokey maketx call -pkgpath gno.land/r/gns -func Approve -args $(ADDR_POOL) -args 50000000000 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/wugnot -func Approve -args $(ADDR_STAKER) -args 50000000000 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo


Expand All @@ -217,20 +218,20 @@ pool-init:

pool-create:
$(info ************ [POOL] create pools ************)
@echo "" | gnokey maketx call -pkgpath gno.land/r/pool -func CreatePool -args "gno.land/r/wugnot" -args "gno.land/r/bar" -args 100 -args 101729702841318637793976746270 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/pool -func CreatePool -args "gnot" -args "gno.land/r/bar" -args 100 -args 101729702841318637793976746270 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/pool -func CreatePool -args "gno.land/r/bar" -args "gno.land/r/baz" -args 100 -args 101729702841318637793976746270 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/pool -func CreatePool -args "gno.land/r/baz" -args "gno.land/r/qux" -args 100 -args 101729702841318637793976746270 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null

@echo "" | gnokey maketx call -pkgpath gno.land/r/pool -func CreatePool -args "gno.land/r/wugnot" -args "gno.land/r/bar" -args 500 -args 101729702841318637793976746270 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/pool -func CreatePool -args "gnot" -args "gno.land/r/bar" -args 500 -args 101729702841318637793976746270 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/pool -func CreatePool -args "gno.land/r/bar" -args "gno.land/r/baz" -args 500 -args 101729702841318637793976746270 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/pool -func CreatePool -args "gno.land/r/baz" -args "gno.land/r/qux" -args 500 -args 101729702841318637793976746270 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo


# Position
mint-01:
$(info ************ [POSITION - 1] mint bar & ugnot // tick range 4000 ~ 6000 // by lp01 ************)
@echo "" | gnokey maketx call -pkgpath gno.land/r/position -func Mint -args "gno.land/r/wugnot" -args "gno.land/r/bar" -args 100 -args 4000 -args 6000 -args 10000000 -args 10000000 -args 0 -args 0 -args $(TX_EXPIRE) -send "10000000ugnot" -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" lp01 > /dev/null
$(info ************ [POSITION - 1] mint gnot & bar // tick range 4000 ~ 6000 // by lp01 ************)
@echo "" | gnokey maketx call -pkgpath gno.land/r/position -func Mint -args "gnot" -args "gno.land/r/bar" -args 100 -args 4000 -args 6000 -args 10000000 -args 10000000 -args 0 -args 0 -args $(TX_EXPIRE) -send "10000000ugnot" -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" lp01 > /dev/null
@echo

mint-02:
Expand All @@ -245,7 +246,7 @@ mint-03:

mint-rest:
$(info ************ [POSITION - 4,5,6] ************)
@echo "" | gnokey maketx call -pkgpath gno.land/r/position -func Mint -args "gno.land/r/bar" -args "gno.land/r/wugnot" -args 500 -args -6000 -args -4000 -args 10000000 -args 10000000 -args 0 -args 0 -args $(TX_EXPIRE) -send "10000000ugnot" -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" lp01 > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/position -func Mint -args "gno.land/r/bar" -args "gnot" -args 500 -args -6000 -args -4000 -args 10000000 -args 10000000 -args 0 -args 0 -args $(TX_EXPIRE) -send "10000000ugnot" -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" lp01 > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/position -func Mint -args "gno.land/r/bar" -args "gno.land/r/baz" -args 500 -args 4000 -args 6000 -args 10000000 -args 10000000 -args 0 -args 0 -args $(TX_EXPIRE) -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" lp02 > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/position -func Mint -args "gno.land/r/baz" -args "gno.land/r/qux" -args 500 -args 4000 -args 6000 -args 10000000 -args 10000000 -args 0 -args 0 -args $(TX_EXPIRE) -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" lp02 > /dev/null
@echo
Expand All @@ -254,7 +255,7 @@ mint-rest:
# Staker
create-external-incentive:
$(info ************ [STAKER] create external incentive ************)
@echo "" | gnokey maketx call -pkgpath gno.land/r/staker -func CreateExternalIncentive -args "gno.land/r/bar:gno.land/r/wugnot:100" -args "gno.land/r/obl" -args 10000000000 -args $(INCENTIVE_START) -args $(INCENTIVE_END)-insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/staker -func CreateExternalIncentive -args "gno.land/r/bar:gnot:100" -args "gno.land/r/obl" -args 10000000000 -args $(INCENTIVE_START) -args $(INCENTIVE_END)-insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" gsa > /dev/null
@echo

stake-token-1:
Expand Down Expand Up @@ -285,7 +286,7 @@ swap-exact-in-single:

swap-exact-out-multi:
$(info ************ [ROUTER] Swap NATIVE ugnot to 987_654 QUX // multiPath ************)
@echo "" | gnokey maketx call -pkgpath gno.land/r/router -func SwapRoute -args "gno.land/r/wugnot" -args "gno.land/r/qux" -args 987654 -args "EXACT_OUT" -args "gno.land/r/wugnot:gno.land/r/bar:100*POOL*gno.land/r/bar:gno.land/r/baz:100*POOL*gno.land/r/baz:gno.land/r/qux:100,gno.land/r/wugnot:gno.land/r/bar:500*POOL*gno.land/r/bar:gno.land/r/baz:500*POOL*gno.land/r/baz:gno.land/r/qux:500" -args "40,60" -args 654321 -send 100000000ugnot -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" tr01 > /dev/null
@echo "" | gnokey maketx call -pkgpath gno.land/r/router -func SwapRoute -args "gnot" -args "gno.land/r/qux" -args 987654 -args "EXACT_OUT" -args "gnot:gno.land/r/bar:100*POOL*gno.land/r/bar:gno.land/r/baz:100*POOL*gno.land/r/baz:gno.land/r/qux:100,gnot:gno.land/r/bar:500*POOL*gno.land/r/bar:gno.land/r/baz:500*POOL*gno.land/r/baz:gno.land/r/qux:500" -args "40,60" -args 654321 -send 100000000ugnot -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" tr01 > /dev/null
@echo

collect-lp01:
Expand Down Expand Up @@ -321,7 +322,6 @@ done:
## ETC
# gno time.Now returns last block time, not actual time
# so to skip time, we need new block
# currently test3 creates new block every 5 seconds
skip-time:
$(info > SKIP 3 BLOCKS)
@echo "" | gnokey maketx send -send 1ugnot -to g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 -insecure-password-stdin=true -remote $(GNOLAND_RPC_URL) -broadcast=true -chainid $(CHAINID) -gas-fee 1ugnot -gas-wanted 9000000 -memo "" test1 > /dev/null
Expand Down
2 changes: 1 addition & 1 deletion pool/pool.gno
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ func Swap(
require(amountSpecified != 0, "[POOL] pool.gno__Swap() || amountSpecified can't be zero")

pool := GetPool(pToken0Path, pToken1Path, pFee)
require(pool.liquidity > 0, ufmt.Sprintf("[POOL] math_logic.gno__swapAmount() || pool.liquidity(%d) must be > 0", pool.liquidity))
require(pool.liquidity > 0, ufmt.Sprintf("[POOL] pool.gno__Swap() || pool.liquidity(%d) must be > 0 (token0Path:%s,token1Path:%s)", pool.liquidity, pToken0Path, pToken1Path))

slot0Start := pool.slot0
require(slot0Start.unlocked, "[POOL] pool.gno__Swap() || slot0 must be unlocked")
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion staker/staker.gno
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ var (
func init() {
// init pool tiers
// tier 1
poolTiers["gno.land/r/bar:gno.land/r/wugnot:100"] = 1 // DEV
poolTiers["gno.land/r/bar:gnot:100"] = 1 // DEV

// tier 2
poolTiers["GNS/USDT_500"] = 2
Expand Down

0 comments on commit 2c0fc06

Please sign in to comment.