Defenders track sale prices for a collection.
When tracking sale prices, we track the median sale price for the week.
To convert the change in median sale price to points we calculate the difference between the median sale price this week and the median sale price last week and determine the rate of movement from the previous week (increasing or decreasing).
(Median sale price current week - Median sale price previous week) / Median sale price previous week
Looking at the Whiskers in the month of May we see (written with all of the digits):
Median sales price:
May 1-8: 42000000000000000
May 8-15: 50000000000000000
(50000000000000000 - 42000000000000000) / 42000000000000000 = 0.19
To convert the percentage change to points we can simply take the percentage and round the result. This would mean that in the above example, the points would be (before any multipliers):
May 15: 19
This is great when the project is healthy, but it is very likely that some projects will run negative. Every critter starts at 100 points so the final value would be:
May 15: 100 + 19 = 119
We don't let the total points go below 0.
Everyone always talks about the floor price.
Floor price is a form of centralization.
Floor price tracks the lowest listed price on a particular service (generally OpenSea). Unfortunately, because OpenSea and others support gas-less listings - or gas-less changes to listings (which is actually, very helpful and good) it means that there is no on-chain record of what the price was at a given point in history. Without a record of these listings over time you cannot see the historical tendencies of the price. You can find archives of the listings aggregated on different services, but there is no way to validate that the information they are showing is accurate by looking at the blockchain.
Additionally, because you can list an item without paying a gas fee, you can list an item for a very low price (or more commonly, a very high price). If we were to track the lowest floor price of the week, or the floor price at competition time, it would be possible for a bad actor to list an item at an extremely low price (possibly even using a listing scam) to disrupt the performance of a competitor.
We have several options when tracking the sale prices:
Basing the competition off of an individual sale (the last sale, lowest sale, or highest sale) allows us to track the collection with a bias toward recency - or to measure the extremes throughout the week. While this is an accurate representation of the health of the collection, it is very easy to manipulate. Suppose a bad actor wanted to influence the competition and sold an item at a very low price (or even a very high price) to a second wallet they own.
Tracking the median price allows us to track the health of broad the collection and to determine if the price is trending up or down, generally - not just at the extremes. This is far more representative. Sales at the low-end tend to be more frequent and generally represent less-desired and less-rare items in the collection, while sales at the high end represent grails in the collection. These high-end sales often skew wildly from the typical price; because of this, collection sales tend toward a binomial distribution. This makes the mean or average less reliable than the median.
The vast majority of the items in the collection are in the middle, the price of those items tend toward a normal distribution and more accurately represent the health of the collection. This is the median price. If this number is rising or falling the outlier sales (lowest and highest) should trend toward in the same direction.
Sales are any transaction that occurs which transfers ownership of an asset from one account to another and has a value greater than zero. There is one exception currently: if the value is 0.005E it is ignored. This is commonly added as a (non-sale) transfer fee (for example, on NFTTrader.io). We do not count bundles or sweeps when calculating the median sale price, though the total volume is counted in those cases. We also do not currently track WETH sales (the ethereum value is technically 0), though we hope to incorporate this soon.