mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-06-06 14:23:56 +02:00
106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
"""Sprint 2 — common rep base formula (Sprint 3 layers anti-gaming).
|
||
|
||
The formula in Sprint 2 is just ``base_rep = oracle_rep(upreper) *
|
||
weight_factor``. VCS / clustering / temporal multipliers ship in Sprint 3.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from services.infonet.reputation import compute_common_rep
|
||
from services.infonet.tests._chain_factory import make_event, make_market_chain
|
||
|
||
|
||
def test_no_uprep_means_no_common_rep():
|
||
chain = make_market_chain(
|
||
"m1", "creator", outcome="yes",
|
||
predictions=[{"node_id": "alice", "side": "yes", "probability_at_bet": 30.0}],
|
||
)
|
||
assert compute_common_rep("alice", chain) == 0.0
|
||
|
||
|
||
def test_uprep_from_zero_oracle_rep_yields_zero_common_rep():
|
||
"""Plan §3.2: rep is oracle-weighted. A node with no oracle rep
|
||
cannot mint common rep through upreps."""
|
||
chain = [
|
||
make_event("uprep", "newbie", {"target_node_id": "alice", "target_event_id": "post1"},
|
||
timestamp=1.0, sequence=1),
|
||
]
|
||
assert compute_common_rep("alice", chain) == 0.0
|
||
|
||
|
||
def test_uprep_from_oracle_holder_mints_common_rep():
|
||
base = 1_000_000.0
|
||
chain = make_market_chain(
|
||
"m1", "creator", outcome="yes",
|
||
predictions=[
|
||
{"node_id": "ora", "side": "yes", "stake_amount": 10.0},
|
||
{"node_id": "loser", "side": "no", "stake_amount": 10.0},
|
||
],
|
||
base_ts=base,
|
||
participants=5, total_stake=20.0,
|
||
)
|
||
chain.append(make_event(
|
||
"uprep", "ora", {"target_node_id": "alice", "target_event_id": "post1"},
|
||
timestamp=base + 10_000, sequence=99,
|
||
))
|
||
# ora has 20 oracle rep, weight factor 0.1 → 2.0 common rep for alice.
|
||
assert compute_common_rep("alice", chain) == 2.0
|
||
|
||
|
||
def test_self_uprep_is_ignored():
|
||
base = 1_000_000.0
|
||
chain = make_market_chain(
|
||
"m1", "creator", outcome="yes",
|
||
predictions=[
|
||
{"node_id": "alice", "side": "yes", "stake_amount": 10.0},
|
||
{"node_id": "loser", "side": "no", "stake_amount": 10.0},
|
||
],
|
||
base_ts=base,
|
||
participants=5, total_stake=20.0,
|
||
)
|
||
chain.append(make_event(
|
||
"uprep", "alice", {"target_node_id": "alice", "target_event_id": "post1"},
|
||
timestamp=base + 10_000, sequence=99,
|
||
))
|
||
# Self-uprep silently ignored.
|
||
assert compute_common_rep("alice", chain) == 0.0
|
||
|
||
|
||
def test_multiple_upreps_accumulate():
|
||
base = 1_000_000.0
|
||
chain = make_market_chain(
|
||
"m1", "creator", outcome="yes",
|
||
predictions=[
|
||
{"node_id": "ora", "side": "yes", "stake_amount": 10.0},
|
||
{"node_id": "loser", "side": "no", "stake_amount": 10.0},
|
||
],
|
||
base_ts=base,
|
||
participants=5, total_stake=20.0,
|
||
)
|
||
for i in range(3):
|
||
chain.append(make_event(
|
||
"uprep", "ora",
|
||
{"target_node_id": "alice", "target_event_id": f"post{i}"},
|
||
timestamp=base + 10_000 + i, sequence=100 + i,
|
||
))
|
||
# 3 upreps × 20 oracle rep × 0.1 = 6.0
|
||
assert compute_common_rep("alice", chain) == 6.0
|
||
|
||
|
||
def test_weight_factor_override():
|
||
base = 1_000_000.0
|
||
chain = make_market_chain(
|
||
"m1", "creator", outcome="yes",
|
||
predictions=[
|
||
{"node_id": "ora", "side": "yes", "stake_amount": 10.0},
|
||
{"node_id": "loser", "side": "no", "stake_amount": 10.0},
|
||
],
|
||
base_ts=base,
|
||
participants=5, total_stake=20.0,
|
||
)
|
||
chain.append(make_event(
|
||
"uprep", "ora", {"target_node_id": "alice", "target_event_id": "post1"},
|
||
timestamp=base + 10_000, sequence=99,
|
||
))
|
||
assert compute_common_rep("alice", chain, weight_factor=0.5) == 10.0
|