in

Llame a una función de contrato inteligente con otra dirección de contrato inteligente implementada como «msg.sender» desde la prueba Hardhat

Tengo la siguiente función en mi contrato inteligente

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

La dirección del contrato de mercado se establece en el constructor

 constructor(address marketContractAddr) 
        {
        marketContract = marketContractAddr;
        }

Luego he escrito lo siguiente en mi prueba en Hardhat antes de que cada uno haga lo siguiente

    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(); 

y obtener mis firmantes usando lo siguiente

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

Entonces quiero en mi prueba hacer la siguiente llamada

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

Se espera que lo anterior se revierta debido a la siguiente declaración requerida

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

¿Cómo se puede llamar a esta función con el contrato de mercado implementado como el msg.sender ?

He probado lo siguiente

  1. Intenté usar connect al hacer la llamada desde mi prueba que se ve a continuación
 const res = await media.connect(market).functionName(1,addr2.address)

que falla con lo siguiente

«Error: VoidSigner no puede firmar transacciones»

Luego intenté lo siguiente, que también falla

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

Luego intenté ejecutar mi prueba después de implementar mis contratos en mi «nodo de casco duro npx» local

Luego recibo el siguiente error

«Error: no se puede estimar el gas; la transacción puede fallar o puede requerir un límite de gas manual (error={«name»:»ProviderError»

Me di cuenta de que al correr

market = await marketContract.deploy();

Se creó una nueva dirección para mi contrato de mercado y no coincidía con lo que ya había implementado en mi red local

así que intenté recrear mis contratos dentro de mi prueba en las direcciones locales implementadas

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

Todavía sin éxito recibo los siguientes errores dependiendo del clima que uso
connect o from

«firmante o proveedor no válido» y «No se puede anular el contrato con un firmante»

Parece bastante sencillo, pero parece que no puede encontrar el éxito. Realmente agradecería cualquier orientación.

gracias equipo

1 respuesta
1

Debe codificar la llamada de función en el propio contrato de Market y luego proteger esa función con la lógica de validación que necesite. Implementación ficticia:

¿Te ayudó la respuesta?

Subscribirse
Notificar por
guest
0 Comentarios
Inline Feedbacks
Ver todas las Respuestas

siguiente error de imagen js "URL" el parámetro es válido pero la respuesta ascendente no es válida

Solucionar detergente en polvo en una solución.