mirror of
https://github.com/aljazceru/hypergolic.git
synced 2025-12-23 00:04:25 +01:00
110 lines
3.2 KiB
Svelte
110 lines
3.2 KiB
Svelte
<script lang="ts">
|
|
import * as Card from '@/components/ui/card';
|
|
import * as Table from '@/components/ui/table';
|
|
import { Rocket } from '@/event_helpers/rockets';
|
|
import { writable } from 'svelte/store';
|
|
import Pie from './Pie.svelte';
|
|
import { Avatar, Name } from '@nostr-dev-kit/ndk-svelte-components';
|
|
import { ndk } from '@/ndk';
|
|
|
|
export let rocket: Rocket;
|
|
export let unratifiedZaps: Map<string, number>;
|
|
|
|
let unratifiedZapsAmount = 0;
|
|
|
|
$: {
|
|
unratifiedZapsAmount = 0;
|
|
for (let [_, a] of unratifiedZaps) {
|
|
unratifiedZapsAmount += a / 1000;
|
|
}
|
|
unratifiedZapsAmount = unratifiedZapsAmount;
|
|
}
|
|
let _merits: { pubkey: string; merits: number; sats: number }[] = [];
|
|
|
|
let merits = writable(_merits);
|
|
|
|
$: {
|
|
let m = new Map<string, { merits: number; sats: number }>();
|
|
for (let [_, amr] of rocket.ApprovedMeritRequests()) {
|
|
let existing = m.get(amr.Pubkey);
|
|
if (!existing) {
|
|
existing = { merits: 0, sats: 0 };
|
|
}
|
|
existing.merits += amr.Merits;
|
|
existing.sats += amr.SatsOwed();
|
|
m.set(amr.Pubkey, existing);
|
|
}
|
|
|
|
//calculate percentage ownership of each pubkey and divide the unratified sats among them (round up to nearest sat):
|
|
let satsPerMeritPercentage = unratifiedZapsAmount / 100;
|
|
let totalMerits = rocket.TotalMerits();
|
|
for (let [id, _m] of m) {
|
|
_m.sats += (_m.merits / totalMerits) * 100 * satsPerMeritPercentage;
|
|
_m.sats = Math.round(_m.sats);
|
|
m.set(id, _m);
|
|
}
|
|
|
|
let _merits: { pubkey: string; merits: number; sats: number }[] = [];
|
|
for (let [pubkey, _m] of m) {
|
|
_merits.push({ pubkey: pubkey, merits: _m.merits, sats: _m.sats });
|
|
}
|
|
if (_merits.length == 0) {
|
|
_merits.push({ pubkey: rocket.Event.pubkey, merits: 1, sats: 0 });
|
|
}
|
|
|
|
merits.set(_merits);
|
|
}
|
|
|
|
const COLORS = ['bg-pink-800', 'bg-red-800', 'bg-purple-800', 'bg-blue-800'];
|
|
|
|
function c(i: number) {
|
|
return COLORS[i];
|
|
}
|
|
</script>
|
|
|
|
<Card.Root class="sm:col-span-3">
|
|
<Card.Header class="pb-3">
|
|
<Card.Title>Merits and Satflow</Card.Title>
|
|
<Card.Description class="grid grid-cols-2">
|
|
<div class=" grid-cols-1">
|
|
This graph displays the Meritization of equity in {rocket.Name()}
|
|
<Pie data={$merits} />
|
|
</div>
|
|
<div class=" grid-cols-1">
|
|
<Table.Root>
|
|
<Table.Header>
|
|
<Table.Row class="">
|
|
<Table.Head>Participant</Table.Head>
|
|
<Table.Head class="hidden md:table-cell">Merits</Table.Head>
|
|
<Table.Head class="text-right">Revenue (Sats)</Table.Head>
|
|
</Table.Row>
|
|
</Table.Header>
|
|
<Table.Body>
|
|
{#each $merits as { pubkey, merits, sats }, i (pubkey)}
|
|
<Table.Row class="{c(i)} hover:{c(i)}">
|
|
<Table.Cell>
|
|
<div class="flex flex-nowrap">
|
|
<Avatar
|
|
ndk={$ndk}
|
|
{pubkey}
|
|
class="h-8 w-8 flex-none rounded-full object-cover"
|
|
/>
|
|
<Name
|
|
ndk={$ndk}
|
|
{pubkey}
|
|
class="hidden max-w-32 truncate p-1 md:inline-block"
|
|
/>
|
|
</div>
|
|
</Table.Cell>
|
|
<Table.Cell class="hidden md:table-cell">{merits}</Table.Cell>
|
|
<Table.Cell class="text-right">{sats}</Table.Cell>
|
|
</Table.Row>
|
|
{/each}
|
|
</Table.Body>
|
|
</Table.Root>
|
|
</div>
|
|
</Card.Description>
|
|
</Card.Header>
|
|
<Card.Footer></Card.Footer>
|
|
</Card.Root>
|