<?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>Web3 Zoom</title>
        <link>https://paragraph.com/@web3-zoom</link>
        <description>undefined</description>
        <lastBuildDate>Tue, 12 May 2026 10:38:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[代理合约部署合约]]></title>
            <link>https://paragraph.com/@web3-zoom/6NYHroKE1Vk39XFhYSCd</link>
            <guid>6NYHroKE1Vk39XFhYSCd</guid>
            <pubDate>Fri, 18 Jul 2025 07:38:18 GMT</pubDate>
            <description><![CDATA[对于已部署的合约，需要做到灵活的调用，应该怎么使用？ 对于这种问题，应该使用代理合约实现// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.30; contract TestContract1{ address public owner = msg.sender; function setOwner(address _owner) public{ require(msg.sender == owner, "not owner"); owner = _owner; } } contract TestContract2{ address public owner = msg.sender; uint public value = msg.value; uint public x; uint public y; constructor(uint _x, uint _y){ x = _x; y = _y; } } contract Proxy{ event Deploy(address); fallback() externa...]]></description>
            <content:encoded><![CDATA[<p>对于已部署的合约，需要做到灵活的调用，应该怎么使用？</p><p>对于这种问题，应该使用代理合约实现</p><pre data-type="codeBlock" text="// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.30;

contract TestContract1{
    address public owner = msg.sender;

    function setOwner(address _owner) public{
        require(msg.sender == owner, &quot;not owner&quot;);
        owner = _owner;
    }
}

contract TestContract2{
    address public owner = msg.sender;
    uint public value = msg.value;
    uint public x;
    uint public y;

    constructor(uint _x, uint _y){
        x = _x;
        y = _y;
    }
}

contract Proxy{

    event Deploy(address);

    fallback() external payable{}

    function deploy(bytes memory _code) external payable returns(address){
        address addr;
        assembly{
            // create(v,p,n)
            // v: amount of ETH to send
            // p: pointer in memory to start of code
            // n: size of code
            // bytecode 数据的实际位置（Solidity 中的字节数组前 32 字节用于存储长度信息）。
            addr := create(
                callvalue(), // v
                add(_code, 0x20), // p
                mload(_code) // n  mload 获取大小
            )
        }
        require(addr != address(0), &quot;deploy failed&quot;);
        emit Deploy(addr);
        return addr;
    }

    function execute(address _target, bytes memory _data) external payable{
        (bool success, ) = _target.call{value: msg.value}(_data);
        require(success, &quot;call failed&quot;);
    }
}

contract Helper {
    function getBytecode1() external pure returns(bytes memory){
        bytes memory bytecode = type(TestContract1).creationCode;
        return bytecode;
    }

    // 获取字节码
    function getBytecode2(uint _x, uint _y) external pure returns(bytes memory){
        bytes memory bytecode = type(TestContract2).creationCode;
        return abi.encodePacked(bytecode, abi.encode(_x,_y));
    }

    // 获取
    function getCalldata(address _owner) external pure returns(bytes memory){
        return abi.encodeWithSignature(&quot;setOwner(address)&quot;, _owner);
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: GPL-3.0</span>

<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.30;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">TestContract1</span></span>{
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> owner <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setOwner</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> _owner</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span></span>{
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> owner, <span class="hljs-string">"not owner"</span>);
        owner <span class="hljs-operator">=</span> _owner;
    }
}

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">TestContract2</span></span>{
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> owner <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> value <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>;
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> x;
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> y;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _x, <span class="hljs-keyword">uint</span> _y</span>)</span>{
        x <span class="hljs-operator">=</span> _x;
        y <span class="hljs-operator">=</span> _y;
    }
}

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Proxy</span></span>{

    <span class="hljs-function"><span class="hljs-keyword">event</span> <span class="hljs-title">Deploy</span>(<span class="hljs-params"><span class="hljs-keyword">address</span></span>)</span>;

    <span class="hljs-function"><span class="hljs-keyword">fallback</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span></span>{}

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">deploy</span>(<span class="hljs-params"><span class="hljs-keyword">bytes</span> <span class="hljs-keyword">memory</span> _code</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">address</span></span>)</span>{
        <span class="hljs-keyword">address</span> addr;
        <span class="hljs-keyword">assembly</span>{
            <span class="hljs-comment">// create(v,p,n)</span>
            <span class="hljs-comment">// v: amount of ETH to send</span>
            <span class="hljs-comment">// p: pointer in memory to start of code</span>
            <span class="hljs-comment">// n: size of code</span>
            <span class="hljs-comment">// bytecode 数据的实际位置（Solidity 中的字节数组前 32 字节用于存储长度信息）。</span>
            addr <span class="hljs-operator">:=</span> <span class="hljs-built_in">create</span>(
                <span class="hljs-built_in">callvalue</span>(), <span class="hljs-comment">// v</span>
                <span class="hljs-built_in">add</span>(_code, <span class="hljs-number">0x20</span>), <span class="hljs-comment">// p</span>
                <span class="hljs-built_in">mload</span>(_code) <span class="hljs-comment">// n  mload 获取大小</span>
            )
        }
        <span class="hljs-built_in">require</span>(addr <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-keyword">address</span>(<span class="hljs-number">0</span>), <span class="hljs-string">"deploy failed"</span>);
        <span class="hljs-keyword">emit</span> Deploy(addr);
        <span class="hljs-keyword">return</span> addr;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">execute</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> _target, <span class="hljs-keyword">bytes</span> <span class="hljs-keyword">memory</span> _data</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span></span>{
        (<span class="hljs-keyword">bool</span> success, ) <span class="hljs-operator">=</span> _target.<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>}(_data);
        <span class="hljs-built_in">require</span>(success, <span class="hljs-string">"call failed"</span>);
    }
}

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Helper</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBytecode1</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">bytes</span> <span class="hljs-keyword">memory</span></span>)</span>{
        <span class="hljs-keyword">bytes</span> <span class="hljs-keyword">memory</span> bytecode <span class="hljs-operator">=</span> <span class="hljs-keyword">type</span>(TestContract1).<span class="hljs-built_in">creationCode</span>;
        <span class="hljs-keyword">return</span> bytecode;
    }

    <span class="hljs-comment">// 获取字节码</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBytecode2</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _x, <span class="hljs-keyword">uint</span> _y</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">bytes</span> <span class="hljs-keyword">memory</span></span>)</span>{
        <span class="hljs-keyword">bytes</span> <span class="hljs-keyword">memory</span> bytecode <span class="hljs-operator">=</span> <span class="hljs-keyword">type</span>(TestContract2).<span class="hljs-built_in">creationCode</span>;
        <span class="hljs-keyword">return</span> <span class="hljs-built_in">abi</span>.<span class="hljs-built_in">encodePacked</span>(bytecode, <span class="hljs-built_in">abi</span>.<span class="hljs-built_in">encode</span>(_x,_y));
    }

    <span class="hljs-comment">// 获取</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getCalldata</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> _owner</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">bytes</span> <span class="hljs-keyword">memory</span></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-built_in">abi</span>.<span class="hljs-built_in">encodeWithSignature</span>(<span class="hljs-string">"setOwner(address)"</span>, _owner);
    }
}
</code></pre>]]></content:encoded>
            <author>web3-zoom@newsletter.paragraph.com (Web3 Zoom)</author>
        </item>
    </channel>
</rss>