<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>DappReader</title>
        <link>https://paragraph.com/@dappreader</link>
        <description>Debugging Smart Contract in a Smart Way.</description>
        <lastBuildDate>Thu, 07 May 2026 17:20:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>DappReader</title>
            <url>https://storage.googleapis.com/papyrus_images/2f5eeabb128729e7318c070a76b7b9f11b31ef208f5406cab8da1c07fc72694d.png</url>
            <link>https://paragraph.com/@dappreader</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[在Mirror中使用DappReader]]></title>
            <link>https://paragraph.com/@dappreader/mirror-dappreader</link>
            <guid>A9fiBKS3HwbAGWykMweZ</guid>
            <pubDate>Fri, 12 May 2023 13:42:28 GMT</pubDate>
            <description><![CDATA[随着去中心化文章系统如Mirror等的广泛应用，越来越多的作者在他们的文章中介绍智能合约相关的内容。然而，通过图片等介质很难让读者直观地感受到智能合约的工作原理和交互过程。为了解决这个问题，DappReader提供了一种嵌入功能，可以直接在文章中嵌入智能合约，并且提供直观易懂的交互体验，大大增强了用户的阅读体验。 以下是一个使用DappReader嵌入功能实现的案例，以帮助读者更好地理解它的使用方法： 众所周知，在以太坊上进行转账时，只能够进行单个地址之间的点对点转账。然而，假设我们需要一次性向多个地址进行转账，那么这样的操作就会非常复杂。为了解决这个问题，我们可以采用智能合约中循环的方式来实现批量转账。下面是一段示例代码：// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; co...]]></description>
            <content:encoded><![CDATA[<p>随着去中心化文章系统如Mirror等的广泛应用，越来越多的作者在他们的文章中介绍智能合约相关的内容。然而，通过图片等介质很难让读者直观地感受到智能合约的工作原理和交互过程。为了解决这个问题，DappReader提供了一种嵌入功能，可以直接在文章中嵌入智能合约，并且提供直观易懂的交互体验，大大增强了用户的阅读体验。</p><p>以下是一个使用DappReader嵌入功能实现的案例，以帮助读者更好地理解它的使用方法：</p><p>众所周知，在以太坊上进行转账时，只能够进行单个地址之间的点对点转账。然而，假设我们需要一次性向多个地址进行转账，那么这样的操作就会非常复杂。为了解决这个问题，我们可以采用智能合约中循环的方式来实现批量转账。下面是一段示例代码：</p><pre data-type="codeBlock" text="// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import &quot;@openzeppelin/contracts/token/ERC721/IERC721.sol&quot;;
import &quot;@openzeppelin/contracts/token/ERC20/IERC20.sol&quot;;

contract MultiSender {
    event sendMain(address, uint);

    // 批量转账ERC20代币
    function luckyMoneyERC20(
        address tokenAddr,
        address payable[] memory addrs,
        uint256[] memory amounts
    ) public {
        require(addrs.length == amounts.length);
        IERC20 token = IERC20(tokenAddr);
        for (uint i = 0; i &lt; addrs.length; i += 1) {
            address payable addr = addrs[i];
            uint256 amount = amounts[i];
            token.transferFrom(msg.sender, addr, amount);
        }
    }
    // 批量转账以太坊
    function luckyMoneyETH(
        address payable[] memory addrs,
        uint256[] memory amounts
    ) public payable {
        uint256 totalAmount;

        for (uint i = 0; i &lt; addrs.length; i += 1) {
            address payable addr = addrs[i];
            uint256 amount = amounts[i];
            addr.transfer(amount);
            totalAmount += amount;
            emit sendMain(addr, amount);
        }
        require(totalAmount == msg.value, &quot;err&quot;);
    }
    // 批量转账NFT
    function multiTransferNFT(
        address nftAddress,
        address[] memory addrs,
        uint256[] memory tokenids
    ) external {
        require(addrs.length == tokenids.length);
        IERC721 NFT = IERC721(nftAddress);
        for (uint i = 0; i &lt; addrs.length; i += 1) {
            address addr = addrs[i];
            uint256 tokenId = tokenids[i];
            NFT.transferFrom(msg.sender, addr, tokenId);
        }
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: UNLICENSED</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts/token/ERC721/IERC721.sol"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts/token/ERC20/IERC20.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">MultiSender</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">event</span> <span class="hljs-title">sendMain</span>(<span class="hljs-params"><span class="hljs-keyword">address</span>, <span class="hljs-keyword">uint</span></span>)</span>;

    <span class="hljs-comment">// 批量转账ERC20代币</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">luckyMoneyERC20</span>(<span class="hljs-params">
        <span class="hljs-keyword">address</span> tokenAddr,
        <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span>[] <span class="hljs-keyword">memory</span> addrs,
        <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">memory</span> amounts
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-built_in">require</span>(addrs.<span class="hljs-built_in">length</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> amounts.<span class="hljs-built_in">length</span>);
        IERC20 token <span class="hljs-operator">=</span> IERC20(tokenAddr);
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&#x3C;</span> addrs.<span class="hljs-built_in">length</span>; i <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>) {
            <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> addr <span class="hljs-operator">=</span> addrs[i];
            <span class="hljs-keyword">uint256</span> amount <span class="hljs-operator">=</span> amounts[i];
            token.transferFrom(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, addr, amount);
        }
    }
    <span class="hljs-comment">// 批量转账以太坊</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">luckyMoneyETH</span>(<span class="hljs-params">
        <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span>[] <span class="hljs-keyword">memory</span> addrs,
        <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">memory</span> amounts
    </span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        <span class="hljs-keyword">uint256</span> totalAmount;

        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&#x3C;</span> addrs.<span class="hljs-built_in">length</span>; i <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>) {
            <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> addr <span class="hljs-operator">=</span> addrs[i];
            <span class="hljs-keyword">uint256</span> amount <span class="hljs-operator">=</span> amounts[i];
            addr.<span class="hljs-built_in">transfer</span>(amount);
            totalAmount <span class="hljs-operator">+</span><span class="hljs-operator">=</span> amount;
            <span class="hljs-keyword">emit</span> sendMain(addr, amount);
        }
        <span class="hljs-built_in">require</span>(totalAmount <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>, <span class="hljs-string">"err"</span>);
    }
    <span class="hljs-comment">// 批量转账NFT</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">multiTransferNFT</span>(<span class="hljs-params">
        <span class="hljs-keyword">address</span> nftAddress,
        <span class="hljs-keyword">address</span>[] <span class="hljs-keyword">memory</span> addrs,
        <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">memory</span> tokenids
    </span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> </span>{
        <span class="hljs-built_in">require</span>(addrs.<span class="hljs-built_in">length</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> tokenids.<span class="hljs-built_in">length</span>);
        IERC721 NFT <span class="hljs-operator">=</span> IERC721(nftAddress);
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&#x3C;</span> addrs.<span class="hljs-built_in">length</span>; i <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>) {
            <span class="hljs-keyword">address</span> addr <span class="hljs-operator">=</span> addrs[i];
            <span class="hljs-keyword">uint256</span> tokenId <span class="hljs-operator">=</span> tokenids[i];
            NFT.transferFrom(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, addr, tokenId);
        }
    }
}
</code></pre><p>这个示例中,我们通过for循环可以大大节省gas fee</p><p>以下是通过DappReader部署的智能合约,可以在Goerli 网络上尝试交互</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dappreader.com/o55t8rqGn9z5y7504Ps?display=iframe&amp;height=800&amp;width=960&amp;size=large">https://dappreader.com/o55t8rqGn9z5y7504Ps?display=iframe&amp;height=800&amp;width=960&amp;size=large</a></p><p>当需要进行向多个地址转账的情况时，可以通过调用智能合约内的LuckyMoneyETH（ETH红包）函数来实现。在调用时，需要输入目标地址和相应转账数量等相关信息，并确保将所有数量列表的值相加，并转换为ETH最小单位wei作为value的值进行填写，以保证转账金额正确。</p><p>在页面中提供的小demo中，可以直接在页面中进行操作，且可视化交互设计简单易用，让用户更快捷的实现转账操作。</p><p>想要在mirror中插入DappReader非常容易,只要在导入的合约中选择”Share”分享,然后选择Global分享即可</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8a2e7abcd46c38278482f8da221bf8b75ae2c92e17eb60fcfe48b6efaf00cb1b.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>接下来选择share to mirror并粘贴在文章中即可</p>]]></content:encoded>
            <author>dappreader@newsletter.paragraph.com (DappReader)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/8dce6082e5029ee38e378b54eb586be17eddf3a702d02aa4be37890bccf316e0.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>