Solidity

從安全帽測試中呼叫具有另一個部署的智能合約地址的智能合約函式作為“msg.sender”

  • March 8, 2022

我的智能合約中有以下功能

function functionName(uint256 param1, address param2)
       external
       override
   {
       require(msg.sender == marketContract, "only market contract");

市場合約地址在建構子中設置

constructor(address marketContractAddr) 
       {
       marketContract = marketContractAddr;
       }

然後我在之前的安全帽測試中寫了以下內容我做了以下

   marketContract = await ethers.getContractFactory("Market");
   market = await marketContract.deploy();
   await market.deployed();

   mediaContract = await ethers.getContractFactory("Media");
   media = await mediaContract.deploy(market.address);
   await media.deployed(); 

並使用以下方法讓我的簽名者

[owner,addr1,addr2] = await ethers.getSigners();

然後我想在我的測試中撥打以下電話

const res = await media.functionName(1,addr2.address)
await res.wait();

由於以下要求聲明,預計上述內容將恢復

require(msg.sender == marketContract, "only market contract");

如何以已部署的市場合約作為 ? 呼叫此函式msg.sender

我已經嘗試了以下

  1. 從下面看到的我的測試中撥打電話時嘗試使用連接
const res = await media.connect(market).functionName(1,addr2.address)

失敗並出現以下問題

“錯誤:VoidSigner 無法簽署交易”

然後我嘗試了以下也失敗了

const res = await media.functionName(1,addr2.address{
      from:market.address
    })

然後我嘗試在將我的契約部署到我的本地“npx 安全帽節點”後執行我的測試

我然後收到以下錯誤

“錯誤:無法估計gas;交易可能失敗或可能需要手動限制gas (error={“name”:“ProviderError”

我在跑步時意識到

market = await marketContract.deploy();

為我的市場合約創建了一個新地址,它與我已經部署到本地網路的地址不匹配

所以我嘗試在部署的本地地址的測試中重新創建我的契約

   const marketRes = await artifacts.readArtifact("Market");
   const marketResContract = new ethers.Contract("0x5FbDB2315678afecb367f032d93F642f64180aa3", marketRes.abi, ethers.provider);
   

仍然沒有成功收到以下錯誤,具體取決於我使用的天氣 connectfrom

“無效的簽名者或提供者”和“與簽名者的契約不能覆蓋”

看起來很直截了當,但似乎找不到成功真的很感激任何指導

謝謝團隊

你好團隊終於解決了

必須先

   
 await hre.network.provider.request({
 method: "hardhat_impersonateAccount",
 params: [market.address],
});

然後使用以下方法獲取簽名者

const signer = await ethers.getSigner(market.address);

然後可以在安全帽測試中的契約呼叫連接中使用簽名者

await media.connect(signer).functionName(1,addr2.address);

並使用以下方式結束模擬契約

 await hre.network.provider.request({
 method: "hardhat_stopImpersonatingAccount",
 params: [market.address],
});

我希望這可以幫助任何其他面臨這個問題的人

謝謝你

引用自:https://ethereum.stackexchange.com/questions/122959