From 3f9dc3cc94c44a615a523f9860096fb86200b03f Mon Sep 17 00:00:00 2001 From: martbost Date: Thu, 24 Sep 2026 15:54:33 -0500 Subject: [PATCH] A session pop-up that says what InstantAdPay actually is The dashboard card was too easy to scroll past, so this is a real overlay: once per browser session, on every page that loads common.js, dismissed with the X, Escape or the backdrop. It leads with the mechanic rather than the promotion, because the ask was to remind people what the site is about: the ad spend in your line pays you, in the same transaction. Five Dollar Friday rides underneath as the reason to act, and the copy is driven by the live /api/friday, so it reads "tomorrow", "today" or nothing at all without anyone editing text on a Friday morning. Not shown on /join or /admin: an overlay in the middle of signing up costs sign-ups, and staff do not need reminding what the product is. QA: the overlay appears after an async fetch, so hiding it at load time missed it and every click in the harness timed out. The harness now pre-sets the same sessionStorage flag a real dismissal uses, before page scripts run. Green again, 0 bugs. Co-Authored-By: Claude Opus 5 --- public/admin.html | 2 +- public/assets/welcome.js | 115 ++ public/contract.html | 296 +++--- public/disclaimer.html | 64 +- public/earning.html | 176 ++-- public/index.html | 1006 +++++++++--------- public/join.html | 326 +++--- public/launch.html | 220 ++-- public/ledger.html | 94 +- public/my.html | 2158 +++++++++++++++++++------------------- public/partners.html | 268 ++--- public/plays.html | 396 +++---- public/privacy.html | 70 +- public/terms.html | 86 +- public/tx.html | 80 +- public/wall.html | 106 +- public/wallets.html | 254 ++--- qa/earn.mjs | 239 ++--- qa/walk.mjs | 337 +++--- 19 files changed, 3206 insertions(+), 3087 deletions(-) create mode 100644 public/assets/welcome.js diff --git a/public/admin.html b/public/admin.html index e290ad8..ec8fae1 100644 --- a/public/admin.html +++ b/public/admin.html @@ -510,7 +510,7 @@ - + diff --git a/public/assets/welcome.js b/public/assets/welcome.js new file mode 100644 index 0000000..2933906 --- /dev/null +++ b/public/assets/welcome.js @@ -0,0 +1,115 @@ +/* InstantAdPay session pop-up (Marty, 2026-09-24). + + One card, once per browser session, on every page that loads common.js. It exists because the + dashboard card was too easy to scroll past: this one is a proper overlay you have to dismiss. + + It leads with WHAT THE SITE IS, not the promotion, because the ask was "remind them what it is + about". Five Dollar Friday rides along underneath as the reason to act this week, and the card + reads the live /api/friday so it says "tomorrow", "today" or nothing at all without anyone + editing copy. + + Rules it follows: + - once per SESSION, not per day: sessionStorage, so closing the tab resets it + - a new `key` (change of promo, new campaign) shows it again even in the same session + - never on the sign-up or sign-in flow: an overlay in the middle of joining costs sign-ups + - Escape and the backdrop both close it, and focus is trapped while it is open + - if sessionStorage is unavailable (private mode) it simply shows once and does not throw +*/ +(function () { + var KEY = 'iap.welcome.v1'; + // Pages where an overlay would get in the way of something more important. + // /join is the sign-up flow and /admin is staff only; an overlay on either is pure friction. + var SKIP = /^\/(join|signup|register|login|auth|admin)(\/|$)/i; + + function seen() { try { return sessionStorage.getItem(KEY) === '1'; } catch (e) { return false; } } + function mark() { try { sessionStorage.setItem(KEY, '1'); } catch (e) {} } + + function fridayLine(f) { + if (!f || !f.on) return null; + if (f.live) return { tag: 'TODAY', text: 'It is Five Dollar Friday right now. Every package of $5 or more gets 20% bonus credits, automatically, until midnight Central.' }; + if (f.nextLabel) return { tag: f.nextLabel, text: 'Five Dollar Friday: any package of $5 or more gets ' + (f.pct || 20) + '% bonus credits, automatically. No code, nothing to claim.' }; + return null; + } + + function show(f) { + if (document.querySelector('.iap-welcome')) return; + var fri = fridayLine(f); + + var back = document.createElement('div'); + back.className = 'iap-welcome'; + back.setAttribute('role', 'dialog'); + back.setAttribute('aria-modal', 'true'); + back.setAttribute('aria-label', 'About InstantAdPay'); + back.style.cssText = 'position:fixed;inset:0;z-index:400;background:rgba(2,6,5,.72);' + + 'display:flex;align-items:center;justify-content:center;padding:18px;overflow:auto;' + + '-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);'; + + var card = document.createElement('div'); + card.style.cssText = 'position:relative;width:100%;max-width:470px;background:#0b1512;color:#eef7f3;' + + 'border:1px solid rgba(67,232,195,.28);border-radius:18px;padding:26px 24px 22px;' + + 'box-shadow:0 26px 70px rgba(0,0,0,.6);font-size:15px;line-height:1.55;'; + + var html = + '' + + '
InstantAdPay
' + + '

The ad spend in your line pays you, in the same transaction.

' + + '

You buy advertising you were going to buy anyway. When someone in your line buys a package, the contract splits it and your share lands in your wallet before the page reloads. No back office, no payday to wait for.

' + + ''; + + if (fri) { + html += '
' + + '
' + fri.tag + '
' + + '
' + fri.text + '
'; + } + + html += '
' + + 'See the packages' + + 'Live ledger' + + '
'; + + card.innerHTML = html; + back.appendChild(card); + document.body.appendChild(back); + mark(); + + var prev = document.activeElement; + var closeBtn = card.querySelector('.iap-w-x'); + function close() { + back.remove(); + document.removeEventListener('keydown', onKey); + try { if (prev && prev.focus) prev.focus(); } catch (e) {} + } + function onKey(e) { + if (e.key === 'Escape') { close(); return; } + if (e.key !== 'Tab') return; + var f = card.querySelectorAll('button,a[href]'); + if (!f.length) return; + var first = f[0], last = f[f.length - 1]; + if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } + else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } + } + closeBtn.addEventListener('click', close); + back.addEventListener('click', function (e) { if (e.target === back) close(); }); + // following a link is a deliberate exit, so let it through but tidy up + card.querySelectorAll('.iap-w-go').forEach(function (a) { a.addEventListener('click', close); }); + document.addEventListener('keydown', onKey); + try { closeBtn.focus(); } catch (e) {} + } + + function boot() { + if (seen() || SKIP.test(location.pathname)) return; + // the Friday state decides one paragraph; a failure there must not stop the card + fetch('/api/friday').then(function (r) { return r.ok ? r.json() : null; }) + .catch(function () { return null; }) + .then(function (f) { show(f); }); + } + + if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); + else boot(); +})(); diff --git a/public/contract.html b/public/contract.html index b72fa27..d8bf660 100644 --- a/public/contract.html +++ b/public/contract.html @@ -1,148 +1,148 @@ - - - - -The contract | InstantAdPay - - - - - - - - - - - - - - - - - -
-
-

The contract, in plain language.

-

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.

-

- address: … - … -

-

- Raw contract on the explorer ↗ - Verified source code ↗ -

-
- -
-

The six laws the code enforces

-
    -
  • It never holds funds. 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.
  • -
  • The compensation rules are constants. 50 percent, 20 percent, 10 percent, 20 percent platform. They are compiled into the bytecode. No function exists to change them.
  • -
  • No upgrade path, no pause switch, no self-destruct. The deployed bytecode is the program forever.
  • -
  • Purchased credits only ever go down by delivering your ads. No function reduces them for any other reason, and nothing can mint them except a purchase.
  • -
  • Qualification is earned, never bought. Deeper levels unlock only by referring real buyers of $20 or more. No spend-based shortcuts exist.
  • -
  • Everything is observable. Every state change emits a public event. The website is a mirror of the chain, never the source of truth for money.
  • -
-
- -
-
-

What the operator CAN do

-
    -
  • Add ad packages to the catalog (price floor $1, ceiling $500)
  • -
  • Queue a price change, which waits behind a public 24-hour timelock before anyone can apply it
  • -
  • Retire a package from sale, and reactivate it later
  • -
  • Rotate the fee-receiver, ad-engine, and owner addresses (key-loss insurance)
  • -
  • The ad engine can burn credits, but only as your campaigns consume delivery
  • -
-
-
-

What the operator CANNOT do

-
    -
  • Change any split percentage or qualification threshold
  • -
  • Pause, upgrade, or replace the contract
  • -
  • Hold, redirect, or claw back anyone's payout
  • -
  • Mint credits, take credits, or touch anyone's membership record
  • -
  • Move a price outside the $1 to $500 bounds, or skip the 24-hour notice
  • -
-
-
- -
-

Where every purchase goes

-
-
50%
direct sponsor
-
20%
level 2
-
10%
level 3
-
20%
platform
-
-

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 live ledger.

-
- -
-
-

Dollar prices, POL settlement

-

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.

-
-
-

Nobody can stall it

-

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.

-
-
- -
-

How it was tested

-

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.

-
- -
-
-

Do not trust this page. Check it.

-

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.

- Read the verified source - Open the live ledger -
-
-
contract
-
-
compiler checkexact match
-
bytecode checkexact match
-
upgrade pathnone
-
pause switchnone
-
-
-
- -
-
InstantAdPay · how it works · live ledger
-
Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.
-
-
- - - - - + + + + +The contract | InstantAdPay + + + + + + + + + + + + + + + + + +
+
+

The contract, in plain language.

+

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.

+

+ address: … + … +

+

+ Raw contract on the explorer ↗ + Verified source code ↗ +

+
+ +
+

The six laws the code enforces

+
    +
  • It never holds funds. 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.
  • +
  • The compensation rules are constants. 50 percent, 20 percent, 10 percent, 20 percent platform. They are compiled into the bytecode. No function exists to change them.
  • +
  • No upgrade path, no pause switch, no self-destruct. The deployed bytecode is the program forever.
  • +
  • Purchased credits only ever go down by delivering your ads. No function reduces them for any other reason, and nothing can mint them except a purchase.
  • +
  • Qualification is earned, never bought. Deeper levels unlock only by referring real buyers of $20 or more. No spend-based shortcuts exist.
  • +
  • Everything is observable. Every state change emits a public event. The website is a mirror of the chain, never the source of truth for money.
  • +
+
+ +
+
+

What the operator CAN do

+
    +
  • Add ad packages to the catalog (price floor $1, ceiling $500)
  • +
  • Queue a price change, which waits behind a public 24-hour timelock before anyone can apply it
  • +
  • Retire a package from sale, and reactivate it later
  • +
  • Rotate the fee-receiver, ad-engine, and owner addresses (key-loss insurance)
  • +
  • The ad engine can burn credits, but only as your campaigns consume delivery
  • +
+
+
+

What the operator CANNOT do

+
    +
  • Change any split percentage or qualification threshold
  • +
  • Pause, upgrade, or replace the contract
  • +
  • Hold, redirect, or claw back anyone's payout
  • +
  • Mint credits, take credits, or touch anyone's membership record
  • +
  • Move a price outside the $1 to $500 bounds, or skip the 24-hour notice
  • +
+
+
+ +
+

Where every purchase goes

+
+
50%
direct sponsor
+
20%
level 2
+
10%
level 3
+
20%
platform
+
+

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 live ledger.

+
+ +
+
+

Dollar prices, POL settlement

+

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.

+
+
+

Nobody can stall it

+

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.

+
+
+ +
+

How it was tested

+

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.

+
+ +
+
+

Do not trust this page. Check it.

+

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.

+ Read the verified source + Open the live ledger +
+
+
contract
+
+
compiler checkexact match
+
bytecode checkexact match
+
upgrade pathnone
+
pause switchnone
+
+
+
+ +
+
InstantAdPay · how it works · live ledger
+
Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.
+
+
+ + + + + diff --git a/public/disclaimer.html b/public/disclaimer.html index 5a40e71..678e068 100644 --- a/public/disclaimer.html +++ b/public/disclaimer.html @@ -1,32 +1,32 @@ - - - - -Disclaimer | InstantAdPay - - - - - - -
-

Risk & Earnings Disclaimer

Last updated: September 2026

-
-

No income guarantee

-

InstantAdPay is an advertising service with a referral program. It is not an investment, a security, or a passive-income scheme. We do not promise, project, or guarantee any earnings. Any figures shown in examples or sample creatives are illustrations only, not typical or expected results. Most participants should expect to earn little or nothing unless real advertising is purchased in their line.

-

Not financial or legal advice

-

Nothing on the Platform is investment, financial, tax, or legal advice. Do your own research and consult a professional before spending money.

-

Crypto risk

-

Purchases settle on a public blockchain using a volatile network token. On-chain transactions are final and irreversible: there are no refunds, chargebacks, or reversals. You are responsible for your wallet, your keys, network fees, and the tax treatment of your activity.

-

Live on Polygon

-

The Platform is live on the Polygon mainnet. Purchases and payouts use POL, a real cryptocurrency with real monetary value. Every transaction is real and final — this is not a simulation or test environment.

-

Advertising

-

Ads are member-created and auto-approved for speed. InstantAdPay does not endorse and is not responsible for advertised products, sites, or claims. Use your judgment, and report anything broken or inappropriate.

-

Your responsibility

-

You decide whether, and how much, to spend. Never spend more than you can afford to lose.

-
-
- - - - + + + + +Disclaimer | InstantAdPay + + + + + + +
+

Risk & Earnings Disclaimer

Last updated: September 2026

+
+

No income guarantee

+

InstantAdPay is an advertising service with a referral program. It is not an investment, a security, or a passive-income scheme. We do not promise, project, or guarantee any earnings. Any figures shown in examples or sample creatives are illustrations only, not typical or expected results. Most participants should expect to earn little or nothing unless real advertising is purchased in their line.

+

Not financial or legal advice

+

Nothing on the Platform is investment, financial, tax, or legal advice. Do your own research and consult a professional before spending money.

+

Crypto risk

+

Purchases settle on a public blockchain using a volatile network token. On-chain transactions are final and irreversible: there are no refunds, chargebacks, or reversals. You are responsible for your wallet, your keys, network fees, and the tax treatment of your activity.

+

Live on Polygon

+

The Platform is live on the Polygon mainnet. Purchases and payouts use POL, a real cryptocurrency with real monetary value. Every transaction is real and final — this is not a simulation or test environment.

+

Advertising

+

Ads are member-created and auto-approved for speed. InstantAdPay does not endorse and is not responsible for advertised products, sites, or claims. Use your judgment, and report anything broken or inappropriate.

+

Your responsibility

+

You decide whether, and how much, to spend. Never spend more than you can afford to lose.

+
+
+ + + + diff --git a/public/earning.html b/public/earning.html index 2b298db..59a51ba 100644 --- a/public/earning.html +++ b/public/earning.html @@ -1,88 +1,88 @@ - - - - -How earning works: credits and POL payouts | InstantAdPay - - - - - - - - - -
-
-

Member guide

-

How earning works: credits, and POL to your wallet.

-

Every free way to earn ad credits, the claim streak, and the one thing that makes the credits worth anything: spending them on a campaign.

-
- -
This page is about credits, which every member earns. POL, the crypto the contract pays to your wallet when your referrals buy packages, is separate: activate with the $20 starter package and switch on payouts, and level 1 pays 50 percent of every package your directs buy.
-
One credit is one cent of ad delivery. Credits are not money and cannot be withdrawn. They buy impressions, clicks and visits for your own campaigns across InstantAdPay and the partner network. Payouts in POL come only from packages people in your line buy.
- -

1. The daily set

-

Earn credits › Watch ads. Five ads a day. Each one opens full screen, a 10-second countdown runs while you look, you pass a quick click-the-icon check, and you earn 1 credit. Finish all five and the Claim button appears.

- -

2. The claim streak

-

The claim pays more the more days in a row you claim it. Miss a day and it restarts at day 1.

- - - - - - -
Consecutive dayClaim pays
Day 15 credits
Day 27 credits
Day 3 and on10 credits
Every 7th day in a row25 credits
-

The hint under the set always tells you which day you are on and what tomorrow's claim pays. Days are counted in UTC, so the set resets at 7 PM Central.

- -

3. After the set: verified visits

-

When the set is claimed, the done screen offers verified visits: up to 20 a day, 1 credit each. You open a member's site in a new tab, stay for the dwell, and the visit counts. Each visit is unique per site per day, so it is 20 different sites, not one site 20 times.

- -

4. Videos and inbox ads

-
    -
  • Videos. Earn credits › Watch videos. You are credited only when the video plays to the end. Up to 6 a day, and the reward depends on the video's length.
  • -
  • Inbox solo ads. Earn credits › Inbox Ads. Open the message, visit the advertiser's link, then claim 2 credits. Once per message.
  • -
- -

5. The sign-in bonus and milestones

-

Signing in pays 5 credits a day, rising by one for each consecutive day up to 10. Milestone badges pay too: Spark when payouts are on, Surge at your first qualifying buyer, Circuit at two, Nexus at five.

- -

6. Now spend it

-

Credits sitting in your balance do nothing. Campaigns › New campaign: pick a banner or a text ad, give it a name and a budget in credits, point it at your own invite link or wall, and launch. Banner and text ads also push out to the partner network, so a 100-credit campaign is a hundred cents of real delivery. The done screen has a one-tap button for this after every claim.

-

Two things to know: a campaign reserves its whole budget the moment you start it, so your available balance drops right away and never surprises you later, and login ads are the one format that needs purchased credits.

- -

7. The other earning: POL paid to your wallet

-

Everything above is about credits, the currency that runs your advertising. The second kind of earning is POL, real money sent to your own wallet, and it comes from one place: ad packages bought by people in your line.

-

When anyone buys a package, the smart contract splits the price in the same transaction: 50% to the buyer's sponsor (level 1), 20% to the sponsor's sponsor (level 2), 10% to the one above that (level 3), and 20% to the platform. There is no balance to withdraw and no request to make. The POL lands in the wallet on your account before the buyer's page has finished refreshing, and every payout carries a link you can open on Polygon.

-

What has to be true for a share to reach you

-
    -
  • Payouts are switched on. Wallet tab: link your wallet and switch on payouts, which puts your member number on the contract. Until then a share meant for you passes up to the next payable person above you, and it is never paid to you later.
  • -
  • Level 1 pays from the moment payouts are on. Every direct referral's package pays you 50%, whatever the size.
  • -
  • Level 2 opens at two qualifying buyers, level 3 at five. A qualifying buyer is a direct referral who bought a package of $20 or more. Qualification never expires and cannot be bought. It is counted at the block the purchase happens in, so a buy that lands forty minutes before you qualify is passed up, not held.
  • -
  • Passed-up shares go to the next qualified person above. That is why the people who qualify early collect what the people below them are not yet set up to receive.
  • -
-

Who is your sponsor

-

The invite link you opened most recently before creating your account sets your sponsor, and it locks the moment the account exists. Linked positions from Qualified Start count toward your badges, and their purchases pay your main position at level 1.

-

Where to see it

-

Earnings shows three cards: payouts sent to your wallet, referral events in your line, and your purchases, every row with its Polygon link. If a share you expected is missing, use Trace a payment on that tab: it shows, purchase by purchase, who was paid at each level and why a level was skipped. The usual answers are not yet qualified at that block, a Qualified Start position buying under its own main wallet, or payouts not switched on. The live ledger shows the whole network's payouts as they happen.

- -

No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

- -
- - - + + + + +How earning works: credits and POL payouts | InstantAdPay + + + + + + + + + +
+
+

Member guide

+

How earning works: credits, and POL to your wallet.

+

Every free way to earn ad credits, the claim streak, and the one thing that makes the credits worth anything: spending them on a campaign.

+
+ +
This page is about credits, which every member earns. POL, the crypto the contract pays to your wallet when your referrals buy packages, is separate: activate with the $20 starter package and switch on payouts, and level 1 pays 50 percent of every package your directs buy.
+
One credit is one cent of ad delivery. Credits are not money and cannot be withdrawn. They buy impressions, clicks and visits for your own campaigns across InstantAdPay and the partner network. Payouts in POL come only from packages people in your line buy.
+ +

1. The daily set

+

Earn credits › Watch ads. Five ads a day. Each one opens full screen, a 10-second countdown runs while you look, you pass a quick click-the-icon check, and you earn 1 credit. Finish all five and the Claim button appears.

+ +

2. The claim streak

+

The claim pays more the more days in a row you claim it. Miss a day and it restarts at day 1.

+ + + + + + +
Consecutive dayClaim pays
Day 15 credits
Day 27 credits
Day 3 and on10 credits
Every 7th day in a row25 credits
+

The hint under the set always tells you which day you are on and what tomorrow's claim pays. Days are counted in UTC, so the set resets at 7 PM Central.

+ +

3. After the set: verified visits

+

When the set is claimed, the done screen offers verified visits: up to 20 a day, 1 credit each. You open a member's site in a new tab, stay for the dwell, and the visit counts. Each visit is unique per site per day, so it is 20 different sites, not one site 20 times.

+ +

4. Videos and inbox ads

+
    +
  • Videos. Earn credits › Watch videos. You are credited only when the video plays to the end. Up to 6 a day, and the reward depends on the video's length.
  • +
  • Inbox solo ads. Earn credits › Inbox Ads. Open the message, visit the advertiser's link, then claim 2 credits. Once per message.
  • +
+ +

5. The sign-in bonus and milestones

+

Signing in pays 5 credits a day, rising by one for each consecutive day up to 10. Milestone badges pay too: Spark when payouts are on, Surge at your first qualifying buyer, Circuit at two, Nexus at five.

+ +

6. Now spend it

+

Credits sitting in your balance do nothing. Campaigns › New campaign: pick a banner or a text ad, give it a name and a budget in credits, point it at your own invite link or wall, and launch. Banner and text ads also push out to the partner network, so a 100-credit campaign is a hundred cents of real delivery. The done screen has a one-tap button for this after every claim.

+

Two things to know: a campaign reserves its whole budget the moment you start it, so your available balance drops right away and never surprises you later, and login ads are the one format that needs purchased credits.

+ +

7. The other earning: POL paid to your wallet

+

Everything above is about credits, the currency that runs your advertising. The second kind of earning is POL, real money sent to your own wallet, and it comes from one place: ad packages bought by people in your line.

+

When anyone buys a package, the smart contract splits the price in the same transaction: 50% to the buyer's sponsor (level 1), 20% to the sponsor's sponsor (level 2), 10% to the one above that (level 3), and 20% to the platform. There is no balance to withdraw and no request to make. The POL lands in the wallet on your account before the buyer's page has finished refreshing, and every payout carries a link you can open on Polygon.

+

What has to be true for a share to reach you

+
    +
  • Payouts are switched on. Wallet tab: link your wallet and switch on payouts, which puts your member number on the contract. Until then a share meant for you passes up to the next payable person above you, and it is never paid to you later.
  • +
  • Level 1 pays from the moment payouts are on. Every direct referral's package pays you 50%, whatever the size.
  • +
  • Level 2 opens at two qualifying buyers, level 3 at five. A qualifying buyer is a direct referral who bought a package of $20 or more. Qualification never expires and cannot be bought. It is counted at the block the purchase happens in, so a buy that lands forty minutes before you qualify is passed up, not held.
  • +
  • Passed-up shares go to the next qualified person above. That is why the people who qualify early collect what the people below them are not yet set up to receive.
  • +
+

Who is your sponsor

+

The invite link you opened most recently before creating your account sets your sponsor, and it locks the moment the account exists. Linked positions from Qualified Start count toward your badges, and their purchases pay your main position at level 1.

+

Where to see it

+

Earnings shows three cards: payouts sent to your wallet, referral events in your line, and your purchases, every row with its Polygon link. If a share you expected is missing, use Trace a payment on that tab: it shows, purchase by purchase, who was paid at each level and why a level was skipped. The usual answers are not yet qualified at that block, a Qualified Start position buying under its own main wallet, or payouts not switched on. The live ledger shows the whole network's payouts as they happen.

+ +

No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

+ +
+ + + diff --git a/public/index.html b/public/index.html index e2e3ef4..2cf4e6c 100644 --- a/public/index.html +++ b/public/index.html @@ -1,503 +1,503 @@ - - - - -InstantAdPay: advertise and earn, locked in code - - - - - - - - - - - - - - - - - - - - - -
-
- -
- - - - - - -
-

Advertise and earn instantly.
Locked in code, not promises.

-

Buy real ad packages from 5 to 250 dollars. Every purchase settles through - a smart contract you can read yourself, and your earnings land in - your own wallet before the page even refreshes.

-

One crypto, one network: packages are paid in POL on Polygon and every payout arrives as POL in your wallet. Buy POL with a card inside if you have never held any.

- - -
-
–
On-chain members
-
–
Packages bought
-
–
POL settled
-
–
Instant payouts
-
-

every number above is read from the blockchain, not a marketing database

- -
-
- - - -
-
-
-

The whole platform in four minutes

-

What it is, what you get free, how the ads run, how the money moves, and how a line gets built. Watch this first.

-
-
- -
-

No income is promised. Every figure in the video is a rule of the contract.

-
-
-
-
-
-

Instant payments without compromise

-

Most referral programs run on a database someone can change after you promote. - This one runs on Polygon, split by a contract nobody can touch. Not even us.

-
-
-
-
-

Paid in the same transaction

-

The purchase and every payout are one blockchain event. No balances held, no withdrawal - button, no company touching the money.

-
-
-
-

Rules that cannot move

-

50-20-10 across three levels plus a 20 percent platform fee, written as constants in an - immutable contract. There is no function to change them.

-
-
-
-

Verifiable by anyone

-

Every payment streams to a public ledger with a verify link straight to the block explorer. - If it is not there, it did not happen.

-
-
-
-
- -
-
-
-

Why this is not another ad site

-

You have seen traffic exchanges, click-to-earn sites and solo-ad sellers. Here is the honest side by side.

-
-
- - - - - - - - - - -
Typical advertising siteInstantAdPay
Referral commission5 to 15 percent, often only after a minimum balance50 percent to the direct sponsor, then 20 and 10 on the next two levels
When you get paidRequest a withdrawal, wait for approval, hopeIn the same transaction the package sells
Who holds the moneyThe site's balance, at the owner's discretionNobody. The contract splits it to real wallets. There is no balance to hold
Can the rules changeWhenever the owner edits a settingNever. 50 / 20 / 10 / 20 are constants in a verified, immutable contract
ProofA number on a dashboardEvery payout is a public transaction you can open yourself
Ad viewsTimers that run while nobody looksA 10-second dwell, a human check, and a server-side clock
CreditsPoints that expire or get devalued1 credit = 1 cent of delivery, recorded on-chain, spent only by your campaigns
JoiningInstall an app, connect a wallet, then maybe readEmail first. The wallet comes when you are ready to be paid
AdvertisingPay to be seen by people who are paid to clickSeven formats delivered to members who buy ads themselves, with verified visits and finished video views
-

No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

-
-
- -
-
-
-

Watch the money move

-

This is a live view, not a brochure. Real purchases split into real payouts, - each one a click away from the raw transaction.

-
-
-
-
-
-

Buy a package

-

Priced in dollars, settled in POL at the live oracle rate. Overpayment refunds itself in the same transaction.

-
-
-
-

The contract splits it

-

Half to the direct sponsor, then levels 2 and 3, then the platform. Automatically, immediately, every time.

-
-
-
-
instantadpay.com/ledger
-
-
🧾 member #7 bought package #2 ($20.00)−213 POL
-
💸 level 1 payout → member #3+106.5 POL
-
💸 level 2 payout → member #2+42.6 POL
-
💸 level 3 payout → member #1+21.3 POL
-
🏛 platform fee settled42.6 POL
-
⭐ member #3 now has 2 qualifying buyerslevel 2 ✓
-
-
-
-
-
-

Straight to their wallets

-

Recipients get POL in their own wallets within seconds. Nothing to claim, nothing to request.

-
-
-
-

Credits mint on-chain

-

One credit is one cent of ad delivery across the network. Only your campaigns can ever spend them.

-
-
-
-

Amounts shown are the $20 worked example at the current oracle rate. Open the real ledger →

-
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - 50% - - - - - - - - - - - - - - - - - - - - - -
-
-

Earn deeper as your people buy

-

Levels unlock by performance, never by payment. Refer buyers, and their - shares of every future purchase route to you automatically.

-
- - - -
-

Activate with the $20 starter package and switch on payouts from your wallet. From then on your direct referrals each pay you 50 percent of every package they ever buy, in POL, straight to your wallet. Until you activate, you earn ad credits, not POL.

-
    -
  • No withdrawal requests, ever. Every payment sends straight to your wallet.
  • -
  • Unqualified shares visibly pass up to the next qualified person
  • -
  • Qualification never expires and can never be bought
  • -
-
-
-
-
- -
-
-
-

Real ad inventory. Real eyeballs.

-

This is not phantom traffic or empty impressions. Seven ad formats run right now, - reaching members who are themselves marketers buying traffic — and members earn credits back - for the attention they give.

-
-
-
-
-

Display banners live

-

All standard sizes, live across our network, priced per impression. You pay for views, not guesses.

-
-
-
-

Text ads live

-

A headline plus a support line, placed where members actually look. Also per impression, also live right now.

-
-
-
-

Login ads live

-

The moment a member signs in, your ad is the toll gate: they open your page in a fresh tab - while a countdown holds their dashboard. Just a link is enough — add a banner if you have - one. Priced per day.

-
-
-
-

Video ads live

-

Upload a video or drop a link, and pick how long members must watch — 10, 30 or 60 seconds. - They watch in a player that can't be skipped, the clock runs on our server, and you pay only - for completed views. There's a full-screen Shorts feed too.

-
-
-
-

Solo ads live

-

Your full message — rich text, an image or video, and a call-to-action button — delivered - straight into member inboxes on-site and by email. Priced per guaranteed delivery, and readers - earn credits for a real read, so your message gets opened, not skimmed past.

-
-
-
-

Featured rotation live

-

Book your link into the featured rotation by the day — 1, 2 or 7 days — with a hard cap on how - many links share a day and the occupancy shown before you buy. The only rotator that tells you - the dilution up front, because hiding it is a sucker move.

-
-
-
-

Verified visits live

-

Buy a pack of guaranteed unique human visits. Each one is a different member who stayed the - full dwell and passed a human check — no bots, no recycled clicks, no repeats, just real visits - you can count on.

-
-
-
-
- -
-
-
-

What you get as a member

-

Free membership gets you in the door with a working account and the ability to earn - from day one. Buy any package and the real firepower unlocks.

-
-
-
-

Credits: everyone earns these

-

Ad credits are the currency of the ad platform. One credit is one cent of ad delivery. They are not money and are never withdrawn.

-
    -
  • Earned free by viewing ads, watching videos, verified visits, inbox ads and the daily sign-in
  • -
  • Welcome credits on day one, badge bonuses as your team grows
  • -
  • Spent on your own banner, text, video and solo campaigns
  • -
-
-
-

POL: activated members earn this

-

POL is real crypto, paid to your own wallet by the contract in the same transaction someone in your line buys a package. Nobody holds it for you.

-
    -
  • Activate: the $20 starter package (2,000 credits to advertise with) and payouts switched on from your wallet
  • -
  • Level 1 pays 50 percent of every package your direct referrals buy, from the day you are activated
  • -
  • Levels 2 and 3 open when 2, then 5, of your referrals buy a $20 or larger package
  • -
  • If you are not activated when someone in your line buys, that share passes up to the next member above you who is
  • -
-
-
-
-
-

Free membership includes

-
    -
  • A member account and the live ledger
  • -
  • Welcome credits to taste real ad delivery
  • -
  • Earn more credits by viewing ads, watching videos, making verified visits and reading solo ads
  • -
  • Your line banner, shown to your next three levels as they join
  • -
  • Your own shareable profile page with a scannable join QR code
  • -
  • Achievement badges and credit bonuses as your team grows
  • -
  • Your personal referral link, working from day one
  • -
  • Your invite link and line from day one; activate with the $20 starter package to earn POL on your referrals' purchases
  • -
-
-
-

Any package adds

-
    -
  • On-chain ad credits minted the moment you buy
  • -
  • All seven ad formats, with live stats and a dashboard of charts per campaign
  • -
  • Top up any campaign anytime, and message your whole downline
  • -
  • A full arsenal of promotional tools and a ready-made banner kit, personalized with your link
  • -
  • Packages of $20 or more count toward qualification
  • -
-
-
-
-
- -
-
-
-

The ad packages

-

Priced in dollars, settled in POL at the moment you buy. Packages of $20 or more - count toward your sponsor's qualification.

-
-
Loading live prices from the contract…
-
-
50%
direct sponsor
-
20%
level 2
-
10%
level 3
-
20%
platform
-
-
-
- -
-
-
-

Run your what-if

-

Play with a scenario and see how the contract would split it. This is arithmetic on the - locked percentages, not a prediction and not a promise. Nobody earns a cent unless real - people really buy advertising.

-
-
-
-
-

Direct referrals who each buy a package

-

- 2

-

The package they buy

-

-

Referrals each of them brings who also buy

-

- 2

-

-
-
-
- - - - - - - -
LevelPeople buyingYour shareYou receive
Level 1 open–50%–
Level 2 locked–20%–
Level 3 locked–10%–
If every one of those purchases happens–
-

And that is one round of purchases. The same - split runs again on every future package the same people buy.

-
-
-

- The pass-up rule: a locked level's share does not disappear. - The contract climbs the sponsor line, checking up to 25 positions, and pays the first qualified - person it finds; only if nobody in those 25 qualifies does the share go to the platform. It cuts - both ways: stay qualified and you catch the shares that under-qualified positions below you let - slip. Every pass-up is a visible event on the ledger, so you can see - exactly where money climbed past someone and why.

-
-
-
- -
-
- -
-
- -
-
-
-

Questions people actually ask

-
-
Is this a pyramid or ponzi scheme? -

No, and here is the plain version of why. A pyramid scheme pays you just for recruiting, with no - real product behind it. Here every payment is for ad delivery, and the payouts only come from real - buyers who buy real ad packages. You earn from people actually advertising, not from building a chain - of signups. The whole thing runs on a public ledger you can verify yourself, so nothing stays hidden.

-
What happens if the company disappears? -

The important part is that there is no company holding the money. Every sale is split by the smart - contract itself, on the blockchain, in the same transaction. Nobody can pause it, change it, or run - off with the funds, because the code does the paying automatically. If the site vanished tomorrow, - the contract would keep paying exactly what it is set to pay.

-
Do I need crypto experience or a wallet to join? -

No. You can start with a free email signup and use the platform the same way you would use any ad - site. If you want payouts to a wallet, setting one up takes a few minutes and the platform walks you - through it. But you do not need to know anything about crypto to get in and get moving.

-
How fast do I really get paid? -

Payouts happen inside the very transaction that pays for the package. There is no approval step - and nobody holding funds. Your share lands in your own wallet the moment your referral's purchase - confirms. The public ledger lets you watch each one go through.

-
What am I actually buying? -

You are buying ad delivery. Credits are one cent of delivery each, recorded on-chain when you buy. - The 5 dollar package mints 500 credits, and the bigger packages mint bonus credits on top, up to - 32,500 on the 250 dollar package. That is the product, plain and simple. Your earnings come from - referring people who also buy real ad delivery, and the contract splits every purchase automatically.

- -
-
-

See a payment land before you decide.

-

The ledger is open to everyone. Watch real purchases - split and settle, then join free when you have seen enough.

- Join free - Open the live ledger -
-
-
live · polygon
-
-
💸 payout → member #3instant
-
💸 payout → member #2instant
-
🔍 verify on explorer↗
-
-
-
- -
-
InstantAdPay · every payment verifiable on-chain · live ledger · view the contract ↗
-
Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.
- -
-
-
- - - - - - - + + + + +InstantAdPay: advertise and earn, locked in code + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + +
+

Advertise and earn instantly.
Locked in code, not promises.

+

Buy real ad packages from 5 to 250 dollars. Every purchase settles through + a smart contract you can read yourself, and your earnings land in + your own wallet before the page even refreshes.

+

One crypto, one network: packages are paid in POL on Polygon and every payout arrives as POL in your wallet. Buy POL with a card inside if you have never held any.

+ + +
+
–
On-chain members
+
–
Packages bought
+
–
POL settled
+
–
Instant payouts
+
+

every number above is read from the blockchain, not a marketing database

+ +
+
+ + + +
+
+
+

The whole platform in four minutes

+

What it is, what you get free, how the ads run, how the money moves, and how a line gets built. Watch this first.

+
+
+ +
+

No income is promised. Every figure in the video is a rule of the contract.

+
+
+
+
+
+

Instant payments without compromise

+

Most referral programs run on a database someone can change after you promote. + This one runs on Polygon, split by a contract nobody can touch. Not even us.

+
+
+
+
+

Paid in the same transaction

+

The purchase and every payout are one blockchain event. No balances held, no withdrawal + button, no company touching the money.

+
+
+
+

Rules that cannot move

+

50-20-10 across three levels plus a 20 percent platform fee, written as constants in an + immutable contract. There is no function to change them.

+
+
+
+

Verifiable by anyone

+

Every payment streams to a public ledger with a verify link straight to the block explorer. + If it is not there, it did not happen.

+
+
+
+
+ +
+
+
+

Why this is not another ad site

+

You have seen traffic exchanges, click-to-earn sites and solo-ad sellers. Here is the honest side by side.

+
+
+ + + + + + + + + + +
Typical advertising siteInstantAdPay
Referral commission5 to 15 percent, often only after a minimum balance50 percent to the direct sponsor, then 20 and 10 on the next two levels
When you get paidRequest a withdrawal, wait for approval, hopeIn the same transaction the package sells
Who holds the moneyThe site's balance, at the owner's discretionNobody. The contract splits it to real wallets. There is no balance to hold
Can the rules changeWhenever the owner edits a settingNever. 50 / 20 / 10 / 20 are constants in a verified, immutable contract
ProofA number on a dashboardEvery payout is a public transaction you can open yourself
Ad viewsTimers that run while nobody looksA 10-second dwell, a human check, and a server-side clock
CreditsPoints that expire or get devalued1 credit = 1 cent of delivery, recorded on-chain, spent only by your campaigns
JoiningInstall an app, connect a wallet, then maybe readEmail first. The wallet comes when you are ready to be paid
AdvertisingPay to be seen by people who are paid to clickSeven formats delivered to members who buy ads themselves, with verified visits and finished video views
+

No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

+
+
+ +
+
+
+

Watch the money move

+

This is a live view, not a brochure. Real purchases split into real payouts, + each one a click away from the raw transaction.

+
+
+
+
+
+

Buy a package

+

Priced in dollars, settled in POL at the live oracle rate. Overpayment refunds itself in the same transaction.

+
+
+
+

The contract splits it

+

Half to the direct sponsor, then levels 2 and 3, then the platform. Automatically, immediately, every time.

+
+
+
+
instantadpay.com/ledger
+
+
🧾 member #7 bought package #2 ($20.00)−213 POL
+
💸 level 1 payout → member #3+106.5 POL
+
💸 level 2 payout → member #2+42.6 POL
+
💸 level 3 payout → member #1+21.3 POL
+
🏛 platform fee settled42.6 POL
+
⭐ member #3 now has 2 qualifying buyerslevel 2 ✓
+
+
+
+
+
+

Straight to their wallets

+

Recipients get POL in their own wallets within seconds. Nothing to claim, nothing to request.

+
+
+
+

Credits mint on-chain

+

One credit is one cent of ad delivery across the network. Only your campaigns can ever spend them.

+
+
+
+

Amounts shown are the $20 worked example at the current oracle rate. Open the real ledger →

+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + 50% + + + + + + + + + + + + + + + + + + + + + +
+
+

Earn deeper as your people buy

+

Levels unlock by performance, never by payment. Refer buyers, and their + shares of every future purchase route to you automatically.

+
+ + + +
+

Activate with the $20 starter package and switch on payouts from your wallet. From then on your direct referrals each pay you 50 percent of every package they ever buy, in POL, straight to your wallet. Until you activate, you earn ad credits, not POL.

+
    +
  • No withdrawal requests, ever. Every payment sends straight to your wallet.
  • +
  • Unqualified shares visibly pass up to the next qualified person
  • +
  • Qualification never expires and can never be bought
  • +
+
+
+
+
+ +
+
+
+

Real ad inventory. Real eyeballs.

+

This is not phantom traffic or empty impressions. Seven ad formats run right now, + reaching members who are themselves marketers buying traffic — and members earn credits back + for the attention they give.

+
+
+
+
+

Display banners live

+

All standard sizes, live across our network, priced per impression. You pay for views, not guesses.

+
+
+
+

Text ads live

+

A headline plus a support line, placed where members actually look. Also per impression, also live right now.

+
+
+
+

Login ads live

+

The moment a member signs in, your ad is the toll gate: they open your page in a fresh tab + while a countdown holds their dashboard. Just a link is enough — add a banner if you have + one. Priced per day.

+
+
+
+

Video ads live

+

Upload a video or drop a link, and pick how long members must watch — 10, 30 or 60 seconds. + They watch in a player that can't be skipped, the clock runs on our server, and you pay only + for completed views. There's a full-screen Shorts feed too.

+
+
+
+

Solo ads live

+

Your full message — rich text, an image or video, and a call-to-action button — delivered + straight into member inboxes on-site and by email. Priced per guaranteed delivery, and readers + earn credits for a real read, so your message gets opened, not skimmed past.

+
+
+
+

Featured rotation live

+

Book your link into the featured rotation by the day — 1, 2 or 7 days — with a hard cap on how + many links share a day and the occupancy shown before you buy. The only rotator that tells you + the dilution up front, because hiding it is a sucker move.

+
+
+
+

Verified visits live

+

Buy a pack of guaranteed unique human visits. Each one is a different member who stayed the + full dwell and passed a human check — no bots, no recycled clicks, no repeats, just real visits + you can count on.

+
+
+
+
+ +
+
+
+

What you get as a member

+

Free membership gets you in the door with a working account and the ability to earn + from day one. Buy any package and the real firepower unlocks.

+
+
+
+

Credits: everyone earns these

+

Ad credits are the currency of the ad platform. One credit is one cent of ad delivery. They are not money and are never withdrawn.

+
    +
  • Earned free by viewing ads, watching videos, verified visits, inbox ads and the daily sign-in
  • +
  • Welcome credits on day one, badge bonuses as your team grows
  • +
  • Spent on your own banner, text, video and solo campaigns
  • +
+
+
+

POL: activated members earn this

+

POL is real crypto, paid to your own wallet by the contract in the same transaction someone in your line buys a package. Nobody holds it for you.

+
    +
  • Activate: the $20 starter package (2,000 credits to advertise with) and payouts switched on from your wallet
  • +
  • Level 1 pays 50 percent of every package your direct referrals buy, from the day you are activated
  • +
  • Levels 2 and 3 open when 2, then 5, of your referrals buy a $20 or larger package
  • +
  • If you are not activated when someone in your line buys, that share passes up to the next member above you who is
  • +
+
+
+
+
+

Free membership includes

+
    +
  • A member account and the live ledger
  • +
  • Welcome credits to taste real ad delivery
  • +
  • Earn more credits by viewing ads, watching videos, making verified visits and reading solo ads
  • +
  • Your line banner, shown to your next three levels as they join
  • +
  • Your own shareable profile page with a scannable join QR code
  • +
  • Achievement badges and credit bonuses as your team grows
  • +
  • Your personal referral link, working from day one
  • +
  • Your invite link and line from day one; activate with the $20 starter package to earn POL on your referrals' purchases
  • +
+
+
+

Any package adds

+
    +
  • On-chain ad credits minted the moment you buy
  • +
  • All seven ad formats, with live stats and a dashboard of charts per campaign
  • +
  • Top up any campaign anytime, and message your whole downline
  • +
  • A full arsenal of promotional tools and a ready-made banner kit, personalized with your link
  • +
  • Packages of $20 or more count toward qualification
  • +
+
+
+
+
+ +
+
+
+

The ad packages

+

Priced in dollars, settled in POL at the moment you buy. Packages of $20 or more + count toward your sponsor's qualification.

+
+
Loading live prices from the contract…
+
+
50%
direct sponsor
+
20%
level 2
+
10%
level 3
+
20%
platform
+
+
+
+ +
+
+
+

Run your what-if

+

Play with a scenario and see how the contract would split it. This is arithmetic on the + locked percentages, not a prediction and not a promise. Nobody earns a cent unless real + people really buy advertising.

+
+
+
+
+

Direct referrals who each buy a package

+

+ 2

+

The package they buy

+

+

Referrals each of them brings who also buy

+

+ 2

+

+
+
+
+ + + + + + + +
LevelPeople buyingYour shareYou receive
Level 1 open–50%–
Level 2 locked–20%–
Level 3 locked–10%–
If every one of those purchases happens–
+

And that is one round of purchases. The same + split runs again on every future package the same people buy.

+
+
+

+ The pass-up rule: a locked level's share does not disappear. + The contract climbs the sponsor line, checking up to 25 positions, and pays the first qualified + person it finds; only if nobody in those 25 qualifies does the share go to the platform. It cuts + both ways: stay qualified and you catch the shares that under-qualified positions below you let + slip. Every pass-up is a visible event on the ledger, so you can see + exactly where money climbed past someone and why.

+
+
+
+ +
+
+ +
+
+ +
+
+
+

Questions people actually ask

+
+
Is this a pyramid or ponzi scheme? +

No, and here is the plain version of why. A pyramid scheme pays you just for recruiting, with no + real product behind it. Here every payment is for ad delivery, and the payouts only come from real + buyers who buy real ad packages. You earn from people actually advertising, not from building a chain + of signups. The whole thing runs on a public ledger you can verify yourself, so nothing stays hidden.

+
What happens if the company disappears? +

The important part is that there is no company holding the money. Every sale is split by the smart + contract itself, on the blockchain, in the same transaction. Nobody can pause it, change it, or run + off with the funds, because the code does the paying automatically. If the site vanished tomorrow, + the contract would keep paying exactly what it is set to pay.

+
Do I need crypto experience or a wallet to join? +

No. You can start with a free email signup and use the platform the same way you would use any ad + site. If you want payouts to a wallet, setting one up takes a few minutes and the platform walks you + through it. But you do not need to know anything about crypto to get in and get moving.

+
How fast do I really get paid? +

Payouts happen inside the very transaction that pays for the package. There is no approval step + and nobody holding funds. Your share lands in your own wallet the moment your referral's purchase + confirms. The public ledger lets you watch each one go through.

+
What am I actually buying? +

You are buying ad delivery. Credits are one cent of delivery each, recorded on-chain when you buy. + The 5 dollar package mints 500 credits, and the bigger packages mint bonus credits on top, up to + 32,500 on the 250 dollar package. That is the product, plain and simple. Your earnings come from + referring people who also buy real ad delivery, and the contract splits every purchase automatically.

+ +
+
+

See a payment land before you decide.

+

The ledger is open to everyone. Watch real purchases + split and settle, then join free when you have seen enough.

+ Join free + Open the live ledger +
+
+
live · polygon
+
+
💸 payout → member #3instant
+
💸 payout → member #2instant
+
🔍 verify on explorer↗
+
+
+
+ +
+
InstantAdPay · every payment verifiable on-chain · live ledger · view the contract ↗
+
Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.
+ +
+
+
+ + + + + + + diff --git a/public/join.html b/public/join.html index a69099b..339f1aa 100644 --- a/public/join.html +++ b/public/join.html @@ -1,163 +1,163 @@ - - - - - -You're invited | InstantAdPay - - - - - - -
-
- InstantAdPay - Already a member? Sign in -
- -
- -

InstantAdPay · Advertise and earn on Polygon

- -

Advertise and earn.
Paid on-chain, instantly.

-

Every ad package splits to real wallets in the same transaction it sells. No pending payouts, no withdraw button, and every payment is public.

-
- -
-
- -
-
-
instantadpay.com/ledger · worked example
-
-
🧾 member #7 bought package #2 ($20.00)paid
-
💸 level 1 payout → member #3 (50%)same block
-
💸 level 2 payout → member #2 (20%)same block
-
💸 level 3 payout → member #1 (10%)same block
-
🏛 platform fee settled (20%)same block
-
⭐ member #3 now has 2 qualifying buyerslevel 2 ✓
-
-
-
-

One purchase, one transaction, four payments. Open the real ledger →

- -
- -
-

Join free

-

Type your email and we send a 6-digit code. No password, no wallet needed today.

-

- - - - - - - - - -

Advertising, not investing. No income is guaranteed; results depend on your effort. Crypto carries risk of loss.

-
- -
- -
-
- Paid in POL, Polygon's own coin, to your wallet - Same transaction payouts - Public ledger on Polygon - Free to join by email -
-

The one crypto here is POL on the Polygon network: packages are paid in POL and every payout arrives as POL in your own wallet. Any Polygon wallet works (MetaMask, SafePal, Phantom, Coinbase Wallet). Never held crypto? Buy POL with a card inside the member area.

-
-
-

How it works

Three steps. The first one takes a minute and costs nothing.

-
-
STEP 1

Join free by email

A 6-digit code, no password. You get an invite link and welcome credits to try real ads.

-
STEP 2

Advertise or earn

Seven ad formats. View ads to earn credits, or buy a package from $5 when you want reach.

-
STEP 3

Get paid in the same transaction

Activate with the $20 starter package and switch on payouts, and anyone who buys through your link pays you 50 percent, on-chain, the moment it happens.

-
-
-
-

The packages

Priced in dollars, settled in POL at the live rate. One credit is one cent of ad delivery.

-
-

Every package pays 50 / 20 / 10 up the line the moment it sells, on a public ledger. Join free and look around first.

-
- -
- InstantAdPay · Contract · Terms · Privacy · Disclaimer -
-
- - - - + + + + + +You're invited | InstantAdPay + + + + + + +
+
+ InstantAdPay + Already a member? Sign in +
+ +
+ +

InstantAdPay · Advertise and earn on Polygon

+ +

Advertise and earn.
Paid on-chain, instantly.

+

Every ad package splits to real wallets in the same transaction it sells. No pending payouts, no withdraw button, and every payment is public.

+
+ +
+
+ +
+
+
instantadpay.com/ledger · worked example
+
+
🧾 member #7 bought package #2 ($20.00)paid
+
💸 level 1 payout → member #3 (50%)same block
+
💸 level 2 payout → member #2 (20%)same block
+
💸 level 3 payout → member #1 (10%)same block
+
🏛 platform fee settled (20%)same block
+
⭐ member #3 now has 2 qualifying buyerslevel 2 ✓
+
+
+
+

One purchase, one transaction, four payments. Open the real ledger →

+ +
+ +
+

Join free

+

Type your email and we send a 6-digit code. No password, no wallet needed today.

+

+ + + + + + + + + +

Advertising, not investing. No income is guaranteed; results depend on your effort. Crypto carries risk of loss.

+
+ +
+ +
+
+ Paid in POL, Polygon's own coin, to your wallet + Same transaction payouts + Public ledger on Polygon + Free to join by email +
+

The one crypto here is POL on the Polygon network: packages are paid in POL and every payout arrives as POL in your own wallet. Any Polygon wallet works (MetaMask, SafePal, Phantom, Coinbase Wallet). Never held crypto? Buy POL with a card inside the member area.

+
+
+

How it works

Three steps. The first one takes a minute and costs nothing.

+
+
STEP 1

Join free by email

A 6-digit code, no password. You get an invite link and welcome credits to try real ads.

+
STEP 2

Advertise or earn

Seven ad formats. View ads to earn credits, or buy a package from $5 when you want reach.

+
STEP 3

Get paid in the same transaction

Activate with the $20 starter package and switch on payouts, and anyone who buys through your link pays you 50 percent, on-chain, the moment it happens.

+
+
+
+

The packages

Priced in dollars, settled in POL at the live rate. One credit is one cent of ad delivery.

+
+

Every package pays 50 / 20 / 10 up the line the moment it sells, on a public ledger. Join free and look around first.

+
+ +
+ InstantAdPay · Contract · Terms · Privacy · Disclaimer +
+
+ + + + diff --git a/public/launch.html b/public/launch.html index b485cc1..edb2347 100644 --- a/public/launch.html +++ b/public/launch.html @@ -1,110 +1,110 @@ - - - - -Founding week checklist | InstantAdPay - - - - - - - - - -
-
-

Leaders · founding week

-

Eight things before launch day.

-

Get these done this week, in this order, and your first commissions land in your wallet instead of climbing past you. Everything here reads from your live account.

-
- -

Members only

Sign in to your member area to open the checklist. Sign in

- -
-
-
0 of 8 ready
- - -
- -
- The one rule that makes this week matter: unqualified levels pass up. - Level 2 pays you only after two of your people have bought a $20 or more package. Level 3 only after five. If your team's team starts buying before you are qualified, those 20% and 10% payments climb to the next qualified member above you, or to the platform, and they never come back. Qualify first, then open the doors. -
- -
    - -

    The week, day by day

    -
    -
    Day 1
    • Items 1 to 3 done in one sitting.
    • Decide your play, and whether you are going for level 2 or all three.
    -
    Days 2 to 3
    • Qualify: two real buyers, or Qualified Start. Leaders: go to five and open level 3.
    • Line banner uploaded.
    -
    Days 4 to 6
    • Place your first two personally.
    • Walk them through items 1 to 3 on their accounts.
    -
    Launch day
    • Everyone releases links at the same time.
    • Watch the ledger and the Telegram proof feed fill.
    -
    - -

    What to send your two this week

    -
    Text or DM · before launchI'm bringing a small group in early on something before it opens publicly next week. Free to join, real advertising, and every payment lands in your own wallet the second it happens. I want you positioned before the doors open. Set up takes five minutes: your link
    -
    Text or DM · after they joinThree quick things before launch so your first commission lands with you and not past you: pick your username, link your wallet, switch on payouts. All on the Wallet and Profile tabs. Then send me your two names and we'll get them placed.
    - -

    Launch graphics and posts

    -

    Two images, no text on them but the headline, so they work anywhere. Post one with the day's line below it; your link and the FOUNDER code are already in each line.

    -
    -
    Doors open Monday
    Wide, 1200x630 · for X, Facebook, LinkedIn, link previews Download
    -
    Doors open Monday
    Square, 1080x1080 · for Instagram, Telegram, WhatsApp Download
    -
    -
    - -

    Launch week swipes: four emails for your list

    -

    Send one a day to your own list or contacts, in this order. Your invite link and the FOUNDER code (500 free credits for anyone who joins before Monday 9 AM Central) are already filled in. Copy, paste, send from your own email. Edit anything you like.

    -
    - -

    No income is guaranteed. Results depend on your effort. Crypto carries risk of loss. InstantAdPay sells advertising; it is not an investment.

    -
    - - -
    - - - - + + + + +Founding week checklist | InstantAdPay + + + + + + + + + +
    +
    +

    Leaders · founding week

    +

    Eight things before launch day.

    +

    Get these done this week, in this order, and your first commissions land in your wallet instead of climbing past you. Everything here reads from your live account.

    +
    + +

    Members only

    Sign in to your member area to open the checklist. Sign in

    + +
    +
    +
    0 of 8 ready
    + + +
    + +
    + The one rule that makes this week matter: unqualified levels pass up. + Level 2 pays you only after two of your people have bought a $20 or more package. Level 3 only after five. If your team's team starts buying before you are qualified, those 20% and 10% payments climb to the next qualified member above you, or to the platform, and they never come back. Qualify first, then open the doors. +
    + +
      + +

      The week, day by day

      +
      +
      Day 1
      • Items 1 to 3 done in one sitting.
      • Decide your play, and whether you are going for level 2 or all three.
      +
      Days 2 to 3
      • Qualify: two real buyers, or Qualified Start. Leaders: go to five and open level 3.
      • Line banner uploaded.
      +
      Days 4 to 6
      • Place your first two personally.
      • Walk them through items 1 to 3 on their accounts.
      +
      Launch day
      • Everyone releases links at the same time.
      • Watch the ledger and the Telegram proof feed fill.
      +
      + +

      What to send your two this week

      +
      Text or DM · before launchI'm bringing a small group in early on something before it opens publicly next week. Free to join, real advertising, and every payment lands in your own wallet the second it happens. I want you positioned before the doors open. Set up takes five minutes: your link
      +
      Text or DM · after they joinThree quick things before launch so your first commission lands with you and not past you: pick your username, link your wallet, switch on payouts. All on the Wallet and Profile tabs. Then send me your two names and we'll get them placed.
      + +

      Launch graphics and posts

      +

      Two images, no text on them but the headline, so they work anywhere. Post one with the day's line below it; your link and the FOUNDER code are already in each line.

      +
      +
      Doors open Monday
      Wide, 1200x630 · for X, Facebook, LinkedIn, link previews Download
      +
      Doors open Monday
      Square, 1080x1080 · for Instagram, Telegram, WhatsApp Download
      +
      +
      + +

      Launch week swipes: four emails for your list

      +

      Send one a day to your own list or contacts, in this order. Your invite link and the FOUNDER code (500 free credits for anyone who joins before Monday 9 AM Central) are already filled in. Copy, paste, send from your own email. Edit anything you like.

      +
      + +

      No income is guaranteed. Results depend on your effort. Crypto carries risk of loss. InstantAdPay sells advertising; it is not an investment.

      +
      + + +
      + + + + diff --git a/public/ledger.html b/public/ledger.html index 00b0586..f6d45f3 100644 --- a/public/ledger.html +++ b/public/ledger.html @@ -1,47 +1,47 @@ - - - - -Live ledger | InstantAdPay - - - - - - - - - - - - - - - - - -
      -
      -

      The ledger does not lie.

      -

      This page streams every payment the contract has ever made. If it is not here, - it did not happen. Every line carries a verify link straight to the block explorer. Go click one.

      -

      connecting… -

      -
      - -
      -
      -
      Loading recent history…
      -
      -
      - - -
      - - - - - - + + + + +Live ledger | InstantAdPay + + + + + + + + + + + + + + + + + +
      +
      +

      The ledger does not lie.

      +

      This page streams every payment the contract has ever made. If it is not here, + it did not happen. Every line carries a verify link straight to the block explorer. Go click one.

      +

      connecting… +

      +
      + +
      +
      +
      Loading recent history…
      +
      +
      + + +
      + + + + + + diff --git a/public/my.html b/public/my.html index 7cc0abf..b82de49 100644 --- a/public/my.html +++ b/public/my.html @@ -1,1079 +1,1079 @@ - - - - -Member area | InstantAdPay - - - - - - - -

      Loading your account…

      - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Member area | InstantAdPay + + + + + + + +

      Loading your account…

      + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/partners.html b/public/partners.html index 5f122e1..cb9d61c 100644 --- a/public/partners.html +++ b/public/partners.html @@ -1,134 +1,134 @@ - - - - -For site owners | InstantAdPay - - - - - - - - - -
      -
      -

      For site owners with a downline builder

      -

      I built the ad platform I always wanted to run. I want it in your builder.

      -

      A note from me, plus everything you need to list InstantAdPay in your builder and hand your members free ad credits with a code of your own.

      -
      - -

      - -
      -

      Watch first: the whole platform in about five minutes. Free and paid members, the seven ad formats, how people get paid, and the offer for your builder.

      - -

      Why I built it

      -

      You know I've been running ad sites for years, the kind your members already know: buy a package, run banners and text ads, click for credits. Two of mine, Faucet Wave and Tier One Ads, ran on a licensed script. The vendor went out of business, their license server went dark, and it crippled licenses that were fully paid. The sites died overnight and nothing I could do would bring them back.

      -

      So I built InstantAdPay from scratch as part of the Crypto Team Build Network. No vendor, no license server, and the part that always went wrong on ad sites, the money, is handled by a verified smart contract on Polygon instead of by me. When a package sells, the contract splits the payment and sends it in the same transaction. I never hold member funds, so there is no back office, no payday, and nothing anyone can switch off.

      -

      Marty Bostick · Crypto Team Build Network

      - -

      What InstantAdPay is

      -

      An advertising platform where the ad spend in your line pays you. Members join free with an email address, no password and no wallet on day one. They earn credits by viewing ads and can run their first campaign for zero dollars. When they want more reach they buy an ad package, and every package that sells is split by the contract the moment it sells.

      -
      -

      Seven ad formats

      Banners, text ads, login ads, solo ads to member inboxes, video, featured links and verified visits. Views are timed on the server, so a real person saw the ad.

      -

      Beyond the site

      Banner and text ads also push out to Network Ad Space, a partner rotation across other member sites. Those impressions count in the member's stats.

      -

      WalletConnect built in

      Full WalletConnect integration: members link MetaMask, Trust, Phantom, SafePal or any WalletConnect wallet with one tap, sign once, and buy or get paid straight from that wallet. No custody on my side.

      -

      Public, verified, immutable

      Every payout is a public transaction on Polygon. The split percentages and qualification rules are constants in a verified contract that the operator cannot change.

      -
      - -

      How the money moves

      -

      Every ad package splits the same way, in the same transaction it sells in:

      -
      -
      50%
      direct sponsor
      -
      20%
      level 2
      -
      10%
      level 3
      -
      20%
      platform
      -
      -

      On a $20 package: $10 to the direct sponsor, $4 to level 2, $2 to level 3, $4 to the platform. If a level has no qualified member, that share passes up to the next qualified person above.

      -

      Qualification is earned, never bought. Every direct buyer pays their sponsor 50% from their very first package. Two qualifying buyers, people who bought a $20 or larger package, open level 2. Five open level 3. Until a level opens, its share climbs to the next qualified member above, which is why the plan rewards the people who actually build.

      - - - - - - - -
      PackagePriceCredits
      Micro$5500
      Activation, the qualifying buy$202,000
      Builder$505,500
      Growth$10012,000
      Leader$25032,500
      - -

      What your members get

      -
        -
      • A free start. Join by email, view a few ads, earn credits, run a real banner or text campaign for nothing.
      • -
      • Your promo credits on top. Members who arrive with your code get free ad credits added the moment they join, in addition to everything else.
      • -
      • Instant, public payouts. When anyone in their line buys ads, the contract pays them in POL to their own wallet in the same transaction. They can check every payment on Polygonscan.
      • -
      • A seamless wallet step. Full WalletConnect integration means linking a wallet is one tap and one free signature from any major wallet app, and purchases confirm inside the wallet they already use.
      • -
      • Tools that do the work. A ready-to-send invite message, social posts, email swipes, a full banner kit, objection answers, and a public profile wall with their own banner slots.
      • -
      • Training that keeps growing. A video series that walks the whole member area, plus written plays for building a line.
      • -
      • A holding tank. Members who arrive without a sponsor are not lost. Qualified builders adopt them, first come, first served.
      • -
      • Coaching built in. A next-move card on every dashboard, nudges when a referral stalls, and a live payments topic on Telegram where every payout posts as it lands.
      • -
      - -
      -

      What you get for listing it in your builder

      -
        -
      • Your spot at the top. You join directly under the company at the top, no sponsor in between. All it takes to claim that spot is activating your account with at least the $20 package, and that locks you in at the top of your own line from day one.
      • -
      • Your own promo code. A reusable code that adds free ad credits for every member who redeems it, on your builder link or in the dashboard. I set the credit amount, an optional cap and an optional expiry. One redemption per account, every redemption logged, and you can see uses any time.
      • -
      • Your own line. Every member who comes through your builder link lands under you. Each one who buys pays you 50% of their first package and every package after it, and their buyers open your level 2 and level 3 shares.
      • -
      • Ready-made creatives. Banners in every builder size (468x60, 728x90, 300x250, 160x600, 120x600, 1200x630), text ad copy, email swipes and a program description you can paste into your listing.
      • -
      • A bridge page for your brand, on request. A landing page in this design that names your site, explains the connection, and carries your code.
      • -
      • Attribution you can check. Signups and buyers are tagged with the source they came from, and the promo code report shows exactly who redeemed yours.
      • -
      -
      - -

      Setting it up takes about fifteen minutes

      -
        -
      1. Claim your spot with the button below. It places you directly under the company at the top. Join with your email and pick your username; your own invite link is live immediately: instantadpay.com/join/yourname.
      2. -
      3. Send me your username and the site you are listing it on. I mint your code with the credit amount we agree on.
      4. -
      5. Add InstantAdPay to your downline builder with your link plus the code: https://instantadpay.com/join/yourname?promo=YOURCODE. Members who click it land under you and their credits apply the moment their account exists.
      6. -
      7. Use the banners and text ads from the kit. Members who already have an account can type the code into the "Have a promo code?" box on their Overview.
      8. -
      9. Link a wallet, switch on payouts, and activate with at least the $20 package. That claims your spot at the top and makes you a qualifying buyer in your own right.
      10. -
      - -
      - Claim your spot at the top -

      Free account by email. No password, no wallet today. The link below places you directly under the company.

      - Claim my spot -
      - -

      The honest part

      -

      InstantAdPay sells advertising. Members earn from the ad packages people in their line buy, and nothing else. There is no earn-without-referring option, on purpose, because sites that pay you just for buying in are the ones that collapse. No income is guaranteed, results depend on effort, and cryptocurrency involves risk of loss. The contract, the ledger and every payout are public, so you never have to take my word for any of it.

      -

      Marty Bostick · marty@marketingwithmarty.com · t.me/cryptoteambuild

      - -
      -
      InstantAdPay · home · live ledger · the contract
      -
      Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford to lose.
      -
      -
      - - - - + + + + +For site owners | InstantAdPay + + + + + + + + + +
      +
      +

      For site owners with a downline builder

      +

      I built the ad platform I always wanted to run. I want it in your builder.

      +

      A note from me, plus everything you need to list InstantAdPay in your builder and hand your members free ad credits with a code of your own.

      +
      + +

      + +
      +

      Watch first: the whole platform in about five minutes. Free and paid members, the seven ad formats, how people get paid, and the offer for your builder.

      + +

      Why I built it

      +

      You know I've been running ad sites for years, the kind your members already know: buy a package, run banners and text ads, click for credits. Two of mine, Faucet Wave and Tier One Ads, ran on a licensed script. The vendor went out of business, their license server went dark, and it crippled licenses that were fully paid. The sites died overnight and nothing I could do would bring them back.

      +

      So I built InstantAdPay from scratch as part of the Crypto Team Build Network. No vendor, no license server, and the part that always went wrong on ad sites, the money, is handled by a verified smart contract on Polygon instead of by me. When a package sells, the contract splits the payment and sends it in the same transaction. I never hold member funds, so there is no back office, no payday, and nothing anyone can switch off.

      +

      Marty Bostick · Crypto Team Build Network

      + +

      What InstantAdPay is

      +

      An advertising platform where the ad spend in your line pays you. Members join free with an email address, no password and no wallet on day one. They earn credits by viewing ads and can run their first campaign for zero dollars. When they want more reach they buy an ad package, and every package that sells is split by the contract the moment it sells.

      +
      +

      Seven ad formats

      Banners, text ads, login ads, solo ads to member inboxes, video, featured links and verified visits. Views are timed on the server, so a real person saw the ad.

      +

      Beyond the site

      Banner and text ads also push out to Network Ad Space, a partner rotation across other member sites. Those impressions count in the member's stats.

      +

      WalletConnect built in

      Full WalletConnect integration: members link MetaMask, Trust, Phantom, SafePal or any WalletConnect wallet with one tap, sign once, and buy or get paid straight from that wallet. No custody on my side.

      +

      Public, verified, immutable

      Every payout is a public transaction on Polygon. The split percentages and qualification rules are constants in a verified contract that the operator cannot change.

      +
      + +

      How the money moves

      +

      Every ad package splits the same way, in the same transaction it sells in:

      +
      +
      50%
      direct sponsor
      +
      20%
      level 2
      +
      10%
      level 3
      +
      20%
      platform
      +
      +

      On a $20 package: $10 to the direct sponsor, $4 to level 2, $2 to level 3, $4 to the platform. If a level has no qualified member, that share passes up to the next qualified person above.

      +

      Qualification is earned, never bought. Every direct buyer pays their sponsor 50% from their very first package. Two qualifying buyers, people who bought a $20 or larger package, open level 2. Five open level 3. Until a level opens, its share climbs to the next qualified member above, which is why the plan rewards the people who actually build.

      + + + + + + + +
      PackagePriceCredits
      Micro$5500
      Activation, the qualifying buy$202,000
      Builder$505,500
      Growth$10012,000
      Leader$25032,500
      + +

      What your members get

      +
        +
      • A free start. Join by email, view a few ads, earn credits, run a real banner or text campaign for nothing.
      • +
      • Your promo credits on top. Members who arrive with your code get free ad credits added the moment they join, in addition to everything else.
      • +
      • Instant, public payouts. When anyone in their line buys ads, the contract pays them in POL to their own wallet in the same transaction. They can check every payment on Polygonscan.
      • +
      • A seamless wallet step. Full WalletConnect integration means linking a wallet is one tap and one free signature from any major wallet app, and purchases confirm inside the wallet they already use.
      • +
      • Tools that do the work. A ready-to-send invite message, social posts, email swipes, a full banner kit, objection answers, and a public profile wall with their own banner slots.
      • +
      • Training that keeps growing. A video series that walks the whole member area, plus written plays for building a line.
      • +
      • A holding tank. Members who arrive without a sponsor are not lost. Qualified builders adopt them, first come, first served.
      • +
      • Coaching built in. A next-move card on every dashboard, nudges when a referral stalls, and a live payments topic on Telegram where every payout posts as it lands.
      • +
      + +
      +

      What you get for listing it in your builder

      +
        +
      • Your spot at the top. You join directly under the company at the top, no sponsor in between. All it takes to claim that spot is activating your account with at least the $20 package, and that locks you in at the top of your own line from day one.
      • +
      • Your own promo code. A reusable code that adds free ad credits for every member who redeems it, on your builder link or in the dashboard. I set the credit amount, an optional cap and an optional expiry. One redemption per account, every redemption logged, and you can see uses any time.
      • +
      • Your own line. Every member who comes through your builder link lands under you. Each one who buys pays you 50% of their first package and every package after it, and their buyers open your level 2 and level 3 shares.
      • +
      • Ready-made creatives. Banners in every builder size (468x60, 728x90, 300x250, 160x600, 120x600, 1200x630), text ad copy, email swipes and a program description you can paste into your listing.
      • +
      • A bridge page for your brand, on request. A landing page in this design that names your site, explains the connection, and carries your code.
      • +
      • Attribution you can check. Signups and buyers are tagged with the source they came from, and the promo code report shows exactly who redeemed yours.
      • +
      +
      + +

      Setting it up takes about fifteen minutes

      +
        +
      1. Claim your spot with the button below. It places you directly under the company at the top. Join with your email and pick your username; your own invite link is live immediately: instantadpay.com/join/yourname.
      2. +
      3. Send me your username and the site you are listing it on. I mint your code with the credit amount we agree on.
      4. +
      5. Add InstantAdPay to your downline builder with your link plus the code: https://instantadpay.com/join/yourname?promo=YOURCODE. Members who click it land under you and their credits apply the moment their account exists.
      6. +
      7. Use the banners and text ads from the kit. Members who already have an account can type the code into the "Have a promo code?" box on their Overview.
      8. +
      9. Link a wallet, switch on payouts, and activate with at least the $20 package. That claims your spot at the top and makes you a qualifying buyer in your own right.
      10. +
      + +
      + Claim your spot at the top +

      Free account by email. No password, no wallet today. The link below places you directly under the company.

      + Claim my spot +
      + +

      The honest part

      +

      InstantAdPay sells advertising. Members earn from the ad packages people in their line buy, and nothing else. There is no earn-without-referring option, on purpose, because sites that pay you just for buying in are the ones that collapse. No income is guaranteed, results depend on effort, and cryptocurrency involves risk of loss. The contract, the ledger and every payout are public, so you never have to take my word for any of it.

      +

      Marty Bostick · marty@marketingwithmarty.com · t.me/cryptoteambuild

      + +
      +
      InstantAdPay · home · live ledger · the contract
      +
      Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford to lose.
      +
      +
      + + + + diff --git a/public/plays.html b/public/plays.html index 2d0ea8b..a797b89 100644 --- a/public/plays.html +++ b/public/plays.html @@ -1,198 +1,198 @@ - - - - -Team-building plays | InstantAdPay - - - - - - - - - -
      -
      -

      Member training

      -

      Three ways to build a line.

      -

      Pick one and run it. Every number here comes from the live contract and the rate table, not from a slide.

      -
      - -

      Members only

      Sign in to your member area to read the plays. Sign in

      - -
      -
      - The one rule under all three plays: unqualified levels pass up. - If someone on your level 2 buys before you have two qualifying buyers, that 20% does not wait for you. It goes to the next qualified sponsor above you, or to the platform. Same for level 3 and five. Whatever play you run, the first job is the same: get qualified before your line gets busy. -
      - -

      How a package splits, the moment it sells

      -
      -
      50%
      Direct sponsor
      -
      20%
      Level 2 · needs 2
      -
      10%
      Level 3 · needs 5
      -
      20%
      Platform
      -
      -

      The ladder on your Overview, and what each rung unlocks

      -
      -
      Rung 1
      Joined
      Welcome tour: 25 credits
      -
      Rung 2
      Payouts on
      Spark badge · 10 credits
      -
      Rung 3
      First buyer
      Surge · 25 credits · 50% starts
      -
      Rung 4
      2 qualifying
      Circuit · 50 credits · level 2 · wall position 2
      -
      Rung 5
      5 qualifying
      Nexus · 100 credits · level 3 · wall position 3
      -
      - -
      -

      Opening move · Qualified Start

      works with any play
      -

      Fits: anyone who would rather start qualified than wait for their first two buyers.

      -

      Qualification is earned by buyers, never bought. But you can be your own first buyers, openly. Under Buy packages, link a second wallet you own as a position. When it buys a $20 package the contract counts it as a qualifying buyer, half the purchase comes straight back to your main wallet, and its credits pool with yours. Two positions open level 2 the same day; five open level 3. Then run whichever play fits you with the ladder already climbed. The three Qualified Start videos in Training show every click.

      -
      -
      Net cost
      Level 2: about $20 net for $40 of ad credits. Level 3: about $50 net for $100 of credits. Plus a little POL for gas in each wallet.
      -
      Say it plainly
      Your own money, your own wallets, a faster start. Never an income promise: qualification only pays on future purchases in your line.
      -
      -
      - -
      -

      Play 1 · Wide and teach

      the fifty play
      -

      Fits: someone with an audience, a list, a group, or traffic they can point somewhere.

      -

      Every direct who buys is 50% to you, instantly, forever. Directs are the only thing that qualifies you. The teaching is what fills levels 2 and 3 without extra work from you: your directs' buyers are your 20%, their buyers are your 10%.

      -
        -
      1. One new conversation a day, minimum. Text a friend and Social posts in Promo tools already carry your link.
      2. -
      3. Send paid traffic to an angle lander, not the bare link. Add ?v=adspend for advertisers, ?v=free for freebie seekers, ?v=instant for the crypto-curious.
      4. -
      5. Every new direct gets the same three sentences inside 24 hours (sponsor chat or the daily broadcast): pick your username, link your wallet and switch on payouts, send your link to one person today. That is the whole teaching. They pass it down.
      6. -
      7. Run the network's own ads at your link. Buy a package or claim the daily 5 credits, then spend credits on a Featured link (40 credits a day) or a text ad pointed at your angle lander.
      8. -
      -
      -
      Scoreboard
      Joined your line climbing daily · Qualifying buyers 2, then 5 · level 2 and 3 rows appearing in My line
      -
      Ceiling and weakness
      No ceiling on width. Shallow lines churn if you skip step 3.
      -
      -
      - -
      -

      Play 2 · Two, then down

      the depth play
      -

      Fits: someone with a small circle who would rather coach two people well than pitch twenty.

      -

      Two qualifying buyers open level 2, wall position 2, the Circuit badge and 50 bonus credits. From there every person your two bring in pays you 20%, and every person those people bring in pays you 10% once you reach five. Your effort goes into two relationships instead of a funnel.

      -
        -
      1. Get two directs to a $20+ package. Sit with them on the buy if you have to. Trust Wallet needs a POL cushion; SafePal or MetaMask are smoother.
      2. -
      3. Coach them to their two. Sponsor chat daily for the first week. One broadcast a day to your directs with a single ask each time.
      4. -
      5. Set your line banner to your team's meeting place (a Telegram group, a training page). Every new member three levels down meets it on their welcome tour.
      6. -
      7. Keep adding directs until you have five. This is the catch: level 3 only opens on five qualifying directs of your own. Two deep, coached well, earns a healthy 20% level. It does not open the 10% level.
      8. -
      -
      -
      Scoreboard
      Qualifying buyers 2 · level 2 count in My line rising · your directs' own qualifying counts
      -
      Ceiling and strength
      Level 2 income until you personally hit five. The stickiest lines come from this play.
      -
      -
      - -
      -

      Recommended default

      -

      Play 3 · Five and wide

      the combination
      -

      Fits: anyone willing to do both. This is the play the dashboard ladder is actually built for.

      -
        -
      1. Sprint to five qualifying directs. Nothing else matters until level 3 is open: Nexus, wall position 3 (your whole public page runs your own links), 100 bonus credits, and the full 50 / 20 / 10.
      2. -
      3. Then split the day. Mornings wide: one new conversation, one post, one ad running. Evenings deep: read My line, message the three newest directs, send the broadcast.
      4. -
      5. Coach the 2-then-5 rule down the line. Each of your five gets pushed to two (your level 2 fills), then to five (your level 3 fills). Use the achievements Share links; people copy what they see rewarded.
      6. -
      7. Book the featured strip for 7 days whenever you have 280 credits spare. Ten slots a day, every member sees it.
      8. -
      -
      -
      Scoreboard
      All four Overview tiles, plus Earning levels: buyers referred, level open, how many to next
      -
      Why it wins
      Width qualifies you. Depth pays you on other people's effort. Only this play does both on purpose.
      -
      -
      - -
      -

      Which play fits you

      -
      - - - - -
      You haveRunFirst target
      A list, a group, or ad budgetWide and teachFive qualifying directs in 30 days
      A few close people and patienceTwo, then downTwo qualifying directs in 14 days, both coached to their two
      An hour a day and a phoneFive and wideFive qualifying, then one wide and one deep action every day
      -
      - -
      -

      First 30 days, any play

      -
      -
      Day 1
      Username. Wallet linked. Payouts on. Welcome tour done (25 credits). Link sent to one person.
      -
      Days 2 to 7
      One conversation a day. Claim the daily 5 credits. First buyer (25 bonus credits).
      -
      Days 8 to 14
      Second qualifying buyer. Level 2 open. Line banner set. First broadcast sent.
      -
      Days 15 to 30
      Coach the two to their two. Add directs three, four, five. Level 3 open by day 30 is the stretch goal.
      -
      -
      - -
      -

      Messages that fit each play

      -
      WideI run ads anyway. This one pays me in the same transaction the buyer's package sells, on a public ledger. Free to join by email: your link
      -
      DepthI need two people who will actually do this with me, not twenty who will look at it. You are one of the two I thought of. your link
      -
      Combination · to a new directThree things today: username, wallet on, one person. I will check in tomorrow.
      -
      - -

      No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

      -

      - -
      - -
      -

      InstantAdPay: Qualified Start checklist

      -
        -
      1. Username chosen (Profile tab). It is permanent: it becomes your invite link.
      2. -
      3. Main wallet linked (Wallet tab, one free signature).
      4. -
      5. Payouts switched on (Wallet tab, one free transaction).
      6. -
      7. Extra wallet accounts created in your wallet app: IAP Position 2, 3, 4, 5.
      8. -
      9. Each extra account funded with enough POL for a $20 package plus gas.
      10. -
      11. Buy packages: Add a position, tick only the new account, sign once.
      12. -
      13. Buy from: choose the position, Buy $20, confirm in the wallet.
      14. -
      15. Repeat. Two positions open level 2. Five open level 3 and the Nexus badge.
      16. -
      -

      First 30 days, any play

      -

      Day 1

      • Username, wallet linked, payouts on, welcome tour done.
      • Link sent to one person.
      -

      Days 2 to 7

      • One conversation a day.
      • Claim the daily 5 credits.
      • First buyer.
      -

      Days 8 to 14

      • Second qualifying buyer. Level 2 open.
      • Line banner set. First broadcast sent.
      -

      Days 15 to 30

      • Coach the two to their two.
      • Add directs three, four, five. Level 3 open by day 30 is the stretch goal.
      -

      My invite link: __________________________

      -

      No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

      -
      - -
      -
      InstantAdPay · back to Training · live ledger
      -
      Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.
      -
      -
      - - - - + + + + +Team-building plays | InstantAdPay + + + + + + + + + +
      +
      +

      Member training

      +

      Three ways to build a line.

      +

      Pick one and run it. Every number here comes from the live contract and the rate table, not from a slide.

      +
      + +

      Members only

      Sign in to your member area to read the plays. Sign in

      + +
      +
      + The one rule under all three plays: unqualified levels pass up. + If someone on your level 2 buys before you have two qualifying buyers, that 20% does not wait for you. It goes to the next qualified sponsor above you, or to the platform. Same for level 3 and five. Whatever play you run, the first job is the same: get qualified before your line gets busy. +
      + +

      How a package splits, the moment it sells

      +
      +
      50%
      Direct sponsor
      +
      20%
      Level 2 · needs 2
      +
      10%
      Level 3 · needs 5
      +
      20%
      Platform
      +
      +

      The ladder on your Overview, and what each rung unlocks

      +
      +
      Rung 1
      Joined
      Welcome tour: 25 credits
      +
      Rung 2
      Payouts on
      Spark badge · 10 credits
      +
      Rung 3
      First buyer
      Surge · 25 credits · 50% starts
      +
      Rung 4
      2 qualifying
      Circuit · 50 credits · level 2 · wall position 2
      +
      Rung 5
      5 qualifying
      Nexus · 100 credits · level 3 · wall position 3
      +
      + +
      +

      Opening move · Qualified Start

      works with any play
      +

      Fits: anyone who would rather start qualified than wait for their first two buyers.

      +

      Qualification is earned by buyers, never bought. But you can be your own first buyers, openly. Under Buy packages, link a second wallet you own as a position. When it buys a $20 package the contract counts it as a qualifying buyer, half the purchase comes straight back to your main wallet, and its credits pool with yours. Two positions open level 2 the same day; five open level 3. Then run whichever play fits you with the ladder already climbed. The three Qualified Start videos in Training show every click.

      +
      +
      Net cost
      Level 2: about $20 net for $40 of ad credits. Level 3: about $50 net for $100 of credits. Plus a little POL for gas in each wallet.
      +
      Say it plainly
      Your own money, your own wallets, a faster start. Never an income promise: qualification only pays on future purchases in your line.
      +
      +
      + +
      +

      Play 1 · Wide and teach

      the fifty play
      +

      Fits: someone with an audience, a list, a group, or traffic they can point somewhere.

      +

      Every direct who buys is 50% to you, instantly, forever. Directs are the only thing that qualifies you. The teaching is what fills levels 2 and 3 without extra work from you: your directs' buyers are your 20%, their buyers are your 10%.

      +
        +
      1. One new conversation a day, minimum. Text a friend and Social posts in Promo tools already carry your link.
      2. +
      3. Send paid traffic to an angle lander, not the bare link. Add ?v=adspend for advertisers, ?v=free for freebie seekers, ?v=instant for the crypto-curious.
      4. +
      5. Every new direct gets the same three sentences inside 24 hours (sponsor chat or the daily broadcast): pick your username, link your wallet and switch on payouts, send your link to one person today. That is the whole teaching. They pass it down.
      6. +
      7. Run the network's own ads at your link. Buy a package or claim the daily 5 credits, then spend credits on a Featured link (40 credits a day) or a text ad pointed at your angle lander.
      8. +
      +
      +
      Scoreboard
      Joined your line climbing daily · Qualifying buyers 2, then 5 · level 2 and 3 rows appearing in My line
      +
      Ceiling and weakness
      No ceiling on width. Shallow lines churn if you skip step 3.
      +
      +
      + +
      +

      Play 2 · Two, then down

      the depth play
      +

      Fits: someone with a small circle who would rather coach two people well than pitch twenty.

      +

      Two qualifying buyers open level 2, wall position 2, the Circuit badge and 50 bonus credits. From there every person your two bring in pays you 20%, and every person those people bring in pays you 10% once you reach five. Your effort goes into two relationships instead of a funnel.

      +
        +
      1. Get two directs to a $20+ package. Sit with them on the buy if you have to. Trust Wallet needs a POL cushion; SafePal or MetaMask are smoother.
      2. +
      3. Coach them to their two. Sponsor chat daily for the first week. One broadcast a day to your directs with a single ask each time.
      4. +
      5. Set your line banner to your team's meeting place (a Telegram group, a training page). Every new member three levels down meets it on their welcome tour.
      6. +
      7. Keep adding directs until you have five. This is the catch: level 3 only opens on five qualifying directs of your own. Two deep, coached well, earns a healthy 20% level. It does not open the 10% level.
      8. +
      +
      +
      Scoreboard
      Qualifying buyers 2 · level 2 count in My line rising · your directs' own qualifying counts
      +
      Ceiling and strength
      Level 2 income until you personally hit five. The stickiest lines come from this play.
      +
      +
      + +
      +

      Recommended default

      +

      Play 3 · Five and wide

      the combination
      +

      Fits: anyone willing to do both. This is the play the dashboard ladder is actually built for.

      +
        +
      1. Sprint to five qualifying directs. Nothing else matters until level 3 is open: Nexus, wall position 3 (your whole public page runs your own links), 100 bonus credits, and the full 50 / 20 / 10.
      2. +
      3. Then split the day. Mornings wide: one new conversation, one post, one ad running. Evenings deep: read My line, message the three newest directs, send the broadcast.
      4. +
      5. Coach the 2-then-5 rule down the line. Each of your five gets pushed to two (your level 2 fills), then to five (your level 3 fills). Use the achievements Share links; people copy what they see rewarded.
      6. +
      7. Book the featured strip for 7 days whenever you have 280 credits spare. Ten slots a day, every member sees it.
      8. +
      +
      +
      Scoreboard
      All four Overview tiles, plus Earning levels: buyers referred, level open, how many to next
      +
      Why it wins
      Width qualifies you. Depth pays you on other people's effort. Only this play does both on purpose.
      +
      +
      + +
      +

      Which play fits you

      +
      + + + + +
      You haveRunFirst target
      A list, a group, or ad budgetWide and teachFive qualifying directs in 30 days
      A few close people and patienceTwo, then downTwo qualifying directs in 14 days, both coached to their two
      An hour a day and a phoneFive and wideFive qualifying, then one wide and one deep action every day
      +
      + +
      +

      First 30 days, any play

      +
      +
      Day 1
      Username. Wallet linked. Payouts on. Welcome tour done (25 credits). Link sent to one person.
      +
      Days 2 to 7
      One conversation a day. Claim the daily 5 credits. First buyer (25 bonus credits).
      +
      Days 8 to 14
      Second qualifying buyer. Level 2 open. Line banner set. First broadcast sent.
      +
      Days 15 to 30
      Coach the two to their two. Add directs three, four, five. Level 3 open by day 30 is the stretch goal.
      +
      +
      + +
      +

      Messages that fit each play

      +
      WideI run ads anyway. This one pays me in the same transaction the buyer's package sells, on a public ledger. Free to join by email: your link
      +
      DepthI need two people who will actually do this with me, not twenty who will look at it. You are one of the two I thought of. your link
      +
      Combination · to a new directThree things today: username, wallet on, one person. I will check in tomorrow.
      +
      + +

      No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

      +

      + +
      + +
      +

      InstantAdPay: Qualified Start checklist

      +
        +
      1. Username chosen (Profile tab). It is permanent: it becomes your invite link.
      2. +
      3. Main wallet linked (Wallet tab, one free signature).
      4. +
      5. Payouts switched on (Wallet tab, one free transaction).
      6. +
      7. Extra wallet accounts created in your wallet app: IAP Position 2, 3, 4, 5.
      8. +
      9. Each extra account funded with enough POL for a $20 package plus gas.
      10. +
      11. Buy packages: Add a position, tick only the new account, sign once.
      12. +
      13. Buy from: choose the position, Buy $20, confirm in the wallet.
      14. +
      15. Repeat. Two positions open level 2. Five open level 3 and the Nexus badge.
      16. +
      +

      First 30 days, any play

      +

      Day 1

      • Username, wallet linked, payouts on, welcome tour done.
      • Link sent to one person.
      +

      Days 2 to 7

      • One conversation a day.
      • Claim the daily 5 credits.
      • First buyer.
      +

      Days 8 to 14

      • Second qualifying buyer. Level 2 open.
      • Line banner set. First broadcast sent.
      +

      Days 15 to 30

      • Coach the two to their two.
      • Add directs three, four, five. Level 3 open by day 30 is the stretch goal.
      +

      My invite link: __________________________

      +

      No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

      +
      + +
      +
      InstantAdPay · back to Training · live ledger
      +
      Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.
      +
      +
      + + + + diff --git a/public/privacy.html b/public/privacy.html index 6eedc32..289c3cb 100644 --- a/public/privacy.html +++ b/public/privacy.html @@ -1,35 +1,35 @@ - - - - -Privacy Policy | InstantAdPay - - - - - - -
      -

      Privacy Policy

      Last updated: September 2026

      -
      -

      What we collect

      -

      A minimal set: the email you sign up with, a username and any profile details you choose to add (avatar, bio, social links), and, only if you link one, your public wallet address. Campaign content you create and reports you submit are stored to run the service. We also read on-chain activity that is already public on the blockchain.

      -

      What we do not collect

      -

      We never take custody of your funds or private keys, and we do not sell your personal data.

      -

      How we use it

      -

      To run your account, deliver and measure ads, attribute referrals, send service and notification emails (payouts, messages, onboarding), and keep the Platform secure. You can set your email and chat notification preferences in your dashboard.

      -

      Cookies

      -

      We use a session cookie to keep you signed in, a referral cookie to credit the sponsor whose link you arrived through, and a browser identifier cookie used only to enforce one account per person. No third-party ad-tracking cookies.

      -

      Abuse prevention. When you create an account and when you sign in we record your IP address, browser type and the browser identifier. We use them to detect duplicate accounts and self-referral, which the Terms prohibit, and for nothing else. They are visible to the site administrator only and are not sold or shared.

      -

      Sharing

      -

      Your username, public profile, and public wall are visible to others by design, and on-chain transactions are public by nature. We share data with infrastructure providers (hosting, email delivery) only as needed to operate the service, and when required by law.

      -

      Your choices

      -

      You can edit your profile, adjust notification and chat settings, and request account deletion by contacting us. Note that on-chain records cannot be deleted by anyone.

      -

      Security

      -

      We use reasonable safeguards, but no system is perfectly secure. Protect your email and your wallet.

      -
      -
      - - - - + + + + +Privacy Policy | InstantAdPay + + + + + + +
      +

      Privacy Policy

      Last updated: September 2026

      +
      +

      What we collect

      +

      A minimal set: the email you sign up with, a username and any profile details you choose to add (avatar, bio, social links), and, only if you link one, your public wallet address. Campaign content you create and reports you submit are stored to run the service. We also read on-chain activity that is already public on the blockchain.

      +

      What we do not collect

      +

      We never take custody of your funds or private keys, and we do not sell your personal data.

      +

      How we use it

      +

      To run your account, deliver and measure ads, attribute referrals, send service and notification emails (payouts, messages, onboarding), and keep the Platform secure. You can set your email and chat notification preferences in your dashboard.

      +

      Cookies

      +

      We use a session cookie to keep you signed in, a referral cookie to credit the sponsor whose link you arrived through, and a browser identifier cookie used only to enforce one account per person. No third-party ad-tracking cookies.

      +

      Abuse prevention. When you create an account and when you sign in we record your IP address, browser type and the browser identifier. We use them to detect duplicate accounts and self-referral, which the Terms prohibit, and for nothing else. They are visible to the site administrator only and are not sold or shared.

      +

      Sharing

      +

      Your username, public profile, and public wall are visible to others by design, and on-chain transactions are public by nature. We share data with infrastructure providers (hosting, email delivery) only as needed to operate the service, and when required by law.

      +

      Your choices

      +

      You can edit your profile, adjust notification and chat settings, and request account deletion by contacting us. Note that on-chain records cannot be deleted by anyone.

      +

      Security

      +

      We use reasonable safeguards, but no system is perfectly secure. Protect your email and your wallet.

      +
      +
      + + + + diff --git a/public/terms.html b/public/terms.html index 15b5c01..26faa72 100644 --- a/public/terms.html +++ b/public/terms.html @@ -1,43 +1,43 @@ - - - - -Terms of Service | InstantAdPay - - - - - - -
      -

      Terms of Service

      Last updated: September 2026

      -
      -

      Please read these Terms carefully. By creating an account or using InstantAdPay ("the Platform"), you agree to them. If you do not agree, do not use the Platform.

      -

      1. What InstantAdPay is

      -

      InstantAdPay is an advertising platform with a referral program. Members buy advertising packages that mint on-chain ad credits and are delivered as banner, text, video, solo, featured, and verified-visit placements. Payments between members are split by an immutable smart contract and settle directly to members' own wallets. InstantAdPay is not a bank, an investment product, a security, or a money-transmission service.

      -

      2. Eligibility

      -

      You must be at least 18 and legally able to enter contracts where you live. You are responsible for complying with the laws of your jurisdiction, including any that restrict crypto activity. You may not use the Platform where doing so is unlawful.

      -

      3. Accounts

      -

      You join free with an email. Keep your access secure; you are responsible for activity under your account. Your wallet is your own. We never hold, custody, or control your funds or private keys.

      -

      One account per person. Each person may hold exactly one InstantAdPay account. Opening or operating a second account, under any email, name or wallet, is not allowed, and neither is referring yourself through another account. The one sanctioned way to hold more than one position is Qualified Start: extra wallets linked inside your single account, where they are visible as yours. Duplicate accounts may be merged, suspended or closed at our discretion; credits, prizes and contest rankings earned through a duplicate account are forfeited. On-chain payments already made by the contract cannot be reversed by anyone, including us.

      -

      4. Purchases and the smart contract

      -

      Package purchases execute on the blockchain. On-chain transactions are final and irreversible. Prices are shown in USD and settled in the network token at the live rate at the moment of purchase. The contract splits each purchase and pays members' wallets in the same transaction; InstantAdPay never touches the money. You are responsible for network fees.

      -

      5. Referrals and qualification

      -

      Referral earnings depend on real purchases in your line and on the qualification rules published on the site and enforced by the contract. Nobody earns unless real advertising is bought. We do not promise or guarantee any income.

      -

      6. Advertising rules

      -

      Ads you submit must be lawful and must not be deceptive, adult, hateful, malicious, or infringing. Ads are auto-approved for speed; we may remove or pause any ad or campaign at any time, and members can report ads for review. You are solely responsible for the ads you run and the sites they point to.

      -

      7. Acceptable use

      -

      No fraud, bots, fake traffic, self-dealing to farm rewards, multiple or duplicate accounts, self-referral through another account, attempts to manipulate the contract, or abuse of other members. We may suspend or terminate accounts that break these rules.

      -

      8. No warranty

      -

      The Platform is provided "as is," without warranties of any kind. Blockchains, wallets, oracles, and third-party sites can fail or behave unexpectedly. We do not guarantee uptime, delivery volumes, or results.

      -

      9. Limitation of liability

      -

      To the fullest extent permitted by law, InstantAdPay and its operators are not liable for indirect, incidental, or consequential damages, or for losses arising from crypto volatility, irreversible transactions, third-party sites, or your own decisions.

      -

      10. Changes and termination

      -

      We may update these Terms and the Platform, and continued use means you accept the changes. We may discontinue features. The immutable contract's rules cannot be changed by anyone, including us.

      -

      See also the Disclaimer and Privacy Policy.

      -
      -
      - - - - + + + + +Terms of Service | InstantAdPay + + + + + + +
      +

      Terms of Service

      Last updated: September 2026

      +
      +

      Please read these Terms carefully. By creating an account or using InstantAdPay ("the Platform"), you agree to them. If you do not agree, do not use the Platform.

      +

      1. What InstantAdPay is

      +

      InstantAdPay is an advertising platform with a referral program. Members buy advertising packages that mint on-chain ad credits and are delivered as banner, text, video, solo, featured, and verified-visit placements. Payments between members are split by an immutable smart contract and settle directly to members' own wallets. InstantAdPay is not a bank, an investment product, a security, or a money-transmission service.

      +

      2. Eligibility

      +

      You must be at least 18 and legally able to enter contracts where you live. You are responsible for complying with the laws of your jurisdiction, including any that restrict crypto activity. You may not use the Platform where doing so is unlawful.

      +

      3. Accounts

      +

      You join free with an email. Keep your access secure; you are responsible for activity under your account. Your wallet is your own. We never hold, custody, or control your funds or private keys.

      +

      One account per person. Each person may hold exactly one InstantAdPay account. Opening or operating a second account, under any email, name or wallet, is not allowed, and neither is referring yourself through another account. The one sanctioned way to hold more than one position is Qualified Start: extra wallets linked inside your single account, where they are visible as yours. Duplicate accounts may be merged, suspended or closed at our discretion; credits, prizes and contest rankings earned through a duplicate account are forfeited. On-chain payments already made by the contract cannot be reversed by anyone, including us.

      +

      4. Purchases and the smart contract

      +

      Package purchases execute on the blockchain. On-chain transactions are final and irreversible. Prices are shown in USD and settled in the network token at the live rate at the moment of purchase. The contract splits each purchase and pays members' wallets in the same transaction; InstantAdPay never touches the money. You are responsible for network fees.

      +

      5. Referrals and qualification

      +

      Referral earnings depend on real purchases in your line and on the qualification rules published on the site and enforced by the contract. Nobody earns unless real advertising is bought. We do not promise or guarantee any income.

      +

      6. Advertising rules

      +

      Ads you submit must be lawful and must not be deceptive, adult, hateful, malicious, or infringing. Ads are auto-approved for speed; we may remove or pause any ad or campaign at any time, and members can report ads for review. You are solely responsible for the ads you run and the sites they point to.

      +

      7. Acceptable use

      +

      No fraud, bots, fake traffic, self-dealing to farm rewards, multiple or duplicate accounts, self-referral through another account, attempts to manipulate the contract, or abuse of other members. We may suspend or terminate accounts that break these rules.

      +

      8. No warranty

      +

      The Platform is provided "as is," without warranties of any kind. Blockchains, wallets, oracles, and third-party sites can fail or behave unexpectedly. We do not guarantee uptime, delivery volumes, or results.

      +

      9. Limitation of liability

      +

      To the fullest extent permitted by law, InstantAdPay and its operators are not liable for indirect, incidental, or consequential damages, or for losses arising from crypto volatility, irreversible transactions, third-party sites, or your own decisions.

      +

      10. Changes and termination

      +

      We may update these Terms and the Platform, and continued use means you accept the changes. We may discontinue features. The immutable contract's rules cannot be changed by anyone, including us.

      +

      See also the Disclaimer and Privacy Policy.

      +
      +
      + + + + diff --git a/public/tx.html b/public/tx.html index e15c485..1beaf98 100644 --- a/public/tx.html +++ b/public/tx.html @@ -1,40 +1,40 @@ - - - - -Transaction | InstantAdPay - - - - - - -
      -
      -
      -

      One transaction, fully public

      -

      Pulled straight from the chain this site settles on. Every field below is read from the node, - not from our database.

      -
      -
      -

      looking it up… -

      -

      -
      - -
      - -
      - -

      ← Back to the live ledger · Read the contract review

      -
      -
      - - - - + + + + +Transaction | InstantAdPay + + + + + + +
      +
      +
      +

      One transaction, fully public

      +

      Pulled straight from the chain this site settles on. Every field below is read from the node, + not from our database.

      +
      +
      +

      looking it up… +

      +

      +
      + +
      + +
      + +

      ← Back to the live ledger · Read the contract review

      +
      +
      + + + + diff --git a/public/wall.html b/public/wall.html index 675d2a9..5587194 100644 --- a/public/wall.html +++ b/public/wall.html @@ -1,53 +1,53 @@ - - - - -Banner wall | InstantAdPay - - - - - - - -
      -
      -
      -

      InstantAdPay member wall

      -

      Advertise and earn. Paid on-chain, instantly.

      -

      Real ad packages from $5. Every payout arrives as POL on Polygon in your own wallet, in the same transaction the package sells, on a public ledger. Free to join by email, and this member is your sponsor if you join from here.

      -
      - - -
      -

      The line, three levels deep

      -

      Three positions, three levels — the exact levels the contract pays. Every banner here belongs - to a real member of this line, and every payment between them settles on-chain, instantly.

      -
      -
      - - -
      -

      Join this line

      -

      Free to join with just an email. Your wallet only comes out if you buy — - and payments go straight to member wallets, never through an admin.

      - -

      Join free through this wall

      -

      Watch the live ledger · Read the contract

      -
      -
      -
      - - - - + + + + +Banner wall | InstantAdPay + + + + + + + +
      +
      +
      +

      InstantAdPay member wall

      +

      Advertise and earn. Paid on-chain, instantly.

      +

      Real ad packages from $5. Every payout arrives as POL on Polygon in your own wallet, in the same transaction the package sells, on a public ledger. Free to join by email, and this member is your sponsor if you join from here.

      +
      + + +
      +

      The line, three levels deep

      +

      Three positions, three levels — the exact levels the contract pays. Every banner here belongs + to a real member of this line, and every payment between them settles on-chain, instantly.

      +
      +
      + + +
      +

      Join this line

      +

      Free to join with just an email. Your wallet only comes out if you buy — + and payments go straight to member wallets, never through an admin.

      + +

      Join free through this wall

      +

      Watch the live ledger · Read the contract

      +
      +
      +
      + + + + diff --git a/public/wallets.html b/public/wallets.html index 5838076..c00a873 100644 --- a/public/wallets.html +++ b/public/wallets.html @@ -1,127 +1,127 @@ - - - - -Wallets and buying POL | InstantAdPay - - - - - - - - - -
      -
      -

      Member training

      -

      Wallets, and buying POL.

      -

      Which wallet to use, how to set it up in five minutes, and how to buy POL with a debit or credit card through MoonPay so it lands in your own wallet.

      -
      - -

      Members only

      Sign in to your member area to read this guide. Sign in

      - -
      -
      - One coin, one network: POL on Polygon. - Packages are paid in POL and every payout arrives as POL in your own wallet. Nothing else is used. When you buy, choose POL on the Polygon network, never MATIC on Ethereum and never another chain. The site never holds your money: you pay the contract from your wallet and the contract pays your line in the same transaction. -
      - -

      Preferred wallets

      -

      Any wallet that supports the Polygon network works. These are the ones we have tested end to end.

      -
      -
      -

      MetaMask recommended

      -

      Browser extension on desktop, app on phone. The one to use for Qualified Start, because it lets you add extra accounts under the same wallet, one per position. Connects directly on desktop and through WalletConnect on mobile.

      - -
      -
      -

      Phantom

      -

      Clean phone and desktop apps, no purchase-size block. Good choice if you are new and only ever plan to run one position. One setup step: Phantom ships with Polygon switched off. Open Settings, then Active Networks (Developer Settings on some versions), and turn Polygon on before you connect. Until it is on, the connect and buy buttons here will fail or show the wrong network.

      - -
      -
      -

      SafePal

      -

      Phone app with a built-in card purchase option for POL. Connects through WalletConnect. Works well for members who do everything on a phone.

      - -
      -
      -

      Coinbase Wallet

      -

      The self-custody wallet from Coinbase, not the exchange account. Handy if you already buy crypto on Coinbase: buy POL there and send it to this wallet on the Polygon network.

      - -
      -
      -

      Trust Wallet works, with one catch

      -

      Trust Wallet blocks any purchase that would spend most of the POL in the wallet. You see a red "this transaction will drain your wallet" screen with no way past it. If you use Trust, keep about twice the package cost in POL, or buy a smaller package first. The extra POL stays yours. If a blocked attempt leaves the connection dead, open Wallet, tap Disconnect, then Connect again.

      - -
      -
      - -

      Set up a wallet in five minutes

      -
        -
      1. Install it from the official source only. MetaMask: metamask.io. Phantom: phantom.app. SafePal: safepal.io. Coinbase Wallet: wallet.coinbase.com. On a phone, use the app store listing those sites point to.
      2. -
      3. Create a new wallet and set a device password or PIN.
      4. -
      5. Write down the recovery phrase (12 or 24 words) on paper and keep it offline. Anyone who has those words has your money. Nobody from InstantAdPay will ever ask for them, and the site never sees them.
      6. -
      7. Make sure Polygon is available. MetaMask asks to switch to Polygon the first time InstantAdPay needs it; approve that. SafePal and Coinbase Wallet include Polygon already. Phantom has Polygon built in but switched off by default: Settings, then Active Networks, turn on Polygon.
      8. -
      9. Copy your address. It starts with 0x and is the same on every EVM network. This is where your POL goes and where your payouts arrive.
      10. -
      11. Link it in Members: open the Wallet tab, tap Connect, and sign the free message. Then Switch on payouts, one small transaction that registers your address with the contract. Do both before your people start buying, so their first purchase pays you.
      12. -
      - -

      Buy POL with a card through MoonPay

      -

      MoonPay is a licensed card-to-crypto service. You pay them, they send POL to your wallet. InstantAdPay is never in the middle of that payment.

      -

      Opens in a new tab with POL on Polygon selected.

      -
        -
      1. Have your wallet connected first (Wallet tab). Then open Buy packages and look at the live POL price for the package you want. Plan to buy that amount plus 2 or 3 POL for network fees. Trust Wallet users: buy about double.
      2. -
      3. Tap "Buy POL with a card" under the packages. MoonPay opens in a new tab with POL on Polygon selected and your own wallet address filled in. If for any reason it is not filled in, choose POL (Polygon) yourself and paste your address from step 5 above.
      4. -
      5. Enter the amount in dollars or POL and pay with a debit card, credit card, Apple Pay or Google Pay. MoonPay has a minimum order, usually around $30, so the $5 package on its own is below it. Buy enough for the package you actually want.
      6. -
      7. First time only: identity check. MoonPay asks for your email, phone and a photo ID. This is their legal requirement, not ours. It normally takes a few minutes; occasionally a review takes longer, and MoonPay emails you when it clears.
      8. -
      9. Wait for the POL to land. Usually a few minutes. Your wallet balance shows on the Wallet tab and next to your positions.
      10. -
      11. Go back to Buy packages and buy. The wallet asks you to confirm one transaction. The moment it settles, your credits are minted and your line is paid.
      12. -
      - -
      Already own crypto on an exchange? Coinbase, Kraken, Binance and most others sell POL. Withdraw it to your wallet address and pick the Polygon network on the withdrawal screen. Sending on the wrong network can lose the funds.
      -
      Prefer to buy inside the wallet? MetaMask, Trust, SafePal and Phantom all have a Buy button that uses MoonPay or a similar provider. Same rule: POL, Polygon network, your own address.
      - -

      Common questions

      -
      -
      Do I need a wallet to join?

      No. Join with your email. The wallet comes out only when you buy a package or switch on payouts.

      -
      How much POL do I need?

      The Buy packages tab shows the live POL cost of each package. Buy that plus 2 or 3 POL for fees. There is no other cost.

      -
      Why did MoonPay decline my card?

      Some banks block crypto purchases. Try a different card, Apple Pay or Google Pay, or buy on an exchange and withdraw to your wallet on Polygon.

      -
      Can I use the same wallet for more than one position?

      One address is one position on the contract. For Qualified Start, add extra accounts inside MetaMask, each with its own address, and link them on the Buy packages tab. The three Qualified Start videos in Training walk through it.

      -
      Where do my payouts go?

      To the wallet address you switched payouts on with, in the same transaction as the purchase that earned them. Nothing is held on the site.

      -
      - -

      Advertising, not investing. No income is guaranteed; results depend on your effort. Crypto transactions are irreversible and carry risk of loss. MoonPay is an independent, licensed provider; its fees and limits are its own.

      -
      - -
      -
      InstantAdPay · back to Training · Buy packages · Wallet
      -
      Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never share your recovery phrase.
      -
      -
      - - - - + + + + +Wallets and buying POL | InstantAdPay + + + + + + + + + +
      +
      +

      Member training

      +

      Wallets, and buying POL.

      +

      Which wallet to use, how to set it up in five minutes, and how to buy POL with a debit or credit card through MoonPay so it lands in your own wallet.

      +
      + +

      Members only

      Sign in to your member area to read this guide. Sign in

      + +
      +
      + One coin, one network: POL on Polygon. + Packages are paid in POL and every payout arrives as POL in your own wallet. Nothing else is used. When you buy, choose POL on the Polygon network, never MATIC on Ethereum and never another chain. The site never holds your money: you pay the contract from your wallet and the contract pays your line in the same transaction. +
      + +

      Preferred wallets

      +

      Any wallet that supports the Polygon network works. These are the ones we have tested end to end.

      +
      +
      +

      MetaMask recommended

      +

      Browser extension on desktop, app on phone. The one to use for Qualified Start, because it lets you add extra accounts under the same wallet, one per position. Connects directly on desktop and through WalletConnect on mobile.

      + +
      +
      +

      Phantom

      +

      Clean phone and desktop apps, no purchase-size block. Good choice if you are new and only ever plan to run one position. One setup step: Phantom ships with Polygon switched off. Open Settings, then Active Networks (Developer Settings on some versions), and turn Polygon on before you connect. Until it is on, the connect and buy buttons here will fail or show the wrong network.

      + +
      +
      +

      SafePal

      +

      Phone app with a built-in card purchase option for POL. Connects through WalletConnect. Works well for members who do everything on a phone.

      + +
      +
      +

      Coinbase Wallet

      +

      The self-custody wallet from Coinbase, not the exchange account. Handy if you already buy crypto on Coinbase: buy POL there and send it to this wallet on the Polygon network.

      + +
      +
      +

      Trust Wallet works, with one catch

      +

      Trust Wallet blocks any purchase that would spend most of the POL in the wallet. You see a red "this transaction will drain your wallet" screen with no way past it. If you use Trust, keep about twice the package cost in POL, or buy a smaller package first. The extra POL stays yours. If a blocked attempt leaves the connection dead, open Wallet, tap Disconnect, then Connect again.

      + +
      +
      + +

      Set up a wallet in five minutes

      +
        +
      1. Install it from the official source only. MetaMask: metamask.io. Phantom: phantom.app. SafePal: safepal.io. Coinbase Wallet: wallet.coinbase.com. On a phone, use the app store listing those sites point to.
      2. +
      3. Create a new wallet and set a device password or PIN.
      4. +
      5. Write down the recovery phrase (12 or 24 words) on paper and keep it offline. Anyone who has those words has your money. Nobody from InstantAdPay will ever ask for them, and the site never sees them.
      6. +
      7. Make sure Polygon is available. MetaMask asks to switch to Polygon the first time InstantAdPay needs it; approve that. SafePal and Coinbase Wallet include Polygon already. Phantom has Polygon built in but switched off by default: Settings, then Active Networks, turn on Polygon.
      8. +
      9. Copy your address. It starts with 0x and is the same on every EVM network. This is where your POL goes and where your payouts arrive.
      10. +
      11. Link it in Members: open the Wallet tab, tap Connect, and sign the free message. Then Switch on payouts, one small transaction that registers your address with the contract. Do both before your people start buying, so their first purchase pays you.
      12. +
      + +

      Buy POL with a card through MoonPay

      +

      MoonPay is a licensed card-to-crypto service. You pay them, they send POL to your wallet. InstantAdPay is never in the middle of that payment.

      +

      Opens in a new tab with POL on Polygon selected.

      +
        +
      1. Have your wallet connected first (Wallet tab). Then open Buy packages and look at the live POL price for the package you want. Plan to buy that amount plus 2 or 3 POL for network fees. Trust Wallet users: buy about double.
      2. +
      3. Tap "Buy POL with a card" under the packages. MoonPay opens in a new tab with POL on Polygon selected and your own wallet address filled in. If for any reason it is not filled in, choose POL (Polygon) yourself and paste your address from step 5 above.
      4. +
      5. Enter the amount in dollars or POL and pay with a debit card, credit card, Apple Pay or Google Pay. MoonPay has a minimum order, usually around $30, so the $5 package on its own is below it. Buy enough for the package you actually want.
      6. +
      7. First time only: identity check. MoonPay asks for your email, phone and a photo ID. This is their legal requirement, not ours. It normally takes a few minutes; occasionally a review takes longer, and MoonPay emails you when it clears.
      8. +
      9. Wait for the POL to land. Usually a few minutes. Your wallet balance shows on the Wallet tab and next to your positions.
      10. +
      11. Go back to Buy packages and buy. The wallet asks you to confirm one transaction. The moment it settles, your credits are minted and your line is paid.
      12. +
      + +
      Already own crypto on an exchange? Coinbase, Kraken, Binance and most others sell POL. Withdraw it to your wallet address and pick the Polygon network on the withdrawal screen. Sending on the wrong network can lose the funds.
      +
      Prefer to buy inside the wallet? MetaMask, Trust, SafePal and Phantom all have a Buy button that uses MoonPay or a similar provider. Same rule: POL, Polygon network, your own address.
      + +

      Common questions

      +
      +
      Do I need a wallet to join?

      No. Join with your email. The wallet comes out only when you buy a package or switch on payouts.

      +
      How much POL do I need?

      The Buy packages tab shows the live POL cost of each package. Buy that plus 2 or 3 POL for fees. There is no other cost.

      +
      Why did MoonPay decline my card?

      Some banks block crypto purchases. Try a different card, Apple Pay or Google Pay, or buy on an exchange and withdraw to your wallet on Polygon.

      +
      Can I use the same wallet for more than one position?

      One address is one position on the contract. For Qualified Start, add extra accounts inside MetaMask, each with its own address, and link them on the Buy packages tab. The three Qualified Start videos in Training walk through it.

      +
      Where do my payouts go?

      To the wallet address you switched payouts on with, in the same transaction as the purchase that earned them. Nothing is held on the site.

      +
      + +

      Advertising, not investing. No income is guaranteed; results depend on your effort. Crypto transactions are irreversible and carry risk of loss. MoonPay is an independent, licensed provider; its fees and limits are its own.

      +
      + +
      +
      InstantAdPay · back to Training · Buy packages · Wallet
      +
      Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never share your recovery phrase.
      +
      +
      + + + + diff --git a/qa/earn.mjs b/qa/earn.mjs index e398576..e855d9d 100644 --- a/qa/earn.mjs +++ b/qa/earn.mjs @@ -1,119 +1,120 @@ -// InstantAdPay QA harness: earning flows, driven end to end on a LOCAL copy. -// node qa/earn.mjs -// Seeds house ads through the admin API (needs ADMIN_PASSWORD of the local server), signs in a fresh -// member, then runs: Watch ads x5 (incl. one wrong captcha pick) + daily claim, Watch videos, Verified -// visits, Inbox solo read + claim. Reports credited amounts and any trip-ups (e.g. a check button -// covered by the overlay's close button). Dwell timers run for real, so allow ~2 minutes. -// Env: LOCAL (default http://127.0.0.1:8797), ADMIN_PASSWORD (default localtest), OUT, PW -// Exit code 1 when a flow that had inventory failed to credit. -import { pathToFileURL } from 'node:url'; -import fs from 'node:fs'; -const PW = process.env.PW || 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright'; -const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default; -const B = process.env.LOCAL || 'http://127.0.0.1:8797'; -const OUT = process.env.OUT || 'qa/out'; -const ADMIN = process.env.ADMIN_PASSWORD || 'localtest'; -fs.mkdirSync(OUT, { recursive: true }); -const CAP = { rocket: '🚀', 'lightning bolt': '⚡', key: '🔑', target: '🎯', wave: '🌊', flame: '🔥', diamond: '💎', magnet: '🧲', bell: '🔔', moon: '🌙' }; -const lines = []; const log = (...a) => { const s = a.join(' '); console.log(s); lines.push(s); }; -const problems = []; -const browser = await chromium.launch(); -const ctx = await browser.newContext({ viewport: { width: 1280, height: 950 } }); -const page = await ctx.newPage(); -page.on('dialog', d => d.accept()); -const api = async (p, body) => (await page.request.fetch(B + p, body ? { method: 'POST', data: body } : {})).json(); - -// seeds: targets must be public and frameable (rmcircle.team sends frame-ancestors *) -const seeds = [ - { type: 'text', name: 'QA text 1', targetUrl: 'https://rmcircle.team/', title: 'Text one', body: 'Body one', budget: 1000 }, - { type: 'text', name: 'QA text 2', targetUrl: 'https://rmcircle.team/how-pay-works', title: 'Text two', body: 'Body two', budget: 1000 }, - { type: 'banner', name: 'QA banner', targetUrl: 'https://rmcircle.team/start', imageUrl: 'https://rmcircle.team/banners/rmc-728x90-v1.png', size: '728x90', budget: 1000 }, - { type: 'video', name: 'QA video', targetUrl: 'https://rmcircle.team/', videoUrl: process.env.QA_VIDEO_URL || 'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm', videoW: 960, videoH: 540, watchSecs: 10, title: 'QA clip', budget: 1000 }, - { type: 'visits', name: 'QA visits', targetUrl: 'https://rmcircle.team/contract', title: 'Visit the contract page', count: 20 }, - { type: 'solo', name: 'QA solo', targetUrl: 'https://rmcircle.team/contract', title: 'QA solo subject line', body: '

      This is a QA solo ad body with enough characters to pass validation for the inbox test run.

      ', ctaLabel: 'See it', budget: 100 } -]; -for (const sd of seeds) { - const r = await (await page.request.post(B + '/api/admin/campaigns', { headers: { Authorization: 'Bearer ' + ADMIN }, data: sd })).json(); - log('seed', sd.type, r.ok ? '#' + r.campaign.id + ' ' + r.campaign.status : 'FAIL ' + r.error); - if (!r.ok) problems.push('seed ' + sd.type + ': ' + r.error); -} -await page.goto(B + '/my', { waitUntil: 'networkidle' }); -await page.fill('#mcEmail', 'qa-earn@example.com'); await page.click('#mcSendBtn'); await page.waitForSelector('#mcVerifyBtn:not([hidden])'); await page.click('#mcVerifyBtn'); await page.waitForTimeout(2000); -if (await page.$('#onboardModal:not([hidden])')) { await page.fill('#obUsername', 'qaearner'); await page.click('#obSave'); await page.waitForTimeout(1000); } -await page.evaluate(() => { document.querySelectorAll('.modal-back,.lgate').forEach(m => m.hidden = true); }); -const start = await api('/api/my/earn'); log('start:', JSON.stringify(start)); - -// Watch ads -await page.click('.bo-menu [data-pane="earn"]'); await page.waitForTimeout(800); -await page.click('.subtabs [data-earn="watch"]'); await page.waitForTimeout(500); -let credited = 0; -for (let i = 0; i < 5; i++) { - await page.click('#earnStartBtn'); await page.waitForTimeout(1200); - const fr = page.frames().find(f => f.url().includes('/view/')); - if (!fr) { log('AD ' + (i + 1) + ': viewer did not open; box says:', (await page.textContent('#earnAdBox')).trim()); problems.push('watch: viewer did not open'); break; } - const t0 = Date.now(); - try { await fr.waitForSelector('#vCheck.on', { timeout: 30000 }); } catch (e) { log('AD ' + (i + 1) + ': check never appeared:', await fr.textContent('#vMsg')); problems.push('watch: check never appeared'); break; } - const secs = ((Date.now() - t0) / 1000).toFixed(1); - if (i === 1) { // trip-up: wrong pick first - const name = ((await fr.textContent('#vPrompt')).match(/Click the (.+):/) || [])[1]; - for (const o of await fr.$$('#vOpts button')) { if ((await o.textContent()) !== CAP[name]) { await o.click(); break; } } - await fr.waitForTimeout(700); log(' wrong pick handled:', (await fr.textContent('#vMsg')).trim()); - } - const name2 = ((await fr.textContent('#vPrompt')).match(/Click the (.+):/) || [])[1]; - const hit = await fr.evaluate(want => { const b = [...document.querySelectorAll('#vOpts button')].find(x => x.textContent === want); if (!b) return null; const r = b.getBoundingClientRect(); const top = document.elementFromPoint(r.left + r.width / 2, r.top + r.height / 2); const covered = !!(top && top !== b && !b.contains(top)); b.click(); return { covered, by: covered ? top.tagName + '#' + top.id : '' }; }, CAP[name2]); - if (hit && hit.covered) { log(' TRIP-UP: correct answer button covered by', hit.by); problems.push('watch: answer button covered by ' + hit.by); } - await fr.waitForTimeout(900); - const timer = await fr.textContent('#vTimer'); if (/credited/.test(timer)) credited++; - log('AD ' + (i + 1) + ': check after ' + secs + 's | ' + timer + ' | ' + (await fr.textContent('#vMsg')).trim()); - await page.evaluate(() => { const o = document.getElementById('adOverlay'); if (o) o.querySelector('button').click(); }); await page.waitForTimeout(700); -} -await page.waitForTimeout(800); -log('after set:', await page.textContent('#earnProgress'), '| claim visible:', !!(await page.$('#earnClaimBtn:not([hidden])'))); -if (await page.$('#earnStartBtn:not([hidden])')) { await page.click('#earnStartBtn'); await page.waitForTimeout(900); log('view-after-complete says:', (await page.textContent('#earnAdBox')).trim()); } -else log('view button hidden after the set (done screen with claim), as designed since 2026-09-12'); -if (await page.$('#earnClaimBtn:not([hidden])')) { await page.click('#earnClaimBtn'); await page.waitForTimeout(1000); log('claimed; balance:', await page.textContent('#earnBalance')); } -else if (credited === 5) problems.push('watch: 5 views credited but claim button not shown'); - -// Watch videos -await page.click('.subtabs [data-earn="videos"]'); await page.waitForTimeout(800); -await page.click('#vidStartBtn'); await page.waitForTimeout(2500); -const v1 = await page.evaluate(() => { const p = document.getElementById('vidPlayer'); return { paused: p.paused, t: p.currentTime, timer: document.getElementById('vidTimer').textContent }; }); -log('video after 2.5s:', JSON.stringify(v1)); -await page.waitForTimeout(23000); -const v2 = await page.evaluate(() => { const p = document.getElementById('vidPlayer'); return { t: p.currentTime, timer: document.getElementById('vidTimer').textContent, progress: document.getElementById('vidProgress').textContent }; }); -log('video after 25s:', JSON.stringify(v2), v2.t < 10 ? '(clip stalled in headless; verify on live with a real video)' : ''); - -// Verified visits -await page.click('.subtabs [data-earn="visits"]'); await page.waitForTimeout(800); -await page.click('#vsStartBtn'); await page.waitForTimeout(800); -log('visit loaded:', (await page.textContent('#vsBox')).trim().slice(0, 80)); -let popup = null; -if (await page.$('#vsVisit:not([hidden])')) { - [popup] = await Promise.all([ctx.waitForEvent('page', { timeout: 5000 }).catch(() => null), page.click('#vsVisit')]); - await page.waitForTimeout(10500); - const vp = (await page.textContent('#vsPrompt')) || ''; const vname = (vp.match(/Click the (.+):/) || [])[1]; - if (vname) { for (const b of await page.$$('#vsOpts button')) { if ((await b.textContent()) === CAP[vname]) { await b.click(); break; } } await page.waitForTimeout(900); } - const hint = (await page.textContent('#vsHint')).trim(); log('visit result:', hint, '|', await page.textContent('#vsProgress')); - if (!/credit/.test(hint)) problems.push('visits: not credited: ' + hint); - if (popup) await popup.close(); -} else { log('visits: nothing served'); problems.push('visits: nothing served'); } - -// Inbox -await page.click('.subtabs [data-earn="inbox"]'); await page.waitForTimeout(1200); -const rows = await page.$$('#ibList .ib-row'); log('inbox rows:', rows.length); -if (rows.length) { - await rows[0].click(); await page.waitForTimeout(900); - const [p2] = await Promise.all([ctx.waitForEvent('page', { timeout: 5000 }).catch(() => null), page.click('#ibVisit')]); if (p2) await p2.close(); - await page.bringToFront(); await page.waitForTimeout(12000); - const dis = await page.$eval('#ibClaimBtn', b => b.disabled); log('after 12s: claim btn =', await page.textContent('#ibClaimBtn'), '| disabled =', dis); - if (!dis) { await page.click('#ibClaimBtn'); await page.waitForTimeout(900); log('inbox claim:', (await page.textContent('#ibHint')).trim()); } - else problems.push('inbox: claim still disabled after dwell'); -} else problems.push('inbox: no solo delivered'); - -const fin = await api('/api/my/earn'); log('FINAL:', JSON.stringify(fin)); -await page.screenshot({ path: OUT + '/earn-final.png' }).catch(() => {}); -await browser.close(); -log('===== EARN FLOWS ' + new Date().toISOString() + ' ====='); -log(problems.length ? 'PROBLEMS: ' + problems.join(' | ') : 'ALL EARN FLOWS OK (video needs a real clip on live)'); -fs.writeFileSync(OUT + '/earn-report.txt', lines.join('\n') + '\n'); -process.exit(problems.length ? 1 : 0); +// InstantAdPay QA harness: earning flows, driven end to end on a LOCAL copy. +// node qa/earn.mjs +// Seeds house ads through the admin API (needs ADMIN_PASSWORD of the local server), signs in a fresh +// member, then runs: Watch ads x5 (incl. one wrong captcha pick) + daily claim, Watch videos, Verified +// visits, Inbox solo read + claim. Reports credited amounts and any trip-ups (e.g. a check button +// covered by the overlay's close button). Dwell timers run for real, so allow ~2 minutes. +// Env: LOCAL (default http://127.0.0.1:8797), ADMIN_PASSWORD (default localtest), OUT, PW +// Exit code 1 when a flow that had inventory failed to credit. +import { pathToFileURL } from 'node:url'; +import fs from 'node:fs'; +const PW = process.env.PW || 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright'; +const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default; +const B = process.env.LOCAL || 'http://127.0.0.1:8797'; +const OUT = process.env.OUT || 'qa/out'; +const ADMIN = process.env.ADMIN_PASSWORD || 'localtest'; +fs.mkdirSync(OUT, { recursive: true }); +const CAP = { rocket: '🚀', 'lightning bolt': '⚡', key: '🔑', target: '🎯', wave: '🌊', flame: '🔥', diamond: '💎', magnet: '🧲', bell: '🔔', moon: '🌙' }; +const lines = []; const log = (...a) => { const s = a.join(' '); console.log(s); lines.push(s); }; +const problems = []; +const browser = await chromium.launch(); +const ctx = await browser.newContext({ viewport: { width: 1280, height: 950 } }); +await ctx.addInitScript(() => { try { sessionStorage.setItem('iap.welcome.v1', '1'); } catch (e) {} }); // the session pop-up would block every click in an automated run +const page = await ctx.newPage(); +page.on('dialog', d => d.accept()); +const api = async (p, body) => (await page.request.fetch(B + p, body ? { method: 'POST', data: body } : {})).json(); + +// seeds: targets must be public and frameable (rmcircle.team sends frame-ancestors *) +const seeds = [ + { type: 'text', name: 'QA text 1', targetUrl: 'https://rmcircle.team/', title: 'Text one', body: 'Body one', budget: 1000 }, + { type: 'text', name: 'QA text 2', targetUrl: 'https://rmcircle.team/how-pay-works', title: 'Text two', body: 'Body two', budget: 1000 }, + { type: 'banner', name: 'QA banner', targetUrl: 'https://rmcircle.team/start', imageUrl: 'https://rmcircle.team/banners/rmc-728x90-v1.png', size: '728x90', budget: 1000 }, + { type: 'video', name: 'QA video', targetUrl: 'https://rmcircle.team/', videoUrl: process.env.QA_VIDEO_URL || 'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm', videoW: 960, videoH: 540, watchSecs: 10, title: 'QA clip', budget: 1000 }, + { type: 'visits', name: 'QA visits', targetUrl: 'https://rmcircle.team/contract', title: 'Visit the contract page', count: 20 }, + { type: 'solo', name: 'QA solo', targetUrl: 'https://rmcircle.team/contract', title: 'QA solo subject line', body: '

      This is a QA solo ad body with enough characters to pass validation for the inbox test run.

      ', ctaLabel: 'See it', budget: 100 } +]; +for (const sd of seeds) { + const r = await (await page.request.post(B + '/api/admin/campaigns', { headers: { Authorization: 'Bearer ' + ADMIN }, data: sd })).json(); + log('seed', sd.type, r.ok ? '#' + r.campaign.id + ' ' + r.campaign.status : 'FAIL ' + r.error); + if (!r.ok) problems.push('seed ' + sd.type + ': ' + r.error); +} +await page.goto(B + '/my', { waitUntil: 'networkidle' }); +await page.fill('#mcEmail', 'qa-earn@example.com'); await page.click('#mcSendBtn'); await page.waitForSelector('#mcVerifyBtn:not([hidden])'); await page.click('#mcVerifyBtn'); await page.waitForTimeout(2000); +if (await page.$('#onboardModal:not([hidden])')) { await page.fill('#obUsername', 'qaearner'); await page.click('#obSave'); await page.waitForTimeout(1000); } +await page.evaluate(() => { document.querySelectorAll('.modal-back,.lgate,.iap-welcome').forEach(m => m.hidden = true); }); +const start = await api('/api/my/earn'); log('start:', JSON.stringify(start)); + +// Watch ads +await page.click('.bo-menu [data-pane="earn"]'); await page.waitForTimeout(800); +await page.click('.subtabs [data-earn="watch"]'); await page.waitForTimeout(500); +let credited = 0; +for (let i = 0; i < 5; i++) { + await page.click('#earnStartBtn'); await page.waitForTimeout(1200); + const fr = page.frames().find(f => f.url().includes('/view/')); + if (!fr) { log('AD ' + (i + 1) + ': viewer did not open; box says:', (await page.textContent('#earnAdBox')).trim()); problems.push('watch: viewer did not open'); break; } + const t0 = Date.now(); + try { await fr.waitForSelector('#vCheck.on', { timeout: 30000 }); } catch (e) { log('AD ' + (i + 1) + ': check never appeared:', await fr.textContent('#vMsg')); problems.push('watch: check never appeared'); break; } + const secs = ((Date.now() - t0) / 1000).toFixed(1); + if (i === 1) { // trip-up: wrong pick first + const name = ((await fr.textContent('#vPrompt')).match(/Click the (.+):/) || [])[1]; + for (const o of await fr.$$('#vOpts button')) { if ((await o.textContent()) !== CAP[name]) { await o.click(); break; } } + await fr.waitForTimeout(700); log(' wrong pick handled:', (await fr.textContent('#vMsg')).trim()); + } + const name2 = ((await fr.textContent('#vPrompt')).match(/Click the (.+):/) || [])[1]; + const hit = await fr.evaluate(want => { const b = [...document.querySelectorAll('#vOpts button')].find(x => x.textContent === want); if (!b) return null; const r = b.getBoundingClientRect(); const top = document.elementFromPoint(r.left + r.width / 2, r.top + r.height / 2); const covered = !!(top && top !== b && !b.contains(top)); b.click(); return { covered, by: covered ? top.tagName + '#' + top.id : '' }; }, CAP[name2]); + if (hit && hit.covered) { log(' TRIP-UP: correct answer button covered by', hit.by); problems.push('watch: answer button covered by ' + hit.by); } + await fr.waitForTimeout(900); + const timer = await fr.textContent('#vTimer'); if (/credited/.test(timer)) credited++; + log('AD ' + (i + 1) + ': check after ' + secs + 's | ' + timer + ' | ' + (await fr.textContent('#vMsg')).trim()); + await page.evaluate(() => { const o = document.getElementById('adOverlay'); if (o) o.querySelector('button').click(); }); await page.waitForTimeout(700); +} +await page.waitForTimeout(800); +log('after set:', await page.textContent('#earnProgress'), '| claim visible:', !!(await page.$('#earnClaimBtn:not([hidden])'))); +if (await page.$('#earnStartBtn:not([hidden])')) { await page.click('#earnStartBtn'); await page.waitForTimeout(900); log('view-after-complete says:', (await page.textContent('#earnAdBox')).trim()); } +else log('view button hidden after the set (done screen with claim), as designed since 2026-09-12'); +if (await page.$('#earnClaimBtn:not([hidden])')) { await page.click('#earnClaimBtn'); await page.waitForTimeout(1000); log('claimed; balance:', await page.textContent('#earnBalance')); } +else if (credited === 5) problems.push('watch: 5 views credited but claim button not shown'); + +// Watch videos +await page.click('.subtabs [data-earn="videos"]'); await page.waitForTimeout(800); +await page.click('#vidStartBtn'); await page.waitForTimeout(2500); +const v1 = await page.evaluate(() => { const p = document.getElementById('vidPlayer'); return { paused: p.paused, t: p.currentTime, timer: document.getElementById('vidTimer').textContent }; }); +log('video after 2.5s:', JSON.stringify(v1)); +await page.waitForTimeout(23000); +const v2 = await page.evaluate(() => { const p = document.getElementById('vidPlayer'); return { t: p.currentTime, timer: document.getElementById('vidTimer').textContent, progress: document.getElementById('vidProgress').textContent }; }); +log('video after 25s:', JSON.stringify(v2), v2.t < 10 ? '(clip stalled in headless; verify on live with a real video)' : ''); + +// Verified visits +await page.click('.subtabs [data-earn="visits"]'); await page.waitForTimeout(800); +await page.click('#vsStartBtn'); await page.waitForTimeout(800); +log('visit loaded:', (await page.textContent('#vsBox')).trim().slice(0, 80)); +let popup = null; +if (await page.$('#vsVisit:not([hidden])')) { + [popup] = await Promise.all([ctx.waitForEvent('page', { timeout: 5000 }).catch(() => null), page.click('#vsVisit')]); + await page.waitForTimeout(10500); + const vp = (await page.textContent('#vsPrompt')) || ''; const vname = (vp.match(/Click the (.+):/) || [])[1]; + if (vname) { for (const b of await page.$$('#vsOpts button')) { if ((await b.textContent()) === CAP[vname]) { await b.click(); break; } } await page.waitForTimeout(900); } + const hint = (await page.textContent('#vsHint')).trim(); log('visit result:', hint, '|', await page.textContent('#vsProgress')); + if (!/credit/.test(hint)) problems.push('visits: not credited: ' + hint); + if (popup) await popup.close(); +} else { log('visits: nothing served'); problems.push('visits: nothing served'); } + +// Inbox +await page.click('.subtabs [data-earn="inbox"]'); await page.waitForTimeout(1200); +const rows = await page.$$('#ibList .ib-row'); log('inbox rows:', rows.length); +if (rows.length) { + await rows[0].click(); await page.waitForTimeout(900); + const [p2] = await Promise.all([ctx.waitForEvent('page', { timeout: 5000 }).catch(() => null), page.click('#ibVisit')]); if (p2) await p2.close(); + await page.bringToFront(); await page.waitForTimeout(12000); + const dis = await page.$eval('#ibClaimBtn', b => b.disabled); log('after 12s: claim btn =', await page.textContent('#ibClaimBtn'), '| disabled =', dis); + if (!dis) { await page.click('#ibClaimBtn'); await page.waitForTimeout(900); log('inbox claim:', (await page.textContent('#ibHint')).trim()); } + else problems.push('inbox: claim still disabled after dwell'); +} else problems.push('inbox: no solo delivered'); + +const fin = await api('/api/my/earn'); log('FINAL:', JSON.stringify(fin)); +await page.screenshot({ path: OUT + '/earn-final.png' }).catch(() => {}); +await browser.close(); +log('===== EARN FLOWS ' + new Date().toISOString() + ' ====='); +log(problems.length ? 'PROBLEMS: ' + problems.join(' | ') : 'ALL EARN FLOWS OK (video needs a real clip on live)'); +fs.writeFileSync(OUT + '/earn-report.txt', lines.join('\n') + '\n'); +process.exit(problems.length ? 1 : 0); diff --git a/qa/walk.mjs b/qa/walk.mjs index b0c82f6..5996f90 100644 --- a/qa/walk.mjs +++ b/qa/walk.mjs @@ -1,167 +1,170 @@ -// InstantAdPay QA harness: site walk. -// node qa/walk.mjs public -> live public pages (no sign-in): errors, failed requests, broken images, dead links, mobile -// node qa/walk.mjs member -> local copy: sign in, every member pane + sub-tab, every admin pane, forms -// node qa/walk.mjs all -> both -// Env: LIVE (default https://instantadpay.com), LOCAL (default http://127.0.0.1:8796), OUT (report dir), -// PW (playwright package dir; default D:/Projects/MarketingAgent/qa-tester/node_modules/playwright) -// Exit code 1 when any [bug] finding remains after noise filtering. -import { pathToFileURL } from 'node:url'; -import fs from 'node:fs'; -const PW = process.env.PW || 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright'; -const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default; -const MODE = process.argv[2] || 'all'; -const LIVE = process.env.LIVE || 'https://instantadpay.com'; -const LOCAL = process.env.LOCAL || 'http://127.0.0.1:8796'; -const OUT = process.env.OUT || 'qa/out'; -fs.mkdirSync(OUT, { recursive: true }); -const findings = []; -const note = (sev, where, what) => findings.push({ sev, where, what }); -const NOISE = /walletconnect|reown|web3modal|coingecko|fonts\.|\/api\/feed\/live|\/api\/auth\/logout/; - -function watch(page, base) { - const bag = { console: [], failed: [], status: [] }; - page.on('pageerror', e => bag.console.push('pageerror: ' + e.message)); - page.on('console', m => { - if (m.type() !== 'error') return; - const loc = (m.location() && m.location().url) || ''; - if (loc && !loc.startsWith(base)) return; // third-party or framed page, not ours - if (/status of (400|401|404)/.test(m.text())) return; // expected API answers surface as console noise - bag.console.push(m.text()); - }); - page.on('requestfailed', r => { const u = r.url(); if (u.startsWith(base) && !NOISE.test(u)) bag.failed.push(u + ' ' + (r.failure() && r.failure().errorText)); }); - page.on('response', r => { const st = r.status(); const u = r.url(); if (st >= 500 && u.startsWith(base)) bag.status.push(st + ' ' + u); }); - return bag; -} -function flush(bag, label) { - for (const c of bag.console) note('bug', label, 'console: ' + c.slice(0, 200)); - for (const f of bag.failed) note('bug', label, 'request failed: ' + f.slice(0, 200)); - for (const s of bag.status) note('bug', label, 'HTTP ' + s.slice(0, 200)); - bag.console.length = bag.failed.length = bag.status.length = 0; -} -async function domChecks(page, label) { - const r = await page.evaluate(() => { - const vis = el => el.offsetParent !== null; - const brokenImgs = [...document.images].filter(i => i.complete && i.naturalWidth === 0 && i.src && vis(i)).map(i => i.src); - const unfilled = [...document.querySelectorAll('body *')].filter(el => el.children.length === 0 && (el.textContent || '').trim() === '…' && vis(el)).length; - const overflow = document.documentElement.scrollWidth > document.documentElement.clientWidth + 2; - return { brokenImgs, unfilled, overflow, title: document.title }; - }); - if (r.brokenImgs.length) note('bug', label, 'broken images: ' + r.brokenImgs.slice(0, 3).join(', ')); - if (r.unfilled) note('warn', label, r.unfilled + ' element(s) still showing the loading ellipsis'); - if (r.overflow) note('warn', label, 'page scrolls horizontally'); - return r; -} -const hide = page => page.evaluate(() => { document.querySelectorAll('.modal-back,.lgate').forEach(m => m.hidden = true); }); - -const browser = await chromium.launch(); - -if (MODE === 'public' || MODE === 'all') { - const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } }); - const page = await ctx.newPage(); const bag = watch(page, LIVE); - const PUBLIC = ['/', '/ledger', '/contract', '/terms', '/privacy', '/disclaimer', '/wall/martbost', '/join/martbost', - '/join/martbost?v=instant', '/join/martbost?v=adspend', '/join/martbost?v=free', '/join/martbost?v=ledger', '/join/martbost?v=two', - '/admin', '/my', '/shorts', '/nope-404']; - for (const p of PUBLIC) { - const label = 'LIVE ' + p; - try { - const resp = await page.goto(LIVE + p, { waitUntil: 'domcontentloaded', timeout: 45000 }); - await page.waitForTimeout(2500); - const st = resp ? resp.status() : 0; - if (p === '/nope-404') { if (st !== 404) note('warn', label, 'expected 404, got ' + st); } - else if (st >= 400) note('bug', label, 'page HTTP ' + st); - const d = await domChecks(page, label); - const hrefs = await page.evaluate(() => [...new Set([...document.querySelectorAll('a[href]')].map(a => a.href).filter(h => h.startsWith(location.origin) && !h.includes('#') && !h.includes('/api/')))]); - for (const h of hrefs.slice(0, 40)) { - try { const r = await page.request.head(h, { timeout: 15000 }); if (r.status() >= 400) note('bug', label, 'dead link ' + h + ' -> ' + r.status()); } - catch (e) { note('warn', label, 'link check failed ' + h); } - } - flush(bag, label); console.log('ok', label, '|', d.title); - } catch (e) { note('bug', label, 'navigation failed: ' + e.message.slice(0, 160)); flush(bag, label); } - } - const m = await browser.newContext({ viewport: { width: 390, height: 844 }, isMobile: true }); - const mp = await m.newPage(); const mbag = watch(mp, LIVE); - for (const p of ['/', '/join/martbost?v=instant', '/wall/martbost', '/my']) { - await mp.goto(LIVE + p, { waitUntil: 'domcontentloaded', timeout: 45000 }).catch(e => note('bug', 'LIVE mobile ' + p, e.message)); - await mp.waitForTimeout(2000); await domChecks(mp, 'LIVE mobile ' + p); flush(mbag, 'LIVE mobile ' + p); - await mp.screenshot({ path: OUT + '/mobile' + p.replace(/[^a-z0-9]+/gi, '-') + '.png' }).catch(() => {}); - } - await ctx.close(); await m.close(); -} - -if (MODE === 'member' || MODE === 'all') { - const ctx = await browser.newContext({ viewport: { width: 1280, height: 950 } }); - const page = await ctx.newPage(); const bag = watch(page, LOCAL); - page.on('dialog', d => d.accept()); - const L = 'LOCAL '; - await page.goto(LOCAL + '/my', { waitUntil: 'networkidle' }); - await page.fill('#mcEmail', 'qa-walk@example.com'); await page.click('#mcSendBtn'); - await page.waitForSelector('#mcVerifyBtn:not([hidden])'); await page.click('#mcVerifyBtn'); await page.waitForTimeout(2000); - if (await page.$('#onboardModal:not([hidden])')) { await page.fill('#obUsername', 'qawalker'); await page.click('#obSave'); await page.waitForTimeout(1200); } - await hide(page); flush(bag, L + 'sign-in'); - const PANES = ['overview', 'line', 'pipeline', 'buy', 'campaigns', 'earn', 'earnings', 'promo', 'training', 'wallet', 'profile']; - for (const pn of PANES) { - const label = L + 'my#' + pn; - await page.click('.bo-menu [data-pane="' + pn + '"]'); await page.waitForTimeout(1200); await hide(page); - const vis = await page.evaluate(id => { const el = document.getElementById('pane-' + id); return el && !el.hidden && el.offsetHeight > 40; }, pn); - if (!vis) note('bug', label, 'pane did not render'); - await domChecks(page, label); - const subs = await page.$$('#pane-' + pn + ' .subtabs [data-earn], #pane-' + pn + ' .promo-pills [data-promo]'); - for (const s of subs) { try { await s.click(); await page.waitForTimeout(500); } catch (e) {} } - if (subs.length) await domChecks(page, label + ' (sub-tabs)'); - flush(bag, label); - await page.screenshot({ path: OUT + '/my-' + pn + '.png' }).catch(() => {}); - console.log('ok', label, 'subtabs:', subs.length); - } - await page.click('.bo-menu [data-pane="promo"]'); await page.waitForTimeout(800); - if (!(await page.$$('#promoPosts .promo-block')).length) note('bug', L + 'promo', 'no post cards rendered'); - // viral links: the builder renders a ?ref= link; any page + ?ref= redirects clean and sets the sponsor cookie; an unknown ref sets nothing - await page.click('.promo-pills [data-promo="viral"]'); await page.waitForTimeout(1200); - const vl = await page.$eval('#viralLink', e => e.textContent).catch(() => ''); - if (!/^https:\/\/instantadpay\.com\/.*[?&]ref=[a-z0-9_]+$/i.test(vl)) note('bug', L + 'promo/viral', 'builder link not rendered: ' + vl); - const me = await page.evaluate(() => fetch('/api/me').then(r => r.json())); - const tok = me.username || me.refCode; - // served in place (no redirect: Facebook drops the name otherwise), cookie on the response, og:url carries the ref - const rr = await page.request.get(LOCAL + '/?ref=' + tok + '&x=1', { maxRedirects: 0 }); - const sc = (rr.headersArray().filter(h => h.name.toLowerCase() === 'set-cookie').map(h => h.value)).join('; '); - const rb = await rr.text(); - if (rr.status() !== 200 || !//.test(rb)) note('bug', L + 'viral/inplace', 'expected the page at the decorated address, got ' + rr.status()); - if (!new RegExp('iap\\.sponsor=' + tok + ';').test(sc) || !/iap\.angle=page;/.test(sc)) note('bug', L + 'viral/cookie', 'sponsor/angle cookie not set: ' + sc); - if (!new RegExp('property="og:url" content="[^"]*[?&]ref=' + tok + '"').test(rb)) note('bug', L + 'viral/og', 'og:url does not carry the ref'); - const ru = await page.request.get(LOCAL + '/?ref=nobody_zz9', { maxRedirects: 0 }); - const su = (ru.headersArray().filter(h => h.name.toLowerCase() === 'set-cookie').map(h => h.value)).join('; '); - const ub = await ru.text(); - if (ru.status() !== 200 || /iap\.sponsor=/.test(su) || /ref=nobody_zz9/.test(ub)) note('bug', L + 'viral/unknown', 'unknown ref must serve the plain page with no cookie and a clean og:url: ' + ru.status() + ' ' + su); - const rj = await page.request.get(LOCAL + '/join/' + tok + '?ref=' + tok, { maxRedirects: 0 }); - if (rj.status() !== 200) note('bug', L + 'viral/join', '/join keeps its own ?ref handling, got ' + rj.status()); - console.log('ok viral links: builder + redirect + cookie'); - const chat = await page.$('#chatMenuBtn'); if (chat) { await chat.click(); await page.waitForTimeout(800); await domChecks(page, L + 'messages'); flush(bag, L + 'messages'); } - const lo = await page.$('#logoutLink'); if (lo) { await lo.click(); await page.waitForTimeout(1000); } - if (!(await page.$('#authArea:not([hidden])'))) note('bug', L + 'logout', 'auth card not shown after log out'); - flush(bag, L + 'logout'); - // admin - await page.goto(LOCAL + '/admin', { waitUntil: 'networkidle' }); - await page.fill('#adEmail', process.env.ADMIN_EMAIL || 'martybostick@gmail.com'); await page.click('#adSend'); await page.waitForSelector('#adVerify:not([hidden])'); await page.click('#adVerify'); await page.waitForTimeout(1200); - for (const pn of ['overview', 'house', 'campaigns', 'members', 'reports', 'traffic', 'blog', 'releases', 'pnl', 'settings']) { - const label = L + 'admin#' + pn; - await page.click('.bo-menu [data-pane="' + pn + '"]'); await page.waitForTimeout(1200); - const vis = await page.evaluate(id => { const el = document.getElementById('pane-' + id); return el && !el.hidden && el.offsetHeight > 40; }, pn); - if (!vis) note('bug', label, 'pane did not render'); - await domChecks(page, label); flush(bag, label); - await page.screenshot({ path: OUT + '/admin-' + pn + '.png' }).catch(() => {}); - console.log('ok', label); - } - await page.click('.bo-menu [data-pane="house"]'); await page.waitForTimeout(500); - for (const t of ['banner', 'text', 'login', 'solo', 'video', 'featured', 'visits']) { await page.selectOption('#hType', t); await page.waitForTimeout(120); } - await page.selectOption('#hType', 'text'); await page.click('#hCreate'); await page.waitForTimeout(800); - if (!(await page.$('#hErr:not([hidden])'))) note('warn', L + 'admin house form', 'empty submit showed no validation message'); - flush(bag, L + 'admin house form'); - await ctx.close(); -} -await browser.close(); - -const bugs = findings.filter(f => f.sev === 'bug'), warns = findings.filter(f => f.sev === 'warn'); -const lines = ['===== QA WALK (' + MODE + ') ' + new Date().toISOString() + ' =====', 'bugs: ' + bugs.length + ' | warnings: ' + warns.length, - ...findings.map(f => '[' + f.sev + '] ' + f.where + ' :: ' + f.what)]; -console.log('\n' + lines.join('\n')); -fs.writeFileSync(OUT + '/walk-report.txt', lines.join('\n') + '\n'); -process.exit(bugs.length ? 1 : 0); +// InstantAdPay QA harness: site walk. +// node qa/walk.mjs public -> live public pages (no sign-in): errors, failed requests, broken images, dead links, mobile +// node qa/walk.mjs member -> local copy: sign in, every member pane + sub-tab, every admin pane, forms +// node qa/walk.mjs all -> both +// Env: LIVE (default https://instantadpay.com), LOCAL (default http://127.0.0.1:8796), OUT (report dir), +// PW (playwright package dir; default D:/Projects/MarketingAgent/qa-tester/node_modules/playwright) +// Exit code 1 when any [bug] finding remains after noise filtering. +import { pathToFileURL } from 'node:url'; +import fs from 'node:fs'; +const PW = process.env.PW || 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright'; +const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default; +const MODE = process.argv[2] || 'all'; +const LIVE = process.env.LIVE || 'https://instantadpay.com'; +const LOCAL = process.env.LOCAL || 'http://127.0.0.1:8796'; +const OUT = process.env.OUT || 'qa/out'; +fs.mkdirSync(OUT, { recursive: true }); +const findings = []; +const note = (sev, where, what) => findings.push({ sev, where, what }); +const NOISE = /walletconnect|reown|web3modal|coingecko|fonts\.|\/api\/feed\/live|\/api\/auth\/logout/; + +function watch(page, base) { + const bag = { console: [], failed: [], status: [] }; + page.on('pageerror', e => bag.console.push('pageerror: ' + e.message)); + page.on('console', m => { + if (m.type() !== 'error') return; + const loc = (m.location() && m.location().url) || ''; + if (loc && !loc.startsWith(base)) return; // third-party or framed page, not ours + if (/status of (400|401|404)/.test(m.text())) return; // expected API answers surface as console noise + bag.console.push(m.text()); + }); + page.on('requestfailed', r => { const u = r.url(); if (u.startsWith(base) && !NOISE.test(u)) bag.failed.push(u + ' ' + (r.failure() && r.failure().errorText)); }); + page.on('response', r => { const st = r.status(); const u = r.url(); if (st >= 500 && u.startsWith(base)) bag.status.push(st + ' ' + u); }); + return bag; +} +function flush(bag, label) { + for (const c of bag.console) note('bug', label, 'console: ' + c.slice(0, 200)); + for (const f of bag.failed) note('bug', label, 'request failed: ' + f.slice(0, 200)); + for (const s of bag.status) note('bug', label, 'HTTP ' + s.slice(0, 200)); + bag.console.length = bag.failed.length = bag.status.length = 0; +} +async function domChecks(page, label) { + const r = await page.evaluate(() => { + const vis = el => el.offsetParent !== null; + const brokenImgs = [...document.images].filter(i => i.complete && i.naturalWidth === 0 && i.src && vis(i)).map(i => i.src); + const unfilled = [...document.querySelectorAll('body *')].filter(el => el.children.length === 0 && (el.textContent || '').trim() === '…' && vis(el)).length; + const overflow = document.documentElement.scrollWidth > document.documentElement.clientWidth + 2; + return { brokenImgs, unfilled, overflow, title: document.title }; + }); + if (r.brokenImgs.length) note('bug', label, 'broken images: ' + r.brokenImgs.slice(0, 3).join(', ')); + if (r.unfilled) note('warn', label, r.unfilled + ' element(s) still showing the loading ellipsis'); + if (r.overflow) note('warn', label, 'page scrolls horizontally'); + return r; +} +const hide = page => page.evaluate(() => { document.querySelectorAll('.modal-back,.lgate,.iap-welcome').forEach(m => m.hidden = true); }); + +const browser = await chromium.launch(); + +if (MODE === 'public' || MODE === 'all') { + const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } }); + await ctx.addInitScript(() => { try { sessionStorage.setItem('iap.welcome.v1', '1'); } catch (e) {} }); // the session pop-up would block every click in an automated run + const page = await ctx.newPage(); const bag = watch(page, LIVE); + const PUBLIC = ['/', '/ledger', '/contract', '/terms', '/privacy', '/disclaimer', '/wall/martbost', '/join/martbost', + '/join/martbost?v=instant', '/join/martbost?v=adspend', '/join/martbost?v=free', '/join/martbost?v=ledger', '/join/martbost?v=two', + '/admin', '/my', '/shorts', '/nope-404']; + for (const p of PUBLIC) { + const label = 'LIVE ' + p; + try { + const resp = await page.goto(LIVE + p, { waitUntil: 'domcontentloaded', timeout: 45000 }); + await page.waitForTimeout(2500); + const st = resp ? resp.status() : 0; + if (p === '/nope-404') { if (st !== 404) note('warn', label, 'expected 404, got ' + st); } + else if (st >= 400) note('bug', label, 'page HTTP ' + st); + const d = await domChecks(page, label); + const hrefs = await page.evaluate(() => [...new Set([...document.querySelectorAll('a[href]')].map(a => a.href).filter(h => h.startsWith(location.origin) && !h.includes('#') && !h.includes('/api/')))]); + for (const h of hrefs.slice(0, 40)) { + try { const r = await page.request.head(h, { timeout: 15000 }); if (r.status() >= 400) note('bug', label, 'dead link ' + h + ' -> ' + r.status()); } + catch (e) { note('warn', label, 'link check failed ' + h); } + } + flush(bag, label); console.log('ok', label, '|', d.title); + } catch (e) { note('bug', label, 'navigation failed: ' + e.message.slice(0, 160)); flush(bag, label); } + } + const m = await browser.newContext({ viewport: { width: 390, height: 844 }, isMobile: true }); + await m.addInitScript(() => { try { sessionStorage.setItem('iap.welcome.v1', '1'); } catch (e) {} }); // the session pop-up would block every click in an automated run + const mp = await m.newPage(); const mbag = watch(mp, LIVE); + for (const p of ['/', '/join/martbost?v=instant', '/wall/martbost', '/my']) { + await mp.goto(LIVE + p, { waitUntil: 'domcontentloaded', timeout: 45000 }).catch(e => note('bug', 'LIVE mobile ' + p, e.message)); + await mp.waitForTimeout(2000); await domChecks(mp, 'LIVE mobile ' + p); flush(mbag, 'LIVE mobile ' + p); + await mp.screenshot({ path: OUT + '/mobile' + p.replace(/[^a-z0-9]+/gi, '-') + '.png' }).catch(() => {}); + } + await ctx.close(); await m.close(); +} + +if (MODE === 'member' || MODE === 'all') { + const ctx = await browser.newContext({ viewport: { width: 1280, height: 950 } }); + await ctx.addInitScript(() => { try { sessionStorage.setItem('iap.welcome.v1', '1'); } catch (e) {} }); // the session pop-up would block every click in an automated run + const page = await ctx.newPage(); const bag = watch(page, LOCAL); + page.on('dialog', d => d.accept()); + const L = 'LOCAL '; + await page.goto(LOCAL + '/my', { waitUntil: 'networkidle' }); + await page.fill('#mcEmail', 'qa-walk@example.com'); await page.click('#mcSendBtn'); + await page.waitForSelector('#mcVerifyBtn:not([hidden])'); await page.click('#mcVerifyBtn'); await page.waitForTimeout(2000); + if (await page.$('#onboardModal:not([hidden])')) { await page.fill('#obUsername', 'qawalker'); await page.click('#obSave'); await page.waitForTimeout(1200); } + await hide(page); flush(bag, L + 'sign-in'); + const PANES = ['overview', 'line', 'pipeline', 'buy', 'campaigns', 'earn', 'earnings', 'promo', 'training', 'wallet', 'profile']; + for (const pn of PANES) { + const label = L + 'my#' + pn; + await page.click('.bo-menu [data-pane="' + pn + '"]'); await page.waitForTimeout(1200); await hide(page); + const vis = await page.evaluate(id => { const el = document.getElementById('pane-' + id); return el && !el.hidden && el.offsetHeight > 40; }, pn); + if (!vis) note('bug', label, 'pane did not render'); + await domChecks(page, label); + const subs = await page.$$('#pane-' + pn + ' .subtabs [data-earn], #pane-' + pn + ' .promo-pills [data-promo]'); + for (const s of subs) { try { await s.click(); await page.waitForTimeout(500); } catch (e) {} } + if (subs.length) await domChecks(page, label + ' (sub-tabs)'); + flush(bag, label); + await page.screenshot({ path: OUT + '/my-' + pn + '.png' }).catch(() => {}); + console.log('ok', label, 'subtabs:', subs.length); + } + await page.click('.bo-menu [data-pane="promo"]'); await page.waitForTimeout(800); + if (!(await page.$$('#promoPosts .promo-block')).length) note('bug', L + 'promo', 'no post cards rendered'); + // viral links: the builder renders a ?ref= link; any page + ?ref=<member> redirects clean and sets the sponsor cookie; an unknown ref sets nothing + await page.click('.promo-pills [data-promo="viral"]'); await page.waitForTimeout(1200); + const vl = await page.$eval('#viralLink', e => e.textContent).catch(() => ''); + if (!/^https:\/\/instantadpay\.com\/.*[?&]ref=[a-z0-9_]+$/i.test(vl)) note('bug', L + 'promo/viral', 'builder link not rendered: ' + vl); + const me = await page.evaluate(() => fetch('/api/me').then(r => r.json())); + const tok = me.username || me.refCode; + // served in place (no redirect: Facebook drops the name otherwise), cookie on the response, og:url carries the ref + const rr = await page.request.get(LOCAL + '/?ref=' + tok + '&x=1', { maxRedirects: 0 }); + const sc = (rr.headersArray().filter(h => h.name.toLowerCase() === 'set-cookie').map(h => h.value)).join('; '); + const rb = await rr.text(); + if (rr.status() !== 200 || !/<title>/.test(rb)) note('bug', L + 'viral/inplace', 'expected the page at the decorated address, got ' + rr.status()); + if (!new RegExp('iap\\.sponsor=' + tok + ';').test(sc) || !/iap\.angle=page;/.test(sc)) note('bug', L + 'viral/cookie', 'sponsor/angle cookie not set: ' + sc); + if (!new RegExp('property="og:url" content="[^"]*[?&]ref=' + tok + '"').test(rb)) note('bug', L + 'viral/og', 'og:url does not carry the ref'); + const ru = await page.request.get(LOCAL + '/?ref=nobody_zz9', { maxRedirects: 0 }); + const su = (ru.headersArray().filter(h => h.name.toLowerCase() === 'set-cookie').map(h => h.value)).join('; '); + const ub = await ru.text(); + if (ru.status() !== 200 || /iap\.sponsor=/.test(su) || /ref=nobody_zz9/.test(ub)) note('bug', L + 'viral/unknown', 'unknown ref must serve the plain page with no cookie and a clean og:url: ' + ru.status() + ' ' + su); + const rj = await page.request.get(LOCAL + '/join/' + tok + '?ref=' + tok, { maxRedirects: 0 }); + if (rj.status() !== 200) note('bug', L + 'viral/join', '/join keeps its own ?ref handling, got ' + rj.status()); + console.log('ok viral links: builder + redirect + cookie'); + const chat = await page.$('#chatMenuBtn'); if (chat) { await chat.click(); await page.waitForTimeout(800); await domChecks(page, L + 'messages'); flush(bag, L + 'messages'); } + const lo = await page.$('#logoutLink'); if (lo) { await lo.click(); await page.waitForTimeout(1000); } + if (!(await page.$('#authArea:not([hidden])'))) note('bug', L + 'logout', 'auth card not shown after log out'); + flush(bag, L + 'logout'); + // admin + await page.goto(LOCAL + '/admin', { waitUntil: 'networkidle' }); + await page.fill('#adEmail', process.env.ADMIN_EMAIL || 'martybostick@gmail.com'); await page.click('#adSend'); await page.waitForSelector('#adVerify:not([hidden])'); await page.click('#adVerify'); await page.waitForTimeout(1200); + for (const pn of ['overview', 'house', 'campaigns', 'members', 'reports', 'traffic', 'blog', 'releases', 'pnl', 'settings']) { + const label = L + 'admin#' + pn; + await page.click('.bo-menu [data-pane="' + pn + '"]'); await page.waitForTimeout(1200); + const vis = await page.evaluate(id => { const el = document.getElementById('pane-' + id); return el && !el.hidden && el.offsetHeight > 40; }, pn); + if (!vis) note('bug', label, 'pane did not render'); + await domChecks(page, label); flush(bag, label); + await page.screenshot({ path: OUT + '/admin-' + pn + '.png' }).catch(() => {}); + console.log('ok', label); + } + await page.click('.bo-menu [data-pane="house"]'); await page.waitForTimeout(500); + for (const t of ['banner', 'text', 'login', 'solo', 'video', 'featured', 'visits']) { await page.selectOption('#hType', t); await page.waitForTimeout(120); } + await page.selectOption('#hType', 'text'); await page.click('#hCreate'); await page.waitForTimeout(800); + if (!(await page.$('#hErr:not([hidden])'))) note('warn', L + 'admin house form', 'empty submit showed no validation message'); + flush(bag, L + 'admin house form'); + await ctx.close(); +} +await browser.close(); + +const bugs = findings.filter(f => f.sev === 'bug'), warns = findings.filter(f => f.sev === 'warn'); +const lines = ['===== QA WALK (' + MODE + ') ' + new Date().toISOString() + ' =====', 'bugs: ' + bugs.length + ' | warnings: ' + warns.length, + ...findings.map(f => '[' + f.sev + '] ' + f.where + ' :: ' + f.what)]; +console.log('\n' + lines.join('\n')); +fs.writeFileSync(OUT + '/walk-report.txt', lines.join('\n') + '\n'); +process.exit(bugs.length ? 1 : 0);