View-fraud protection + real ad placement surfaces

Earning views now run on single-use server-issued tokens: the view only
counts when the full dwell elapses on the server clock; instant, forged,
replayed, and stale posts are all rejected, and the client countdown
pauses whenever the tab loses visibility or focus. New placements: login
ads on the sign-in screen (the per-day format's real home), a banner slot
in the back-office Overview, a text slot in the member sidebar, and a
member-ads banner on the homepage. Assets v=20260905g.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-09-05 06:15:27 -05:00
parent 7331eac244
commit 28ed925443
7 changed files with 79 additions and 27 deletions
+8 -5
View File
@@ -4,7 +4,7 @@
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Member area | InstantAdPay</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css?v=20260905f">
<link rel="stylesheet" href="/assets/site.css?v=20260905g">
</head>
<body class="bo-body">
@@ -44,6 +44,7 @@
<p class="small muted">Crypto-native? You can also <a href="#" id="walletSigninLink">sign in with just your wallet</a>.
One free signature, no email needed.</p>
<p class="small muted"><a href="/">← Back to the site</a></p>
<div class="card" id="adSlotLogin" hidden></div>
</div>
</div>
@@ -60,6 +61,7 @@
<button data-pane="earnings" type="button"><svg viewBox="0 0 24 24"><path d="M4 17l5-5 4 3 7-8"/><path d="M14 7h6v6"/></svg>Earnings</button>
<button data-pane="wallet" type="button"><svg viewBox="0 0 24 24"><rect x="3" y="6" width="18" height="13" rx="2"/><path d="M3 10h18"/><circle cx="16.5" cy="14.5" r="1.4"/></svg>Wallet</button>
</nav>
<div class="bo-links" id="adSlotSide" hidden style="border-top:1px solid var(--line)"></div>
<div class="bo-links">
<span class="bo-cap">Site</span>
<a href="/">Ad packages</a>
@@ -116,6 +118,7 @@
<p id="qualLine" class="muted small">…</p></div>
</div>
</div>
<div class="card" id="adSlotOverview" hidden></div>
</div>
<div class="pane" id="pane-line" hidden>
@@ -250,9 +253,9 @@
</div>
</div>
<script src="/assets/common.js?v=20260905f"></script>
<script src="/assets/wallet.js?v=20260905f"></script>
<script src="/assets/my.js?v=20260905f"></script>
<script src="/assets/chat.js?v=20260905f"></script>
<script src="/assets/common.js?v=20260905g"></script>
<script src="/assets/wallet.js?v=20260905g"></script>
<script src="/assets/my.js?v=20260905g"></script>
<script src="/assets/chat.js?v=20260905g"></script>
</body>
</html>