ponsholdx

weight

the seat, the curve, and the three moves, with the arithmetic in the open.

the curve

g(τ) = 1 + 7 × (1 − 2^(−τ / 604800))

τ is tenure in seconds. 604800 seconds is seven days, the half tenure. the multiplier is one at zero, four and a half at seven days, and approaches eight.

87d14d21d28d
tenuremultiplier
01.0000
1 hour1.0288
12 hours1.3381
1 day1.6599
2 days2.2577
3 days2.7990
5 days3.7335
7 days4.5000
10 days5.3995
14 days6.2500
21 days7.1250
28 days7.5625
56 days7.9727
computed from the formula on this page, not read from anywhere.

the seat

a seat is a timestamp. it is the mean time at which the tokens in a wallet were acquired, weighted by how many arrived at each time. it lives in the token contract and moves on every balance change, inside the transfer itself, so there is no separate claim, stake, or register step and nothing to forget to do.

when tokens come in from anywhere except the contract, the new seat is the old balance times the old seat plus the new quantity times now, divided by the new balance. new tokens are born with no age and they dilute the old. when tokens come in from the contract, which only happens when a round pays, the seat does not move at all.

when tokens go out for any reason, the wallet's remaining age is multiplied by one minus twice the fraction that left, floored at zero, and the seat is set to now minus that age. a tenth out is a fifth of the age gone. a quarter out is half. half out is all of it. the rule is deliberately harsher than proportional so that trimming a bag is never free.

three worked moves

selling

start: 1000 tokens, tenure ten days.
movetenure aftermultiplier after
sells 1008.0d4.8300×
sells 2505.0d3.7335×
sells 5000s1.0000×

buying more

start: 1000 tokens, tenure ten days.
movetenure aftermultiplier after
buys 1000 more5.0d3.7335×
buys 250 more8.0d4.8300×

being paid

start: 1000 tokens, tenure ten days.
movetenure aftermultiplier after
paid 40 by the contract10.0d5.3995×
examples of the rules applied to a made up starting bag. they are arithmetic, not readings.

weight and share

w = balance × g(τ)share = w / Σwpaid = share × bought

weight is what a round splits by. a wallet's share is its weight over the sum of every weight in the set at the close. the round pays that share of the tokens it bought, after the quarter percent set aside for the sweepers. nothing is rounded in the wallet's favour; whatever is left after integer division is dust and carries into the next round.

the checkpoint

every balance change pushes a checkpoint onto the wallet's list: the block time, the balance after, and the seat after, packed into one storage word. the sweep never reads a live balance. it asks each wallet's list for the entry in force at the close time, by binary search, so a transfer during the sweep changes the next round and not this one.

t, uint64seat, uint64balance, uint96unused
one checkpoint, one storage word