bd67bfc92e
A self-hostable Grin payment server for shops, creators, and sites: show a code, Grin lands in your wallet, with a verifiable Grin payment proof on receive. Workspace crates (gp-core / gp-nostr / gp-server / gp-wallet / gp-goblin-sender), a WooCommerce connector, a hosted /pay/<token> checkout, and NIP-44 v3 gift-wrapped payment DMs carried over the Nym mixnet. All secrets are read from the environment; none are committed.
53 lines
2.0 KiB
HTML
53 lines
2.0 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
{% if is_open %}<meta http-equiv="refresh" content="10">{% endif %}
|
|
<title>Pay with Goblin (GRIN)</title>
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
</head>
|
|
<body>
|
|
<main class="checkout">
|
|
<h1>Pay with Goblin</h1>
|
|
<p class="amount">{{ info.amount_display }}</p>
|
|
|
|
{% if is_paid %}
|
|
<p class="status paid">Paid ✓</p>
|
|
<p class="hint">This invoice has been settled. You can close this page.</p>
|
|
{% else if is_expired %}
|
|
<p class="status expired">This invoice has expired.</p>
|
|
{% else %}
|
|
<p class="status open">Waiting for payment…</p>
|
|
<div class="qr">{{ info.qr_svg|safe }}</div>
|
|
<p class="hint">Scan with your Goblin Wallet, or copy the address below.</p>
|
|
|
|
<label for="nprofile">Payment address (nprofile)</label>
|
|
<textarea id="nprofile" class="copybox" rows="3" readonly>{{ info.nprofile }}</textarea>
|
|
|
|
<details class="manual">
|
|
<summary>Can't scan? Pay manually with a slatepack</summary>
|
|
{% if wallet_available %}
|
|
<ol>
|
|
<li>In your wallet, send {{ info.amount_display }} using the manual / slatepack option.</li>
|
|
<li>Paste the generated <strong>S1</strong> slatepack below and submit.</li>
|
|
<li>Copy the <strong>response</strong> slatepack we return, back into your wallet to finalize and post.</li>
|
|
</ol>
|
|
<form method="post" action="/pay/{{ info.token }}/slatepack">
|
|
<label for="s1">Your slatepack (S1)</label>
|
|
<textarea id="s1" name="slatepack" rows="6" required
|
|
placeholder="BEGINSLATEPACK. … ENDSLATEPACK."></textarea>
|
|
<button type="submit">Submit slatepack</button>
|
|
</form>
|
|
{% else %}
|
|
<p>Manual receive is unavailable on this instance.</p>
|
|
{% endif %}
|
|
</details>
|
|
{% endif %}
|
|
|
|
{% if let Some(memo) = info.memo %}<p class="memo">{{ memo }}</p>{% endif %}
|
|
<p class="footer">Powered by GoblinPay · receive-only Grin over Nostr</p>
|
|
</main>
|
|
</body>
|
|
</html>
|