Cara Kerja AMM Constant Product: Rumus, Fee, Slippage, dan Kode
Menguji rumus constant product, fee 0,3%, price impact, invariant, dan simulator Python dengan perhitungan reserve yang konsisten.
0xNN · · 9 min read
Cara Kerja AMM Constant Product: Rumus, Fee, Slippage, dan Kode yang Bisa Diuji
Automated Market Maker (AMM) memungkinkan pertukaran aset menggunakan liquidity pool, bukan daftar order beli dan jual. Artikel ini membahas model constant product yang dipakai Uniswap v2:
x × y = k
x dan y adalah reserve dua token. k adalah hasil kalinya. Untuk memahami implementasi aslinya, rujukan utamanya adalah whitepaper Uniswap v2 dan kontrak UniswapV2Pair.
Artikel ini adalah penjelasan teknis, bukan rekomendasi menyediakan likuiditas atau membeli aset.
Spot price bukan execution price
Misalkan pool memiliki:
100 ETH
200.000 USDC
Spot price sebelum swap:
200.000 / 100 = 2.000 USDC per ETH
Angka itu adalah rasio reserve pada satu titik. Trader tidak otomatis dapat membeli ETH dalam jumlah berapa pun pada harga 2.000 USDC. Ketika USDC masuk dan ETH keluar, rasio reserve berubah sepanjang transaksi.
Menghitung output dengan fee 0,3%
Untuk model fee Uniswap v2, jumlah output dapat dihitung dengan:
amountInWithFee = amountIn × 997
amountOut =
amountInWithFee × reserveOut
─────────────────────────────────────
reserveIn × 1000 + amountInWithFee
Contoh Python:
def get_amount_out(amount_in, reserve_in, reserve_out):
if amount_in 7,.0f} USDC -> "
f"{eth_out:>9.6f} ETH | "
f"{usdc_in / eth_out:>9.2f} USDC/ETH"
)
Semakin besar input dibanding reserve, semakin buruk harga efektifnya. Karena itu UI DEX biasanya menampilkan minimum amount out, price impact, dan batas slippage sebelum pengguna menandatangani transaksi.
Invariant pada kontrak sebenarnya
Kontrak Uniswap v2 tidak sekadar menulis:
require(x * y == k);
Pada fungsi swap, kontrak:
1. mengirim output secara optimistis;
2. membaca balance token setelah callback;
3. menghitung berapa input yang benar-benar masuk;
4. menyesuaikan balance untuk fee;
5. memastikan produk balance yang disesuaikan tidak turun dari invariant sebelumnya.
Potongan konsepnya:
uint balance0Adjusted = balance0 * 1000 - amount0In * 3;
uint balance1Adjusted = balance1 * 1000 - amount1In * 3;
require(
balance0Adjusted * balance1Adjusted
>= uint(reserve0) * uint(reserve1) * 10002,
"UniswapV2: K"
);
Kode produksi juga menangani transfer token, callback flash swap, reentrancy lock, overflow untuk versi Solidity yang digunakan, reserve, dan event. Karena itu, class Python tiga puluh baris hanya cocok sebagai simulator matematika—bukan implementasi AMM production.
Dari mana imbalan liquidity provider berasal?
Liquidity provider menyetor kedua aset dan menerima token LP yang merepresentasikan proporsi kepemilikan pool. Fee swap menambah nilai reserve pool. Saat likuiditas ditarik, LP memperoleh bagian sesuai kepemilikannya.
Namun fee bukan keuntungan bebas risiko. Posisi LP menghadapi:
• perubahan harga relatif kedua aset;
• impermanent loss dibanding memegang aset;
• risiko smart contract;
• risiko token dan oracle;
• MEV dan kualitas eksekusi;
• konsentrasi range pada desain concentrated liquidity.
Perbedaan v2 dan concentrated liquidity
Model v2 menyediakan likuiditas di seluruh rentang harga. Desain concentrated liquidity memungkinkan LP menempatkan likuiditas pada rentang tertentu sehingga modal dapat lebih efisien ketika harga berada di rentang tersebut.
Konsekuensinya, posisi memerlukan pengelolaan yang lebih aktif. Ketika harga keluar dari rentang, posisi dapat menjadi hanya salah satu aset dan berhenti memperoleh fee sampai harga kembali atau posisi diubah.
Test sederhana untuk simulator
Jangan percaya output hanya karena program berjalan. Tambahkan invariant test:
def test_swap_keeps_invariant():
reserve_eth = 100.0
reserve_usdc = 200_000.0
k_before = reserve_eth * reserve_usdc
usdc_in = 2_000.0
eth_out = get_amount_out(usdc_in, reserve_usdc, reserve_eth)
k_after = (
(reserve_eth - eth_out)
* (reserve_usdc + usdc_in)
)
assert eth_out > 0
assert eth_out = k_before
Test ini belum membuktikan simulator setara kontrak on-chain, tetapi menangkap kesalahan arah reserve dan output yang sebelumnya mudah terlewat.
Ringkasan
Pada AMM constant product, harga muncul dari hubungan reserve. Swap mengubah reserve, sehingga execution price bergantung pada ukuran transaksi. Fee 0,3% dimasukkan ke rumus melalui faktor 997/1000, dan kontrak memeriksa invariant menggunakan balance setelah transaksi.
Gunakan simulator untuk memahami matematika. Untuk keputusan finansial atau implementasi kontrak, baca kode dan dokumentasi protokol yang benar-benar digunakan.
Referensi
• Uniswap v2 Core whitepaper
• Uniswap v2 UniswapV2Pair.sol
• Uniswap developer documentation