Protocole Stakr — Aperçu Agent
Cette skill donne aux agents le contexte pour interagir avec le protocole Stakr : des coffres tokenisés ERC-4626 avec staking multi-récompenses pour tout token ERC-20. Utilisez-la lors de la création d'intégrations, de scripts ou d'outils qui créent des coffres, ajoutent des récompenses, modifient les calendriers de récompenses, ou permettent à un agent d'exploiter son "propre" coffre.
Protocole en un coup d'œil
- StakrVault : Coffre mono-actif ERC-4626. Les utilisateurs déposent l'actif sous-jacent, reçoivent des parts ; ils peuvent verrouiller les parts pour gagner plusieurs tokens de récompense sur des fenêtres configurables.
- StakrVaultFactory : Déploie les coffres et gère la configuration des frais de protocole. Une factory par chaîne.
- Récompenses : Jusqu'à 25 tokens de récompense par coffre. Chaque récompense a
startTime,endTime, et unamounttotal. La distribution est linéaire sur la fenêtre ; la logique est de style Masterchef (récompenses accumulées par part). - Propriété : Un coffre peut avoir un
owner(adresse pouvant ajouter/modifier des récompenses) ouaddress(0)pour l'ajout de récompenses sans permission.
Quand on dit qu'un agent a son "propre coffre", cela signifie : l'agent (ou une EOA/contract contrôlée) est le propriétaire du coffre, donc il peut appeler addRewardToken et modifyRewardToken pour financer et ajuster les récompenses sans permission tierce.
Accent : Ajouter et Modifier des Récompenses (Coffres Appartenant à un Agent)
Les agents qui exploitent leur propre coffre utiliseront surtout ces deux fonctions :
1. addRewardToken(token, amount, settings)
Objectif : Démarrer un nouveau programme de récompense pour un token ERC-20 donné.
- Appelant : Propriétaire du coffre (ou n'importe qui si
owner() == address(0)). - Paramètres :
token: Adresse du token de récompense ERC-20. Ne peut pas être le token de part du coffreaddress(vault).amount: Montant total detokenà distribuer. Les tokens sont retirés demsg.sender; le protocole peut prélever une commission (voirfeeOnAddRewardde la factory).settings:Settings{ startTime, endTime }. La distribution est linéaire destartTimeàendTime; les deux doivent être dans le futur etstartTime < endTime.
- Effets : Enregistre la récompense, retire les tokens (moins la commission) dans le coffre, et émet
AddReward. Les récompenses ne peuvent pas être retirées une fois ajoutées ; elles ne peuvent être que modifiées (étendues ou complétées) viamodifyRewardToken. - Limites : Pas de token de récompense en double ; le coffre ne peut pas avoir plus de 25 récompenses actives.
Utilisez ceci quand l'agent veut créer une nouvelle récompense (ex. lancer un programme d'incitation sur son coffre).
2. modifyRewardToken(token, amount, settings)
Objectif : Ajouter plus de montant et/ou étendre (ou reprogrammer) une récompense existante.
- Appelant : Même chose que
addRewardToken(propriétaire du coffre ou sans permission si le propriétaire est zéro). - Paramètres :
token: Adresse d'un token de récompense déjà actif.amount: Montant supplémentaire detokenà ajouter. Retiré demsg.sender; une commission peut s'appliquer. Ne peut pas réduire le montant existant.settings:Settings{ startTime, endTime }. Règles :- Si la récompense n'a pas encore terminé (
currentTime <= reward.settings.endTime) : vous ne pouvez qu'étendreendTime(et ajouter plus de montant).startTimene peut pas être changé. - Si la récompense a terminé (
currentTime > reward.settings.endTime) : vous pouvez définir une nouvelle fenêtre (startTime,endTime) et ajouter du montant ;accRewardsPerShareest réinitialisé.
- Si la récompense n'a pas encore terminé (
- Effets : Augmente
remainingAmount(et le montant total) deamount, met à jourendTime(et possiblementstartTimesi la récompense a terminé), retire les tokens demsg.sender, et émetModifyReward.
Utilisez ceci quand l'agent veut compléter une récompense existante ou étendre la période de distribution (ou reprogrammer après qu'elle a terminé).
Résumé pour les agents :
- Nouvelle récompense →
addRewardToken(token, amount, settings). - Plus de récompense ou durée plus longue (ou nouvelle fenêtre après la fin) →
modifyRewardToken(token, amount, settings). - Assurez-vous que le coffre a été créé via la factory et que l'agent (ou son adresse contrôlée) est le propriétaire du coffre pour appeler ces fonctions.
Exécuter des Transactions via Bankr
Pour soumettre tout appel Stakr (création de coffre, addRewardToken, modifyRewardToken), d'abord encodez les données d'appel, puis soumettez la transaction via l'API Bankr wallet.
Utilisez un prompt d'agent Bankr en langage naturel :
bankr agent prompt "Call addRewardToken on vault 0x... with token 0x... amount 1000 USDC starting tomorrow for 7 days"
Ou soumettez directement les données d'appel encodées brutes :
bankr wallet submit --to <vault-address> --data <encoded-calldata> --chain base
Pour l'aide à l'encodage des données d'appel, voir la référence API du coffre.
3. Récompenses en streaming (incitations continues)
Les agents peuvent streamer les récompenses dans le temps au lieu de financer une grande fenêtre d'un seul coup :
- Motif : Appelez
addRewardTokenune fois pour démarrer une récompense (montant court si désiré). Puis appelezmodifyRewardTokenà plusieurs reprises pour ajouter plus de montant et étendreendTime. Chaque appel complète la récompense et repousse la fin de la fenêtre de distribution. - Pourquoi : Cela évite de verrouiller un énorme montant pour une longue période. L'agent (ou un script/cron) peut financer le coffre par tranches et étendre la fenêtre selon les besoins, créant effectivement un flux de récompense continu.
- Règles : Tant que la récompense est active (
currentTime <= reward.settings.endTime),modifyRewardTokenne permet que d'étendreendTimeet d'ajouteramount;startTimene peut pas être changé. Après que la récompense a terminé, l'agent peut définir une toute nouvelle fenêtre avecmodifyRewardToken(nouveaustartTimeetendTime) et continuer le streaming.
Utilisez le streaming quand l'agent veut financer les incitations de manière continue (ex. complétages hebdomadaires, ou extension du programme selon le budget) plutôt que de s'engager sur une seule longue fenêtre.
Créer un Coffre Appartenant à un Agent
- Obtenez l'adresse StakrVaultFactory pour la chaîne.
- Sur Base mainnet, la factory est déployée à
0x7Ef55108fa37472296DA59D2287FdA92cd21A0d0(voir sur BaseScan). - Pour un exemple d'implémentation de coffre Stakr sur Base, voir
0x93125009209e23fBAFf2B78712029F7A7CdD23cD(exemple de coffre sur BaseScan).
- Sur Base mainnet, la factory est déployée à
- Appelez
createStakrVault(underlying, name, symbol, description, owner):underlying: Actif sous-jacent ERC-20.name,symbol: Nom/symbole du token de part du coffre.description: Métadonnées courtes (ex. "Coffre d'incitation agent").owner: Définissez à l'adresse de l'agent (ou l'EOA/contract que l'agent contrôle). Utilisezaddress(0)pour l'ajout/modification de récompense sans permission par n'importe qui.
- Utilisez l'adresse du coffre retournée pour tous les appels ultérieurs (
addRewardToken,modifyRewardToken, etc.).
Flux Utilisateur Principaux (pour complétude)
- Dépôt uniquement :
deposit(assets, receiver)(ERC-4626). - Dépôt et verrouillage :
depositAndLock(assets, user). - Verrouiller les parts existantes :
lock(shares, user)(le coffre doit être approuvé pour les parts). - Récolter :
harvest(user)pour envoyer les récompenses en attente àuser. - Déverrouiller :
unlock(shares, user); puis optionnellementunlockAndRedeem(shares, receiver)pour échanger les parts contre l'actif sous-jacent.
Paramètres et Types
- Settings :
struct Settings { uint256 startTime; uint256 endTime; } - Validation :
block.timestamp <= startTimeetstartTime < endTimepour les récompenses nouvelles ou reprogrammées. - Token : Tout ERC-20 sauf le token de part du coffre. L'actif sous-jacent peut être utilisé comme récompense.
Pour les signatures de fonction exactes, les raisons de revert, et les événements, lisez l'API du coffre dans cette skill lors de la mise en œuvre d'appels ou du débogage.