Settings

Blockchain
Network
Unit
Language
Theme
Sound New Block

Transaction

93899b26e0c70fcd33cbcb547e7085bf93f5955c3a23bf06aca0847bffa33df2
Timestamp (utc)
2021-05-08 22:44:49
Fee Paid
0.00004322 BSV
(
0.00859288 BSV
-
0.00854966 BSV
)
Fee Rate
508.8 sat/KB
Version
1
Confirmations
301,191
Size Stats
8,494 B

3 Outputs

Total Output:
0.00854966 BSV
  • jrun cryptofightsM* {"in":0,"ref":["5f66a994627e0ccbc7598c753b5e1c423125ff97515412302103f0ed60dcd232_o1","8aaa71d203b078065bb785b9aa661c1860fe752adec9848bff97707cc46d5cfa_o1","c5a390865e5c94d622a297e00c668db3aaa5d84986c80208e56bfe605d05bc65_o1","1962ddafb989dfbf1d564e286cd9d1832b8a57aaddf772659778cbcdff86cb3f_o1","b3a942efb0e547a9a72abb7af434740024ced7c26b98d66537600054713cf74e_o1","46b7312f8d2b90d586165b6abfde911796ee90caa6da1556a136068ee12e70cd_o1","f97d4ac2a3d6f5ed09fad4a4f341619dc5a3773d9844ff95c99c5d4f8388de2f_o1"],"out":["26715ff9f1342f03808d32dd7cb14222489cc42d568691595c28b413f48e90d5"],"del":[],"cre":["n2Bd4cWhEQK1aVjb1R7EBGV9mrw3etvSdC"],"exec":[{"op":"DEPLOY","data":["function issueRewards(dice, tier) {\n const { Affixes, ItemTypes, RatingRangePerQuality, Tiers, RequiredLevelPerQuality } = FyxClass.deepClone(Compendium);\n const { Ability, Bonus, DamageType, ItemTypeNames, Bonuses } = FyxClass.deepClone(Constants);\n\n /**\n * Puts together a base_item and a set of affixes (named bonuses) to create an item\n */\n const compose = function compose_item(base_item, affix_set, drop_die) {\n expect(affix_set).toBeDefined('Affix set not initialized');\n\n const qualify = function quality_item(item) {\n expect(RatingRangePerQuality).toBeDefined();\n expect(RatingRangePerQuality.length).toBe(6);\n for (let i = 0; i < RatingRangePerQuality.length; i++) {\n const range = RatingRangePerQuality[i];\n const [lower, upper] = range;\n if (lower <= item.rating && item.rating <= upper) {\n return i;\n }\n }\n console.error(`failed to find ${item.rating}`);\n return null;\n };\n\n // Initialize the item with the data from the base_item\n let item = { ...base_item };\n let affixBonuses = affix_set.length > 0 ? affix_set.map(affix => affix.bonuses) : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n\n item.bonuses = Object.keys(Bonus).map(() => 0);\n for (const affixBonus of affixBonuses) {\n for (const key of Object.keys(affixBonus)) {\n item.bonuses[Bonuses[key]] = affixBonus[key];\n }\n }\n\n expect(item.bonuses).toBeDefined('Affix set not initialized');\n\n // Name the item\n item.displayName = ItemTypeNames[item.type];\n if(item.type == null) throw new Error ( `Item has no type, tier:${tier}, drop_die: ${drop_die}, base_item: ${JSON.stringify(base_item)}`);\n if (item.displayName == null) throw new Error(`Item has no name, tier:${tier}, drop_die: ${drop_die}, item_type:${item.type}, item names: ${JSON.stringify(ItemTypeNames)}`);\n let prefixes = affix_set.filter(affix => affix.prefix);\n for (let prefix of prefixes) {\n item.displayName = `${prefix.name} ` + item.displayName;\n }\n let suffixes = affix_set.filter(affix => !affix.prefix);\n for (let i = 0; i < suffixes.length; i++) {\n item.displayName += (i == 0 ? ' of' : (i < suffixes.length - 1 ? ',' : ' and')) + ` ${suffixes[i].name}`;\n }\n\n // Calculate it's rating\n let affix_stacking_rating = affix_set.filter(affix => affix.rating > 0).length;\n item.rating += affix_set.map(affix => affix.rating).reduce((a, b) => a + b, 0) + affix_stacking_rating;\n\n // Give it a quality\n item.quality = qualify(item);\n\n expect(item).toBeDefined('Failed to generate and issue item reward');\n\n item.abilityScoreRequired = Object.keys(Ability).map(() => 1);\n\n item.levelRequired = RequiredLevelPerQuality[item.quality];\n\n item.satoshis = (1+ item.rating) * FyxConfig.minSatoshis; // adding +1 for poor items\n item.classId = `gen1:${item.displayName}`;\n return item;\n };\n\n // figure out how many items we're going to drop\n const n_drop_die = dice.roll(1, 100);\n const n_drops = n_drop_die < 75 ? 1 : (n_drop_die < 99 ? 2 : 1);\n console.log(`Dropping ${n_drops} items`);\n\n console.time('Compose Items');\n\n expect(tier).toBeLessThanOrEqualTo(Tiers.length);\n expect(Tiers[tier - 1]).toBeDefined('Undefined tier');\n const loot_table = Tiers[tier - 1].loot_table;\n expect(loot_table).toBeDefined('Loot table is null');\n\n let items = [];\n rolling:\n while (items.length < n_drops) {\n\n const drop_die = dice.roll(1,100);\n console.log(`Drop die is ${drop_die}`);\n\n const rate_accum = loot_table.map((sum => value => sum += value)(0));\n\n // Find index in rate_accum where drop_die is lower\n let qualityIndex = rate_accum.findIndex(rate => drop_die < rate);\n\n if(qualityIndex < 0 ){\n qualityIndex = RatingRangePerQuality.length -1;\n }\n\n let [lower_rating_range, upper_rating_range] = RatingRangePerQuality[qualityIndex];\n\n // Determine the base items that we're going to drop\n const base_item_subset = ItemTypes.filter((item) => {\n return item.rating <= upper_rating_range + 1;\n });\n\n expect(base_item_subset.length > 0).toBe(true, `All items are too powerful for rating ${upper_rating_range}`);\n\n const base_item = base_item_subset.length == 1 ? base_item_subset[0] : base_item_subset[dice.roll(1, base_item_subset.length) - 1];\n\n const TierNames = ['Poor', 'Common', 'Uncommon', 'Rare', 'Epic', 'Legendary'];\n console.log(`Attempting to drop a ${TierNames[qualityIndex]} ${ItemTypeNames[base_item.type]} of rating ${lower_rating_range} to ${upper_rating_range} on tier ${tier}`);\n let affixes = [];\n let valid_affixes = Affixes.filter(affix => base_item.validAffixes.includes(affix.name));\n const affix_rating_reducer = (accumulator, affix) => {\n return accumulator + affix.rating;\n };\n\n let rating = base_item.rating;\n while (lower_rating_range > rating || rating > upper_rating_range) {\n let increase_rating = rating < lower_rating_range;\n\n // Filter wrong 'direction'\n valid_affixes = valid_affixes.filter(a => a.rating < 0 && !increase_rating || a.rating > 0 && increase_rating);\n\n let previous_bonuses = [];\n affixes.forEach(affix => {\n previous_bonuses.push.apply(previous_bonuses, Object.keys(affix.bonuses));\n });\n\n // Filter affixes with similar bonus\n valid_affixes = valid_affixes.filter(a => {\n let bonuses = Object.keys(a.bonuses);\n for(let i = 0; i < bonuses.length; i++){\n if (previous_bonuses.includes(bonuses[i])) {\n return false;\n }\n }\n return true;\n });\n\n if (valid_affixes.length == 0) {\n console.log(`Re-rolling we don't have more affixes to try`);\n continue rolling;\n }\n\n let affix_index = affixes.length == 1 ? 0 : dice.roll(1, valid_affixes.length) - 1; // Random affix index\n let affix = valid_affixes.splice(affix_index, 1)[0];\n affixes.push(affix);\n\n rating = base_item.rating + affixes.reduce(affix_rating_reducer, 0);\n }\n\n if (base_item.rating + affixes.reduce(affix_rating_reducer, 0) > upper_rating_range) {\n console.log(`Re-rolling because item is too strong`);\n continue rolling;\n }\n\n const item = compose(base_item, affixes, drop_die);\n delete item.validAffixes;\n // console.log(item);\n\n // Here we have both a base_item and it's affixes that match the lower/upper rating range\n items.push(item);\n \n }\n console.timeEnd('Compose Items');\n\n console.log('Rewards Issued');\n return items;\n}",{"deps":{"Compendium":{"$jig":0},"Constants":{"$jig":1},"FyxClass":{"$jig":2},"FyxConfig":{"$jig":3},"FyxItem":{"$jig":4},"Sha256":{"$jig":5},"expect":{"$jig":6}},"hash":"dd3406cb29b4e3367a52e3d0eb74689e5b4361a0e5e9820179b16bddf2a4eae2"}]}]}
    https://whatsonchain.com/tx/93899b26e0c70fcd33cbcb547e7085bf93f5955c3a23bf06aca0847bffa33df2