Estoy tratando de crear un DAPP con dos contratos que generen activos. Uno está actuando como la "fábrica" para los otros contratos. Desde este último trato de llamar a una función en la fábrica sin saber aún su dirección, por lo que quiero pasarla como argumento. Esto arroja un error en Remix porque ese contrato obviamente aún no existe.
Para simplificar la situación, piense en este escenario en Remix (ambos contratos están escritos en el mismo archivo):
contract AssetFactory{
address[] deployedAssets;
function createAsset(string name) public {
address newAsset = new Asset(name);
deployedAssets.push(newAsset);
return newAsset;
}
}
contract Asset{
string name;
function Asset(string name) public{
name = name;
}
function ModifyAssetAndCreateNew(string name, address factory){
factory.createAsset(name);
name = name;
}
}
¿Alguna idea u otros enfoques? Me doy cuenta de que la idea detrás del contrato anterior no tiene mucho sentido en este ejemplo, pero traté de mantenerlo lo más breve posible.
¡Gracias!
Hubo una serie de errores de compilación en su código de ejemplo, pero una vez que los arreglé y cambié address factory
a AssetFactory factory
, todo parece estar bien.
(Simplemente adiviné a qué name
se refería en la línea factory.createAsset(name)
. Al producir un ejemplo simple, asegúrese de que realmente haya probado).
pragma solidity ^0.4.23;
contract AssetFactory {
Asset[] deployedAssets;
function createAsset(string name) public returns (Asset) {
Asset newAsset = new Asset(name);
deployedAssets.push(newAsset);
return newAsset;
}
}
contract Asset {
string name;
constructor(string _name) public {
name = _name;
}
function modifyAssetAndCreateNew(string _name, AssetFactory factory) public {
factory.createAsset(_name);
name = _name;
}
}
Aparte, noté algunos sucesos extraños y pensé que vale la pena mencionar algunas alternativas.
solidez de pragma 0.4.23;
contract AssetFactory { Asset[] public deployedAssets; function createAsset(string name) public returns (Asset) { Asset newAsset = new Asset(name); deployedAssets.push(newAsset); return newAsset; } function isFactory() public pure returns(bool isIndeed) { return true; } } contract Asset { string public name; AssetFactory factory; event LogAsset(address sender, bool isFactory); function Asset(string _name) public { name = _name; factory = AssetFactory(msg.sender); } // this seems like a strange thing to want. Consider removing it. function modifyAssetAndCreateNew(string _name) public { factory.createAsset(_name); name = _name; } }
Marlon Gelpke