Şunu netleştireyim: “likidite botu”ndan kastım, bir DEX’te (ör. SunSwap) havuza otomatik likidite ekleyip–çekebilen, ücretleri (LP fee) toplayan ve belirlediğiniz kurallara göre hareket eden yazılım. Piyasa manipülasyonu yapmaz; sadece sizin adınıza işlemleri otomatikler. Aşağıda mimariyi, Tron/TRC20’ye özgü incelikleri ve iskelet kodu veriyorum.
Ne gerekiyor
Önce şu temelleri kurun.
Cüzdan ve anahtar: TronLink ya da güvenli bir donanım cüzdanı; özel anahtar .env içinde.
RPC erişimi: TronGrid veya kendi Full/solidity node’unuz.
DEX seçimi: SunSwap yaygın. Router/Factory/Pair sözleşme adresleri dokümantasyonda.
Enerji & bant genişliği: Tron’da “fee” mantığı enerji/bandwidth ile çalışır; yeterince stake/ödenek yoksa işlemleriniz fail olur.
Test ortamı: Önce Nile testnet’te deneyin; sonra mainnet.
Bot mantığı (özet akış)
1. Havuzu ve tokenları tanımlayın: TRC20 token adresi, eş token (TRX/USDT gibi), ilgili Pair adresi.
2. Onay (approve) verin: Router’ın sizin adınıza token harcayabilmesi için TRC20 approve.
3. Koşul/strateji tanımlayın: ör. fiyat sapması %X’i aşınca ekle/çek; havuz ücretleri Y’yi geçince realize et; hedef token oranını koru.
4. İşlem çağrıları: Router’ın addLiquidity, removeLiquidity fonksiyonları (TRX ile ise addLiquidityTRX).
5. Risk kontrolü: slippage, deadline, maksimum gaz, reentrancy yok, nonce sıralaması; ön–koşul başarısızsa işlemi iptal.
6. İzleme ve kayıt: rezervler, fiyat, LP bakiyesi, gerçekleşen ücretler; hata ve retry mantığı.
TronWeb ile iskelet (Node.js)
> Bu, çalışma mantığını göstermek için minimal bir iskelettir. Adresler/ABI’ler, miktarlar, hata yakalama ve güvenlik kontrollerini üretimde genişletin.
npm i tronweb dotenv
// index.js
require('dotenv').config();
const TronWeb = require('tronweb');
// TronGrid ya da kendi node’unuz
const tronWeb = new TronWeb({
fullHost: '
https://api.trongrid.io', // testte Nile RPC kullanın
privateKey: process.env.PRIVATE_KEY
});
// Sözleşme adresleri (örnek: yer tutucu)
const TOKEN_A = 'TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // TRC20
const TOKEN_B = 'TYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'; // ör. USDT
const ROUTER = 'TROUTERROUTERROUTERROUTERADDR'; // SunSwap Router
// Basit yardımcılar
const toSun = (v, decimals=6) => (BigInt(Math.floor(v * 10**decimals)).toString());
async function approveIfNeeded(token, spender, amount) {
const abi = [{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"type":"function"},
{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"}];
const c = await tronWeb.contract(abi, token);
const me = tronWeb.defaultAddress.base58;
const allowance = await c.allowance(me, spender).call();
if (BigInt(allowance) < BigInt(amount)) {
const tx = await c.approve(spender, amount).send();
console.log('approve tx:', tx);
}
}
async function addLiquiditySimple() {
// örnek miktarlar
const amountADesired = toSun(100, 6); // 100 TOKEN_A
const amountBDesired = toSun(100, 6); // 100 TOKEN_B
const amountAMin = toSun(99, 6); // %1 slippage
const amountBMin = toSun(99, 6);
const deadline = Math.floor(Date.now()/1000) + 60*5;
const routerAbi = [ // addLiquidity imzası
{"name":"addLiquidity","type":"function","inputs":[
{"name":"tokenA","type":"address"},
{"name":"tokenB","type":"address"},
{"name":"amountADesired","type":"uint256"},
{"name":"amountBDesired","type":"uint256"},
{"name":"amountAMin","type":"uint256"},
{"name":"amountBMin","type":"uint256"},
{"name":"to","type":"address"},
{"name":"deadline","type":"uint256"}], "outputs":[
{"name":"amountA","type":"uint256"},
{"name":"amountB","type":"uint256"},
{"name":"liquidity","type":"uint256"}]}
];
// ön onay
await approveIfNeeded(TOKEN_A, ROUTER, amountADesired);
await approveIfNeeded(TOKEN_B, ROUTER, amountBDesired);
const me = tronWeb.defaultAddress.base58;
const router = await tronWeb.contract(routerAbi, ROUTER);
const res = await router.addLiquidity(
TOKEN_A, TOKEN_B,
amountADesired, amountBDesired,
amountAMin, amountBMin,
me, deadline
).send();
console.log('addLiquidity tx:', res);
}
addLiquiditySimple().catch(console.error);
Likidite çekmek için önce LP token adresinizi bulun (Pair sözleşmesi) ve LP’nizi Router’a onaylayıp removeLiquidity çağırın. TRX ile eşlenmiş havuzlarda TRX’e özel fonksiyon imzalarını kullanın.
Strateji ipuçları
Likidite yönetimi sadece “ekle–çek” değildir. Havuz ücreti (ör. %0,3) ile impermanent loss arasında denge kurun; volatil paritelerde hedef oranı koruyan “rebalancing” kuralları kullanın. Büyük miktarı tek işlemde değil, dilimleyerek ekleyin; slippage ve olası MEV/ön–koşu (front-running) riskini azaltır. Enerji yetersizse işlemleriniz revert eder; stake/enerji kiralama planınızı baştan yapın. Tüm işlemleri önce testnet’te simüle edin; mainnet’te küçük tutarlarla “kanarya” işlemler atın.
Güvenlik ve uyum
Anahtar yönetimini ciddiye alın; .env yeterli değilse HSM/çevrimdışı imza düşünün. Botun yaptığı her işlemi loglayın, başarısızlıkta otomatik geri çekmeyin; insan onayı mantığı ekleyin. Kullandığınız borsa/sözleşmenin kullanım koşullarına ve kendi yargı çevrenizdeki finansal düzenlemelere uyun. Kar garantisi yoktur; impermanent loss gerçektir.