diff --git a/smartweave/.gitignore b/smartweave/.gitignore index 0d32806..4231d67 100644 --- a/smartweave/.gitignore +++ b/smartweave/.gitignore @@ -93,5 +93,3 @@ sw.* # warp cache cache/ - -data/ diff --git a/smartweave/README.md b/smartweave/README.md index 519f49e..897776b 100644 --- a/smartweave/README.md +++ b/smartweave/README.md @@ -248,6 +248,20 @@ type DistributionResult = { networkScore: string distributedTokens: string } + quality: { + enabled: boolean + tokensDistributedPerSecond: string + settings: { + uptime: { + [days: number]: number + } + } + uptime: { + [fingerprint: Fingerprint]: number + } + networkScore: string + distributedTokens: string + } } multipliers: { family: { @@ -266,6 +280,7 @@ type DistributionResult = { distributedTokens: string bonuses: { hardware: string + quality: string } multipliers: { family: string @@ -284,6 +299,18 @@ type DistributionState = { enabled: boolean tokensDistributedPerSecond: string fingerprints: Fingerprint[] + }, + quality: { + enabled: boolean + tokensDistributedPerSecond: string + settings: { + uptime: { + [days: number]: number + } + } + uptime: { + [fingerprint: Fingerprint]: number + } } } pendingDistributions: { @@ -337,11 +364,29 @@ type DistributionState = { setHardwareBonusRate(tokensDistributedPerSecond: string) => void ``` +- Allows Owner to set quality bonus distribution rate **in atomic units** per + second + ```typescript + setQualityTierBonusRate(tokensDistributedPerSecond: string) => void + ``` + - Allows Owner to toggle hardware bonus on or off ```typescript toggleHardwareBonus(enabled: boolean) => void ``` +- Allows Owner to toggle quality bonus on or off + ```typescript + toggleQualityTierBonus(enabled: boolean) => void + ``` + +- Allows Owner to set quality bonus settings + ```typescript + setQualityTierBonusSettings( + settings: { uptime: { [days: number]: number } } + ) => void + ``` + - Allows Owner to add fingerprints to a bonus pool. Currently only 'hardware' ```typescript addFingerprintsToBonus( @@ -350,6 +395,11 @@ type DistributionState = { ) => void ``` +- Allows Owner to set fingerprint uptimes for quality bonus + ```typescript + setQualityTierUptimes(uptimes: { [fingerprint: Fingerprint]: number }) => void + ``` + - Allows Owner to remove fingerprints from a bonus pool. Currently only 'hardware' ```typescript diff --git a/smartweave/data/test-data.json b/smartweave/data/test-data.json new file mode 100644 index 0000000..28f253b --- /dev/null +++ b/smartweave/data/test-data.json @@ -0,0 +1,114 @@ +{ + "families": [ + { + "fingerprint": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "add": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + ] + }, + { + "fingerprint": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "add": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + ] + }, + { + "fingerprint": "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + "add": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + ] + }, + { + "fingerprint": "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "add": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + ] + }, + { + "fingerprint": "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "add": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + ] + }, + { + "fingerprint": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "add": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + ] + } + ], + "relays": [ + { + "address": "0xB109188f495c61659804b054C7Bc9f10435D9095", + "fingerprint": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "nickname": "B109-test-relay-1" + }, + { + "address": "0xB109188f495c61659804b054C7Bc9f10435D9095", + "fingerprint": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "nickname": "B109-test-relay-2" + }, + { + "address": "0xB109188f495c61659804b054C7Bc9f10435D9095", + "fingerprint": "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + "nickname": "B109-test-relay-3" + }, + { + "address": "0xB109188f495c61659804b054C7Bc9f10435D9095", + "fingerprint": "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "nickname": "B109-test-relay-4" + }, + { + "address": "0xB109188f495c61659804b054C7Bc9f10435D9095", + "fingerprint": "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "nickname": "B109-test-relay-5" + }, + { + "address": "0xB109188f495c61659804b054C7Bc9f10435D9095", + "fingerprint": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "nickname": "B109-test-relay-6" + } + ], + "scores": [ + { + "address": "0xB109188f495c61659804b054C7Bc9f10435D9095", + "score": "1000", + "fingerprint": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + { + "address": "0xB109188f495c61659804b054C7Bc9f10435D9095", + "score": "1000", + "fingerprint": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" + } + ] +} diff --git a/smartweave/scripts/util/quality-results-to-json.ts b/smartweave/scripts/util/quality-results-to-json.ts new file mode 100644 index 0000000..f8d14bc --- /dev/null +++ b/smartweave/scripts/util/quality-results-to-json.ts @@ -0,0 +1,137 @@ +import { readFileSync } from 'fs' + +const resultsPath = + `${__dirname}/../../test/e2e/data/results_quality_bonuses.csv` +const resultsCSVBuffer = readFileSync(resultsPath) +const resultsCSV = resultsCSVBuffer.toString() +const results = resultsCSV.split('\r\n') +results.shift() // NB: get rid of header in csv +const rewards = [] + +let baseNetworkScore = 0 +let baseActualDistributedTokens = 0 + +let familyMultiplierNetworkScore = 0 +let familyMultiplierActualDistributedTokens = 0 + +let qualityBonusNetworkScore = 0 +let qualityBonusActualDistributedTokens = 0 + +let hwBonusNetworkScore = 0 +let hwBonusActualDistributedTokens = 0 + +let hwBonusNetworkScoreWithFamilyMultiplier = 0 +let hwBonusActualDistributedTokensWithFamilyMultiplier = 0 + +let totalNetworkScore = 0 +let totalActualDistributedTokens = 0 + +for (const result of results) { + const [ + r1, + r2, + address, + + baseScore, + basePercentShare, + baseReward, + + familyMultiplierScore, + familyMultiplierPercentShare, + familyMultiplierReward, + + qualityBonusScore, + qualityBonusPercentShare, + qualityBonusReward, + + qualityBonusScoreWithFamilyMultiplier, + qualityBonusPercentShareWithFamilyMultiplier, + qualityBonusRewardWithFamilyMultiplier, + + hwBonusScore, + hwBonusPercentShare, + hwBonusReward, + + hwBonusScoreWithFamilyMultiplier, + hwBonusPercentShareWithFamilyMultiplier, + hwBonusRewardWithFamilyMultiplier, + + totalReward, + totalRewardWithFamilyMultiplier + ] = result.split(',') + + baseNetworkScore += Number.parseInt(baseScore) + baseActualDistributedTokens += Number.parseInt(baseReward) + + familyMultiplierNetworkScore += Number.parseInt(familyMultiplierScore) + familyMultiplierActualDistributedTokens += Number.parseInt(familyMultiplierReward) + + qualityBonusNetworkScore += Number.parseInt(qualityBonusScore) + qualityBonusActualDistributedTokens += Number.parseInt(qualityBonusReward) + + hwBonusNetworkScore += Number.parseInt(hwBonusScore) + hwBonusActualDistributedTokens += Number.parseInt(hwBonusReward) + + hwBonusNetworkScoreWithFamilyMultiplier += Number.parseInt(hwBonusScoreWithFamilyMultiplier) + hwBonusActualDistributedTokensWithFamilyMultiplier += Number.parseInt(hwBonusRewardWithFamilyMultiplier) + + totalNetworkScore += + Number.parseInt(baseScore) + + Number.parseInt(hwBonusScoreWithFamilyMultiplier) + + Number.parseInt(qualityBonusScore) + totalActualDistributedTokens += Number.parseInt(totalReward) + + rewards.push({ + address, + + baseScore, + basePercentShare, + baseReward, + + familyMultiplierScore, + familyMultiplierPercentShare, + familyMultiplierReward, + + qualityBonusScore, + qualityBonusPercentShare, + qualityBonusReward, + + hwBonusScore, + hwBonusPercentShare, + hwBonusReward, + + hwBonusScoreWithFamilyMultiplier, + hwBonusPercentShareWithFamilyMultiplier, + hwBonusRewardWithFamilyMultiplier, + + totalReward + }) +} + +const output = { + baseNetworkScore: baseNetworkScore.toString(), + baseActualDistributedTokens: baseActualDistributedTokens.toString(), + + familyMultiplierNetworkScore: familyMultiplierNetworkScore.toString(), + familyMultiplierActualDistributedTokens: + familyMultiplierActualDistributedTokens.toString(), + + qualityBonusNetworkScore: qualityBonusNetworkScore.toString(), + qualityBonusActualDistributedTokens: + qualityBonusActualDistributedTokens.toString(), + + hwBonusNetworkScore: hwBonusNetworkScore.toString(), + hwBonusActualDistributedTokens: hwBonusActualDistributedTokens.toString(), + + hwBonusNetworkScoreWithFamilyMultiplier: + hwBonusNetworkScoreWithFamilyMultiplier.toString(), + hwBonusActualDistributedTokensWithFamilyMultiplier: + hwBonusActualDistributedTokensWithFamilyMultiplier.toString(), + + totalNetworkScore: totalNetworkScore.toString(), + totalActualDistributedTokens: totalActualDistributedTokens.toString(), + + rewards +} + +console.log(JSON.stringify(output, undefined, 2)) diff --git a/smartweave/scripts/util/quality-scores-to-json.ts b/smartweave/scripts/util/quality-scores-to-json.ts new file mode 100644 index 0000000..ae7871e --- /dev/null +++ b/smartweave/scripts/util/quality-scores-to-json.ts @@ -0,0 +1,71 @@ +import { readFileSync } from 'fs' + +const scoresPath = + `${__dirname}/../../test/e2e/data/scores_quality_bonuses.csv` +const scoresCSVBuffer = readFileSync(scoresPath) +const scoresCSV = scoresCSVBuffer.toString() +const scores = scoresCSV.split('\r\n') +scores.shift() // NB: get rid of header in csv + +type ScoresJsonOutput = { + address: string + score: string + fingerprint: string + hardware: boolean + hwScore: string + familyMultiplier: string, + familySize: string, + scoreWithFamilyMultiplier: string, + hwScoreWithFamilyMultiplier: string, + family?: string[], + uptime: string, + uptimeScore: string, + uptimeScoreWithFamilyMultiplier: string +} + +const output: ScoresJsonOutput[] = [] + +for (const scoreData of scores) { + const [ + r1, + r2, + fingerprint, + address, + score, + isHardware, + hwScore, + familyMultiplier, + familySize, + uptime, + uptimeScore, + uptimeScoreWithFamilyMultiplier, + scoreWithFamilyMultiplier, + hwScoreWithFamilyMultiplier, + family + ] = scoreData.split(',') + + const parsedFamily = family.length > 0 ? family.split((' | ')) : [] + + const anOutput: ScoresJsonOutput = { + address, + fingerprint, + score, + hardware: isHardware === 'Y', + hwScore, + familyMultiplier, + familySize, + scoreWithFamilyMultiplier, + hwScoreWithFamilyMultiplier, + uptime, + uptimeScore, + uptimeScoreWithFamilyMultiplier + } + + if (parsedFamily.length > 0) { + anOutput.family = parsedFamily + } + + output.push(anOutput) +} + +console.log(JSON.stringify(output, undefined, 2)) diff --git a/smartweave/src/contracts/distribution.ts b/smartweave/src/contracts/distribution.ts index 380f796..7c9a191 100644 --- a/smartweave/src/contracts/distribution.ts +++ b/smartweave/src/contracts/distribution.ts @@ -16,7 +16,13 @@ import { assertValidFingerprint } from '../util' import { ContractFunctionInput, EvmAddress, Fingerprint } from '../common/types' -import { DUPLICATE_FINGERPRINT, ENABLED_REQUIRED, FAMILIES_REQUIRED, FINGERPRINTS_MUST_BE_ARRAY, INVALID_FAMILY } from '../common/errors' +import { + DUPLICATE_FINGERPRINT, + ENABLED_REQUIRED, + FAMILIES_REQUIRED, + FINGERPRINTS_MUST_BE_ARRAY, + INVALID_FAMILY +} from '../common/errors' export const INVALID_DISTRIBUTION_AMOUNT = 'Invalid distribution amount' export const INVALID_TIMESTAMP = 'Invalid timestamp' @@ -31,6 +37,8 @@ export const INVALID_LIMIT = 'Invalid limit - must be a positive integer' export const VALID_BONUS_NAME_REQUIRED = 'Valid bonus name required' export const FINGERPRINT_NOT_IN_BONUS = 'Fingerprint is not in bonus' export const INVALID_FAMILY_MULTIPLIER_RATE = 'Invalid family multiplier rate' +export const INVALID_QUALITY_BONUS_SETTINGS = 'Invalid quality bonus settings' +export const INVALID_UPTIMES = 'Invalid uptimes' export type Score = { score: string @@ -50,6 +58,20 @@ export type DistributionResult = { networkScore: string distributedTokens: string } + quality: { + enabled: boolean + tokensDistributedPerSecond: string + settings: { + uptime: { + [days: number]: number + } + } + uptime: { + [fingerprint: Fingerprint]: number + } + networkScore: string + distributedTokens: string + } } multipliers: { family: { @@ -68,6 +90,7 @@ export type DistributionResult = { distributedTokens: string bonuses: { hardware: string + quality: string } multipliers: { family: string @@ -84,6 +107,18 @@ export type DistributionState = OwnableState & EvolvableState & { enabled: boolean tokensDistributedPerSecond: string fingerprints: Fingerprint[] + }, + quality: { + enabled: boolean + tokensDistributedPerSecond: string + settings: { + uptime: { + [days: number]: number + } + } + uptime: { + [fingerprint: Fingerprint]: number + } } } pendingDistributions: { @@ -131,11 +166,35 @@ export interface SetHardwareBonusRate extends ContractFunctionInput { tokensDistributedPerSecond: string } +export interface SetQualityTierBonusRate extends ContractFunctionInput { + function: 'setQualityTierBonusRate' + tokensDistributedPerSecond: string +} + export interface ToggleHardwareBonus extends ContractFunctionInput { function: 'toggleHardwareBonus' enabled: boolean } +export interface ToggleQualityTierBonus extends ContractFunctionInput { + function: 'toggleQualityTierBonus' + enabled: boolean +} + +export interface SetQualityTierBonusSettings extends ContractFunctionInput { + function: 'setQualityTierBonusSettings' + settings: { + uptime: { + [days: number]: number + } + } +} + +export interface SetQualityTierUptimes extends ContractFunctionInput { + function: 'setQualityTierUptimes', + uptimes: { [fingerprint: Fingerprint]: number } +} + export interface AddFingerprintsToBonus extends ContractFunctionInput { function: 'addFingerprintsToBonus' bonusName: string @@ -244,6 +303,14 @@ export class DistributionContract extends Evolvable(Object) { enabled: false, tokensDistributedPerSecond: '0', fingerprints: [] + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + settings: { + uptime: {} + }, + uptime: {} } } } @@ -298,11 +365,14 @@ export class DistributionContract extends Evolvable(Object) { baseDistributedTokens: BigNumber, hwBonusNetworkScore: BigNumber, hwBonusDistributedTokens: BigNumber, + qualityBonusNetworkScore: BigNumber, + qualityBonusDistributedTokens: BigNumber, details: DistributionResult['details'] ) { const totalTokensDistributedPerSecond = BigNumber(state.tokensDistributedPerSecond) .plus(BigNumber(state.bonuses.hardware.tokensDistributedPerSecond)) + .plus(BigNumber(state.bonuses.quality.tokensDistributedPerSecond)) .toString() const totalNetworkScore = baseNetworkScore @@ -325,6 +395,11 @@ export class DistributionContract extends Evolvable(Object) { state.bonuses.hardware.tokensDistributedPerSecond, networkScore: hwBonusNetworkScore.toString(), distributedTokens: hwBonusDistributedTokens.toString() + }, + quality: { + ...state.bonuses.quality, + networkScore: qualityBonusNetworkScore.toString(), + distributedTokens: qualityBonusDistributedTokens.toString() } }, totalTokensDistributedPerSecond, @@ -355,10 +430,12 @@ export class DistributionContract extends Evolvable(Object) { timestamp: string ) { const { scores } = state.pendingDistributions[timestamp] - const hwScores = scores.filter( - ({ address }) => state.bonuses.hardware.fingerprints.includes(address) - ) - const { baseNetworkScore, hwBonusNetworkScore } = scores.reduce( + const { + baseNetworkScore, + hwBonusNetworkScore, + qualityBonusNetworkScore, + qualityScores + } = scores.reduce( (totals, { fingerprint, score, address }) => { let scoreWithMultipliers = BigNumber(score) if ( @@ -386,6 +463,25 @@ export class DistributionContract extends Evolvable(Object) { hwScoreWithMultipliers = scoreWithMultipliers } + let qualityScore = BigNumber(0) + if (state.bonuses.quality.enabled) { + const uptime = state.bonuses.quality.uptime[fingerprint] || 0 + const uptimeTierDayThresholds = Object + .keys(state.bonuses.quality.settings.uptime) + .map(d => Number.parseInt(d)) + for (const uptimeTierDayThreshold of uptimeTierDayThresholds) { + if (uptime >= uptimeTierDayThreshold) { + qualityScore = BigNumber( + state.bonuses.quality.settings.uptime[uptimeTierDayThreshold] + ) + } else { + break + } + } + + totals.qualityScores[fingerprint] = qualityScore + } + return { ...totals, baseNetworkScore: totals @@ -393,13 +489,28 @@ export class DistributionContract extends Evolvable(Object) { .plus(scoreWithMultipliers), hwBonusNetworkScore: totals .hwBonusNetworkScore - .plus(hwScoreWithMultipliers) - } + .plus(hwScoreWithMultipliers), + qualityBonusNetworkScore: totals + .qualityBonusNetworkScore + .plus(qualityScore) + } }, - { baseNetworkScore: BigNumber(0), hwBonusNetworkScore: BigNumber(0) } + { + baseNetworkScore: BigNumber(0), + hwBonusNetworkScore: BigNumber(0), + qualityBonusNetworkScore: BigNumber(0), + qualityScores: {} as { [fingerprint: Fingerprint]: BigNumber } + } ) - return { scores, hwScores, baseNetworkScore, hwBonusNetworkScore } + return { + scores, + qualityScores, + + baseNetworkScore, + hwBonusNetworkScore, + qualityBonusNetworkScore + } } private calculateEpochTokens( @@ -407,7 +518,9 @@ export class DistributionContract extends Evolvable(Object) { epochLengthInMs: number, scores: Score[], baseNetworkScore: BigNumber, - hwBonusNetworkScore: BigNumber + hwBonusNetworkScore: BigNumber, + qualityScores: { [fingerprint: string]: BigNumber }, + qualityBonusNetworkScore: BigNumber ) { const baseTokensToDistribute = BigNumber(state.tokensDistributedPerSecond) .times(BigNumber(epochLengthInMs)) @@ -418,8 +531,14 @@ export class DistributionContract extends Evolvable(Object) { .times(BigNumber(epochLengthInMs)) .dividedBy(1000) + const qualityBonusTokensToDistribute = + BigNumber(state.bonuses.quality.tokensDistributedPerSecond) + .times(BigNumber(epochLengthInMs)) + .dividedBy(1000) + let baseActualDistributedTokens = BigNumber(0) let hwBonusActualDistributedTokens = BigNumber(0) + let qualityBonusActualDistributedTokens = BigNumber(0) const details: DistributionResult['details'] = {} for (let i = 0; i < scores.length; i++) { const { score, address, fingerprint } = scores[i] @@ -463,9 +582,20 @@ export class DistributionContract extends Evolvable(Object) { } hwBonusActualDistributedTokens = hwBonusActualDistributedTokens .plus(hwBonusRedeemableTokens) + + let qualityBonusRedeemableTokens = BigNumber(0) + if (state.bonuses.quality.enabled) { + qualityBonusRedeemableTokens = qualityScores[fingerprint] + .dividedBy(qualityBonusNetworkScore) + .times(qualityBonusTokensToDistribute) + .integerValue(BigNumber.ROUND_FLOOR) + } + qualityBonusActualDistributedTokens = qualityBonusActualDistributedTokens + .plus(qualityBonusRedeemableTokens) const redeemableTokens = baseRedeemableTokens .plus(hwBonusRedeemableTokens) + .plus(qualityBonusRedeemableTokens) const previouslyRedeemableTokens = state.claimable[address] || '0' state.claimable[address] = BigNumber(previouslyRedeemableTokens) @@ -477,7 +607,8 @@ export class DistributionContract extends Evolvable(Object) { score, distributedTokens: redeemableTokens.toString(), bonuses: { - hardware: hwBonusRedeemableTokens.toString() + hardware: hwBonusRedeemableTokens.toString(), + quality: qualityBonusRedeemableTokens.toString() }, multipliers: { family: familyMultiplier.toString(), @@ -489,6 +620,7 @@ export class DistributionContract extends Evolvable(Object) { return { baseActualDistributedTokens, hwBonusActualDistributedTokens, + qualityBonusActualDistributedTokens, details } } @@ -562,8 +694,10 @@ export class DistributionContract extends Evolvable(Object) { const lastDistribution = this.getLatestDistribution(state) const { scores, + qualityScores, baseNetworkScore, - hwBonusNetworkScore + hwBonusNetworkScore, + qualityBonusNetworkScore } = this.calculateEpochScores(state, timestamp) const epochLengthInMs = lastDistribution ? Number.parseInt(timestamp) - lastDistribution @@ -572,6 +706,7 @@ export class DistributionContract extends Evolvable(Object) { let distributionResult = { baseActualDistributedTokens: BigNumber(0), hwBonusActualDistributedTokens: BigNumber(0), + qualityBonusActualDistributedTokens: BigNumber(0), details: {} as DistributionResult['details'] } if (lastDistribution) { @@ -580,7 +715,9 @@ export class DistributionContract extends Evolvable(Object) { epochLengthInMs, scores, baseNetworkScore, - hwBonusNetworkScore + hwBonusNetworkScore, + qualityScores, + qualityBonusNetworkScore ) } @@ -592,6 +729,8 @@ export class DistributionContract extends Evolvable(Object) { distributionResult.baseActualDistributedTokens, hwBonusNetworkScore, distributionResult.hwBonusActualDistributedTokens, + qualityBonusNetworkScore, + distributionResult.qualityBonusActualDistributedTokens, distributionResult.details ) @@ -635,7 +774,6 @@ export class DistributionContract extends Evolvable(Object) { state: DistributionState, action: ContractInteraction> ) { - // const { timestamp, bonus } = action.input const { input: { tokensDistributedPerSecond } } = action ContractAssert( @@ -650,6 +788,25 @@ export class DistributionContract extends Evolvable(Object) { return { state, result: true } } + @OnlyOwner + setQualityTierBonusRate( + state: DistributionState, + action: ContractInteraction> + ) { + const { input: { tokensDistributedPerSecond } } = action + + ContractAssert( + typeof tokensDistributedPerSecond === 'string' + && BigNumber(tokensDistributedPerSecond).gte(0), + INVALID_DISTRIBUTION_AMOUNT + ) + + state.bonuses.quality.tokensDistributedPerSecond = + tokensDistributedPerSecond + + return { state, result: true } + } + @OnlyOwner toggleHardwareBonus( state: DistributionState, @@ -664,6 +821,20 @@ export class DistributionContract extends Evolvable(Object) { return { state, result: true } } + @OnlyOwner + toggleQualityTierBonus( + state: DistributionState, + action: ContractInteraction> + ) { + const { input: { enabled } } = action + + ContractAssert(typeof enabled === 'boolean', ENABLED_REQUIRED) + + state.bonuses.quality.enabled = enabled + + return { state, result: true } + } + @OnlyOwner setPreviousDistributionTrackingLimit( state: DistributionState, @@ -700,9 +871,9 @@ export class DistributionContract extends Evolvable(Object) { assertValidFingerprint(fingerprint) } - state.bonuses[ - bonusName as keyof DistributionState['bonuses'] - ].fingerprints.push(...fingerprints) + if (bonusName === 'hardware') { + state.bonuses.hardware.fingerprints.push(...fingerprints) + } return { state, result: true } } @@ -722,17 +893,20 @@ export class DistributionContract extends Evolvable(Object) { VALID_BONUS_NAME_REQUIRED ) ContractAssert(Array.isArray(fingerprints), FINGERPRINTS_MUST_BE_ARRAY) - for (const fingerprint of fingerprints) { - assertValidFingerprint(fingerprint) - const fingerprintBonusIndex = state - .bonuses[bonusName as keyof DistributionState['bonuses']] - .fingerprints - .indexOf(fingerprint) - ContractAssert(fingerprintBonusIndex > -1, FINGERPRINT_NOT_IN_BONUS) - state - .bonuses[bonusName as keyof DistributionState['bonuses']] - .fingerprints - .splice(fingerprintBonusIndex, 1) + + if (bonusName === 'hardware') { + for (const fingerprint of fingerprints) { + assertValidFingerprint(fingerprint) + const fingerprintBonusIndex = state + .bonuses.hardware + .fingerprints + .indexOf(fingerprint) + ContractAssert(fingerprintBonusIndex > -1, FINGERPRINT_NOT_IN_BONUS) + state + .bonuses.hardware + .fingerprints + .splice(fingerprintBonusIndex, 1) + } } return { state, result: true } @@ -822,6 +996,61 @@ export class DistributionContract extends Evolvable(Object) { return { state, result: true } } + + @OnlyOwner + setQualityTierBonusSettings( + state: DistributionState, + action: ContractInteraction< + PartialFunctionInput + > + ) { + const { input: { settings } } = action + + ContractAssert(!!settings, INVALID_QUALITY_BONUS_SETTINGS) + ContractAssert( + typeof settings.uptime === 'object', + INVALID_QUALITY_BONUS_SETTINGS + ) + ContractAssert( + Object + .keys(settings.uptime) + .every(k => !Number.isNaN(Number.parseInt(k))), + INVALID_QUALITY_BONUS_SETTINGS + ) + ContractAssert( + Object + .values(settings.uptime) + .every((v: any) => !Number.isNaN(Number.parseInt(v)) && v > -1), + INVALID_QUALITY_BONUS_SETTINGS + ) + + state.bonuses.quality.settings = settings + + return { state, result: true } + } + + @OnlyOwner + setQualityTierUptimes( + state: DistributionState, + action: ContractInteraction> + ) { + const { input: { uptimes } } = action + + ContractAssert(!!uptimes, INVALID_UPTIMES) + ContractAssert(typeof uptimes === 'object', INVALID_UPTIMES) + const fingerprints = Object.keys(uptimes) + for (const fingerprint of fingerprints) { + assertValidFingerprint(fingerprint) + const uptime = uptimes[fingerprint] + ContractAssert(typeof uptime === 'number', INVALID_UPTIMES) + ContractAssert(Number.isInteger(uptime), INVALID_UPTIMES) + ContractAssert(uptime > -1, INVALID_UPTIMES) + } + + state.bonuses.quality.uptime = uptimes + + return { state, result: true } + } } export function handle( @@ -857,6 +1086,14 @@ export function handle( return contract.toggleFamilyMultipliers(state, action) case 'setFamilies': return contract.setFamilies(state, action) + case 'setQualityTierBonusRate': + return contract.setQualityTierBonusRate(state, action) + case 'toggleQualityTierBonus': + return contract.toggleQualityTierBonus(state, action) + case 'setQualityTierBonusSettings': + return contract.setQualityTierBonusSettings(state, action) + case 'setQualityTierUptimes': + return contract.setQualityTierUptimes(state, action) default: throw new ContractError(INVALID_INPUT) } diff --git a/smartweave/test/e2e/data/results_quality_bonuses.csv b/smartweave/test/e2e/data/results_quality_bonuses.csv new file mode 100644 index 0000000..90fce59 --- /dev/null +++ b/smartweave/test/e2e/data/results_quality_bonuses.csv @@ -0,0 +1,136 @@ +Results,,Address,Base Score,Base Percent Share,Base Reward,Score w Family Mult,Percent Share w Family Mult,Base Reward w Family Mult,Quality Bonus Score,Quality Bonus Percent Share,Quality Bonus Reward,Quality Bonus Score w Family Mult,Quality Bonus Percent Share w Family Mult,Quality Bonus Reward w Family Mult,HW Bonus Score,HW Bonus Percent Share,HW Bonus Reward,HW Bonus Score w Family Mult,HW Bonus Percent Share w Family Mult,HW Bonus Reward w Family Mult,Total Reward,Total Reward w Family Mult +Base Network Score,1793643,0xf2948eDD428305D28DcBd6C284470e3823ee182b,14990,0.84%,722,16489,0.89%,770,4,9.76%,2107,4.4,10.26%,2215,14000,3.55%,1532,15400,3.77%,1629,4361,4506 +Epoch Length (ms),86400,0xa2AA87bE9FaaE25F1aC6E6846eC9589b03625ce0,109000,6.08%,5250,119900,6.49%,5603,1,2.44%,526,1.1,2.56%,553,53000,13.43%,5802,58300,14.28%,6167,11578,12296 +Base Token Rate (token/s),1000,0xF94C4F7e890Bc437137eCCF8bF58C5c842A3cC03,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,1,0.00%,0,1,0.00%,0,0,0 +Base Distributed Tokens Estimate,86400,0x0f67593B4C7A9CF726208a840804185Da0Ba372A,8,0.00%,0,8,0.00%,0,0,0.00%,0,0,0.00%,0,8,0.00%,0,8,0.00%,0,0,0 +Base Actual Distributed Tokens,86340,0xd045A4344362A3CD187bd7e2277Fae8BA067EFd5,6700,0.37%,322,6700,0.36%,313,2,4.88%,1053,2,4.66%,1006,6700,1.70%,733,6700,1.64%,708,2108,2074 +Base Actual Distributed Tokens w Family Mult,86340,0x3ceb890224dAaB095745d3fa18e17F83699705ad,28000,1.56%,1348,28000,1.51%,1308,0,0.00%,0,0,0.00%,0,28000,7.10%,3065,28000,6.86%,2962,4413,4270 +HW Bonus Network Score,394570,0xe486d9D3b99a0B9CD35a511401D928E527844b43,8,0.00%,0,8,0.00%,0,0,0.00%,0,0,0.00%,0,8,0.00%,0,8,0.00%,0,0,0 +HW Bonus Token Rate (token/s),500,0x0a14181c3845c0C4eE574C2564B01affA400242F,85000,4.74%,4094,93500,5.06%,4369,0,0.00%,0,0,0.00%,0,52000,13.18%,5693,57200,14.01%,6051,9787,10420 +HW Bonus Distributed Tokens Estimate,43200,0x7Fa0963a8CB41d12C0bBa4286141dd71Ba158F44,11000,0.61%,529,11000,0.59%,514,0,0.00%,0,0,0.00%,0,11000,2.79%,1204,11000,2.69%,1163,1733,1677 +HW Bonus Actual Distributed Tokens,43184,0x0184FC55d9AC8856Fc365BDc70825756c9D438fc,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,1,0.00%,0,1,0.00%,0,0,0 +HW Bonus Actual Distributed Tokens w Family Mult,43187,0xFA579D17a320AA2B226aD068B5597aaFd493a56d,7,0.00%,0,7,0.00%,0,0,0.00%,0,0,0.00%,0,7,0.00%,0,7,0.00%,0,0,0 +Quality Bonus Network Score,41,0xDf548c35DBA62A1B0A5FB1E365E2539935487408,12101,0.67%,582,14521.2,0.79%,678,0,0.00%,0,0,0.00%,0,1,0.00%,0,1.2,0.00%,0,582,678 +Quality Bonus Token Rate (token/s),250,0xDD3A2390CeFa80c1eCF5771636A4F49F2B8956C8,31000,1.73%,1493,31000,1.68%,1448,0,0.00%,0,0,0.00%,0,31000,7.86%,3394,31000,7.59%,3279,4887,4727 +Quality Bonus Distributed Tokens Estimate,21600,0xBbbB5ABEC6730e96Da0e7E91564E4090117c39Cd,47000,2.62%,2263,47000,2.54%,2196,0,0.00%,0,0,0.00%,0,47000,11.91%,5145,47000,11.51%,4972,7408,7168 +Quality Bonus Actual Distributed Tokens,21584,0x778B01147C894C76909D9C889e8F9e0D55328FA9,260,0.01%,12,260,0.01%,12,0,0.00%,0,0,0.00%,0,260,0.07%,28,260,0.06%,27,40,39 +Quality Bonus Actual Distributed Tokens w Family Mult,15547,0x85Bd2dEE3233A1469E2217ee9520a39A2137d442,5426,0.30%,261,5968.6,0.32%,278,2,4.88%,1053,2.2,5.13%,1107,26,0.01%,2,28.6,0.01%,3,1316,1334 +Family Multiplier Rate,0.10,0xAbcd54201697adC79bD0d012E0Bb8bC4c9572eF9,16000,0.89%,770,16000,0.87%,747,0,0.00%,0,0,0.00%,0,16000,4.06%,1751,16000,3.92%,1692,2521,2439 +Base Network Score w Family Mult,1848798.2,0x605782a5D874cB2B8b25B0D72CD111e468a0068b,7,0.00%,0,7,0.00%,0,0,0.00%,0,0,0.00%,0,7,0.00%,0,7,0.00%,0,0,0 +HW Bonus Network Score w Family Mult,408353.8,0x79B4E22F291d18116B70199C62A8c360ad248c93,40810,2.28%,1965,44891,2.43%,2097,0,0.00%,0,0,0.00%,0,810,0.21%,88,891,0.22%,94,2053,2191 +Quality Bonus Network Score w Family Mult,42.9,0xCd5D478686c6fA5E47Fc457F16E04224cD012690,18028,1.01%,868,19830.8,1.07%,926,0,0.00%,0,0,0.00%,0,18000,4.56%,1970,19800,4.85%,2094,2838,3020 +Total Network Score,2188213,0xA0f166b408316C01c778Ea51A35991CbeD0630B2,55000,3.07%,2649,55000,2.97%,2570,0,0.00%,0,0,0.00%,0,55000,13.94%,6021,55000,13.47%,5818,8670,8388 +Total Network Score w Family Mult,2257152,0x77B789133012751720cF50781d31Bb56Fb4B97dA,38000,2.12%,1830,38000,2.06%,1775,0,0.00%,0,0,0.00%,0,38000,9.63%,4160,38000,9.31%,4020,5990,5795 +Total Token Rate (token/s),1750,0x887b7E335f75E69ecaf1376F057667562269d7DC,3200,0.18%,154,3200,0.17%,149,0,0.00%,0,0,0.00%,0,3200,0.81%,350,3200,0.78%,338,504,487 +Total Distributed Tokens Estimate,151200,0x52285B51Fb4E0Ac159AC46aD12Ef792E02cD214d,1500,0.08%,72,1500,0.08%,70,0,0.00%,0,0,0.00%,0,1500,0.38%,164,1500,0.37%,158,236,228 +Total Actual Distributed Tokens,151108,0xcb7a940167172CE2c6E4EaD25FD0ff1cede432A6,3200,0.18%,154,3200,0.17%,149,0,0.00%,0,0,0.00%,0,3200,0.81%,350,3200,0.78%,338,504,487 +Total Actual Distributed Tokens w Family Mult,145074,0x8E02Ff09b8Fa6047122c2adBB40029cA444F5974,100,0.01%,4,100,0.01%,4,0,0.00%,0,0,0.00%,0,100,0.03%,10,100,0.02%,10,14,14 +,,0x172253954c395832a9e264FbD8f248221d4a92B6,1400,0.08%,67,1400,0.08%,65,0,0.00%,0,0,0.00%,0,1400,0.35%,153,1400,0.34%,148,220,213 +,,0xDd29C85d9FDe419dcaF7cB3eCba603f1328eeF32,340,0.02%,16,340,0.02%,15,0,0.00%,0,0,0.00%,0,340,0.09%,37,340,0.08%,35,53,50 +,,0xa594dc6755fDF82dF1ddB20cd8DE2c04Faa6a5a9,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,1,0.00%,0,1,0.00%,0,0,0 +,,0x7E0781f0e035a16F5F3cf833d99D69E1e0036039,14000,0.78%,674,14000,0.76%,654,0,0.00%,0,0,0.00%,0,14000,3.55%,1532,14000,3.43%,1481,2206,2135 +,,0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331,24700,1.38%,1189,32110,1.74%,1500,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,1715,2026 +,,0xc93473826F40100aE06E2E02F351C30c7f985bf7,3600,0.20%,173,3600,0.19%,168,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,173,168 +,,0xBB1973a07b9802bD1bb2B868c96d6C8a6BB0Ac50,20,0.00%,0,20,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x6F46735673bbBE1Ff346B1a0Aa45fd2B611216dB,760,0.04%,36,760,0.04%,35,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,36,35 +,,0x0e8D6c66CF65Ff3553B5cfFF7F937E51CEAea1D4,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xB09Bdac8b7a4faE53EAC7D2F5e2E99A8170Cb817,38,0.00%,1,38,0.00%,1,1,2.44%,526,1,2.33%,503,0,0.00%,0,0,0.00%,0,527,527 +,,0xf4743bf3d7Aa0Cd2d6f2a5fB634B401D8db60987,870,0.05%,41,870,0.05%,40,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,41,40 +,,0xf0Ca6fE447d26489BfC712A41835BBC7dD69dED6,600,0.03%,28,600,0.03%,28,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,28,28 +,,0x7Add71Ad0477D36F45f849b7a81c7d2Ba4543cfF,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x94AcDF394C14232aca203b4D1f1854Bc40582878,8,0.00%,0,8,0.00%,0,1,2.44%,526,1,2.33%,503,0,0.00%,0,0,0.00%,0,526,526 +,,0x9Cb10817CAe852C45D8D602097a76a932f6185E6,1670,0.09%,80,2004,0.11%,93,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,80,93 +,,0x3c78053528cCbD382C90A13233c509965fe3451A,280,0.02%,13,280,0.02%,13,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,13,13 +,,0x7f85F0E167Cc229A7eB9B41221D9D8a7965f2949,34000,1.90%,1637,34000,1.84%,1588,1,2.44%,526,1,2.33%,503,0,0.00%,0,0,0.00%,0,2163,2114 +,,0x3eF27C8EEe8261fb5906B2e40daEDFC8E7B3f055,28000,1.56%,1348,33600,1.82%,1570,4,9.76%,2107,0,0.00%,0,0,0.00%,0,0,0.00%,0,3455,3677 +,,0x9aDE33Cf4ca08E46c7f84f82A82FCF5d8A4adA55,45600,2.54%,2196,50160,2.71%,2344,1,2.44%,526,1.1,2.56%,553,0,0.00%,0,0,0.00%,0,2722,2870 +,,0x5B5378870b6A52588e65c914a487F083a2193281,4200,0.23%,202,4200,0.23%,196,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,202,196 +,,0xCBb7352fa31681749a9DB14E14aE80f8AE9A4B3f,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x9b38E17c23673471547d8b031e0EFebB666C985A,16000,0.89%,770,16000,0.87%,747,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,770,747 +,,0xC4e1d4CDf842c19503280dA5db7A4C3761305f88,1000,0.06%,48,1000,0.05%,46,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,48,46 +,,0xe8Bdc142fd025da1D757f1991BC08799d9719C56,730,0.04%,35,730,0.04%,34,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,35,34 +,,0xb2A35680dB7dAe518b058213B629d7a8658163b9,2500,0.14%,120,2500,0.14%,116,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,120,116 +,,0x4768acafFB3aCd3D8Ae4798d423088F8366Bd8Ca,34000,1.90%,1637,34000,1.84%,1588,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1637,1588 +,,0x3941578e47Bcb7AC5f006488De8D0CA8461bB0b5,26,0.00%,1,26,0.00%,1,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,527,527 +,,0x7828a2e11bec453E69232B636668CE6e10774055,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x8824F0091D6d6Ee3beD0645eCBC0E2d8c9c47942,1,0.00%,0,1,0.00%,0,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,526,526 +,,0xa3EE387E97fbeC75A2623A809726c38f6ac19B2D,15000,0.84%,722,15000,0.81%,700,0,0.00%,0,1,2.33%,503,0,0.00%,0,0,0.00%,0,722,700 +,,0x4e6585c9553842C448C5B9a6F2907E3AC2e87239,2800,0.16%,134,3080,0.17%,143,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,134,143 +,,0xE1Fe60B2cD9afC03FCFa1Ef7cA0B27F4E087e5bb,14,0.00%,0,14,0.00%,0,4,9.76%,2107,1,2.33%,503,0,0.00%,0,0,0.00%,0,2107,2107 +,,0x9D0caC8351BD51D5BC537bD62c0410a8DBc78B74,69,0.00%,3,82.8,0.00%,3,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,3,3 +,,0x3eB74a37451737D6a432b192358739ad6Ff4fb39,7000,0.39%,337,7000,0.38%,327,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,337,327 +,,0x4A84876a30B9e0cb3f75a5F69FF282649Dab05a4,9,0.00%,0,9,0.00%,0,0,0.00%,0,4,9.32%,2013,0,0.00%,0,0,0.00%,0,0,0 +,,0x6d525E918432c486618E3eb106703acECC795a43,37000,2.06%,1782,37000,2.00%,1729,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1782,1729 +,,0xdC2daEccA2007B169b8B332db531bCf69aE1f74C,9,0.00%,0,9,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x4ED816a923c4D9CEF68002642b08120083E076FB,2200,0.12%,105,2200,0.12%,102,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,105,102 +,,0xd45d35bC22c19a9979184fC146108eaB0B6AD41c,6300,0.35%,303,6300,0.34%,294,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,303,294 +,,0xBEd5edF3A75F1c132fd913006CD9840D288d2cA9,1700,0.09%,81,1700,0.09%,79,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,607,605 +,,0xF56AB9Af9c118C2A05b528927158Af2e216d7638,6,0.00%,0,6,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xD3ac40ba686AA050396d41E39E328F02cf05f15f,16,0.00%,0,16,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xC2c58DaFE37Ccf2D0bdB0a90194bE969aD05CFFc,60000,3.35%,2890,60000,3.25%,2803,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,3416,3329 +,,0xdF60b603671bd2d2F014fd4e4d6a3657823Df567,48,0.00%,2,52.8,0.00%,2,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,2,2 +,,0x0A393A0dFc3613eeD5Bd2A0A56d482351f4e3996,46000,2.56%,2215,46000,2.49%,2149,0,0.00%,0,1,2.33%,503,0,0.00%,0,0,0.00%,0,2215,2149 +,,0x9DCA83E91041222D20c491F5b25ddC7Ac79Ee53B,53000,2.95%,2553,53000,2.87%,2476,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,2553,2476 +,,0xc60048Fd2bccd82da8A1C0d06B3CF1Bfd7D740A2,14000,0.78%,674,14000,0.76%,654,0,0.00%,0,1.3,3.03%,654,0,0.00%,0,0,0.00%,0,674,654 +,,0x180401CaBa07a348FaA85E138d7B7BeD24d79775,45000,2.51%,2167,45000,2.43%,2102,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,2167,2102 +,,0x6093B4B8C11EBDa4763f06D988eBC160a4DcD683,47000,2.62%,2263,47000,2.54%,2196,0,0.00%,0,1,2.33%,503,0,0.00%,0,0,0.00%,0,2263,2196 +,,0xa4392b4220EafcF6AF73881991ea7254e392D31a,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x14EE8817b5De0849ED7cE0E699BD19EDE7ec5e95,30000,1.67%,1445,30000,1.62%,1401,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1445,1401 +,,0x8e8644FAA2Bf53e3f854Ee472BF08B92CC6a7aa7,7,0.00%,0,7,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x283C184c920102372b5FCD94807675D50A74e668,31000,1.73%,1493,31000,1.68%,1448,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1493,1448 +,,0x5190Efc20E1Ac0D4B5eCe5f6E8D5529925557C90,3400,0.19%,163,3400,0.18%,158,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,163,158 +,,0xB456a8673d19a6FaA5991e4f9169240f1b0ee3f2,7,0.00%,0,7,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x8aCE7EB84412bD73485518C3B5ECB8856931c0bB,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x96f3F2f5Ca72863605B2977a26Aff2B86C4e19D6,83000,4.63%,3998,83000,4.49%,3878,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,3998,3878 +,,0x4B1202F567155524264f1E26Eeb35617BC4fB0df,24000,1.34%,1156,24000,1.30%,1121,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1156,1121 +,,0x2cb5330285A053110d901E605A6F8FFE244fb9f7,25,0.00%,1,25,0.00%,1,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1,1 +,,0xe1aF18F9e5810A80365Ae7B89919540c01184dAc,33000,1.84%,1589,33000,1.78%,1542,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1589,1542 +,,0x22e2AA15d09A30Df7AF620D119806Aec826a55A7,21000,1.17%,1011,21000,1.14%,981,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1011,981 +,,0x40A35FdE2bA34B29FBe699C6A43A6d6690e4345C,14,0.00%,0,14,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x2f5f379033a0e35e784928288E122E7508570D4B,41,0.00%,1,41,0.00%,1,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1,1 +,,0x7bDAE3be9CB620822C576af1fD437056131E341a,7900,0.44%,380,7900,0.43%,369,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,380,369 +,,0xF3117E9F6115289CBE3E408e55c33F5d987250dF,24,0.00%,1,24,0.00%,1,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1,1 +,,0x772136cCDF6653499b9b49b877eEf048752D2ed4,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xe328D2460EFD9F0F887F09A82a2aeBb457fdbDe5,5,0.00%,0,5,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x688143644F42A247DE67bfAD8fB9FBFBbA7Ee021,18000,1.00%,867,18000,0.97%,841,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,867,841 +,,0xCB0C27769f8DB5640E49F058b72E029047D8ef74,13,0.00%,0,13,0.00%,0,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,526,526 +,,0x9f6C41276989252B785E56aff8e051d2Ec4F5E19,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x44E11e790bE68A2378b9343E59F6C2Ae6342E442,5,0.00%,0,5,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xaA491150D2db572F0C445B89A153217815C0E85E,64000,3.57%,3082,64000,3.46%,2990,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,3082,2990 +,,0x586bAB70B10d50Dd1aF1C200E47e3a368B7bE3ce,15000,0.84%,722,15000,0.81%,700,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,1248,1226 +,,0xcb8518C21dB38ef37fF0Bf39Fe95b24D0959C355,1,0.00%,0,1,0.00%,0,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,526,526 +,,0x79E85c7Aa3C289021048B598Be347e3F5CF1F3B7,20000,1.12%,963,20000,1.08%,934,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,963,934 +,,0x54a1354F615D464F7739d515598DB4e6315Ddc4B,36035,2.01%,1735,43242,2.34%,2020,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1735,2020 +,,0x6c8C7a143792eDC723A2eA27B1c3f2235882189d,14000,0.78%,674,14000,0.76%,654,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,674,654 +,,0x898A9Eb0f6e49c8f5D33E678dd4bEfDCff77552A,190,0.01%,9,190,0.01%,8,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,9,8 +,,0x9454d413886A3737c06b10dE11360669C56D5f24,760,0.04%,36,760,0.04%,35,0,0.00%,0,1,2.33%,503,0,0.00%,0,0,0.00%,0,36,35 +,,0x4f485910CC79F27D85591b65e42d890136F3fdE3,9,0.00%,0,9,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xF41A5f015C90Aa260A5F501Ba09e8d00495B6221,6,0.00%,0,6,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x42a9CF0F0F8cF73F1bc34A62e934f244bC00fE35,160,0.01%,7,160,0.01%,7,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,7,7 +,,0x3d1123CCd5E035d5009Abf16870e0877fdFA7e3E,0,0.00%,0,0,0.00%,0,0,0.00%,0,1,2.33%,503,0,0.00%,0,0,0.00%,0,0,0 +,,0x3b9089785C4e941342cf348BC160caDb7D90f2Dc,25,0.00%,1,25,0.00%,1,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1,1 +,,0x1DfC09e0Aef1d576edfa4fFD71FC4cAeaC911d4E,63000,3.51%,3034,63000,3.41%,2944,0,0.00%,0,1,2.33%,503,0,0.00%,0,0,0.00%,0,3034,2944 +,,0x8484D2156b0E9C6ea1D9c149579fE9738efb9118,13,0.00%,0,13,0.00%,0,0,0.00%,0,4.8,11.19%,2416,0,0.00%,0,0,0.00%,0,0,0 +,,0xdA0955B495f3F181c282f5D1b05168706EaF0455,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xF955c822D7151Bf32362aF5cc8f3f283871D3465,20,0.00%,0,20,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xaF044B784D6f7CB3D3d0938f568dE1F3E05E8145,10,0.00%,0,10,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xdB13f6F9BccF5ac30378Ea6DfBCA45eec35AfA33,220,0.01%,10,220,0.01%,10,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,10,10 +,,0x7f34907d02CC0CCd334ee76044da10e7388FDc53,450,0.03%,21,450,0.02%,21,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,21,21 +,,0x493e5f463feB5B13259214E81cF229c5B28303EC,32000,1.78%,1541,32000,1.73%,1495,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1541,1495 +,,0x981F118EdbD9e360863dFA283f05200804825b1A,15000,0.84%,722,15000,0.81%,700,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,722,700 +,,0x5B29f4E4918f5Dc436C8A12f807869aD063d0B3a,22,0.00%,1,22,0.00%,1,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1,1 +,,0xFe1c9385784Db958057BCA11D8f59762Eb4d4D35,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x4dCDb1BEa466136C287D1C522db829571F93b62f,27000,1.51%,1300,27000,1.46%,1261,2,4.88%,1053,0,0.00%,0,0,0.00%,0,0,0.00%,0,2353,2314 +,,0xeA7C91110cc49f97F74f7725BB5148aC9CE7dF51,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0xE2f4b4106C227613DAf4116881811c1745d2cd0f,20,0.00%,0,20,0.00%,0,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,526,526 +,,0x06032e6a223c791DaADf89e4ACf5415eC7384a3B,1,0.00%,0,1,0.00%,0,4,9.76%,2107,0,0.00%,0,0,0.00%,0,0,0.00%,0,2107,2107 +,,0x818b13A69a72D02903d593844aEE5AF552Cc6Cd4,1,0.00%,0,1,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x8ce3456193Eabc7fa2Cd6f3660CA6eBf9f69E63b,63000,3.51%,3034,63000,3.41%,2944,4,9.76%,2107,0,0.00%,0,0,0.00%,0,0,0.00%,0,5141,5051 +,,0x653aC1ED2E637a4f1cc61Ff5F039a8d806D3e272,14,0.00%,0,14,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x41f171ffBfe44a3674bF9f30B47693b9bc62E9b7,110000,6.13%,5298,110000,5.95%,5140,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,5298,5140 +,,0x8D03A395CD9E68409967e4957D6B85ADaF288687,32,0.00%,1,32,0.00%,1,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1,1 +,,0x7B507FbbA9FC5d03d41e18D63a4633f68bb93136,13,0.00%,0,13,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x2eF461FdBEcc607d0b0cA27106C683a8F64468A4,3300,0.18%,158,3300,0.18%,154,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,158,154 +,,0x8e8f2F0bcFab3a53b6d82e299C3d5f6397579e53,4,0.00%,0,4,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0 +,,0x002Eb755BD82B99F052D2cCe67EA4ED10561E49c,1,0.00%,0,1,0.00%,0,1,2.44%,526,0,0.00%,0,0,0.00%,0,0,0.00%,0,526,526 +,,0x477E84277727279FB51E39cdB61642CC8d6B02BA,22,0.00%,1,22,0.00%,1,0,0.00%,0,0,0.00%,0,0,0.00%,0,0,0.00%,0,1,1 \ No newline at end of file diff --git a/smartweave/test/e2e/data/results_quality_bonuses.json b/smartweave/test/e2e/data/results_quality_bonuses.json new file mode 100644 index 0000000..9b9e26d --- /dev/null +++ b/smartweave/test/e2e/data/results_quality_bonuses.json @@ -0,0 +1,2581 @@ +{ + "baseNetworkScore": "1793643", + "baseActualDistributedTokens": "86331", + "familyMultiplierNetworkScore": "1848795", + "familyMultiplierActualDistributedTokens": "86331", + "qualityBonusNetworkScore": "41", + "qualityBonusActualDistributedTokens": "21584", + "hwBonusNetworkScore": "394570", + "hwBonusActualDistributedTokens": "43184", + "hwBonusNetworkScoreWithFamilyMultiplier": "408353", + "hwBonusActualDistributedTokensWithFamilyMultiplier": "43187", + "totalNetworkScore": "2188213", + "totalActualDistributedTokens": "129515", + "rewards": [ + { + "address": "0xf2948eDD428305D28DcBd6C284470e3823ee182b", + "baseScore": "14990", + "basePercentShare": "0.84%", + "baseReward": "722", + "familyMultiplierScore": "16489", + "familyMultiplierPercentShare": "0.89%", + "familyMultiplierReward": "770", + "qualityBonusScore": "4", + "qualityBonusPercentShare": "9.76%", + "qualityBonusReward": "2107", + "hwBonusScore": "14000", + "hwBonusPercentShare": "3.55%", + "hwBonusReward": "1532", + "hwBonusScoreWithFamilyMultiplier": "15400", + "hwBonusPercentShareWithFamilyMultiplier": "3.77%", + "hwBonusRewardWithFamilyMultiplier": "1629", + "totalReward": "4360" + }, + { + "address": "0xa2AA87bE9FaaE25F1aC6E6846eC9589b03625ce0", + "baseScore": "109000", + "basePercentShare": "6.08%", + "baseReward": "5250", + "familyMultiplierScore": "119900", + "familyMultiplierPercentShare": "6.49%", + "familyMultiplierReward": "5603", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "53000", + "hwBonusPercentShare": "13.43%", + "hwBonusReward": "5802", + "hwBonusScoreWithFamilyMultiplier": "58300", + "hwBonusPercentShareWithFamilyMultiplier": "14.28%", + "hwBonusRewardWithFamilyMultiplier": "6167", + "totalReward": "11578" + }, + { + "address": "0xF94C4F7e890Bc437137eCCF8bF58C5c842A3cC03", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "1", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "1", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x0f67593B4C7A9CF726208a840804185Da0Ba372A", + "baseScore": "8", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "8", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "8", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "8", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xd045A4344362A3CD187bd7e2277Fae8BA067EFd5", + "baseScore": "6700", + "basePercentShare": "0.37%", + "baseReward": "322", + "familyMultiplierScore": "6700", + "familyMultiplierPercentShare": "0.36%", + "familyMultiplierReward": "313", + "qualityBonusScore": "2", + "qualityBonusPercentShare": "4.88%", + "qualityBonusReward": "1053", + "hwBonusScore": "6700", + "hwBonusPercentShare": "1.70%", + "hwBonusReward": "733", + "hwBonusScoreWithFamilyMultiplier": "6700", + "hwBonusPercentShareWithFamilyMultiplier": "1.64%", + "hwBonusRewardWithFamilyMultiplier": "708", + "totalReward": "2108" + }, + { + "address": "0x3ceb890224dAaB095745d3fa18e17F83699705ad", + "baseScore": "28000", + "basePercentShare": "1.56%", + "baseReward": "1348", + "familyMultiplierScore": "28000", + "familyMultiplierPercentShare": "1.51%", + "familyMultiplierReward": "1308", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "28000", + "hwBonusPercentShare": "7.10%", + "hwBonusReward": "3065", + "hwBonusScoreWithFamilyMultiplier": "28000", + "hwBonusPercentShareWithFamilyMultiplier": "6.86%", + "hwBonusRewardWithFamilyMultiplier": "2962", + "totalReward": "4413" + }, + { + "address": "0xe486d9D3b99a0B9CD35a511401D928E527844b43", + "baseScore": "8", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "8", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "8", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "8", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x0a14181c3845c0C4eE574C2564B01affA400242F", + "baseScore": "85000", + "basePercentShare": "4.74%", + "baseReward": "4094", + "familyMultiplierScore": "93500", + "familyMultiplierPercentShare": "5.06%", + "familyMultiplierReward": "4369", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "52000", + "hwBonusPercentShare": "13.18%", + "hwBonusReward": "5693", + "hwBonusScoreWithFamilyMultiplier": "57200", + "hwBonusPercentShareWithFamilyMultiplier": "14.01%", + "hwBonusRewardWithFamilyMultiplier": "6051", + "totalReward": "9786" + }, + { + "address": "0x7Fa0963a8CB41d12C0bBa4286141dd71Ba158F44", + "baseScore": "11000", + "basePercentShare": "0.61%", + "baseReward": "529", + "familyMultiplierScore": "11000", + "familyMultiplierPercentShare": "0.59%", + "familyMultiplierReward": "514", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "11000", + "hwBonusPercentShare": "2.79%", + "hwBonusReward": "1204", + "hwBonusScoreWithFamilyMultiplier": "11000", + "hwBonusPercentShareWithFamilyMultiplier": "2.69%", + "hwBonusRewardWithFamilyMultiplier": "1163", + "totalReward": "1733" + }, + { + "address": "0x0184FC55d9AC8856Fc365BDc70825756c9D438fc", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "1", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "1", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xFA579D17a320AA2B226aD068B5597aaFd493a56d", + "baseScore": "7", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "7", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "7", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "7", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xDf548c35DBA62A1B0A5FB1E365E2539935487408", + "baseScore": "12101", + "basePercentShare": "0.67%", + "baseReward": "582", + "familyMultiplierScore": "14521.2", + "familyMultiplierPercentShare": "0.79%", + "familyMultiplierReward": "678", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "1", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "1.2", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "581" + }, + { + "address": "0xDD3A2390CeFa80c1eCF5771636A4F49F2B8956C8", + "baseScore": "31000", + "basePercentShare": "1.73%", + "baseReward": "1493", + "familyMultiplierScore": "31000", + "familyMultiplierPercentShare": "1.68%", + "familyMultiplierReward": "1448", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "31000", + "hwBonusPercentShare": "7.86%", + "hwBonusReward": "3394", + "hwBonusScoreWithFamilyMultiplier": "31000", + "hwBonusPercentShareWithFamilyMultiplier": "7.59%", + "hwBonusRewardWithFamilyMultiplier": "3279", + "totalReward": "4887" + }, + { + "address": "0xBbbB5ABEC6730e96Da0e7E91564E4090117c39Cd", + "baseScore": "47000", + "basePercentShare": "2.62%", + "baseReward": "2263", + "familyMultiplierScore": "47000", + "familyMultiplierPercentShare": "2.54%", + "familyMultiplierReward": "2196", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "47000", + "hwBonusPercentShare": "11.91%", + "hwBonusReward": "5145", + "hwBonusScoreWithFamilyMultiplier": "47000", + "hwBonusPercentShareWithFamilyMultiplier": "11.51%", + "hwBonusRewardWithFamilyMultiplier": "4972", + "totalReward": "7408" + }, + { + "address": "0x778B01147C894C76909D9C889e8F9e0D55328FA9", + "baseScore": "260", + "basePercentShare": "0.01%", + "baseReward": "12", + "familyMultiplierScore": "260", + "familyMultiplierPercentShare": "0.01%", + "familyMultiplierReward": "12", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "260", + "hwBonusPercentShare": "0.07%", + "hwBonusReward": "28", + "hwBonusScoreWithFamilyMultiplier": "260", + "hwBonusPercentShareWithFamilyMultiplier": "0.06%", + "hwBonusRewardWithFamilyMultiplier": "27", + "totalReward": "40" + }, + { + "address": "0x85Bd2dEE3233A1469E2217ee9520a39A2137d442", + "baseScore": "5426", + "basePercentShare": "0.30%", + "baseReward": "261", + "familyMultiplierScore": "5968.6", + "familyMultiplierPercentShare": "0.32%", + "familyMultiplierReward": "278", + "qualityBonusScore": "2", + "qualityBonusPercentShare": "4.88%", + "qualityBonusReward": "1053", + "hwBonusScore": "26", + "hwBonusPercentShare": "0.01%", + "hwBonusReward": "2", + "hwBonusScoreWithFamilyMultiplier": "28.6", + "hwBonusPercentShareWithFamilyMultiplier": "0.01%", + "hwBonusRewardWithFamilyMultiplier": "3", + "totalReward": "1316" + }, + { + "address": "0xAbcd54201697adC79bD0d012E0Bb8bC4c9572eF9", + "baseScore": "16000", + "basePercentShare": "0.89%", + "baseReward": "770", + "familyMultiplierScore": "16000", + "familyMultiplierPercentShare": "0.87%", + "familyMultiplierReward": "747", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "16000", + "hwBonusPercentShare": "4.06%", + "hwBonusReward": "1751", + "hwBonusScoreWithFamilyMultiplier": "16000", + "hwBonusPercentShareWithFamilyMultiplier": "3.92%", + "hwBonusRewardWithFamilyMultiplier": "1692", + "totalReward": "2521" + }, + { + "address": "0x605782a5D874cB2B8b25B0D72CD111e468a0068b", + "baseScore": "7", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "7", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "7", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "7", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x79B4E22F291d18116B70199C62A8c360ad248c93", + "baseScore": "40810", + "basePercentShare": "2.28%", + "baseReward": "1965", + "familyMultiplierScore": "44891", + "familyMultiplierPercentShare": "2.43%", + "familyMultiplierReward": "2097", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "810", + "hwBonusPercentShare": "0.21%", + "hwBonusReward": "88", + "hwBonusScoreWithFamilyMultiplier": "891", + "hwBonusPercentShareWithFamilyMultiplier": "0.22%", + "hwBonusRewardWithFamilyMultiplier": "94", + "totalReward": "2053" + }, + { + "address": "0xCd5D478686c6fA5E47Fc457F16E04224cD012690", + "baseScore": "18028", + "basePercentShare": "1.01%", + "baseReward": "868", + "familyMultiplierScore": "19830.8", + "familyMultiplierPercentShare": "1.07%", + "familyMultiplierReward": "926", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "18000", + "hwBonusPercentShare": "4.56%", + "hwBonusReward": "1970", + "hwBonusScoreWithFamilyMultiplier": "19800", + "hwBonusPercentShareWithFamilyMultiplier": "4.85%", + "hwBonusRewardWithFamilyMultiplier": "2094", + "totalReward": "2838" + }, + { + "address": "0xA0f166b408316C01c778Ea51A35991CbeD0630B2", + "baseScore": "55000", + "basePercentShare": "3.07%", + "baseReward": "2649", + "familyMultiplierScore": "55000", + "familyMultiplierPercentShare": "2.97%", + "familyMultiplierReward": "2570", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "55000", + "hwBonusPercentShare": "13.94%", + "hwBonusReward": "6021", + "hwBonusScoreWithFamilyMultiplier": "55000", + "hwBonusPercentShareWithFamilyMultiplier": "13.47%", + "hwBonusRewardWithFamilyMultiplier": "5818", + "totalReward": "8670" + }, + { + "address": "0x77B789133012751720cF50781d31Bb56Fb4B97dA", + "baseScore": "38000", + "basePercentShare": "2.12%", + "baseReward": "1830", + "familyMultiplierScore": "38000", + "familyMultiplierPercentShare": "2.06%", + "familyMultiplierReward": "1775", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "38000", + "hwBonusPercentShare": "9.63%", + "hwBonusReward": "4160", + "hwBonusScoreWithFamilyMultiplier": "38000", + "hwBonusPercentShareWithFamilyMultiplier": "9.31%", + "hwBonusRewardWithFamilyMultiplier": "4020", + "totalReward": "5990" + }, + { + "address": "0x887b7E335f75E69ecaf1376F057667562269d7DC", + "baseScore": "3200", + "basePercentShare": "0.18%", + "baseReward": "154", + "familyMultiplierScore": "3200", + "familyMultiplierPercentShare": "0.17%", + "familyMultiplierReward": "149", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "3200", + "hwBonusPercentShare": "0.81%", + "hwBonusReward": "350", + "hwBonusScoreWithFamilyMultiplier": "3200", + "hwBonusPercentShareWithFamilyMultiplier": "0.78%", + "hwBonusRewardWithFamilyMultiplier": "338", + "totalReward": "504" + }, + { + "address": "0x52285B51Fb4E0Ac159AC46aD12Ef792E02cD214d", + "baseScore": "1500", + "basePercentShare": "0.08%", + "baseReward": "72", + "familyMultiplierScore": "1500", + "familyMultiplierPercentShare": "0.08%", + "familyMultiplierReward": "70", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "1500", + "hwBonusPercentShare": "0.38%", + "hwBonusReward": "164", + "hwBonusScoreWithFamilyMultiplier": "1500", + "hwBonusPercentShareWithFamilyMultiplier": "0.37%", + "hwBonusRewardWithFamilyMultiplier": "158", + "totalReward": "236" + }, + { + "address": "0xcb7a940167172CE2c6E4EaD25FD0ff1cede432A6", + "baseScore": "3200", + "basePercentShare": "0.18%", + "baseReward": "154", + "familyMultiplierScore": "3200", + "familyMultiplierPercentShare": "0.17%", + "familyMultiplierReward": "149", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "3200", + "hwBonusPercentShare": "0.81%", + "hwBonusReward": "350", + "hwBonusScoreWithFamilyMultiplier": "3200", + "hwBonusPercentShareWithFamilyMultiplier": "0.78%", + "hwBonusRewardWithFamilyMultiplier": "338", + "totalReward": "504" + }, + { + "address": "0x8E02Ff09b8Fa6047122c2adBB40029cA444F5974", + "baseScore": "100", + "basePercentShare": "0.01%", + "baseReward": "4", + "familyMultiplierScore": "100", + "familyMultiplierPercentShare": "0.01%", + "familyMultiplierReward": "4", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "100", + "hwBonusPercentShare": "0.03%", + "hwBonusReward": "10", + "hwBonusScoreWithFamilyMultiplier": "100", + "hwBonusPercentShareWithFamilyMultiplier": "0.02%", + "hwBonusRewardWithFamilyMultiplier": "10", + "totalReward": "14" + }, + { + "address": "0x172253954c395832a9e264FbD8f248221d4a92B6", + "baseScore": "1400", + "basePercentShare": "0.08%", + "baseReward": "67", + "familyMultiplierScore": "1400", + "familyMultiplierPercentShare": "0.08%", + "familyMultiplierReward": "65", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "1400", + "hwBonusPercentShare": "0.35%", + "hwBonusReward": "153", + "hwBonusScoreWithFamilyMultiplier": "1400", + "hwBonusPercentShareWithFamilyMultiplier": "0.34%", + "hwBonusRewardWithFamilyMultiplier": "148", + "totalReward": "220" + }, + { + "address": "0xDd29C85d9FDe419dcaF7cB3eCba603f1328eeF32", + "baseScore": "340", + "basePercentShare": "0.02%", + "baseReward": "16", + "familyMultiplierScore": "340", + "familyMultiplierPercentShare": "0.02%", + "familyMultiplierReward": "15", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "340", + "hwBonusPercentShare": "0.09%", + "hwBonusReward": "37", + "hwBonusScoreWithFamilyMultiplier": "340", + "hwBonusPercentShareWithFamilyMultiplier": "0.08%", + "hwBonusRewardWithFamilyMultiplier": "35", + "totalReward": "53" + }, + { + "address": "0xa594dc6755fDF82dF1ddB20cd8DE2c04Faa6a5a9", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "1", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "1", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x7E0781f0e035a16F5F3cf833d99D69E1e0036039", + "baseScore": "14000", + "basePercentShare": "0.78%", + "baseReward": "674", + "familyMultiplierScore": "14000", + "familyMultiplierPercentShare": "0.76%", + "familyMultiplierReward": "654", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "14000", + "hwBonusPercentShare": "3.55%", + "hwBonusReward": "1532", + "hwBonusScoreWithFamilyMultiplier": "14000", + "hwBonusPercentShareWithFamilyMultiplier": "3.43%", + "hwBonusRewardWithFamilyMultiplier": "1481", + "totalReward": "2206" + }, + { + "address": "0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331", + "baseScore": "24700", + "basePercentShare": "1.38%", + "baseReward": "1189", + "familyMultiplierScore": "32110", + "familyMultiplierPercentShare": "1.74%", + "familyMultiplierReward": "1500", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1714" + }, + { + "address": "0xc93473826F40100aE06E2E02F351C30c7f985bf7", + "baseScore": "3600", + "basePercentShare": "0.20%", + "baseReward": "173", + "familyMultiplierScore": "3600", + "familyMultiplierPercentShare": "0.19%", + "familyMultiplierReward": "168", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "173" + }, + { + "address": "0xBB1973a07b9802bD1bb2B868c96d6C8a6BB0Ac50", + "baseScore": "20", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "20", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x6F46735673bbBE1Ff346B1a0Aa45fd2B611216dB", + "baseScore": "760", + "basePercentShare": "0.04%", + "baseReward": "36", + "familyMultiplierScore": "760", + "familyMultiplierPercentShare": "0.04%", + "familyMultiplierReward": "35", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "36" + }, + { + "address": "0x0e8D6c66CF65Ff3553B5cfFF7F937E51CEAea1D4", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xB09Bdac8b7a4faE53EAC7D2F5e2E99A8170Cb817", + "baseScore": "38", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "38", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "527" + }, + { + "address": "0xf4743bf3d7Aa0Cd2d6f2a5fB634B401D8db60987", + "baseScore": "870", + "basePercentShare": "0.05%", + "baseReward": "41", + "familyMultiplierScore": "870", + "familyMultiplierPercentShare": "0.05%", + "familyMultiplierReward": "40", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "41" + }, + { + "address": "0xf0Ca6fE447d26489BfC712A41835BBC7dD69dED6", + "baseScore": "600", + "basePercentShare": "0.03%", + "baseReward": "28", + "familyMultiplierScore": "600", + "familyMultiplierPercentShare": "0.03%", + "familyMultiplierReward": "28", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "28" + }, + { + "address": "0x7Add71Ad0477D36F45f849b7a81c7d2Ba4543cfF", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x94AcDF394C14232aca203b4D1f1854Bc40582878", + "baseScore": "8", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "8", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "526" + }, + { + "address": "0x9Cb10817CAe852C45D8D602097a76a932f6185E6", + "baseScore": "1670", + "basePercentShare": "0.09%", + "baseReward": "80", + "familyMultiplierScore": "2004", + "familyMultiplierPercentShare": "0.11%", + "familyMultiplierReward": "93", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "79" + }, + { + "address": "0x3c78053528cCbD382C90A13233c509965fe3451A", + "baseScore": "280", + "basePercentShare": "0.02%", + "baseReward": "13", + "familyMultiplierScore": "280", + "familyMultiplierPercentShare": "0.02%", + "familyMultiplierReward": "13", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "13" + }, + { + "address": "0x7f85F0E167Cc229A7eB9B41221D9D8a7965f2949", + "baseScore": "34000", + "basePercentShare": "1.90%", + "baseReward": "1637", + "familyMultiplierScore": "34000", + "familyMultiplierPercentShare": "1.84%", + "familyMultiplierReward": "1588", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2163" + }, + { + "address": "0x3eF27C8EEe8261fb5906B2e40daEDFC8E7B3f055", + "baseScore": "28000", + "basePercentShare": "1.56%", + "baseReward": "1348", + "familyMultiplierScore": "33600", + "familyMultiplierPercentShare": "1.82%", + "familyMultiplierReward": "1570", + "qualityBonusScore": "4", + "qualityBonusPercentShare": "9.76%", + "qualityBonusReward": "2107", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "3454" + }, + { + "address": "0x9aDE33Cf4ca08E46c7f84f82A82FCF5d8A4adA55", + "baseScore": "45600", + "basePercentShare": "2.54%", + "baseReward": "2196", + "familyMultiplierScore": "50160", + "familyMultiplierPercentShare": "2.71%", + "familyMultiplierReward": "2344", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2721" + }, + { + "address": "0x5B5378870b6A52588e65c914a487F083a2193281", + "baseScore": "4200", + "basePercentShare": "0.23%", + "baseReward": "202", + "familyMultiplierScore": "4200", + "familyMultiplierPercentShare": "0.23%", + "familyMultiplierReward": "196", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "202" + }, + { + "address": "0xCBb7352fa31681749a9DB14E14aE80f8AE9A4B3f", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x9b38E17c23673471547d8b031e0EFebB666C985A", + "baseScore": "16000", + "basePercentShare": "0.89%", + "baseReward": "770", + "familyMultiplierScore": "16000", + "familyMultiplierPercentShare": "0.87%", + "familyMultiplierReward": "747", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "770" + }, + { + "address": "0xC4e1d4CDf842c19503280dA5db7A4C3761305f88", + "baseScore": "1000", + "basePercentShare": "0.06%", + "baseReward": "48", + "familyMultiplierScore": "1000", + "familyMultiplierPercentShare": "0.05%", + "familyMultiplierReward": "46", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "48" + }, + { + "address": "0xe8Bdc142fd025da1D757f1991BC08799d9719C56", + "baseScore": "730", + "basePercentShare": "0.04%", + "baseReward": "35", + "familyMultiplierScore": "730", + "familyMultiplierPercentShare": "0.04%", + "familyMultiplierReward": "34", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "35" + }, + { + "address": "0xb2A35680dB7dAe518b058213B629d7a8658163b9", + "baseScore": "2500", + "basePercentShare": "0.14%", + "baseReward": "120", + "familyMultiplierScore": "2500", + "familyMultiplierPercentShare": "0.14%", + "familyMultiplierReward": "116", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "120" + }, + { + "address": "0x4768acafFB3aCd3D8Ae4798d423088F8366Bd8Ca", + "baseScore": "34000", + "basePercentShare": "1.90%", + "baseReward": "1637", + "familyMultiplierScore": "34000", + "familyMultiplierPercentShare": "1.84%", + "familyMultiplierReward": "1588", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1637" + }, + { + "address": "0x3941578e47Bcb7AC5f006488De8D0CA8461bB0b5", + "baseScore": "26", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "26", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "527" + }, + { + "address": "0x7828a2e11bec453E69232B636668CE6e10774055", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x8824F0091D6d6Ee3beD0645eCBC0E2d8c9c47942", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "526" + }, + { + "address": "0xa3EE387E97fbeC75A2623A809726c38f6ac19B2D", + "baseScore": "15000", + "basePercentShare": "0.84%", + "baseReward": "722", + "familyMultiplierScore": "15000", + "familyMultiplierPercentShare": "0.81%", + "familyMultiplierReward": "700", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "722" + }, + { + "address": "0x4e6585c9553842C448C5B9a6F2907E3AC2e87239", + "baseScore": "2800", + "basePercentShare": "0.16%", + "baseReward": "134", + "familyMultiplierScore": "3080", + "familyMultiplierPercentShare": "0.17%", + "familyMultiplierReward": "143", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "134" + }, + { + "address": "0xE1Fe60B2cD9afC03FCFa1Ef7cA0B27F4E087e5bb", + "baseScore": "14", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "14", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "4", + "qualityBonusPercentShare": "9.76%", + "qualityBonusReward": "2107", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2107" + }, + { + "address": "0x9D0caC8351BD51D5BC537bD62c0410a8DBc78B74", + "baseScore": "69", + "basePercentShare": "0.00%", + "baseReward": "3", + "familyMultiplierScore": "82.8", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "3", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2" + }, + { + "address": "0x3eB74a37451737D6a432b192358739ad6Ff4fb39", + "baseScore": "7000", + "basePercentShare": "0.39%", + "baseReward": "337", + "familyMultiplierScore": "7000", + "familyMultiplierPercentShare": "0.38%", + "familyMultiplierReward": "327", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "337" + }, + { + "address": "0x4A84876a30B9e0cb3f75a5F69FF282649Dab05a4", + "baseScore": "9", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "9", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x6d525E918432c486618E3eb106703acECC795a43", + "baseScore": "37000", + "basePercentShare": "2.06%", + "baseReward": "1782", + "familyMultiplierScore": "37000", + "familyMultiplierPercentShare": "2.00%", + "familyMultiplierReward": "1729", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1782" + }, + { + "address": "0xdC2daEccA2007B169b8B332db531bCf69aE1f74C", + "baseScore": "9", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "9", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x4ED816a923c4D9CEF68002642b08120083E076FB", + "baseScore": "2200", + "basePercentShare": "0.12%", + "baseReward": "105", + "familyMultiplierScore": "2200", + "familyMultiplierPercentShare": "0.12%", + "familyMultiplierReward": "102", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "105" + }, + { + "address": "0xd45d35bC22c19a9979184fC146108eaB0B6AD41c", + "baseScore": "6300", + "basePercentShare": "0.35%", + "baseReward": "303", + "familyMultiplierScore": "6300", + "familyMultiplierPercentShare": "0.34%", + "familyMultiplierReward": "294", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "303" + }, + { + "address": "0xBEd5edF3A75F1c132fd913006CD9840D288d2cA9", + "baseScore": "1700", + "basePercentShare": "0.09%", + "baseReward": "81", + "familyMultiplierScore": "1700", + "familyMultiplierPercentShare": "0.09%", + "familyMultiplierReward": "79", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "607" + }, + { + "address": "0xF56AB9Af9c118C2A05b528927158Af2e216d7638", + "baseScore": "6", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "6", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xD3ac40ba686AA050396d41E39E328F02cf05f15f", + "baseScore": "16", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "16", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xC2c58DaFE37Ccf2D0bdB0a90194bE969aD05CFFc", + "baseScore": "60000", + "basePercentShare": "3.35%", + "baseReward": "2890", + "familyMultiplierScore": "60000", + "familyMultiplierPercentShare": "3.25%", + "familyMultiplierReward": "2803", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "3416" + }, + { + "address": "0xdF60b603671bd2d2F014fd4e4d6a3657823Df567", + "baseScore": "48", + "basePercentShare": "0.00%", + "baseReward": "2", + "familyMultiplierScore": "52.8", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "2", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2" + }, + { + "address": "0x0A393A0dFc3613eeD5Bd2A0A56d482351f4e3996", + "baseScore": "46000", + "basePercentShare": "2.56%", + "baseReward": "2215", + "familyMultiplierScore": "46000", + "familyMultiplierPercentShare": "2.49%", + "familyMultiplierReward": "2149", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2215" + }, + { + "address": "0x9DCA83E91041222D20c491F5b25ddC7Ac79Ee53B", + "baseScore": "53000", + "basePercentShare": "2.95%", + "baseReward": "2553", + "familyMultiplierScore": "53000", + "familyMultiplierPercentShare": "2.87%", + "familyMultiplierReward": "2476", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2553" + }, + { + "address": "0xc60048Fd2bccd82da8A1C0d06B3CF1Bfd7D740A2", + "baseScore": "14000", + "basePercentShare": "0.78%", + "baseReward": "674", + "familyMultiplierScore": "14000", + "familyMultiplierPercentShare": "0.76%", + "familyMultiplierReward": "654", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "674" + }, + { + "address": "0x180401CaBa07a348FaA85E138d7B7BeD24d79775", + "baseScore": "45000", + "basePercentShare": "2.51%", + "baseReward": "2167", + "familyMultiplierScore": "45000", + "familyMultiplierPercentShare": "2.43%", + "familyMultiplierReward": "2102", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2167" + }, + { + "address": "0x6093B4B8C11EBDa4763f06D988eBC160a4DcD683", + "baseScore": "47000", + "basePercentShare": "2.62%", + "baseReward": "2263", + "familyMultiplierScore": "47000", + "familyMultiplierPercentShare": "2.54%", + "familyMultiplierReward": "2196", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2263" + }, + { + "address": "0xa4392b4220EafcF6AF73881991ea7254e392D31a", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x14EE8817b5De0849ED7cE0E699BD19EDE7ec5e95", + "baseScore": "30000", + "basePercentShare": "1.67%", + "baseReward": "1445", + "familyMultiplierScore": "30000", + "familyMultiplierPercentShare": "1.62%", + "familyMultiplierReward": "1401", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1445" + }, + { + "address": "0x8e8644FAA2Bf53e3f854Ee472BF08B92CC6a7aa7", + "baseScore": "7", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "7", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x283C184c920102372b5FCD94807675D50A74e668", + "baseScore": "31000", + "basePercentShare": "1.73%", + "baseReward": "1493", + "familyMultiplierScore": "31000", + "familyMultiplierPercentShare": "1.68%", + "familyMultiplierReward": "1448", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1493" + }, + { + "address": "0x5190Efc20E1Ac0D4B5eCe5f6E8D5529925557C90", + "baseScore": "3400", + "basePercentShare": "0.19%", + "baseReward": "163", + "familyMultiplierScore": "3400", + "familyMultiplierPercentShare": "0.18%", + "familyMultiplierReward": "158", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "163" + }, + { + "address": "0xB456a8673d19a6FaA5991e4f9169240f1b0ee3f2", + "baseScore": "7", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "7", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x8aCE7EB84412bD73485518C3B5ECB8856931c0bB", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x96f3F2f5Ca72863605B2977a26Aff2B86C4e19D6", + "baseScore": "83000", + "basePercentShare": "4.63%", + "baseReward": "3998", + "familyMultiplierScore": "83000", + "familyMultiplierPercentShare": "4.49%", + "familyMultiplierReward": "3878", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "3998" + }, + { + "address": "0x4B1202F567155524264f1E26Eeb35617BC4fB0df", + "baseScore": "24000", + "basePercentShare": "1.34%", + "baseReward": "1156", + "familyMultiplierScore": "24000", + "familyMultiplierPercentShare": "1.30%", + "familyMultiplierReward": "1121", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1156" + }, + { + "address": "0x2cb5330285A053110d901E605A6F8FFE244fb9f7", + "baseScore": "25", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "25", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1" + }, + { + "address": "0xe1aF18F9e5810A80365Ae7B89919540c01184dAc", + "baseScore": "33000", + "basePercentShare": "1.84%", + "baseReward": "1589", + "familyMultiplierScore": "33000", + "familyMultiplierPercentShare": "1.78%", + "familyMultiplierReward": "1542", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1589" + }, + { + "address": "0x22e2AA15d09A30Df7AF620D119806Aec826a55A7", + "baseScore": "21000", + "basePercentShare": "1.17%", + "baseReward": "1011", + "familyMultiplierScore": "21000", + "familyMultiplierPercentShare": "1.14%", + "familyMultiplierReward": "981", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1011" + }, + { + "address": "0x40A35FdE2bA34B29FBe699C6A43A6d6690e4345C", + "baseScore": "14", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "14", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x2f5f379033a0e35e784928288E122E7508570D4B", + "baseScore": "41", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "41", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1" + }, + { + "address": "0x7bDAE3be9CB620822C576af1fD437056131E341a", + "baseScore": "7900", + "basePercentShare": "0.44%", + "baseReward": "380", + "familyMultiplierScore": "7900", + "familyMultiplierPercentShare": "0.43%", + "familyMultiplierReward": "369", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "380" + }, + { + "address": "0xF3117E9F6115289CBE3E408e55c33F5d987250dF", + "baseScore": "24", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "24", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1" + }, + { + "address": "0x772136cCDF6653499b9b49b877eEf048752D2ed4", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xe328D2460EFD9F0F887F09A82a2aeBb457fdbDe5", + "baseScore": "5", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "5", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x688143644F42A247DE67bfAD8fB9FBFBbA7Ee021", + "baseScore": "18000", + "basePercentShare": "1.00%", + "baseReward": "867", + "familyMultiplierScore": "18000", + "familyMultiplierPercentShare": "0.97%", + "familyMultiplierReward": "841", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "867" + }, + { + "address": "0xCB0C27769f8DB5640E49F058b72E029047D8ef74", + "baseScore": "13", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "13", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "526" + }, + { + "address": "0x9f6C41276989252B785E56aff8e051d2Ec4F5E19", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x44E11e790bE68A2378b9343E59F6C2Ae6342E442", + "baseScore": "5", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "5", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xaA491150D2db572F0C445B89A153217815C0E85E", + "baseScore": "64000", + "basePercentShare": "3.57%", + "baseReward": "3082", + "familyMultiplierScore": "64000", + "familyMultiplierPercentShare": "3.46%", + "familyMultiplierReward": "2990", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "3082" + }, + { + "address": "0x586bAB70B10d50Dd1aF1C200E47e3a368B7bE3ce", + "baseScore": "15000", + "basePercentShare": "0.84%", + "baseReward": "722", + "familyMultiplierScore": "15000", + "familyMultiplierPercentShare": "0.81%", + "familyMultiplierReward": "700", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1248" + }, + { + "address": "0xcb8518C21dB38ef37fF0Bf39Fe95b24D0959C355", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "526" + }, + { + "address": "0x79E85c7Aa3C289021048B598Be347e3F5CF1F3B7", + "baseScore": "20000", + "basePercentShare": "1.12%", + "baseReward": "963", + "familyMultiplierScore": "20000", + "familyMultiplierPercentShare": "1.08%", + "familyMultiplierReward": "934", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "963" + }, + { + "address": "0x54a1354F615D464F7739d515598DB4e6315Ddc4B", + "baseScore": "36035", + "basePercentShare": "2.01%", + "baseReward": "1735", + "familyMultiplierScore": "43242", + "familyMultiplierPercentShare": "2.34%", + "familyMultiplierReward": "2020", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1734" + }, + { + "address": "0x6c8C7a143792eDC723A2eA27B1c3f2235882189d", + "baseScore": "14000", + "basePercentShare": "0.78%", + "baseReward": "674", + "familyMultiplierScore": "14000", + "familyMultiplierPercentShare": "0.76%", + "familyMultiplierReward": "654", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "674" + }, + { + "address": "0x898A9Eb0f6e49c8f5D33E678dd4bEfDCff77552A", + "baseScore": "190", + "basePercentShare": "0.01%", + "baseReward": "9", + "familyMultiplierScore": "190", + "familyMultiplierPercentShare": "0.01%", + "familyMultiplierReward": "8", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "9" + }, + { + "address": "0x9454d413886A3737c06b10dE11360669C56D5f24", + "baseScore": "760", + "basePercentShare": "0.04%", + "baseReward": "36", + "familyMultiplierScore": "760", + "familyMultiplierPercentShare": "0.04%", + "familyMultiplierReward": "35", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "36" + }, + { + "address": "0x4f485910CC79F27D85591b65e42d890136F3fdE3", + "baseScore": "9", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "9", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xF41A5f015C90Aa260A5F501Ba09e8d00495B6221", + "baseScore": "6", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "6", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x42a9CF0F0F8cF73F1bc34A62e934f244bC00fE35", + "baseScore": "160", + "basePercentShare": "0.01%", + "baseReward": "7", + "familyMultiplierScore": "160", + "familyMultiplierPercentShare": "0.01%", + "familyMultiplierReward": "7", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "7" + }, + { + "address": "0x3d1123CCd5E035d5009Abf16870e0877fdFA7e3E", + "baseScore": "0", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "0", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x3b9089785C4e941342cf348BC160caDb7D90f2Dc", + "baseScore": "25", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "25", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1" + }, + { + "address": "0x1DfC09e0Aef1d576edfa4fFD71FC4cAeaC911d4E", + "baseScore": "63000", + "basePercentShare": "3.51%", + "baseReward": "3034", + "familyMultiplierScore": "63000", + "familyMultiplierPercentShare": "3.41%", + "familyMultiplierReward": "2944", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "3034" + }, + { + "address": "0x8484D2156b0E9C6ea1D9c149579fE9738efb9118", + "baseScore": "13", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "13", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xdA0955B495f3F181c282f5D1b05168706EaF0455", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xF955c822D7151Bf32362aF5cc8f3f283871D3465", + "baseScore": "20", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "20", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xaF044B784D6f7CB3D3d0938f568dE1F3E05E8145", + "baseScore": "10", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "10", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xdB13f6F9BccF5ac30378Ea6DfBCA45eec35AfA33", + "baseScore": "220", + "basePercentShare": "0.01%", + "baseReward": "10", + "familyMultiplierScore": "220", + "familyMultiplierPercentShare": "0.01%", + "familyMultiplierReward": "10", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "10" + }, + { + "address": "0x7f34907d02CC0CCd334ee76044da10e7388FDc53", + "baseScore": "450", + "basePercentShare": "0.03%", + "baseReward": "21", + "familyMultiplierScore": "450", + "familyMultiplierPercentShare": "0.02%", + "familyMultiplierReward": "21", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "21" + }, + { + "address": "0x493e5f463feB5B13259214E81cF229c5B28303EC", + "baseScore": "32000", + "basePercentShare": "1.78%", + "baseReward": "1541", + "familyMultiplierScore": "32000", + "familyMultiplierPercentShare": "1.73%", + "familyMultiplierReward": "1495", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1541" + }, + { + "address": "0x981F118EdbD9e360863dFA283f05200804825b1A", + "baseScore": "15000", + "basePercentShare": "0.84%", + "baseReward": "722", + "familyMultiplierScore": "15000", + "familyMultiplierPercentShare": "0.81%", + "familyMultiplierReward": "700", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "722" + }, + { + "address": "0x5B29f4E4918f5Dc436C8A12f807869aD063d0B3a", + "baseScore": "22", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "22", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1" + }, + { + "address": "0xFe1c9385784Db958057BCA11D8f59762Eb4d4D35", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x4dCDb1BEa466136C287D1C522db829571F93b62f", + "baseScore": "27000", + "basePercentShare": "1.51%", + "baseReward": "1300", + "familyMultiplierScore": "27000", + "familyMultiplierPercentShare": "1.46%", + "familyMultiplierReward": "1261", + "qualityBonusScore": "2", + "qualityBonusPercentShare": "4.88%", + "qualityBonusReward": "1053", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2353" + }, + { + "address": "0xeA7C91110cc49f97F74f7725BB5148aC9CE7dF51", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0xE2f4b4106C227613DAf4116881811c1745d2cd0f", + "baseScore": "20", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "20", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "526" + }, + { + "address": "0x06032e6a223c791DaADf89e4ACf5415eC7384a3B", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "4", + "qualityBonusPercentShare": "9.76%", + "qualityBonusReward": "2107", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "2107" + }, + { + "address": "0x818b13A69a72D02903d593844aEE5AF552Cc6Cd4", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x8ce3456193Eabc7fa2Cd6f3660CA6eBf9f69E63b", + "baseScore": "63000", + "basePercentShare": "3.51%", + "baseReward": "3034", + "familyMultiplierScore": "63000", + "familyMultiplierPercentShare": "3.41%", + "familyMultiplierReward": "2944", + "qualityBonusScore": "4", + "qualityBonusPercentShare": "9.76%", + "qualityBonusReward": "2107", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "5141" + }, + { + "address": "0x653aC1ED2E637a4f1cc61Ff5F039a8d806D3e272", + "baseScore": "14", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "14", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x41f171ffBfe44a3674bF9f30B47693b9bc62E9b7", + "baseScore": "110000", + "basePercentShare": "6.13%", + "baseReward": "5298", + "familyMultiplierScore": "110000", + "familyMultiplierPercentShare": "5.95%", + "familyMultiplierReward": "5140", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "5298" + }, + { + "address": "0x8D03A395CD9E68409967e4957D6B85ADaF288687", + "baseScore": "32", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "32", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1" + }, + { + "address": "0x7B507FbbA9FC5d03d41e18D63a4633f68bb93136", + "baseScore": "13", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "13", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x2eF461FdBEcc607d0b0cA27106C683a8F64468A4", + "baseScore": "3300", + "basePercentShare": "0.18%", + "baseReward": "158", + "familyMultiplierScore": "3300", + "familyMultiplierPercentShare": "0.18%", + "familyMultiplierReward": "154", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "158" + }, + { + "address": "0x8e8f2F0bcFab3a53b6d82e299C3d5f6397579e53", + "baseScore": "4", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "4", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "0" + }, + { + "address": "0x002Eb755BD82B99F052D2cCe67EA4ED10561E49c", + "baseScore": "1", + "basePercentShare": "0.00%", + "baseReward": "0", + "familyMultiplierScore": "1", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "0", + "qualityBonusScore": "1", + "qualityBonusPercentShare": "2.44%", + "qualityBonusReward": "526", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "526" + }, + { + "address": "0x477E84277727279FB51E39cdB61642CC8d6B02BA", + "baseScore": "22", + "basePercentShare": "0.00%", + "baseReward": "1", + "familyMultiplierScore": "22", + "familyMultiplierPercentShare": "0.00%", + "familyMultiplierReward": "1", + "qualityBonusScore": "0", + "qualityBonusPercentShare": "0.00%", + "qualityBonusReward": "0", + "hwBonusScore": "0", + "hwBonusPercentShare": "0.00%", + "hwBonusReward": "0", + "hwBonusScoreWithFamilyMultiplier": "0", + "hwBonusPercentShareWithFamilyMultiplier": "0.00%", + "hwBonusRewardWithFamilyMultiplier": "0", + "totalReward": "1" + } + ] +} diff --git a/smartweave/test/e2e/data/scores_quality_bonuses.csv b/smartweave/test/e2e/data/scores_quality_bonuses.csv new file mode 100644 index 0000000..24118a0 --- /dev/null +++ b/smartweave/test/e2e/data/scores_quality_bonuses.csv @@ -0,0 +1,158 @@ +Results,,Fingerprint,Address,Score,Hardware?,HW Score,Family Multiplier,Family Size,Uptime,Uptime Score,Uptime Score (w Family Mult),Score (w Family Mult),HW Score (w Family Mult),Family +Base Total Score,1793643,7F54724CB9E0567BC4A538556DF25A4FD6DC7F5E,0xf2948eDD428305D28DcBd6C284470e3823ee182b,14000,Y,14000,1.1,2,26,4,4.4,15400,15400,C38E150919A7C01D4849E0782AD2D8C4A74EAB34 +Total Score w Family Mult,1848798.2,60CCE755BD6B7410C70A16B4204D13A986437FDA,0xa2AA87bE9FaaE25F1aC6E6846eC9589b03625ce0,53000,Y,53000,1.1,2,4,1,1.1,58300,58300,25280148FEF4E800FD179082D9E23276C7199E9D +Total HW Score w Family Mult,408353.8,A1BBF90FAEA682A5C96B7B36A6AA27ABE56C4AA7,0xF94C4F7e890Bc437137eCCF8bF58C5c842A3cC03,1,Y,1,1,1,1,0,0,1,1, +Total Quality Score w Family Mult,42.9,7CAA543175753FB53BDD87C1048837B9157D82A8,0x0f67593B4C7A9CF726208a840804185Da0Ba372A,8,Y,8,1,1,0,0,0,8,8, +,,D60941A928090AADF96AD6481B974D79AA6048E2,0xd045A4344362A3CD187bd7e2277Fae8BA067EFd5,6700,Y,6700,1,1,19,2,2,6700,6700, +,,42449D01D4052169541A3315F18179EAB8F923A9,0x3ceb890224dAaB095745d3fa18e17F83699705ad,28000,Y,28000,1,1,1,0,0,28000,28000, +,,C9B4D5154450ACAB3A81548DE5E383378B0328E4,0xe486d9D3b99a0B9CD35a511401D928E527844b43,8,Y,8,1,1,0,0,0,8,8, +,,BB05DF5D23D225F1B9ED82796D8194257706B2E5,0x0a14181c3845c0C4eE574C2564B01affA400242F,52000,Y,52000,1.1,2,1,0,0,57200,57200,893A110668CEE347DE6F54705A300488EBCF4B5A +,,6AAFCA940AF45837A312034ED84AADC081520DB1,0x7Fa0963a8CB41d12C0bBa4286141dd71Ba158F44,11000,Y,11000,1,1,0,0,0,11000,11000, +,,BE62F9855E9143A3D15C98739800A2DCBAF7A76D,0x0184FC55d9AC8856Fc365BDc70825756c9D438fc,1,Y,1,1,1,0,0,0,1,1, +,,2FFD767BABE25856580BE057FD7708F9D2E1C479,0xFA579D17a320AA2B226aD068B5597aaFd493a56d,7,Y,7,1,1,0,0,0,7,7, +,,76FFB75E358D50868E5D5042AF77BDC38C39C45A,0xDf548c35DBA62A1B0A5FB1E365E2539935487408,1,Y,1,1.2,3,1,0,0,1.2,1.2,C58BB1A08CC76E46F16101E7DE5D323AA3B34F6E | 3AB8AD860A2BD006840C48E71455C4742EFB8A3C +,,2CAC5BA69A56809C6F6D71A34929B2FF8C35CA9B,0xDD3A2390CeFa80c1eCF5771636A4F49F2B8956C8,31000,Y,31000,1,1,0,0,0,31000,31000, +,,74D0083A550B009B4E5C91A2BB577236F0C7AF9B,0xBbbB5ABEC6730e96Da0e7E91564E4090117c39Cd,47000,Y,47000,1,1,0,0,0,47000,47000, +,,87B569D9DB1B812944CFBF41DE696B1E6A2F62DD,0x778B01147C894C76909D9C889e8F9e0D55328FA9,260,Y,260,1,1,1,0,0,260,260, +,,742622D69C66EF602367967F8E26847C66FC9308,0x85Bd2dEE3233A1469E2217ee9520a39A2137d442,26,Y,26,1.1,2,11,2,2.2,28.6,28.6,E43915989E01BE6840D5C82B11B95885ED8CB81F +,,6F230469A5D07CF24361A4546E709AE52C6EBE4F,0xAbcd54201697adC79bD0d012E0Bb8bC4c9572eF9,16000,Y,16000,1,1,0,0,0,16000,16000, +,,519262BF20AC9CF2753DED331C145BC6F315C7B5,0x605782a5D874cB2B8b25B0D72CD111e468a0068b,7,Y,7,1,1,0,0,0,7,7, +,,54790AF4A4EF9EBDE7D7DE834E09562B7A915156,0x79B4E22F291d18116B70199C62A8c360ad248c93,810,Y,810,1.1,2,0,0,0,891,891,0DE9BB713F628E5AAC0300B7C4CD5365589B4DFC +,,BE1F76841DB89C3D34FE9235BC8594E109951960,0xCd5D478686c6fA5E47Fc457F16E04224cD012690,18000,Y,18000,1.1,2,0,0,0,19800,19800,80091027A368B886658AA0A89A75FBDE0BF7A5BC +,,7A3D6ECE5C38D65F9022FDBE8F36A7C794B3661E,0xA0f166b408316C01c778Ea51A35991CbeD0630B2,55000,Y,55000,1,1,0,0,0,55000,55000, +,,BF4EB653F28CF9C958C3232D54B1FC29B4B12F17,0x77B789133012751720cF50781d31Bb56Fb4B97dA,38000,Y,38000,1,1,1,0,0,38000,38000, +,,BCCA31EC30093D0FA657A75A4FEB559473FDDD50,0x887b7E335f75E69ecaf1376F057667562269d7DC,3200,Y,3200,1,1,0,0,0,3200,3200, +,,8C6F44DF49DA4AB4BD254ED1CD2F391FA9BC66F8,0x52285B51Fb4E0Ac159AC46aD12Ef792E02cD214d,1500,Y,1500,1,1,0,0,0,1500,1500, +,,F8C6CE08E91B09D7068F782F37DE756984237DBC,0xcb7a940167172CE2c6E4EaD25FD0ff1cede432A6,3200,Y,3200,1,1,1,0,0,3200,3200, +,,D8BA267DE758586462486E7DF7C5FB9556404D5F,0x8E02Ff09b8Fa6047122c2adBB40029cA444F5974,100,Y,100,1,1,0,0,0,100,100, +,,284C217B14811520C0586CFACEAA984ADA6C1F88,0x172253954c395832a9e264FbD8f248221d4a92B6,1400,Y,1400,1,1,0,0,0,1400,1400, +,,8D543BCFCC18BF2189DE740D95F70B25EBA3BB0C,0xDd29C85d9FDe419dcaF7cB3eCba603f1328eeF32,340,Y,340,1,1,1,0,0,340,340, +,,CB11AD937DE2F01B830782A218DEEF096AE7B47D,0xa594dc6755fDF82dF1ddB20cd8DE2c04Faa6a5a9,1,Y,1,1,1,0,0,0,1,1, +,,123B0957B74759A3AF6524E257E29D3708109B1B,0x7E0781f0e035a16F5F3cf833d99D69E1e0036039,14000,Y,14000,1,1,0,0,0,14000,14000, +,,331EDCF3B51D31160958689706E983D6293F9A73,0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331,3900,,0,1.3,4,0,0,0,5070,0,99BFBEE8C437604EAD059B95D490FE4E2F9EE70C | 56D16B8CF83778F1ABD1B2F144CA7BDC717C2AB7 | 393AB3EECB137E91DB3EE1A336B06A2B671CB383 +,,342066443F2AFA27F0E515DAFBCBD0510957F7F5,0xc93473826F40100aE06E2E02F351C30c7f985bf7,3600,,0,1,1,1,0,0,3600,0, +,,FD0D7535C9BB69C7F4F4A17149526EF97F4553FC,0xBB1973a07b9802bD1bb2B868c96d6C8a6BB0Ac50,20,,0,1,1,0,0,0,20,0, +,,9D1D415000C0E3CCAF64C282541C1CA0710F1660,0x6F46735673bbBE1Ff346B1a0Aa45fd2B611216dB,760,,0,1,1,2,0,0,760,0, +,,1E9582E86DA4469541A572EBBAD731A391EB61EC,0x0e8D6c66CF65Ff3553B5cfFF7F937E51CEAea1D4,1,,0,1,1,0,0,0,1,0, +,,FA37D7D451A03FC7CA7FA023EFA67E8B3D7CBBEF,0xB09Bdac8b7a4faE53EAC7D2F5e2E99A8170Cb817,38,,0,1,1,3,1,1,38,0, +,,D53735422CB4036A80F91837B7EE9747F5B5C9F1,0xf4743bf3d7Aa0Cd2d6f2a5fB634B401D8db60987,870,,0,1,1,0,0,0,870,0, +,,710B72A4F80354C033792F813C9FC71BAFC2EAA1,0xf0Ca6fE447d26489BfC712A41835BBC7dD69dED6,600,,0,1,1,2,0,0,600,0, +,,220BB45F6720C30BD11CCA35E63194360F412256,0x7Add71Ad0477D36F45f849b7a81c7d2Ba4543cfF,1,,0,1,1,0,0,0,1,0, +,,312B484FCD2BFADDA2E12F88B0249D30AF92AFAC,0x94AcDF394C14232aca203b4D1f1854Bc40582878,8,,0,1,1,4,1,1,8,0, +,,192329D17E32F62C9C79D7386AC5B9890FDC9D0C,0x9Cb10817CAe852C45D8D602097a76a932f6185E6,720,,0,1.2,3,0,0,0,864,0,AABC9B22A6A85F700B80EC3A6D140A08EC1590BB | FEB46CD11650B98C5268F2196BBDBFA37291A4FC +,,DBF5432BF07BC1F9B6E6E1FE7389BA41008363D8,0x3c78053528cCbD382C90A13233c509965fe3451A,280,,0,1,1,0,0,0,280,0, +,,EA50D08EC10EE837B8A1719AC4447547712EDB66,0x7f85F0E167Cc229A7eB9B41221D9D8a7965f2949,34000,,0,1,1,5,1,1,34000,0, +,,D40ACFCA44CAFB6DEE053F0CB18CD40D1232C780,0x3eF27C8EEe8261fb5906B2e40daEDFC8E7B3f055,5900,,0,1.2,3,0,0,0,7080,0,4423B4748F312C60A04B0B89D6A7E03634521BB7 | 8E1A82EDB2CFE72E765C98F1FE810539F8B8FC1A +,,094F7556A5F07F5662C9E4EFA6CD9D41A2D5B29F,0x9aDE33Cf4ca08E46c7f84f82A82FCF5d8A4adA55,600,,0,1.1,2,6,1,1.1,660,0,6165EBEB3F76E843E8E568DD3C0E7EA97C99DCED +,,0DE9BB713F628E5AAC0300B7C4CD5365589B4DFC,0x79B4E22F291d18116B70199C62A8c360ad248c93,40000,,0,1.1,2,0,0,0,44000,0,54790AF4A4EF9EBDE7D7DE834E09562B7A915156 +,,B0D745A63E20214DD3B0F551D3A10D14D66616FE,0x5B5378870b6A52588e65c914a487F083a2193281,4200,,0,1,1,0,0,0,4200,0, +,,5B7B4594C2F098B128A6BB58F9A7411BD770F5B8,0xCBb7352fa31681749a9DB14E14aE80f8AE9A4B3f,1,,0,1,1,1,0,0,1,0, +,,9607723EA326414B57940E5695AC37F0956E8BC9,0x9b38E17c23673471547d8b031e0EFebB666C985A,16000,,0,1,1,0,0,0,16000,0, +,,16C5FBF55A56D9CEF98E94930BE5F23C45E5C6EA,0xC4e1d4CDf842c19503280dA5db7A4C3761305f88,1000,,0,1,1,0,0,0,1000,0, +,,4E964214C20D2CBA0859EBB06514DBDBFD3A2F72,0xe8Bdc142fd025da1D757f1991BC08799d9719C56,730,,0,1,1,0,0,0,730,0, +,,1CBB8CF10565C007861B66B5764FD88DF6F850BB,0xb2A35680dB7dAe518b058213B629d7a8658163b9,2500,,0,1,1,2,0,0,2500,0, +,,6165EBEB3F76E843E8E568DD3C0E7EA97C99DCED,0x9aDE33Cf4ca08E46c7f84f82A82FCF5d8A4adA55,45000,,0,1.1,2,0,0,0,49500,0,094F7556A5F07F5662C9E4EFA6CD9D41A2D5B29F +,,8E1A82EDB2CFE72E765C98F1FE810539F8B8FC1A,0x3eF27C8EEe8261fb5906B2e40daEDFC8E7B3f055,22000,,0,1.2,3,0,0,0,26400,0,D40ACFCA44CAFB6DEE053F0CB18CD40D1232C780 | 4423B4748F312C60A04B0B89D6A7E03634521BB7 +,,70D1EB563BBB10F1EE62E537BB9F3BD7419EE11E,0x4768acafFB3aCd3D8Ae4798d423088F8366Bd8Ca,34000,,0,1,1,2,0,0,34000,0, +,,17DA905ADD643D74A2213229C2DDD65C5DEAD8AE,0x3941578e47Bcb7AC5f006488De8D0CA8461bB0b5,26,,0,1,1,3,1,1,26,0, +,,A2FCBB258D2D8C89B4B52F70C41880C61392A236,0x7828a2e11bec453E69232B636668CE6e10774055,1,,0,1,1,0,0,0,1,0, +,,D2870D5A1B2325DFC7E539A45A3B01AF488310BD,0x8824F0091D6d6Ee3beD0645eCBC0E2d8c9c47942,1,,0,1,1,3,1,1,1,0, +,,E616E560EB2F9E380C7DE8506D8EB075517E76DA,0xa3EE387E97fbeC75A2623A809726c38f6ac19B2D,15000,,0,1,1,0,0,0,15000,0, +,,DEE60B40AE194A1731FC5104C4825948EB60A9CF,0x4e6585c9553842C448C5B9a6F2907E3AC2e87239,1600,,0,1.1,2,0,0,0,1760,0,09DC138DAEDD1CC461950E9FAA7779586E429974 +,,4C78CA89BCE131F064FAC276B089FFE311F62E96,0xE1Fe60B2cD9afC03FCFa1Ef7cA0B27F4E087e5bb,14,,0,1,1,33,4,4,14,0, +,,414B00316959CF5478DF551A64E9A21BAEFF47E1,0x9D0caC8351BD51D5BC537bD62c0410a8DBc78B74,22,,0,1.2,3,0,0,0,26.4,0,F0CD20C309BEFF257A6A94B252C8C897C87EF91B | F987F6092D765D99B00BBFE1C6AC5F662FB1A941 +,,C047FF5FBE7ECA5F3FFF289E5C70DA17AAA5946C,0x3eB74a37451737D6a432b192358739ad6Ff4fb39,7000,,0,1,1,0,0,0,7000,0, +,,43F6A8A19EBA132A6831EC284E4910FAC0D3E8A0,0x4A84876a30B9e0cb3f75a5F69FF282649Dab05a4,9,,0,1,1,2,0,0,9,0, +,,393AB3EECB137E91DB3EE1A336B06A2B671CB383,0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331,6300,,0,1.3,4,2,0,0,8190,0,331EDCF3B51D31160958689706E983D6293F9A73 | 99BFBEE8C437604EAD059B95D490FE4E2F9EE70C | 56D16B8CF83778F1ABD1B2F144CA7BDC717C2AB7 +,,2A58523BA6DEFD0D4640499874EECEADF9AC49CE,0x6d525E918432c486618E3eb106703acECC795a43,37000,,0,1,1,0,0,0,37000,0, +,,99BFBEE8C437604EAD059B95D490FE4E2F9EE70C,0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331,7400,,0,1.3,4,0,0,0,9620,0,331EDCF3B51D31160958689706E983D6293F9A73 | 393AB3EECB137E91DB3EE1A336B06A2B671CB383 | 56D16B8CF83778F1ABD1B2F144CA7BDC717C2AB7 +,,EB80D5F8239D189EE4649BDA645C3732C02B6519,0xdC2daEccA2007B169b8B332db531bCf69aE1f74C,9,,0,1,1,1,0,0,9,0, +,,7588BD9451FAC3AFADE97B31C0C1DC017F9DB2C3,0x4ED816a923c4D9CEF68002642b08120083E076FB,2200,,0,1,1,0,0,0,2200,0, +,,70003522A2178F4FA21C55DAD1C8CF0345BA27DB,0xd45d35bC22c19a9979184fC146108eaB0B6AD41c,6300,,0,1,1,0,0,0,6300,0, +,,8EADCF09FC8F816BB2C8F7F7B3D4CBDDF4C7DDFE,0xBEd5edF3A75F1c132fd913006CD9840D288d2cA9,1700,,0,1,1,3,1,1,1700,0, +,,5E3EC290182D744BE1A05580431E81400B1DC431,0xF56AB9Af9c118C2A05b528927158Af2e216d7638,6,,0,1,1,0,0,0,6,0, +,,56D16B8CF83778F1ABD1B2F144CA7BDC717C2AB7,0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331,7100,,0,1.3,4,4,1,1.3,9230,0,331EDCF3B51D31160958689706E983D6293F9A73 | 393AB3EECB137E91DB3EE1A336B06A2B671CB383 | 99BFBEE8C437604EAD059B95D490FE4E2F9EE70C +,,ECE5E96F86D53782AC41FFB5ECD7F11BBEA60CD4,0xD3ac40ba686AA050396d41E39E328F02cf05f15f,16,,0,1,1,0,0,0,16,0, +,,EB0F5258EA351742DB9D79BB8697640658F1D9CF,0xC2c58DaFE37Ccf2D0bdB0a90194bE969aD05CFFc,60000,,0,1,1,5,1,1,60000,0, +,,3EDD864DC20CBF7CF971980696D08B082C93A33F,0xdF60b603671bd2d2F014fd4e4d6a3657823Df567,24,,0,1.1,2,0,0,0,26.4,0,E097F5F0D539E69BCF8AAFBD0F333AB1D4FB70C0 +,,5B765D3A887033AE487817090BF87C65B4536F6D,0x0A393A0dFc3613eeD5Bd2A0A56d482351f4e3996,46000,,0,1,1,0,0,0,46000,0, +,,E7D161A93D2FCFAF53CA35B9AB07F734ECC7D5B5,0x9DCA83E91041222D20c491F5b25ddC7Ac79Ee53B,53000,,0,1,1,2,0,0,53000,0, +,,FA3DB534B688D91FE2E8E0215B7714C0C33012BB,0xc60048Fd2bccd82da8A1C0d06B3CF1Bfd7D740A2,14000,,0,1,1,0,0,0,14000,0, +,,9BA30444BC2C42EAD4542E031904B0CDA677A366,0x180401CaBa07a348FaA85E138d7B7BeD24d79775,45000,,0,1,1,0,0,0,45000,0, +,,0B4A2A488E2B5772A1FB96638C7FAA7F790117B2,0x6093B4B8C11EBDa4763f06D988eBC160a4DcD683,47000,,0,1,1,0,0,0,47000,0, +,,C321BFBA1DFD87061B7C8306AE62D972F7B59376,0xa4392b4220EafcF6AF73881991ea7254e392D31a,1,,0,1,1,2,0,0,1,0, +,,C54C12A5D21E95C1627ADE9D43432CB828E4DB48,0x14EE8817b5De0849ED7cE0E699BD19EDE7ec5e95,30000,,0,1,1,1,0,0,30000,0, +,,8039F20131CBDFB792BA9C9FC0D45018F8A0D3F0,0x8e8644FAA2Bf53e3f854Ee472BF08B92CC6a7aa7,7,,0,1,1,0,0,0,7,0, +,,F987F6092D765D99B00BBFE1C6AC5F662FB1A941,0x9D0caC8351BD51D5BC537bD62c0410a8DBc78B74,19,,0,1.2,3,0,0,0,22.8,0,414B00316959CF5478DF551A64E9A21BAEFF47E1 | F0CD20C309BEFF257A6A94B252C8C897C87EF91B +,,F080167CEC9667F54BF51BC0B31C5314E9C2A63F,0x283C184c920102372b5FCD94807675D50A74e668,31000,,0,1,1,1,0,0,31000,0, +,,DB0528013E24EDCDA7B213F3B70321A62C701CCB,0x5190Efc20E1Ac0D4B5eCe5f6E8D5529925557C90,3400,,0,1,1,0,0,0,3400,0, +,,EFEDE66D3F4E36963EA643212C82C1C01681C593,0xB456a8673d19a6FaA5991e4f9169240f1b0ee3f2,7,,0,1,1,0,0,0,7,0, +,,79D4CF6171A4C6D9A9EB9FFDEE037E89D0AE2EAA,0x8aCE7EB84412bD73485518C3B5ECB8856931c0bB,1,,0,1,1,1,0,0,1,0, +,,F94D6191BA227409F520483FEB2965BEB277B74D,0x96f3F2f5Ca72863605B2977a26Aff2B86C4e19D6,83000,,0,1,1,1,0,0,83000,0, +,,86AFBAEAC67CFCCED2A21717BE09FC7D3D78E731,0x4B1202F567155524264f1E26Eeb35617BC4fB0df,24000,,0,1,1,0,0,0,24000,0, +,,A2A2E867F8F5191A8A48C8C5360C2764C7E82262,0x2cb5330285A053110d901E605A6F8FFE244fb9f7,25,,0,1,1,0,0,0,25,0, +,,EE83DD28254EE2DE0AF8E45BB6C5449B056EF4D9,0xe1aF18F9e5810A80365Ae7B89919540c01184dAc,33000,,0,1,1,1,0,0,33000,0, +,,FA266D7B780F5052747DAC15A990FE3DFB5063EA,0x22e2AA15d09A30Df7AF620D119806Aec826a55A7,21000,,0,1,1,1,0,0,21000,0, +,,E43915989E01BE6840D5C82B11B95885ED8CB81F,0x85Bd2dEE3233A1469E2217ee9520a39A2137d442,5400,,0,1.1,2,1,0,0,5940,0,742622D69C66EF602367967F8E26847C66FC9308 +,,D59557BD37EA06BF78436E4DED157716CAD88029,0x40A35FdE2bA34B29FBe699C6A43A6d6690e4345C,14,,0,1,1,1,0,0,14,0, +,,C38E150919A7C01D4849E0782AD2D8C4A74EAB34,0xf2948eDD428305D28DcBd6C284470e3823ee182b,990,,0,1.1,2,0,0,0,1089,0,7F54724CB9E0567BC4A538556DF25A4FD6DC7F5E +,,F3B98E0782873410FD0F754C479C877CC1D2DCED,0x2f5f379033a0e35e784928288E122E7508570D4B,41,,0,1,1,0,0,0,41,0, +,,FEB46CD11650B98C5268F2196BBDBFA37291A4FC,0x9Cb10817CAe852C45D8D602097a76a932f6185E6,210,,0,1.2,3,1,0,0,252,0,192329D17E32F62C9C79D7386AC5B9890FDC9D0C | AABC9B22A6A85F700B80EC3A6D140A08EC1590BB +,,F94A6BE3AEBB1892674D6A14B708026A734200B8,0x7bDAE3be9CB620822C576af1fD437056131E341a,7900,,0,1,1,0,0,0,7900,0, +,,306463A7CB9A07FB0AF0809A356BEB7A2F52183C,0xF3117E9F6115289CBE3E408e55c33F5d987250dF,24,,0,1,1,0,0,0,24,0, +,,5B10C41026A53B2F1E78542C2F0FF9B1FD4E2744,0x772136cCDF6653499b9b49b877eEf048752D2ed4,1,,0,1,1,1,0,0,1,0, +,,1B64F0AF1F1D84D0153EA7D445249CCB6F1E11DE,0xe328D2460EFD9F0F887F09A82a2aeBb457fdbDe5,5,,0,1,1,1,0,0,5,0, +,,BF70C16886ED6D70E1E103566314359AD95AA660,0x688143644F42A247DE67bfAD8fB9FBFBbA7Ee021,18000,,0,1,1,2,0,0,18000,0, +,,80F84367A3BBEC36B4BAC2D37BCE8086469F15B7,0xCB0C27769f8DB5640E49F058b72E029047D8ef74,13,,0,1,1,3,1,1,13,0, +,,E12F6A339B7434D720F00C2EA35B9085EA729D93,0x9f6C41276989252B785E56aff8e051d2Ec4F5E19,1,,0,1,1,0,0,0,1,0, +,,B0D63EE880C6D031F6977FB582253D0AB0FB87E1,0x44E11e790bE68A2378b9343E59F6C2Ae6342E442,5,,0,1,1,0,0,0,5,0, +,,F854C03E30EE8CE697454DEA04A1BA2113B31D10,0xaA491150D2db572F0C445B89A153217815C0E85E,64000,,0,1,1,0,0,0,64000,0, +,,4AE8B398D5C2C1F4AED80AF99F519F8274295798,0x586bAB70B10d50Dd1aF1C200E47e3a368B7bE3ce,15000,,0,1,1,7,1,1,15000,0, +,,3AB8AD860A2BD006840C48E71455C4742EFB8A3C,0xDf548c35DBA62A1B0A5FB1E365E2539935487408,5500,,0,1.2,3,0,0,0,6600,0,76FFB75E358D50868E5D5042AF77BDC38C39C45A | C58BB1A08CC76E46F16101E7DE5D323AA3B34F6E +,,CC0016D16E2E2EE08631E797D7A1F2208A540DC2,0xcb8518C21dB38ef37fF0Bf39Fe95b24D0959C355,1,,0,1,1,3,1,1,1,0, +,,4423B4748F312C60A04B0B89D6A7E03634521BB7,0x3eF27C8EEe8261fb5906B2e40daEDFC8E7B3f055,100,,0,1.2,3,23,4,4.8,120,0,D40ACFCA44CAFB6DEE053F0CB18CD40D1232C780 | 8E1A82EDB2CFE72E765C98F1FE810539F8B8FC1A +,,80091027A368B886658AA0A89A75FBDE0BF7A5BC,0xCd5D478686c6fA5E47Fc457F16E04224cD012690,28,,0,1.1,2,0,0,0,30.8,0,BE1F76841DB89C3D34FE9235BC8594E109951960 +,,5F4B3CCFBF1CE7268DE704E817B6D887C8E84AA5,0x79E85c7Aa3C289021048B598Be347e3F5CF1F3B7,20000,,0,1,1,0,0,0,20000,0, +,,51DA31A6EC1B33AA087BCE11B169178547BF470F,0x54a1354F615D464F7739d515598DB4e6315Ddc4B,35,,0,1.2,3,0,0,0,42,0,1A82EB4EB4768102F706FD2A6ED466D068CE3F9E | B838FEA01718A56EFA36B4547BACB3406871F017 +,,8129FD4C085A9F9BDEE1330BD32CE2B8B14DC8A2,0x6c8C7a143792eDC723A2eA27B1c3f2235882189d,14000,,0,1,1,1,0,0,14000,0, +,,B43EB281C8D96C035A395A0D215CC1C2EF5B8D46,0x898A9Eb0f6e49c8f5D33E678dd4bEfDCff77552A,190,,0,1,1,2,0,0,190,0, +,,D87507E1F107F84FDE784EEF17E6F610EB2176A1,0x9454d413886A3737c06b10dE11360669C56D5f24,760,,0,1,1,0,0,0,760,0, +,,472675903E7266492985C8F2331DFE91D5064904,0x4f485910CC79F27D85591b65e42d890136F3fdE3,9,,0,1,1,0,0,0,9,0, +,,B838FEA01718A56EFA36B4547BACB3406871F017,0x54a1354F615D464F7739d515598DB4e6315Ddc4B,11000,,0,1.2,3,0,0,0,13200,0,51DA31A6EC1B33AA087BCE11B169178547BF470F | 1A82EB4EB4768102F706FD2A6ED466D068CE3F9E +,,A456F6D86F812024FCD50E0C3005AE02F3080897,0xF41A5f015C90Aa260A5F501Ba09e8d00495B6221,6,,0,1,1,0,0,0,6,0, +,,D26B9006B579F8914C70EBDFD1C876E864386970,0x42a9CF0F0F8cF73F1bc34A62e934f244bC00fE35,160,,0,1,1,1,0,0,160,0, +,,5CA07B48E4BD11F78DD5A795FA0ADBD382A85FB5,0x3d1123CCd5E035d5009Abf16870e0877fdFA7e3E,0,,0,1,1,0,0,0,0,0, +,,A9231EA60B8A9EC29B85B02D2C38397338F80097,0x3b9089785C4e941342cf348BC160caDb7D90f2Dc,25,,0,1,1,1,0,0,25,0, +,,BC14319205C5BDF45282C830E0CEB6B3C53D62B1,0x1DfC09e0Aef1d576edfa4fFD71FC4cAeaC911d4E,63000,,0,1,1,1,0,0,63000,0, +,,6DB809941E8156AA78DBCB87C114B9C68CC79BE2,0x8484D2156b0E9C6ea1D9c149579fE9738efb9118,13,,0,1,1,0,0,0,13,0, +,,2BBD14694BD7FBDCB3F5C7A79526CE687FBC3F92,0xdA0955B495f3F181c282f5D1b05168706EaF0455,1,,0,1,1,1,0,0,1,0, +,,893A110668CEE347DE6F54705A300488EBCF4B5A,0x0a14181c3845c0C4eE574C2564B01affA400242F,33000,,0,1.1,2,1,0,0,36300,0,BB05DF5D23D225F1B9ED82796D8194257706B2E5 +,,8691B128DB758DA9D625648597B30D828C298AD1,0xF955c822D7151Bf32362aF5cc8f3f283871D3465,20,,0,1,1,1,0,0,20,0, +,,94C674BD456A41E48BB147E8F3C4A2A9462D7AD6,0xaF044B784D6f7CB3D3d0938f568dE1F3E05E8145,10,,0,1,1,0,0,0,10,0, +,,0C7C783A1B8CA59C6E7336F0CA3686DC20E7C8DC,0xdB13f6F9BccF5ac30378Ea6DfBCA45eec35AfA33,220,,0,1,1,1,0,0,220,0, +,,1119479099A2CB33CEF47DE40986ED79D8BC9065,0x7f34907d02CC0CCd334ee76044da10e7388FDc53,450,,0,1,1,1,0,0,450,0, +,,E097F5F0D539E69BCF8AAFBD0F333AB1D4FB70C0,0xdF60b603671bd2d2F014fd4e4d6a3657823Df567,24,,0,1.1,2,1,0,0,26.4,0,3EDD864DC20CBF7CF971980696D08B082C93A33F +,,F14F5730747ACC3F9E7F4D13EEE2059DAFED7CC9,0x493e5f463feB5B13259214E81cF229c5B28303EC,32000,,0,1,1,0,0,0,32000,0, +,,83931E18F087E8848E9E90A555F588ABFA7B7FFF,0x981F118EdbD9e360863dFA283f05200804825b1A,15000,,0,1,1,1,0,0,15000,0, +,,1A82EB4EB4768102F706FD2A6ED466D068CE3F9E,0x54a1354F615D464F7739d515598DB4e6315Ddc4B,25000,,0,1.2,3,0,0,0,30000,0,51DA31A6EC1B33AA087BCE11B169178547BF470F | B838FEA01718A56EFA36B4547BACB3406871F017 +,,25280148FEF4E800FD179082D9E23276C7199E9D,0xa2AA87bE9FaaE25F1aC6E6846eC9589b03625ce0,56000,,0,1.1,2,1,0,0,61600,0,60CCE755BD6B7410C70A16B4204D13A986437FDA +,,7914ACDDAF064384DF9D13DF6209C376005E10DB,0x5B29f4E4918f5Dc436C8A12f807869aD063d0B3a,22,,0,1,1,0,0,0,22,0, +,,71994F7E2A7B740424DB4356BC1D50B748C26568,0xFe1c9385784Db958057BCA11D8f59762Eb4d4D35,1,,0,1,1,1,0,0,1,0, +,,C58BB1A08CC76E46F16101E7DE5D323AA3B34F6E,0xDf548c35DBA62A1B0A5FB1E365E2539935487408,6600,,0,1.2,3,1,0,0,7920,0,76FFB75E358D50868E5D5042AF77BDC38C39C45A | 3AB8AD860A2BD006840C48E71455C4742EFB8A3C +,,CF66C81AB64ACA1EC95E1F10B75721F4DE0AEE57,0x4dCDb1BEa466136C287D1C522db829571F93b62f,27000,,0,1,1,11,2,2,27000,0, +,,B7B9943D39D291E92D9362A1B4BE13871BF3F80E,0xeA7C91110cc49f97F74f7725BB5148aC9CE7dF51,1,,0,1,1,1,0,0,1,0, +,,065624A930062AB264E96CD524BD9F5BAD339BA8,0xE2f4b4106C227613DAf4116881811c1745d2cd0f,20,,0,1,1,3,1,1,20,0, +,,09DC138DAEDD1CC461950E9FAA7779586E429974,0x4e6585c9553842C448C5B9a6F2907E3AC2e87239,1200,,0,1.1,2,0,0,0,1320,0,DEE60B40AE194A1731FC5104C4825948EB60A9CF +,,64AC588E781DD8598C189E2B3E4E656A3BA86C39,0x06032e6a223c791DaADf89e4ACf5415eC7384a3B,1,,0,1,1,54,4,4,1,0, +,,AAE4C700E63F21FAAAA44C5E6851C4CF0581C215,0x818b13A69a72D02903d593844aEE5AF552Cc6Cd4,1,,0,1,1,0,0,0,1,0, +,,8BA51CF4D3F3140592A14088CBE49CB4EE38A415,0x8ce3456193Eabc7fa2Cd6f3660CA6eBf9f69E63b,63000,,0,1,1,545,4,4,63000,0, +,,F0CD20C309BEFF257A6A94B252C8C897C87EF91B,0x9D0caC8351BD51D5BC537bD62c0410a8DBc78B74,28,,0,1.2,3,0,0,0,33.6,0,414B00316959CF5478DF551A64E9A21BAEFF47E1 | F987F6092D765D99B00BBFE1C6AC5F662FB1A941 +,,41DC8255F0EAB3E34265B243C177CA1E84947065,0x653aC1ED2E637a4f1cc61Ff5F039a8d806D3e272,14,,0,1,1,0,0,0,14,0, +,,A30C4C285B182A5B8D6DE27E3F425835D21780A5,0x41f171ffBfe44a3674bF9f30B47693b9bc62E9b7,110000,,0,1,1,1,0,0,110000,0, +,,AABC9B22A6A85F700B80EC3A6D140A08EC1590BB,0x9Cb10817CAe852C45D8D602097a76a932f6185E6,740,,0,1.2,3,1,0,0,888,0,192329D17E32F62C9C79D7386AC5B9890FDC9D0C | FEB46CD11650B98C5268F2196BBDBFA37291A4FC +,,372FA2A17AD589982CC41F7BDA0EDFD5488B24D1,0x8D03A395CD9E68409967e4957D6B85ADaF288687,32,,0,1,1,0,0,0,32,0, +,,918CC33E7BE9685404288B05EB481BAA12528FD1,0x7B507FbbA9FC5d03d41e18D63a4633f68bb93136,13,,0,1,1,1,0,0,13,0, +,,98D05C6209E88A45E55AE1A9BF983BF2906AF54E,0x2eF461FdBEcc607d0b0cA27106C683a8F64468A4,3300,,0,1,1,1,0,0,3300,0, +,,E0611546A9ABC8A3BFF82D4EB035F972F93B6661,0x8e8f2F0bcFab3a53b6d82e299C3d5f6397579e53,4,,0,1,1,2,0,0,4,0, +,,E009249FAB98FE52826642391DA33E125869C63F,0x002Eb755BD82B99F052D2cCe67EA4ED10561E49c,1,,0,1,1,3,1,1,1,0, +,,E3299F9CC495E19C6B3C39D58B714D18DAB6DDCF,0x477E84277727279FB51E39cdB61642CC8d6B02BA,22,,0,1,1,0,0,0,22,0, \ No newline at end of file diff --git a/smartweave/test/e2e/data/scores_quality_bonuses.json b/smartweave/test/e2e/data/scores_quality_bonuses.json new file mode 100644 index 0000000..f88a8fa --- /dev/null +++ b/smartweave/test/e2e/data/scores_quality_bonuses.json @@ -0,0 +1,2334 @@ +[ + { + "address": "0xf2948eDD428305D28DcBd6C284470e3823ee182b", + "fingerprint": "7F54724CB9E0567BC4A538556DF25A4FD6DC7F5E", + "score": "14000", + "hardware": true, + "hwScore": "14000", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "15400", + "hwScoreWithFamilyMultiplier": "15400", + "uptime": "26", + "uptimeScore": "4", + "uptimeScoreWithFamilyMultiplier": "4.4", + "family": [ + "C38E150919A7C01D4849E0782AD2D8C4A74EAB34" + ] + }, + { + "address": "0xa2AA87bE9FaaE25F1aC6E6846eC9589b03625ce0", + "fingerprint": "60CCE755BD6B7410C70A16B4204D13A986437FDA", + "score": "53000", + "hardware": true, + "hwScore": "53000", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "58300", + "hwScoreWithFamilyMultiplier": "58300", + "uptime": "4", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1.1", + "family": [ + "25280148FEF4E800FD179082D9E23276C7199E9D" + ] + }, + { + "address": "0xF94C4F7e890Bc437137eCCF8bF58C5c842A3cC03", + "fingerprint": "A1BBF90FAEA682A5C96B7B36A6AA27ABE56C4AA7", + "score": "1", + "hardware": true, + "hwScore": "1", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "1", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x0f67593B4C7A9CF726208a840804185Da0Ba372A", + "fingerprint": "7CAA543175753FB53BDD87C1048837B9157D82A8", + "score": "8", + "hardware": true, + "hwScore": "8", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "8", + "hwScoreWithFamilyMultiplier": "8", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xd045A4344362A3CD187bd7e2277Fae8BA067EFd5", + "fingerprint": "D60941A928090AADF96AD6481B974D79AA6048E2", + "score": "6700", + "hardware": true, + "hwScore": "6700", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "6700", + "hwScoreWithFamilyMultiplier": "6700", + "uptime": "19", + "uptimeScore": "2", + "uptimeScoreWithFamilyMultiplier": "2" + }, + { + "address": "0x3ceb890224dAaB095745d3fa18e17F83699705ad", + "fingerprint": "42449D01D4052169541A3315F18179EAB8F923A9", + "score": "28000", + "hardware": true, + "hwScore": "28000", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "28000", + "hwScoreWithFamilyMultiplier": "28000", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xe486d9D3b99a0B9CD35a511401D928E527844b43", + "fingerprint": "C9B4D5154450ACAB3A81548DE5E383378B0328E4", + "score": "8", + "hardware": true, + "hwScore": "8", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "8", + "hwScoreWithFamilyMultiplier": "8", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x0a14181c3845c0C4eE574C2564B01affA400242F", + "fingerprint": "BB05DF5D23D225F1B9ED82796D8194257706B2E5", + "score": "52000", + "hardware": true, + "hwScore": "52000", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "57200", + "hwScoreWithFamilyMultiplier": "57200", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "893A110668CEE347DE6F54705A300488EBCF4B5A" + ] + }, + { + "address": "0x7Fa0963a8CB41d12C0bBa4286141dd71Ba158F44", + "fingerprint": "6AAFCA940AF45837A312034ED84AADC081520DB1", + "score": "11000", + "hardware": true, + "hwScore": "11000", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "11000", + "hwScoreWithFamilyMultiplier": "11000", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x0184FC55d9AC8856Fc365BDc70825756c9D438fc", + "fingerprint": "BE62F9855E9143A3D15C98739800A2DCBAF7A76D", + "score": "1", + "hardware": true, + "hwScore": "1", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "1", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xFA579D17a320AA2B226aD068B5597aaFd493a56d", + "fingerprint": "2FFD767BABE25856580BE057FD7708F9D2E1C479", + "score": "7", + "hardware": true, + "hwScore": "7", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "7", + "hwScoreWithFamilyMultiplier": "7", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xDf548c35DBA62A1B0A5FB1E365E2539935487408", + "fingerprint": "76FFB75E358D50868E5D5042AF77BDC38C39C45A", + "score": "1", + "hardware": true, + "hwScore": "1", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "1.2", + "hwScoreWithFamilyMultiplier": "1.2", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "C58BB1A08CC76E46F16101E7DE5D323AA3B34F6E", + "3AB8AD860A2BD006840C48E71455C4742EFB8A3C" + ] + }, + { + "address": "0xDD3A2390CeFa80c1eCF5771636A4F49F2B8956C8", + "fingerprint": "2CAC5BA69A56809C6F6D71A34929B2FF8C35CA9B", + "score": "31000", + "hardware": true, + "hwScore": "31000", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "31000", + "hwScoreWithFamilyMultiplier": "31000", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xBbbB5ABEC6730e96Da0e7E91564E4090117c39Cd", + "fingerprint": "74D0083A550B009B4E5C91A2BB577236F0C7AF9B", + "score": "47000", + "hardware": true, + "hwScore": "47000", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "47000", + "hwScoreWithFamilyMultiplier": "47000", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x778B01147C894C76909D9C889e8F9e0D55328FA9", + "fingerprint": "87B569D9DB1B812944CFBF41DE696B1E6A2F62DD", + "score": "260", + "hardware": true, + "hwScore": "260", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "260", + "hwScoreWithFamilyMultiplier": "260", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x85Bd2dEE3233A1469E2217ee9520a39A2137d442", + "fingerprint": "742622D69C66EF602367967F8E26847C66FC9308", + "score": "26", + "hardware": true, + "hwScore": "26", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "28.6", + "hwScoreWithFamilyMultiplier": "28.6", + "uptime": "11", + "uptimeScore": "2", + "uptimeScoreWithFamilyMultiplier": "2.2", + "family": [ + "E43915989E01BE6840D5C82B11B95885ED8CB81F" + ] + }, + { + "address": "0xAbcd54201697adC79bD0d012E0Bb8bC4c9572eF9", + "fingerprint": "6F230469A5D07CF24361A4546E709AE52C6EBE4F", + "score": "16000", + "hardware": true, + "hwScore": "16000", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "16000", + "hwScoreWithFamilyMultiplier": "16000", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x605782a5D874cB2B8b25B0D72CD111e468a0068b", + "fingerprint": "519262BF20AC9CF2753DED331C145BC6F315C7B5", + "score": "7", + "hardware": true, + "hwScore": "7", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "7", + "hwScoreWithFamilyMultiplier": "7", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x79B4E22F291d18116B70199C62A8c360ad248c93", + "fingerprint": "54790AF4A4EF9EBDE7D7DE834E09562B7A915156", + "score": "810", + "hardware": true, + "hwScore": "810", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "891", + "hwScoreWithFamilyMultiplier": "891", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "0DE9BB713F628E5AAC0300B7C4CD5365589B4DFC" + ] + }, + { + "address": "0xCd5D478686c6fA5E47Fc457F16E04224cD012690", + "fingerprint": "BE1F76841DB89C3D34FE9235BC8594E109951960", + "score": "18000", + "hardware": true, + "hwScore": "18000", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "19800", + "hwScoreWithFamilyMultiplier": "19800", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "80091027A368B886658AA0A89A75FBDE0BF7A5BC" + ] + }, + { + "address": "0xA0f166b408316C01c778Ea51A35991CbeD0630B2", + "fingerprint": "7A3D6ECE5C38D65F9022FDBE8F36A7C794B3661E", + "score": "55000", + "hardware": true, + "hwScore": "55000", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "55000", + "hwScoreWithFamilyMultiplier": "55000", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x77B789133012751720cF50781d31Bb56Fb4B97dA", + "fingerprint": "BF4EB653F28CF9C958C3232D54B1FC29B4B12F17", + "score": "38000", + "hardware": true, + "hwScore": "38000", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "38000", + "hwScoreWithFamilyMultiplier": "38000", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x887b7E335f75E69ecaf1376F057667562269d7DC", + "fingerprint": "BCCA31EC30093D0FA657A75A4FEB559473FDDD50", + "score": "3200", + "hardware": true, + "hwScore": "3200", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "3200", + "hwScoreWithFamilyMultiplier": "3200", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x52285B51Fb4E0Ac159AC46aD12Ef792E02cD214d", + "fingerprint": "8C6F44DF49DA4AB4BD254ED1CD2F391FA9BC66F8", + "score": "1500", + "hardware": true, + "hwScore": "1500", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1500", + "hwScoreWithFamilyMultiplier": "1500", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xcb7a940167172CE2c6E4EaD25FD0ff1cede432A6", + "fingerprint": "F8C6CE08E91B09D7068F782F37DE756984237DBC", + "score": "3200", + "hardware": true, + "hwScore": "3200", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "3200", + "hwScoreWithFamilyMultiplier": "3200", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x8E02Ff09b8Fa6047122c2adBB40029cA444F5974", + "fingerprint": "D8BA267DE758586462486E7DF7C5FB9556404D5F", + "score": "100", + "hardware": true, + "hwScore": "100", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "100", + "hwScoreWithFamilyMultiplier": "100", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x172253954c395832a9e264FbD8f248221d4a92B6", + "fingerprint": "284C217B14811520C0586CFACEAA984ADA6C1F88", + "score": "1400", + "hardware": true, + "hwScore": "1400", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1400", + "hwScoreWithFamilyMultiplier": "1400", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xDd29C85d9FDe419dcaF7cB3eCba603f1328eeF32", + "fingerprint": "8D543BCFCC18BF2189DE740D95F70B25EBA3BB0C", + "score": "340", + "hardware": true, + "hwScore": "340", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "340", + "hwScoreWithFamilyMultiplier": "340", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xa594dc6755fDF82dF1ddB20cd8DE2c04Faa6a5a9", + "fingerprint": "CB11AD937DE2F01B830782A218DEEF096AE7B47D", + "score": "1", + "hardware": true, + "hwScore": "1", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "1", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x7E0781f0e035a16F5F3cf833d99D69E1e0036039", + "fingerprint": "123B0957B74759A3AF6524E257E29D3708109B1B", + "score": "14000", + "hardware": true, + "hwScore": "14000", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "14000", + "hwScoreWithFamilyMultiplier": "14000", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331", + "fingerprint": "331EDCF3B51D31160958689706E983D6293F9A73", + "score": "3900", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.3", + "familySize": "4", + "scoreWithFamilyMultiplier": "5070", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "99BFBEE8C437604EAD059B95D490FE4E2F9EE70C", + "56D16B8CF83778F1ABD1B2F144CA7BDC717C2AB7", + "393AB3EECB137E91DB3EE1A336B06A2B671CB383" + ] + }, + { + "address": "0xc93473826F40100aE06E2E02F351C30c7f985bf7", + "fingerprint": "342066443F2AFA27F0E515DAFBCBD0510957F7F5", + "score": "3600", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "3600", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xBB1973a07b9802bD1bb2B868c96d6C8a6BB0Ac50", + "fingerprint": "FD0D7535C9BB69C7F4F4A17149526EF97F4553FC", + "score": "20", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "20", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x6F46735673bbBE1Ff346B1a0Aa45fd2B611216dB", + "fingerprint": "9D1D415000C0E3CCAF64C282541C1CA0710F1660", + "score": "760", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "760", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x0e8D6c66CF65Ff3553B5cfFF7F937E51CEAea1D4", + "fingerprint": "1E9582E86DA4469541A572EBBAD731A391EB61EC", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xB09Bdac8b7a4faE53EAC7D2F5e2E99A8170Cb817", + "fingerprint": "FA37D7D451A03FC7CA7FA023EFA67E8B3D7CBBEF", + "score": "38", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "38", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "3", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0xf4743bf3d7Aa0Cd2d6f2a5fB634B401D8db60987", + "fingerprint": "D53735422CB4036A80F91837B7EE9747F5B5C9F1", + "score": "870", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "870", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xf0Ca6fE447d26489BfC712A41835BBC7dD69dED6", + "fingerprint": "710B72A4F80354C033792F813C9FC71BAFC2EAA1", + "score": "600", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "600", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x7Add71Ad0477D36F45f849b7a81c7d2Ba4543cfF", + "fingerprint": "220BB45F6720C30BD11CCA35E63194360F412256", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x94AcDF394C14232aca203b4D1f1854Bc40582878", + "fingerprint": "312B484FCD2BFADDA2E12F88B0249D30AF92AFAC", + "score": "8", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "8", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "4", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0x9Cb10817CAe852C45D8D602097a76a932f6185E6", + "fingerprint": "192329D17E32F62C9C79D7386AC5B9890FDC9D0C", + "score": "720", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "864", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "AABC9B22A6A85F700B80EC3A6D140A08EC1590BB", + "FEB46CD11650B98C5268F2196BBDBFA37291A4FC" + ] + }, + { + "address": "0x3c78053528cCbD382C90A13233c509965fe3451A", + "fingerprint": "DBF5432BF07BC1F9B6E6E1FE7389BA41008363D8", + "score": "280", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "280", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x7f85F0E167Cc229A7eB9B41221D9D8a7965f2949", + "fingerprint": "EA50D08EC10EE837B8A1719AC4447547712EDB66", + "score": "34000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "34000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "5", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0x3eF27C8EEe8261fb5906B2e40daEDFC8E7B3f055", + "fingerprint": "D40ACFCA44CAFB6DEE053F0CB18CD40D1232C780", + "score": "5900", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "7080", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "4423B4748F312C60A04B0B89D6A7E03634521BB7", + "8E1A82EDB2CFE72E765C98F1FE810539F8B8FC1A" + ] + }, + { + "address": "0x9aDE33Cf4ca08E46c7f84f82A82FCF5d8A4adA55", + "fingerprint": "094F7556A5F07F5662C9E4EFA6CD9D41A2D5B29F", + "score": "600", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "660", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "6", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1.1", + "family": [ + "6165EBEB3F76E843E8E568DD3C0E7EA97C99DCED" + ] + }, + { + "address": "0x79B4E22F291d18116B70199C62A8c360ad248c93", + "fingerprint": "0DE9BB713F628E5AAC0300B7C4CD5365589B4DFC", + "score": "40000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "44000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "54790AF4A4EF9EBDE7D7DE834E09562B7A915156" + ] + }, + { + "address": "0x5B5378870b6A52588e65c914a487F083a2193281", + "fingerprint": "B0D745A63E20214DD3B0F551D3A10D14D66616FE", + "score": "4200", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "4200", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xCBb7352fa31681749a9DB14E14aE80f8AE9A4B3f", + "fingerprint": "5B7B4594C2F098B128A6BB58F9A7411BD770F5B8", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x9b38E17c23673471547d8b031e0EFebB666C985A", + "fingerprint": "9607723EA326414B57940E5695AC37F0956E8BC9", + "score": "16000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "16000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xC4e1d4CDf842c19503280dA5db7A4C3761305f88", + "fingerprint": "16C5FBF55A56D9CEF98E94930BE5F23C45E5C6EA", + "score": "1000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xe8Bdc142fd025da1D757f1991BC08799d9719C56", + "fingerprint": "4E964214C20D2CBA0859EBB06514DBDBFD3A2F72", + "score": "730", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "730", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xb2A35680dB7dAe518b058213B629d7a8658163b9", + "fingerprint": "1CBB8CF10565C007861B66B5764FD88DF6F850BB", + "score": "2500", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "2500", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x9aDE33Cf4ca08E46c7f84f82A82FCF5d8A4adA55", + "fingerprint": "6165EBEB3F76E843E8E568DD3C0E7EA97C99DCED", + "score": "45000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "49500", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "094F7556A5F07F5662C9E4EFA6CD9D41A2D5B29F" + ] + }, + { + "address": "0x3eF27C8EEe8261fb5906B2e40daEDFC8E7B3f055", + "fingerprint": "8E1A82EDB2CFE72E765C98F1FE810539F8B8FC1A", + "score": "22000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "26400", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "D40ACFCA44CAFB6DEE053F0CB18CD40D1232C780", + "4423B4748F312C60A04B0B89D6A7E03634521BB7" + ] + }, + { + "address": "0x4768acafFB3aCd3D8Ae4798d423088F8366Bd8Ca", + "fingerprint": "70D1EB563BBB10F1EE62E537BB9F3BD7419EE11E", + "score": "34000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "34000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x3941578e47Bcb7AC5f006488De8D0CA8461bB0b5", + "fingerprint": "17DA905ADD643D74A2213229C2DDD65C5DEAD8AE", + "score": "26", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "26", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "3", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0x7828a2e11bec453E69232B636668CE6e10774055", + "fingerprint": "A2FCBB258D2D8C89B4B52F70C41880C61392A236", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x8824F0091D6d6Ee3beD0645eCBC0E2d8c9c47942", + "fingerprint": "D2870D5A1B2325DFC7E539A45A3B01AF488310BD", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "3", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0xa3EE387E97fbeC75A2623A809726c38f6ac19B2D", + "fingerprint": "E616E560EB2F9E380C7DE8506D8EB075517E76DA", + "score": "15000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "15000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x4e6585c9553842C448C5B9a6F2907E3AC2e87239", + "fingerprint": "DEE60B40AE194A1731FC5104C4825948EB60A9CF", + "score": "1600", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "1760", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "09DC138DAEDD1CC461950E9FAA7779586E429974" + ] + }, + { + "address": "0xE1Fe60B2cD9afC03FCFa1Ef7cA0B27F4E087e5bb", + "fingerprint": "4C78CA89BCE131F064FAC276B089FFE311F62E96", + "score": "14", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "14", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "33", + "uptimeScore": "4", + "uptimeScoreWithFamilyMultiplier": "4" + }, + { + "address": "0x9D0caC8351BD51D5BC537bD62c0410a8DBc78B74", + "fingerprint": "414B00316959CF5478DF551A64E9A21BAEFF47E1", + "score": "22", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "26.4", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "F0CD20C309BEFF257A6A94B252C8C897C87EF91B", + "F987F6092D765D99B00BBFE1C6AC5F662FB1A941" + ] + }, + { + "address": "0x3eB74a37451737D6a432b192358739ad6Ff4fb39", + "fingerprint": "C047FF5FBE7ECA5F3FFF289E5C70DA17AAA5946C", + "score": "7000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "7000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x4A84876a30B9e0cb3f75a5F69FF282649Dab05a4", + "fingerprint": "43F6A8A19EBA132A6831EC284E4910FAC0D3E8A0", + "score": "9", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "9", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331", + "fingerprint": "393AB3EECB137E91DB3EE1A336B06A2B671CB383", + "score": "6300", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.3", + "familySize": "4", + "scoreWithFamilyMultiplier": "8190", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "331EDCF3B51D31160958689706E983D6293F9A73", + "99BFBEE8C437604EAD059B95D490FE4E2F9EE70C", + "56D16B8CF83778F1ABD1B2F144CA7BDC717C2AB7" + ] + }, + { + "address": "0x6d525E918432c486618E3eb106703acECC795a43", + "fingerprint": "2A58523BA6DEFD0D4640499874EECEADF9AC49CE", + "score": "37000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "37000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331", + "fingerprint": "99BFBEE8C437604EAD059B95D490FE4E2F9EE70C", + "score": "7400", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.3", + "familySize": "4", + "scoreWithFamilyMultiplier": "9620", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "331EDCF3B51D31160958689706E983D6293F9A73", + "393AB3EECB137E91DB3EE1A336B06A2B671CB383", + "56D16B8CF83778F1ABD1B2F144CA7BDC717C2AB7" + ] + }, + { + "address": "0xdC2daEccA2007B169b8B332db531bCf69aE1f74C", + "fingerprint": "EB80D5F8239D189EE4649BDA645C3732C02B6519", + "score": "9", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "9", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x4ED816a923c4D9CEF68002642b08120083E076FB", + "fingerprint": "7588BD9451FAC3AFADE97B31C0C1DC017F9DB2C3", + "score": "2200", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "2200", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xd45d35bC22c19a9979184fC146108eaB0B6AD41c", + "fingerprint": "70003522A2178F4FA21C55DAD1C8CF0345BA27DB", + "score": "6300", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "6300", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xBEd5edF3A75F1c132fd913006CD9840D288d2cA9", + "fingerprint": "8EADCF09FC8F816BB2C8F7F7B3D4CBDDF4C7DDFE", + "score": "1700", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1700", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "3", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0xF56AB9Af9c118C2A05b528927158Af2e216d7638", + "fingerprint": "5E3EC290182D744BE1A05580431E81400B1DC431", + "score": "6", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "6", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x448Cc1ca7b315a465bB9e20f8e49E0062f4BD331", + "fingerprint": "56D16B8CF83778F1ABD1B2F144CA7BDC717C2AB7", + "score": "7100", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.3", + "familySize": "4", + "scoreWithFamilyMultiplier": "9230", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "4", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1.3", + "family": [ + "331EDCF3B51D31160958689706E983D6293F9A73", + "393AB3EECB137E91DB3EE1A336B06A2B671CB383", + "99BFBEE8C437604EAD059B95D490FE4E2F9EE70C" + ] + }, + { + "address": "0xD3ac40ba686AA050396d41E39E328F02cf05f15f", + "fingerprint": "ECE5E96F86D53782AC41FFB5ECD7F11BBEA60CD4", + "score": "16", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "16", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xC2c58DaFE37Ccf2D0bdB0a90194bE969aD05CFFc", + "fingerprint": "EB0F5258EA351742DB9D79BB8697640658F1D9CF", + "score": "60000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "60000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "5", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0xdF60b603671bd2d2F014fd4e4d6a3657823Df567", + "fingerprint": "3EDD864DC20CBF7CF971980696D08B082C93A33F", + "score": "24", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "26.4", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "E097F5F0D539E69BCF8AAFBD0F333AB1D4FB70C0" + ] + }, + { + "address": "0x0A393A0dFc3613eeD5Bd2A0A56d482351f4e3996", + "fingerprint": "5B765D3A887033AE487817090BF87C65B4536F6D", + "score": "46000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "46000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x9DCA83E91041222D20c491F5b25ddC7Ac79Ee53B", + "fingerprint": "E7D161A93D2FCFAF53CA35B9AB07F734ECC7D5B5", + "score": "53000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "53000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xc60048Fd2bccd82da8A1C0d06B3CF1Bfd7D740A2", + "fingerprint": "FA3DB534B688D91FE2E8E0215B7714C0C33012BB", + "score": "14000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "14000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x180401CaBa07a348FaA85E138d7B7BeD24d79775", + "fingerprint": "9BA30444BC2C42EAD4542E031904B0CDA677A366", + "score": "45000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "45000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x6093B4B8C11EBDa4763f06D988eBC160a4DcD683", + "fingerprint": "0B4A2A488E2B5772A1FB96638C7FAA7F790117B2", + "score": "47000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "47000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xa4392b4220EafcF6AF73881991ea7254e392D31a", + "fingerprint": "C321BFBA1DFD87061B7C8306AE62D972F7B59376", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x14EE8817b5De0849ED7cE0E699BD19EDE7ec5e95", + "fingerprint": "C54C12A5D21E95C1627ADE9D43432CB828E4DB48", + "score": "30000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "30000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x8e8644FAA2Bf53e3f854Ee472BF08B92CC6a7aa7", + "fingerprint": "8039F20131CBDFB792BA9C9FC0D45018F8A0D3F0", + "score": "7", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "7", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x9D0caC8351BD51D5BC537bD62c0410a8DBc78B74", + "fingerprint": "F987F6092D765D99B00BBFE1C6AC5F662FB1A941", + "score": "19", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "22.8", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "414B00316959CF5478DF551A64E9A21BAEFF47E1", + "F0CD20C309BEFF257A6A94B252C8C897C87EF91B" + ] + }, + { + "address": "0x283C184c920102372b5FCD94807675D50A74e668", + "fingerprint": "F080167CEC9667F54BF51BC0B31C5314E9C2A63F", + "score": "31000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "31000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x5190Efc20E1Ac0D4B5eCe5f6E8D5529925557C90", + "fingerprint": "DB0528013E24EDCDA7B213F3B70321A62C701CCB", + "score": "3400", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "3400", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xB456a8673d19a6FaA5991e4f9169240f1b0ee3f2", + "fingerprint": "EFEDE66D3F4E36963EA643212C82C1C01681C593", + "score": "7", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "7", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x8aCE7EB84412bD73485518C3B5ECB8856931c0bB", + "fingerprint": "79D4CF6171A4C6D9A9EB9FFDEE037E89D0AE2EAA", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x96f3F2f5Ca72863605B2977a26Aff2B86C4e19D6", + "fingerprint": "F94D6191BA227409F520483FEB2965BEB277B74D", + "score": "83000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "83000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x4B1202F567155524264f1E26Eeb35617BC4fB0df", + "fingerprint": "86AFBAEAC67CFCCED2A21717BE09FC7D3D78E731", + "score": "24000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "24000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x2cb5330285A053110d901E605A6F8FFE244fb9f7", + "fingerprint": "A2A2E867F8F5191A8A48C8C5360C2764C7E82262", + "score": "25", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "25", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xe1aF18F9e5810A80365Ae7B89919540c01184dAc", + "fingerprint": "EE83DD28254EE2DE0AF8E45BB6C5449B056EF4D9", + "score": "33000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "33000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x22e2AA15d09A30Df7AF620D119806Aec826a55A7", + "fingerprint": "FA266D7B780F5052747DAC15A990FE3DFB5063EA", + "score": "21000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "21000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x85Bd2dEE3233A1469E2217ee9520a39A2137d442", + "fingerprint": "E43915989E01BE6840D5C82B11B95885ED8CB81F", + "score": "5400", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "5940", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "742622D69C66EF602367967F8E26847C66FC9308" + ] + }, + { + "address": "0x40A35FdE2bA34B29FBe699C6A43A6d6690e4345C", + "fingerprint": "D59557BD37EA06BF78436E4DED157716CAD88029", + "score": "14", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "14", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xf2948eDD428305D28DcBd6C284470e3823ee182b", + "fingerprint": "C38E150919A7C01D4849E0782AD2D8C4A74EAB34", + "score": "990", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "1089", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "7F54724CB9E0567BC4A538556DF25A4FD6DC7F5E" + ] + }, + { + "address": "0x2f5f379033a0e35e784928288E122E7508570D4B", + "fingerprint": "F3B98E0782873410FD0F754C479C877CC1D2DCED", + "score": "41", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "41", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x9Cb10817CAe852C45D8D602097a76a932f6185E6", + "fingerprint": "FEB46CD11650B98C5268F2196BBDBFA37291A4FC", + "score": "210", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "252", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "192329D17E32F62C9C79D7386AC5B9890FDC9D0C", + "AABC9B22A6A85F700B80EC3A6D140A08EC1590BB" + ] + }, + { + "address": "0x7bDAE3be9CB620822C576af1fD437056131E341a", + "fingerprint": "F94A6BE3AEBB1892674D6A14B708026A734200B8", + "score": "7900", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "7900", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xF3117E9F6115289CBE3E408e55c33F5d987250dF", + "fingerprint": "306463A7CB9A07FB0AF0809A356BEB7A2F52183C", + "score": "24", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "24", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x772136cCDF6653499b9b49b877eEf048752D2ed4", + "fingerprint": "5B10C41026A53B2F1E78542C2F0FF9B1FD4E2744", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xe328D2460EFD9F0F887F09A82a2aeBb457fdbDe5", + "fingerprint": "1B64F0AF1F1D84D0153EA7D445249CCB6F1E11DE", + "score": "5", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "5", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x688143644F42A247DE67bfAD8fB9FBFBbA7Ee021", + "fingerprint": "BF70C16886ED6D70E1E103566314359AD95AA660", + "score": "18000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "18000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xCB0C27769f8DB5640E49F058b72E029047D8ef74", + "fingerprint": "80F84367A3BBEC36B4BAC2D37BCE8086469F15B7", + "score": "13", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "13", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "3", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0x9f6C41276989252B785E56aff8e051d2Ec4F5E19", + "fingerprint": "E12F6A339B7434D720F00C2EA35B9085EA729D93", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x44E11e790bE68A2378b9343E59F6C2Ae6342E442", + "fingerprint": "B0D63EE880C6D031F6977FB582253D0AB0FB87E1", + "score": "5", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "5", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xaA491150D2db572F0C445B89A153217815C0E85E", + "fingerprint": "F854C03E30EE8CE697454DEA04A1BA2113B31D10", + "score": "64000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "64000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x586bAB70B10d50Dd1aF1C200E47e3a368B7bE3ce", + "fingerprint": "4AE8B398D5C2C1F4AED80AF99F519F8274295798", + "score": "15000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "15000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "7", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0xDf548c35DBA62A1B0A5FB1E365E2539935487408", + "fingerprint": "3AB8AD860A2BD006840C48E71455C4742EFB8A3C", + "score": "5500", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "6600", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "76FFB75E358D50868E5D5042AF77BDC38C39C45A", + "C58BB1A08CC76E46F16101E7DE5D323AA3B34F6E" + ] + }, + { + "address": "0xcb8518C21dB38ef37fF0Bf39Fe95b24D0959C355", + "fingerprint": "CC0016D16E2E2EE08631E797D7A1F2208A540DC2", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "3", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0x3eF27C8EEe8261fb5906B2e40daEDFC8E7B3f055", + "fingerprint": "4423B4748F312C60A04B0B89D6A7E03634521BB7", + "score": "100", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "120", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "23", + "uptimeScore": "4", + "uptimeScoreWithFamilyMultiplier": "4.8", + "family": [ + "D40ACFCA44CAFB6DEE053F0CB18CD40D1232C780", + "8E1A82EDB2CFE72E765C98F1FE810539F8B8FC1A" + ] + }, + { + "address": "0xCd5D478686c6fA5E47Fc457F16E04224cD012690", + "fingerprint": "80091027A368B886658AA0A89A75FBDE0BF7A5BC", + "score": "28", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "30.8", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "BE1F76841DB89C3D34FE9235BC8594E109951960" + ] + }, + { + "address": "0x79E85c7Aa3C289021048B598Be347e3F5CF1F3B7", + "fingerprint": "5F4B3CCFBF1CE7268DE704E817B6D887C8E84AA5", + "score": "20000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "20000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x54a1354F615D464F7739d515598DB4e6315Ddc4B", + "fingerprint": "51DA31A6EC1B33AA087BCE11B169178547BF470F", + "score": "35", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "42", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "1A82EB4EB4768102F706FD2A6ED466D068CE3F9E", + "B838FEA01718A56EFA36B4547BACB3406871F017" + ] + }, + { + "address": "0x6c8C7a143792eDC723A2eA27B1c3f2235882189d", + "fingerprint": "8129FD4C085A9F9BDEE1330BD32CE2B8B14DC8A2", + "score": "14000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "14000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x898A9Eb0f6e49c8f5D33E678dd4bEfDCff77552A", + "fingerprint": "B43EB281C8D96C035A395A0D215CC1C2EF5B8D46", + "score": "190", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "190", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x9454d413886A3737c06b10dE11360669C56D5f24", + "fingerprint": "D87507E1F107F84FDE784EEF17E6F610EB2176A1", + "score": "760", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "760", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x4f485910CC79F27D85591b65e42d890136F3fdE3", + "fingerprint": "472675903E7266492985C8F2331DFE91D5064904", + "score": "9", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "9", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x54a1354F615D464F7739d515598DB4e6315Ddc4B", + "fingerprint": "B838FEA01718A56EFA36B4547BACB3406871F017", + "score": "11000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "13200", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "51DA31A6EC1B33AA087BCE11B169178547BF470F", + "1A82EB4EB4768102F706FD2A6ED466D068CE3F9E" + ] + }, + { + "address": "0xF41A5f015C90Aa260A5F501Ba09e8d00495B6221", + "fingerprint": "A456F6D86F812024FCD50E0C3005AE02F3080897", + "score": "6", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "6", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x42a9CF0F0F8cF73F1bc34A62e934f244bC00fE35", + "fingerprint": "D26B9006B579F8914C70EBDFD1C876E864386970", + "score": "160", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "160", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x3d1123CCd5E035d5009Abf16870e0877fdFA7e3E", + "fingerprint": "5CA07B48E4BD11F78DD5A795FA0ADBD382A85FB5", + "score": "0", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "0", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x3b9089785C4e941342cf348BC160caDb7D90f2Dc", + "fingerprint": "A9231EA60B8A9EC29B85B02D2C38397338F80097", + "score": "25", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "25", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x1DfC09e0Aef1d576edfa4fFD71FC4cAeaC911d4E", + "fingerprint": "BC14319205C5BDF45282C830E0CEB6B3C53D62B1", + "score": "63000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "63000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x8484D2156b0E9C6ea1D9c149579fE9738efb9118", + "fingerprint": "6DB809941E8156AA78DBCB87C114B9C68CC79BE2", + "score": "13", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "13", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xdA0955B495f3F181c282f5D1b05168706EaF0455", + "fingerprint": "2BBD14694BD7FBDCB3F5C7A79526CE687FBC3F92", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x0a14181c3845c0C4eE574C2564B01affA400242F", + "fingerprint": "893A110668CEE347DE6F54705A300488EBCF4B5A", + "score": "33000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "36300", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "BB05DF5D23D225F1B9ED82796D8194257706B2E5" + ] + }, + { + "address": "0xF955c822D7151Bf32362aF5cc8f3f283871D3465", + "fingerprint": "8691B128DB758DA9D625648597B30D828C298AD1", + "score": "20", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "20", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xaF044B784D6f7CB3D3d0938f568dE1F3E05E8145", + "fingerprint": "94C674BD456A41E48BB147E8F3C4A2A9462D7AD6", + "score": "10", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "10", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xdB13f6F9BccF5ac30378Ea6DfBCA45eec35AfA33", + "fingerprint": "0C7C783A1B8CA59C6E7336F0CA3686DC20E7C8DC", + "score": "220", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "220", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x7f34907d02CC0CCd334ee76044da10e7388FDc53", + "fingerprint": "1119479099A2CB33CEF47DE40986ED79D8BC9065", + "score": "450", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "450", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xdF60b603671bd2d2F014fd4e4d6a3657823Df567", + "fingerprint": "E097F5F0D539E69BCF8AAFBD0F333AB1D4FB70C0", + "score": "24", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "26.4", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "3EDD864DC20CBF7CF971980696D08B082C93A33F" + ] + }, + { + "address": "0x493e5f463feB5B13259214E81cF229c5B28303EC", + "fingerprint": "F14F5730747ACC3F9E7F4D13EEE2059DAFED7CC9", + "score": "32000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "32000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x981F118EdbD9e360863dFA283f05200804825b1A", + "fingerprint": "83931E18F087E8848E9E90A555F588ABFA7B7FFF", + "score": "15000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "15000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x54a1354F615D464F7739d515598DB4e6315Ddc4B", + "fingerprint": "1A82EB4EB4768102F706FD2A6ED466D068CE3F9E", + "score": "25000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "30000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "51DA31A6EC1B33AA087BCE11B169178547BF470F", + "B838FEA01718A56EFA36B4547BACB3406871F017" + ] + }, + { + "address": "0xa2AA87bE9FaaE25F1aC6E6846eC9589b03625ce0", + "fingerprint": "25280148FEF4E800FD179082D9E23276C7199E9D", + "score": "56000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "61600", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "60CCE755BD6B7410C70A16B4204D13A986437FDA" + ] + }, + { + "address": "0x5B29f4E4918f5Dc436C8A12f807869aD063d0B3a", + "fingerprint": "7914ACDDAF064384DF9D13DF6209C376005E10DB", + "score": "22", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "22", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xFe1c9385784Db958057BCA11D8f59762Eb4d4D35", + "fingerprint": "71994F7E2A7B740424DB4356BC1D50B748C26568", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xDf548c35DBA62A1B0A5FB1E365E2539935487408", + "fingerprint": "C58BB1A08CC76E46F16101E7DE5D323AA3B34F6E", + "score": "6600", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "7920", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "76FFB75E358D50868E5D5042AF77BDC38C39C45A", + "3AB8AD860A2BD006840C48E71455C4742EFB8A3C" + ] + }, + { + "address": "0x4dCDb1BEa466136C287D1C522db829571F93b62f", + "fingerprint": "CF66C81AB64ACA1EC95E1F10B75721F4DE0AEE57", + "score": "27000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "27000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "11", + "uptimeScore": "2", + "uptimeScoreWithFamilyMultiplier": "2" + }, + { + "address": "0xeA7C91110cc49f97F74f7725BB5148aC9CE7dF51", + "fingerprint": "B7B9943D39D291E92D9362A1B4BE13871BF3F80E", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0xE2f4b4106C227613DAf4116881811c1745d2cd0f", + "fingerprint": "065624A930062AB264E96CD524BD9F5BAD339BA8", + "score": "20", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "20", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "3", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0x4e6585c9553842C448C5B9a6F2907E3AC2e87239", + "fingerprint": "09DC138DAEDD1CC461950E9FAA7779586E429974", + "score": "1200", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.1", + "familySize": "2", + "scoreWithFamilyMultiplier": "1320", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "DEE60B40AE194A1731FC5104C4825948EB60A9CF" + ] + }, + { + "address": "0x06032e6a223c791DaADf89e4ACf5415eC7384a3B", + "fingerprint": "64AC588E781DD8598C189E2B3E4E656A3BA86C39", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "54", + "uptimeScore": "4", + "uptimeScoreWithFamilyMultiplier": "4" + }, + { + "address": "0x818b13A69a72D02903d593844aEE5AF552Cc6Cd4", + "fingerprint": "AAE4C700E63F21FAAAA44C5E6851C4CF0581C215", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x8ce3456193Eabc7fa2Cd6f3660CA6eBf9f69E63b", + "fingerprint": "8BA51CF4D3F3140592A14088CBE49CB4EE38A415", + "score": "63000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "63000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "545", + "uptimeScore": "4", + "uptimeScoreWithFamilyMultiplier": "4" + }, + { + "address": "0x9D0caC8351BD51D5BC537bD62c0410a8DBc78B74", + "fingerprint": "F0CD20C309BEFF257A6A94B252C8C897C87EF91B", + "score": "28", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "33.6", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "414B00316959CF5478DF551A64E9A21BAEFF47E1", + "F987F6092D765D99B00BBFE1C6AC5F662FB1A941" + ] + }, + { + "address": "0x653aC1ED2E637a4f1cc61Ff5F039a8d806D3e272", + "fingerprint": "41DC8255F0EAB3E34265B243C177CA1E84947065", + "score": "14", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "14", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x41f171ffBfe44a3674bF9f30B47693b9bc62E9b7", + "fingerprint": "A30C4C285B182A5B8D6DE27E3F425835D21780A5", + "score": "110000", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "110000", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x9Cb10817CAe852C45D8D602097a76a932f6185E6", + "fingerprint": "AABC9B22A6A85F700B80EC3A6D140A08EC1590BB", + "score": "740", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1.2", + "familySize": "3", + "scoreWithFamilyMultiplier": "888", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0", + "family": [ + "192329D17E32F62C9C79D7386AC5B9890FDC9D0C", + "FEB46CD11650B98C5268F2196BBDBFA37291A4FC" + ] + }, + { + "address": "0x8D03A395CD9E68409967e4957D6B85ADaF288687", + "fingerprint": "372FA2A17AD589982CC41F7BDA0EDFD5488B24D1", + "score": "32", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "32", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x7B507FbbA9FC5d03d41e18D63a4633f68bb93136", + "fingerprint": "918CC33E7BE9685404288B05EB481BAA12528FD1", + "score": "13", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "13", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x2eF461FdBEcc607d0b0cA27106C683a8F64468A4", + "fingerprint": "98D05C6209E88A45E55AE1A9BF983BF2906AF54E", + "score": "3300", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "3300", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "1", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x8e8f2F0bcFab3a53b6d82e299C3d5f6397579e53", + "fingerprint": "E0611546A9ABC8A3BFF82D4EB035F972F93B6661", + "score": "4", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "4", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "2", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + }, + { + "address": "0x002Eb755BD82B99F052D2cCe67EA4ED10561E49c", + "fingerprint": "E009249FAB98FE52826642391DA33E125869C63F", + "score": "1", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "1", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "3", + "uptimeScore": "1", + "uptimeScoreWithFamilyMultiplier": "1" + }, + { + "address": "0x477E84277727279FB51E39cdB61642CC8d6B02BA", + "fingerprint": "E3299F9CC495E19C6B3C39D58B714D18DAB6DDCF", + "score": "22", + "hardware": false, + "hwScore": "0", + "familyMultiplier": "1", + "familySize": "1", + "scoreWithFamilyMultiplier": "22", + "hwScoreWithFamilyMultiplier": "0", + "uptime": "0", + "uptimeScore": "0", + "uptimeScoreWithFamilyMultiplier": "0" + } +] diff --git a/smartweave/test/spec/distribution.spec.ts b/smartweave/test/spec/distribution.spec.ts index 6e37c55..80482fa 100644 --- a/smartweave/test/spec/distribution.spec.ts +++ b/smartweave/test/spec/distribution.spec.ts @@ -15,11 +15,21 @@ import { VALID_BONUS_NAME_REQUIRED } from '../../src/contracts' import { ERROR_ONLY_OWNER, INVALID_INPUT } from '../../src/util' +import { + ADDRESS_REQUIRED, + DUPLICATE_FINGERPRINT, + ENABLED_REQUIRED, + FINGERPRINT_REQUIRED, + INVALID_ADDRESS, + INVALID_FINGERPRINT, + INVALID_FAMILY, + FAMILIES_REQUIRED +} from '../../src/common/errors' import { INVALID_FAMILY_MULTIPLIER_RATE, INVALID_LIMIT, - INVALID_MULTIPLIERS_INPUT, - INVALID_MULTIPLIER_VALUE + INVALID_QUALITY_BONUS_SETTINGS, + INVALID_UPTIMES } from '../../src/contracts/distribution' import TestScoresHWBonuses from '../e2e/data/scores_hw_bonuses.json' import TestResultsHWBonuses from '../e2e/data/results_hw_bonuses.json' @@ -28,16 +38,9 @@ import TestScoresFamilyMultiplier from '../e2e/data/scores_family_multipliers.json' import TestResultsFamilyMultiplier from '../e2e/data/results_family_multipliers.json' -import { - ADDRESS_REQUIRED, - DUPLICATE_FINGERPRINT, - ENABLED_REQUIRED, - FINGERPRINT_REQUIRED, - INVALID_ADDRESS, - INVALID_FINGERPRINT, - INVALID_FAMILY, - FAMILIES_REQUIRED -} from '../../src/common/errors' +import TestScoresQualityBonus from '../e2e/data/scores_quality_bonuses.json' +import TestResultsQualityBonus from '../e2e/data/results_quality_bonuses.json' + const OWNER = '0x1111111111111111111111111111111111111111' const ALICE = '0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa' @@ -47,6 +50,11 @@ const fingerprintB = 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB' const fingerprintC = 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC' const fingerprintD = 'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD' const DEFAULT_TOKENS_PER_SECOND = '1000' +const DEFAULT_QUALITY_BONUS_SETTINGS = { + [ 3]: 1, // NB: At least 3 days uptime => 1 point + [ 8]: 2, // NB: At least 8 days uptime => 2 points + [22]: 4 // NB: At least 22 days uptime => 4 points +} let initState: DistributionState function resetState() { @@ -62,6 +70,14 @@ function resetState() { enabled: false, tokensDistributedPerSecond: '0', fingerprints: [] + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + settings: { + uptime: {} + }, + uptime: {} } }, families: {}, @@ -730,13 +746,13 @@ describe('Distribution Contract', () => { it('Allows Owner to set hardware bonus token rate', () => { const tokensDistributedPerSecond = '200' const setHardwareBonusRate = createInteraction(OWNER, { - function: 'setTokenDistributionRate', + function: 'setHardwareBonusRate', tokensDistributedPerSecond }) const { state } = DistributionHandle(initState, setHardwareBonusRate) - expect(state.tokensDistributedPerSecond).to.equal( + expect(state.bonuses.hardware.tokensDistributedPerSecond).to.equal( tokensDistributedPerSecond ) }) @@ -937,6 +953,14 @@ describe('Distribution Contract', () => { enabled: true, tokensDistributedPerSecond: '100', fingerprints + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + settings: { + uptime: {} + }, + uptime: {} } } }, @@ -993,6 +1017,345 @@ describe('Distribution Contract', () => { ).to.throw(ERROR_ONLY_OWNER) }) }) + + describe('Quality Tiers', () => { + it('Allows Owner to set quality tier bonus token rate', () => { + const tokensDistributedPerSecond = '200' + const setQualityTierBonusRate = createInteraction(OWNER, { + function: 'setQualityTierBonusRate', + tokensDistributedPerSecond + }) + + const { state } = DistributionHandle(initState, setQualityTierBonusRate) + + expect(state.bonuses.quality.tokensDistributedPerSecond).to.equal( + tokensDistributedPerSecond + ) + }) + + it('Prevents non-owners from setting quality tier bonus token rate', () => { + const aliceSetQualityTierBonusRate = createInteraction(ALICE, { + function: 'setQualityTierBonusRate', + tokensDistributedPerSecond: '1000' + }) + + expect( + () => DistributionHandle(initState, aliceSetQualityTierBonusRate) + ).to.throw(ContractError, ERROR_ONLY_OWNER) + }) + + it('Validates when setting quality tier bonus token rate', () => { + const setMissingRate = createInteraction(OWNER, { + function: 'setQualityTierBonusRate' + }) + + expect( + () => DistributionHandle(initState, setMissingRate) + ).to.throw(ContractError, INVALID_DISTRIBUTION_AMOUNT) + + const negativeDistributionAmount = '-100' + const setNegativeDistributionAmount = createInteraction(OWNER, { + function: 'setQualityTierBonusRate', + tokensDistributedPerSecond: negativeDistributionAmount + }) + + expect( + () => DistributionHandle(initState, setNegativeDistributionAmount) + ).to.throw(ContractError, INVALID_DISTRIBUTION_AMOUNT) + + const numberDistributionAmount = 100 + const setNumberDistributionAmount = createInteraction(OWNER, { + function: 'setQualityTierBonusRate', + tokensDistributedPerSecond: numberDistributionAmount + }) + + expect( + () => DistributionHandle(initState, setNumberDistributionAmount) + ).to.throw(ContractError, INVALID_DISTRIBUTION_AMOUNT) + }) + + it('Allows Owner to toggle quality tier bonus', () => { + const enableQualityTierBonus = createInteraction(OWNER, { + function: 'toggleQualityTierBonus', + enabled: true + }) + const { state: firstState } = DistributionHandle( + { ...initState }, + enableQualityTierBonus + ) + expect(firstState.bonuses.quality.enabled).to.be.true + + const disableQualityTierBonus = createInteraction(OWNER, { + function: 'toggleQualityTierBonus', + enabled: false + }) + const { state: secondState } = DistributionHandle( + firstState, + disableQualityTierBonus + ) + expect(secondState.bonuses.quality.enabled).to.be.false + }) + + it('Prevents non-owners from toggling quality tier bonus', () => { + const aliceToggleQualityTierBonus = createInteraction(ALICE, { + function: 'toggleQualityTierBonus', + enabled: true + }) + + expect( + () => DistributionHandle(initState, aliceToggleQualityTierBonus) + ).to.throw(ContractError, ERROR_ONLY_OWNER) + }) + + it('Validates when toggling quality tier bonus', () => { + const undefinedToggle = createInteraction(OWNER, { + function: 'toggleQualityTierBonus' + }) + + expect( + () => DistributionHandle(initState, undefinedToggle) + ).to.throw(ENABLED_REQUIRED) + + const zeroToggle = createInteraction(OWNER, { + function: 'toggleQualityTierBonus', + enabled: 0 + }) + + expect( + () => DistributionHandle(initState, zeroToggle) + ).to.throw(ENABLED_REQUIRED) + + const positiveToggle = createInteraction(OWNER, { + function: 'toggleQualityTierBonus', + enabled: 12 + }) + + expect( + () => DistributionHandle(initState, positiveToggle) + ).to.throw(ENABLED_REQUIRED) + + const objectToggle = createInteraction(OWNER, { + function: 'toggleQualityTierBonus', + enabled: { enabled: true } + }) + + expect( + () => DistributionHandle(initState, objectToggle) + ).to.throw(ENABLED_REQUIRED) + + const stringToggle = createInteraction(OWNER, { + function: 'toggleQualityTierBonus', + enabled: 'true' + }) + + expect( + () => DistributionHandle(initState, stringToggle) + ).to.throw(ENABLED_REQUIRED) + }) + + it('Allows Owner to set quality tier bonus settings', () => { + const settings = { + uptime: { + [3]: 1, + [8]: 2, + [22]: 4 + } + } + const setQualityTierBonusSettings = createInteraction(OWNER, { + function: 'setQualityTierBonusSettings', + settings + }) + + const { state } = DistributionHandle( + initState, + setQualityTierBonusSettings + ) + + expect(state.bonuses.quality.settings).to.deep.equal(settings) + }) + + it('Prevents non-owners from setting quality tier bonus settings', () => { + const aliceSetQualityTierBonusSettings = createInteraction(ALICE, { + function: 'setQualityTierBonusSettings', + settings: { uptime: {} } + }) + + expect( + () => DistributionHandle(initState, aliceSetQualityTierBonusSettings) + ).to.throw(ContractError, ERROR_ONLY_OWNER) + }) + + it('Validates when setting quality tier bonus settings', () => { + const undefinedSettings = createInteraction(OWNER, { + function: 'setQualityTierBonusSettings' + }) + expect( + () => DistributionHandle(initState, undefinedSettings) + ).to.throw(INVALID_QUALITY_BONUS_SETTINGS) + + const nonObjectSettings = createInteraction(OWNER, { + function: 'setQualityTierBonusSettings', + settings: 12 + }) + expect( + () => DistributionHandle(initState, nonObjectSettings) + ).to.throw(INVALID_QUALITY_BONUS_SETTINGS) + + const undefinedUptimeSettings = createInteraction(OWNER, { + function: 'setQualityTierBonusSettings', + settings: {} + }) + expect( + () => DistributionHandle(initState, undefinedUptimeSettings) + ).to.throw(INVALID_QUALITY_BONUS_SETTINGS) + + const nonObjectUptimeSettings = createInteraction(OWNER, { + function: 'setQualityTierBonusSettings', + settings: { + uptime: 12 + } + }) + expect( + () => DistributionHandle(initState, nonObjectUptimeSettings) + ).to.throw(INVALID_QUALITY_BONUS_SETTINGS) + + const stringKeyQualityUptimeSettings = createInteraction(OWNER, { + function: 'setQualityTierBonusSettings', + settings: { + uptime: { + ['one']: 'two' + } + } + }) + expect( + () => DistributionHandle(initState, stringKeyQualityUptimeSettings) + ).to.throw(INVALID_QUALITY_BONUS_SETTINGS) + + const nonNumericQualityPointsUptimeSettings = createInteraction(OWNER, { + function: 'setQualityTierBonusSettings', + settings: { + uptime: { + [1]: 'one' + } + } + }) + expect( + () => DistributionHandle( + initState, + nonNumericQualityPointsUptimeSettings + ) + ).to.throw(INVALID_QUALITY_BONUS_SETTINGS) + + const negativeQualityPointsUptimeSettings = createInteraction(OWNER, { + function: 'setQualityTierBonusSettings', + settings: { + uptime: { + [1]: -2 + } + } + }) + expect( + () => DistributionHandle( + initState, + negativeQualityPointsUptimeSettings + ) + ).to.throw(INVALID_QUALITY_BONUS_SETTINGS) + }) + + it('Allows Owner to set quality tier batch data', () => { + const uptimes = { + [fingerprintA]: 1, + [fingerprintB]: 0, + [fingerprintC]: 26, + [fingerprintD]: 4 + } + const setQualityTierUptimes = createInteraction(OWNER, { + function: 'setQualityTierUptimes', + uptimes + }) + + const { state } = DistributionHandle(initState, setQualityTierUptimes) + + expect(state.bonuses.quality.uptime).to.deep.equal(uptimes) + }) + + it('Prevents non-owners from setting quality tier batch data', () => { + const aliceSetQualityTierUptimes = createInteraction(ALICE, { + function: 'setQualityTierUptimes', + uptimes: { + [fingerprintA]: 1, + [fingerprintB]: 0, + [fingerprintC]: 26, + [fingerprintD]: 4 + } + }) + + expect( + () => DistributionHandle(initState, aliceSetQualityTierUptimes) + ).to.throw(ContractError, ERROR_ONLY_OWNER) + }) + + it('Validates when setting quality tier batch data', () => { + const undefinedUptimes = createInteraction(OWNER, { + function: 'setQualityTierUptimes' + }) + expect( + () => DistributionHandle(initState, undefinedUptimes) + ).to.throw(INVALID_UPTIMES) + + const nonObjectUptimes = createInteraction(OWNER, { + function: 'setQualityTierUptimes', + uptimes: 'uptimes' + }) + expect( + () => DistributionHandle(initState, nonObjectUptimes) + ).to.throw(INVALID_UPTIMES) + + const invalidFingerprintUptimes = createInteraction(OWNER, { + function: 'setQualityTierUptimes', + uptimes: { + [fingerprintA]: 5, + ['invalid-fingerprint']: 2 + } + }) + expect( + () => DistributionHandle(initState, invalidFingerprintUptimes) + ).to.throw(INVALID_FINGERPRINT) + + const nonNumericUptimeUptimes = createInteraction(OWNER, { + function: 'setQualityTierUptimes', + uptimes: { + [fingerprintA]: 5, + [fingerprintB]: '4' + } + }) + expect( + () => DistributionHandle(initState, nonNumericUptimeUptimes) + ).to.throw(INVALID_UPTIMES) + + const nonIntegerUptimeUptimes = createInteraction(OWNER, { + function: 'setQualityTierUptimes', + uptimes: { + [fingerprintA]: 5, + [fingerprintB]: 3.4 + } + }) + expect( + () => DistributionHandle(initState, nonIntegerUptimeUptimes) + ).to.throw(INVALID_UPTIMES) + + const negativeUptimeUptimes = createInteraction(OWNER, { + function: 'setQualityTierUptimes', + uptimes: { + [fingerprintA]: 5, + [fingerprintB]: -3 + } + }) + expect( + () => DistributionHandle(initState, negativeUptimeUptimes) + ).to.throw(INVALID_UPTIMES) + }) + }) }) describe('Distributing', () => { @@ -1026,6 +1389,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '1000', @@ -1227,6 +1600,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '1000', @@ -1252,6 +1635,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: DEFAULT_TOKENS_PER_SECOND, @@ -1261,7 +1654,8 @@ describe('Distribution Contract', () => { 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA': { address: '0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa', bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '1000', multipliers: { @@ -1401,6 +1795,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '1000', @@ -1426,6 +1830,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: DEFAULT_TOKENS_PER_SECOND, @@ -1435,7 +1849,8 @@ describe('Distribution Contract', () => { [fingerprintA]: { address: ALICE, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '196', multipliers: { @@ -1447,7 +1862,8 @@ describe('Distribution Contract', () => { [fingerprintB]: { address: BOB, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '3510', multipliers: { @@ -1459,7 +1875,8 @@ describe('Distribution Contract', () => { [fingerprintC]: { address: ALICE, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '1724', multipliers: { @@ -1488,6 +1905,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: DEFAULT_TOKENS_PER_SECOND, @@ -1497,7 +1924,8 @@ describe('Distribution Contract', () => { [fingerprintA]: { address: ALICE, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '2688', multipliers: { @@ -1509,7 +1937,8 @@ describe('Distribution Contract', () => { [fingerprintB]: { address: BOB, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '60084', multipliers: { @@ -1521,7 +1950,8 @@ describe('Distribution Contract', () => { [fingerprintC]: { address: ALICE, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '23627', multipliers: { @@ -1602,6 +2032,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '4333', @@ -1628,6 +2068,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '4333', @@ -1637,7 +2087,8 @@ describe('Distribution Contract', () => { [fingerprintA]: { address: ALICE, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '69', multipliers: { @@ -1649,7 +2100,8 @@ describe('Distribution Contract', () => { [fingerprintB]: { address: BOB, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '1240', multipliers: { @@ -1661,7 +2113,8 @@ describe('Distribution Contract', () => { [fingerprintC]: { address: ALICE, bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, distributedTokens: '609', multipliers: { @@ -1703,6 +2156,14 @@ describe('Distribution Contract', () => { fingerprints: TestScoresHWBonuses .filter(({ hardware }) => !!hardware) .map(({ fingerprint }) => fingerprint) + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + settings: { + uptime: {} + }, + uptime: {} } }, pendingDistributions: { @@ -1726,6 +2187,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '0', @@ -1773,6 +2244,14 @@ describe('Distribution Contract', () => { fingerprints: TestScoresHWBonuses .filter(({ hardware }) => !!hardware) .map(({ fingerprint }) => fingerprint) + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + settings: { + uptime: {} + }, + uptime: {} } }, pendingDistributions: { @@ -1796,6 +2275,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '0', @@ -1844,6 +2333,14 @@ describe('Distribution Contract', () => { fingerprints: TestScoresFamilyMultiplier .filter(({ hardware }) => !!hardware) .map(({ fingerprint }) => fingerprint) + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + settings: { + uptime: {} + }, + uptime: {} } }, multipliers: { @@ -1873,6 +2370,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '0', @@ -1900,6 +2407,105 @@ describe('Distribution Contract', () => { ) expect(state.claimable).to.deep.equal(rewards) }) + + it('Applies quality tier bonus when enabled', () => { + const elapsed = 86400 + const timestamp = Date.now() + const previousTimestamp = (timestamp - elapsed).toString() + + const distribute = createInteraction(OWNER, { + function: 'distribute', + timestamp: timestamp.toString() + }) + + const { state } = DistributionHandle( + { + ...initState, + tokensDistributedPerSecond: '1000', + families: TestFamilies, + bonuses: { + hardware: { + enabled: true, + tokensDistributedPerSecond: '500', + fingerprints: TestScoresQualityBonus + .filter(({ hardware }) => !!hardware) + .map(({ fingerprint }) => fingerprint) + }, + quality: { + enabled: true, + tokensDistributedPerSecond: '250', + settings: { + uptime: DEFAULT_QUALITY_BONUS_SETTINGS + }, + uptime: Object.fromEntries( + TestScoresQualityBonus.map(({ fingerprint, uptime }) => { + let parsedUptime = Number.parseInt(uptime) + if (Number.isNaN(parsedUptime)) { + parsedUptime = 0 + } + + return [ fingerprint, parsedUptime ] + }) + ) + } + }, + pendingDistributions: { + [timestamp]: { + scores: TestScoresQualityBonus + .map( + ({ score, address, fingerprint }) => + ({ score, address, fingerprint }) + ) + } + }, + previousDistributions: { + [previousTimestamp]: { + timeElapsed: '0', + tokensDistributedPerSecond: '0', + baseNetworkScore: '0', + baseDistributedTokens: '0', + bonuses: { + hardware: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} + } + }, + totalTokensDistributedPerSecond: '0', + totalNetworkScore: '0', + totalDistributedTokens: '0', + details: {}, + families: TestFamilies, + multipliers: { + family: { + enabled: false, + familyMultiplierRate: '0' + } + } + } + } + }, + distribute + ) + + const rewards = Object.fromEntries( + TestResultsQualityBonus.rewards.map( + ({ address, totalReward }) => [ address, totalReward ] + ) + ) + expect(state.claimable).to.deep.equal(rewards) + }) }) describe('Claiming', () => { @@ -2102,18 +2708,36 @@ describe('Distribution Contract', () => { { ...initState, tokensDistributedPerSecond: '1000', + families: TestFamilies, bonuses: { hardware: { enabled: true, tokensDistributedPerSecond: '500', - fingerprints: TestScoresHWBonuses + fingerprints: TestScoresQualityBonus .filter(({ hardware }) => !!hardware) .map(({ fingerprint }) => fingerprint) + }, + quality: { + enabled: true, + tokensDistributedPerSecond: '250', + settings: { + uptime: DEFAULT_QUALITY_BONUS_SETTINGS + }, + uptime: Object.fromEntries( + TestScoresQualityBonus.map(({ fingerprint, uptime }) => { + let parsedUptime = Number.parseInt(uptime) + if (Number.isNaN(parsedUptime)) { + parsedUptime = 0 + } + + return [ fingerprint, parsedUptime ] + }) + ) } }, pendingDistributions: { [timestamp]: { - scores: TestScoresHWBonuses + scores: TestScoresQualityBonus .map( ({ score, address, fingerprint }) => ({ score, address, fingerprint }) @@ -2132,6 +2756,16 @@ describe('Distribution Contract', () => { tokensDistributedPerSecond: '0', networkScore: '0', distributedTokens: '0' + }, + quality: { + enabled: false, + tokensDistributedPerSecond: '0', + networkScore: '0', + distributedTokens: '0', + settings: { + uptime: {} + }, + uptime: {} } }, totalTokensDistributedPerSecond: '0', @@ -2152,35 +2786,48 @@ describe('Distribution Contract', () => { ) const distribution = state.previousDistributions[timestamp] + expect(distribution.timeElapsed).to.equal(elapsed.toString()) + expect(distribution.tokensDistributedPerSecond).to.equal('1000') expect(distribution.baseNetworkScore) - .to.equal(TestResultsHWBonuses.baseNetworkScore) + .to.equal(TestResultsQualityBonus.baseNetworkScore) expect(distribution.baseDistributedTokens) - .to.equal(TestResultsHWBonuses.baseActualDistributedTokens) + .to.equal(TestResultsQualityBonus.baseActualDistributedTokens) + expect(distribution.bonuses.hardware.enabled).to.be.true expect(distribution.bonuses.hardware.tokensDistributedPerSecond) .to.equal('500') expect(distribution.bonuses.hardware.networkScore) - .to.equal(TestResultsHWBonuses.hwBonusNetworkScore) + .to.equal(TestResultsQualityBonus.hwBonusNetworkScore) expect(distribution.bonuses.hardware.distributedTokens) - .to.equal(TestResultsHWBonuses.hwBonusActualDistributedTokens) - expect(distribution.totalTokensDistributedPerSecond).to.equal('1500') + .to.equal(TestResultsQualityBonus.hwBonusActualDistributedTokens) + + expect(distribution.bonuses.quality.enabled).to.be.true + expect(distribution.bonuses.quality.tokensDistributedPerSecond) + .to.equal('250') + expect(distribution.bonuses.quality.networkScore) + .to.equal(TestResultsQualityBonus.qualityBonusNetworkScore) + expect(distribution.bonuses.quality.distributedTokens) + .to.equal(TestResultsQualityBonus.qualityBonusActualDistributedTokens) + + expect(distribution.totalTokensDistributedPerSecond).to.equal('1750') expect(distribution.totalNetworkScore) - .to.equal(TestResultsHWBonuses.totalNetworkScore) + .to.equal(TestResultsQualityBonus.totalNetworkScore) expect(distribution.totalDistributedTokens) - .to.equal(TestResultsHWBonuses.totalActualDistributedTokens) + .to.equal(TestResultsQualityBonus.totalActualDistributedTokens) - // NB: Spot-check an address that has two relays, one being a hw relay + // NB: Spot-check an address that has a family, hw relay, quality bonus const address = '0xa2AA87bE9FaaE25F1aC6E6846eC9589b03625ce0' const fingerprint1 = '60CCE755BD6B7410C70A16B4204D13A986437FDA' const fingerprint2 = '25280148FEF4E800FD179082D9E23276C7199E9D' expect(distribution.details[fingerprint1]).to.deep.equal({ address, score: '53000', - distributedTokens: '8355', + distributedTokens: '8881', bonuses: { - hardware: '5802' + hardware: '5802', + quality: '526' }, multipliers: { family: '1', @@ -2192,7 +2839,8 @@ describe('Distribution Contract', () => { score: '56000', distributedTokens: '2697', bonuses: { - hardware: '0' + hardware: '0', + quality: '0' }, multipliers: { family: '1',