[ ? ]
Vous disposez donc d'un ensemble de contrats intelligents et souhaitez rechercher tous les contrats qui ont une méthode public
nommée withdrawEth
mais le grep lexical génère beaucoup de faux positifs ? Voici où solgrep peut vous aider ! ?
? npm install -g solgrep
Solgrep trouve récursivement des contrats intelligents dans un répertoire cible, analyse les unités sources pour comprendre la sémantique du langage et met ces informations à la disposition d'une puissante fonction de filtre basée sur Javascript. De cette façon, vous pouvez :
AST_EXACT
et AST_FUZZY
) La manière la plus courante d'utiliser cet outil est probablement de l'exécuter avec l'option --find=<js-filter-statement>
, où js-filter-statement
est une ligne javascript qui indique au moteur ce qui vous intéresse. Soit vous fournissez une instruction qui renvoie boolean
(« mode recherche »), soit vous renvoyez les informations que vous souhaitez extraire (« mode extraction »).
--find=<js-filter-statement>
car cet argument est évalué comme javascript !
--find
, --rule
. Voir Utilisation.
Exécuter les règles par défaut et afficher des statistiques ?
⇒ solgrep < folder >
Exécuter une ou plusieurs règles intégrées spécifiques ( solgrep -l
pour répertorier les règles disponibles) ?
⇒ solgrep < folder > -- rule = IsInitializable -- rule = Stats
Vous souhaitez rechercher toutes les unités sources avec un contrat doté d'une fonction nommée withdrawEth
?
⇒ solgrep < folder > -- find = "function.name=='withdrawEth'"
Faire la même chose mais sans tenir compte de la casse ?
⇒ solgrep < folder > -- find = "function.name.toLowerCase()=='withdraweth'"
Trouver toutes les fonctions qui appellent selfdestruct
?
⇒ solgrep < folder > -- find = "function.callsTo('selfdestruct')"
Extraire tous les noms de fonctions de tous les contrats ?
⇒ solgrep < folder > -- find = "function.name"
Obtenir une liste de toutes les fonctions external
?
⇒ solgrep < folder > -- find = "function.visibility.includes('external')"
Trouver des contrats ERC777
?
⇒ solgrep < folder > -- find = "contract.name=='ERC777'"
Extraire tous les noms de contrats ?
⇒ solgrep < folder > -- find = "contract.name"
Extraire tous les noms d'interface ?
⇒ solgrep < folder > -- find = "contract.name && contract.kind=='interface'"
Match contre quelque chose dans l' AST
?
⇒ solgrep < folder > -- find = "Object.keys(function.modifiers).includes('nonReentrant')"
Lexial correspond-il au code source d'une fonction ?
⇒ solgrep < folder > -- find = "function.getSource().includes('hi')"
Trouver des contrats en double ? (Correspondance exacte et floue AST)
⇒ solgrep < folder > -- rule DupeFinder
Utilisez l'option --output=<output.json>
pour écrire tous les résultats dans un fichier.
--find
sourceUnit
correspond au fichier source que le moteur est en train de traiter.contract
correspond au contrat que le moteur est en train de traiter.function
correspond à la fonction que le moteur est en train de traiter. Les méthodes suivantes sont disponibles :
<sourceUnit|contract|function>.getSource()
- donne accès au code source des unités<sourceUnit|contract|function>.ast
- fournit un accès direct à l'analyseur de solidité ASTfunction.callsTo('withdrawEth')
- recherche toutes les fonctions dans tous les contrats qui appellent une méthode nommée withdrawEth
Les fonctions contractuelles spéciales peuvent être des références telles que :
function.name == '__fallback__'
function.name == '__receiveEther__'
function.name == '__constructor__'
Stats
: collecte des statistiques sur le nombre de fichiers, de contrats, de noms uniques, etc. traités.GenericGrep
- est le moteur derrière la fonctionnalité --find
PARTAGER, C'EST SOIGNER - soumettez vos règles !
⇒ 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
), assurez-vous d'utiliser ce format :
⇒ solgrep <folder|...> [options]
ou
⇒ solgrep [options] -- <folder|...>
ou bien des options supplémentaires pourraient être interprétées comme des options --find
supplémentaires !
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 ( ) ;
} )
Voici un exemple qui illustre comment extraire tous les noms de fonctions de tous sourceUnits
et 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 vous ne fournissez aucune option de configuration, il utilisera les règles grep intégrées par défaut et analysera les chiffres à l'aide du module 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/