@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/dist/nibgate.js +789 -677
- package/dist/nibgate.js.map +4 -4
- package/dist/nibgate.min.js +48 -48
- package/dist/nibgate.min.js.map +4 -4
- package/package.json +1 -1
- package/src/browser/default-ui.js +66 -2
package/package.json
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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 = {}) {
|