¿Es posible acceder a una biblioteca constante en un contrato que importa la biblioteca?
estoy usando solidez 0.4.11
Por ejemplo:
library Lib {
bytes1 constant flag = 0x01
...
}
archivo separado
import Lib
contract A {
bytes1 x = (I have tried Lib.flag, and flag, neither works)
}
Tratando de usar Lib.flag
, obtengo Member "flag" not found or not visible after argument-dependent lookup in type(library Lib)
.
Tratando de usar flag
, obtengo Undeclared identifier
.
Probar
pragma solidity ^0.4.7;
library lib {
bytes1 public constant flag = 0x01;
function g() constant returns (bytes1){
return flag;
}
}
contract test {
bytes1 x = lib.g();
}
Desde Solidity 0.6.2 es posible acceder a él directamente como <LibraryName>.<constant>
:
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.6.2;
library Lib {
bytes1 constant flag = 0x01;
}
contract A {
bytes1 public x = Lib.flag;
}
Creo que el cambio que introdujo esto aparece en el registro de cambios de 0.6.2 como "Permitir el acceso a funciones externas a través de contratos y nombres de interfaz para obtener su selector".
Puede probar este código en Remix y, una vez que cambie la versión del contrato a 0.6.1, no se compilará.
Estoy agregando esta respuesta porque terminó como un resultado principal para mi búsqueda de "acceder a las variables de la biblioteca", si termina siendo lo mismo para otros, vale la pena mantener a todos actualizados.
puede almacenar un valor constante en una biblioteca y luego agregar una función que devuelva la constante, y luego llamar a esa función dentro de su contrato regular.
pragma solidity ^0.5.0;
library L{
address public constant t = 0x2020202020202020202020202020202020202020;
function tAddress() public pure returns(address){
return t;
}
}
contract C{
function getAddress() public pure returns(address){
return L.tAddress();
}
}
pragma solidity >=0.5.0 <0.6.0;
library MyLib {
bytes1 public constant AWESOME_FLAG = 0x01;
}
contract MyContract {
function getFlag() public returns (bytes1) {
return MyLib.AWESOME_FLAG;
}
}
La respuesta es no , no puedes hacer eso. Se arroja el siguiente error:
TypeError: miembro "AWESOME_FLAG" no encontrado o no visible después de la búsqueda dependiente de argumentos en tipo (biblioteca MyLib).
La definición de constantes en bibliotecas es posible desde Solidity v0.6.2 . El código anterior se compilará bien, gracias a este cambio realizado en el compilador:
Permitir acceder a funciones externas a través de contratos y nombres de interfaz para obtener su selector.
ismael