首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delegatecall:函数不会更改parentContract数组元素

Delegatecall:函数不会更改parentContract数组元素
EN

Stack Overflow用户
提问于 2021-07-03 03:14:40
回答 1查看 333关注 0票数 0

我部署了两份合同(A、B)。函数A.delegateUpdateIDXcontract_B,1触发函数B.updateIDX1

代码语言:javascript
复制
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.4;

contract A {

string[] private arr = ['a','b','c'];

function showIDX(uint _IDX) public view returns(string memory)
    {
    return arr[_IDX];
    }

function delegateUpdateIDX(address _contractB, uint _IDX) external returns(bool _success)
    {
    (bool b,)=_contractB.delegatecall( abi.encodeWithSignature("updateIDX(uint _IDX)", _IDX) );
    return b;
    }
  
  
}

//###################################

contract B {
    
string[] private arr;

function updateIDX(uint _IDX) external
    {
    arr[_IDX]='X';
    }
    
}

然后我调用函数(在Remix中):

代码语言:javascript
复制
A.showIDX[1]
    returns 'b'

A.delegateUpdateIDX(B.address,1)
    no errors
    (should update A.storage and set A.arr[1] to 'X')
    but the delegateCall() returns 'success=false' for some reason
    and A.arr[1] doesn't change to 'X'

A.showIDX[1]
    returns 'b' again (not 'X' as expected)

因此,基本上,我不知道为什么delegateCall()返回'success=false‘,因此为什么A.arr1不从'b’改为'X‘。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-03 05:03:11

设法使它起作用

(

  1. abi.encodeWithSignature("updateIDX(uint _IDX)",_IDX)不应该有'_IDX‘的名字,所以我把它改成了abi.encodeWithSignature(updateIDX(Uint),_IDX)

-它仍然不起作用,delegateCall()继续返回'false‘--

  1. 将encodeWithSignature()和B.updateIDX()

中的“uint”改为“uint256”

这次工作得很好

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68232955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档