<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Fedor Popelev</title><generator>teletype.in</generator><description><![CDATA[Fedor Popelev]]></description><image><url>https://img4.teletype.in/files/7b/29/7b29e6a8-003d-4bb4-ad0d-c6686c41993e.png</url><title>Fedor Popelev</title><link>https://teletype.in/@popelev</link></image><link>https://teletype.in/@popelev?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/popelev?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/popelev?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 23 Sep 2026 12:50:47 GMT</pubDate><lastBuildDate>Wed, 23 Sep 2026 12:50:47 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@popelev/honeypot</guid><link>https://teletype.in/@popelev/honeypot?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/honeypot?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Медовая ловушка на криптанов</title><pubDate>Mon, 25 Dec 2023 18:19:48 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ee/5b/ee5b5fd2-7b10-4c94-8c8a-179c798a3948.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/e3/c8/e3c84767-ce1f-405c-a3c9-5aaa2b1dee4b.png"></img>Смарт-контракты криптомошенников отличаются очевидной уязвимостью, которая позволяет получить весомую прибыль. Однако у ловушки есть условие: жертва должна заплатить процент за такой «подарок» из своего кармана. Когда это происходит, средства пользователя автоматически переводятся на кошелек скамера.]]></description><content:encoded><![CDATA[
  <figure id="Ot91" class="m_column">
    <img src="https://img3.teletype.in/files/e3/c8/e3c84767-ce1f-405c-a3c9-5aaa2b1dee4b.png" width="2024" />
  </figure>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="u2Y8">Смарт-контракты криптомошенников отличаются очевидной уязвимостью, которая позволяет получить весомую прибыль. Однако у ловушки есть условие: жертва должна заплатить процент за такой «подарок» из своего кармана. Когда это происходит, средства пользователя автоматически переводятся на кошелек скамера.</p>
    <p id="Jl1L">Таким образом человек ведется на приманку, концентрируясь на явной ошибке и возможности наживы, не замечая несколько уровней сложности.</p>
  </section>
  <p id="Fsmh"></p>
  <p id="VWUB">В начале своего пути в крипте, когда почти ни чего не понимал в кодинге смарт-контрактов сам чуть не попал в такую ловушку</p>
  <p id="NIn2">Изучал последние добавленные блоки на езерскане и наткнулся на такой контракт-квиз</p>
  <p id="bO3C"><a href="https://etherscan.io/address/0xad63b86d77b9c84cbc81cf3c1cf5136de0297e11" target="_blank">https://etherscan.io/address/0xad63b86d77b9c84cbc81cf3c1cf5136de0297e11</a></p>
  <p id="VDQp">Админ кладет призовые эфиры на адрес контракта и загадывает загадку. А отгадывающий отправляет 1 эфир и ответ, если ответ правильный, то ему отправляются все эфиры в качестве приза</p>
  <figure id="HUUF" class="m_column">
    <img src="https://img3.teletype.in/files/aa/a5/aaa5bf40-1158-49ce-86f4-3e4293a9ef62.png" width="1774" />
  </figure>
  <p id="phB2">Взглянув на функцию Start мы видим что ответ на загадку посылается как параметр в незашифрованном виде, а значит мы можем увидеть его в езерскане.</p>
  <p id="tT9S">УРА! пошли в езерскан смотреть ответ!</p>
  <figure id="WMSG" class="m_retina">
    <img src="https://img1.teletype.in/files/0c/a1/0ca1749c-d6bc-4618-b3c6-2a8993864f07.png" width="1389" />
  </figure>
  <p id="eScz">Вот транзакция в которой хранится ответ. Ну ничего себе! еще и 30 эфиров. Я буду богат! </p>
  <p id="QWA6">Скорей открываю транзакцию  вижу заветный ответ</p>
  <figure id="Pmzl" class="m_retina">
    <img src="https://img2.teletype.in/files/9a/31/9a318492-2780-4fee-b5c0-735f560fc74b.png" width="737" />
  </figure>
  <p id="bPJM">Нет, нет, не может быть все просто. Здесь где то обман!</p>
  <p id="eE1N">Иду смотреть контракт снова.</p>
  <p id="y76y">Ответ на загадку хранится в как bytes32. В функции Start эта переменная сохраняет хеш из строки, которую только что нашел на езерскане.</p>
  <p id="qrZL">А в функции New эта переменная не расчитывается ончейн, а значит ее знает только админ</p>
  <figure id="nwvK" class="m_retina">
    <img src="https://img4.teletype.in/files/f1/99/f199e1b1-a294-4beb-9a9e-ee0693ed3c00.png" width="797" />
  </figure>
  <p id="POvA">Может функия New не была еще вызвана? снова смотрим езерскан.</p>
  <p id="q0Tv">Во внешних вызовах нет New</p>
  <figure id="Avi1" class="m_retina">
    <img src="https://img3.teletype.in/files/6d/d2/6dd2b288-fecb-4078-988d-94a4c9e03cc9.png" width="1384" />
  </figure>
  <p id="1JWJ">Во внутриних вызовах только пересылка эфиров</p>
  <figure id="EQfd" class="m_retina">
    <img src="https://img2.teletype.in/files/52/3f/523f6e79-cfe6-452f-a2a1-c4da7526a2be.png" width="1375" />
  </figure>
  <p id="AHtO">Может езерскан врет. Нужен более профессиональный инструмент! воспользуемся тендерли</p>
  <figure id="IuZv" class="m_retina">
    <img src="https://img2.teletype.in/files/1c/09/1c09410d-0d78-4d33-b3b1-9cf824dc6203.png" width="1169" />
  </figure>
  <p id="GHDg">Тут тоже нет вызова New. Похоже мошенник забыл активировать ловушку! и я все таки могу забрать 30 эфиров</p>
  <p id="tuH3">А, стоп, а что это?</p>
  <figure id="e7nq" class="m_retina">
    <img src="https://img3.teletype.in/files/22/67/2267c21d-24b5-43da-836d-8bd5be84bb89.png" width="1378" />
  </figure>
  <p id="qB2i">Вот спрятанная транзакиция, активирующая ловушку!</p>
  <figure id="pJt1" class="m_retina">
    <img src="https://img4.teletype.in/files/f8/f0/f8f08d66-aeea-4ff0-90f2-95c7670f8505.png" width="1382" />
  </figure>
  <figure id="6H9T" class="m_column">
    <img src="https://img3.teletype.in/files/2b/3d/2b3d8ad4-380b-4b41-8672-16fce2d96ef7.png" width="1574" />
  </figure>
  <p id="Lp49">Но даже если бы эта ловушка не была активирована - не факт что удалось бы вывести 30 эфиров.</p>
  <p id="MlqX">Возможно, что нашу транзакцию зафронтранили и снял бы эфиры раньше нас</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/Ethernaut_Puzzle_Wallet_Proxy_Delegatecall</guid><link>https://teletype.in/@popelev/Ethernaut_Puzzle_Wallet_Proxy_Delegatecall?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/Ethernaut_Puzzle_Wallet_Proxy_Delegatecall?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Решение задач Ethernaut. Puzzle Wallet. Proxy &amp; Delegatecall</title><pubDate>Wed, 13 Dec 2023 12:13:47 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/70/a3/70a3de54-b6bd-485e-a51f-ce8e5c1e1331.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/aa/8b/aa8b319f-8215-4a0b-837c-a95ae3103e5d.png"></img>Продолжаем ломать контракты]]></description><content:encoded><![CDATA[
  <p id="I6Z8">Задача:</p>
  <ol id="hIhU">
    <li id="XuEy">стать админом прокси</li>
  </ol>
  <p id="DOnH">Нам даны 2 контракта: Контракт прокси и Реализация Кошелька</p>
  <figure id="GFEP" class="m_retina">
    <img src="https://img1.teletype.in/files/03/de/03deccb9-d1ce-4a14-86ae-f2a628573ebf.png" width="1440" />
  </figure>
  <p id="aKJR">С первого взгляда выглядит корректно, но давайте изучим как работает прокси.</p>
  <p id="gMur">Для этого нам нужно понять что такое слоты памяти proxy и delegatecall</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="R3TF">Слоты памяти</h2>
  </section>
  <p id="WayU">Слот памяти - 32 байтная ячейка памяти, в которой хранится переменная(ые) смарт контракта. Компилятор может оптимизировать память и помещать несколько переменных в один слот. </p>
  <p id="GaiE">Главное что нужно помнить - у каждого контракта есть своя память</p>
  <figure id="enkZ" class="m_column">
    <img src="https://img2.teletype.in/files/5e/51/5e513bfe-9143-4ae8-a6df-f1966199a335.png" width="1498" />
  </figure>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="yg7F">proxy &amp; delegatecall</h2>
  </section>
  <p id="OF5q">Из за того что смарт контракт нельзя изменить после загрузки в блокчейн, но есть необходимость вносить изменения в логику работы был придуман патерн разработки называемый <strong>proxy.</strong></p>
  <p id="TcO5">Это промежуточный смарт-контракт, который перенаправляет запрос пользователя в актуальную версию смарт-контракта</p>
  <figure id="3fUR" class="m_column">
    <img src="https://img3.teletype.in/files/6a/70/6a70e160-d61c-42ae-a7b5-d253081677ff.png" width="1710" />
  </figure>
  <p id="WK8R">Но в такой простой реализации кроется проблема - если мы мы использовали <strong>call</strong> в контракт-реализацию, то если мы публикуем новую версию контракта-реализации, то все наши данные (настройки, балансы пользователей и т.п) теряются, т.к были использованы слоты памяти, которые остались на старой версии контракта.</p>
  <p id="O6ir">Нужно что бы слоты памяти оставались прежними, а менялась только логика.</p>
  <p id="2wQu">Тут приходит на помощь функция <strong>delegatecall.</strong></p>
  <p id="Ix6f">Эта функция выполняет логику чужого контракта, но используя свои слоты памяти.</p>
  <figure id="c5wm" class="m_column">
    <img src="https://img1.teletype.in/files/82/b5/82b57512-db34-4f5b-86e7-1968918b4f7d.png" width="2382" />
  </figure>
  <h3 id="b0Ln">Разберем на примере</h3>
  <p id="ZIRf">Для хранения переменных используются слоты в порядке их объявления в реализации</p>
  <figure id="vJQr" class="m_column">
    <img src="https://img3.teletype.in/files/69/e3/69e31dbe-fdc9-4e24-8cfc-fc8d95ee8c9f.png" width="1212" />
  </figure>
  <p id="rll5">Если мы добавляем новую переменную в новой версии реализации, то будет использован соответствующий слот </p>
  <figure id="19G4" class="m_column">
    <img src="https://img1.teletype.in/files/8b/d0/8bd0aeea-429b-4221-b9b3-5b0e95751a4d.png" width="1214" />
  </figure>
  <p id="LkGQ">НО если мы поменяем переменные местами, то будут использованы некорректные слоты и данные в них могут быть испорчены</p>
  <figure id="XtHL" class="m_column">
    <img src="https://img4.teletype.in/files/bc/74/bc749d03-1192-437e-bae0-d8ab7223376b.png" width="1232" />
    <figcaption>Так делать не нужно</figcaption>
  </figure>
  <p id="4Tme">Если мы хотим использовать какие-то переменные в проки-контракте, то необходимо реализовать отступ на X слотов, что бы избежать коллизии по номерам слотов</p>
  <figure id="WjxE" class="m_column">
    <img src="https://img1.teletype.in/files/cc/d4/ccd46e18-1b31-49e2-9eca-dee999a1eaee.png" width="1262" />
  </figure>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="RHjo"><strong>Важно</strong>  помнить:</p>
  </section>
  <ul id="qbTk">
    <li id="NDjl">для корректной работы все переменные в новой версии контракта должны идти строго в том же порядке как и в старой версии контракта, иначе данные могут быть перезаписаны, т.к. будет происходить обращение к другим слотам памяти</li>
    <li id="pX1S">Если в прокси используются какие то слоты памяти, то при некорректной реализации прокси контракта они могут изменены логикой вызванной через delegatecall. Необходимо делать отступ по слатам памяти, что бы они не пересекались</li>
  </ul>
  <h2 id="qwyJ"></h2>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="ySP5">Вернемся к изначальной задаче</h2>
  </section>
  <p id="uhBT">Теперь обладая новыми знаниями взглянем на контракты</p>
  <p id="UpXb">Видим что прокси и реализация логики используют для хранения переменных те же слоты</p>
  <figure id="XUxv" class="m_retina">
    <img src="https://img3.teletype.in/files/6c/e1/6ce16071-6073-4e02-a073-efbd848b0a18.png" width="1455" />
  </figure>
  <p id="c6nh">Из этого следует, что переписать значение переменной admin в proxy мы можем вызвать изменение maxBalance в контракте реализующем логику.</p>
  <p id="x1fk">Видим что у функции setMaxBalance есть модификатор onlyWhitelisted</p>
  <p id="gG6h">Что бы добавить себя в вайтлист нужно вызвать функцию addToWhitelist</p>
  <p id="0P6p">Но нам мешает require, который проверяет owner&#x27;a</p>
  <p id="rPBw">Проверим что за адрес выдается по запросу owner&#x27;a</p>
  <figure id="e4bY" class="m_original">
    <img src="https://img4.teletype.in/files/f8/8f/f88f1b81-1101-4030-9158-add5dd8582c9.png" width="676" />
  </figure>
  <p id="smqq">Изучив код контракта мы видим, что переменная owner занимает 1й слот и переменная pendingAdmin в прокси контракте находится в том же слоте</p>
  <p id="76tZ">Воспользуемся этой уязвимостью - Что бы стать owner&#x27;ом вызовем фунцию proposeNewAdmin в прокси контракте, предложив в качестве нового админа свой адрес</p>
  <p id="OKf8">Вызов этой функции не доступен из интерфейса ethernaut&#x27;а, поэтому перейдем в Remix скопировав код контракта прокси. Remix будет ругаться на импорт апгрейдебел прокси - удаляем импорт и наследование за ненадобностью.</p>
  <p id="AgYK">Копируем адрес инстанса из ethernaut&#x27;а и вставляем в Remix в поле рядом с кнопкой At address. Нажимаем кнопку</p>
  <p id="NmjP">У нас появился интерфейс для взаимодействия с прокси</p>
  <figure id="LEdk" class="m_retina">
    <img src="https://img2.teletype.in/files/5a/1c/5a1cb087-6beb-4af6-8eeb-337b583ea887.png" width="285" />
  </figure>
  <p id="HtTA">Нажимаем кнопку proposeNewAdmin, вставив свой адрес в поле рядом. Ждем пока исполнится транзакция. Переходим в ethernaut и проверяем owner&#x27;a</p>
  <figure id="bXYr" class="m_original">
    <img src="https://img2.teletype.in/files/19/a0/19a0ec40-fb55-4a0b-a686-6a7620a1a4c4.png" width="668" />
  </figure>
  <p id="VrCI">Видим что теперь здесь наш адрес</p>
  <p id="oDqM">Теперь, когда мы owner - добавляем так же свой адрес в вайтлист</p>
  <figure id="juV1" class="m_original">
    <img src="https://img3.teletype.in/files/ad/75/ad75075c-59ea-438a-b6fb-dc088c238225.png" />
  </figure>
  <p id="ZO53">Теперь нам доступен вызов функции setMaxBalance, но для ее исполнения нам нужно пройти require, который проверяет что текущий баланс равен нулю. На адресе находится 0.001 ETH от которых мы должны избавиться</p>
  <p id="FTfc">Рассмотрев реализацию контракта PuzzleWallet мы видим, что в функции execute можем снять только те эфиры, которые задепазитили в функции deposit</p>
  <p id="6ic1">Также мы видим что в функции multicall есть ограничение, которое не дает вызвать повторно функцию deposit в рамках мультиколла, что бы учесть полученные эфиры только один раз</p>
  <figure id="O6D1" class="m_retina">
    <img src="https://img1.teletype.in/files/49/53/4953a943-6925-4e5d-8ab1-9922f275e518.png" width="757" />
  </figure>
  <p id="dZfv">Функция multicall принимает массив байт - последовательность селекторов функций</p>
  <p id="vQDU">Например [ func1, func2, func3 ]</p>
  <p id="EO3m">и в цикле вызывает переданные ей функции</p>
  <p id="BSad">Данная реализация multicall&#x27;a защищена от передачи такого параметра [deposit, deposit]</p>
  <p id="85HC">Но данная реализация не защитит контракт, если мы пошлем вызов multicall в multicall в который пошлем deposit 🤯.</p>
  <figure id="87lt" class="m_retina">
    <img src="https://img4.teletype.in/files/30/4d/304d96fc-0286-488b-8f4f-08d0181c3b8c.png" width="250" />
  </figure>
  <p id="F0Ap">Напишем контракт, который воспользуется этой уязвимостью, для повторного учета одних и тех же эфиров</p>
  <figure id="8rfz" class="m_retina">
    <img src="https://img2.teletype.in/files/1f/19/1f19c130-12ec-47f1-ad0d-325dbdfd2379.png" width="717" />
  </figure>
  <p id="WuGG">Функция getCall заполняет массив таким образом [ deposit, multicall [ deposit ] ]  </p>
  <p id="tQtG">Функция multicallAttack принимает адрес инстанса прокси и она payable</p>
  <p id="NGF0">В прокси мы передаем подготовленный массив из селекторов и эфиры.</p>
  <p id="7mkF">На контракте прокси уже лежит 0.001 eth, поэтому мы пошлем еще 0.001, что бы после атаки на функцию multicall мы могли снять удвоенный балланс</p>
  <p id="Tr9B">И затем с помощью execute мы снимаем 0.002 eth</p>
  <p id="7z9V">Загружаем контракт в сеть и добавляем адрес этого контракта в вайтлист</p>
  <figure id="xrak" class="m_retina">
    <img src="https://img4.teletype.in/files/3d/fb/3dfb1b24-1a36-4a69-9133-ccbfd1f8189f.png" width="506" />
  </figure>
  <p id="Dr7l">Теперь вызываем функцию multicallAttack передав адрес прокси и 0.001 eth</p>
  <figure id="Re8G" class="m_retina">
    <img src="https://img3.teletype.in/files/2d/50/2d504fc1-ac91-4f18-b946-c9aff03f40c8.png" width="279" />
  </figure>
  <p id="q5bw">Можем убедиться в Tenderly, что мы передали 0.001, а получили 0.002 опустошив прокси</p>
  <figure id="68RC" class="m_retina">
    <img src="https://img3.teletype.in/files/a4/ca/a4ca3b0e-6229-43e4-a9c3-fd7c3b34fe6d.png" width="629" />
  </figure>
  <p id="8UCS">Теперь когда баланс прокси равен нулю рекваер в функции setMaxBalance нам не мешает и мы передаем свой адрес что бы перезаписать слот, хранящий адрес админа своим адресом</p>
  <figure id="lk87" class="m_retina">
    <img src="https://img2.teletype.in/files/df/0a/df0ae1b1-15e2-420d-9470-cdcf67b9c920.png" width="543" />
  </figure>
  <p id="qLTw">Убеждаемся что мы теперь админ</p>
  <figure id="Fb2m" class="m_retina">
    <img src="https://img3.teletype.in/files/20/d9/20d92fe4-b304-4391-b19c-0105f07fa6ad.png" width="292" />
  </figure>
  <p id="W0XD">Задача решена</p>
  <figure id="pNN1" class="m_retina">
    <img src="https://img4.teletype.in/files/b2/db/b2db3c5f-170f-410a-905f-c8617b4b32f6.png" width="668" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/DAO_Governor</guid><link>https://teletype.in/@popelev/DAO_Governor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/DAO_Governor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>DAO. Solidity</title><pubDate>Wed, 06 Dec 2023 18:03:11 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/35/6d/356d3b77-db17-406f-8cfa-8e308d221a11.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/4e/a6/4ea6fea9-62fd-4d76-b96d-32a792a906d5.png"></img>ДАО (англ. DAO — decentralized autonomous organization) — это децентрализованная автономная организация.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="t68F"><strong>ДАО (англ. DAO — decentralized autonomous organization) — это децентрализованная автономная организация.</strong></p>
  </section>
  <p id="cg54">Процесс голосования, посредством которого ДАО принимает решения, называется <strong>on-chain governance</strong>, и он стал центральным компонентом децентрализованных протоколов. ДАО принимает решения, такие как настройка параметров, обновление смарт-контрактов, интеграция с другими протоколами, управление казначейством, выдача грантов и т. д.</p>
  <p id="Sp6v"><strong>Предложение (Propose) - </strong>это действие, которое будет исполнено от имени ДАО, если члены ДАО поддержат его.</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="JMPN"><strong>Стадии через которые проходит предложение от создания до выполнения:</strong></p>
  </section>
  <figure id="Hcr2" class="m_retina">
    <img src="https://img1.teletype.in/files/4e/a6/4ea6fea9-62fd-4d76-b96d-32a792a906d5.png" width="939" />
  </figure>
  <ul id="wJ5Y">
    <li id="XRpT">После создания предложения оно имеет статус <strong>Pending</strong> - ожидает начала голосования.</li>
    <li id="0JdM">После прохождения времени необходимого для ознакомления с предложением, покупки токенов голосования и т.п. начинается период голосования и предложение имеет статус <strong>Active</strong>.</li>
    <li id="m5G7">После того как завершился период голосования происходит подсчет голосов. Если набралось достаточное количество голосов и кворум был достигнут, то предложение имеет состояние <strong>Succeeded</strong>. Если кворум не достигнут и предложение отклонено - <strong>Defeated</strong>.</li>
    <li id="xGC3">Далее предложение помещается в очередь на исполнение - <strong>Queued</strong>.</li>
    <li id="cjKl">Если предлжение находится слишком долго в очереди, то состояние меняется на <strong>Expired</strong>.</li>
    <li id="EwiS">Исполненное предложение имеет стату <strong>Executed</strong>.</li>
    <li id="eIfj">Также предложение может быть отменено до исполнения - <strong>Canseled</strong>.</li>
  </ul>
  <p id="BRVM"></p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ben5"><strong>Пример организации и взаимодействие со смарт-контрактами ДАО</strong></p>
  </section>
  <p id="yh1Q">Разберем пример построения ДАО с использованием библиотеки OpenZeppeline v5.0. Нам нужны несколько контрактов для организации ДАО:</p>
  <figure id="pgvI" class="m_retina">
    <img src="https://img4.teletype.in/files/f5/58/f55884ca-7971-40bf-9d0a-ccc5ea511dba.png" width="1241" />
  </figure>
  <p id="c9cu"><strong><em>Контракты:</em></strong></p>
  <p id="WOE1"><strong>TokenGiver</strong> - контракт, который будет продавать пользователю токены голосования за USDT.</p>
  <p id="SpNv"><strong>ERC20Vote</strong> - Токен голосования.</p>
  <p id="b9Aw"><strong>Governor DAO</strong> - контракт, который отвечает за создание предожений, голосование и планирование исполнения предожений.</p>
  <p id="zStC"><strong>TimeLockController</strong> - дополнительный контракт, который выполненяет предложение, одобреное контрактом Governor.</p>
  <p id="kPV8"><strong>Target Contract From Propose</strong> - тестовый контракт, за взаимодействие с которым будут голосовать пользователи в нашем тестовом предложении.</p>
  <p id="4bKV"></p>
  <p id="QqE7"><strong><em>Действия:</em></strong></p>
  <ol id="Kn7t">
    <li id="2g3x">Proposer создает предложение (состояние предложения Pending)</li>
    <li id="mTAC">User приобретает токены голосования (состояние предложения Pending или Active)</li>
    <li id="JRer">User делегирует право голосования (себе или кому то другому) (состояние предложения Pending или Active)</li>
    <li id="PAVu">User голосует против, за, или воздержался (состояние предложения Active)</li>
    <li id="ZUwU">Executer ставит предложение в очередь на исполнение (состояние предложения Succeeded)</li>
    <li id="m45k">Executer запускает исполнение предложение от имени ДАО (состояние предложения Queued или Expired)</li>
  </ol>
  <p id="ikeE"></p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="v9Zd"><strong>Контракт токена для голосования</strong></p>
  </section>
  <p id="cabC">Создаем контракт, наследуемся от ERC20Votes. Decimals буду использовать равный 6ти, что бы было проще осуществлять обмен с USDT</p>
  <figure id="n04H" class="m_retina">
    <img src="https://img3.teletype.in/files/2d/4e/2d4ead82-9bc5-4965-93ff-c12e3c17df91.png" width="860" />
  </figure>
  <p id="0o4g">Создаем контракт для продажи токенов за USDT</p>
  <figure id="DUJZ" class="m_retina">
    <img src="https://img4.teletype.in/files/78/21/7821cc0c-0671-41a4-a3a7-ffbaa1dde3b5.png" width="1126" />
  </figure>
  <p id="93Wo">Приведу часть контракта собственно DAO. Наследуемся от следующих контрактов:</p>
  <p id="1rOV"><strong>Governor</strong> - основной контракт, для работы с предложениями. Реализует основную логику, которую мы будем дополнять.</p>
  <p id="dBX4"><strong>GovernorCountingSimple</strong> - модуль, реализующий голосование с 3мя вариантами (Против, За, Воздержался)</p>
  <p id="qgju"><strong>GovernorVotes</strong> - модуль, для расчета веса голоса в зависимости от количества токенов голосования</p>
  <p id="sRWw"><strong>GovernorVotesQuorumFraction</strong> - модуль, отвечающий за кворум</p>
  <p id="0Gh1"><strong>GovernorTimelockControl</strong> - модуль, отвечающий за взаимодействие Governor&#x27;а и TimeLockController&#x27;а</p>
  <figure id="bDd8" class="m_retina">
    <img src="https://img3.teletype.in/files/ea/94/ea94d80d-f84c-481d-b429-1267ef44a19c.png" width="987" />
  </figure>
  <p id="FLAo">Также приведу часть тестов написанных на Foundry:</p>
  <p id="Hy5U">Переменные и подготовка контрактов</p>
  <figure id="VcyF" class="m_column">
    <img src="https://img3.teletype.in/files/27/60/2760830d-6b4b-422a-8c11-c284f96fb0b4.png" width="1438" />
  </figure>
  <p id="2Wd0">Тест создающий предложение, голосующий, и исполняющий предложение</p>
  <figure id="yiuk" class="m_column">
    <img src="https://img4.teletype.in/files/31/4c/314c1cb4-b595-40ac-905f-6a853b1a0dc9.png" width="1494" />
  </figure>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="YVLV">Основные моменты про которые нужно помнить</p>
  </section>
  <ul id="edNL">
    <li id="qRyo">После изменения количества токенов голосования нужно вызвать delegate()</li>
    <li id="guZ1">Для расчета времени используется block.number, а не timestamp</li>
    <li id="1tUb">Прежде чем исполнить предложение его нужно поместить в очередь на исполнение</li>
  </ul>
  <p id="PZ6w"></p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Ih44">Код из статьи можно найти по ссылке</p>
    <p id="GQAF"><a href="https://github.com/popelev/DAO" target="_blank">https://github.com/popelev/DAO</a></p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/Severity</guid><link>https://teletype.in/@popelev/Severity?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/Severity?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Severity. Варианты оценки степени серьезности уязвимостей, используемые в аудиторских отчетах</title><pubDate>Wed, 11 Oct 2023 10:16:19 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e6/67/e667e862-9d64-4cd2-ad69-3f5f2d156f32.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/ab/ac/abac45fc-3f20-4637-b906-ad6bc2e5c1f3.png"></img>Critical]]></description><content:encoded><![CDATA[
  <h2 id="LZPc">Вариант оценки 1:</h2>
  <ul id="3fgt">
    <li id="WNvi"><strong>Critical</strong> - Уязвимости, приводящие к краже активов, блокировке доступа к средствам или к любым другим потерям средств.</li>
    <li id="EDXk"><strong>High</strong> - Уязвимости, которые приводят к сбоям контракта и которые могут быть исправлены только путем изменения или полной замены кода контракта.</li>
    <li id="KMJI"><strong>Medium</strong> - Уязвимости, нарушающие предполагаемую логику контракта, но не приводящие к потере средств и не требующие замены контракта.</li>
    <li id="jyVJ"><strong>Low</strong> - Мелкие ошибки, которые можно учесть с целью улучшения общего качества кода.</li>
  </ul>
  <p id="WGvc"></p>
  <h2 id="sZIm">Вариант оценки 2:</h2>
  <ul id="NCtL">
    <li id="6Nmr"><strong>High Risk</strong> - Проблема ставит под угрозу большинство или значительное количество конфиденциальной информации пользователей или вероятно приведет к катастрофическим последствиям для репутации клиента или серьезным финансовым последствиям как для клиента, так и для пользователей.</li>
    <li id="7MvR"><strong>Medium Risk</strong> - Проблема ставит под угрозу часть чувствительной информации пользователей, будет вредной для репутации клиента, если будет использована, или, скорее всего, приведет к умеренным финансовым последствиям.</li>
    <li id="VZQn"><strong>Low Risk</strong> - Риск относительно невелик и не может быть злоупотреблен на регулярной основе, или это риск, который клиент считает низким в свете своей деловой ситуации.</li>
    <li id="Fc1I"><strong>Informational </strong>- Проблема не представляет собой немедленную угрозу, но соответствует лучшим практикам по безопасности или принципам &quot;защиты в глубину&quot; (Defense in Depth).</li>
    <li id="diZx"><strong>Undetermined</strong> - Последствия проблемы неопределены.</li>
  </ul>
  <p id="DipU"></p>
  <p id="SaiM"></p>
  <h2 id="fViT">Примеры уязвимостей</h2>
  <p id="mMff"></p>
  <p id="aiR5"><strong>Critical</strong></p>
  <ul id="rLk2">
    <li id="E7Wl">Манипуляция результатами голосования в управлении, отклоняющаяся от принятого решения и приводящая к непосредственному изменению первоначальных результатов.</li>
    <li id="tiqx">Прямая кража средств любого пользователя.</li>
    <li id="0Wm6">Прямая кража NFT пользователей .</li>
    <li id="34X5">Постоянная заморозка средств.</li>
    <li id="bDoW">Постоянная заморозка NFT.</li>
    <li id="mABS">Несанкционированная чеканка NFT.</li>
    <li id="3Jr0">Предсказуемый или манипулируемый генератор случайных чисел, который можно использовать для изменения результатов в свою пользу</li>
    <li id="cQIX">Непреднамеренное изменение того, что представляет собой NFT (например, токен URI, полезная нагрузка, художественное содержание).</li>
    <li id="Sni2">Неспособность протокола соблюсти финансовые обязательства.</li>
  </ul>
  <p id="RAAz"></p>
  <p id="iTt6"><strong>High</strong></p>
  <ul id="C2w3">
    <li id="BIxX">Кража несписанных доходов</li>
    <li id="X8s4">Кража несписанных роялти</li>
    <li id="aiXp">Постоянная заморозка несписанных доходов</li>
    <li id="tM3z">Постоянная заморозка несписанных роялти</li>
    <li id="tvVH">Временная заморозка средств</li>
    <li id="p2S8">Временная заморозка NFT</li>
  </ul>
  <p id="TBDE"></p>
  <p id="NhWh"><strong>Medium</strong></p>
  <ul id="rzmB">
    <li id="VxmQ">Смарт-контракт неспособен функционировать из-за недостатка средств в токенах.</li>
    <li id="bVhl">Наполнение блока.</li>
    <li id="STC5">грифферство (например, отсутствие финансовой мотивации у злоумышленника, но это несет ущерб для пользователей или протокола).</li>
    <li id="QMHC">Кража газа.</li>
    <li id="hjtD">Неограниченное потребление газа.</li>
  </ul>
  <p id="167Q"></p>
  <p id="qgb6"><strong>Low</strong></p>
  <ul id="yT9d">
    <li id="FqYb">Контракт не способен обеспечить обещанный доход, но не теряет своей стоимости.</li>
  </ul>
  <p id="5O88"></p>
  <p id="j1Vc"></p>
  <h2 id="H9vX">Ссылки и источники:</h2>
  <p id="KCmX"><a href="https://swcregistry.io/" target="_blank">https://swcregistry.io/</a></p>
  <p id="71FD"><a href="https://github.com/sirhashalot/SCV-List#scv-list" target="_blank">https://github.com/sirhashalot/SCV-List#scv-list</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/MrStealYoCrypto_Jpeg_Sniper</guid><link>https://teletype.in/@popelev/MrStealYoCrypto_Jpeg_Sniper?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/MrStealYoCrypto_Jpeg_Sniper?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Решение задач MrStealYoCrypto. Jpeg Sniper</title><pubDate>Tue, 10 Oct 2023 17:20:09 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/62/f9/62f96e4b-463a-4267-9c71-88e12aa0359b.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/5d/df/5ddf098c-4e71-4dad-93fe-bbb8e175ff6e.png"></img>https://mrstealyocrypto.xyz/jpeg-sniper/index.html]]></description><content:encoded><![CDATA[
  <p id="3MZj"><a href="https://mrstealyocrypto.xyz/jpeg-sniper/index.html" target="_blank">https://mrstealyocrypto.xyz/jpeg-sniper/index.html</a></p>
  <p id="pE3Z">NFT маркетплейс занимается публичной продажей коллекции и выпускает новую коллекцию.</p>
  <p id="FZsv">Задача:</p>
  <ul id="9SIZ">
    <li id="1vIm">Выкупить всю NFT коллекцию за одну транзакцию.</li>
  </ul>
  <p id="hHnB">Изучив контракт маркетплейса видим, что в функции публичной продажи  стоит модификатор isEOA, который говорит, что функцию может вызвать только  пользователь, а не контракт.</p>
  <figure id="HUge" class="m_retina">
    <img src="https://img2.teletype.in/files/5d/df/5ddf098c-4e71-4dad-93fe-bbb8e175ff6e.png" width="549" />
  </figure>
  <p id="OHUs">Взглянем на код модификатора. С первого взгляда кается, что все правильно:</p>
  <p id="J9JH">Если размер кода по адресу не ноль, то это контракт и запрещаем работу</p>
  <figure id="b5FT" class="m_retina">
    <img src="https://img1.teletype.in/files/01/02/01022692-847f-4474-b2be-acf52e641e31.png" width="387" />
  </figure>
  <p id="ARfH">Но проблема этого решения заключается в том, что размер равен нулю пока выполняется конструктор контракта и только после полного выполнения конструктора становится больше нуля.</p>
  <p id="bmTf">Давайте немного разберем атаку:</p>
  <p id="Fx1v">1. Что бы обойти ограничение модификатора isEOA - напишем код атаки на маркетплейс в конструкторе контракта:В уязвимой функции так же существуют дополнительные ограничения:</p>
  <figure id="TaQz" class="m_retina">
    <img src="https://img3.teletype.in/files/2d/57/2d5742fa-28e2-4922-8150-3d221fff366a.png" width="371" />
  </figure>
  <p id="r1fj">2. Для минта NFT на атакающем адресе не должно быть больше NFT чем maxPerAddressDuringMint</p>
  <figure id="DzVf" class="m_retina">
    <img src="https://img4.teletype.in/files/b2/4b/b24bd1e7-ead0-4857-a388-89a50629d3cd.png" width="523" />
  </figure>
  <figure id="9c9u" class="m_retina">
    <img src="https://img1.teletype.in/files/8a/5b/8a5b55dd-01fd-4f31-a170-738536c0fa24.png" width="294" />
  </figure>
  <p id="UBVV">Что бы обойти это ограничение мы можем перевести сминченные NFT на другой адрес, что бы текущий баланс снова стал равен нулю.</p>
  <p id="H0o9">3. Следующее ограничение проверяет, что мы не можем сминтить больше NFT чем есть в коллекции</p>
  <figure id="Ob1R" class="m_retina">
    <img src="https://img4.teletype.in/files/3f/6c/3f6c38c5-6783-4904-9a46-52dd1cc493e8.png" width="370" />
  </figure>
  <p id="dyNe">Это ограничение обходистя с помощью изменения количества запрашиваемых токенов для минта  - _quentity</p>
  <p id="oq1d"></p>
  <p id="5034">Ниже привиден код, для осуществления задуманной атаки на маркетплейс</p>
  <figure id="mn5k" class="m_original">
    <img src="https://img4.teletype.in/files/bc/29/bc29b166-7a2d-468d-b5ab-1730f6e025c7.png" width="2530" />
  </figure>
  <p id="DRDS">Атака начнется во время развертывания контракта. В качестве параметра передаем адрес маркетплейса</p>
  <figure id="C4wE" class="m_retina">
    <img src="https://img2.teletype.in/files/d6/2e/d62e8a67-2ff3-45fd-b013-4cb71523f613.png" width="533" />
  </figure>
  <p id="w6RP">Задача решена</p>
  <figure id="XSKc" class="m_retina">
    <img src="https://img1.teletype.in/files/4e/fa/4efa8756-0272-4820-b381-d0eb48e4670d.png" width="482" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/AMAZEX_DSS_PARIS_ModernETH</guid><link>https://teletype.in/@popelev/AMAZEX_DSS_PARIS_ModernETH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/AMAZEX_DSS_PARIS_ModernETH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Решение задач AMAZEX-DSS-PARIS. ModernWETH</title><pubDate>Tue, 10 Oct 2023 11:13:00 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2f/a5/2fa5d655-a1f2-4917-8267-d3703267aebf.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/32/14/3214ff00-b0ba-46f5-90d2-5ab0e5541bf4.png"></img>Вводные:]]></description><content:encoded><![CDATA[
  <p id="K5KO">Вводные:</p>
  <p id="l1Fn"><a href="https://github.com/secureum/AMAZEX-DSS-PARIS/tree/main/src/2_ModernWETH" target="_blank">https://github.com/secureum/AMAZEX-DSS-PARIS/tree/main/src/2_ModernWETH</a></p>
  <p id="eRLc">Создан ERC20 контракт, который оборачивает эфир. На нем находится 1000 ETH</p>
  <p id="nEqC">Задачи:</p>
  <ul id="bmIc">
    <li id="tc2W">Начиная с 10 ETH, украсть 1000 ETH из контракта ModernWETH.</li>
  </ul>
  <p id="dzzh">Изучив код контракта, замечаем что в функции withdrawAll на 33 и 36 строке проверяется текущее количество токенов.</p>
  <figure id="zdKk" class="m_retina">
    <img src="https://img3.teletype.in/files/2c/33/2c331b91-83bf-4c99-bfcf-7e82dcdd182c.png" width="692" />
  </figure>
  <p id="hxbD">Уязвимость заключается в том, что при вызове call&#x27;а исполнение передается в другой контракт (если msg.sender это контракт) и баланс токенов может быть изменен там.</p>
  <p id="wpfU">Воспользуемся данной уязвимостью что бы опустошить ModernWETH.</p>
  <p id="fsg4">Создадим 2 контракта: 1й будет использовать данную уязвимость, 2й будет служить временным хранилищем токенов.</p>
  <figure id="9zTD" class="m_column">
    <img src="https://img3.teletype.in/files/a9/77/a977f9f3-29a2-4d96-ae53-df2995f296aa.png" width="1576" />
  </figure>
  <p id="ADKt">Теперь разберем алгоритм атаки</p>
  <figure id="fATc" class="m_retina">
    <img src="https://img1.teletype.in/files/82/eb/82eb8635-9047-4cd9-b1b2-4c832eecf6e7.png" width="567" />
  </figure>
  <figure id="XmMW" class="m_original">
    <img src="https://img3.teletype.in/files/21/62/2162109f-4fd0-46d9-bd11-591f1a15c0a2.jpeg" width="1280" />
  </figure>
  <p id="WRF3">В цикле постоянно увеличивается количество эфиров, которые мы депозитим. Что бы избежать revert&#x27;а когда мы пытаемся снять эфира больше чем есть на контракте мы проверяем сколько эфиров осталось на контракте.</p>
  <p id="sXmb">Теперь создадим атакующий контракт и вызовем функцию атаки</p>
  <figure id="ZKYY" class="m_column">
    <img src="https://img4.teletype.in/files/f3/f9/f3f9efff-4692-4bd1-ae9f-e2a116b9ef94.png" width="1180" />
  </figure>
  <p id="vcsc">Задача решена</p>
  <figure id="rf3a" class="m_original">
    <img src="https://img2.teletype.in/files/9d/bd/9dbd914a-328d-45b2-aa50-781f6baa33a3.png" width="968" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/amm_liquidity_example</guid><link>https://teletype.in/@popelev/amm_liquidity_example?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/amm_liquidity_example?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Дача ликвидности по диапазону или как заработать на падении биткоина</title><pubDate>Sat, 07 Oct 2023 20:16:58 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/8b/6c/8b6cd7df-b9e7-4a01-a91c-d0fa5c305923.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/b9/6a/b96a30d6-a6ed-4f3d-9f6f-bf4734c7a8be.png"></img>На обычных биржах для торгов используется стакан заявок, в котором публикуются заявки на покупку и продажу. Когда цены совпадают - происходит сделка]]></description><content:encoded><![CDATA[
  <p id="knSd">На обычных биржах для торгов используется стакан заявок, в котором публикуются заявки на покупку и продажу. Когда цены совпадают - происходит сделка</p>
  <figure id="i8Lw" class="m_retina">
    <img src="https://img4.teletype.in/files/b9/6a/b96a30d6-a6ed-4f3d-9f6f-bf4734c7a8be.png" width="309.5" />
  </figure>
  <p id="C3L1">Во многих децентрализованных биржах используется другая схема - автоматический маркетмейкер (АММ). Это система при которой нет необходимости ждать пока на продажу найдется покупатель и на покупателя - продавец. АММ предоставляет ликвидность для обмена из собственных резервов беря за этот обмен небольшую комиссию.</p>
  <p id="prU2">Самый простой АММ работает по такому принципу:</p>
  <ul id="388f">
    <li id="CLg7">Пул состоит из 2х токенов между которыми осуществляется обмен;</li>
    <li id="emKf">Цена на обмен формируется из условия - произведение количества токена X и токена Y в пуле является константой;</li>
  </ul>
  <p id="89h8">Если представить X * Y = K в виде графика, то получится кривая, которая не пересекается с осями (гипербола). Это значит, что если одного из токенов в пуле становится очень мало, то цена его становится очень большой и на оборот: чем больше токена - тем он дешевле</p>
  <figure id="IIA7" class="m_retina">
    <img src="https://img2.teletype.in/files/1c/4d/1c4deb95-a9a7-4233-833f-9de9941116c4.png" width="535" />
  </figure>
  <p id="GesC">Люди предоставляют свои токены X и Y в пул ликвидности и зарабатывают с комиссий с каждого обмена, происходящие в этом пуле, т.к. они позволяют покупателям и продавцам осуществлять обмен не дожидаясь друг друга как это происходит на обычных биржах помощью книги ордеров</p>
  <p id="K0jp">В старых версиях АММ люди предоставляли свою ликвидность на весь возможный диапазон цен токенов, что существенно снижало зарабатываемые комиссии, т.к торги осуществляются только в каком то конкретном диапазоне.</p>
  <p id="Hpec">В новых версиях АММ эта проблема решена с помощью концентрированной ликвидности. </p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="p7u0">Концентрированная ликвидность — это функция, которая позволяет пользователям распределять ликвидность в пользовательском ценовом диапазоне, а не во всем возможном диапазоне цен</p>
  </section>
  <p id="AdJI">Например, если человек считает что цена токена А будет меняться от 100 до 200, то он дает ликвидность только в этот диапазон цен, а не на весть диапазон от ~0 до +∞.</p>
  <p id="pzbv">Но если цена выйдет за указанный диапазон, то он перестанет зарабатывать на комиссиях</p>
  <p id="v6TP">Так же нужно понимать что при выходе за указанный диапазон токены конвертируются в дешевеющий (относительно другого) токен.</p>
  <p id="1l57"></p>
  <p id="6pqr"></p>
  <h2 id="nz4R">Реальный пример дачи ликвидности</h2>
  <p id="4hz7">Мне кажется, что биткоин в будущем будет стоить дороже чем сейчас, но в краткосрочной перспективе он пойдет ниже от текущей и это хорошая возможность для его накопления.</p>
  <figure id="mT7F" class="m_column">
    <img src="https://img1.teletype.in/files/0f/43/0f43bcbd-d8a9-4e0a-a91c-d590a60e22e9.png" width="1032" />
  </figure>
  <p id="Bon6">текущая цена</p>
  <figure id="Ws9A" class="m_original">
    <img src="https://img1.teletype.in/files/c6/f5/c6f545dc-3e98-42fe-9364-e96521902830.png" width="304" />
    <figcaption>Цена на 6 октября</figcaption>
  </figure>
  <p id="9pyb">Для этого я буду использовать дачу ликвидности на сети Avalanche на площадке Trader Joe в пул BTC.b / USDC</p>
  <figure id="bZMK" class="m_original">
    <img src="https://img4.teletype.in/files/78/9c/789c5deb-f906-4958-8ec8-bf3127831fdf.png" width="3211" />
  </figure>
  <p id="qhqQ">Я выставляю диапазон, в котором как мне кажется будет торговаться биткоин. </p>
  <figure id="4EaV" class="m_retina">
    <img src="https://img3.teletype.in/files/a5/3b/a53bdb06-78fd-462e-a7cb-b65da8b9c714.png" width="717" />
  </figure>
  <p id="1fRm">Если биткоин будет падать к нижней границе, то внесенные USDC постепенно конвертируются в BTC, как если бы я постоянно усреднялся докупая биткоин вручную, но преимущество АММ в том что пока биткоин будет падать - я буду зарабатывать на комиссиях от обменов других пользователей в моем диапазоне</p>
  <p id="e3Sn">Вношу в протокол 405$ в USDC и 17$ в BTC.b. Текущая позиция выглядит так</p>
  <figure id="d42E" class="m_column">
    <img src="https://img3.teletype.in/files/69/6f/696f5546-870a-43f2-975f-f9036fe65708.png" width="1270" />
    <figcaption>Пока нет заработанных комиссий</figcaption>
  </figure>
  <h2 id="P9xK">Update 1. Спустя 24 часа</h2>
  <p id="qmvt">текущая цена</p>
  <figure id="3Fr2" class="m_original">
    <img src="https://img3.teletype.in/files/a0/7f/a07f42ee-b7cc-4325-8173-ac469f93c1ba.png" width="364" />
    <figcaption>цена на 7 октября</figcaption>
  </figure>
  <p id="wZs2">ликвидность в пуле и проторгованный объем</p>
  <figure id="HrYJ" class="m_column">
    <img src="https://img3.teletype.in/files/aa/f9/aaf927b4-7508-4942-99f4-a8b122186aff.png" width="1394" />
  </figure>
  <p id="Qx0A">моя позиция </p>
  <figure id="G4H8" class="m_column">
    <img src="https://img4.teletype.in/files/78/b7/78b7035d-d3fd-4f91-9dbd-4c867e6fd93a.png" width="1474" />
  </figure>
  <p id="2YUk">Из за того что цена биткоина немного упала, то USDC начали переливаться в биткоин как и была запланированно</p>
  <figure id="w98p" class="m_column">
    <img src="https://img4.teletype.in/files/34/07/3407b79e-9f79-450c-9d67-29ba798b1d14.png" width="1456" />
  </figure>
  <p id="aiss">на комиссиях за 24 часа заработано 0.36$. Комиссии идут и в BTC.b и в USDC что  составляет ~30% годовых</p>
  <p id="KJCs"></p>
  <h2 id="eWIK">Update 1. Спустя 5 дней </h2>
  <p id="ZWSc">Цена ~ 27200$. На комиссиях заработано 1.79$</p>
  <figure id="vMtg" class="m_retina">
    <img src="https://img4.teletype.in/files/fe/b3/feb33ffc-de1f-4e77-96c9-3c507dea2df1.jpeg" width="627.5" />
  </figure>
  <h2 id="e9Pl">Update 3. Спустя 12 дней </h2>
  <p id="qxoN">Цена вышла за верхний диапазон, полностью перелилась в USDC и перестала зарабатывать. На комиссиях заработано 4.10$. Если в ближайшую неделю цена не вернется в мой диапазон - буду смещать его </p>
  <figure id="z8yp" class="m_column">
    <img src="https://img4.teletype.in/files/3d/21/3d21fc57-88bd-434a-8ec9-fc7982edf207.png" width="1576" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/AMAZEX_DSS_PARIS_MagicETH</guid><link>https://teletype.in/@popelev/AMAZEX_DSS_PARIS_MagicETH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/AMAZEX_DSS_PARIS_MagicETH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Решение задач AMAZEX-DSS-PARIS. MagicETH</title><pubDate>Sun, 01 Oct 2023 07:21:15 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/5d/9c/5d9c9a08-3717-49ef-8329-b4d5a2a301ad.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/58/89/5889fa30-1fb5-45ce-ac73-8d8fea158927.png"></img>Вводные:]]></description><content:encoded><![CDATA[
  <figure id="PyPK" class="m_column">
    <img src="https://img2.teletype.in/files/58/89/5889fa30-1fb5-45ce-ac73-8d8fea158927.png" width="1606" />
  </figure>
  <p id="ejWT">Вводные:</p>
  <p id="l1Fn"><a href="https://github.com/secureum/AMAZEX-DSS-PARIS/tree/main/src/1_MagicETH" target="_blank">https://github.com/secureum/AMAZEX-DSS-PARIS/tree/main/src/1_MagicETH</a></p>
  <p id="eRLc">Протокол был взломан и украдены <code>1000 mETH</code></p>
  <p id="nEqC">Задачи:</p>
  <p id="tc2W">- Вернуть  украденые<code>1000 mETH</code> с кошелька <em>exploiter</em>.</p>
  <p id="BdbB">- Конвертировать <code>mETH</code> в <code>ETH</code>.</p>
  <p id="dzzh">Изучив код протокола, замечаем что на 35 строке допущена ошибка. Перепутаны местами адреса msg.sender и account.</p>
  <p id="Iret">Это значит что происходит проверка &quot;Сколько токенов мы разрешили сжечь/перевести с account&#x27;а&quot;, а не он нам.</p>
  <p id="uCZq">Так же мы видим в 39 строке, что уже нам дается approve на снятие токенов с accout&#x27;а </p>
  <figure id="RhQq" class="m_column">
    <img src="https://img4.teletype.in/files/bb/45/bb4506de-6d0f-41fd-bca0-4ac87662156a.png" width="1222" />
  </figure>
  <p id="hxbD">Воспользуемся данной уязвимостью что бы вернуть украденные токены.</p>
  <ul id="E3AI">
    <li id="fsg4">Сами даем approve на <code>1000 mETH <em>exploiter&#x27;у</em></code></li>
    <li id="Ia5Q">Вызываем функцию burnFrom , что бы самим получить approve от <em><code>exploiter&#x27;a</code></em></li>
  </ul>
  <figure id="8Xtw" class="m_original">
    <img src="https://img2.teletype.in/files/9d/74/9d741a10-6583-4039-a9c5-04c7e6195be8.png" width="548" />
  </figure>
  <ul id="3vKU">
    <li id="jSqe">Переводим себе токены с адреса <em><code>exploiter&#x27;a</code></em></li>
    <li id="iW6P">Обмениваем mETH на нативный ETH используя функцию withdraw</li>
  </ul>
  <figure id="QmVi" class="m_column">
    <img src="https://img1.teletype.in/files/0c/e6/0ce6c9ae-ea7d-43cf-9bcf-26552486dfbe.png" width="768" />
  </figure>
  <p id="vcsc">Задача решена</p>
  <figure id="tMLJ" class="m_column">
    <img src="https://img4.teletype.in/files/37/c8/37c83d5e-2f80-4ac9-899f-b39dad5bbfb3.png" width="958" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/re_entrancy</guid><link>https://teletype.in/@popelev/re_entrancy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/re_entrancy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Решение задач Ethernaut. Reentrance </title><pubDate>Fri, 29 Sep 2023 21:10:14 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/51/80/5180544c-b0ed-4986-92e7-bc987ffa7ed6.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/29/0a/290af667-02bb-43cd-a7db-a3a3ef077f75.png"></img>Задача:]]></description><content:encoded><![CDATA[
  <p id="I6Z8">Задача:</p>
  <ol id="hIhU">
    <li id="XuEy">опустошить контракт</li>
  </ol>
  <p id="DOnH">Изучив контракт мы видим что стейт контракта изменяется после передачи эфира через call(). </p>
  <figure id="rQMY" class="m_column">
    <img src="https://img3.teletype.in/files/68/eb/68ebb814-fdaf-4b57-b034-774038ca3ff8.png" width="1716" />
  </figure>
  <p id="Ha4J">Мы можем перехватить поток выполнения контракта если реализуем у атакующего контракта функцию receive(), которая вызовется при получении эфира. И т.к. контракт с уязвимостью еще не изменил наш баланс, то мы можем вызвать повторно функцию withdraw()</p>
  <p id="ISFU">Напишем контракт, с помощью которого мы сможем воспользоваться уязвимостью повторного входа в контракт и рассмотрим поток исполнения</p>
  <figure id="xw8d" class="m_retina">
    <img src="https://img1.teletype.in/files/8f/c0/8fc05489-5b7e-4144-9080-e5a8d9b2389a.png" width="1268" />
  </figure>
  <ol id="FE7B">
    <li id="CeMR">Сначала донатим немного эфира, для того что бы выполнить условие из первой строки функии withdraw()</li>
    <li id="1era">Запрашиваем снятие эфира</li>
    <li id="Wx8G">Повторно запрашиваем снятие эфира после получения эфира на наш контракт</li>
    <li id="OIQz">Выполняем в цикле снятие и запрос до того момента пока атакуемый контракт не опустеет</li>
  </ol>
  <figure id="h3dv" class="m_column">
    <img src="https://img1.teletype.in/files/01/4a/014abc91-f49b-4c0f-916f-94080038fe8e.png" width="942" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@popelev/save_crypto</guid><link>https://teletype.in/@popelev/save_crypto?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev</link><comments>https://teletype.in/@popelev/save_crypto?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=popelev#comments</comments><dc:creator>popelev</dc:creator><title>Хранение крипты</title><pubDate>Fri, 29 Sep 2023 19:46:02 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/bc/18/bc18bc34-768b-4cf3-bdf5-b07d09c1d75b.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/0d/5a/0d5afa38-f44c-46fb-adbf-a64b551c4773.jpeg"></img>Не ваши ключи — не ваши монеты]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="l405"><strong><em>Не ваши ключи — не ваши монеты</em></strong></p>
  </section>
  <h2 id="kUri">1. Где?</h2>
  <h2 id="kWeK"><strong>1.1 На бирже</strong></h2>
  <p id="T0sm">Если вы храните крипту на бирже - у вас ее нет. Вы полностью доверяете свои активы другим людям. В любой момент биржа может отключить вывод средств, биржа может быть взломана и все средства украдены и вы ни чего не сможете с этим сделать. <strong>Не храните монеты на бирже!</strong></p>
  <h2 id="dFTs"><strong>1.2. На горячем кошельке</strong></h2>
  <p id="pNQx">Кошелек устанавливается на компьютер или телефон. Этот вариант гораздо лучше биржи т.к. здесь кошелек даст вам заветные слова, с помощью которых и подтверждается владение криптой. Но из минусов - можно поймать вирус, который может украсть ваши токены.</p>
  <p id="BrLZ">Рекомендую Rabby Wallet вместо метамаска</p>
  <h2 id="WEv4"><strong>1.3. На холодном кошельке</strong></h2>
  <figure id="cPkE" class="m_column">
    <img src="https://img1.teletype.in/files/0d/5a/0d5afa38-f44c-46fb-adbf-a64b551c4773.jpeg" width="1280" />
    <figcaption>Trezor T, icynote, Ledger Nano S</figcaption>
  </figure>
  <p id="NTG3">Отдельная железяка, которая не дает вирусам украсть ваши средства, а так же дает дополнительное время подумать пока вы нажимаете на физические кнопки</p>
  <p id="wW2F">Так же существует холодный кошелек в виде купюры. На нее сбрасывается биткоин и передается физически другому владельцу.</p>
  <p id="jfBv">Но прежде чем покупать аппаратний кошелек нужно разобраться с его назначением и ограничениями. Например трезор хорошо подходит для хранения и не подходит если вы планируете пользоваться DeFi инструментами.</p>
  <h2 id="iPRl">2. Хранение seed-фразы</h2>
  <h2 id="btXm">2.1 На компьютере или в облаке</h2>
  <p id="ADpp">Избегайте такого способа, т.к вам нужно доверять облачному сервису или другим программам на вашем компьютере</p>
  <h2 id="IsqR">2.2 На бумаге</h2>
  <p id="Ybee">Самый универсальный способ - выписать слова на бумагу. Не пытайтесь менять порядок слов, а то можете сами его забыть</p>
  <h2 id="0MtY"><strong>2.3 На железной пластине</strong></h2>
  <figure id="XcVn" class="m_column">
    <img src="https://img4.teletype.in/files/3f/f6/3ff6283c-5d9b-42e6-99eb-c15ccdc320cb.jpeg" width="970" />
    <figcaption>SafePal Cypher</figcaption>
  </figure>
  <p id="uNok">Храня сид фразу на железной пластине вы избавляетесь от риска что случайно выкините бумагу, она сгорит или намокнет</p>

]]></content:encoded></item></channel></rss>