@nibgate/sdk 0.2.24 → 0.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nibgate/sdk",
3
- "version": "0.2.24",
3
+ "version": "0.2.26",
4
4
  "description": "Framework-agnostic browser and server package for creator-owned gated content, unlock events, and receipts.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -84,7 +84,7 @@ export function renderDefaultUnlockUI(container, resource, options = {}) {
84
84
  <div data-nibgate-wallet-label class="nui-mono" style="font-size:18px;color:${theme.muted};margin-bottom:40px;min-height:28px">Connect wallet</div>
85
85
  <div data-nibgate-unlock-wrap style="width:100%;position:relative;border-radius:10px;overflow:hidden;cursor:pointer">
86
86
  <div data-nibgate-unlock-progress style="position:absolute;inset:0;width:0%;background:${theme.accent};opacity:0.15;border-radius:10px;transition:width .05s linear;z-index:2"></div>
87
- <button type="button" data-nibgate-unlock disabled style="width:100%;padding:14px 0;font-size:17px;font-weight:500;line-height:1;border:0;border-radius:10px;outline:none;cursor:pointer;position:relative;z-index:4;color:${theme.accent};background:rgba(124,154,109,0.08);transition:box-shadow .3s,transform .3s;font-family:inherit;display:flex;align-items:center;justify-content:center">${unlockSVG}Hold to pay</button></div>
87
+ <button type="button" data-nibgate-unlock disabled style="width:100%;padding:14px 0;font-size:17px;font-weight:600;line-height:1;border:0;border-radius:10px;outline:none;cursor:pointer;position:relative;z-index:4;color:#fff;background:${theme.accent};transition:box-shadow .3s,transform .3s;font-family:inherit;display:flex;align-items:center;justify-content:center">${unlockSVG}Hold to pay</button></div>
88
88
  <div class="nui-stat" style="text-align:center;margin-top:16px" data-nibgate-status></div>
89
89
  </div>
90
90
  <div data-nibgate-premium hidden style="margin-top:32px;border-top:1px solid ${theme.border};padding-top:32px">${options.premiumContentHTML || ''}</div>
@@ -224,7 +224,71 @@ export function renderDefaultUnlockUI(container, resource, options = {}) {
224
224
  const cleanup = () => { document.removeEventListener('mouseup', cancelHold); document.removeEventListener('touchend', cancelHold); };
225
225
  card.addEventListener('remove', cleanup);
226
226
 
227
- return { ...ctrl, element: card, destroy: () => { cleanup(); card.remove(); } };
227
+ // ── Gateway balance + deposit icon ─────────────────────────────────────
228
+ const ARC_RPC = 'https://arc-testnet.drpc.org';
229
+ const GATEWAY_WALLET = '0x0077777d7EBA4688BDeF3E311b846F25870A19B9';
230
+ const USDC_ADDRESS = '0x3600000000000000000000000000000000000000';
231
+
232
+ async function fetchBalance(addr) {
233
+ const sel = '0xdd62e1c6';
234
+ const pad = (a) => '000000000000000000000000' + a.slice(2).toLowerCase();
235
+ const data = sel + pad(USDC_ADDRESS) + pad(addr);
236
+ const r = await fetch(ARC_RPC, {
237
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
238
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'eth_call', params: [{ to: GATEWAY_WALLET, data }, 'latest'], id: 1 }),
239
+ });
240
+ const j = await r.json();
241
+ return j?.result ? (Number(BigInt(j.result)) / 1_000_000).toFixed(2) + ' USDC' : '\u2014';
242
+ }
243
+
244
+ let balEl = null, gwOverlay = null, balTimer = null;
245
+
246
+ function depIcon() {
247
+ return '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="display:inline;vertical-align:middle"><path d="M12 17V3"/><path d="m6 11 6 6 6-6"/><path d="M19 21H5"/></svg>';
248
+ }
249
+
250
+ function showDeposit() {
251
+ if (gwOverlay) return;
252
+ gwOverlay = el('div', { style: 'position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center;padding:20px;animation:nfade .15s ease-out' });
253
+ const modal = el('div', { style: 'background:' + theme.bg + ';border-radius:16px;max-width:540px;width:100%;max-height:90vh;overflow:auto;position:relative;box-shadow:0 8px 32px rgba(0,0,0,0.12);animation:nscale .15s ease-out' });
254
+ const close = el('button', { style: 'position:absolute;top:12px;right:16px;z-index:20;background:none;border:none;font-size:28px;cursor:pointer;color:' + theme.muted + ';font-family:inherit;line-height:1' }, '\u00d7');
255
+ close.addEventListener('click', () => { gwOverlay.remove(); gwOverlay = null; document.removeEventListener('keydown', onDepKey); });
256
+ modal.appendChild(close);
257
+ gwOverlay.appendChild(modal);
258
+ gwOverlay.addEventListener('click', (e) => { if (e.target === gwOverlay) { gwOverlay.remove(); gwOverlay = null; document.removeEventListener('keydown', onDepKey); } });
259
+ document.body.appendChild(gwOverlay);
260
+ document.addEventListener('keydown', onDepKey);
261
+ import('./default-ui.js').then(m => m.renderDefaultGatewayWalletUI(modal, options.gatewayOptions || {})).catch(() => {});
262
+ }
263
+ function onDepKey(e) { if (e.key === 'Escape' && gwOverlay) { gwOverlay.remove(); gwOverlay = null; document.removeEventListener('keydown', onDepKey); } }
264
+
265
+ function ensureBal() {
266
+ if (balEl && balEl.isConnected) return balEl;
267
+ balEl = el('span', { 'data-nibgate-bal': '', style: 'margin-left:4px;cursor:pointer;white-space:nowrap;color:var(--accent,#7c9a6d)' },
268
+ '\u00b7\u00a0<span data-nibgate-bal-txt></span>\u00a0|\u00a0' + depIcon());
269
+ balEl.addEventListener('click', showDeposit);
270
+ if (label.parentNode) label.parentNode.insertBefore(balEl, label.nextSibling);
271
+ return balEl;
272
+ }
273
+
274
+ async function refreshBal() {
275
+ if (!card.isConnected || !window.ethereum) return;
276
+ try {
277
+ const accts = await window.ethereum.request({ method: 'eth_accounts' });
278
+ const addr = Array.isArray(accts) && accts[0] ? accts[0] : null;
279
+ if (!addr) return;
280
+ const t = ensureBal().querySelector('[data-nibgate-bal-txt]');
281
+ if (t) t.textContent = await fetchBalance(addr);
282
+ } catch {}
283
+ }
284
+
285
+ if (window.ethereum) {
286
+ balTimer = setInterval(refreshBal, 3000);
287
+ setTimeout(refreshBal, 1000);
288
+ window.ethereum.on('accountsChanged', refreshBal);
289
+ }
290
+
291
+ return { ...ctrl, element: card, destroy: () => { cleanup(); card.remove(); if (balTimer) clearInterval(balTimer); if (gwOverlay) { gwOverlay.remove(); gwOverlay = null; } } };
228
292
  }
229
293
 
230
294
  export function renderDefaultRatingUI(container, resource, options = {}) {