[? ]
Entonces, ¿tiene un conjunto de contratos inteligentes y desea encontrar todos los contratos que tienen un método public
llamado withdrawEth
pero el grep léxico produce muchos falsos positivos? ¡Aquí es donde solgrep puede ayudar! ?
? npm install -g solgrep
Solgrep encuentra recursivamente contratos inteligentes en un directorio de destino, analiza las unidades de origen para comprender la semántica del lenguaje y pone esta información a disposición de una potente función de filtro basada en JavaScript. De esta manera, puedes:
AST_EXACT
y AST_FUZZY
) Probablemente la forma más común de utilizar esta herramienta es ejecutarla con la opción --find=<js-filter-statement>
, donde js-filter-statement
es una frase de JavaScript que le indica al motor lo que le interesa. Usted proporciona una declaración que devuelve boolean
("modo de búsqueda") o devuelve información que desea extraer ("modo de extracción").
--find=<js-filter-statement>
ya que este argumento se evalúa como javascript!
--find
, --rule
. Ver uso.
¿Ejecutar las reglas predeterminadas y mostrar algunas estadísticas?
⇒ solgrep < folder >
¿Ejecutar una o varias reglas integradas ( solgrep -l
para enumerar las reglas disponibles)?
⇒ solgrep < folder > -- rule = IsInitializable -- rule = Stats
¿Quiere encontrar todas las unidades fuente con un contrato que tenga una función denominada withdrawEth
?
⇒ solgrep < folder > -- find = "function.name=='withdrawEth'"
¿Hacer lo mismo pero sin distinguir entre mayúsculas y minúsculas?
⇒ solgrep < folder > -- find = "function.name.toLowerCase()=='withdraweth'"
¿Encontrar todas las funciones que llaman selfdestruct
?
⇒ solgrep < folder > -- find = "function.callsTo('selfdestruct')"
¿Extraer todos los nombres de funciones de todos los contratos?
⇒ solgrep < folder > -- find = "function.name"
¿Obtener una lista de todas las funciones external
?
⇒ solgrep < folder > -- find = "function.visibility.includes('external')"
¿Encontrar contratos ERC777
?
⇒ solgrep < folder > -- find = "contract.name=='ERC777'"
¿Extraer todos los nombres de los contratos?
⇒ solgrep < folder > -- find = "contract.name"
¿Extraer todos los nombres de las interfaces?
⇒ solgrep < folder > -- find = "contract.name && contract.kind=='interface'"
¿Partido contra algo en el AST
?
⇒ solgrep < folder > -- find = "Object.keys(function.modifiers).includes('nonReentrant')"
¿Lexial coincide con el código fuente de una función?
⇒ solgrep < folder > -- find = "function.getSource().includes('hi')"
¿Encontrar contratos duplicados? (Coincidencia exacta y difusa de AST)
⇒ solgrep < folder > -- rule DupeFinder
Utilice la opción --output=<output.json>
para escribir todos los resultados en un archivo.
--find
sourceUnit
coincide con el archivo fuente que el motor está procesando actualmente.contract
coincide con el contrato que el motor está procesando actualmente.function
coincide con la función que el motor está procesando actualmente. Los siguientes métodos están disponibles:
<sourceUnit|contract|function>.getSource()
- proporciona acceso al código fuente de las unidades<sourceUnit|contract|function>.ast
: proporciona acceso directo al analizador de solidez ASTfunction.callsTo('withdrawEth')
: busca todas las funciones en todos los contratos que llaman a un método llamado withdrawEth
Las funciones de contrato especiales pueden ser referencias como:
function.name == '__fallback__'
function.name == '__receiveEther__'
function.name == '__constructor__'
Stats
: recopila estadísticas sobre cuántos archivos, contratos, nombres únicos, etc. se procesaronGenericGrep
: es el motor detrás de la función --find
COMPARTIR ES CUIDAR : ¡envíe sus reglas!
⇒ solgrep -- help
Usage: solgrep < folder | ... > [ options ]
Options:
- r , -- rule Enable rules [ array ] [ default : [ ] ]
- l , -- list - rules List available rules [ boolean ] [ default : false ]
- f , -- find Find / Extract information using custom pattern
[ array ] [ default : [ ] ]
- o , -- output Write "results" as JSON to output file path . [ string ]
- h , -- help Show help [ boolean ]
- v , -- version Show version number [ boolean ]
--find
, --rule
), asegúrese de utilizar este formato:
⇒ solgrep <folder|...> [options]
o
⇒ solgrep [options] -- <folder|...>
o bien, las opciones adicionales podrían interpretarse como opciones adicionales --find
.
const solgrep = require ( 'solgrep' ) ;
let sg = new SolGrep ( '::memory::' , rules , callbacks ) ;
sg . analyzeDir ( "/path/to/smart/contracts" ) . then ( ( ) => {
console . log ( " ──────────────────────────── Results" )
console . log ( sg . results )
console . log ( " ────────────────────────────" )
sgrep . close ( ) ;
} )
A continuación se muestra un ejemplo que ilustra cómo extraer todos los nombres de funciones de todas sourceUnits
y contracts
.
⇒ solgrep . . / d0 -- find = 'function.name'
? SolGrep v0 .0 .3 ready !
Enabled Modules :
✔️ GenericGrep _function . name
[ ████████████████████████████████████████ ] 100 % | ? ETA : 0 s | 5 / 5 | ? 389 | 0 | . . / d0
────────────────────────────
{
'../d0/D0788Af7a613b81F437a51b96594A6387c7329b1_PendleLiquidityMiningBaseV2Multi.sol' : [
{
rule : 'GenericGrep' ,
tag : 'match-function: PendleLiquidityMiningBaseV2Multi.__constructor__' ,
info : '__constructor__' ,
loc : [ Object ]
} ,
{
rule : 'GenericGrep' ,
tag : 'match-function: PendleLiquidityMiningBaseV2Multi.setUpEmergencyMode' ,
info : 'setUpEmergencyMode' ,
loc : [ Object ]
} ,
...
Si no proporciona opciones de configuración, se utilizarán las reglas grep integradas predeterminadas y se calcularán los números utilizando el módulo stats
.
⇒ solgrep . . / d6
? SolGrep v0 .0 .1 starting . . .
? . . / d6
████████████████████████████████████████ 100 % | ETA : 0 s | 5 / 5
──────────────────────────── Results
{
'../d6/d60a598998ed27a7C54315F2675908B628E434B1_LiquidityPool.sol' : [
{
rule : 'IsInitializable' ,
tag : 'INITIALIZEABLE' ,
info : 'initialize - public initialize function; likely proxy'
} ,
{
rule : 'IsInitializable' ,
tag : 'INITIALIZEABLE' ,
info : 'initialize - public initialize function; likely proxy'
}
] ,
'../d6/d64E77C7C6A1dcC7e302F8fe31A22745e223c39c_MyStrategy.sol' : [
{
rule : 'IsInitializable' ,
tag : 'INITIALIZEABLE' ,
info : 'initialize - public initialize function; likely proxy'
}
] ,
undefined : [ { rule : 'Stats' , tag : 'STATS' , info : [ Object ] } ]
}
────────────────────────────
{
sourceUnits : 4 ,
contracts : {
total : 13 ,
names : {
ERC20 : 1 ,
StrategySushiEthMimLp : 1 ,
LiquidityPool : 1 ,
Getter : 1 ,
Governance : 1 ,
LibraryEvents : 1 ,
Perpetual : 1 ,
Storage : 1 ,
ArbiBoneman : 1 ,
ERC721 : 1 ,
MyStrategy : 1 ,
PausableUpgradeable : 1 ,
SettAccessControl : 1
}
} ,
interfaces : {
total : 39 ,
names : {
IERC20 : 1 ,
IJar : 1 ,
IStakingRewards : 1 ,
IStakingRewardsFactory : 1 ,
IMasterchef : 1 ,
UniswapRouterV2 : 1 ,
IUniswapV2Pair : 1 ,
IUniswapV2Factory : 1 ,
IRewarder : 1 ,
IMiniChefV2 : 1 ,
ILiquidityPool : 1 ,
IOracle : 1 ,
IAccessControl : 1 ,
IGovernor : 1 ,
IPoolCreatorFull : 1 ,
ISymbolService : 1 ,
IPoolCreator : 1 ,
ITracer : 1 ,
IVersionControl : 1 ,
IVariables : 1 ,
IKeeperWhitelist : 1 ,
IProxyAdmin : 1 ,
IDecimals : 1 ,
ILiquidityPoolGetter : 1 ,
ILiquidityPoolGovernance : 1 ,
IPerpetual : 1 ,
IERC721Enumerable : 1 ,
IERC721 : 1 ,
IERC721Receiver : 1 ,
IERC721Metadata : 1 ,
IERC165 : 1 ,
ICurveGauge : 1 ,
ICurveStableSwapREN : 1 ,
IUniswapRouterV2 : 1 ,
IStrategy : 1 ,
IController : 2 ,
IERC20Upgradeable : 2
}
} ,
libraries : {
total : 31 ,
names : {
SafeMath : 1 ,
SafeERC20 : 1 ,
BoringERC20 : 1 ,
EnumerableSetUpgradeable : 1 ,
SafeCastUpgradeable : 1 ,
AMMModule : 1 ,
LiquidityPoolModule : 1 ,
PerpetualModule : 1 ,
SignedSafeMathUpgradeable : 1 ,
Constant : 1 ,
Math : 1 ,
SafeMathExt : 1 ,
Utils : 1 ,
MarginAccountModule : 1 ,
EnumerableSet : 1 ,
OrderData : 1 ,
CollateralModule : 1 ,
TradeModule : 1 ,
OrderModule : 1 ,
Signature : 1 ,
ECDSAUpgradeable : 1 ,
Strings : 1 ,
MathUpgradeable : 1 ,
Address : 2 ,
SafeMathUpgradeable : 2 ,
AddressUpgradeable : 2 ,
SafeERC20Upgradeable : 2
}
} ,
abstract : {
total : 13 ,
names : {
StrategyBase : 1 ,
StrategySushiFarmBase : 1 ,
ReentrancyGuardUpgradeable : 1 ,
ERC721Enumerable : 1 ,
Ownable : 1 ,
ERC165 : 1 ,
BaseStrategy : 1 ,
Context : 2 ,
ContextUpgradeable : 2 ,
Initializable : 2
}
}
}
TOTAL FILES : 5
ERRORS: 1
────────────────────────────
cheers ?
@ tintinweb
ConsenSys Diligence @ https : //consensys.net/diligence/
https : //github.com/tintinweb/solgrep/