Page cover image

💻 Integrasi Dengan Alpaca Finance

Integrasi Dengan Alpaca Finance

Alpaca Finance membolehkan aplikasi DeFi dan pengguna akhir berintegrasi dengan protokol utamanya. Sebagai contoh mudah, pembangun web dapat membina protokol kompaun automatik yang memasukkan dana pengguna ke peti simpanan Alpaca Finance dan mengumpulkan hasil bagi pengguna untuk kecekapan dan kemudahan gas. Tujuan dokumen ini adalah untuk membantu pemaju menyatukan dengan protokol kami untuk memastikan keselamatan keseluruhan ekosistem.

Sekiranya anda ingin lebih memahami tentang protokol kami, anda boleh menyemak dokumentasi kontrak kami di sini.

Integrasi dengan Alpaca API memerlukan pengesahan, jadi sila hubungi kami di request@alpacafinance.org jika anda ingin menggunakan perkhidmatan ini.

Integrasi Smart Kontrak

Bahagian ini menerangkan cara mengintegrasikan dengan Alpaca Finance secara langsung dari smart kontrak.

Pinjaman

Alpaca Finance membolehkan pengguna memperoleh pendapatan faedah atas aset crypto dengan memasukkannya ke dalam simpanan kami. Aset-aset ini kemudian ditawarkan kepada para farmers untuk leveraged posisi mereka. Sebarang smart kontrak yang sesuai dengan EVM dan digunakan pada BNB Chain boleh berintegrasi dengan protokol pinjaman Alpaca Finance.

Untuk memasukkan token asas ke peti besi Alpaca Finance, senarai peti besi yang tersedia dan token asas yang sesuai harus diperoleh terlebih dahulu.

  • Sila lihat di sini untuk senarai terperinci semua alamat kontrak peti besi.

Sebelum deposit dapat didepositkan ke peti besi, kontrak pintar yang bertindak sebagai pendeposit mesti terlebih dahulu menyetujui elaun perbelanjaan token asas yang akan didepositkan. Ini akan memberikan Smart Kontrak Alpaca keupayaan untuk mendapatkan token dari pengirim.

// JavaScript
import { ERC20 } from '../typechain/ERC20'
import { MaxUint256 } from '@ethersproject/constants'

...

const yourSmartContractAddress = 'xxx'
tokenERC20.approve(yourSmartContractAddress, MaxUint256);

Di atas coretan kod JavaScript adalah aliran kerja yang disederhanakan mengenai cara meluluskan elaun perbelanjaan token dengan jumlah maksimum yang mungkin. Harap diperhatikan bahawa menggunakan MaxUint256 dapat menimbulkan risiko keamanan, disarankan menggunakan jumlah token yang tepat oleh pengguna.

Melakukan deposit dilakukan dengan memanggil kaedah deposit dan menentukan jumlah deposit dalam parameter amountToken. Jenis data amountToken adalah uint256 dan parameter ini mesti diformat hingga perpuluhan token deposit (contohnya, BNB menggunakan 18 perpuluhan, 1 BNB = 10000000000000000000 atau 1 * 1e18). Untuk kes di mana token deposit adalah BNB, peti besi akan menangani pembungkus BNB menjadi wBNB, tetapi urus niaga mesti memasukkan cukup banyak BNB yang dikirim sebagai token asli.

// 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);

Sekiranya deposit berjaya, peti besi akan mengeluarkan token faedah (ibTokens) dan mengembalikan token yang dicetak itu kepada pemanggil. Harap maklum bahawa jumlah token faedah yang dikembalikan tidak akan sama dengan jumlah token asas yang dibekalkan kerana reka bentuk token faedah. Pemanggil kaedah deposit mesti betul-betul mengawasi saham pengguna untuk simpanan di peti besi, sila lihat bahagian Pengiraan Token Bearing Faedah untuk penjelasan terperinci.

Faedah daripada pinjaman akan dikenakan kepada ibTokens. Untuk merealisasikan keuntungan dari pinjaman, ibTokens mesti ditarik balik, menebus kembali token asas + faedah yang dikumpulkan. Anda akan melihat bahawa harga pertukaran ibToken akan lebih tinggi semasa pengeluaran, yang menunjukkan bahawa bunga telah meningkat. Oleh itu, anda akan menerima token asas tambahan semasa mengeluarkannya.

Untuk menebus token asas dari peti besi, jumlah ibTokens yang akan dikeluarkan mesti diberikan kepada kaedah withdraw dalam kontrak Vault.

// Solidity
address vaultContractAddress = '0xd7D069493685A581d27824Fc46EdA46B7EfC0063'; // BNB Vault
IVault(vaultContractAddress).withdraw(ibTokenAmount);

Token asas kemudian akan dikembalikan kepada pemanggil. Sekiranya token yang dikembalikan adalah BNB, kontrak Vault akan melepaskan WBNB kembali ke BNB.

Pengiraan Token Bearing Faedah

Token Bearing Faedah (ibToken) adalah token yang mewakili bahagian peti deposit pendeposit. ibTokens akan memperoleh faedah yang diterima daripada pinjaman dari masa ke masa. Mana-mana protokol DeFi yang ingin menggunakan peti besi Alpaca Finance harus memahami dan melaksanakan pengiraan ibTokens dengan betul untuk mencerminkan bahagian peti besi pengguna yang sebenarnya.

Oleh itu, nisbah antara ibToken dan token asas sebenar hanya akan menjadi 1: 1 apabila peti besi pertama kali dibuka, selepas itu nilai ibToken akan terus meningkat apabila faedah pinjaman bertambah (Nilai ibToken berbanding token asas hanya akan bergerak satu arah ke atas. Nilai tidak boleh menurun). Sebagai contoh, mari kita anggap harganya: 1 ibBNB = 1.0292 BNB yang bermaksud deposit 1.0292 BNB akan mendapat 1 ibBNB sebagai balasan. Sebaliknya, menebus 1 ibBNB akan mendapat 1.0292 BNB sebagai balasannya. Tambahan BNB dari menebus ibBNB adalah dari faedah terakru.

Memahami mekanisme asas nilai ibTokens ini sangat penting, kerana protokol DeFi yang berintegrasi dengan peti simpanan pinjaman Alpaca Finance mungkin perlu mengira bahagian simpanan simpanan peti simpanan pengguna dengan tepat. Kegagalan berbuat demikian boleh menyebabkan risiko keselamatan dan kerugian kewangan. Ini berlaku untuk serangan terhadap bEarn.fi dan ValueDeFi di mana protokol ini selalu menganggap ibTokens mempunyai nisbah 1: 1 dengan token yang mendasari (baca analisis serangan terhadap bEarn.fi dan ValueDefi).

Sebagai tambahan, walaupun Alpaca tidak berfungsi dengan pinjaman kilat, dalam peti besi luaran yang bukan dipunyai oleh Alpaca, mungkin ada risiko manipulasi harga ibToken dari serangan seperti serangan pinjaman kilat. Sekiranya tidak disiapkan, harga ibToken dapat diubah secara drastik dalam ruang lingkup transaksi penyerang. Itulah sebabnya, bergantung pada harga ibToken dari pengiraan kontrak pintar sahaja tidak mencukupi. Kami mengesyorkan agar projek mempunyai harga yang memberi nilai nisbah ibTokens berbanding token asasnya untuk mengelakkan serangan seperti yang disebutkan di atas.

Oleh itu, kami akan menunjukkan cara paling selamat dan betul untuk mengira harga ibTokens.

Pengiraan langsung dari kontrak pintar

Mengira harga token ibToken dari smart kontrak adalah kaedah paling mudah, tetapi untuk ketahanan, ia bukan satu-satunya kaedah yang anda andalkan.

// Solidity
address vaultContractAddress = '0xd7D069493685A581d27824Fc46EdA46B7EfC0063'; // BNB Vault
IVault vault = IVault(vaultContractAddress);
uint256 ibTokenAmount = ...;
uint256 ibTokenPrice = vault.totalToken()).div(vault.totalSupply();
uint256 underlyingTokenAmount = ibTokenAmount.mul(ibTokenPrice);

Coretan kod di atas menunjukkan pengiraan harga ibToken dengan mengambil nilai totalToken dan totalSupply dari peti besi yang sesuai.

Mengambil harga ibToken dari Alpaca API

Alpaca Finance telah menyediakan API untuk mengambil harga ibToken semasa dengan menghantar permintaan GET REST ke titik akhir / ibTokens untuk mendapatkan harga ibToken apa pun. Integrasi dengan Alpaca API memerlukan pengesahan, jadi sila hubungi kami di request@alpacafinance.org jika anda ingin menggunakan perkhidmatan ini.

Hasil sampel dari API adalah seperti berikut:

{
    "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"
        }
    ]
}

Harga yang diambil dari Alpaca API harus diberikan kepada smart kontrak dengan menggunakan harga. Membekalkan harga melalui input ke panggilan smart kontrak akan rentan terhadap serangan suntikan dari klien. Kami sangat menyarankan agar tidak melakukan perkara itu. Contoh oracle harga sederhana dapat dilihat di sini. Dengan menggunakan oracle harga yang dipercayai, anda dapat memastikan integriti dan kebolehpercayaan data harga ibToken.

Kami sangat mengesyorkan mengambil harga ibToken dari pengiraan smart kontrak dan Alpaca API. Kedua sumber data harga ini harus dibandingkan untuk mengelakkan kemungkinan timbulnya anomali data. Sekiranya perbandingan antara kedua sumber berbeza dengan ketara, data harga harus ditolak.

Ringkasnya, proses yang paling selamat untuk mengira harga ibToken adalah seperti berikut:

  1. Hitung harga ibToken dalam kontrak anda sendiri.

  2. Gunakan oracle di luar rantai untuk harga ibToken atau tarik harga tersebut dari Alpaca's API.

  3. Bandingkan 1 dan 2. Sekiranya perbezaannya lebih daripada n% maka kembalikan transaksi.

API Alpaca pada masa ini hanya disenarai putih untuk protokol dan institusi. Untuk meminta akses, sila e-mel kepada kami di request@alpacafinance.org

Staking

Alpaca Finance memberi peluang kepada pengguna. Token yang menarik dan token LP terpilih tersedia untuk stake di kumpulan stake kami untuk menerima hasil tambahan dalam bentuk token ALPACA. Sekiranya anda telah menyimpan dana dan menerima ibTokens, kami mengesyorkan anda memasukkan token tersebut ke dalam kumpulan ini untuk mendapatkan ganjaran maksimum yang ada.

Untuk stake token ke dalam kumpulan staking Alpaca Finance, senarai kumpulan dan token taruhan yang sesuai harus diperoleh terlebih dahulu. Sila lihat di sini untuk senarai secara mendalam semua alamat kontrak kumpulan. Kontrak kumpulan biasanya disebut Fairlaunch di pangkalan data kami.

Melakukan pemerolehan dilakukan dengan memanggil kaedah deposit. Parameternya adalah seperti berikut:

  • _for alamat pendeposit.

  • _pid adalah id kolam bertaruh.

  • _amount adalah jumlah token yang akan disimpan dalam uint256 dinyatakan dalam perpuluhannya (contohnya, ibBNB menggunakan 18 perpuluhan, 1 ibBNB = 10000000000000000000 atau 1 * 1e18)

// Solidity
address fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB pool
IFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);
fairlaunch.deposit(msg.sender, poolId, amount);

Maklumat bahagian staking akan disimpan dalam keadaan smart kontrak. Tidak akan ada token yang dikeluarkan dari staking. Bahagian pengguna boleh diambil dengan memanggil kaedah userInfo dari kontrak Fairlaunch.

Ganjaran daripada staking tidak dikreditkan secara automatik dan mesti dituaikan secara manual. Walau bagaimanapun, melakukan deposit atau pengeluaran di staking pool akan secara automatik menuai sebarang ganjaran yang belum selesai kepada pemanggil. Untuk menuai ganjaran dari kumpulan simpanan, pemanggil mesti memanggil kaedah harvest dari kontrak Fairlaunch dan memberikan pool id.

// Solidity
address fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB pool
IFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);
fairlaunch.harvest(poolId);

Untuk mengeluarkan token staking dari pool, jumlah bahagian pengguna mesti diberikan kepada kaedah withdraw dalam kontrak Fairlaunch.

// Solidity
address fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB pool
IFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);
fairlaunch.withdraw(msg.sender, poolId, amount);

Token staking akan dikembalikan kepada pemanggil dan sebarang ganjaran yang belum selesai juga akan dituai secara automatik.

Persekitaran Testnet

Sebelum pementasan dan penyebaran pengeluaran di Mainnet, kontrak Alpaca Finance mula-mula digunakan di Testnet of BNB Chain. Kontrak Testnet ini terutama dirancang untuk digunakan untuk ujian dalaman untuk pengembangan Alpaca Finance sahaja.

Walau bagaimanapun, kami terbuka kepada pihak ketiga yang berminat untuk menguji integrasi mereka dengan kontrak kami. Token yang digunakan oleh kontrak Testnet dibuat secara dalaman oleh kami. Sekiranya anda ingin memiliki beberapa token ini untuk tujuan ujian, sila hubungi request@alpacafinance.org. Untuk senarai alamat di Testnet, sila lihat di sini.

Last updated