Contract verification page, cache-busted assets, no-withdrawal line

/contract: plain-language security review with the six design laws, honest
operator CAN/CANNOT lists, split walkthrough, oracle bridge and anti-stall
notes, testing summary, live explorer + Sourcify verified-source links
(config-driven so it follows the mainnet flip). Nav gains The contract.
All asset URLs now carry a version query so deploys bust browser caches
(the level-cycler stall). Earn-deeper checklist leads with: no withdrawal
requests, ever.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-09-04 13:47:49 -05:00
parent 08f7a408e3
commit 9dc5989aa3
7 changed files with 162 additions and 11 deletions
+1
View File
@@ -32,6 +32,7 @@ window.IAP = (function () {
+ '<a href="/" data-p="home">How it works</a>'
+ '<a href="/#ladder" data-p="pricing">Ad packages</a>'
+ '<a href="/ledger" data-p="ledger">Live ledger</a>'
+ '<a href="/contract" data-p="contract">The contract</a>'
+ '<a href="/my" data-p="my">Members</a>'
+ '</span><span id="navWallet" class="muted">…</span></div>';
document.body.prepend(nav);
+13
View File
@@ -0,0 +1,13 @@
// Contract page: inject live address, chain, explorer + verified-source links.
(async function () {
await IAP.renderNav('contract');
const c = await IAP.getConfig();
const $ = IAP.$;
$('cAddr').textContent = c.contract.slice(0, 10) + '…' + c.contract.slice(-6);
$('cChain').textContent = c.chainName;
$('mockAddr').textContent = c.contract.slice(0, 18) + '…';
$('lnkExplorer').href = c.explorer + '/address/' + c.contract + '#code';
const src = 'https://repo.sourcify.dev/contracts/full_match/' + c.chainId + '/' + c.contract + '/';
$('lnkSource').href = src;
$('lnkSource2').href = src;
})();
+135
View File
@@ -0,0 +1,135 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>The contract | InstantAdPay</title>
<meta name="description" content="Plain-language review of the InstantAdPay settlement contract: what it does, what nobody can change, what the operator can and cannot touch, and how to verify all of it yourself.">
<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=20260904f">
</head>
<body>
<div class="wrap">
<section class="hero" style="padding-bottom:24px">
<h1>The contract, <em>in plain language</em>.</h1>
<p class="lead">Every dollar on this platform moves through one smart contract. This page explains
what it does, what nobody can change, and exactly what powers we kept. Verify every claim
yourself. That is the point.</p>
<p>
<span class="badge">address: <span class="mono" id="cAddr">…</span></span>
<span class="badge" id="cChain">…</span>
</p>
<p style="margin-top:16px">
<a class="btn sec small" id="lnkExplorer" target="_blank" rel="noopener">Raw contract on the explorer ↗</a>
<a class="btn sec small" id="lnkSource" target="_blank" rel="noopener">Verified source code ↗</a>
</p>
</section>
<div class="card">
<h3>The six laws the code enforces</h3>
<ul class="checks">
<li><b>It never holds funds.</b> Every purchase is fully paid out in the same transaction. The contract balance is zero after every sale. There is nothing to freeze, drain, or run away with.</li>
<li><b>The compensation rules are constants.</b> 50 percent, 20 percent, 10 percent, 20 percent platform. They are compiled into the bytecode. No function exists to change them.</li>
<li><b>No upgrade path, no pause switch, no self-destruct.</b> The deployed bytecode is the program forever.</li>
<li><b>Purchased credits only ever go down by delivering your ads.</b> No function reduces them for any other reason, and nothing can mint them except a purchase.</li>
<li><b>Qualification is earned, never bought.</b> Deeper levels unlock only by referring real buyers of $20 or more. No spend-based shortcuts exist.</li>
<li><b>Everything is observable.</b> Every state change emits a public event. The website is a mirror of the chain, never the source of truth for money.</li>
</ul>
</div>
<div class="grid c2">
<div class="card">
<h3>What the operator CAN do</h3>
<ul class="checks">
<li>Add ad packages to the catalog (price floor $1, ceiling $500)</li>
<li>Queue a price change, which waits behind a public 24-hour timelock before anyone can apply it</li>
<li>Retire a package from sale, and reactivate it later</li>
<li>Rotate the fee-receiver, ad-engine, and owner addresses (key-loss insurance)</li>
<li>The ad engine can burn credits, but only as your campaigns consume delivery</li>
</ul>
</div>
<div class="card">
<h3>What the operator CANNOT do</h3>
<ul class="checks">
<li>Change any split percentage or qualification threshold</li>
<li>Pause, upgrade, or replace the contract</li>
<li>Hold, redirect, or claw back anyone's payout</li>
<li>Mint credits, take credits, or touch anyone's membership record</li>
<li>Move a price outside the $1 to $500 bounds, or skip the 24-hour notice</li>
</ul>
</div>
</div>
<div class="card">
<h3>Where every purchase goes</h3>
<div class="split">
<div class="s50">50%<br>direct sponsor</div>
<div class="s20">20%<br>level 2</div>
<div class="s10">10%<br>level 3</div>
<div class="sa">20%<br>platform</div>
</div>
<p class="muted small">On a $20 package: $10.00 to the direct sponsor, $4.00 to level 2, $2.00 to level 3,
$4.00 to the platform. Rounding dust of a few billionths of a cent goes to the platform wallet so the
books always balance to zero. When a level has no qualified recipient, that share visibly passes up
to the next qualified person; if none exists within 25 candidates, it goes to the platform. Every one
of these movements is an event on the <a href="/ledger">live ledger</a>.</p>
</div>
<div class="grid c2">
<div class="card">
<h3>Dollar prices, POL settlement</h3>
<p class="muted small">Packages are priced in dollars and settled in POL using the Chainlink POL/USD
oracle at the moment of purchase. If you send slightly too much because the rate moved, the excess
refunds to you in the same transaction. If the oracle ever goes quiet, the contract keeps selling
at its last fresh price for up to 24 hours, then new purchases pause until the feed returns.
Settled money, credits, and memberships are never affected by an oracle outage.</p>
</div>
<div class="card">
<h3>Nobody can stall it</h3>
<p class="muted small">Payouts are pushed with a strict gas allowance. A wallet that refuses to
accept payment is simply treated as unqualified and its share passes up. No escrow forms, no
purchase reverts, nobody waits on anybody. One practical note: use a normal wallet address for
payouts. Some exotic smart-contract wallets cost more gas to receive than the allowance and would
be passed over.</p>
</div>
</div>
<div class="card">
<h3>How it was tested</h3>
<p class="muted small">Before deployment the contract passed a suite of 24 tests covering every split
scenario, the pass-up walk to its exact 25-candidate boundary, oracle outages and price swings,
refunds, hostile recipient wallets, and catalog rules. On top of that, an invariant fuzzer ran
128,000 randomized transactions and confirmed after every single one: the contract balance stayed
zero, every wei in equaled every wei out, credits equaled purchases minus delivery, and nobody was
qualified without earning it. The full specification was then audited line by line against the code.
The source you see at the verified-source link is byte-for-byte what runs on chain.</p>
</div>
<div class="closer">
<div>
<h2>Do not trust this page. Check it.</h2>
<p class="muted" style="margin:0 0 22px">The whole reason this platform exists is that you should
not have to take anyone's word, including ours. Open the source, open the ledger, click a
transaction.</p>
<a class="btn" id="lnkSource2" target="_blank" rel="noopener">Read the verified source</a>
<a class="btn sec" href="/ledger">Open the live ledger</a>
</div>
<div class="mockup">
<div class="bar"><i></i><i></i><i></i><span class="addr" id="mockAddr">contract</span></div>
<div class="body">
<div class="mrow"><span>compiler check</span><span>exact match</span></div>
<div class="mrow"><span>bytecode check</span><span>exact match</span></div>
<div class="mrow dim"><span>upgrade path</span><span>none</span></div>
<div class="mrow dim"><span>pause switch</span><span>none</span></div>
</div>
</div>
</div>
<footer>
<div>InstantAdPay · <a href="/">how it works</a> · <a href="/ledger">live ledger</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260904f"></script>
<script src="/assets/contract.js?v=20260904f"></script>
</body>
</html>
+5 -4
View File
@@ -5,7 +5,7 @@
<title>InstantAdPay: advertise and earn, locked in code</title>
<meta name="description" content="Real ad packages with instant on-chain settlement. Every purchase pays the sponsor line in the same transaction, verifiable by anyone on the live ledger.">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css">
<link rel="stylesheet" href="/assets/site.css?v=20260904f">
</head>
<body>
@@ -191,6 +191,7 @@
<p class="muted" id="lvlDesc" style="min-height:72px">Level 1 is open to every member: your direct
referrals each pay you 50 percent of every package they ever buy, straight to your wallet.</p>
<ul class="checks">
<li>No withdrawal requests, ever. Every payment sends straight to your wallet.</li>
<li>Unqualified shares visibly pass up to the next qualified person</li>
<li>Qualification never expires and can never be bought</li>
</ul>
@@ -344,8 +345,8 @@
</div>
</section>
<script src="/assets/common.js"></script>
<script src="/assets/wallet.js"></script>
<script src="/assets/home.js"></script>
<script src="/assets/common.js?v=20260904f"></script>
<script src="/assets/wallet.js?v=20260904f"></script>
<script src="/assets/home.js?v=20260904f"></script>
</body>
</html>
+3 -3
View File
@@ -5,7 +5,7 @@
<title>Live ledger | InstantAdPay</title>
<meta name="description" content="Every purchase, payout, and pass-up on InstantAdPay, streamed straight from the blockchain with a verify link on every line.">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css">
<link rel="stylesheet" href="/assets/site.css?v=20260904f">
</head>
<body>
<div class="wrap">
@@ -25,7 +25,7 @@
<div>InstantAdPay · <a href="/">how it works</a> · <a id="contractLink" href="#" target="_blank" rel="noopener">contract source ↗</a></div>
</footer>
</div>
<script src="/assets/common.js"></script>
<script src="/assets/ledger.js"></script>
<script src="/assets/common.js?v=20260904f"></script>
<script src="/assets/ledger.js?v=20260904f"></script>
</body>
</html>
+4 -4
View File
@@ -4,7 +4,7 @@
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>My account | 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">
<link rel="stylesheet" href="/assets/site.css?v=20260904f">
</head>
<body>
<div class="wrap">
@@ -130,8 +130,8 @@
<footer><div>InstantAdPay · <a href="/ledger">live ledger</a></div></footer>
</div>
<script src="/assets/common.js"></script>
<script src="/assets/wallet.js"></script>
<script src="/assets/my.js"></script>
<script src="/assets/common.js?v=20260904f"></script>
<script src="/assets/wallet.js?v=20260904f"></script>
<script src="/assets/my.js?v=20260904f"></script>
</body>
</html>