@poprank/rankings
Advanced tools
Comparing version 1.1.6 to 1.1.7
@@ -105,3 +105,3 @@ "use strict"; | ||
if (collectionMetaFunctionPair) | ||
collectionMetaFunctionPair[collection](nftTraits, metaTraits); | ||
metaTraits.push.apply(metaTraits, collectionMetaFunctionPair[collection](nftTraits)); | ||
// Calculate our "Matches" meta trait | ||
@@ -120,2 +120,3 @@ var traitValueMatches = (0, rarity_meta_1.getNftTraitsMatches)(nftTraits, collection); | ||
}); | ||
// if (metaTraits.find(t => t.value === 'Triple')) console.log(metaTraits); | ||
return metaTraits; | ||
@@ -160,26 +161,25 @@ }; | ||
nfts.forEach(function (nft) { | ||
// Uncommenting this in a future PR | ||
// if (ensCollectionSlugs.includes(collection as EnsCollectionSlug)) { | ||
// const max = ensCollectionSizes[collection as EnsCollectionSlug]; | ||
// const digits = max.toString().length - 1; | ||
// // Reverse engineer the number value of the ENS given its name or tokenID | ||
// let i = 0; | ||
// if (nft.name.includes('eth')) { | ||
// i = +nft.name.replace('.eth', ''); | ||
// } else { | ||
// for (i = 0; i < 10000; i++) { | ||
// const id = stringToKeccak256DecimalId(i.toString(), digits); | ||
var _a; | ||
if (rarity_meta_1.ensCollectionSlugs.includes(collection)) { | ||
var max = rarity_meta_1.ensCollectionSizes[collection]; | ||
var digits = max.toString().length - 1; | ||
// Reverse engineer the number value of the ENS given its name or tokenID | ||
var i = 0; | ||
if (nft.name.includes('eth')) { | ||
i = +nft.name.replace('.eth', ''); | ||
} | ||
else { | ||
for (i = 0; i < 10000; i++) { | ||
var id = (0, rarity_meta_1.stringToKeccak256DecimalId)(i.toString(), digits); | ||
// Find the initial integer ID | ||
if (id === nft.id) | ||
break; | ||
} | ||
} | ||
nft.traits.push({ | ||
value: i.toString(), | ||
category: 'Traits', | ||
typeValue: rarity_meta_1.ID_TRAIT_TYPE, | ||
displayType: 'number', | ||
}); | ||
} | ||
// // Find the initial integer ID | ||
// if (id === nft.id) break; | ||
// } | ||
// } | ||
// nft.traits.push({ | ||
// value: i.toString(), | ||
// category: 'Traits', | ||
// typeValue: ID_TRAIT_TYPE, | ||
// displayType: 'number', | ||
// }); | ||
// } | ||
(_a = nft.traits).push.apply(_a, (0, exports.getMetaTraits)(nft.traits, nft.collection, true)); | ||
@@ -190,18 +190,11 @@ }); | ||
var collectionTraits = {}; | ||
var pushRatedTraitToCollectionTraits = function (trait) { | ||
var typeValue = trait.typeValue, value = trait.value; | ||
if (!collectionTraits[typeValue]) | ||
collectionTraits[typeValue] = []; | ||
if (!collectionTraits[typeValue].find(function (t) { return t.value === value; })) | ||
collectionTraits[typeValue].push((trait)); | ||
}; | ||
// find the trait weighting for all traits' rarities in this collection | ||
var weight = calculateCollectionRarityWeight(collectionTraitsNoRarity, nfts.length); | ||
var maxTraitsNum = -1; | ||
nfts.forEach(function (nft) { | ||
var numTraits; | ||
var traitCountTrait = nft.traits.find(function (t) { return t.category === 'Meta' && t.typeValue === rarity_meta_1.TRAIT_COUNT; }); | ||
// If we have a "Trait Count" trait, use that, otherwise naively filter out "none" and use the remaining | ||
// traits' length | ||
if (traitCountTrait) { | ||
numTraits = +traitCountTrait.value; | ||
} | ||
else { | ||
numTraits = nft.traits.filter(function (t) { return t.category !== 'None'; }).length; | ||
} | ||
maxTraitsNum = Math.max(maxTraitsNum, numTraits); | ||
}); | ||
// For each NFT, go through every trait it has / doesn't have, summing the rarity of each individual trait | ||
@@ -213,24 +206,23 @@ // to produce the final `rarityTraitSum` for the NFT. At the same time, add the traits with their now-calculated | ||
var nftTraitsWithRarity = []; | ||
// All the NFTs' traits, and the "None" traits | ||
var traitsToParse = nft.traits; | ||
// Add the "None" traits for all non-Meta traits | ||
Object.keys(collectionTraitsNoRarity).forEach(function (traitType) { | ||
var _a; | ||
var traitValuesOfThisType = collectionTraitsNoRarity[traitType]; | ||
if (traitValuesOfThisType.length === 0) | ||
return; | ||
if (!nft.traits.find(function (t) { return t.typeValue === traitType; }) && !collectionTraitsNoRarity[traitType].find(function (t) { return t.category === 'Meta'; })) { | ||
traitsToParse.push(collectionTraitsNoRarity[traitType].find(function (t) { return t.category === 'None'; })); | ||
} | ||
}); | ||
traitsToParse.forEach(function (trait) { | ||
// The trait is either the nft's trait w/ this type, or this type's "none" | ||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion | ||
var trait = (_a = nft.traits.find(function (t) { return t.typeValue === traitType; })) !== null && _a !== void 0 ? _a : traitValuesOfThisType.find(function (t) { return t.category === 'None'; }); | ||
var value = trait.value, typeValue = trait.typeValue; | ||
var currTraitValueCount = traitValuesOfThisType.find(function (t) { return t.value === value; }).traitCount; | ||
var pushRatedTraitToCollectionTraits = function (rarity, count) { | ||
if (!collectionTraits[typeValue]) | ||
collectionTraits[typeValue] = []; | ||
if (!collectionTraits[typeValue].find(function (t) { return t.value === value; })) | ||
collectionTraits[typeValue].push((__assign(__assign({}, trait), { traitCount: count, rarityTraitSum: rarity }))); | ||
}; | ||
var value = trait.value, typeValue = trait.typeValue, category = trait.category; | ||
var currTraitValueCount = collectionTraitsNoRarity[typeValue].find(function (t) { return t.value === value; }).traitCount; | ||
// Adds the rated trait to the output `collectionTraits` obj if it's not already there | ||
// For all non trait-count meta traits, don't calculate the rarity. If it's not none though, still | ||
// add it to the end traits array | ||
if (traitValuesOfThisType.find(function (t) { return t.category === 'Meta' && t.typeValue !== rarity_meta_1.TRAIT_COUNT; })) { | ||
if (category === 'Meta' && typeValue !== rarity_meta_1.TRAIT_COUNT) { | ||
if (trait.category !== 'None') { | ||
pushRatedTraitToCollectionTraits(0, currTraitValueCount); | ||
nftTraitsWithRarity.push(__assign(__assign({}, trait), { traitCount: 1, rarityTraitSum: 0 })); | ||
var ratedTrait_1 = __assign(__assign({}, trait), { traitCount: currTraitValueCount, rarityTraitSum: 0 }); | ||
pushRatedTraitToCollectionTraits(ratedTrait_1); | ||
nftTraitsWithRarity.push(ratedTrait_1); | ||
} | ||
@@ -242,8 +234,9 @@ return; | ||
var currTraitRarity = (0, exports.calculateTraitScore)(currTraitValueCount, nfts.length, traitTypeCount, weight); | ||
var ratedTrait = __assign(__assign({}, trait), { traitCount: currTraitValueCount, rarityTraitSum: currTraitRarity }); | ||
rarityTraitSum += currTraitRarity; | ||
// Push this trait to the collection-wide object if it's not there | ||
pushRatedTraitToCollectionTraits(currTraitRarity, currTraitValueCount); | ||
pushRatedTraitToCollectionTraits(ratedTrait); | ||
// Don't add "None" traits to the final array, they're implicit | ||
if (trait.category !== 'None') | ||
nftTraitsWithRarity.push(__assign(__assign({}, trait), { traitCount: 1, rarityTraitSum: currTraitRarity })); | ||
// if (trait.category !== 'None') | ||
nftTraitsWithRarity.push(ratedTrait); | ||
}); | ||
@@ -254,2 +247,3 @@ // Collections for which rarity doesn't make sense | ||
} | ||
nftTraitsWithRarity.sort(function (a, b) { return b.rarityTraitSum - a.rarityTraitSum; }); | ||
nftsWithRarity.push(__assign(__assign({}, nft), { traits: nftTraitsWithRarity, rarityTraitSum: +rarityTraitSum.toFixed(3) })); | ||
@@ -256,0 +250,0 @@ }); |
@@ -17,3 +17,3 @@ import { TraitBase } from '../types'; | ||
*/ | ||
export declare const collectionNameMetaFunctionPairs: Record<string, (nftTraits: TraitBase[], outTraits: TraitBase[]) => void>[]; | ||
export declare const collectionNameMetaFunctionPairs: Record<string, (nftTraits: TraitBase[]) => TraitBase[]>[]; | ||
/** | ||
@@ -20,0 +20,0 @@ * Get the "match" traits for a collection. Has some collection-specific logic to add desired |
@@ -62,5 +62,6 @@ "use strict"; | ||
exports.stringToKeccak256DecimalId = stringToKeccak256DecimalId; | ||
var ensMetaFunc = function (nftTraits, outTraits, collection) { | ||
var ensMetaFunc = function (nftTraits, collection) { | ||
var max = exports.ensCollectionSizes[collection]; | ||
var digits = max.toString().length - 1; | ||
var outTraits = []; | ||
var trait = nftTraits.find(function (t) { return t.displayType === 'number' && t.typeValue === exports.ID_TRAIT_TYPE; }); | ||
@@ -185,3 +186,3 @@ if (!trait) | ||
var isTriple = false; | ||
for (var j = 0; j < stringified.length - 3; j++) { | ||
for (var j = 0; j <= stringified.length - 3; j++) { | ||
if (['000', '111', '222', '333', '444', '555', '666', '777', '888', '999'].includes(stringified.slice(j, j + 3))) | ||
@@ -200,3 +201,3 @@ isTriple = true; | ||
var isQuadruple = false; | ||
for (var j = 0; j < stringified.length - 4; j++) { | ||
for (var j = 0; j <= stringified.length - 4; j++) { | ||
if (['0000', '1111', '2222', '3333', '4444', '5555', '6666', '7777', '8888', '9999'].includes(stringified.slice(j, j + 4))) | ||
@@ -213,2 +214,3 @@ isQuadruple = true; | ||
} | ||
return outTraits; | ||
}; | ||
@@ -221,3 +223,4 @@ /** | ||
exports.collectionNameMetaFunctionPairs = [{ | ||
'creatureworld': function (nftTraits, outTraits) { | ||
'creatureworld': function (nftTraits) { | ||
var outTraits = []; | ||
var bg = nftTraits.find(function (t) { return t.typeValue === 'Background'; }); | ||
@@ -236,5 +239,7 @@ var creature = nftTraits.find(function (t) { return t.typeValue === 'Creature'; }); | ||
} | ||
return outTraits; | ||
}, | ||
}, { | ||
'deathbats-club': function (nftTraits, outTraits) { | ||
'deathbats-club': function (nftTraits) { | ||
var outTraits = []; | ||
nftTraits.forEach(function (trait) { | ||
@@ -251,5 +256,7 @@ var tType = trait.typeValue; | ||
}); | ||
return outTraits; | ||
}, | ||
}, { | ||
'mutant-ape-yacht-club': function (nftTraits, outTraits) { | ||
'mutant-ape-yacht-club': function (nftTraits) { | ||
var outTraits = []; | ||
var firstTrait = nftTraits[0].value; | ||
@@ -273,7 +280,8 @@ var baseTrait = { | ||
} | ||
return outTraits; | ||
}, | ||
}, { | ||
'ens': function (nftTraits, outTraits) { return ensMetaFunc(nftTraits, outTraits, 'ens'); }, | ||
'ens': function (nftTraits) { return ensMetaFunc(nftTraits, 'ens'); }, | ||
}, { | ||
'999club': function (nftTraits, outTraits) { return ensMetaFunc(nftTraits, outTraits, '999club'); }, | ||
'999club': function (nftTraits) { return ensMetaFunc(nftTraits, '999club'); }, | ||
}, | ||
@@ -280,0 +288,0 @@ ]; |
{ | ||
"name": "@poprank/rankings", | ||
"version": "1.1.6", | ||
"version": "1.1.7", | ||
"description": "PopRank's NFT rarity and aesthetic ranking logic", | ||
@@ -49,2 +49,2 @@ "publishConfig": { | ||
} | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
767
55177