Repository navigation
Expand file tree
/
Copy pathconsentement.js
More file actions
69 lines (66 loc) · 4.48 KB
/
Copy pathconsentement.js
File metadata and controls
69 lines (66 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// consentement.js — se souvenir du consentement mainnet SANS le diluer.
// ================================================================================================
// ⛔ CE QU ON CHANGE, ET LA RAISON QU ON CONTREDIT. La page reinitialisait la case a chaque
// changement de reseau, avec un commentaire explicite : « un retour sur Sepolia puis sur
// mainnet ne doit pas retrouver un consentement donne pour une autre session d attention ».
// C etait une bonne raison. La demande — ne plus cocher a chaque visite — la contredit
// frontalement, et on ne contredit pas une garde documentee en silence.
//
// ⛔ LES DEUX SE CONCILIENT A TROIS CONDITIONS, ET CHACUNE EST TESTEE :
// 1. le consentement est lie AU COMPTE. Un autre wallet est une autre decision — sans ca,
// cocher une fois vaudrait pour tous les comptes connectes ensuite sur cette machine,
// y compris celui d un tiers.
// 2. il EXPIRE au bout de 30 jours. Celui d il y a un an n en est plus un.
// 3. tout ce qui n est pas un consentement LU et VALIDE vaut refus : stockage indisponible,
// donnee corrompue, pas de compte. On n invente jamais un « oui ».
// Un « oui » qui survit a tout n est plus un consentement, c est une case decorative.
//
// ⚠️ CE QUE CA NE FAIT PAS : dispenser de la banniere. Le texte reste affiche ; c est la CASE qui
// est pre-cochee pour un compte qui a deja accepte. Masquer l avertissement serait une autre
// decision, bien plus lourde, et personne ne l a prise.
//
// ⛔ ET CE N EST PAS UN ACK ARGENT (2026-09-07, étendu Create + C2 #8). Pre-cocher `#gardeCase` n est
// qu un souvenir UI ; Create / Launch / LP / Swap / Send exigent un re-ack de session dans `index.html`
// (`consentArgentOk` / `#gardeCaseArgent`). Après restore cette session, ALWAYS `#gardeCaseArgent`
// — un tick frais de `#gardeCase` seul ne doit plus lever le flag restore. Un souvenir ≤30j
// ne doit pas autoriser un habit-click sur Create (frais), mint, swap ou Send.
const CLE = 'tblock.consentement.mainnet';
const JOURS = 30;
/** Vrai seulement si CE compte a consenti, il y a moins de 30 jours, et qu on a pu le LIRE. */
export function consentementValide({ stockage, compte, maintenant = new Date() }) {
if (!compte || typeof compte !== 'string') return false;
let brut = null;
/* ⛔ `localStorage` LEVE en navigation privee, cookies bloques, ou quota plein. Un catch qui
* rendrait `true` inventerait un consentement jamais donne — le motif « un retour neutre avale
* un echec », applique a la pire chose possible. */
/* ⛔ UN STOCKAGE ABSENT EST UN STOCKAGE QUI REFUSE. L appelant rend `null` quand l acces meme a
* `window.localStorage` leve (iframe tierce, navigation privee) : sans ce cas, on planterait
* sur `null.getItem` — le plantage aurait juste change d endroit. */
if (!stockage) return false;
try { brut = stockage.getItem(CLE); } catch { return false; }
if (!brut) return false;
let doc = null;
/* ⛔ N IMPORTE QUI PEUT ECRIRE N IMPORTE QUOI DANS `localStorage`. Un JSON illisible, un champ
* manquant ou une date absurde doivent REDEMANDER, jamais accorder. */
try { doc = JSON.parse(brut); } catch { return false; }
if (!doc || typeof doc !== 'object' || typeof doc.compte !== 'string' || typeof doc.le !== 'string') return false;
/* ⛔ COMPARAISON EN MINUSCULES : les wallets rendent l adresse tantot en EIP-55, tantot non.
* Comparer brut redemanderait au hasard des sessions — un agacement qui apprend a cliquer sans
* lire, exactement ce que la banniere cherche a eviter. */
if (doc.compte.toLowerCase() !== compte.toLowerCase()) return false;
const quand = new Date(doc.le);
if (Number.isNaN(quand.getTime())) return false;
const jours = (maintenant.getTime() - quand.getTime()) / 86400000;
/* ⛔ Une date dans le FUTUR est une donnee corrompue, pas un consentement tres frais. */
if (jours < 0) return false;
return jours <= JOURS;
}
/** Enregistre le consentement de CE compte. ⚠️ Ne leve jamais : un stockage refuse n est pas une panne. */
export function marquerConsentement({ stockage, compte, maintenant = new Date() }) {
if (!compte) return;
/* ⛔ Meme raison qu au-dessus : un stockage `null` doit ne RIEN faire, pas planter. */
if (!stockage) return;
try {
stockage.setItem(CLE, JSON.stringify({ compte: String(compte).toLowerCase(), le: maintenant.toISOString() }));
} catch { /* ⚠️ silencieux ET sans consequence : la case restera simplement a cocher. */ }
}