Note technique du paypal coin
Introduction⌗
Après être tombé sur la news https://newsroom.paypal-corp.com/2023-08-07-PayPal-Launches-U-S-Dollar-Stablecoin qui annonce la sortie d’un jeton ERC20 par PayPal et Paxos ainsi qu’après une recherche sur Twitter on tombe sur quelques informations techniques intéressantes.
C’est un jeton de type ERC20 qui peut-être mis en pause, dont la destruction (Burn) et la création (Mint) de sa quantité est régi par une entitée centralisée.
Composition du jeton⌗
Le proxy du jeton avec lequel les utilisateurs vont interragir est 0x6c3ea9036406852006290770BEdFcAbA0e23A0e8, en oscultant un peu plus le smart-contract, on s’aperçoit qu’il y’a eu plusieurs implémentation du jeton au cours du passé
et que l’ensemble des smart-contracts existent depuis environ 1 an, probablement une phase test avant l’annonce du 2023-08-07 étant donné un volume important de transaction précédant celle-ci.
TODO SCREENSHOT OF PROXY DEPLOYMENT
L’implémentation actuel du jeton étant 0xe17b8adf8e46b15f3f9ab4bb9e3b6e31db09126e la différence majeure avec le code source de l’implémentation précédente était le masquage des termes PayPal/PYUSD par Hopper USD/XYZ.
C’est cette dernière que nous allons étudier, le proxy ne servant qu’à stocker l’état du smart-contract en lieu et place de l’implémentation.
Analyse technique⌗
En préambule, on observe que le contrat utilise une très ancienne version du langage Solidity 0.4.24
en spécifiant la nécéssité des fonctions expérimentales de la version 0.5
.
Le smart-contract est plutôt généreux en commentaire notamment avec une annotation NatSpec orienté développeur et plusieurs lignes au sein de chaque fonction.
Fonctions⌗
Les fonctionnalités présentes dans le smart-contract peuvent être regroupées en 6 familles différentes détaillé ci-dessous.
Proxy⌗
constructor⌗
Fonction executée lors du déploiement de l’implémentation du smart-contract, ici l’implémentation est initializé puis mis en pause pour éviter toute erreur.
initialize⌗
Fonction initialisant l’état du smart-contract tout en prévenant une ré-initialisation lors d’une mise à jour, appelle notamment une autre fonction privée initializeDomainSeparator
en charge de définir le prefix de délégation (le smart-contract et son nom).
ERC20⌗
Les fonctions ci-desous ne sont pas utilisables si l’émetteur ou le récepteur des fonds ont été gelé.
allowance⌗
Accesseur sur la limite de dépense d’un compte Ethereum pour un autre compte.
approve⌗
Définie la limite de dépense d’un compte Ethereum pour un autre compte.
decreaseApproval⌗
Décroie la limite de dépense d’un compte Ethereum pour un autre compte.
increaseApproval⌗
Accroie la limite de dépense d’un compte Ethereum pour un autre compte.
balanceOf⌗
Retourne la quantité de jeton pour un compte Ethereum.
totalSupply⌗
Retourne la quantité total de jeton.
transfer⌗
Transfère la quantité de jeton d’un compte Ethereum vers un autre compte.
transferFrom⌗
Transfère la quantité de jeton d’un compte Ethereum vers un autre compte au travers par le biais d’un tiers compte autorisé.
Owner Admin⌗
Toutes les fonctions ci-dessous sont accessibles uniquement par le possesseur du smart-contract.
proposeOwner⌗
Définie le potentiel nouveau compte possesseur du smart-contract.
disregardProposeOwner⌗
Annule le potentiel nouveau compte possesseur du smart-contract
claimOwnership⌗
Promeut le potentiel compte possesseur en nouveau possesseur.
reclaimPYUSD⌗
Transfère les jetons affectés au contrat au possesseur.
pause⌗
Mets en pause
unpause⌗
Asset protection owner⌗
setAssetProtectionRole
- Définie le gestionnaire de protection des biens
freeze
- Gèle une addresse
unfreeze
- Dégèle une addresse
wipeFrozenAddress
- Détruit les fonds d'une addresse gelée
isFrozen
- Accesseur des addresses gelées
Gestion de la quantité⌗
setSupplyController
- Définie le gestionnaire de quantité
increaseSupply
- Créé et transfère des jetons au gestionnaire de quantité
decreaseSupply
- Détruit des jetons du gestionnaire de quantité.
Gestion de la délégation⌗
nextSeqOf
- Accesseur du nonce (nombre )
betaDelegatedTransfer
- Transfère des fonds au travers d'un tiers
- Le tiers n'est pas enforce par le protocole
- Il est possible de faire des transfères de 0 du moment que l'on paie des fees, cela semble être un
betaDelegatedTransferBatch
- Trans
isWhitelistedBetaDelegate
setBetaDelegateWhitelister
whitelistBetaDelegate
unwhitelistBetaDelegate
Notes⌗
- Utilisation d’accesseur qui sont déjà rajouté par défaut
- Fonction qui retourne toujours les mêmes constantes (vrai)