Factory (Factory) Token Tracker |Eherscan (2024)

Factory (Factory) Token Tracker |Eherscan (1)

Tissu(Tissu)

Sponsorisé

Factory (Factory) Token Tracker |Eherscan (9)BC.JEU

- Le meilleur casino ethRéclamer maintenant!

5000+ emplacements et jeux de casino en direct, 50 + cryptos.Inscrivez-vous avec Etherscan et obtenez un bonus de dépôt de 760%.Gagnez Big $, retirez-le rapidement.

Factory (Factory) Token Tracker |Eherscan (10)Cryptowins

BONUS D'ACHECTION DE 200% - Super-surchargez votre crypto jusqu'à 4 BTC!Réclamer maintenant!

Jouez à des centaines de jeux de manière anonyme de toutes les principales cryptos.Rejoignez Cryptowins et commencez à gagner!

Factory (Factory) Token Tracker |Eherscan (11)Cryptoslots

Jouer et obtenir 25 tours gratuits sur les cryptoslotsjoue maintenant

Jouer anonyme sur des jeux impressionnants - Inscrivez-vous maintenant pour 25 spins de jackpot gratuit - d'une valeur de 100 $!

ERC-721

  • Vérifiez l'alimentation des jetons précédents
  • Ajouter un jeton à Metamask (web3)
  • Mettre à jour les informations de jeton
  • Mettre à jour le nom de la balise ou l'étiquette
  • Soumettre les détails de brûlure
  • Adresse du rapport / drapeau

Aperçu

Alimentation totale maximale

258Tissu

Titulaires

208

Total Transferts

-

Marché

Volume (24h)

0,21 eth

Prix min (24h)

205,39 $@ 0.065000 eth

Prix maximum (24h)

458,18 $@ 0.145000 eth

Autre info

Contrat de jeton

0 Gagner 40 Classe 11 Sachase 4 Taca 1 Dafakha 1

  • Transferts
  • Titulaires
  • Inventaire
  • Info
  • Trades NFT
  • Contracter

Chargement...

Chargement

Chargement...

Chargement

Cliquez ici pourmise à jourles informations de jeton / informations générales

#ÉchangePairePrixVolume 24h% Volume
  • Code
  • Lire le contrat
  • Écrire un contrat

Code source du contrat vérifié(Correspondance exacte)

Nom du contrat:

Tissu

Version du compilateur

v0.8.20 + commit.a1b79de6

Optimisation activée:

Ouiavec100courses

Autres réglages:

ParisÉvmulation

Code source de contrat(SoliditéJSON-entrée standardformat)

Factory (Factory) Token Tracker |Eherscan (12)Factory (Factory) Token Tracker |Eherscan (13)IDE

  • Similaire
  • Sol 2umal
  • Soumettre l'audit
  • Comparer

Fichier 1 sur 8: context.sol

// SPDX-license-identificateur: MIT // Contrats OpenZeppelin (Dernière mise à jour v5.0.1) (utils / context.sol) Pragma Solidity ^ 0.8.20; / ** * @DEV fournit des informations sur le contexte d'exécution actuel, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte de l'exécution actuel, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte, y compris le contexte de l'exécution actuel, y compris le contexte, y compris le contexte, y compris les* Expéditeur de la transaction et de ses données.Bien que ceux-ci soient généralement disponibles * via MSG.Sender et Msg.Data, ils ne doivent pas être accessibles de manière aussi directe *, car lorsque vous traitez avec des méta-transactions, l'envoi du compte et * payer pour l'exécution peuvent ne pas être l'expéditeur réel (caren tant que demande * est concernée).* * Ce contrat n'est requis que pour les contrats intermédiaires de type bibliothèque.* / Résumé Contexte du contrat {fonction _msgSender () View interne returns virtuel (adresse) {return msg.sender;} fonction _MSGDATA () View interne Virtual Returns (Bytes callData) {return msg.data;} fonction _ContextSuffixLength () View interne Virtual returns (uint256) {return 0;}}

Fichier 2 sur 8: Merkleproof.sol

// SPDX-License-Identifier : MIT// OpenZeppelin Contracts (dernière mise à jour v5.0.0) (utils/cryptography/MerkleProof.sol)pragma solidity ^0.8.20;/** * @dev Ces fonctions traitent de la vérification de Merkle Tree preuves. * * L'arbre et les preuves peuvent être générés à l'aide de notre * https://github.com/OpenZeppelin/merkle-tree[Bibliothèque JavaScript]. * Vous trouverez un guide de démarrage rapide dans le fichier Lisez-moi. * * AVERTISsem*nT : vous devez éviter d'utiliser des valeurs de feuille d'une longueur de 64 octets avant le * hachage, ou utiliser une fonction de hachage autre que keccak256 pour hacher les feuilles. * En effet, la concaténation d'une paire triée de nœuds internes * dans l'arbre Merkle pourrait être réinterprétée comme une valeur feuille. * La bibliothèque JavaScript d'OpenZeppelin génère des arbres Merkle qui sont sûrs * contre cette attaque dès la sortie de la boîte. */library MerkleProof { /** *@dev La multipreuve fournie n'est pas valide. */ erreur MerkleProofInvalidMultiproof(); /** * @dev Renvoie vrai s'il peut être prouvé qu'une « feuille » fait partie d'un arbre Merkle * défini par « racine ». Pour cela, une « preuve » doit être fournie, contenant * les hachages frères sur la branche depuis la feuille jusqu'à la racine de l'arbre. Chaque * paire de feuilles et chaque paire de pré-images sont supposées triées. */ function verify(bytes32[] mémoire proof, bytes32 root, bytes32 leaf) internal pure return (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version de {verify} */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure return (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Renvoie le hachage reconstruit obtenu en parcourant un arbre Merkle vers le haut * depuis `leaf` en utilisant `proof`. Une « preuve » est valide si et seulement si le hachage * reconstruit correspond à la racine de l'arborescence. Lors du traitement de l'épreuve, les couples * de feuilles & pré-images sont supposés triés. */ function processProof(bytes32[] preuve de mémoire, bytes32 leaf) internal pure return (bytes32) { bytes32 calculatedHash = leaf; for (uint256 i = 0; i < proof.length; i++) {computedHash = _hashPair(computedHash, proof[i]); } renvoie calculéHash ; } /** * @dev Calldata version de {processProof} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) retours purs internes (bytes32) { bytes32 calculatedHash = leaf; for (uint256 i = 0; i < proof.length; i++) {computedHash = _hashPair(computedHash, proof[i]); } renvoie calculéHash ; } /** * @dev Renvoie vrai s'il peut être simultanément prouvé que les `feuilles` font partie d'un arbre Merkle défini par * `root`, selon `proof` et `proofFlags` comme décrit dans {processMultiProof}. * * ATTENTION : Tous les arbres de Merkle n'admettent pas les multipreuves. Voir {processMultiProof} pour plus de détails. */ function multiProofVerify( bytes32[] preuve de mémoire, bool[] preuve de mémoire, bytes32 racine, bytes32[] feuilles de mémoire) retours purs internes (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * Version @dev Calldata de {multiProofVerify} * * ATTENTION : tous les arbres Merkle n'admettent pas les multipreuves. Voir {processMultiProof} pour plus de détails. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure return (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Renvoie la racine d'un arbre reconstruit à partir de `feuilles` et de nœuds frères dans `proof`. La reconstruction * procède en reconstruisant progressivement tous les nœuds internes en combinant une feuille/nœud interne avec soit une autre * feuille/nœud interne, soit un nœud frère de preuve, selon que chaque élément `proofFlags` est vrai ou faux * respectivement. * * ATTENTION : Tous les arbres de Merkle n'admettent pas les multipreuves. Pour utiliser des multipreuves, il suffit de s'assurer que : 1) l'arbre * est complet (mais pas nécessairement parfait), 2) les feuilles à prouver sont dans l'ordre inverse de celles dans l'arbre * (c'est-à-dire vu de droite vers la gauche en commençant par la couche la plus profonde et en continuant à la couche suivante). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure return (bytes32 merkleRoot) { // Cette fonction reconstruit le hachage racine en parcourant l'arborescence à partir des feuilles. La racine est reconstruite en // consommant et produisant des valeurs dans une file d'attente. La file d'attente commence par le tableau `leaves`, puis passe au tableau // `hashes`. À la fin du processus, le dernier hachage du tableau `hashes` doit contenir la racine // de l'arborescence Merkle. uint256 leavesLen = feuilles.longueur; uint256 proofLen = preuve.length; uint256 totalHashes = proofFlags.length; // Vérifier la validité de la preuve. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // Les valeurs xxxPos sont des "pointeurs" vers la prochaine valeur à consommer dans chaque tableau. Tous les accès se font en utilisant // `xxx[xxxPos++]`, qui renvoie la valeur actuelle et incrémente le pointeur, imitant ainsi le "pop" d'une file d'attente. bytes32[] hachages de mémoire = new bytes32[](totalHashes); uint256 leafPos = 0 ; uint256 hashPos = 0 ; uint256 proofPos = 0 ; // A chaque étape, nous calculons le hachage suivant en utilisant deux valeurs : // - une valeur de la "file d'attente principale". Si toutes les feuilles n'ont pas été consommées, on obtient la feuille suivante, sinon on obtient // le hachage suivant. // - selon l'indicateur, soit une autre valeur de la "file d'attente principale" (fusion de branches), soit un élément du tableau // `proof`. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? feuilles[leafPos++] : hachages[hashPos++]; octets32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hachages[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } décoché { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Version Calldata de {processMultiProof}. * * ATTENTION : Tous les arbres de Merkle n'admettent pas les multipreuves. Voir {processMultiProof} pour plus de détails. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure return (bytes32 merkleRoot) { // Cette fonction reconstruit le hachage racine en parcourant l'arborescence à partir des feuilles. La racine est reconstruite en // consommant et produisant des valeurs dans une file d'attente. La file d'attente commence par le tableau `leaves`, puis passe au tableau // `hashes`. À la fin du processus, le dernier hachage du tableau `hashes` doit contenir la racine // de l'arborescence Merkle. uint256 leavesLen = feuilles.longueur; uint256 proofLen = preuve.length; uint256 totalHashes = proofFlags.length; // Vérifier la validité de la preuve. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // Les valeurs xxxPos sont des "pointeurs" vers la prochaine valeur à consommer dans chaque tableau. Tous les accès se font en utilisant // `xxx[xxxPos++]`, qui renvoie la valeur actuelle et incrémente le pointeur, imitant ainsi le "pop" d'une file d'attente. bytes32[] hachages de mémoire = new bytes32[](totalHashes); uint256 leafPos = 0 ; uint256 hashPos = 0 ; uint256 proofPos = 0 ; // A chaque étape, nous calculons le hachage suivant en utilisant deux valeurs : // - une valeur de la "file d'attente principale". Si toutes les feuilles n'ont pas été consommées, on obtient la feuille suivante, sinon on obtient // le hachage suivant. // - selon l'indicateur, soit une autre valeur de la "file d'attente principale" (fusion de branches), soit un élément du tableau // `proof`. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? feuilles[leafPos++] : hachages[hashPos++]; octets32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hachages[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } décoché { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Trie la paire (a, b) et hache le résultat. */ function _hashPair(bytes32 a, bytes32 b) private pure return (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implémentation de keccak256(abi.encode(a, b)) qui n'alloue ni n'étend la mémoire. */ function _efficientHash(bytes32 a, bytes32 b) private pure return (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } }}

Fichier 3 sur 8: pausable.sol

// SPDX-license-identifier: MIT // Contrats Openzeppelin (Dernière mise à jour v5.0.0) (utils / pausable.sol) Pragma Solidity ^ 0.8.20; import {context} de "../utils/context.sol";/ ** * @DEV Contract Module qui permet aux enfants de mettre en œuvre un mécanisme d'arrêt d'urgence * qui peut être déclenché par un compte autorisé.* * Ce module est utilisé par l'héritage.Il mettra à disposition les * modificateurs «quand Notpaused» et «Whenpaused», qui peuvent être appliqués aux * fonctions de votre contrat.Notez qu'ils ne seront pas pauvres en * incluant simplement ce module, une seule fois que les modificateurs seront mis en place.* / Contrat abstrait Pausable est contextuel {bool privé _paused;/ ** * @dev émis lorsque la pause est déclenchée par «compte».* / L'événement a été pauvre (compte d'adresse);/ ** * @dev émis lorsque la pause est levée par `compte '.* / événement non utilisé (compte d'adresse);/ ** * @dev L'opération a échoué car le contrat est interrompu.* / Error LiforcedPause ();/ ** * @dev L'opération a échoué car le contrat n'est pas interrompu.* / error attendPause ();/ ** * @dev initialise le contrat à l'état non utilisé.* / constructor () {_paused = false;} / ** * @DEV Modificateur Pour rendre une fonction appelable uniquement lorsque le contrat n'est pas interrompu.* * Exigences: * * - Le contrat ne doit pas être interrompu.* / modificateur WHERNOTPAUSED () {_RequiRenotPausesed ();_;} / ** * @DEV Modificateur Pour rendre une fonction appelable uniquement lorsque le contrat est interrompu.* * Exigences: * * - Le contrat doit être interrompu.* / Modificateur WhenPaused () {_RequirePaused ();_;} / ** * @dev Renvoie True si le contrat est interrompu et faux autrement.* / fonction paused () public View Virtual Returns (bool) {return _paused;} / ** * @dev lance si le contrat est interrompu.* / Fonction _RequiRenotPausesed () View interne Virtual {if (paused ()) {revert EnforcedPause ();}} / ** * @dev lance si le contrat n'est pas interrompu.* / function _requirepaused () View interne virtuel {if (! paused ()) {revert attendPause ();}} / ** * @dev déclenche l'état arrêté.* * Exigences: * * - Le contrat ne doit pas être interrompu.* / function _pause () virtuel interne quandNotpaused {_paused = true;émettre une pause (_msgSender ());} / ** * @dev revient à l'état normal.* * Exigences: * * - Le contrat doit être interrompu.* / function _unpause () virtuel interne lorsque PAUSED {_paused = false;émettre non usé (_msgSender ());}}

Fichier 4 sur 8: Fabrik.sol

// SPDX-license-identificateur: Solidité mitpragma 0,8.20; // ┬fique/ ┴ ┴ ┴ ┴fique));Error Zerobalance ();error menthefinished ();Error TransferFailed ();error mintNotFinished ();Error mintexepcedsmaxSupply ();Erreur ethreceivingNotAllowed ();Événement Mint (Uint256 indexé _StartTokenId, Uint256 _quantity, bytes32 [] _hashes, adresse indexée _OWNER);Événement AdminwithDrawal (montant indexé UINT256, adresse indexée);mappage (uint256 => bytes32) public tokengenerationparams;BOOL PUBLIC ISGERATINGScriptLocked;// Long Storage TEM du script de génération JavaScript pour la fabrication // Rendu possible dans un avenir lointain, non utilisé sur chaîne publique GeneratingScript;String Public Bustouri;uint256 public immuable mint_cutoff_date;uint256 public Immutable MAX_SUPPLY;/ ** * @param _name - Nom du token * @param _Symbol - symbole de jet(_name, _Symbol) Merkledistribute (_merkleroot, _admin) {generatingscript = _GeneratingScript;BUTURI = _BASURI;Mint_cutoff_date = block.timestamp + _minttimeout;Max_supply = _maxSupply;} fonction lockgeneratingscript () external onlyowner {if (isGeneratingScriptLocked) revert Locked ();isGeneratingScriptLocked = true;} fonction setGeneratingScript (String callData _GeneratingScript) External uniquement unique {if (isGeneratingScriptLocked) revert Locked ();GeneratingScript = _GeneratingScript;} / ** * La fonction @DEV pour la frappe d'une seule NFT, sera utilisée par les utilisateurs finaux, * `CALLBACKGASLIMIT» doit être configuré plus bas pour que le rappel `FAILLRANDOMWORDS` * puisse toujours travailler, mais être moins cher * Flux:menthes the token, demande un nombre aléatoire, ChainLink rappelle à `FAILLLRANDOMWORSS`, où *` TokennerationParams '(hachage aléatoire) se remplit pour le jeton * @param _merkleproof pour vérifier dans le Merkledistribute * @param _index index dans la racine Merkle - MerklePour vérifier dans la menthe MerkleDistributeur * / fonction (uint256 _quantity, bytes32 [] calldata _merkleproof, uint256 _index) external {if (block.timestamp> mint_cutoff_date) revert mintfinid ();_VerifyPofurAndChaim (_index, _quantity, _merkleproof, msg.sender);_Mintinternal (_quantity);} / ** * La fonction @DEV pour la frappe d'un NFT multiple, sera utilisée par la quantité d'administration, * Mints qui ne restait pas à forter * @param _quantity montant de jetons à générer * / fonction Mintremaining (uint32 _quantity) External uniquement {si(block.timestamp  max_supply) reversez mintexepceletsmaxSupply ();_mint (msg.sender, _quantity);Bytes32 [] Mémoire TokennerationParamSevent = new Bytes32 [] (_ Quantité);uint256 i = 0;for (; i <_quantity;) {bytes32 tokenidrandwordhash = keccak256 (abi.encodepacked (startTokenId + i, blockhash (block.number - 1), msg.sender));tokengenerationParams [startTokenId + i] = tokenidrandwordhash;tokengenerationParamSevent [i] = tokeniDrandwordHash;non coché {++ i;}} Emit Mint (startTokenId, _quantity, tokengenerationParamsevent, msg.sender);} fonction setBaseuri (mémoire de chaîne _baséuri) External uniquement unique {basturiri = _baséuri;} fonction _baseuri () View interne returns returns (string memory) {return baliseri;} Fonction retrait (adresse _to) uniquement externe {uint256 _amount = adresse (this) .Balance;if (_amount == 0) REVERT ZEROBALANCE ();émit adminwithDrawal (_amount, _to);(Bool Success,) = msg.Sender.Call {valeur: _amount} ("");if (! Success) REVERT TRANSFERFAILLED ();}}

Fichier 5 sur 8: Merkledistribute.sol

// SPDX-PILENCE-IDENTIFIER: MITPRAGMA SOLIDIDE 0.8.20; Import {Merkleproof} de "@ Openzeppelin / Contracts / Utils / Cryptography / Merkleproof.Sol"; Import {Pausable} à partir de "@ OpenZeppelin / Contracts / Utils / Pausable.Sol"; Import {propriétaire} de" ./utils/owable.sol" ;/** * @title merkledistribute * @author nftfi * @dev version modifiée de MerklekleSistor de l'UniSWAP * https://github.com/uniswap/merkle-stributor */blob/master/contracts/merkledistributor.sol * / contrat Merkledistributeur est propriétaire, pausable {bytes32 public merkleroot;mappage (uint256 => uint256) Private PlatedBitmap;Événement revendiqué (uint256 _index, uint256 _amount, bytes32 [] _merkleproof, adresse indexée _Account);/ ** * @dev Le constructeur initialise les références pour la collection NFTFI.* Il définit également le propriétaire du contrat.* @param _admin le propriétaire initial du contrat, généralement capable de définir les racines de Merkle.* / Constructor (bytes32 _merkleroot, adresse _admin) propriétaire (_admin) {merkleroot = _merkleroot;} fonction isClamed (uint256 _index) Returns de vue publique (bool) {uint256 revendiquéwordIndex = _index / 256;uint256 RelatedBitIndex = _index% 256;uint256 revendiqué = revendiquébitmap [revendiquéwordIndex];uint256 mask = (1 << releasedBitIndex);return revendinedword & mask == mask;} fonction _SetClaimed (uint256 _index) private {uint256 affirméwordIndex = _index / 256;uint256 RelatedBitIndex = _index% 256;RelatedBitmap [revendiquéwordIndex] = RelatedBitmap [revendiquéwordIndex] |(1 << releasedBitIndex);} fonction _verifyPofurAndChaim (uint256 _index, uint256 _amount, bytes32 [] mémoire _merkleproof, adresse _claimer) interne quand les erreurs de coutume (! Isclaimed (_index), "Distributeur: Distributeur: déjà affirmé");// Vérifiez la preuve Merkle.bytes32 node = keccak256 (abi.encodepacked (_index, _claimer, _amount));// solhint-disable-next-line personnalisé-Errors require (Merkleproof.verify (_merkleproof, merkleroot, nœud), "Distributeur: preuve non valide");// Marquez-le affirmé et envoyez le jeton._SetClaimed (_Index);Emit affirmé (_index, _amount, _merkleproof, _claimer);} Fonction _verifyPoHof (uint256 _index, uint256 _amount, bytes32 [] Memory _merkleproof, adresse _claimer) Returns de vue interne (bool) {// Vérifiez la preuve de Merkle.bytes32 node = keccak256 (abi.encodepacked (_index, _claimer, _amount));// solhint-disable-next-line personnalisé-errors return Merkleproof.verify (_merkleproof, merkleroot, nœud);} / ** * @dev déclenche l'état arrêté.* * Exigences: * * - Seul le propriétaire peut appeler cette méthode.* - Le contrat ne doit pas être interrompu.* / Fonction Pause () uniquement unique {_pause ();} / ** * @dev revient à l'état normal.* * Exigences: * * - Seul le propriétaire peut appeler cette méthode.* - Le contrat doit être interrompu.* / fonction inause () External OnlyOwner {_unpause ();}}

Fichier 6 sur 8: propriétaire.sol

// SPDX-license-identificateur: busl-1.1pragma solidité 0.8.20; import {context} de "@ openzeppelin / contracts / utils / context.sol"; / ** * @dev contrat module qui fournit un mécanisme de contrôle d'accès de base, où * il y a un compte (un propriétaire) qui peut être accordé un accès exclusif à * des fonctions spécifiques.* * Par défaut, le compte propriétaire sera celui qui déploie le contrat.Cela * peut plus tard être modifié avec {transfertownership}.* * Ce module est utilisé par l'héritage.Il mettra à disposition le modificateur * «OnlyOwner», qui peut être appliqué à vos fonctions pour restreindre leur utilisation au * propriétaire.* * Version modifiée à partir d'OpenZeppelin / Contracts / Access / Offrable.sol qui permet d'initialiser le propriétaire à l'aide d'un paramètre dans le constructeur * / Résumé Contrat Offrable est Context {Address Private _Owner;adresse privée _ownerANDIDAD;La propriété d'événements est transféré (adresse précédente indexée, adress indexé newowner);/ ** * @dev lance si appelé par un compte autre que le propriétaire.* / modificateur uniquement unique () {// SolHint-disable-next-line personnalisé Errors require (propriétaire () == _msgSender (), "Offrable: l'appelant n'est pas le propriétaire");_;} / ** * @dev initialise le contrat en train de définir le déploieur en tant que propriétaire initial.* / constructeur (adresse _InitialOwner) {_setowner (_InitialOwner);} / ** * @DEV Demandes de transfert de propriété du contrat vers un nouveau compte (`_Newownanderat`).* Ne peut être appelé que par le propriétaire actuel.* / fonction requestransferownership (adresse _newownerANDIDAD) public virtuel uniquement {// solhint-diisable-next-ligne personnalisé exiger (_NewownerANDIDDAD! = Adresse (0), "Offrable: le nouveau propriétaire est l'adresse zéro");_OwnerANDIDAD = _NEWOWNCANDIDAD;} fonction acceptTransferOwnership () public virtual {// solhint-disable-next-line personnalisé-errors require (_ownerANDIDAD == _msgSender (), "propriétaire: non propriétaire candidat");_setowner (_ownerANDIDAD);supprimer _OwnerANDIDAD;} fonction annuleTransferOwnership () public Virtual OnlyOwner {Delete _OwnerANDIDAD;} fonction rejectTransferOwnership () public virtual {// solhint-disable-next-line personnalisé-errors require (_ownerANDIDAD == _msgSender (), "propriétaire: non propriétaire candidat");supprimer _OwnerANDIDAD;} / ** * @dev renvoie l'adresse du propriétaire actuel.* / fonction propriétaire () public View Virtual Returns (adresse) {return _Owner;} / ** * @dev définit le propriétaire.* / fonction _setowner (adresse _Newowner) interne {adresse oldowner = _owner;_OWNER = _NEWOWNER;émettez la propriété TRANSFERRED (Oldowner, _Newowner);}}

Fichier 7 sur 8: ERC721A.SOL

// SPDX-License-Identifier: MIT// ERC721A Contracts v4.3.0// Creator: Chiru Labspragma solidity ^0.8.4;import './IERC721A.sol';/** * @dev Interface of ERC721 token receiver. */interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4);}/** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * The `_sequentialUpTo()` function can be overriden to enable spot mints * (i.e. non-consecutive mints) for `tokenId`s greater than `_sequentialUpTo()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // The amount of tokens minted above `_sequentialUpTo()`. // We call these spot mints (i.e. non-sequential mints). uint256 private _spotMinted; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); if (_sequentialUpTo() < _startTokenId()) _revert(SequentialUpToTooSmall.selector); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID for sequential mints. * * Override this function to change the starting token ID for sequential mints. * * Note: The value returned must never change after any tokens have been minted. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the maximum token ID (inclusive) for sequential mints. * * Override this function to return a value less than 2**256 - 1, * but greater than `_startTokenId()`, to enable spot (non-sequential) mints. * * Note: The value returned must never change after any tokens have been minted. */ function _sequentialUpTo() internal view virtual returns (uint256) { return type(uint256).max; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256 result) { // Counter underflow is impossible as `_burnCounter` cannot be incremented // more than `_currentIndex + _spotMinted - _startTokenId()` times. unchecked { // With spot minting, the intermediate `result` can be temporarily negative, // and the computation must be unchecked. result = _currentIndex - _burnCounter - _startTokenId(); if (_sequentialUpTo() != type(uint256).max) result += _spotMinted; } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256 result) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { result = _currentIndex - _startTokenId(); if (_sequentialUpTo() != type(uint256).max) result += _spotMinted; } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } /** * @dev Returns the total number of tokens that are spot-minted. */ function _totalSpotMinted() internal view virtual returns (uint256) { return _spotMinted; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Returns whether the ownership slot at `index` is initialized. * An uninitialized slot does not necessarily mean that the slot has no owner. */ function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) { return _packedOwnerships[index] != 0; } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * @dev Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; if (tokenId > _sequentialUpTo()) { if (_packedOwnershipExists(packed)) return packed; _revert(OwnerQueryForNonexistentToken.selector); } // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; if (packed & _BITMASK_BURNED == 0) return packed; // Otherwise, the token is burned, and we must revert. // This handles the case of batch burned tokens, where only the burned bit // of the starting slot is set, and remaining slots are left uninitialized. _revert(OwnerQueryForNonexistentToken.selector); } } // Otherwise, the data exists and we can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. // If the token is not burned, return `packed`. Otherwise, revert. if (packed & _BITMASK_BURNED == 0) return packed; } _revert(OwnerQueryForNonexistentToken.selector); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool result) { if (_startTokenId() <= tokenId) { if (tokenId > _sequentialUpTo()) return _packedOwnershipExists(_packedOwnerships[tokenId]); if (tokenId < _currentIndex) { uint256 packed; while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId; result = packed & _BITMASK_BURNED == 0; } } } /** * @dev Returns whether `packed` represents a token that exists. */ function _packedOwnershipExists(uint256 packed) private pure returns (bool result) { assembly { // The following is equivalent to `owner != address(0) && burned == false`. // Symbolically tested. result := gt(and(packed, _BITMASK_ADDRESS), and(packed, _BITMASK_BURNED)) } } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS)); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. from, // `from`. toMasked, // `to`. tokenId // `tokenId`. ) } if (toMasked == 0) _revert(TransferToZeroAddress.selector); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { _revert(TransferToNonERC721ReceiverImplementer.selector); } assembly { revert(add(32, reason), mload(reason)) } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) _revert(MintZeroQuantity.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); uint256 end = startTokenId + quantity; uint256 tokenId = startTokenId; if (end - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector); do { assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } // The `!=` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. } while (++tokenId != end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) _revert(MintToZeroAddress.selector); if (quantity == 0) _revert(MintZeroQuantity.selector); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); if (startTokenId + quantity - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } while (index < end); // This prevents reentrancy to `_safeMint`. // It does not prevent reentrancy to `_safeMintSpot`. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } /** * @dev Mints a single token at `tokenId`. * * Note: A spot-minted `tokenId` that has been burned can be re-minted again. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` must be greater than `_sequentialUpTo()`. * - `tokenId` must not exist. * * Emits a {Transfer} event for each mint. */ function _mintSpot(address to, uint256 tokenId) internal virtual { if (tokenId <= _sequentialUpTo()) _revert(SpotMintTokenIdTooSmall.selector); uint256 prevOwnershipPacked = _packedOwnerships[tokenId]; if (_packedOwnershipExists(prevOwnershipPacked)) _revert(TokenAlreadyExists.selector); _beforeTokenTransfers(address(0), to, tokenId, 1); // Overflows are incredibly unrealistic. // The `numberMinted` for `to` is incremented by 1, and has a max limit of 2**64 - 1. // `_spotMinted` is incremented by 1, and has a max limit of 2**256 - 1. unchecked { // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `true` (as `quantity == 1`). _packedOwnerships[tokenId] = _packOwnershipData( to, _nextInitializedFlag(1) | _nextExtraData(address(0), to, prevOwnershipPacked) ); // Updates: // - `balance += 1`. // - `numberMinted += 1`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += (1 << _BITPOS_NUMBER_MINTED) | 1; // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } ++_spotMinted; } _afterTokenTransfers(address(0), to, tokenId, 1); } /** * @dev Safely mints a single token at `tokenId`. * * Note: A spot-minted `tokenId` that has been burned can be re-minted again. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}. * - `tokenId` must be greater than `_sequentialUpTo()`. * - `tokenId` must not exist. * * See {_mintSpot}. * * Emits a {Transfer} event. */ function _safeMintSpot( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mintSpot(to, tokenId); unchecked { if (to.code.length != 0) { uint256 currentSpotMinted = _spotMinted; if (!_checkContractOnERC721Received(address(0), to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } // This prevents reentrancy to `_safeMintSpot`. // It does not prevent reentrancy to `_safeMint`. if (_spotMinted != currentSpotMinted) revert(); } } } /** * @dev Equivalent to `_safeMintSpot(to, tokenId, '')`. */ function _safeMintSpot(address to, uint256 tokenId) internal virtual { _safeMintSpot(to, tokenId, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck && _msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { _revert(ApprovalCallerNotOwnerNorApproved.selector); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as `_burnCounter` cannot be exceed `_currentIndex + _spotMinted` times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /** * @dev For more efficient reverts. */ function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } }}

Fichier 8 sur 8: ierc721a.sol

// SPDX-License-Identifier : MIT// Contrats ERC721A v4.3.0// Créateur : Chiru Labspragma solidity ^0.8.4;/** * @dev Interface d'ERC721A. */interface IERC721A { /** * L'appelant doit posséder le token ou être un opérateur agréé. */ erreur ApprovalCallerNotOwnerNorApproved(); /** * Le jeton n'existe pas. */ erreur ApprovalQueryForNonexistentToken(); /** * Impossible d'interroger le solde pour l'adresse zéro. */ erreur BalanceQueryForZeroAddress(); /** * Impossible de créer l'adresse zéro. */ erreur MintToZeroAddress(); /** * La quantité de jetons émis doit être supérieure à zéro. */ erreur MintZeroQuantity(); /** * Le jeton n'existe pas. */ erreur OwnerQueryForNonexistentToken(); /** * L'appelant doit posséder le jeton ou être un opérateur agréé. */ erreur TransferCallerNotOwnerNorApproved(); /** * Le jeton doit appartenir à `from`. */ erreur TransferFromIncorrectOwner(); /** * Impossible de transférer en toute sécurité vers un contrat qui n'implémente pas l'interface * ERC721Receiver. */ erreur TransferToNonERC721ReceiverImplementer(); /** * Impossible de transférer vers l'adresse zéro. */ erreur TransferToZeroAddress(); /** * Le jeton n'existe pas. */ erreur URIQueryForNonexistentToken(); /** * La « quantité » frappée avec ERC2309 dépasse la limite de sécurité. */ erreur MintERC2309QuantityExceedsLimit(); /** * Le `extraData` ne peut pas être défini sur un emplacement de propriété non initialisé. */ erreur OwnershipNotInitializedForExtraData(); /** * `_sequentialUpTo()` doit être supérieur à `_startTokenId()`. */ erreur SequentialUpToTooSmall(); /** * Le `tokenId` d'un mint séquentiel dépasse `_sequentialUpTo()`. */ erreur SequentialMintExceedsLimit(); /** * La frappe ponctuelle nécessite un `tokenId` supérieur à `_sequentialUpTo()`. */ erreur SpotMintTokenIdTooSmall(); /** * Impossible de créer un jeton qui existe déjà. */ erreur TokenAlreadyExists(); /** * La fonctionnalité n'est pas compatible avec les menthes ponctuelles. */ erreur NotCompatibleWithSpotMints(); // ================================================= ============= // STRUCTURES // ================================= ============================= struct TokenOwnership { // L'adresse du propriétaire. adresse adresse ; // Stocke l'heure de début de propriété avec une surcharge minimale pour les tokenomics. uint64 startTimestamp ; // Si le jeton a été brûlé. bool brûlé; // Données arbitraires similaires à `startTimestamp` qui peuvent être définies via {_extraData}. uint24 extraData ; } // ================================================ ============== // COMPTEURS DE JETONS // =============================== =============================== /** * @dev Renvoie le nombre total de jetons existants. * Les jetons brûlés réduiront le nombre. * Pour obtenir le nombre total de jetons émis, veuillez consulter {_totalMinted}. */ la fonction totalSupply() renvoie la vue externe (uint256) ; // ================================================= ============= // IERC165 // ================================ ============================= /** * @dev Renvoie true si ce contrat implémente l'interface définie par * `interfaceId`. Consultez la * [Section EIP](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * correspondante pour en savoir plus sur la façon dont ces identifiants sont créés. * * Cet appel de fonction doit utiliser moins de 30 000 gaz. */ la fonction prend en chargeInterface(bytes4 interfaceId) la vue externe renvoie (bool); // ================================================= ============= // IERC721 // ================================ ============================= /** * @dev Émis lorsque le jeton `tokenId` est transféré de `from` à `to `. */ event Transfer (adresse indexée depuis, adresse indexée vers, uint256 indexé tokenId) ; /** * @dev Émis lorsque `owner` permet à `approved` de gérer le jeton `tokenId`. */ Approbation de l'événement (adresse indexée du propriétaire, adresse indexée approuvée, uint256 indexé tokenId) ; /** * @dev Émis lorsque `owner` active ou désactive * (`approved`) `operator` pour gérer tous ses actifs. */ event ApprovalForAll (adresse indexée du propriétaire, adresse de l'opérateur indexé, bool approuvé) ; /** * @dev Renvoie le nombre de jetons dans le compte du « propriétaire ». */ la fonction balanceOf (propriétaire de l'adresse) renvoie la vue externe (solde uint256) ; /** * @dev Renvoie le propriétaire du jeton `tokenId`. * * Exigences : * * - `tokenId` doit exister. */ la fonction OwnerOf(uint256 tokenId) renvoie la vue externe (propriétaire de l'adresse) ; /** * @dev Transfère en toute sécurité le jeton `tokenId` de `from` à `to`, * en vérifiant d'abord que les destinataires du contrat connaissent le protocole ERC721 * pour empêcher les jetons d'être verrouillés pour toujours. * * Exigences : * * - `from` ne peut pas être l'adresse zéro. * - `to` ne peut pas être l'adresse zéro. * - Le jeton `tokenId` doit exister et appartenir à `from`. * - Si l'appelant n'est pas "from", il doit avoir été autorisé à déplacer * ce jeton soit par {approve}, soit par {setApprovalForAll}. * - Si `to` fait référence à un contrat intelligent, il doit implémenter * {IERC721Receiver-onERC721Received}, qui est appelé lors d'un transfert sécurisé. * * Émet un événement {Transfer}. */ function safeTransferFrom (adresse de, adresse à, uint256 tokenId, octets de données d'appel) externe payable ; /** * @dev Équivalent à `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( adresse de, adresse à, uint256 tokenId ) externe payable ; /** * @dev Transfère `tokenId` de `from` à `to`. * * AVERTISsem*nT : l'utilisation de cette méthode est déconseillée, utilisez {safeTransferFrom} * chaque fois que possible. * * Exigences : * * - `from` ne peut pas être l'adresse zéro. * - `to` ne peut pas être l'adresse zéro. * - Le jeton `tokenId` doit appartenir à `from`. * - Si l'appelant n'est pas « de », il doit être approuvé pour déplacer ce jeton * soit par {approve}, soit par {setApprovalForAll}. * * Émet un événement {Transfer}. */ function transferFrom( adresse de, adresse à, uint256 tokenId ) externe payable ; /** * @dev Donne la permission à `to` de transférer le jeton `tokenId` vers un autre compte. * L'approbation est effacée lorsque le jeton est transféré. * * Un seul compte peut être approuvé à la fois, donc l'approbation de l'adresse * zéro efface les approbations précédentes. * * Exigences : * * - L'appelant doit posséder le token ou être un opérateur agréé. * - `tokenId` doit exister. * * Émet un événement {Approval}. */ fonction approuver (adresse à, uint256 tokenId) externe payable ; /** * @dev Approuver ou supprimer `operator` en tant qu'opérateur pour l'appelant. * Les opérateurs peuvent appeler {transferFrom} ou {safeTransferFrom} * pour tout jeton appartenant à l'appelant. * * Exigences : * * - L'opérateur ne peut pas être l'appelant. * * Émet un événement {ApprovalForAll}. */ function setApprovalForAll(opérateur d'adresse, bool _approved) externe ; /** * @dev Renvoie le compte approuvé pour le jeton `tokenId`. * * Exigences : * * - `tokenId` doit exister. */ la fonction getApproved(uint256 tokenId) renvoie la vue externe (opérateur d'adresse) ; /** * @dev Renvoie si « l'opérateur » est autorisé à gérer tous les actifs du « propriétaire ». * * Voir {setApprovalForAll}. */ la fonction isApprovedForAll (propriétaire de l'adresse, opérateur d'adresse) renvoie la vue externe (bool) ; // ================================================= ============= // IERC721Métadonnées // ================================= ============================= /** * @dev Renvoie le nom de la collection de jetons. */ nom de la fonction(), la vue externe renvoie (mémoire de chaînes) ; /** * @dev Renvoie le symbole de la collection de jetons. */ la fonction symbol() renvoie la vue externe (mémoire de chaînes) ; /** * @dev Renvoie l'URI (Uniform Resource Identifier) ​​pour le jeton `tokenId`. */ function tokenURI(uint256 tokenId) retour de la vue externe (mémoire de chaîne) ; // ================================================= ============= // IERC2309 // ================================ ============================= /** * @dev Émis lorsque les jetons de `fromTokenId` à `toTokenId` * (inclus) est transféré de « from » à « to », comme défini dans la norme * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309). * * Voir {_mintERC2309} pour plus de détails. */ event ConsecutiveTransfer(uint256 indexé fromTokenId, uint256 toTokenId, adresse indexée depuis, adresse indexée vers) ;}

Paramètres

?: {"*": {"*": ["evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "métadata", "abi"]}}, "bibliothèques": {}}

Audit de sécurité du contrat

  • Aucun audit de sécurité du contrat soumis-Soumettre l'audit ici

Contrat abi

  • Format JSON
  • Format brut / texte
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"string","name":"_generatingScript","type":"string"},{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"uint256","name":"_mintTimeout","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"EthReceivingNotAllowed","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"Locked","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintExceedsMaxSupply","type":"error"},{"inputs":[],"name":"MintFinished","type":"error"},{"inputs":[],"name":"MintNotFinished","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotCompatibleWithSpotMints","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"SequentialMintExceedsLimit","type":"error"},{"inputs":[],"name":"SequentialUpToTooSmall","type":"error"},{"inputs":[],"name":"SpotMintTokenIdTooSmall","type":"error"},{"inputs":[],"name":"TokenAlreadyExists","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ZeroBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"AdminWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_startTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_quantity","type":"uint256"},{"indexed":false,"internalType":"bytes32[]","name":"_hashes","type":"bytes32[]"},{"indexed":true,"internalType":"address","name":"_owner","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_CUTOFF_DATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generatingScript","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGeneratingScriptLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockGeneratingScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintAllRemaining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_quantity","type":"uint32"}],"name":"mintRemaining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rejectTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwnerCandidate","type":"address"}],"name":"requestTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_generatingScript","type":"string"}],"name":"setGeneratingScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenGenerationParams","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Code de création de contrat

Décompilé bytecodePasser à la vue OPCODES

60c06040523480156200001157600080fd5b5060405162002759380380620027598339810160408190526200003491620001ec565b8585808a8a600262000047838262000363565b50600362000056828262000363565b505060008055506200006881620000b8565b5050600a805460ff60a01b19169055600b55600f62000088858262000363565b50601062000097848262000363565b50620000a482426200042f565b60805260a052506200045795505050505050565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013257600080fd5b81516001600160401b03808211156200014f576200014f6200010a565b604051601f8301601f19908116603f011681019082821181831017156200017a576200017a6200010a565b816040528381526020925086838588010111156200019757600080fd5b600091505b83821015620001bb57858201830151818301840152908201906200019c565b600093810190920192909252949350505050565b80516001600160a01b0381168114620001e757600080fd5b919050565b600080600080600080600080610100898b0312156200020a57600080fd5b88516001600160401b03808211156200022257600080fd5b620002308c838d0162000120565b995060208b01519150808211156200024757600080fd5b620002558c838d0162000120565b985060408b015197506200026c60608c01620001cf565b965060808b01519150808211156200028357600080fd5b620002918c838d0162000120565b955060a08b0151915080821115620002a857600080fd5b50620002b78b828c0162000120565b60c08b015160e0909b0151999c989b509699959894979350505050565b600181811c90821680620002e957607f821691505b6020821081036200030a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200035e57600081815260208120601f850160051c81016020861015620003395750805b601f850160051c820191505b818110156200035a5782815560010162000345565b5050505b505050565b81516001600160401b038111156200037f576200037f6200010a565b6200039781620003908454620002d4565b8462000310565b602080601f831160018114620003cf5760008415620003b65750858301515b600019600386901b1c1916600185901b1785556200035a565b600085815260208120601f198616915b828110156200040057888601518255948401946001909101908401620003df565b50858210156200041f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200045157634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a0516122b9620004a06000396000818161033101528181610bc801526113af0152600081816105ee01528181610780015281816109ad0152610b7901526122b96000f3fe6080604052600436106101ea5760003560e01c80636c0360eb116101135780639e34070f116100ab578063c87b56dd1161006f578063c87b56dd14610587578063e8172d8c146105a7578063e985e9c5146105bc578063f560f24a146105dc578063f844f7da1461061057600080fd5b80639e34070f146104e7578063a0bcfc7f14610507578063a22cb46514610527578063a69ff80014610547578063b88d4fde1461057457600080fd5b80636c0360eb1461041457806370a08231146104295780637b371107146104495780638456cb591461045e5780638da5cb5b1461047357806392fede001461048857806395d89b411461049d57806397099ed5146104b25780639d6fa618146104c757600080fd5b806332cb6b0c1161018657806332cb6b0c1461031f5780633f4ba83a1461035357806342842e0e1461036857806351cff8d91461037b57806354e1534c1461039b5780635c975abb146103b05780635f992fdd146103c5578063608e0265146103da5780636352211e146103f457600080fd5b806301ffc9a7146101ef57806306fdde0314610224578063081812fc14610246578063095ea7b31461027e57806318160ddd146102935780631ff7712f146102b657806323b872dd146102d65780632906a43f146102e95780632eb4a7ab14610309575b600080fd5b3480156101fb57600080fd5b5061020f61020a366004611a62565b610630565b60405190151581526020015b60405180910390f35b34801561023057600080fd5b50610239610682565b60405161021b9190611acf565b34801561025257600080fd5b50610266610261366004611ae2565b610714565b6040516001600160a01b03909116815260200161021b565b61029161028c366004611b12565b61074f565b005b34801561029f57600080fd5b506102a861075f565b60405190815260200161021b565b3480156102c257600080fd5b506102916102d1366004611b3c565b61077e565b6102916102e4366004611bc0565b61080e565b3480156102f557600080fd5b50610291610304366004611bfc565b610973565b34801561031557600080fd5b506102a8600b5481565b34801561032b57600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561035f57600080fd5b506102916109fe565b610291610376366004611bc0565b610a37565b34801561038757600080fd5b50610291610396366004611c22565b610a57565b3480156103a757600080fd5b50610291610b48565b3480156103bc57600080fd5b5061020f610bf7565b3480156103d157600080fd5b50610291610c07565b3480156103e657600080fd5b50600e5461020f9060ff1681565b34801561040057600080fd5b5061026661040f366004611ae2565b610c43565b34801561042057600080fd5b50610239610c4e565b34801561043557600080fd5b506102a8610444366004611c22565b610cdc565b34801561045557600080fd5b50610291610d21565b34801561046a57600080fd5b50610291610d60565b34801561047f57600080fd5b50610266610d97565b34801561049457600080fd5b50610291610da6565b3480156104a957600080fd5b50610239610dd5565b3480156104be57600080fd5b50610291610de4565b3480156104d357600080fd5b506102916104e2366004611c22565b610e46565b3480156104f357600080fd5b5061020f610502366004611ae2565b610efc565b34801561051357600080fd5b50610291610522366004611cc8565b610f3d565b34801561053357600080fd5b50610291610542366004611d10565b610f78565b34801561055357600080fd5b506102a8610562366004611ae2565b600d6020526000908152604090205481565b610291610582366004611d4c565b610fe4565b34801561059357600080fd5b506102396105a2366004611ae2565b61101f565b3480156105b357600080fd5b5061023961109a565b3480156105c857600080fd5b5061020f6105d7366004611dc7565b6110a7565b3480156105e857600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561061c57600080fd5b5061029161062b366004611dfa565b6110d5565b60006301ffc9a760e01b6001600160e01b03198316148061066157506380ac58cd60e01b6001600160e01b03198316145b8061067c5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461069190611e6b565b80601f01602080910402602001604051908101604052809291908181526020018280546106bd90611e6b565b801561070a5780601f106106df5761010080835404028352916020019161070a565b820191906000526020600020905b8154815290600101906020018083116106ed57829003601f168201915b5050505050905090565b600061071f82611135565b610733576107336333d1c03960e21b6111a2565b506000908152600660205260409020546001600160a01b031690565b61075b828260016111ac565b5050565b6001546000540360001961077161124f565b1461077b57600854015b90565b7f00000000000000000000000000000000000000000000000000000000000000004211156107bf5760405163ae5184fb60e01b815260040160405180910390fd5b6107ff8185858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250339250611255915050565b610808846113a1565b50505050565b600061081982611547565b6001600160a01b03948516949091508116841461083f5761083f62a1148160e81b6111a2565b60008281526006602052604090208054338082146001600160a01b038816909114176108835761086f86336110a7565b61088357610883632ce44b5f60e11b6111a2565b801561088e57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036109205760018401600081815260046020526040812054900361091e57600054811461091e5760008181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a48060000361096a5761096a633a954ecd60e21b6111a2565b50505050505050565b3361097c610d97565b6001600160a01b0316146109ab5760405162461bcd60e51b81526004016109a290611ea5565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000004210156109ec576040516321b6aead60e21b815260040160405180910390fd5b6109fb8163ffffffff166113a1565b50565b33610a07610d97565b6001600160a01b031614610a2d5760405162461bcd60e51b81526004016109a290611ea5565b610a3561160f565b565b610a5283838360405180602001604052806000815250610fe4565b505050565b33610a60610d97565b6001600160a01b031614610a865760405162461bcd60e51b81526004016109a290611ea5565b476000819003610aa95760405163334ab3f560e11b815260040160405180910390fd5b6040516001600160a01b0383169082907fef2e7b9687fb6d973600bec02a1a09e5501f486d1078900dc6b9af0e4bdbf86d90600090a3604051600090339083908381818185875af1925050503d8060008114610b21576040519150601f19603f3d011682016040523d82523d6000602084013e610b26565b606091505b5050905080610a52576040516312171d8360e31b815260040160405180910390fd5b33610b51610d97565b6001600160a01b031614610b775760405162461bcd60e51b81526004016109a290611ea5565b7f0000000000000000000000000000000000000000000000000000000000000000421015610bb8576040516321b6aead60e21b815260040160405180910390fd5b6000610bc2611664565b610bec907f0000000000000000000000000000000000000000000000000000000000000000611ef0565b90506109fb816113a1565b600a54600160a01b900460ff1690565b600a546001600160a01b03163314610c315760405162461bcd60e51b81526004016109a290611f03565b600a80546001600160a01b0319169055565b600061067c82611547565b60108054610c5b90611e6b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8790611e6b565b8015610cd45780601f10610ca957610100808354040283529160200191610cd4565b820191906000526020600020905b815481529060010190602001808311610cb757829003601f168201915b505050505081565b60006001600160a01b038216610cfc57610cfc6323d3ad8160e21b6111a2565b506001600160a01b03166000908152600560205260409020546001600160401b031690565b600a546001600160a01b03163314610d4b5760405162461bcd60e51b81526004016109a290611f03565b600a54610c31906001600160a01b0316611672565b33610d69610d97565b6001600160a01b031614610d8f5760405162461bcd60e51b81526004016109a290611ea5565b610a356116c4565b6009546001600160a01b031690565b33610daf610d97565b6001600160a01b031614610c315760405162461bcd60e51b81526004016109a290611ea5565b60606003805461069190611e6b565b33610ded610d97565b6001600160a01b031614610e135760405162461bcd60e51b81526004016109a290611ea5565b600e5460ff1615610e37576040516303cb96db60e21b815260040160405180910390fd5b600e805460ff19166001179055565b33610e4f610d97565b6001600160a01b031614610e755760405162461bcd60e51b81526004016109a290611ea5565b6001600160a01b038116610eda5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a2565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080610f0b61010084611f50565b90506000610f1b61010085611f64565b6000928352600c602052604090922054600190921b9182169091149392505050565b33610f46610d97565b6001600160a01b031614610f6c5760405162461bcd60e51b81526004016109a290611ea5565b601061075b8282611fdb565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610fef84848461080e565b6001600160a01b0383163b156108085761100b84848484611707565b610808576108086368d2bf6b60e11b6111a2565b606061102a82611135565b61103e5761103e630a14c4b560e41b6111a2565b60006110486117ea565b905080516000036110685760405180602001604052806000815250611093565b80611072846117f9565b604051602001611083929190612094565b6040516020818303038152906040525b9392505050565b600f8054610c5b90611e6b565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b336110de610d97565b6001600160a01b0316146111045760405162461bcd60e51b81526004016109a290611ea5565b600e5460ff1615611128576040516303cb96db60e21b815260040160405180910390fd5b600f610a528284836120c3565b600061113f61124f565b82111561115e5760008281526004602052604090205461067c9061183d565b60005482101561119d5760005b50600082815260046020526040812054908190036111935761118c8361217d565b925061116b565b600160e01b161590505b919050565b8060005260046000fd5b60006111b783610c43565b90508180156111cf5750336001600160a01b03821614155b156111f2576111de81336110a7565b6111f2576111f26367d9dca160e11b6111a2565b60008381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b60001990565b61125d611853565b61126684610efc565b156112b35760405162461bcd60e51b815260206004820152601c60248201527f6469737472696275746f723a20616c726561647920636c61696d65640000000060448201526064016109a2565b604080516020808201879052606084901b6001600160601b0319168284015260548083018790528351808403909101815260749092019092528051910120600b5461130090849083611879565b61134c5760405162461bcd60e51b815260206004820152601a60248201527f6469737472696275746f723a20696e76616c69642070726f6f6600000000000060448201526064016109a2565b6113558561188f565b816001600160a01b03167fc6245da4ea45023bfaffbe727ccaa0860751d2d69da6bbaba0337d610ab42c1a868686604051611392939291906121cf565b60405180910390a25050505050565b60006113ab611664565b90507f00000000000000000000000000000000000000000000000000000000000000006113d883836121f7565b11156113f757604051633e0866c760e01b815260040160405180910390fd5b61140133836118cd565b6000826001600160401b0381111561141b5761141b611c3d565b604051908082528060200260200182016040528015611444578160200160208202803683370190505b50905060005b838110156114fd57600061145e82856121f7565b611469600143611ef0565b403360405160200161149b93929190928352602083019190915260601b6001600160601b031916604082015260540190565b60405160208183030381529060405280519060200120905080600d600084876114c491906121f7565b815260200190815260200160002081905550808383815181106114e9576114e961220a565b60209081029190910101525060010161144a565b336001600160a01b0316837fe3a9412cb5e5f183154bfd529c95bc368072d827fd8d83b0ca4e920d97ed927d8685604051611539929190612220565b60405180910390a350505050565b60008181526004602052604090205461155e61124f565b8211156115885761156e8161183d565b1561157857919050565b611588636f96cda160e11b6111a2565b806000036115ec5760005482106115a9576115a9636f96cda160e11b6111a2565b5b506000190160008181526004602052604090205480156115aa57600160e01b81166000036115d757919050565b6115e7636f96cda160e11b6111a2565b6115aa565b600160e01b81166000036115ff57919050565b61119d636f96cda160e11b6111a2565b6116176119ae565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60005460001961077161124f565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6116cc611853565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116473390565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061173c903390899088908890600401612239565b6020604051808303816000875af1925050508015611777575060408051601f3d908101601f1916820190925261177491810190612276565b60015b6117cc573d8080156117a5576040519150601f19603f3d011682016040523d82523d6000602084013e6117aa565b606091505b5080516000036117c4576117c46368d2bf6b60e11b6111a2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606010805461069190611e6b565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806118135750819003601f19909101908152919050565b600160e01b81166001600160a01b039091161190565b61185b610bf7565b15610a355760405163d93c066560e01b815260040160405180910390fd5b60008261188685846119d3565b14949350505050565b600061189d61010083611f50565b905060006118ad61010084611f64565b6000928352600c60205260409092208054600190931b9092179091555050565b60008054908290036118e9576118e963b562e8dd60e01b6111a2565b60008181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b1781179091558084526005909252822080546801000000000000000186020190559081900361194757611947622e076360e81b6111a2565b8183018261195361124f565b60018303111561196d5761196d6340b23f1d60e11b6111a2565b5b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a481816001019150810361196e575060005550505050565b6119b6610bf7565b610a3557604051638dfc202b60e01b815260040160405180910390fd5b600081815b8451811015611a1857611a04828683815181106119f7576119f761220a565b6020026020010151611a20565b915080611a1081612293565b9150506119d8565b509392505050565b6000818310611a3c576000828152602084905260409020611093565b5060009182526020526040902090565b6001600160e01b0319811681146109fb57600080fd5b600060208284031215611a7457600080fd5b813561109381611a4c565b60005b83811015611a9a578181015183820152602001611a82565b50506000910152565b60008151808452611abb816020860160208601611a7f565b601f01601f19169290920160200192915050565b6020815260006110936020830184611aa3565b600060208284031215611af457600080fd5b5035919050565b80356001600160a01b038116811461119d57600080fd5b60008060408385031215611b2557600080fd5b611b2e83611afb565b946020939093013593505050565b60008060008060608587031215611b5257600080fd5b8435935060208501356001600160401b0380821115611b7057600080fd5b818701915087601f830112611b8457600080fd5b813581811115611b9357600080fd5b8860208260051b8501011115611ba857600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215611bd557600080fd5b611bde84611afb565b9250611bec60208501611afb565b9150604084013590509250925092565b600060208284031215611c0e57600080fd5b813563ffffffff8116811461109357600080fd5b600060208284031215611c3457600080fd5b61109382611afb565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115611c6d57611c6d611c3d565b604051601f8501601f19908116603f01168101908282118183101715611c9557611c95611c3d565b81604052809350858152868686011115611cae57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611cda57600080fd5b81356001600160401b03811115611cf057600080fd5b8201601f81018413611d0157600080fd5b6117e284823560208401611c53565b60008060408385031215611d2357600080fd5b611d2c83611afb565b915060208301358015158114611d4157600080fd5b809150509250929050565b60008060008060808587031215611d6257600080fd5b611d6b85611afb565b9350611d7960208601611afb565b92506040850135915060608501356001600160401b03811115611d9b57600080fd5b8501601f81018713611dac57600080fd5b611dbb87823560208401611c53565b91505092959194509250565b60008060408385031215611dda57600080fd5b611de383611afb565b9150611df160208401611afb565b90509250929050565b60008060208385031215611e0d57600080fd5b82356001600160401b0380821115611e2457600080fd5b818501915085601f830112611e3857600080fd5b813581811115611e4757600080fd5b866020828501011115611e5957600080fd5b60209290920196919550909350505050565b600181811c90821680611e7f57607f821691505b602082108103611e9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067c5761067c611eda565b6020808252601c908201527f4f776e61626c653a206e6f74206f776e65722063616e64696461746500000000604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082611f5f57611f5f611f3a565b500490565b600082611f7357611f73611f3a565b500690565b601f821115610a5257600081815260208120601f850160051c81016020861015611f9f5750805b601f850160051c820191505b81811015611fbe57828155600101611fab565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b03811115611ff457611ff4611c3d565b612008816120028454611e6b565b84611f78565b602080601f83116001811461203757600084156120255750858301515b61202f8582611fc6565b865550611fbe565b600085815260208120601f198616915b8281101561206657888601518255948401946001909101908401612047565b50858210156120845787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516120a6818460208801611a7f565b8351908301906120ba818360208801611a7f565b01949350505050565b6001600160401b038311156120da576120da611c3d565b6120ee836120e88354611e6b565b83611f78565b6000601f84116001811461211c576000851561210a5750838201355b6121148682611fc6565b845550612176565b600083815260209020601f19861690835b8281101561214d578685013582556020948501946001909201910161212d565b508682101561216a5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008161218c5761218c611eda565b506000190190565b600081518084526020808501945080840160005b838110156121c4578151875295820195908201906001016121a8565b509495945050505050565b8381528260208201526060604082015260006121ee6060830184612194565b95945050505050565b8082018082111561067c5761067c611eda565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006117e26040830184612194565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061226c90830184611aa3565b9695505050505050565b60006020828403121561228857600080fd5b815161109381611a4c565b6000600182016122a5576122a5611eda565b506001019056fea164736f6c6343000814000a000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001406f48cb0d570a6a44a754c00022dee58f184a55c27479ed349c17d0eb28129f66000000000000000000000000aef67478a5595fc220d43338b8674dc50c6de54f000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000534ab10000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000646616272696b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000646414252494b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002868747470733a2f2f66616272696b2d6d657461646174612e74686574656d706f72616c2e6e65742f000000000000000000000000000000000000000000000000


Bytecode déployé

0x6080604052600436106101ea5760003560e01c80636c0360eb116101135780639e34070f116100ab578063c87b56dd1161006f578063c87b56dd14610587578063e8172d8c146105a7578063e985e9c5146105bc578063f560f24a146105dc578063f844f7da1461061057600080fd5b80639e34070f146104e7578063a0bcfc7f14610507578063a22cb46514610527578063a69ff80014610547578063b88d4fde1461057457600080fd5b80636c0360eb1461041457806370a08231146104295780637b371107146104495780638456cb591461045e5780638da5cb5b1461047357806392fede001461048857806395d89b411461049d57806397099ed5146104b25780639d6fa618146104c757600080fd5b806332cb6b0c1161018657806332cb6b0c1461031f5780633f4ba83a1461035357806342842e0e1461036857806351cff8d91461037b57806354e1534c1461039b5780635c975abb146103b05780635f992fdd146103c5578063608e0265146103da5780636352211e146103f457600080fd5b806301ffc9a7146101ef57806306fdde0314610224578063081812fc14610246578063095ea7b31461027e57806318160ddd146102935780631ff7712f146102b657806323b872dd146102d65780632906a43f146102e95780632eb4a7ab14610309575b600080fd5b3480156101fb57600080fd5b5061020f61020a366004611a62565b610630565b60405190151581526020015b60405180910390f35b34801561023057600080fd5b50610239610682565b60405161021b9190611acf565b34801561025257600080fd5b50610266610261366004611ae2565b610714565b6040516001600160a01b03909116815260200161021b565b61029161028c366004611b12565b61074f565b005b34801561029f57600080fd5b506102a861075f565b60405190815260200161021b565b3480156102c257600080fd5b506102916102d1366004611b3c565b61077e565b6102916102e4366004611bc0565b61080e565b3480156102f557600080fd5b50610291610304366004611bfc565b610973565b34801561031557600080fd5b506102a8600b5481565b34801561032b57600080fd5b506102a87f000000000000000000000000000000000000000000000000000000000000040081565b34801561035f57600080fd5b506102916109fe565b610291610376366004611bc0565b610a37565b34801561038757600080fd5b50610291610396366004611c22565b610a57565b3480156103a757600080fd5b50610291610b48565b3480156103bc57600080fd5b5061020f610bf7565b3480156103d157600080fd5b50610291610c07565b3480156103e657600080fd5b50600e5461020f9060ff1681565b34801561040057600080fd5b5061026661040f366004611ae2565b610c43565b34801561042057600080fd5b50610239610c4e565b34801561043557600080fd5b506102a8610444366004611c22565b610cdc565b34801561045557600080fd5b50610291610d21565b34801561046a57600080fd5b50610291610d60565b34801561047f57600080fd5b50610266610d97565b34801561049457600080fd5b50610291610da6565b3480156104a957600080fd5b50610239610dd5565b3480156104be57600080fd5b50610291610de4565b3480156104d357600080fd5b506102916104e2366004611c22565b610e46565b3480156104f357600080fd5b5061020f610502366004611ae2565b610efc565b34801561051357600080fd5b50610291610522366004611cc8565b610f3d565b34801561053357600080fd5b50610291610542366004611d10565b610f78565b34801561055357600080fd5b506102a8610562366004611ae2565b600d6020526000908152604090205481565b610291610582366004611d4c565b610fe4565b34801561059357600080fd5b506102396105a2366004611ae2565b61101f565b3480156105b357600080fd5b5061023961109a565b3480156105c857600080fd5b5061020f6105d7366004611dc7565b6110a7565b3480156105e857600080fd5b506102a87f000000000000000000000000000000000000000000000000000000006666f8e881565b34801561061c57600080fd5b5061029161062b366004611dfa565b6110d5565b60006301ffc9a760e01b6001600160e01b03198316148061066157506380ac58cd60e01b6001600160e01b03198316145b8061067c5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461069190611e6b565b80601f01602080910402602001604051908101604052809291908181526020018280546106bd90611e6b565b801561070a5780601f106106df5761010080835404028352916020019161070a565b820191906000526020600020905b8154815290600101906020018083116106ed57829003601f168201915b5050505050905090565b600061071f82611135565b610733576107336333d1c03960e21b6111a2565b506000908152600660205260409020546001600160a01b031690565b61075b828260016111ac565b5050565b6001546000540360001961077161124f565b1461077b57600854015b90565b7f000000000000000000000000000000000000000000000000000000006666f8e84211156107bf5760405163ae5184fb60e01b815260040160405180910390fd5b6107ff8185858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250339250611255915050565b610808846113a1565b50505050565b600061081982611547565b6001600160a01b03948516949091508116841461083f5761083f62a1148160e81b6111a2565b60008281526006602052604090208054338082146001600160a01b038816909114176108835761086f86336110a7565b61088357610883632ce44b5f60e11b6111a2565b801561088e57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036109205760018401600081815260046020526040812054900361091e57600054811461091e5760008181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a48060000361096a5761096a633a954ecd60e21b6111a2565b50505050505050565b3361097c610d97565b6001600160a01b0316146109ab5760405162461bcd60e51b81526004016109a290611ea5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000006666f8e84210156109ec576040516321b6aead60e21b815260040160405180910390fd5b6109fb8163ffffffff166113a1565b50565b33610a07610d97565b6001600160a01b031614610a2d5760405162461bcd60e51b81526004016109a290611ea5565b610a3561160f565b565b610a5283838360405180602001604052806000815250610fe4565b505050565b33610a60610d97565b6001600160a01b031614610a865760405162461bcd60e51b81526004016109a290611ea5565b476000819003610aa95760405163334ab3f560e11b815260040160405180910390fd5b6040516001600160a01b0383169082907fef2e7b9687fb6d973600bec02a1a09e5501f486d1078900dc6b9af0e4bdbf86d90600090a3604051600090339083908381818185875af1925050503d8060008114610b21576040519150601f19603f3d011682016040523d82523d6000602084013e610b26565b606091505b5050905080610a52576040516312171d8360e31b815260040160405180910390fd5b33610b51610d97565b6001600160a01b031614610b775760405162461bcd60e51b81526004016109a290611ea5565b7f000000000000000000000000000000000000000000000000000000006666f8e8421015610bb8576040516321b6aead60e21b815260040160405180910390fd5b6000610bc2611664565b610bec907f0000000000000000000000000000000000000000000000000000000000000400611ef0565b90506109fb816113a1565b600a54600160a01b900460ff1690565b600a546001600160a01b03163314610c315760405162461bcd60e51b81526004016109a290611f03565b600a80546001600160a01b0319169055565b600061067c82611547565b60108054610c5b90611e6b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8790611e6b565b8015610cd45780601f10610ca957610100808354040283529160200191610cd4565b820191906000526020600020905b815481529060010190602001808311610cb757829003601f168201915b505050505081565b60006001600160a01b038216610cfc57610cfc6323d3ad8160e21b6111a2565b506001600160a01b03166000908152600560205260409020546001600160401b031690565b600a546001600160a01b03163314610d4b5760405162461bcd60e51b81526004016109a290611f03565b600a54610c31906001600160a01b0316611672565b33610d69610d97565b6001600160a01b031614610d8f5760405162461bcd60e51b81526004016109a290611ea5565b610a356116c4565b6009546001600160a01b031690565b33610daf610d97565b6001600160a01b031614610c315760405162461bcd60e51b81526004016109a290611ea5565b60606003805461069190611e6b565b33610ded610d97565b6001600160a01b031614610e135760405162461bcd60e51b81526004016109a290611ea5565b600e5460ff1615610e37576040516303cb96db60e21b815260040160405180910390fd5b600e805460ff19166001179055565b33610e4f610d97565b6001600160a01b031614610e755760405162461bcd60e51b81526004016109a290611ea5565b6001600160a01b038116610eda5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a2565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080610f0b61010084611f50565b90506000610f1b61010085611f64565b6000928352600c602052604090922054600190921b9182169091149392505050565b33610f46610d97565b6001600160a01b031614610f6c5760405162461bcd60e51b81526004016109a290611ea5565b601061075b8282611fdb565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610fef84848461080e565b6001600160a01b0383163b156108085761100b84848484611707565b610808576108086368d2bf6b60e11b6111a2565b606061102a82611135565b61103e5761103e630a14c4b560e41b6111a2565b60006110486117ea565b905080516000036110685760405180602001604052806000815250611093565b80611072846117f9565b604051602001611083929190612094565b6040516020818303038152906040525b9392505050565b600f8054610c5b90611e6b565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b336110de610d97565b6001600160a01b0316146111045760405162461bcd60e51b81526004016109a290611ea5565b600e5460ff1615611128576040516303cb96db60e21b815260040160405180910390fd5b600f610a528284836120c3565b600061113f61124f565b82111561115e5760008281526004602052604090205461067c9061183d565b60005482101561119d5760005b50600082815260046020526040812054908190036111935761118c8361217d565b925061116b565b600160e01b161590505b919050565b8060005260046000fd5b60006111b783610c43565b90508180156111cf5750336001600160a01b03821614155b156111f2576111de81336110a7565b6111f2576111f26367d9dca160e11b6111a2565b60008381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b60001990565b61125d611853565b61126684610efc565b156112b35760405162461bcd60e51b815260206004820152601c60248201527f6469737472696275746f723a20616c726561647920636c61696d65640000000060448201526064016109a2565b604080516020808201879052606084901b6001600160601b0319168284015260548083018790528351808403909101815260749092019092528051910120600b5461130090849083611879565b61134c5760405162461bcd60e51b815260206004820152601a60248201527f6469737472696275746f723a20696e76616c69642070726f6f6600000000000060448201526064016109a2565b6113558561188f565b816001600160a01b03167fc6245da4ea45023bfaffbe727ccaa0860751d2d69da6bbaba0337d610ab42c1a868686604051611392939291906121cf565b60405180910390a25050505050565b60006113ab611664565b90507f00000000000000000000000000000000000000000000000000000000000004006113d883836121f7565b11156113f757604051633e0866c760e01b815260040160405180910390fd5b61140133836118cd565b6000826001600160401b0381111561141b5761141b611c3d565b604051908082528060200260200182016040528015611444578160200160208202803683370190505b50905060005b838110156114fd57600061145e82856121f7565b611469600143611ef0565b403360405160200161149b93929190928352602083019190915260601b6001600160601b031916604082015260540190565b60405160208183030381529060405280519060200120905080600d600084876114c491906121f7565b815260200190815260200160002081905550808383815181106114e9576114e961220a565b60209081029190910101525060010161144a565b336001600160a01b0316837fe3a9412cb5e5f183154bfd529c95bc368072d827fd8d83b0ca4e920d97ed927d8685604051611539929190612220565b60405180910390a350505050565b60008181526004602052604090205461155e61124f565b8211156115885761156e8161183d565b1561157857919050565b611588636f96cda160e11b6111a2565b806000036115ec5760005482106115a9576115a9636f96cda160e11b6111a2565b5b506000190160008181526004602052604090205480156115aa57600160e01b81166000036115d757919050565b6115e7636f96cda160e11b6111a2565b6115aa565b600160e01b81166000036115ff57919050565b61119d636f96cda160e11b6111a2565b6116176119ae565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60005460001961077161124f565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6116cc611853565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116473390565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061173c903390899088908890600401612239565b6020604051808303816000875af1925050508015611777575060408051601f3d908101601f1916820190925261177491810190612276565b60015b6117cc573d8080156117a5576040519150601f19603f3d011682016040523d82523d6000602084013e6117aa565b606091505b5080516000036117c4576117c46368d2bf6b60e11b6111a2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606010805461069190611e6b565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806118135750819003601f19909101908152919050565b600160e01b81166001600160a01b039091161190565b61185b610bf7565b15610a355760405163d93c066560e01b815260040160405180910390fd5b60008261188685846119d3565b14949350505050565b600061189d61010083611f50565b905060006118ad61010084611f64565b6000928352600c60205260409092208054600190931b9092179091555050565b60008054908290036118e9576118e963b562e8dd60e01b6111a2565b60008181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b1781179091558084526005909252822080546801000000000000000186020190559081900361194757611947622e076360e81b6111a2565b8183018261195361124f565b60018303111561196d5761196d6340b23f1d60e11b6111a2565b5b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a481816001019150810361196e575060005550505050565b6119b6610bf7565b610a3557604051638dfc202b60e01b815260040160405180910390fd5b600081815b8451811015611a1857611a04828683815181106119f7576119f761220a565b6020026020010151611a20565b915080611a1081612293565b9150506119d8565b509392505050565b6000818310611a3c576000828152602084905260409020611093565b5060009182526020526040902090565b6001600160e01b0319811681146109fb57600080fd5b600060208284031215611a7457600080fd5b813561109381611a4c565b60005b83811015611a9a578181015183820152602001611a82565b50506000910152565b60008151808452611abb816020860160208601611a7f565b601f01601f19169290920160200192915050565b6020815260006110936020830184611aa3565b600060208284031215611af457600080fd5b5035919050565b80356001600160a01b038116811461119d57600080fd5b60008060408385031215611b2557600080fd5b611b2e83611afb565b946020939093013593505050565b60008060008060608587031215611b5257600080fd5b8435935060208501356001600160401b0380821115611b7057600080fd5b818701915087601f830112611b8457600080fd5b813581811115611b9357600080fd5b8860208260051b8501011115611ba857600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215611bd557600080fd5b611bde84611afb565b9250611bec60208501611afb565b9150604084013590509250925092565b600060208284031215611c0e57600080fd5b813563ffffffff8116811461109357600080fd5b600060208284031215611c3457600080fd5b61109382611afb565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115611c6d57611c6d611c3d565b604051601f8501601f19908116603f01168101908282118183101715611c9557611c95611c3d565b81604052809350858152868686011115611cae57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611cda57600080fd5b81356001600160401b03811115611cf057600080fd5b8201601f81018413611d0157600080fd5b6117e284823560208401611c53565b60008060408385031215611d2357600080fd5b611d2c83611afb565b915060208301358015158114611d4157600080fd5b809150509250929050565b60008060008060808587031215611d6257600080fd5b611d6b85611afb565b9350611d7960208601611afb565b92506040850135915060608501356001600160401b03811115611d9b57600080fd5b8501601f81018713611dac57600080fd5b611dbb87823560208401611c53565b91505092959194509250565b60008060408385031215611dda57600080fd5b611de383611afb565b9150611df160208401611afb565b90509250929050565b60008060208385031215611e0d57600080fd5b82356001600160401b0380821115611e2457600080fd5b818501915085601f830112611e3857600080fd5b813581811115611e4757600080fd5b866020828501011115611e5957600080fd5b60209290920196919550909350505050565b600181811c90821680611e7f57607f821691505b602082108103611e9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067c5761067c611eda565b6020808252601c908201527f4f776e61626c653a206e6f74206f776e65722063616e64696461746500000000604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082611f5f57611f5f611f3a565b500490565b600082611f7357611f73611f3a565b500690565b601f821115610a5257600081815260208120601f850160051c81016020861015611f9f5750805b601f850160051c820191505b81811015611fbe57828155600101611fab565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b03811115611ff457611ff4611c3d565b612008816120028454611e6b565b84611f78565b602080601f83116001811461203757600084156120255750858301515b61202f8582611fc6565b865550611fbe565b600085815260208120601f198616915b8281101561206657888601518255948401946001909101908401612047565b50858210156120845787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516120a6818460208801611a7f565b8351908301906120ba818360208801611a7f565b01949350505050565b6001600160401b038311156120da576120da611c3d565b6120ee836120e88354611e6b565b83611f78565b6000601f84116001811461211c576000851561210a5750838201355b6121148682611fc6565b845550612176565b600083815260209020601f19861690835b8281101561214d578685013582556020948501946001909201910161212d565b508682101561216a5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008161218c5761218c611eda565b506000190190565b600081518084526020808501945080840160005b838110156121c4578151875295820195908201906001016121a8565b509495945050505050565b8381528260208201526060604082015260006121ee6060830184612194565b95945050505050565b8082018082111561067c5761067c611eda565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006117e26040830184612194565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061226c90830184611aa3565b9695505050505050565b60006020828403121561228857600080fd5b815161109381611a4c565b6000600182016122a5576122a5611eda565b506001019056fea164736f6c6343000814000a

Arguments du constructeur(ABI-codé et est les derniers octets du code de création de contrat ci-dessus)

000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001406f48cb0d570a6a44a754c00022dee58f184a55c27479ed349c17d0eb28129f66000000000000000000000000aef67478a5595fc220d43338b8674dc50c6de54f000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000534ab10000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000646616272696b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000646414252494b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002868747470733a2f2f66616272696b2d6d657461646174612e74686574656d706f72616c2e6e65742f000000000000000000000000000000000000000000000000

----- Vue décodée ---------------
Arg [0]: _name (String): Fabrik
Arre [1]: _Symbl (String): Fabrik
Arg [2]: _merkleroot (bytes32): 0x6f48cb0d570a6a44a754c00022dee58f184a55c27479ed349c17d0eb28129f66
Arg [3]: _Admin (adresse):0 Demandez 478.
Arg [4]: _GeneratingScript (String):
Arg [5]: _basuri (String): https://fabrik-metadata.thetemporal.net/
Arg [6]: _minttimeout (Uint256): 5458609
Arg [7]: _maxSupply (Uint256): 1024

----- Vue encodée ---------------
16 Arguments du constructeur trouvé:
Arg [0]: 000000000000000000000000000000000000000000000000000000000000000100
Arg [1]: 0000000000000000000000000000000000000000000000000000000000000140
Arg [2]: 6f48CB0D570A6A44A754C00022DEE58F184A55C27479ED349C17D0EB28129F66
Arg [3]: 0000000000000000000000000000AEF67478A5595FC220D43338B8674DC50C6DE54F
Arg [4]: 000000000000000000000000000000000000000000000000000000000000000180
Arg [5]: 0000000000000000000000000000000000000000000000000000000000000001A0
Arg [6]: 00000000000000000000000000000000000000000000000000000000000000534AB1
Arg [7]: 0000000000000000000000000000000000000000000000000000000000000400
Arg [8]: 000000000000000000000000000000000000000000000000000000000000000006
Arg [9]: 46616272696B00000000000000000000000000000000000000000000000000
Arg [10]: 000000000000000000000000000000000000000000000000000000000000000006
Arg [11]: 46414252494B00000000000000000000000000000000000000000000000000
Arg [12]: 0000000000000000000000000000000000000000000000000000000000000000
Arg [13]: 000000000000000000000000000000000000000000000000000000000000000028
Arj [14]: 68747470733
Arg [15]: 72616C2E6E65742F0000000000000000000000000000000000000000000000


Chargement...

Chargement

[Télécharger:Exportation de CSV ]]

[Télécharger:Exportation de CSV ]]

Un jeton est une représentation d'un atout en chaîne ou hors chaîne.La page de jeton montre des informations telles que le prix, l'offre totale, les détenteurs, les transferts et les liens sociaux.En savoir plus sur cette page dans notreBase de connaissances.

Connectez un portefeuille
Connectez un portefeuille

Avertissem*nts de version spécifique du compilateur:

Le contrat compilé pourrait être sensible àVerbatiminvalidDeduplication (faible sévérité),FulinlinerNonexpressionsPitargumentSevaluationOrd (basse sévérité),MissingSideEffecteSonselectorAccess (faible sévérité)Bogues du compilateur de solidité.

Factory (Factory) Token Tracker |Eherscan (2024)

References

Top Articles
Latest Posts
Article information

Author: Aracelis Kilback

Last Updated:

Views: 5673

Rating: 4.3 / 5 (64 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Aracelis Kilback

Birthday: 1994-11-22

Address: Apt. 895 30151 Green Plain, Lake Mariela, RI 98141

Phone: +5992291857476

Job: Legal Officer

Hobby: LARPing, role-playing games, Slacklining, Reading, Inline skating, Brazilian jiu-jitsu, Dance

Introduction: My name is Aracelis Kilback, I am a nice, gentle, agreeable, joyous, attractive, combative, gifted person who loves writing and wants to share my knowledge and understanding with you.