Solidez: acceder a una biblioteca constante en un contrato que importa la biblioteca

¿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.

Hay un error que parece relacionado: "Acceso a constantes a través de nombres de contrato" .

Respuestas (4)

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


}
Claro, entiendo que podría crear una función captadora, pero eso realmente no responde a mi pregunta. Parece que las constantes de la biblioteca deberían ser accesibles en el contrato ya que las funciones internas son accesibles. ¿No es este el caso?
Tengo la misma pregunta alguna novedad?

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.

la constante de la biblioteca Lib obviamente está incrustada en el contrato A. Entonces, ¿la biblioteca es una biblioteca incrustada?

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

Solidez v0.5

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).

Solidez v0.6.2 y superior

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.

Cualquier alternativa. Tengo problemas con los contratos que alcanzan el límite de tamaño máximo. Intentar mover constantes a una biblioteca auxiliar simplemente no funciona, y llamar a una función pública no reduce el tamaño del contrato en absoluto. :(