[ ? ]
Jadi, Anda memiliki sekumpulan kontrak pintar dan ingin menemukan semua kontrak yang memiliki metode public
bernama withdrawEth
tetapi grep leksikal menghasilkan banyak positif palsu? Di sinilah solgrep dapat membantu! ?
? npm install -g solgrep
Solgrep secara rekursif menemukan kontrak pintar di direktori target, mengurai unit sumber untuk memahami semantik bahasa, dan menjadikan informasi ini tersedia untuk fungsi filter berbasis javascript yang kuat. Dengan cara ini, Anda dapat:
AST_EXACT
dan AST_FUZZY
) Mungkin cara paling umum untuk menggunakan alat ini adalah dengan menjalankannya dengan opsi --find=<js-filter-statement>
, dengan js-filter-statement
adalah satu baris javascript yang memberi tahu mesin apa yang Anda minati. Anda bisa memberikan pernyataan yang mengembalikan boolean
("mode temukan") atau mengembalikan informasi yang ingin Anda ekstrak ("mode ekstrak").
--find=<js-filter-statement>
karena argumen ini sedang dievaluasi sebagai javascript!
--find
, --rule
. Lihat Penggunaan.
Jalankan aturan default dan tampilkan beberapa statistik?
⇒ solgrep < folder >
Jalankan aturan bawaan tertentu atau beberapa ( solgrep -l
untuk mencantumkan aturan yang tersedia)?
⇒ solgrep < folder > -- rule = IsInitializable -- rule = Stats
Anda ingin mencari semua unit sumber dengan kontrak yang memiliki fungsi bernama withdrawEth
?
⇒ solgrep < folder > -- find = "function.name=='withdrawEth'"
Lakukan hal yang sama tetapi tidak peka huruf besar-kecil?
⇒ solgrep < folder > -- find = "function.name.toLowerCase()=='withdraweth'"
Temukan semua fungsi yang memanggil selfdestruct
?
⇒ solgrep < folder > -- find = "function.callsTo('selfdestruct')"
Ekstrak semua nama fungsi dari semua kontrak?
⇒ solgrep < folder > -- find = "function.name"
Dapatkan daftar semua fungsi external
?
⇒ solgrep < folder > -- find = "function.visibility.includes('external')"
Temukan kontrak ERC777
?
⇒ solgrep < folder > -- find = "contract.name=='ERC777'"
Ekstrak semua nama Kontrak?
⇒ solgrep < folder > -- find = "contract.name"
Ekstrak semua nama Antarmuka?
⇒ solgrep < folder > -- find = "contract.name && contract.kind=='interface'"
Cocok melawan sesuatu di AST
?
⇒ solgrep < folder > -- find = "Object.keys(function.modifiers).includes('nonReentrant')"
Pencocokan leksial dengan kode sumber fungsi?
⇒ solgrep < folder > -- find = "function.getSource().includes('hi')"
Temukan kontrak duplikat? (Pencocokan tepat dan fuzzy AST)
⇒ solgrep < folder > -- rule DupeFinder
Gunakan opsi --output=<output.json>
untuk menulis semua hasil ke file.
--find
sourceUnit
cocok dengan file sumber yang sedang diproses mesin.contract
cocok dengan kontrak yang sedang diproses mesin.function
cocok dengan fungsi yang sedang diproses mesin. Tersedia metode berikut:
<sourceUnit|contract|function>.getSource()
- menyediakan akses ke kode sumber unit<sourceUnit|contract|function>.ast
- menyediakan akses langsung ke AST pengurai soliditasfunction.callsTo('withdrawEth')
- temukan semua fungsi di semua kontrak yang memanggil metode bernama withdrawEth
Fungsi kontrak khusus dapat menjadi acuan sebagai:
function.name == '__fallback__'
function.name == '__receiveEther__'
function.name == '__constructor__'
Stats
- mengumpulkan statistik tentang berapa banyak file, kontrak, nama unik, dll. yang diprosesGenericGrep
- adalah mesin di balik fitur --find
BERBAGI ITU PEDULI - kirimkan peraturan Anda!
⇒ 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
) pastikan untuk menggunakan format ini:
⇒ solgrep <folder|...> [options]
atau
⇒ solgrep [options] -- <folder|...>
atau opsi tambahan mungkin diartikan sebagai opsi --find
tambahan!
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 ( ) ;
} )
Berikut ini contoh yang mengilustrasikan cara mengekstrak semua nama fungsi dari semua sourceUnits
dan 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 ]
} ,
...
Jika Anda tidak memberikan opsi konfigurasi, ini akan menggunakan aturan grep bawaan default dan angka-angka menggunakan modul 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/