đ»IntĂ©gration Avec Alpaca Finance
Intégration avec Alpaca Finance
Alpaca Finance permet aux applications DeFi et aux utilisateurs finaux de s'intégrer à son protocole principal. à titre d'exemple simple, un développeur pourrait créer un protocole de composition automatique qui dépose les fonds des utilisateurs dans les coffres de dépÎt d'Alpaca Finance et compose les rendements des utilisateurs pour l'efficacité et la commodité du gaz. Le but de ce document est d'aider les développeurs à s'intégrer à notre protocole pour assurer la sécurité globale de l'écosystÚme.
L'intégration avec l'API Alpaca nécessite une authentification, veuillez donc nous contacter à request@alpacafinance.org si vous souhaitez utiliser ce service.
Intégration de contrat intelligent
Cette section décrit comment s'intégrer à Alpaca Finance directement à partir d'un contrat intelligent.
PrĂȘt
Alpaca Finance permet aux utilisateurs de gagner des intĂ©rĂȘts sur les actifs cryptographiques en les dĂ©posant dans nos coffres-forts. Ces actifs sont ensuite offerts aux agriculteurs de rendement pour tirer parti de leurs positions. Tout contrat intelligent compatible EVM et dĂ©ployĂ© sur BNB Chain peut s'intĂ©grer au protocole de prĂȘt d'Alpaca Finance.
Pour dĂ©poser le jeton de base dans les coffres d'Alpaca Finance, la liste des coffres disponibles et leurs jetons de base correspondants doivent d'abord ĂȘtre acquis.
Veuillez voir ici pour la liste détaillée de toutes les adresses de contrat de coffre-fort.
Avant qu'un dĂ©pĂŽt puisse ĂȘtre effectuĂ© dans un coffre-fort, le contrat intelligent qui agit en tant que dĂ©posant doit d'abord approuver l'allocation de dĂ©penses du jeton de base Ă dĂ©poser. Cela donnera au contrat intelligent d'Alpaca la possibilitĂ© d'obtenir des jetons de l'expĂ©diteur.
// JavaScript
import { ERC20 } from '../typechain/ERC20'
import { MaxUint256 } from '@ethersproject/constants'
...
const yourSmartContractAddress = 'xxx'
tokenERC20.approve(yourSmartContractAddress, MaxUint256);
L'extrait de code JavaScript ci-dessus est un flux de travail simplifié sur la façon d'approuver l'allocation de dépenses de jetons avec le montant maximum possible. Veuillez noter que l'utilisation de MaxUint256
peut introduire un risque de sécurité, il est recommandé d'utiliser le montant exact du jeton saisi par l'utilisateur.
Effectuer un dépÎt se fait en appelant la méthode de deposit
et en spécifiant le montant du dépÎt dans le paramÚtre amountToken
. Le type de données amountToken
est uint256
et ce paramĂštre doit ĂȘtre formatĂ© avec les dĂ©cimales du jeton de dĂ©pĂŽt (par exemple, BNB utilise 18 dĂ©cimales, 1 BNB = 10000000000000000000
or 1 * 1e18
). Dans le cas oĂč le jeton de dĂ©pĂŽt est du BNB, le coffre-fort gĂ©rera l'emballage du BNB dans le wBNB, mais la transaction doit inclure suffisamment de BNB envoyĂ© en tant que jeton natif.
// Solidity
address vaultContractAddress = '0xd7D069493685A581d27824Fc46EdA46B7EfC0063'; // BNB Vault
if (msg.value == 0) { // if no native token is sent, then it is a ERC20/BEP20 token deposit
IERC20(tokenAddess).safeTransferFrom(address(msg.sender), address(this), amountToken);
}
// Allow transfer to vault
SafeToken.safeApprove(tokenAddess, vaultContractAddress, amountToken);
// Deposit to vault
IVault(vaultContractAddress).deposit(amountToken);
Si le dĂ©pĂŽt est rĂ©ussi, le coffre-fort frappera des jetons portant intĂ©rĂȘt (ibTokens) et renverra ces jetons frappĂ©s Ă l'appelant. Veuillez noter que le montant du jeton portant intĂ©rĂȘt retournĂ© ne sera pas Ă©gal au montant du jeton de base fourni en raison de la conception des jetons portant intĂ©rĂȘt. L'appelant de la mĂ©thode de deposit
doit suivre correctement les actions des utilisateurs pour les dĂ©pĂŽts dans les coffres, veuillez consulter la section Calcul du jeton portant intĂ©rĂȘt pour une explication dĂ©taillĂ©e.
Les intĂ©rĂȘts du prĂȘt reviendront aux ibTokens. Pour rĂ©aliser les gains du prĂȘt, les ibTokens doivent ĂȘtre retirĂ©s, en rachetant le jeton de base + les intĂ©rĂȘts collectĂ©s. Vous remarquerez que le prix d'Ă©change de l'ibToken serait plus Ă©levĂ© au retrait, ce qui indique que les intĂ©rĂȘts ont dĂ©jĂ couru. Par consĂ©quent, vous recevrez des jetons de base supplĂ©mentaires lors du retrait.
Pour Ă©changer les jetons de base du coffre-fort, le montant des ibTokens Ă retirer doit ĂȘtre fourni Ă la mĂ©thode de withdraw
dans le contrat du Vault
.
// Solidity
address vaultContractAddress = '0xd7D069493685A581d27824Fc46EdA46B7EfC0063'; // BNB Vault
IVault(vaultContractAddress).withdraw(ibTokenAmount);
Calcul du jeton portant intĂ©rĂȘt
Un jeton portant intĂ©rĂȘt (ibToken) est le jeton qui reprĂ©sente la part du coffre-fort du dĂ©posant. Les ibTokens accumuleront les intĂ©rĂȘts reçus des prĂȘts au fil du temps. Tout protocole DeFi souhaitant utiliser les coffres d'Alpaca Finance doit comprendre et implĂ©menter correctement le calcul des ibTokens pour reflĂ©ter les parts rĂ©elles des utilisateurs du coffre.
Par consĂ©quent, le rapport entre un ibToken et le jeton de base rĂ©el ne sera que de 1:1 lors de la premiĂšre ouverture du coffre-fort, aprĂšs quoi la valeur de l'ibToken continuera d'augmenter Ă mesure que les intĂ©rĂȘts de prĂȘt s'accumuleront (la valeur d'un ibToken par rapport au jeton de base ne aller dans un sens vers le haut. La valeur ne peut pas diminuer). Par exemple, supposons le prix : 1 ibBNB = 1.0292 BNB
, ce qui signifie qu'un dĂ©pĂŽt de 1,0292 BNB obtiendra 1 ibBNB en retour. D'un autre cĂŽtĂ©, le rachat de 1 ibBNB obtiendra 1,0292 BNB en retour. Les BNB supplĂ©mentaires provenant du rachat d'ibBNB proviennent des intĂ©rĂȘts courus.
Comprendre ce mĂ©canisme fondamental des valeurs d'ibTokens est crucial, car un protocole DeFi s'intĂ©grant aux coffres-forts de prĂȘt d'Alpaca Finance pourrait avoir besoin de calculer avec prĂ©cision les parts des utilisateurs dans le dĂ©pĂŽt du coffre-fort. Ne pas le faire pourrait entraĂźner des risques pour la sĂ©curitĂ© et des pertes financiĂšres. Ce fut le cas pour les attaques sur bEarn.fi et ValueDeFi dans lesquelles ces protocoles traitaient toujours les ibTokens comme ayant un rapport 1:1 avec le token sous-jacent (lire l'analyse des attaques sur bEarn.fi et ValueDefi).
De plus, bien qu'Alpaca ne fonctionne pas avec les prĂȘts flash, dans un coffre externe non-Alpaca, il pourrait y avoir un risque de manipulation du prix d'ibToken suite Ă une attaque telle qu'une attaque de prĂȘt flash. S'il n'est pas prĂ©parĂ©, le prix d'un ibToken pourrait ĂȘtre radicalement modifiĂ© dans le cadre de la transaction d'un attaquant. C'est pourquoi, s'appuyer sur le prix ibToken du calcul du contrat intelligent seul ne suffit pas. Nous recommandons au projet d'avoir un oracle de prix alimentant le ratio actuel d'ibTokens par rapport Ă son jeton de base pour empĂȘcher une telle attaque mentionnĂ©e ci-dessus.
Par conséquent, nous vous montrerons le moyen le plus sûr et le plus correct de calculer les prix des ibTokens.
Calcul direct Ă partir d'un contrat intelligent
Le calcul du prix du jeton ibToken Ă partir du contrat intelligent est le moyen le plus simple, mais pour plus de robustesse, il ne doit pas ĂȘtre la seule mĂ©thode sur laquelle vous comptez.
// Solidity
address vaultContractAddress = '0xd7D069493685A581d27824Fc46EdA46B7EfC0063'; // BNB Vault
IVault vault = IVault(vaultContractAddress);
uint256 ibTokenAmount = ...;
uint256 ibTokenPrice = vault.totalToken()).div(vault.totalSupply();
uint256 underlyingTokenAmount = ibTokenAmount.mul(ibToken
L'extrait de code ci-dessus illustre un calcul de prix ibToken à partir de la récupération de la valeur de totalToken
et de totalSupply
Ă partir du coffre-fort correspondant.
Récupération du prix ibToken à partir de l'API Alpaca
Alpaca Finance a fourni une API pour récupérer les prix ibToken actuels en envoyant une demande GET
REST au point de terminaison /ibTokens
pour récupérer n'importe quel prix ibToken. L'intégration avec l'API Alpaca nécessite une authentification, veuillez donc nous contacter à request@alpacafinance.org si vous souhaitez utiliser ce service.
L'exemple de résultat de l'API est le suivant :
{
"status": {
"code": 1000,
"messages": [
"OK"
]
},
"data": [
{
"symbol": "ibALPACA",
"baseTokenPerShare": "1.051108636596531492",
"lendingApr": "0.0003638488758058",
"stakingApr": "0.0"
},
{
"symbol": "ibBNB",
"baseTokenPerShare": "1.025808940627339553",
"lendingApr": "9.7785294844178225",
"stakingApr": "316693.265280905443641"
},
{
"symbol": "ibBUSD",
"baseTokenPerShare": "0.972337256352625836",
"lendingApr": "0.368330890561667",
"stakingApr": "2269.786601379154162"
},
{
"symbol": "ibUSDT",
"baseTokenPerShare": "0.913094694500682622",
"lendingApr": "0.0012775198722327",
"stakingApr": "0.0"
},
{
"symbol": "ibBTCB",
"baseTokenPerShare": "1.000006160536069502",
"lendingApr": "6.5534019786376696",
"stakingApr": "0.0"
},
{
"symbol": "ibETH",
"baseTokenPerShare": "0.999463386510494271",
"lendingApr": "0.0000004209960912",
"stakingApr": "0.0"
}
]
}
Le prix rĂ©cupĂ©rĂ© de l'API d'Alpaca doit ĂȘtre fourni au contrat intelligent Ă l'aide d'un oracle de prix. La fourniture des prix via une entrĂ©e Ă un appel de contrat intelligent sera vulnĂ©rable Ă une attaque par injection du client. Nous vous dĂ©conseillons fortement de le faire. Un exemple d'oracle de prix simple pourrait ĂȘtre vu ici. En utilisant un oracle de prix de confiance, vous pouvez garantir l'intĂ©gritĂ© et la fiabilitĂ© des donnĂ©es de prix ibToken.
Nous vous recommandons fortement de rĂ©cupĂ©rer le prix ibToken Ă partir du calcul du contrat intelligent et de l'API Alpaca. Ces deux sources de donnĂ©es sur les prix doivent ĂȘtre comparĂ©es pour Ă©viter toute Ă©ventuelle anomalie de donnĂ©es. Si la comparaison entre les deux sources diffĂšre de maniĂšre significative, les donnĂ©es sur les prix doivent ĂȘtre rejetĂ©es.
En résumé, le processus le plus sûr pour calculer les prix ibToken est le suivant :
Calculez les prix ibToken dans vos propres contrats.
Utilisez un oracle hors chaĂźne pour les prix ibToken ou extrayez ces prix de l'API d'Alpaca.
Comparez 1 et 2. Si la différence est supérieure à n %, annulez la transaction. L'API d'Alpaca est actuellement en liste blanche uniquement pour les protocoles et les institutions.
Pour demander un accĂšs, veuillez nous envoyer un courriel Ă request@alpacafinance.org
Jalonnement
Alpaca Finance offre des opportunitĂ©s de jalonnement aux utilisateurs. Des jetons portant intĂ©rĂȘt et des jetons LP sĂ©lectionnĂ©s sont disponibles pour jalonnement dans nos pools de jalonnement afin de recevoir des rendements supplĂ©mentaires sous la forme de jetons ALPACA. Si vous avez dĂ©posĂ© des fonds et reçu des ibTokens, nous vous recommandons de mettre ces jetons dans ces pools pour gagner le maximum de rĂ©compenses disponibles.
Pour placer les jetons dans les pools de staking d'Alpaca Finance, la liste des pools et leurs jetons de staking correspondants doivent d'abord ĂȘtre acquis. Veuillez voir ici pour une liste dĂ©taillĂ©e de toutes les adresses de contrat de piscine. Le contrat des pools est gĂ©nĂ©ralement appelĂ© Fairlaunch
dans notre base de code. Le jalonnement se fait en appelant la méthode de dépÎt. Les paramÚtres sont les suivants :
Le jalonnement se fait en appelant la méthode de deposit
. Les paramĂštres sont les suivants :
_for
est l'adresse du déposant._pid
est l'identifiant du pool de jalonnement._amount
est le montant du token à déposer dansuint256
exprimé dans ses décimales (par exemple, ibBNB utilise 18 décimales, 1 ibBNB =10000000000000000000
ou1 * 1e18
// Solidity
address fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB pool
IFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);
fairlaunch.deposit(msg.sender, poolId, amount);
ts decimals (for example, ibBNB uses 18 decimals, 1 ibBNB = 10000000000000000000Les informations de la part de jalonnement seront stockĂ©es dans l'Ă©tat du contrat intelligent. Il n'y aura pas de jeton issu du jalonnement. Le partage d'un utilisateur peut ĂȘtre rĂ©cupĂ©rĂ© en appelant la mĂ©thode userInfo
Ă partir du contrat Fairlaunch
.
Les rĂ©compenses du jalonnement ne sont pas automatiquement crĂ©ditĂ©es et doivent ĂȘtre rĂ©coltĂ©es manuellement. Cependant, effectuer un dĂ©pĂŽt ou un retrait sur les pools mis en jeu rĂ©coltera automatiquement toutes les rĂ©compenses en attente pour l'appelant. Pour rĂ©colter les rĂ©compenses d'un pool de jalonnement, l'appelant doit appeler la mĂ©thode de harvest
du contrat Fairlaunch
et fournir l'identifiant du pool.
// Solidity
address fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB pool
IFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);
fairlaunch.harvest(poolId);
Pour retirer les jetons de jalonnement du pool, le montant de la part de l'utilisateur doit ĂȘtre fourni Ă la mĂ©thode de withdraw
dans le contrat Fairlaunch
.
// Solidity
address fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB pool
IFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);
fairlaunch.withdraw(msg.sender, poolId, amount);
Les jetons de jalonnement seront rendus à l'appelant et toutes les récompenses en attente seront également automatiquement récoltées.
Environnement Testnet
Avant les dĂ©ploiements de prĂ©paration et de production sur Mainnet, les contrats Alpaca Finance sont d'abord dĂ©ployĂ©s sur le Testnet de BNB Chain. Ces contrats Testnet sont principalement conçus pour ĂȘtre utilisĂ©s Ă des fins de tests internes pour le dĂ©veloppement d'Alpaca Finance uniquement.
Cependant, nous sommes ouverts aux tiers intéressés à tester leur intégration avec nos contrats. Les jetons utilisés par les contrats Testnet sont créés en interne par nous. Si vous souhaitez avoir certains de ces tokens à des fins de test, veuillez contacter request@alpacafinance.org. Pour la liste des adresses dans le Testnet, veuillez voir ici.
Last updated
Was this helpful?