Crypto
March 4, 2025

Если речь не о кормушке, то мне не интересно ✋! 

  1. Откуда взялась кормушка
  2. Как ее выносить (подробное объяснение)
  3. Нюансы кормушки
  4. TL;DR(кому лень все читать, сразу сюда)
  5. Код(софт для автоматизации)
  6. Итоги
  7. Автор
  8. Дисклеймер

1. Начало без воды.

На солане появилась мета "ponzi", ее запустил щиток $IMG(znv3FZt2HFAvzYf5LxzVyryh3mBXWuTRRng25gEZAjh), который рассылал всем холдерам солану. Брал он ее с комиссий с любых транзакций щитка.

щиток продали ---> 10% от суммы в щитке упало фаундеру на кош ---> фаундер встаканил ---> соль с профита разослал холдерам

Появился щиток $ATM(8QhSMvYfXome11VgxFMD75hNbGQXW5QTnjA8khENkY2c), суть та же, но вместо соланы он рассылал $USDC(прожженные солана девы уже поняли в чем прикол), тут и начинается операция "Кормушка"!

Переходим к выносу кормушки!

Любой SPL токен хранится на ATA(associated token account(*далее токен аккаунт)), который ты арендуешь у system program за ~0.002 SOL, и когда он остается пустым, ты можешь обратно забрать себе эти соланы, если ты им не пользуешься. Именно это вы и делаете на claimyoursol или sol-incinerator, когда чистите кош(закрываете токен аккаунты).

Солана блокчейн устроен так, что когда отправляешь кому то любой SPL токен, за аренду токен аккаунта для этого токена платишь именно ты - отправитель.

Скрин 1. Пример рассылки, бот рассылает ревшару в USDC, при этом открывая токен аккаунт, если его нет.
https://solscan.io/tx/2zWBkRXbFhKrggkspyveCMdUHfRK76sxDTw3Uu3tP6iiM48s4ZuDvEfxcnZmPQy1NPcTjKC5S6buS2DwaZiM8JEu
бот открывает мне ATA и присылает мне туда $USDC ---> я вывожу $USDC на стэш-кош, закрываю ATA и получаю 0.002SOL ---> бот снова открывает мне ATA и присылает мне туда $USDC

Делаю 50 кошей и за круг фаундер тратит 0.1SOL на меня, которые в итоге оказываются у меня в кармане.

Нюансы перед кодом.

Мы посчитали, что нужно холдить на коше от 2к токенов(~3$ на тот момент), что бы получат ревшару в $USDC(приходили копейки ~0.0003 $USDC), значит 1 кош окупался за 10 кругов(открывает нам токен аккаунт за 30 центов, которые мы забираем себе, 3 / 0,3 = 10). В пике, кормушка рассылала $USDC(а значит и открывала токен аккаунты) раз в 10 минут, но продержалось это не долго, затем раз в 15 минут, ну а когда темка совсем начала умирать - раз в час.

Так же у кормушки могла закончиться соль на коше и она переставала работать на несколько часов, пока фаундер ее не пополнял. Он не догадывался почему так происходит и докидывал 2 раза в день стабильно по 50-100SOL на "комиссии".

TL;DR

Кормушка присылает ревшару в виде $USDC, открывая токен аккаунт если его нет(0.002SOL, скрин 1) ---> отсылаю $USDC на стэш-кош и закрываю токен аккаунт, забирая эти 0.002SOL себе(скрин 2).

Повторяя так много кругов на много аккаунтов.

Скрин 2. Трансфер $USDC на стэш-кош и закрытие токен аккаунта.

Код для автоматизации(ts).

Как только я нашел кормушку, мною было сразу принято решение делать фермочку, масштабировать и автоматизировать ее!

1. Дисперсером раскидываем соль на коши -

Скрин 3. Раскид в одну транзу.
const DESTINATION_WALLETS = [
    new PublicKey(''),
    new PublicKey(''),
    new PublicKey(''),
    // Добавьте столько адресов, сколько нужно
];

// Количество SOL для отправки на каждый кошелек
const AMOUNT_PER_WALLET = 0.01;

async function disperseSOL() {
    const lamportsPerWallet = AMOUNT_PER_WALLET * LAMPORTS_PER_SOL;

    // Создаем массив инструкций для всех переводов
    const transferInstructions = DESTINATION_WALLETS.map(destinationWallet =>
         SystemProgram.transfer({
            fromPubkey: SOURCE_WALLET.publicKey,
            toPubkey: destinationWallet,
            lamports: lamportsPerWallet,
        })
    );

    try {
        // Получаем последний blockhash
        const { blockhash } = await SOLANA_CONNECTION.getLatestBlockhash('finalized');

        // Создаем и подписываем транзу
        const messageV0 = new TransactionMessage({
            payerKey: SOURCE_WALLET.publicKey,
            recentBlockhash: blockhash,
            instructions: transferInstructions, //пихаем инструкции в транзу
        }).compileToV0Message();
        const transaction = new VersionedTransaction(messageV0);
        transaction.sign([SOURCE_WALLET]);

        // Отправляем транзу
        const txid = await SOLANA_CONNECTION.sendTransaction(transaction);
        console.log(`✅ - Transaction sent: ${txid}`);

2. Покупаем на кошах токен(не мой код) -

async buyTokenWithSol(
        wallet: Keypair,
        tokenMint: string,
        amountInSol: number,
        slippageBps: number = SWAP_SETTINGS.DEFAULT_SLIPPAGE
    ): Promise<SwapResult> {
        try {
            // Получаем котировку
            const quote = await this.getSwapQuote(
                TOKEN_ADDRESSES.SOL,
                tokenMint,
                amountInSol * LAMPORTS_PER_SOL,
                slippageBps
            );

            // Получаем транзакцию для свапа
            const { swapTransaction } = await jupiterApi.swapPost({
                swapRequest: {
                    quoteResponse: quote,
                    userPublicKey: wallet.publicKey.toString(),
                    prioritizationFeeLamports: {
                        priorityLevelWithMaxLamports: {
                            maxLamports: FEES.TRANSACTION * LAMPORTS_PER_SOL,
                            priorityLevel: 'medium',
                        },
                    },
                },
            });

            // Декодируем и отправляем транзакцию
            const transaction = VersionedTransaction.deserialize(
                Buffer.from(swapTransaction, 'base64')
            );

            transaction.sign([wallet]);

            const signature =
                await this.connection.sendTransaction(transaction);

3. Сердце софта - отправляем $USDC на стэш-кош и закрывает токен аккаунт, забирая 0.002SOL себе -

Скрин 4. Пример работы.
const account = await getAssociatedTokenAddress(
                new PublicKey(MINT_ADDRESS),
                WALLET.publicKey
            );
            
            const accountInfo = await SOLANA_CONNECTION.getAccountInfo(account);
            if (!accountInfo) {
                boxContent += `🟡 - Token account does not exist. Skipping Wallet ${walletNumber}.\n`;
                const box = createBox(boxContent);
                console.log(box);
                logToFile(box);
                continue;
            }

            const tokenAccountBalance = await SOLANA_CONNECTION.getTokenAccountBalance(account);
            const transferAmount = Number(tokenAccountBalance.value.amount);

            boxContent += `Attempting to transfer ${transferAmount / (10 ** MINT_DECIMALS)}($USDC) tokens from Wallet: ${WALLET.publicKey.toString()}\n`;

            const recipientATA = await getAssociatedTokenAddress(
                new PublicKey(MINT_ADDRESS),
                RECIPIENT_WALLET
            );
            
            // Трансфер на стэш-кош
            const transferIx = createTransferCheckedInstruction(
                account,
                new PublicKey(MINT_ADDRESS),
                recipientATA,
                WALLET.publicKey,
                transferAmount,
                MINT_DECIMALS
            );
            
            // Закрываем токен аккаунт
            const closeIx = createCloseAccountInstruction(
                account,
                WALLET.publicKey,
                WALLET.publicKey,
                [],
                TOKEN_PROGRAM_ID
            );

            // Устанавливаем приоритет транзакции
            const computeUnitPriceIx = ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priorityFee });

            const { blockhash } = await SOLANA_CONNECTION.getLatestBlockhash('finalized');

            // Создание транзы
            const messageV0 = new TransactionMessage({
                payerKey: WALLET.publicKey,
                recentBlockhash: blockhash,
                instructions: [computeUnitPriceIx, transferIx, closeIx]
            }).compileToV0Message();
            const transaction = new VersionedTransaction(messageV0);
            transaction.sign([WALLET]);

            // Отправка транзы
            const txid = await SOLANA_CONNECTION.sendTransaction(transaction);

4. Выход из темки -
4.1 После того как продадим все токены(разверните 3ий пункт), закроем токен аккаунт этого токена -

const account = await getAssociatedTokenAddress(
                new PublicKey(MINT_ADDRESS),
                WALLET.publicKey,
                undefined,
                TOKEN_PROGRAM // Используем TOKEN_2022_PROGRAM_ID
            );
const closeIx = createCloseAccountInstruction(
                account,
                WALLET.publicKey,
                WALLET.publicKey,
                [], // No multisig (пустой массив)
                TOKEN_PROGRAM // Используем TOKEN_2022_PROGRAM_ID
            );

4.2 Соберем профиты со всех кошей -

            for (let i = 0; i < WALLETS.length; i++) {
                const WALLET = WALLETS[i];
                const walletNumber = i + 1;

            // Получаем баланс кошелька
            const balance = await SOLANA_CONNECTION.getBalance(WALLET.publicKey);
            const solBalance = balance / LAMPORTS_PER_SOL;

            if (solBalance > 0) {
                // Создаем транзакцию для перевода SOL
                const transferIx = SystemProgram.transfer({
                    fromPubkey: WALLET.publicKey,
                    toPubkey: DESTINATION_WALLET,
                    lamports: balance - 5000, // на мин комсу комиссии
                });

                // Получаем последний blockhash
                const { blockhash } = await SOLANA_CONNECTION.getLatestBlockhash('finalized');

                // Создаем и подписываем транзакцию
                const messageV0 = new TransactionMessage({
                    payerKey: WALLET.publicKey,
                    recentBlockhash: blockhash,
                    instructions: [transferIx],
                }).compileToV0Message();
                const transaction = new VersionedTransaction(messageV0);
                transaction.sign([WALLET]);

                // Отправляем транзакцию
                const txid = await SOLANA_CONNECTION.sendTransaction(transaction);

}


Итоги.

На все Логово+ у нас было 210 кошельков, со всеми погрешностями и нюансами, за ~4дня было сдрейнено с кормушки ~60SOL, что по текущим(SOL = 135$) ~8100$! Учите блокчейн, учите кодинг и не надо будет тратить нервы смотря за графиком, будете зарабатывать поиском уязвимостей таких пирамид! Да, я по сути хакнул фаундера и выкачивал у него соль...

Автор.

Все придумал, закодил, написал статью - t.me/AXAXAXAXAXAXAXAXAXAXAXXAXAXAA, кстати там же был шилл этой темки пока она работала)

Специально для t.me/Logovo_DAO

Дисклеймер.

Все сказанное выше - вымысел! Автор призывает не повторять увиденное и не призывает к хакингу! Все персонажи вымышленные, а совпадения с реальностью случайны.