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
- 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
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: