diff --git a/campaigns/full-spectrum.toml b/campaigns/full-spectrum.toml new file mode 100644 index 00000000..b682ab76 --- /dev/null +++ b/campaigns/full-spectrum.toml @@ -0,0 +1,152 @@ +name = "full-spectrum" +description = "4-stage campaign covering all scenario categories: warmup with simple ops, ramp into DeFi, peak with full protocol mix, cooldown" + +[spam] +mode = "tps" +rate = 100 +duration = 120 +seed = 42 + +# ────────────────────────────────────────────────────────────── +# Stage 1: Warmup — simple token operations +# ────────────────────────────────────────────────────────────── +[[spam.stage]] +name = "warmup" +rate = 50 +duration = 60 + +[[spam.stage.mix]] +scenario = "erc20" +share_pct = 30.0 + +[[spam.stage.mix]] +scenario = "scenarios/erc721.toml" +share_pct = 25.0 + +[[spam.stage.mix]] +scenario = "scenarios/erc1155.toml" +share_pct = 25.0 + +[[spam.stage.mix]] +scenario = "scenarios/stablecoin.toml" +share_pct = 20.0 + +# ────────────────────────────────────────────────────────────── +# Stage 2: Ramp — DeFi protocols come online +# ────────────────────────────────────────────────────────────── +[[spam.stage]] +name = "defi-ramp" +rate = 150 +duration = 120 + +[[spam.stage.mix]] +scenario = "scenarios/simpleAMM.toml" +share_pct = 25.0 + +[[spam.stage.mix]] +scenario = "scenarios/lending.toml" +share_pct = 20.0 + +[[spam.stage.mix]] +scenario = "scenarios/staking.toml" +share_pct = 15.0 + +[[spam.stage.mix]] +scenario = "scenarios/erc4626vault.toml" +share_pct = 15.0 + +[[spam.stage.mix]] +scenario = "scenarios/orderBook.toml" +share_pct = 15.0 + +[[spam.stage.mix]] +scenario = "scenarios/bridge.toml" +share_pct = 10.0 + +# ────────────────────────────────────────────────────────────── +# Stage 3: Peak — everything at once, max diversity +# ────────────────────────────────────────────────────────────── +[[spam.stage]] +name = "full-load" +rate = 300 +duration = 180 + +[[spam.stage.mix]] +scenario = "scenarios/simpleAMM.toml" +share_pct = 15.0 + +[[spam.stage.mix]] +scenario = "scenarios/lending.toml" +share_pct = 12.0 + +[[spam.stage.mix]] +scenario = "scenarios/orderBook.toml" +share_pct = 10.0 + +[[spam.stage.mix]] +scenario = "scenarios/staking.toml" +share_pct = 8.0 + +[[spam.stage.mix]] +scenario = "scenarios/erc4626vault.toml" +share_pct = 8.0 + +[[spam.stage.mix]] +scenario = "scenarios/governance.toml" +share_pct = 7.0 + +[[spam.stage.mix]] +scenario = "scenarios/multisig.toml" +share_pct = 7.0 + +[[spam.stage.mix]] +scenario = "scenarios/bridge.toml" +share_pct = 7.0 + +[[spam.stage.mix]] +scenario = "scenarios/dutchAuction.toml" +share_pct = 5.0 + +[[spam.stage.mix]] +scenario = "scenarios/nameRegistry.toml" +share_pct = 5.0 + +[[spam.stage.mix]] +scenario = "scenarios/precompiles/hashPrecompiles.toml" +share_pct = 5.0 + +[[spam.stage.mix]] +scenario = "scenarios/stablecoin.toml" +share_pct = 5.0 + +[[spam.stage.mix]] +scenario = "scenarios/erc721.toml" +share_pct = 3.0 + +[[spam.stage.mix]] +scenario = "scenarios/erc1155.toml" +share_pct = 3.0 + +# ────────────────────────────────────────────────────────────── +# Stage 4: Cooldown — light governance + staking tail +# ────────────────────────────────────────────────────────────── +[[spam.stage]] +name = "cooldown" +rate = 30 +duration = 60 + +[[spam.stage.mix]] +scenario = "scenarios/governance.toml" +share_pct = 30.0 + +[[spam.stage.mix]] +scenario = "scenarios/staking.toml" +share_pct = 30.0 + +[[spam.stage.mix]] +scenario = "scenarios/nameRegistry.toml" +share_pct = 20.0 + +[[spam.stage.mix]] +scenario = "erc20" +share_pct = 20.0 diff --git a/scenarios/bridge.toml b/scenarios/bridge.toml new file mode 100644 index 00000000..c0ddf7fd --- /dev/null +++ b/scenarios/bridge.toml @@ -0,0 +1,80 @@ +# ============================================================ +# L1->L2 Bridge Deposit Scenario +# ============================================================ +# Simulates bridge deposit traffic: ETH deposits, ERC20 deposits, +# and deposit processing. Event-heavy with storage writes for +# nonce tracking and deposit hash storage. +# Source: /tmp/bridge.sol (Solidity 0.8.26, optimized with 200 runs) +# ============================================================ + +[env] +initialSupply = "1000000000000000000000000000" +destinationChainId = "42161" + +# Deploy BridgeToken with initial supply +[[create]] +name = "BridgeToken" +bytecode = "0x60c0604052600b60809081526a213934b233b2aa37b5b2b760a91b60a0525f90610029908261016f565b5060408051808201909152600381526242524760e81b6020820152600190610051908261016f565b506002805460ff1916601217905534801561006a575f80fd5b506040516109bb3803806109bb83398101604081905261008991610229565b6003819055335f818152600460209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350610240565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806100ff57607f821691505b60208210810361011d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561016a57805f5260205f20601f840160051c810160208510156101485750805b601f840160051c820191505b81811015610167575f8155600101610154565b50505b505050565b81516001600160401b03811115610188576101886100d7565b61019c8161019684546100eb565b84610123565b6020601f8211600181146101ce575f83156101b75750848201515b5f19600385901b1c1916600184901b178455610167565b5f84815260208120601f198516915b828110156101fd57878501518255602094850194600190920191016101dd565b508482101561021a57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610239575f80fd5b5051919050565b61076e8061024d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610613565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d061010536600461063b565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610613565b61044f565b005b6100e961014c366004610675565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610613565b6104e2565b6100e9610186366004610695565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106c6565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016102f3565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610399908490610712565b90915550506001600160a01b0384165f90815260046020526040812080548492906103c5908490610712565b90915550506001600160a01b0383165f90815260046020526040812080548492906103f1908490610725565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f8282546104609190610725565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c908490610725565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106c6565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610712565b90915550506001600160a01b0383165f9081526004602052604081208054849290610581908490610725565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461060e575f80fd5b919050565b5f8060408385031215610624575f80fd5b61062d836105f8565b946020939093013593505050565b5f805f6060848603121561064d575f80fd5b610656846105f8565b9250610664602085016105f8565b929592945050506040919091013590565b5f60208284031215610685575f80fd5b61068e826105f8565b9392505050565b5f80604083850312156106a6575f80fd5b6106af836105f8565b91506106bd602084016105f8565b90509250929050565b600181811c908216806106da57607f821691505b6020821081036106f857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610293576102936106fe565b80820180821115610293576102936106fe56fea2646970667358221220b5525893496b8c03e7490ee0afa301b608e821a0070a13eecd4bf31d8edc13a864736f6c634300081a0033" +args = ["{initialSupply}"] + +# Deploy SimpleBridge +[[create]] +name = "SimpleBridge" +bytecode = "0x6080604052348015600e575f80fd5b50610b368061001c5f395ff3fe60806040526004361061006e575f3560e01c8063873d8ea41161004c578063873d8ea4146100e9578063ae7e3baf14610108578063b581d2d114610136578063de35f5cb14610155575f80fd5b806321425ee01461007257806340c5faf0146100935780635358fbda146100d6575b5f80fd5b34801561007d575f80fd5b5061009161008c3660046107a8565b610177565b005b34801561009e575f80fd5b506100c16100ad3660046107d8565b60026020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100916100e43660046107d8565b610404565b3480156100f4575f80fd5b50610091610103366004610923565b61055e565b348015610113575f80fd5b506100c16101223660046107d8565b60016020525f908152604090205460ff1681565b348015610141575f80fd5b50610091610150366004610a08565b6106d9565b348015610160575f80fd5b506101695f5481565b6040519081526020016100cd565b5f82116101be5760405162461bcd60e51b815260206004820152601060248201526f04d757374206465706f736974203e20360841b60448201526064015b60405180910390fd5b5f805481806101cc83610a3b565b909155506040516001600160601b031933606090811b8216602084015287901b1660348201526048810185905260688101849052608881018290524260a88201529091505f9060c80160408051808303601f1901815282825280516020918201205f818152600192839052928320805460ff19169092179091553360248401523060448401526064830187905292509081906001600160a01b0388169060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516102a19190610a5f565b5f604051808303815f865af19150503d805f81146102da576040519150601f19603f3d011682016040523d82523d5f602084013e6102df565b606091505b50915091508180156103095750805115806103095750808060200190518101906103099190610a75565b6103475760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016101b5565b6040516001600160601b031933606090811b8216602084015289901b1660348201526048810187905260688101869052608881018590524260a88201524360c88201523a60e88201525f90610108016040516020818303038152906040529050876001600160a01b0316336001600160a01b03167f83f979c86e35c88739c699828e098f274ca74b323949a3d7e0bcee8659291c5989898989876040516103f2959493929190610a9b565b60405180910390a35050505050505050565b5f34116104435760405162461bcd60e51b815260206004820152600d60248201526c09aeae6e840e6cadcc8408aa89609b1b60448201526064016101b5565b5f8054818061045183610a3b565b909155506040516001600160601b03193360601b16602082015234603482015260548101849052607481018290524260948201529091505f9060b40160408051808303601f1901815282825280516020918201205f8181526001808452938120805460ff19169094179093556001600160601b03193360601b169184019190915234603484015260548301869052607483018590524260948401524360b48401523a60d484015292509060f4016040516020818303038152906040529050336001600160a01b03167f9115d9081fb8f9b65e895000da18c06368188a5cff8812f41583d514cc472c3c3486868686604051610550959493929190610a9b565b60405180910390a250505050565b81518351148015610570575080518251145b6105ae5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016101b5565b5f5b83518110156106d35760025f8583815181106105ce576105ce610aec565b60209081029190910181015182528101919091526040015f205460ff166106cb57600160025f86848151811061060657610606610aec565b602002602001015181526020019081526020015f205f6101000a81548160ff02191690831515021790555083818151811061064357610643610aec565b60200260200101517f7d77e3f1866839ef93f5eda23990fa4368bf7b0af583ae0f64ecae4da14a4d6184838151811061067e5761067e610aec565b602002602001015184848151811061069857610698610aec565b60200260200101516040516106c29291906001600160a01b03929092168252602082015260400190565b60405180910390a25b6001016105b0565b50505050565b5f8381526002602052604090205460ff161561072b5760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481c1c9bd8d95cdcd959607a1b60448201526064016101b5565b5f83815260026020908152604091829020805460ff1916600117905581516001600160a01b038516815290810183905284917f7d77e3f1866839ef93f5eda23990fa4368bf7b0af583ae0f64ecae4da14a4d61910160405180910390a2505050565b80356001600160a01b03811681146107a3575f80fd5b919050565b5f805f606084860312156107ba575f80fd5b6107c38461078d565b95602085013595506040909401359392505050565b5f602082840312156107e8575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561082c5761082c6107ef565b604052919050565b5f67ffffffffffffffff82111561084d5761084d6107ef565b5060051b60200190565b5f82601f830112610866575f80fd5b813561087961087482610834565b610803565b8082825260208201915060208360051b86010192508583111561089a575f80fd5b602085015b838110156108be576108b08161078d565b83526020928301920161089f565b5095945050505050565b5f82601f8301126108d7575f80fd5b81356108e561087482610834565b8082825260208201915060208360051b860101925085831115610906575f80fd5b602085015b838110156108be57803583526020928301920161090b565b5f805f60608486031215610935575f80fd5b833567ffffffffffffffff81111561094b575f80fd5b8401601f8101861361095b575f80fd5b803561096961087482610834565b8082825260208201915060208360051b85010192508883111561098a575f80fd5b6020840193505b828410156109ac578335825260209384019390910190610991565b9550505050602084013567ffffffffffffffff8111156109ca575f80fd5b6109d686828701610857565b925050604084013567ffffffffffffffff8111156109f2575f80fd5b6109fe868287016108c8565b9150509250925092565b5f805f60608486031215610a1a575f80fd5b83359250610a2a6020850161078d565b929592945050506040919091013590565b5f60018201610a5857634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f82518060208501845e5f920191825250919050565b5f60208284031215610a85575f80fd5b81518015158114610a94575f80fd5b9392505050565b85815284602082015283604082015282606082015260a060808201525f82518060a0840152806020850160c085015e5f60c0828501015260c0601f19601f8301168401019150509695505050505050565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220c6237f765464f07265664dc7df1b6eb37bb7735d8d12b71e268b1e9404a36f1c64736f6c634300081a0033" + +# Setup: mint BridgeTokens to all spammer accounts +[[setup]] +kind = "mint_tokens" +to = "{BridgeToken}" +from_pool = "admin" +for_all_accounts = true +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "{initialSupply}"] + +# Setup: approve SimpleBridge to spend tokens for all spammer accounts +[[setup]] +kind = "approve_bridge" +to = "{BridgeToken}" +for_all_accounts = true +signature = "approve(address spender, uint256 amount)" +args = ["{SimpleBridge}", "{initialSupply}"] + +# Spam 1: depositETH - fuzz tx value from 0.001 to 0.01 ETH +[[spam]] +[spam.tx] +kind = "deposit_eth" +to = "{SimpleBridge}" +from_pool = "depositors" +signature = "function depositETH(uint256 destinationChainId) payable" +args = ["{destinationChainId}"] +value = "0.005 eth" +gas_limit = 150000 +fuzz = [ + { value = true, min = "1000000000000000", max = "10000000000000000" }, +] + +# Spam 2: depositERC20 - fuzz amount from 1e15 to 1e18 +[[spam]] +[spam.tx] +kind = "deposit_erc20" +to = "{SimpleBridge}" +from_pool = "depositors" +signature = "function depositERC20(address token, uint256 amount, uint256 destinationChainId)" +args = ["{BridgeToken}", "1000000000000000000", "{destinationChainId}"] +gas_limit = 200000 +fuzz = [ + { param = "amount", min = "1000000000000000", max = "1000000000000000000" }, +] + +# Spam 3: processDeposit - simulate processing with fuzzed depositHash +[[spam]] +[spam.tx] +kind = "process_deposit" +to = "{SimpleBridge}" +from_pool = "processors" +signature = "function processDeposit(bytes32 depositHash, address recipient, uint256 amount)" +args = ["0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000001", "1000000000000000000"] +gas_limit = 120000 +fuzz = [ + { param = "depositHash", min = "0", max = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" }, +] diff --git a/scenarios/dutchAuction.toml b/scenarios/dutchAuction.toml new file mode 100644 index 00000000..580de137 --- /dev/null +++ b/scenarios/dutchAuction.toml @@ -0,0 +1,37 @@ +# ============================================================ +# Dutch Auction - Decreasing Price Auction Stress Test +# ============================================================ +# Source: /tmp/auction.sol (Solidity 0.8.26, optimized with 200 runs) +# Gas profile: ~60-80k per bid (timestamp read, price calc with division, +# counter increments, ETH refunds via low-level call) +# ============================================================ + +[env] +# 1 ETH start price +startPrice = "1000000000000000000" +# 0.1 ETH end price +endPrice = "100000000000000000" +# 1 hour duration +duration = "3600" + +# Deploy DutchAuction with constructor(startPrice, endPrice, duration) +[[create]] +name = "DutchAuction" +signature = "(uint256 startPrice_, uint256 endPrice_, uint256 duration_)" +args = ["{startPrice}", "{endPrice}", "{duration}"] +bytecode = "0x608060405234801561000f575f80fd5b5060405161065338038061065383398101604081905261002e916100f7565b8183116100825760405162461bcd60e51b815260206004820152601f60248201527f73746172745072696365206d7573742065786365656420656e6450726963650060448201526064015b60405180910390fd5b5f81116100d15760405162461bcd60e51b815260206004820152601960248201527f6475726174696f6e206d75737420626520706f736974697665000000000000006044820152606401610079565b5f80546001600160a01b0319163317905542600155600292909255600355600455610122565b5f805f60608486031215610109575f80fd5b5050815160208301516040909301519094929350919050565b6105248061012f5f395ff3fe60806040526004361061008f575f3560e01c80639106d7ba116100575780639106d7ba14610124578063b868723e14610139578063bfb89d971461014e578063eb91d37e14610179578063f1a9af891461018d575f80fd5b80630fb5a6b4146100935780631998aeef146100bb5780633ccfd60b146100c557806378e97925146100d95780638da5cb5b146100ee575b5f80fd5b34801561009e575f80fd5b506100a860045481565b6040519081526020015b60405180910390f35b6100c36101a2565b005b3480156100d0575f80fd5b506100c3610309565b3480156100e4575f80fd5b506100a860015481565b3480156100f9575f80fd5b505f5461010c906001600160a01b031681565b6040516001600160a01b0390911681526020016100b2565b34801561012f575f80fd5b506100a860055481565b348015610144575f80fd5b506100a860035481565b348015610159575f80fd5b506100a8610168366004610446565b60066020525f908152604090205481565b348015610184575f80fd5b506100a86103e3565b348015610198575f80fd5b506100a860025481565b5f6101ab6103e3565b9050803410156101f95760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064015b60405180910390fd5b60058054905f61020883610487565b9091555050600554335f90815260066020526040812080549161022a83610487565b9091555050604080518381526020810183905233917f1452773cf753d0d7c71ed9990f7c7e2bdde4a2d08d187b3647953877e400488d910160405180910390a25f610275833461049f565b90508015610304576040515f90339083908381818185875af1925050503d805f81146102bc576040519150601f19603f3d011682016040523d82523d5f602084013e6102c1565b606091505b50509050806103025760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016101f0565b505b505050565b5f546001600160a01b0316331461034e5760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016101f0565b5f80546040516001600160a01b039091169047908381818185875af1925050503d805f8114610398576040519150601f19603f3d011682016040523d82523d5f602084013e61039d565b606091505b50509050806103e05760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016101f0565b50565b5f80600154426103f3919061049f565b9050600454811061040657505060035490565b5f6004548260035460025461041b919061049f565b61042591906104b8565b61042f91906104cf565b90508060025461043f919061049f565b9250505090565b5f60208284031215610456575f80fd5b81356001600160a01b038116811461046c575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161049857610498610473565b5060010190565b818103818111156104b2576104b2610473565b92915050565b80820281158282048414176104b2576104b2610473565b5f826104e957634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220483eeabfcd8b4372ec36542a523f6ecbf852c2207137e878acecc86a82a246af64736f6c634300081a0033" + +# Spam: bid on the auction with fuzzed ETH value +# Value is fuzzed between 0.1 ETH and 1 ETH to ensure bids succeed +# even as the price decreases over the auction duration. +# Excess ETH is refunded by the contract, exercising the refund gas pattern. +[[spam]] +[spam.tx] +kind = "bid" +to = "{DutchAuction}" +from_pool = "bidders" +signature = "function bid() external payable" +args = [] +value = "1000000000000000000" +gas_limit = 150000 +fuzz = [{ value = true, min = "100000000000000000", max = "1000000000000000000" }] diff --git a/scenarios/erc1155.toml b/scenarios/erc1155.toml new file mode 100644 index 00000000..89235d79 --- /dev/null +++ b/scenarios/erc1155.toml @@ -0,0 +1,131 @@ +# ERC1155 Multi-Token Benchmark Scenario +# source: /tmp/erc1155.sol (self-contained MinimalERC1155, solidity 0.8.26) +# compiled: solc --bin --optimize --optimize-runs 200 +# +# Gas profile (approximate): +# - mint: ~51k gas (cold) / ~34k gas (warm) +# - safeTransferFrom: ~52k gas (warm) +# - safeBatchTransferFrom: ~30k + ~26k per token ID + +[env] +mintAmount = "1000000" + +### Deploy contract + +[[create]] +name = "ERC1155" +bytecode = "0x6080604052348015600e575f80fd5b50610ab38061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061005f575f3560e01c8062fdd58e14610063578063156e29f6146100895780632eb2c2d61461009e578063a22cb465146100b1578063e985e9c5146100c4578063f242432a146100e7575b5f80fd5b6100766100713660046106e8565b6100fa565b6040519081526020015b60405180910390f35b61009c610097366004610710565b610121565b005b61009c6100ac3660046107c6565b6101fd565b61009c6100bf366004610885565b61046f565b6100d76100d23660046108be565b61053d565b6040519015158152602001610080565b61009c6100f53660046108ef565b61056a565b5f818152602081815260408083206001600160a01b03861684529091529020545b92915050565b6001600160a01b03831661017c5760405162461bcd60e51b815260206004820152601d60248201527f455243313135353a206d696e7420746f207a65726f206164647265737300000060448201526064015b60405180910390fd5b5f828152602081815260408083206001600160a01b0387168452909152812080548392906101ab908490610962565b909155505060408051838152602081018390526001600160a01b038516915f9133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b8483146102585760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206964732f616d6f756e7473206c656e677468206d69736d6044820152630c2e8c6d60e31b6064820152608401610173565b6001600160a01b03871661027e5760405162461bcd60e51b815260040161017390610981565b6001600160a01b03881633148061029a575061029a883361053d565b6102b65760405162461bcd60e51b8152600401610173906109c2565b5f5b85811015610409575f8787838181106102d3576102d3610a08565b9050602002013590505f8686848181106102ef576102ef610a08565b9050602002013590505f805f8481526020019081526020015f205f8d6001600160a01b03166001600160a01b031681526020019081526020015f205490508181101561037d5760405162461bcd60e51b815260206004820152601d60248201527f455243313135353a20696e73756666696369656e742062616c616e63650000006044820152606401610173565b8181035f808581526020019081526020015f205f8e6001600160a01b03166001600160a01b031681526020019081526020015f2081905550815f808581526020019081526020015f205f8d6001600160a01b03166001600160a01b031681526020019081526020015f205f8282546103f59190610962565b9091555050600190930192506102b8915050565b50866001600160a01b0316886001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989898960405161045d9493929190610a4c565b60405180910390a45050505050505050565b336001600160a01b038316036104d25760405162461bcd60e51b815260206004820152602260248201527f455243313135353a2073657474696e6720617070726f76616c20666f72207365604482015261363360f11b6064820152608401610173565b335f8181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b0385166105905760405162461bcd60e51b815260040161017390610981565b6001600160a01b0386163314806105ac57506105ac863361053d565b6105c85760405162461bcd60e51b8152600401610173906109c2565b5f848152602081815260408083206001600160a01b038a168452909152902054838110156106385760405162461bcd60e51b815260206004820152601d60248201527f455243313135353a20696e73756666696369656e742062616c616e63650000006044820152606401610173565b5f858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290610674908490610962565b909155505060408051868152602081018690526001600160a01b0380891692908a169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050505050565b80356001600160a01b03811681146106e3575f80fd5b919050565b5f80604083850312156106f9575f80fd5b610702836106cd565b946020939093013593505050565b5f805f60608486031215610722575f80fd5b61072b846106cd565b95602085013595506040909401359392505050565b5f8083601f840112610750575f80fd5b50813567ffffffffffffffff811115610767575f80fd5b6020830191508360208260051b8501011115610781575f80fd5b9250929050565b5f8083601f840112610798575f80fd5b50813567ffffffffffffffff8111156107af575f80fd5b602083019150836020828501011115610781575f80fd5b5f805f805f805f8060a0898b0312156107dd575f80fd5b6107e6896106cd565b97506107f460208a016106cd565b9650604089013567ffffffffffffffff81111561080f575f80fd5b61081b8b828c01610740565b909750955050606089013567ffffffffffffffff81111561083a575f80fd5b6108468b828c01610740565b909550935050608089013567ffffffffffffffff811115610865575f80fd5b6108718b828c01610788565b999c989b5096995094979396929594505050565b5f8060408385031215610896575f80fd5b61089f836106cd565b9150602083013580151581146108b3575f80fd5b809150509250929050565b5f80604083850312156108cf575f80fd5b6108d8836106cd565b91506108e6602084016106cd565b90509250929050565b5f805f805f8060a08789031215610904575f80fd5b61090d876106cd565b955061091b602088016106cd565b94506040870135935060608701359250608087013567ffffffffffffffff811115610944575f80fd5b61095089828a01610788565b979a9699509497509295939492505050565b8082018082111561011b57634e487b7160e01b5f52601160045260245ffd5b60208082526021908201527f455243313135353a207472616e7366657220746f207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526026908201527f455243313135353a2063616c6c6572206e6f74206f776e6572206e6f722061706040820152651c1c9bdd995960d21b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b8183525f6001600160fb1b03831115610a33575f80fd5b8260051b80836020870137939093016020019392505050565b604081525f610a5f604083018688610a1c565b8281036020840152610a72818587610a1c565b97965050505050505056fea26469706673582212200d36711f67833667355f2e122f8d60cfab9ed955fa5570b8dd200a21fc83acea64736f6c634300081a0033" + +### Setup: mint initial token balances + +# Mint token IDs 1-5 (1,000,000 each) to admin +[[setup]] +kind = "mint_admin_token_1" +to = "{ERC1155}" +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "1", "{mintAmount}"] + +[[setup]] +kind = "mint_admin_token_2" +to = "{ERC1155}" +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "2", "{mintAmount}"] + +[[setup]] +kind = "mint_admin_token_3" +to = "{ERC1155}" +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "3", "{mintAmount}"] + +[[setup]] +kind = "mint_admin_token_4" +to = "{ERC1155}" +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "4", "{mintAmount}"] + +[[setup]] +kind = "mint_admin_token_5" +to = "{ERC1155}" +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "5", "{mintAmount}"] + +# Mint token IDs 1-5 to all spammer accounts +[[setup]] +kind = "mint_spammers_token_1" +to = "{ERC1155}" +from_pool = "spammers" +for_all_accounts = true +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "1", "{mintAmount}"] + +[[setup]] +kind = "mint_spammers_token_2" +to = "{ERC1155}" +from_pool = "spammers" +for_all_accounts = true +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "2", "{mintAmount}"] + +[[setup]] +kind = "mint_spammers_token_3" +to = "{ERC1155}" +from_pool = "spammers" +for_all_accounts = true +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "3", "{mintAmount}"] + +[[setup]] +kind = "mint_spammers_token_4" +to = "{ERC1155}" +from_pool = "spammers" +for_all_accounts = true +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "4", "{mintAmount}"] + +[[setup]] +kind = "mint_spammers_token_5" +to = "{ERC1155}" +from_pool = "spammers" +for_all_accounts = true +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "5", "{mintAmount}"] + +### Spam patterns + +# 1. Single mint - mint new tokens with fuzzed ID and amount +[[spam]] +[spam.tx] +kind = "erc1155_mint" +to = "{ERC1155}" +from_pool = "spammers" +signature = "mint(address to, uint256 id, uint256 amount)" +args = ["{_sender}", "100", "1000"] +gas_limit = 80000 +fuzz = [ + { param = "id", min = "100", max = "10000" }, + { param = "amount", min = "1", max = "100000" }, +] + +# 2. Single transfer - safeTransferFrom to self, fuzz amount +[[spam]] +[spam.tx] +kind = "erc1155_single_transfer" +to = "{ERC1155}" +from_pool = "spammers" +signature = "safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data)" +args = ["{_sender}", "{_sender}", "1", "1", "0x"] +gas_limit = 80000 +fuzz = [ + { param = "id", min = "1", max = "5" }, + { param = "amount", min = "1", max = "10" }, +] + +# 3. Batch transfer - transfer multiple token IDs at once to self +[[spam]] +[spam.tx] +kind = "erc1155_batch_transfer" +to = "{ERC1155}" +from_pool = "spammers" +signature = "safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data)" +args = ["{_sender}", "{_sender}", "[1,2,3]", "[1,1,1]", "0x"] +gas_limit = 200000 diff --git a/scenarios/erc4626vault.toml b/scenarios/erc4626vault.toml new file mode 100644 index 00000000..21da7e74 --- /dev/null +++ b/scenarios/erc4626vault.toml @@ -0,0 +1,103 @@ +# ERC4626 Vault deposit/withdraw spammer scenario +# +# Deploys a minimal ERC20 token (SimpleToken) and a minimal ERC4626-style vault +# (SimpleVault). Spammers repeatedly deposit and withdraw tokens to exercise +# storage-heavy DeFi patterns (balance tracking, allowances, share accounting). +# +# source: /tmp/vault.sol +# compiled with: solc --bin --optimize --optimize-runs 200 + +### template variables +[env] +initialSupply = "1000000000000000000000000000" + +### deploy SimpleToken with initialSupply +[[create]] +name = "simpleToken" +signature = "(uint256 initialSupply)" +args = ["{initialSupply}"] +bytecode = "0x60c0604052600b60809081526a29b4b6b83632aa37b5b2b760a91b60a0525f90610029908261016f565b5060408051808201909152600381526253544b60e81b6020820152600190610051908261016f565b506002805460ff1916601217905534801561006a575f80fd5b506040516109bb3803806109bb83398101604081905261008991610229565b6003819055335f818152600460209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350610240565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806100ff57607f821691505b60208210810361011d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561016a57805f5260205f20601f840160051c810160208510156101485750805b601f840160051c820191505b81811015610167575f8155600101610154565b50505b505050565b81516001600160401b03811115610188576101886100d7565b61019c8161019684546100eb565b84610123565b6020601f8211600181146101ce575f83156101b75750848201515b5f19600385901b1c1916600184901b178455610167565b5f84815260208120601f198516915b828110156101fd57878501518255602094850194600190920191016101dd565b508482101561021a57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610239575f80fd5b5051919050565b61076e8061024d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610613565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d061010536600461063b565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610613565b61044f565b005b6100e961014c366004610675565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610613565b6104e2565b6100e9610186366004610695565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106c6565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b8152602060048201526016602482015275696e73756666696369656e7420616c6c6f77616e636560501b60448201526064016102f3565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610399908490610712565b90915550506001600160a01b0384165f90815260046020526040812080548492906103c5908490610712565b90915550506001600160a01b0383165f90815260046020526040812080548492906103f1908490610725565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f8282546104609190610725565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c908490610725565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106c6565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610712565b90915550506001600160a01b0383165f9081526004602052604081208054849290610581908490610725565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461060e575f80fd5b919050565b5f8060408385031215610624575f80fd5b61062d836105f8565b946020939093013593505050565b5f805f6060848603121561064d575f80fd5b610656846105f8565b9250610664602085016105f8565b929592945050506040919091013590565b5f60208284031215610685575f80fd5b61068e826105f8565b9392505050565b5f80604083850312156106a6575f80fd5b6106af836105f8565b91506106bd602084016105f8565b90509250929050565b600181811c908216806106da57607f821691505b6020821081036106f857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610293576102936106fe565b80820180821115610293576102936106fe56fea2646970667358221220737fc904479ebaf405db897f85b5c131efdffb15a46b62f70f3f7206a11b1a6764736f6c634300081a0033" + +### deploy SimpleVault with SimpleToken address +[[create]] +name = "simpleVault" +signature = "(address asset_)" +args = ["{simpleToken}"] +bytecode = "0x6080604052348015600e575f80fd5b506040516105ff3803806105ff833981016040819052602b91604e565b5f80546001600160a01b0319166001600160a01b03929092169190911790556079565b5f60208284031215605d575f80fd5b81516001600160a01b03811681146072575f80fd5b9392505050565b610579806100865f395ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c806301e1d114146100645780632e1a7d4d1461008057806338d52e0f146100935780633a98ef39146100bd57806370a08231146100c6578063b6b55f25146100e5575b5f80fd5b61006d60015481565b6040519081526020015b60405180910390f35b61006d61008e3660046104a9565b6100f8565b5f546100a5906001600160a01b031681565b6040516001600160a01b039091168152602001610077565b61006d60025481565b61006d6100d43660046104c0565b60036020525f908152604090205481565b61006d6100f33660046104a9565b610301565b5f80821161013d5760405162461bcd60e51b815260206004820152600d60248201526c7a65726f20776974686472617760981b60448201526064015b60405180910390fd5b335f908152600360205260409020548211156101915760405162461bcd60e51b8152602060048201526013602482015272696e73756666696369656e742073686172657360681b6044820152606401610134565b50335f908152600360205260408120805483928392916101b2908490610501565b925050819055508160025f8282546101ca9190610501565b925050819055508060015f8282546101e29190610501565b90915550505f8054604051336024820152604481018490526001600160a01b039091169060640160408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b1790525161023e919061051a565b5f604051808303815f865af19150503d805f8114610277576040519150601f19603f3d011682016040523d82523d5f602084013e61027c565b606091505b50509050806102bf5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610134565b604080518481526020810184905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56891015b60405180910390a250919050565b5f8082116103405760405162461bcd60e51b815260206004820152600c60248201526b1e995c9bc819195c1bdcda5d60a21b6044820152606401610134565b505f8054604051336024820152306044820152606481018490528392916001600160a01b03169060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b1790525161039f919061051a565b5f604051808303815f865af19150503d805f81146103d8576040519150601f19603f3d011682016040523d82523d5f602084013e6103dd565b606091505b50509050806104205760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610134565b8260015f8282546104319190610530565b925050819055508160025f8282546104499190610530565b9091555050335f908152600360205260408120805484929061046c908490610530565b9091555050604080518481526020810184905233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1591016102f3565b5f602082840312156104b9575f80fd5b5035919050565b5f602082840312156104d0575f80fd5b81356001600160a01b03811681146104e6575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610514576105146104ed565b92915050565b5f82518060208501845e5f920191825250919050565b80820180821115610514576105146104ed56fea2646970667358221220863353e1137359eaa0b88ebf849d2ba363603da192426ee64a190a1ac748489864736f6c634300081a0033" + +## setup: admin mints tokens to self ############################################ + +[[setup]] +kind = "admin_mint_tokens" +to = "{simpleToken}" +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "1000000000000000000000000000"] + +## setup: admin approves vault to spend tokens ################################## + +[[setup]] +kind = "admin_approve_vault" +to = "{simpleToken}" +signature = "approve(address spender, uint256 amount) returns (bool)" +args = [ + "{simpleVault}", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", +] + +## setup: admin deposits initial tokens into vault to seed it ################### + +[[setup]] +kind = "admin_seed_vault" +to = "{simpleVault}" +signature = "deposit(uint256 assets) returns (uint256 shares)" +args = ["500000000000000000000000000"] +gas_limit = 200000 + +## setup: mint tokens to all spammer accounts ################################### + +[[setup]] +kind = "spammer_mint_tokens" +to = "{simpleToken}" +from_pool = "spammers" +for_all_accounts = true +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "100000000000000000000000"] + +## setup: all spammer accounts approve vault #################################### + +[[setup]] +kind = "spammer_approve_vault" +to = "{simpleToken}" +from_pool = "spammers" +for_all_accounts = true +signature = "approve(address spender, uint256 amount) returns (bool)" +args = [ + "{simpleVault}", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", +] + +### SPAM + +## spam: deposit tokens into vault (fuzz amount) ################################ + +[[spam]] +[spam.tx] +kind = "vault_deposit" +to = "{simpleVault}" +from_pool = "spammers" +signature = "deposit(uint256 assets) returns (uint256 shares)" +args = ["1000000000000000000"] +gas_limit = 200000 +fuzz = [{ param = "assets", min = "1000000000000000", max = "1000000000000000000" }] + +## spam: withdraw shares from vault (fuzz amount, may revert) #################### + +[[spam]] +[spam.tx] +kind = "vault_withdraw" +to = "{simpleVault}" +from_pool = "spammers" +signature = "withdraw(uint256 shares) returns (uint256 assets)" +args = ["100000000000000000"] +gas_limit = 200000 +fuzz = [{ param = "shares", min = "100000000000000", max = "100000000000000000" }] diff --git a/scenarios/erc721.toml b/scenarios/erc721.toml new file mode 100644 index 00000000..2a400df2 --- /dev/null +++ b/scenarios/erc721.toml @@ -0,0 +1,225 @@ +# ============================================================ +# ERC721 NFT - Minting and Transfer Stress Test +# ============================================================ +# Source: custom minimal ERC721 (/tmp/erc721.sol) +# Gas profile: ~51k mint, ~48k transferFrom +# ============================================================ +# +# This scenario deploys a minimal ERC721 contract and exercises two patterns: +# 1. Continuous minting (always succeeds, creates new state) +# 2. Self-transfers of previously minted tokens (exercises ownership checks) +# +# Setup mints tokens to all spammer accounts via for_all_accounts so each +# spammer owns tokens they can transfer. Transfer spam uses self-transfers +# ({_sender} -> {_sender}) so the sender is always the owner. + +[env] +# Number of tokens minted per spammer in setup (5 rounds x for_all_accounts) +tokens_per_spammer = "5" + +[[create]] +name = "SimpleERC721" +bytecode = "0x60c0604052600c60809081526b10dbdb9d195b99195c93919560a21b60a0525f9061002a9082610102565b5060408051808201909152600481526310d3919560e21b60208201526001906100539082610102565b506001600255348015610064575f80fd5b506101bc565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061009257607f821691505b6020821081036100b057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156100fd57805f5260205f20601f840160051c810160208510156100db5750805b601f840160051c820191505b818110156100fa575f81556001016100e7565b50505b505050565b81516001600160401b0381111561011b5761011b61006a565b61012f81610129845461007e565b846100b6565b6020601f821160018114610161575f831561014a5750848201515b5f19600385901b1c1916600184901b1784556100fa565b5f84815260208120601f198516915b828110156101905787850151825560209485019460019092019101610170565b50848210156101ad57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610a94806101c95f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c80636a627842116100635780636a6278421461012357806370a082311461014457806395d89b4114610157578063a22cb4651461015f578063e985e9c514610172575f80fd5b806306fdde031461009f578063081812fc146100bd578063095ea7b3146100e857806323b872dd146100fd5780636352211e14610110575b5f80fd5b6100a76101bd565b6040516100b49190610881565b60405180910390f35b6100d06100cb3660046108b6565b610248565b6040516001600160a01b0390911681526020016100b4565b6100fb6100f63660046108e8565b6102c7565b005b6100fb61010b366004610910565b6103ac565b6100d061011e3660046108b6565b6105eb565b61013661013136600461094a565b610651565b6040519081526020016100b4565b61013661015236600461094a565b610748565b6100a76107b1565b6100fb61016d36600461096a565b6107be565b6101ad6101803660046109a3565b6001600160a01b039182165f90815260066020908152604080832093909416825291909152205460ff1690565b60405190151581526020016100b4565b5f80546101c9906109d4565b80601f01602080910402602001604051908101604052809291908181526020018280546101f5906109d4565b80156102405780601f1061021757610100808354040283529160200191610240565b820191905f5260205f20905b81548152906001019060200180831161022357829003601f168201915b505050505081565b5f818152600360205260408120546001600160a01b03166102ac5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d103737b732bc34b9ba32b73a103a37b5b2b760391b60448201526064015b60405180910390fd5b505f908152600560205260409020546001600160a01b031690565b5f6102d1826105eb565b9050336001600160a01b038216148061030c57506001600160a01b0381165f90815260066020908152604080832033845290915290205460ff165b6103515760405162461bcd60e51b8152602060048201526016602482015275115490cdcc8c4e881b9bdd08185d5d1a1bdc9a5e995960521b60448201526064016102a3565b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f6103b6826105eb565b9050836001600160a01b0316816001600160a01b0316146104275760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016102a3565b6001600160a01b03831661047d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a207472616e7366657220746f207a65726f206164647265737360448201526064016102a3565b336001600160a01b03821614806104a957505f828152600560205260409020546001600160a01b031633145b806104d657506001600160a01b0381165f90815260066020908152604080832033845290915290205460ff165b61051b5760405162461bcd60e51b8152602060048201526016602482015275115490cdcc8c4e881b9bdd08185d5d1a1bdc9a5e995960521b60448201526064016102a3565b5f82815260056020908152604080832080546001600160a01b03191690556001600160a01b03871683526004909152812080546001929061055d908490610a20565b90915550506001600160a01b0383165f90815260046020526040812080546001929061058a908490610a33565b90915550505f8281526003602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b5f818152600360205260408120546001600160a01b03168061064b5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d103737b732bc34b9ba32b73a103a37b5b2b760391b60448201526064016102a3565b92915050565b5f6001600160a01b0382166106a85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a206d696e7420746f207a65726f20616464726573730000000060448201526064016102a3565b600280545f91826106b883610a46565b909155506001600160a01b0384165f90815260046020526040812080549293506001929091906106e9908490610a33565b90915550505f8181526003602052604080822080546001600160a01b0319166001600160a01b03871690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a492915050565b5f6001600160a01b0382166107965760405162461bcd60e51b81526020600482015260146024820152734552433732313a207a65726f206164647265737360601b60448201526064016102a3565b506001600160a01b03165f9081526004602052604090205490565b600180546101c9906109d4565b336001600160a01b038316036108165760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016102a3565b335f8181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156108c6575f80fd5b5035919050565b80356001600160a01b03811681146108e3575f80fd5b919050565b5f80604083850312156108f9575f80fd5b610902836108cd565b946020939093013593505050565b5f805f60608486031215610922575f80fd5b61092b846108cd565b9250610939602085016108cd565b929592945050506040919091013590565b5f6020828403121561095a575f80fd5b610963826108cd565b9392505050565b5f806040838503121561097b575f80fd5b610984836108cd565b915060208301358015158114610998575f80fd5b809150509250929050565b5f80604083850312156109b4575f80fd5b6109bd836108cd565b91506109cb602084016108cd565b90509250929050565b600181811c908216806109e857607f821691505b602082108103610a0657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561064b5761064b610a0c565b8082018082111561064b5761064b610a0c565b5f60018201610a5757610a57610a0c565b506001019056fea2646970667358221220be6f9adf2f2741393e6e03d0ac12e184e5667c342af1376d1b7fd352e6d3ade264736f6c634300081a0033" + +# Setup: admin mints 20 tokens to seed initial supply (token IDs 1-20) +[[setup]] +kind = "admin_mint_01" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_02" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_03" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_04" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_05" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_06" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_07" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_08" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_09" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_10" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_11" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_12" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_13" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_14" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_15" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_16" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_17" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_18" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_19" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "admin_mint_20" +to = "{SimpleERC721}" +from_pool = "admin" +signature = "mint(address to)" +args = ["{_sender}"] + +# Setup: mint 5 tokens to every spammer account so they own tokens for transfers +# Token IDs start at 21 and continue sequentially across all spammer accounts +[[setup]] +kind = "spammer_mint_1" +to = "{SimpleERC721}" +from_pool = "spammer" +for_all_accounts = true +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "spammer_mint_2" +to = "{SimpleERC721}" +from_pool = "spammer" +for_all_accounts = true +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "spammer_mint_3" +to = "{SimpleERC721}" +from_pool = "spammer" +for_all_accounts = true +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "spammer_mint_4" +to = "{SimpleERC721}" +from_pool = "spammer" +for_all_accounts = true +signature = "mint(address to)" +args = ["{_sender}"] + +[[setup]] +kind = "spammer_mint_5" +to = "{SimpleERC721}" +from_pool = "spammer" +for_all_accounts = true +signature = "mint(address to)" +args = ["{_sender}"] + +# Spam 1: Continuous minting of new tokens (always succeeds) +# Each tx mints a new NFT to the sender, creating fresh state writes +[[spam]] +[spam.tx] +kind = "nft_mint" +to = "{SimpleERC721}" +signature = "mint(address to)" +args = ["{_sender}"] + +# Spam 2: Self-transfers of tokens (sender transfers to self) +# Uses fuzzed tokenId; some may revert if sender doesn't own that token, +# which is realistic for benchmarking revert-handling throughput +[[spam]] +[spam.tx] +kind = "nft_transfer" +to = "{SimpleERC721}" +signature = "transferFrom(address from, address to, uint256 tokenId)" +args = ["{_sender}", "{_sender}", "1"] +fuzz = [{ param = "tokenId", min = "1", max = "1000" }] diff --git a/scenarios/governance.toml b/scenarios/governance.toml new file mode 100644 index 00000000..b124b309 --- /dev/null +++ b/scenarios/governance.toml @@ -0,0 +1,95 @@ +# SimpleGovernance scenario +# Simulates on-chain governance voting with realistic gas patterns: +# storage writes for vote tracking, event emission, and require checks. +# source: /tmp/governance.sol (Solidity 0.8.26, optimized with 200 runs) + +## Deploy the governance contract +[[create]] +name = "SimpleGovernance" +bytecode = "0x6080604052348015600e575f80fd5b5061052a8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c8063013cf08b1461006457806343859632146100b157806349c2a1a6146100ee578063c7f758a81461010f578063c9d27afe14610122578063da35c66414610137575b5f80fd5b610091610072366004610391565b600160208190525f918252604090912080549181015460029091015483565b604080519384526020840192909252908201526060015b60405180910390f35b6100de6100bf3660046103a8565b600260209081525f928352604080842090915290825290205460ff1681565b60405190151581526020016100a8565b6101016100fc3660046103f5565b61013f565b6040519081526020016100a8565b61009161011d366004610391565b6101b9565b6101356101303660046104a8565b610231565b005b6101015f5481565b5f8054825160208085019190912082845260019182905260408420556101669082906104cf565b5f908155818152600160205260409081902054905182917fb1e570e4094a5f87a5572e3e718941fb3822dd7fdc7a5d6d6d0d905b6c524271916101ab91815260200190565b60405180910390a292915050565b5f805f8054841061020b5760405162461bcd60e51b8152602060048201526017602482015276141c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b60448201526064015b60405180910390fd5b5050505f8181526001602081905260409091208054918101546002909101549193909250565b5f54821061027b5760405162461bcd60e51b8152602060048201526017602482015276141c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b6044820152606401610202565b5f82815260026020908152604080832033845290915290205460ff16156102d45760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606401610202565b5f8281526002602090815260408083203384529091529020805460ff19166001179055801561032b576001805f8481526020019081526020015f206001015f82825461032091906104cf565b909155506103549050565b6001805f8481526020019081526020015f206002015f82825461034e91906104cf565b90915550505b6040518115158152339083907fe71fcdac32df1877c1700e7bda2a03157e20993363a28fc35ac495cefc76e4d49060200160405180910390a35050565b5f602082840312156103a1575f80fd5b5035919050565b5f80604083850312156103b9575f80fd5b8235915060208301356001600160a01b03811681146103d6575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610405575f80fd5b813567ffffffffffffffff81111561041b575f80fd5b8201601f8101841361042b575f80fd5b803567ffffffffffffffff811115610445576104456103e1565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610474576104746103e1565b60405281815282820160200186101561048b575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f80604083850312156104b9575f80fd5b82359150602083013580151581146103d6575f80fd5b808201808211156104ee57634e487b7160e01b5f52601160045260245ffd5b9291505056fea2646970667358221220f3fd7b44fea17aed2b4c0dadc3b0f06673c0aa8aeb37ef7ee4cb714c7f17dd9d64736f6c634300081a0033" + + +## Setup: create 10 proposals (IDs 0-9) from admin +[[setup]] +kind = "create_proposal_0" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 0: Increase staking rewards"] + +[[setup]] +kind = "create_proposal_1" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 1: Reduce validator bond"] + +[[setup]] +kind = "create_proposal_2" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 2: Upgrade protocol to v2"] + +[[setup]] +kind = "create_proposal_3" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 3: Fund ecosystem grants"] + +[[setup]] +kind = "create_proposal_4" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 4: Adjust fee parameters"] + +[[setup]] +kind = "create_proposal_5" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 5: Add new oracle provider"] + +[[setup]] +kind = "create_proposal_6" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 6: Modify governance quorum"] + +[[setup]] +kind = "create_proposal_7" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 7: Treasury diversification"] + +[[setup]] +kind = "create_proposal_8" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 8: Enable cross-chain bridge"] + +[[setup]] +kind = "create_proposal_9" +to = "{SimpleGovernance}" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Proposal 9: Update token emission schedule"] + + +## Spam: create new proposals (ongoing proposal creation load) +[[spam]] +[spam.tx] +kind = "create_proposal" +to = "{SimpleGovernance}" +from_pool = "proposers" +signature = "function createProposal(string memory description) external returns (uint256)" +args = ["Spam proposal: stress test governance"] + +## Spam: vote on existing proposals (IDs 0-9) +# Votes may revert if the sender has already voted on that proposal +[[spam]] +[spam.tx] +kind = "cast_vote" +to = "{SimpleGovernance}" +from_pool = "voters" +signature = "function vote(uint256 proposalId, bool support) external" +args = ["0", "true"] +gas_limit = 120000 +fuzz = [ + { param = "proposalId", min = "0", max = "9" }, +] diff --git a/scenarios/lending.toml b/scenarios/lending.toml new file mode 100644 index 00000000..5e907652 --- /dev/null +++ b/scenarios/lending.toml @@ -0,0 +1,138 @@ +# Simple Lending Protocol spammer scenario +# +# Deploys two ERC20 tokens (CollateralToken & BorrowToken) and a SimpleLending pool. +# Spammers deposit collateral, borrow against it, and repay loans. +# This creates realistic DeFi gas patterns: multiple storage reads/writes, balance checks, +# collateral ratio calculations, and token transfers. +# +# Source: /tmp/lending.sol (Solidity 0.8.26, optimized 200 runs) + +[env] +initialSupply = "1000000000000000000000000000" + +### Deploy contracts ########################################################### + +[[create]] +name = "CollateralToken" +# LendingToken("CollateralToken", initialSupply) +bytecode = "0x60806040526002805460ff1916601217905534801561001c575f80fd5b50604051610a24380380610a2483398101604081905261003b916100b7565b5f61004683826101ef565b50600161005383826101ef565b506003819055335f818152600460209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350506102a9565b634e487b7160e01b5f52604160045260245ffd5b5f80604083850312156100c8575f80fd5b82516001600160401b038111156100dd575f80fd5b8301601f810185136100ed575f80fd5b80516001600160401b03811115610106576101066100a3565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610134576101346100a3565b60405281815282820160200187101561014b575f80fd5b8160208401602083015e5f60209282018301529401519395939450505050565b600181811c9082168061017f57607f821691505b60208210810361019d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101ea57805f5260205f20601f840160051c810160208510156101c85750805b601f840160051c820191505b818110156101e7575f81556001016101d4565b50505b505050565b81516001600160401b03811115610208576102086100a3565b61021c81610216845461016b565b846101a3565b6020601f82116001811461024e575f83156102375750848201515b5f19600385901b1c1916600184901b1784556101e7565b5f84815260208120601f198516915b8281101561027d578785015182556020948501946001909201910161025d565b508482101561029a57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b61076e806102b65f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610613565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d061010536600461063b565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610613565b61044f565b005b6100e961014c366004610675565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610613565b6104e2565b6100e9610186366004610695565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106c6565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b81526020600482015260166024820152751a5b9cdd59999a58d95b9d081859db1b1b5a5b9d195960521b60448201526064016102f3565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610399908490610712565b90915550506001600160a01b0384165f90815260046020526040812080548492906103c5908490610712565b90915550506001600160a01b0383165f90815260046020526040812080548492906103f1908490610725565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f8282546104609190610725565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c908490610725565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106c6565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610712565b90915550506001600160a01b0383165f9081526004602052604081208054849290610581908490610725565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461060e575f80fd5b919050565b5f8060408385031215610624575f80fd5b61062d836105f8565b946020939093013593505050565b5f805f6060848603121561064d575f80fd5b610656846105f8565b9250610664602085016105f8565b929592945050506040919091013590565b5f60208284031215610685575f80fd5b61068e826105f8565b9392505050565b5f80604083850312156106a6575f80fd5b6106af836105f8565b91506106bd602084016105f8565b90509250929050565b600181811c908216806106da57607f821691505b6020821081036106f857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610293576102936106fe565b80820180821115610293576102936106fe56fea26469706673582212203c8b78b27fb72ecdf4e0088b7e770df54bd9b5da30f2dd7f1dfb130f7cebd40364736f6c634300081a0033" +signature = "(string memory name_, uint256 initialSupply)" +args = ["CollateralToken", "{initialSupply}"] + +[[create]] +name = "BorrowToken" +# LendingToken("BorrowToken", initialSupply) +bytecode = "0x60806040526002805460ff1916601217905534801561001c575f80fd5b50604051610a24380380610a2483398101604081905261003b916100b7565b5f61004683826101ef565b50600161005383826101ef565b506003819055335f818152600460209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350506102a9565b634e487b7160e01b5f52604160045260245ffd5b5f80604083850312156100c8575f80fd5b82516001600160401b038111156100dd575f80fd5b8301601f810185136100ed575f80fd5b80516001600160401b03811115610106576101066100a3565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610134576101346100a3565b60405281815282820160200187101561014b575f80fd5b8160208401602083015e5f60209282018301529401519395939450505050565b600181811c9082168061017f57607f821691505b60208210810361019d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101ea57805f5260205f20601f840160051c810160208510156101c85750805b601f840160051c820191505b818110156101e7575f81556001016101d4565b50505b505050565b81516001600160401b03811115610208576102086100a3565b61021c81610216845461016b565b846101a3565b6020601f82116001811461024e575f83156102375750848201515b5f19600385901b1c1916600184901b1784556101e7565b5f84815260208120601f198516915b8281101561027d578785015182556020948501946001909201910161025d565b508482101561029a57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b61076e806102b65f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610613565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d061010536600461063b565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610613565b61044f565b005b6100e961014c366004610675565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610613565b6104e2565b6100e9610186366004610695565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106c6565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b81526020600482015260166024820152751a5b9cdd59999a58d95b9d081859db1b1b5a5b9d195960521b60448201526064016102f3565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610399908490610712565b90915550506001600160a01b0384165f90815260046020526040812080548492906103c5908490610712565b90915550506001600160a01b0383165f90815260046020526040812080548492906103f1908490610725565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f8282546104609190610725565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c908490610725565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106c6565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610712565b90915550506001600160a01b0383165f9081526004602052604081208054849290610581908490610725565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461060e575f80fd5b919050565b5f8060408385031215610624575f80fd5b61062d836105f8565b946020939093013593505050565b5f805f6060848603121561064d575f80fd5b610656846105f8565b9250610664602085016105f8565b929592945050506040919091013590565b5f60208284031215610685575f80fd5b61068e826105f8565b9392505050565b5f80604083850312156106a6575f80fd5b6106af836105f8565b91506106bd602084016105f8565b90509250929050565b600181811c908216806106da57607f821691505b6020821081036106f857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610293576102936106fe565b80820180821115610293576102936106fe56fea26469706673582212203c8b78b27fb72ecdf4e0088b7e770df54bd9b5da30f2dd7f1dfb130f7cebd40364736f6c634300081a0033" +signature = "(string memory name_, uint256 initialSupply)" +args = ["BorrowToken", "{initialSupply}"] + +[[create]] +name = "SimpleLending" +# SimpleLending(collateralToken, borrowToken) +bytecode = "0x6080604052348015600e575f80fd5b506040516109c43803806109c4833981016040819052602b916074565b5f80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905560a0565b80516001600160a01b0381168114606f575f80fd5b919050565b5f80604083850312156084575f80fd5b608b83605a565b9150609760208401605a565b90509250929050565b610917806100ad5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063b2016bd41161006e578063b2016bd414610162578063bad4a01f14610174578063c5ebeaec14610187578063d9e69a051461019a578063f19562b6146101a2578063ff50abdc146101aa575f80fd5b806329bc969d146100b5578063371fd8e6146100e7578063456dc17a146100fc5780634c19386c146101275780636112fe2e1461013057806394e1373c14610143575b5f80fd5b6100d46100c33660046107e4565b60026020525f908152604090205481565b6040519081526020015b60405180910390f35b6100fa6100f5366004610811565b6101b3565b005b60015461010f906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100d460055481565b6100fa61013e366004610811565b61031b565b6100d46101513660046107e4565b60036020525f908152604090205481565b5f5461010f906001600160a01b031681565b6100fa610182366004610811565b6104aa565b6100fa610195366004610811565b6105ae565b6100d4609681565b6100d4606481565b6100d460045481565b5f81116101db5760405162461bcd60e51b81526004016101d290610828565b60405180910390fd5b335f9081526003602052604090205481111561022e5760405162461bcd60e51b81526020600482015260126024820152711c995c185e48195e18d959591cc81919589d60721b60448201526064016101d2565b6001546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303815f875af1158015610282573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102a69190610854565b50335f90815260036020526040812080548392906102c5908490610887565b925050819055508060055f8282546102dd9190610887565b909155505060405181815233907f5c16de4f8b59bd9caf0f49a545f25819a895ed223294290b408242e72a594231906020015b60405180910390a250565b5f811161033a5760405162461bcd60e51b81526004016101d290610828565b335f90815260026020526040812054610354908390610887565b335f90815260036020526040902054909150610372906096906108a0565b61037d6064836108a0565b10156103d75760405162461bcd60e51b8152602060048201526024808201527f756e646572636f6c6c61746572616c697a656420616674657220776974686472604482015263185dd85b60e21b60648201526084016101d2565b335f908152600260205260408120829055600480548492906103fa908490610887565b90915550505f5460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303815f875af115801561044c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104709190610854565b5060405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050565b5f81116104c95760405162461bcd60e51b81526004016101d290610828565b5f546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303815f875af115801561051c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105409190610854565b50335f908152600260205260408120805483929061055f9084906108b7565b925050819055508060045f82825461057791906108b7565b909155505060405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610310565b5f81116105cd5760405162461bcd60e51b81526004016101d290610828565b335f908152600360205260408120546105e79083906108b7565b90506105f46096826108a0565b335f9081526002602052604090205461060f906064906108a0565b10156106535760405162461bcd60e51b81526020600482015260136024820152721d5b99195c98dbdb1b185d195c985b1a5e9959606a1b60448201526064016101d2565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610699573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bd91906108ca565b90508281101561070f5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e7420706f6f6c206c6971756964697479000000000060448201526064016102f3565b335f908152600360205260408120839055600580548592906107329084906108b7565b909155505060015460405163a9059cbb60e01b8152336004820152602481018590526001600160a01b039091169063a9059cbb906044016020604051808303815f875af1158015610785573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a99190610854565b5060405183815233907fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a367509060200160405180910390a2505050565b5f602082840312156107f4575f80fd5b81356001600160a01b038116811461080a575f80fd5b9392505050565b5f60208284031215610821575f80fd5b5035919050565b6020808252601290820152710616d6f756e74206d757374206265203e20360741b604082015260600190565b5f60208284031215610864575f80fd5b8151801515811461080a575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561089a5761089a610873565b92915050565b808202811582820484141761089a5761089a610873565b8082018082111561089a5761089a610873565b5f602082840312156108da575f80fd5b505191905056fea2646970667358221220f700a8c4fdf59e2b5144aaf6122d1151b7132c3ab61bd84204f1a6055bbf13e264736f6c634300081a0033" +signature = "(address collateralToken_, address borrowToken_)" +args = ["{CollateralToken}", "{BorrowToken}"] + +### Setup: Admin funds the lending pool ######################################## + +# Mint extra CollateralTokens for the admin (used to fund spammers) +[[setup]] +kind = "admin_mint_collateral" +to = "{CollateralToken}" +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "500000000000000000000000000"] + +# Mint extra BorrowTokens for the admin +[[setup]] +kind = "admin_mint_borrow" +to = "{BorrowToken}" +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "500000000000000000000000000"] + +# Transfer BorrowTokens to lending pool so borrowers can draw from it +[[setup]] +kind = "admin_fund_lending_pool" +to = "{BorrowToken}" +signature = "transfer(address to, uint256 amount) returns (bool)" +args = ["{SimpleLending}", "200000000000000000000000000"] + +### Setup: Prepare each spammer account ######################################## + +# Mint CollateralTokens for each spammer +[[setup]] +kind = "mint_collateral_for_spammer" +to = "{CollateralToken}" +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "10000000000000000000000"] +from_pool = "spammer" +for_all_accounts = true + +# Approve lending contract to spend spammer's CollateralTokens +[[setup]] +kind = "approve_collateral_for_spammer" +to = "{CollateralToken}" +signature = "approve(address spender, uint256 amount) returns (bool)" +args = ["{SimpleLending}", "115792089237316195423570985008687907853269984665640564039457584007913129639935"] +from_pool = "spammer" +for_all_accounts = true + +# Approve lending contract to spend spammer's BorrowTokens (for repay) +[[setup]] +kind = "approve_borrow_for_spammer" +to = "{BorrowToken}" +signature = "approve(address spender, uint256 amount) returns (bool)" +args = ["{SimpleLending}", "115792089237316195423570985008687907853269984665640564039457584007913129639935"] +from_pool = "spammer" +for_all_accounts = true + +# Deposit initial collateral for each spammer +[[setup]] +kind = "deposit_initial_collateral" +to = "{SimpleLending}" +signature = "depositCollateral(uint256 amount)" +args = ["5000000000000000000000"] +from_pool = "spammer" +for_all_accounts = true +gas_limit = 200000 + +### Spam: Lending operations ################################################### + +# Spam pattern 1: Deposit more collateral (fuzz amount 1e15 to 1e17) +[[spam]] +[spam.tx] +kind = "deposit_collateral" +to = "{SimpleLending}" +from_pool = "spammer" +signature = "depositCollateral(uint256 amount)" +args = ["50000000000000000"] +fuzz = [ + { param = "amount", min = "1000000000000000", max = "100000000000000000" }, +] + +# Spam pattern 2: Borrow against collateral (fuzz amount 1e14 to 1e16) +# May revert if undercollateralized, so gas_limit is set to skip estimation +[[spam]] +[spam.tx] +kind = "borrow" +to = "{SimpleLending}" +from_pool = "spammer" +signature = "borrow(uint256 amount)" +args = ["5000000000000000"] +gas_limit = 300000 +fuzz = [ + { param = "amount", min = "100000000000000", max = "10000000000000000" }, +] + +# Spam pattern 3: Repay borrowed tokens (fuzz amount 1e13 to 1e15) +# May revert if no outstanding debt, so gas_limit is set to skip estimation +[[spam]] +[spam.tx] +kind = "repay" +to = "{SimpleLending}" +from_pool = "spammer" +signature = "repay(uint256 amount)" +args = ["500000000000000"] +gas_limit = 300000 +fuzz = [ + { param = "amount", min = "10000000000000", max = "1000000000000000" }, +] diff --git a/scenarios/multisig.toml b/scenarios/multisig.toml new file mode 100644 index 00000000..abbd876a --- /dev/null +++ b/scenarios/multisig.toml @@ -0,0 +1,124 @@ +# ============================================================ +# SimpleMultiSig - Multi-Signature Wallet Stress Test +# ============================================================ +# Source: /tmp/multisig.sol (Solidity 0.8.26, optimized with 200 runs) +# Gas profile: ~90k submitTransaction, ~65k confirmTransaction, +# ~45k executeTransaction (varies with external call), +# ~35k revokeConfirmation +# Patterns: dynamic array growth, nested mappings, external calls, +# event emissions, require checks +# ============================================================ + +[env] +max_tx_id = "99" + +## Deploy the multisig contract with requiredConfirmations = 2 +[[create]] +name = "MultiSig" +bytecode = "0x6080604052348015600e575f80fd5b50604051610d17380380610d17833981016040819052602b916072565b5f8111606c5760405162461bcd60e51b815260206004820152600c60248201526b07265717569726564203e20360a41b604482015260640160405180910390fd5b5f556088565b5f602082840312156081575f80fd5b5051919050565b610c82806100955f395ff3fe60806040526004361061007c575f3560e01c80639ace38c21161004c5780639ace38c214610128578063c01a8c8414610158578063c642747414610177578063ee22610b14610196575f80fd5b806320ea8d86146100875780632e7700f0146100a85780633411c81c146100cb57806382e717f714610114575f80fd5b3661008357005b5f80fd5b348015610092575f80fd5b506100a66100a136600461081d565b6101b5565b005b3480156100b3575f80fd5b506001545b6040519081526020015b60405180910390f35b3480156100d6575f80fd5b506101046100e536600461084f565b600260209081525f928352604080842090915290825290205460ff1681565b60405190151581526020016100c2565b34801561011f575f80fd5b506100b85f5481565b348015610133575f80fd5b5061014761014236600461081d565b610304565b6040516100c29594939291906108a7565b348015610163575f80fd5b506100a661017236600461081d565b6103d9565b348015610182575f80fd5b506100b86101913660046108f5565b610528565b3480156101a1575f80fd5b506100a66101b036600461081d565b61066f565b60015481106101df5760405162461bcd60e51b81526004016101d6906109c1565b60405180910390fd5b600181815481106101f2576101f26109ec565b5f91825260209091206003600590920201015460ff16156102255760405162461bcd60e51b81526004016101d690610a00565b5f81815260026020908152604080832033845290915290205460ff1661027d5760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd0818dbdb999a5c9b5959609a1b60448201526064016101d6565b5f8181526002602090815260408083203384529091529020805460ff19169055600180548190839081106102b3576102b36109ec565b905f5260205f2090600502016004015f8282546102d09190610a41565b9091555050604051819033907ff0dca620e2e81f7841d07bcc105e1704fb01475b278a9d4c236e1c62945edd55905f90a350565b60018181548110610313575f80fd5b5f9182526020909120600590910201805460018201546002830180546001600160a01b03909316945090929161034890610a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461037490610a5a565b80156103bf5780601f10610396576101008083540402835291602001916103bf565b820191905f5260205f20905b8154815290600101906020018083116103a257829003601f168201915b505050506003830154600490930154919260ff1691905085565b60015481106103fa5760405162461bcd60e51b81526004016101d6906109c1565b6001818154811061040d5761040d6109ec565b5f91825260209091206003600590920201015460ff16156104405760405162461bcd60e51b81526004016101d690610a00565b5f81815260026020908152604080832033845290915290205460ff161561049d5760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e4818dbdb999a5c9b5959607a1b60448201526064016101d6565b5f8181526002602090815260408083203384529091529020805460ff1916600190811790915580548190839081106104d7576104d76109ec565b905f5260205f2090600502016004015f8282546104f49190610a92565b9091555050604051819033907f5cbe105e36805f7820e291f799d5794ff948af2a5f664e580382defb63390041905f90a350565b600180546040805160a0810182526001600160a01b038781168252602082018781529282018681525f606084018190526080840181905285870187559590955281517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf66005860290810180546001600160a01b0319169290931691909117825592517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf784015593519293909290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf801906106039082610af1565b50606082015160038201805460ff1916911515919091179055608090910151600490910155604051819033907fd5a05bf70715ad82a09a756320284a1b54c9ff74cd0f8cce6219e79b563fe59d9061066090889088908890610bac565b60405180910390a39392505050565b60015481106106905760405162461bcd60e51b81526004016101d6906109c1565b5f600182815481106106a4576106a46109ec565b5f9182526020909120600590910201600381015490915060ff16156106db5760405162461bcd60e51b81526004016101d690610a00565b5f54816004015410156107305760405162461bcd60e51b815260206004820152601860248201527f6e6f7420656e6f75676820636f6e6669726d6174696f6e73000000000000000060448201526064016101d6565b60038101805460ff191660019081179091558154908201546040515f926001600160a01b03169190610766906002860190610bdb565b5f6040518083038185875af1925050503d805f81146107a0576040519150601f19603f3d011682016040523d82523d5f602084013e6107a5565b606091505b50509050806107ec5760405162461bcd60e51b81526020600482015260136024820152721d1e08195e1958dd5d1a5bdb8819985a5b1959606a1b60448201526064016101d6565b604051839033907f5445f318f4f5fcfb66592e68e0cc5822aa15664039bd5f0ffde24c5a8142b1ac905f90a3505050565b5f6020828403121561082d575f80fd5b5035919050565b80356001600160a01b038116811461084a575f80fd5b919050565b5f8060408385031215610860575f80fd5b8235915061087060208401610834565b90509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b60018060a01b038616815284602082015260a060408201525f6108cd60a0830186610879565b931515606083015250608001529392505050565b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610907575f80fd5b61091084610834565b925060208401359150604084013567ffffffffffffffff811115610932575f80fd5b8401601f81018613610942575f80fd5b803567ffffffffffffffff81111561095c5761095c6108e1565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561098b5761098b6108e1565b6040528181528282016020018810156109a2575f80fd5b816020840160208301375f602083830101528093505050509250925092565b6020808252601190820152701d1e08191bd95cc81b9bdd08195e1a5cdd607a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252601390820152721d1e08185b1c9958591e48195e1958dd5d1959606a1b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a5457610a54610a2d565b92915050565b600181811c90821680610a6e57607f821691505b602082108103610a8c57634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610a5457610a54610a2d565b601f821115610aec57805f5260205f20601f840160051c81016020851015610aca5750805b601f840160051c820191505b81811015610ae9575f8155600101610ad6565b50505b505050565b815167ffffffffffffffff811115610b0b57610b0b6108e1565b610b1f81610b198454610a5a565b84610aa5565b6020601f821160018114610b51575f8315610b3a5750848201515b5f19600385901b1c1916600184901b178455610ae9565b5f84815260208120601f198516915b82811015610b805787850151825560209485019460019092019101610b60565b5084821015610b9d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60018060a01b0384168152826020820152606060408201525f610bd26060830184610879565b95945050505050565b5f808354610be881610a5a565b600182168015610bff5760018114610c1457610c41565b60ff1983168652811515820286019350610c41565b865f5260205f205f5b83811015610c3957815488820152600190910190602001610c1d565b505081860193505b50919594505050505056fea26469706673582212203231754d4c4ff95c8467d55bf17342a5705220d786c76f136abbd657b0ec592364736f6c634300081a0033" +signature = "constructor(uint256)" +args = ["2"] + + +## Setup: fund the multisig contract with ETH (plain transfer, no calldata) +[[setup]] +kind = "fund_multisig" +to = "{MultiSig}" +value = "10 eth" + +## Setup: submit 10 initial transactions (IDs 0-9) from admin +[[setup]] +kind = "submit_tx_0" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "1000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_1" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "2000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_2" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "3000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_3" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "4000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_4" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "5000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_5" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "1000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_6" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "2000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_7" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "3000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_8" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "4000000000000000", "0x"] + +[[setup]] +kind = "submit_tx_9" +to = "{MultiSig}" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "5000000000000000", "0x"] + + +## Spam 1: submit new transactions to the multisig +[[spam]] +[spam.tx] +kind = "submit_transaction" +to = "{MultiSig}" +from_pool = "submitters" +signature = "function submitTransaction(address to, uint256 value, bytes memory data) external returns (uint256)" +args = ["{_sender}", "1000000000000", "0x"] + +## Spam 2: confirm existing transactions (may revert if already confirmed or txId doesn't exist) +[[spam]] +[spam.tx] +kind = "confirm_transaction" +to = "{MultiSig}" +from_pool = "confirmers" +signature = "function confirmTransaction(uint256 txId) external" +args = ["0"] +gas_limit = 120000 +fuzz = [ + { param = "txId", min = "0", max = "{max_tx_id}" }, +] + +## Spam 3: execute transactions (may revert if not enough confirmations) +[[spam]] +[spam.tx] +kind = "execute_transaction" +to = "{MultiSig}" +from_pool = "executors" +signature = "function executeTransaction(uint256 txId) external" +args = ["0"] +gas_limit = 150000 +fuzz = [ + { param = "txId", min = "0", max = "{max_tx_id}" }, +] diff --git a/scenarios/nameRegistry.toml b/scenarios/nameRegistry.toml new file mode 100644 index 00000000..c8fa3479 --- /dev/null +++ b/scenarios/nameRegistry.toml @@ -0,0 +1,73 @@ +# Name Registration Service (ENS-like) +# Tests: storage-heavy registration, renewals, record updates with keccak256 hashing + +[env] +# Pre-defined names for setup (as bytes32 values) +name_alice = "0x616c696365000000000000000000000000000000000000000000000000000000" +name_bob = "0x626f620000000000000000000000000000000000000000000000000000000000" +name_carol = "0x6361726f6c000000000000000000000000000000000000000000000000000000" + + +# Deploy SimpleNameRegistry +[[create]] +name = "SimpleNameRegistry" +# source: /tmp/nameregistry.sol +# compiled with: solc --bin --optimize --optimize-runs 200 +bytecode = "0x6080604052348015600e575f80fd5b506107628061001c5f395ff3fe608060405260043610610084575f3560e01c806379ce9fac1161005757806379ce9fac146101705780638e32762d14610191578063d9b76ed4146101a4578063e1fa8e84146101c3578063e98523aa146101d6575f80fd5b806320c38e2b14610088578063418cc2ae146100fa5780634c1342df146101225780635c23bdf514610139575b5f80fd5b348015610093575f80fd5b506100cf6100a236600461066e565b5f602081905290815260409020805460018201546002909201546001600160a01b03918216929091169083565b604080516001600160a01b039485168152939092166020840152908201526060015b60405180910390f35b348015610105575f80fd5b5061011466038d7ea4c6800081565b6040519081526020016100f1565b34801561012d575f80fd5b506101146301e1338081565b348015610144575f80fd5b5061015861015336600461066e565b6101f0565b6040516001600160a01b0390911681526020016100f1565b34801561017b575f80fd5b5061018f61018a366004610685565b61024d565b005b61018f61019f36600461066e565b610350565b3480156101af575f80fd5b5061018f6101be366004610685565b61045d565b61018f6101d136600461066e565b610515565b3480156101e1575f80fd5b506101146601c6bf5263400081565b5f806101fb8361063d565b5f8181526020819052604090206002810154919250904211156102395760405162461bcd60e51b8152600401610230906106be565b60405180910390fd5b600101546001600160a01b03169392505050565b6001600160a01b0381166102955760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610230565b5f61029f8361063d565b5f8181526020819052604090208054919250906001600160a01b031633146102d95760405162461bcd60e51b8152600401610230906106e4565b80600201544211156102fd5760405162461bcd60e51b8152600401610230906106be565b80546001600160a01b031981166001600160a01b038581169182178455604051921691829085907fee3ae35c0d0799fb196f821efc8d30111345552cd23192da6bab51e7f664b6ba905f90a45050505050565b6601c6bf5263400034101561039a5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610230565b5f6103a48261063d565b5f8181526020819052604090208054919250906001600160a01b031633146103de5760405162461bcd60e51b8152600401610230906106e4565b80600201544211156104025760405162461bcd60e51b8152600401610230906106be565b6301e13380816002015f8282546104199190610707565b9091555050600281015460405190815282907f5a773044a6c2a5ab1c7812c9417486344a3aa701e02afef1026ba9e1bebeed949060200160405180910390a2505050565b5f6104678361063d565b5f8181526020819052604090208054919250906001600160a01b031633146104a15760405162461bcd60e51b8152600401610230906106e4565b80600201544211156104c55760405162461bcd60e51b8152600401610230906106be565b6001810180546001600160a01b0319166001600160a01b03851690811790915560405183907f0596aa396eab4e69aca55f612009f548a14767e50000a5446fbebc9dcc43820c905f90a350505050565b66038d7ea4c6800034101561055f5760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610230565b5f6105698261063d565b5f8181526020819052604090208054919250906001600160a01b031615806105945750806002015442115b6105cd5760405162461bcd60e51b815260206004820152600a6024820152692730b6b2903a30b5b2b760b11b6044820152606401610230565b8054336001600160a01b0319918216811783556001830180549092161790556105fa6301e1338042610707565b60028201819055604051908152339083907fb6090d914a9708da24e13a3c0752d4b6d484ba0c8a9a25ca6f3ced6a0d0feb009060200160405180910390a3505050565b5f8160405160200161065191815260200190565b604051602081830303815290604052805190602001209050919050565b5f6020828403121561067e575f80fd5b5035919050565b5f8060408385031215610696575f80fd5b8235915060208301356001600160a01b03811681146106b3575f80fd5b809150509250929050565b6020808252600c908201526b13985b5948195e1c1a5c995960a21b604082015260600190565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b8082018082111561072657634e487b7160e01b5f52601160045260245ffd5b9291505056fea2646970667358221220d7e4072f21f01fb9f0145abbf8caa14883c301b71e14c201d925a07c849bee7664736f6c634300081a0033" + + +# Setup: register a few names so we have state for renew/setRecord spam +[[setup]] +to = "{SimpleNameRegistry}" +kind = "register_alice" +signature = "register(bytes32 name)" +args = ["{name_alice}"] +value = "0.001 eth" + +[[setup]] +to = "{SimpleNameRegistry}" +kind = "register_bob" +signature = "register(bytes32 name)" +args = ["{name_bob}"] +value = "0.001 eth" + +[[setup]] +to = "{SimpleNameRegistry}" +kind = "register_carol" +signature = "register(bytes32 name)" +args = ["{name_carol}"] +value = "0.001 eth" + + +# Spam 1: Register new names with fuzzed bytes32 (collisions extremely rare) +[[spam]] +[spam.tx] +kind = "register_new_name" +to = "{SimpleNameRegistry}" +from_pool = "registrants" +signature = "function register(bytes32 name) payable" +args = ["{name_alice}"] +value = "0.001 eth" +gas_limit = 150000 +fuzz = [{ param = "name", min = "0", max = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" }] + +# Spam 2: Renew an existing name (registered in setup) +[[spam]] +[spam.tx] +kind = "renew_name" +to = "{SimpleNameRegistry}" +from_pool = "admin" +signature = "function renew(bytes32 name) payable" +args = ["{name_alice}"] +value = "0.0005 eth" +gas_limit = 100000 + +# Spam 3: Set resolver record for a registered name +[[spam]] +[spam.tx] +kind = "set_record" +to = "{SimpleNameRegistry}" +from_pool = "admin" +signature = "function setRecord(bytes32 name, address addr)" +args = ["{name_bob}", "0x0000000000000000000000000000000000000001"] +gas_limit = 100000 diff --git a/scenarios/orderBook.toml b/scenarios/orderBook.toml new file mode 100644 index 00000000..2d152f9f --- /dev/null +++ b/scenarios/orderBook.toml @@ -0,0 +1,123 @@ +# Simple On-Chain Order Book +# +# Deploys two ERC20 tokens (BaseToken, QuoteToken) and a SimpleOrderBook contract. +# Spammers place buy/sell orders and attempt cancellations to exercise array storage +# operations, token transfers, and matching logic with multiple storage reads/writes. +# +# source: /tmp/orderbook.sol +# compiled with: solc --bin --optimize --optimize-runs 200 + +### template variables +[env] +initialSupply = "1000000000000000000000000000" + +### deploy BaseToken (OrderBookToken) with initialSupply +[[create]] +name = "BaseToken" +signature = "(uint256 initialSupply)" +args = ["{initialSupply}"] +bytecode = "0x60c0604052600e60809081526d27b93232b92137b7b5aa37b5b2b760911b60a0525f9061002c9082610172565b5060408051808201909152600381526213d09560ea1b60208201526001906100549082610172565b506002805460ff1916601217905534801561006d575f80fd5b506040516109be3803806109be83398101604081905261008c9161022c565b6003819055335f818152600460209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350610243565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061010257607f821691505b60208210810361012057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561016d57805f5260205f20601f840160051c8101602085101561014b5750805b601f840160051c820191505b8181101561016a575f8155600101610157565b50505b505050565b81516001600160401b0381111561018b5761018b6100da565b61019f8161019984546100ee565b84610126565b6020601f8211600181146101d1575f83156101ba5750848201515b5f19600385901b1c1916600184901b17845561016a565b5f84815260208120601f198516915b8281101561020057878501518255602094850194600190920191016101e0565b508482101561021d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f6020828403121561023c575f80fd5b5051919050565b61076e806102505f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610613565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d061010536600461063b565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610613565b61044f565b005b6100e961014c366004610675565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610613565b6104e2565b6100e9610186366004610695565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106c6565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b8152602060048201526016602482015275696e73756666696369656e7420616c6c6f77616e636560501b60448201526064016102f3565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610399908490610712565b90915550506001600160a01b0384165f90815260046020526040812080548492906103c5908490610712565b90915550506001600160a01b0383165f90815260046020526040812080548492906103f1908490610725565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f8282546104609190610725565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c908490610725565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106c6565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610712565b90915550506001600160a01b0383165f9081526004602052604081208054849290610581908490610725565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461060e575f80fd5b919050565b5f8060408385031215610624575f80fd5b61062d836105f8565b946020939093013593505050565b5f805f6060848603121561064d575f80fd5b610656846105f8565b9250610664602085016105f8565b929592945050506040919091013590565b5f60208284031215610685575f80fd5b61068e826105f8565b9392505050565b5f80604083850312156106a6575f80fd5b6106af836105f8565b91506106bd602084016105f8565b90509250929050565b600181811c908216806106da57607f821691505b6020821081036106f857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610293576102936106fe565b80820180821115610293576102936106fe56fea26469706673582212201f74df9af3cc29ac7b3debc54a3636d985f78b10ea49a162055f2e18f2d3c4ee64736f6c634300081a0033" + +### deploy QuoteToken (OrderBookToken) with initialSupply +[[create]] +name = "QuoteToken" +signature = "(uint256 initialSupply)" +args = ["{initialSupply}"] +bytecode = "0x60c0604052600e60809081526d27b93232b92137b7b5aa37b5b2b760911b60a0525f9061002c9082610172565b5060408051808201909152600381526213d09560ea1b60208201526001906100549082610172565b506002805460ff1916601217905534801561006d575f80fd5b506040516109be3803806109be83398101604081905261008c9161022c565b6003819055335f818152600460209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350610243565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061010257607f821691505b60208210810361012057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561016d57805f5260205f20601f840160051c8101602085101561014b5750805b601f840160051c820191505b8181101561016a575f8155600101610157565b50505b505050565b81516001600160401b0381111561018b5761018b6100da565b61019f8161019984546100ee565b84610126565b6020601f8211600181146101d1575f83156101ba5750848201515b5f19600385901b1c1916600184901b17845561016a565b5f84815260208120601f198516915b8281101561020057878501518255602094850194600190920191016101e0565b508482101561021d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f6020828403121561023c575f80fd5b5051919050565b61076e806102505f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610613565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d061010536600461063b565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610613565b61044f565b005b6100e961014c366004610675565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610613565b6104e2565b6100e9610186366004610695565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106c6565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b8152602060048201526016602482015275696e73756666696369656e7420616c6c6f77616e636560501b60448201526064016102f3565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610399908490610712565b90915550506001600160a01b0384165f90815260046020526040812080548492906103c5908490610712565b90915550506001600160a01b0383165f90815260046020526040812080548492906103f1908490610725565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f8282546104609190610725565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c908490610725565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106c6565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610712565b90915550506001600160a01b0383165f9081526004602052604081208054849290610581908490610725565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461060e575f80fd5b919050565b5f8060408385031215610624575f80fd5b61062d836105f8565b946020939093013593505050565b5f805f6060848603121561064d575f80fd5b610656846105f8565b9250610664602085016105f8565b929592945050506040919091013590565b5f60208284031215610685575f80fd5b61068e826105f8565b9392505050565b5f80604083850312156106a6575f80fd5b6106af836105f8565b91506106bd602084016105f8565b90509250929050565b600181811c908216806106da57607f821691505b6020821081036106f857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610293576102936106fe565b80820180821115610293576102936106fe56fea26469706673582212201f74df9af3cc29ac7b3debc54a3636d985f78b10ea49a162055f2e18f2d3c4ee64736f6c634300081a0033" + +### deploy SimpleOrderBook with both token addresses +[[create]] +name = "OrderBook" +signature = "(address baseToken_, address quoteToken_)" +args = ["{BaseToken}", "{QuoteToken}"] +bytecode = "0x6080604052348015600e575f80fd5b50604051610e12380380610e12833981016040819052602b916074565b5f80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905560a0565b80516001600160a01b0381168114606f575f80fd5b919050565b5f80604083850312156084575f80fd5b608b83605a565b9150609760208401605a565b90509250929050565b610d65806100ad5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c80638d0a5fbb116100635780638d0a5fbb14610140578063a4406bcd14610148578063a85c38ef1461015b578063c55dae63146101a4578063ee36d4ab146101b6575f80fd5b80631756353d1461009f578063217a4b70146100b45780632cc75967146100e4578063514fcac71461011a578063856652e91461012d575b5f80fd5b6100b26100ad366004610c08565b6101c9565b005b6001546100c7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61010c6100f2366004610c43565b6001600160a01b03165f9081526003602052604090205490565b6040519081526020016100db565b6100b2610128366004610c63565b610497565b61010c61013b366004610c7a565b610635565b60025461010c565b61010c610156366004610c08565b610660565b61016e610169366004610c63565b6107f8565b604080516001600160a01b039096168652602086019490945292840191909152151560608301521515608082015260a0016100db565b5f546100c7906001600160a01b031681565b61010c6101c4366004610c08565b610846565b600254821080156101db575060025481105b61021c5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037b93232b960991b60448201526064015b60405180910390fd5b5f6002838154811061023057610230610ca2565b905f5260205f20906004020190505f6002838154811061025257610252610ca2565b905f5260205f20906004020190508160030160019054906101000a900460ff16801561028757506003810154610100900460ff165b6102c05760405162461bcd60e51b815260206004820152600a6024820152696e6f742061637469766560b01b6044820152606401610213565b600382015460ff1680156102d95750600381015460ff16155b61031b5760405162461bcd60e51b81526020600482015260136024820152720dee4c8cae440e8f2e0ca40dad2e6dac2e8c6d606b1b6044820152606401610213565b8060010154826001015410156103645760405162461bcd60e51b815260206004820152600e60248201526d0e0e4d2c6ca40dad2e6dac2e8c6d60931b6044820152606401610213565b5f816002015483600201541061037e578160020154610384565b82600201545b90505f670de0b6b3a76400008285600101546103a09190610cca565b6103aa9190610ce7565b905081846002015f8282546103bf9190610d06565b9250508190555081836002015f8282546103d99190610d06565b909155505060028401545f036103f75760038401805461ff00191690555b82600201545f036104105760038301805461ff00191690555b5f54845461042b916001600160a01b03908116911684610a3d565b6001548354610447916001600160a01b03908116911683610a3d565b84867f82877c5945532f956e6718f78f5606b7b5d8efef5e22121a3d9bf4e708873edd866001015485604051610487929190918252602082015260400190565b60405180910390a3505050505050565b60025481106104d85760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037b93232b960991b6044820152606401610213565b5f600282815481106104ec576104ec610ca2565b905f5260205f20906004020190508060030160019054906101000a900460ff166105455760405162461bcd60e51b815260206004820152600a6024820152696e6f742061637469766560b01b6044820152606401610213565b80546001600160a01b0316331461058a5760405162461bcd60e51b81526020600482015260096024820152683737ba1036b0b5b2b960b91b6044820152606401610213565b60038101805461ff0019811690915560ff16156105e9575f670de0b6b3a7640000826002015483600101546105bf9190610cca565b6105c99190610ce7565b6001549091506105e3906001600160a01b03163383610a3d565b50610605565b5f546002820154610605916001600160a01b0316903390610a3d565b604051339083907fc0362da6f2ff36b382b34aec0814f6b3cdf89f5ef282a1d1f114d0c0b036d596905f90a35050565b6003602052815f5260405f20818154811061064e575f80fd5b905f5260205f20015f91509150505481565b5f80546106789061067e906001600160a01b0316333085610b1c565b50600280546040805160a0810182523380825260208083018881528385018881525f6060808701828152600160808901818152818c018d559b8452975160048b027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b039093166001600160a01b03199093169290921790915594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf86015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad085015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad19093018054995115156101000261ff00199415159490941661ffff19909a16999099179290921790975582815260038252848120805494850181558152818120909301859055835188815290810187905292830191909152919283917f1ad1a5ae4ffda7ac4728a3f999d312ee8c3bf93f8f9bec6ea55609ec2980c0d7910160405180910390a392915050565b60028181548110610807575f80fd5b5f91825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919060ff8082169161010090041685565b5f80670de0b6b3a764000061085b8486610cca565b6108659190610ce7565b90505f81116108a25760405162461bcd60e51b81526020600482015260096024820152681e995c9bc818dbdcdd60ba1b6044820152606401610213565b6001546108ba906001600160a01b0316333084610b1c565b600280546040805160a0810182523380825260208083018a81528385018a81526001606080870182815260808801838152838b018c555f9b8c52975160048b027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b039093166001600160a01b03199093169290921790915594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf86015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad085015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad19093018054965115156101000261ff00199415159490941661ffff19909716969096179290921790945582875260038252848720805480830182559088529682902090960185905583518a81529081018990529283019490945291945084917f1ad1a5ae4ffda7ac4728a3f999d312ee8c3bf93f8f9bec6ea55609ec2980c0d7910160405180910390a35092915050565b6040516001600160a01b038381166024830152604482018390525f919085169060640160408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b17905251610a959190610d19565b5f604051808303815f865af19150503d805f8114610ace576040519150601f19603f3d011682016040523d82523d5f602084013e610ad3565b606091505b5050905080610b165760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610213565b50505050565b6040516001600160a01b0384811660248301528381166044830152606482018390525f919086169060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251610b7c9190610d19565b5f604051808303815f865af19150503d805f8114610bb5576040519150601f19603f3d011682016040523d82523d5f602084013e610bba565b606091505b5050905080610c015760405162461bcd60e51b81526020600482015260136024820152721d1c985b9cd9995c919c9bdb4819985a5b1959606a1b6044820152606401610213565b5050505050565b5f8060408385031215610c19575f80fd5b50508035926020909101359150565b80356001600160a01b0381168114610c3e575f80fd5b919050565b5f60208284031215610c53575f80fd5b610c5c82610c28565b9392505050565b5f60208284031215610c73575f80fd5b5035919050565b5f8060408385031215610c8b575f80fd5b610c9483610c28565b946020939093013593505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610ce157610ce1610cb6565b92915050565b5f82610d0157634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610ce157610ce1610cb6565b5f82518060208501845e5f92019182525091905056fea2646970667358221220a634b8b68f363ef67e6bcaa164b9c106c2574a04d912695c7890cd3c1501b01a64736f6c634300081a0033" + +## setup: mint BaseToken to all spammer accounts ################################## + +[[setup]] +kind = "spammer_mint_base" +to = "{BaseToken}" +from_pool = "spammers" +for_all_accounts = true +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "100000000000000000000000"] + +## setup: mint QuoteToken to all spammer accounts ################################# + +[[setup]] +kind = "spammer_mint_quote" +to = "{QuoteToken}" +from_pool = "spammers" +for_all_accounts = true +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "100000000000000000000000"] + +## setup: all spammer accounts approve OrderBook for BaseToken #################### + +[[setup]] +kind = "spammer_approve_base" +to = "{BaseToken}" +from_pool = "spammers" +for_all_accounts = true +signature = "approve(address spender, uint256 amount) returns (bool)" +args = [ + "{OrderBook}", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", +] + +## setup: all spammer accounts approve OrderBook for QuoteToken ################### + +[[setup]] +kind = "spammer_approve_quote" +to = "{QuoteToken}" +from_pool = "spammers" +for_all_accounts = true +signature = "approve(address spender, uint256 amount) returns (bool)" +args = [ + "{OrderBook}", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", +] + +### SPAM + +## spam: place buy orders (fuzz price and amount) ################################# + +[[spam]] +[spam.tx] +kind = "place_buy_order" +to = "{OrderBook}" +from_pool = "spammers" +signature = "placeBuyOrder(uint256 price, uint256 amount) returns (uint256 orderId)" +args = ["1000000000000000000", "1000000000000000"] +gas_limit = 300000 +fuzz = [ + { param = "price", min = "1000000000000000", max = "1000000000000000000" }, + { param = "amount", min = "1000000000000000", max = "100000000000000000" }, +] + +## spam: place sell orders (fuzz price and amount) ################################ + +[[spam]] +[spam.tx] +kind = "place_sell_order" +to = "{OrderBook}" +from_pool = "spammers" +signature = "placeSellOrder(uint256 price, uint256 amount) returns (uint256 orderId)" +args = ["1000000000000000000", "1000000000000000"] +gas_limit = 300000 +fuzz = [ + { param = "price", min = "1000000000000000", max = "1000000000000000000" }, + { param = "amount", min = "1000000000000000", max = "100000000000000000" }, +] + +## spam: cancel orders (fuzz orderId, may revert for invalid/already-cancelled) ### + +[[spam]] +[spam.tx] +kind = "cancel_order" +to = "{OrderBook}" +from_pool = "spammers" +signature = "cancelOrder(uint256 orderId)" +args = ["0"] +gas_limit = 200000 +fuzz = [{ param = "orderId", min = "0", max = "1000" }] diff --git a/scenarios/precompiles/hashPrecompiles.toml b/scenarios/precompiles/hashPrecompiles.toml new file mode 100644 index 00000000..e2f11320 --- /dev/null +++ b/scenarios/precompiles/hashPrecompiles.toml @@ -0,0 +1,50 @@ +# Focused precompile stress test: SHA256, RIPEMD160, identity, and batch calls. +# Contract: PrecompileHammer (Solidity 0.8.26, optimized) + +[[create]] +name = "PrecompileHammer" +bytecode = "0x6080604052348015600e575f80fd5b5061027f8061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80635a4b5af11461004e5780638ec9117714610063578063a58a5f7f14610076578063c074b16614610089575b5f80fd5b61006161005c36600461018c565b61009c565b005b61006161007136600461018c565b6100cb565b61006161008436600461018c565b6100f5565b61006161009736600461018c565b61011f565b60045f5b838110156100c55782515f8160208601855afa806100bc575f80fd5b506001016100a0565b50505050565b60025f5b838110156100c55760205f845160208601855afa806100ec575f80fd5b506001016100cf565b60035f5b838110156100c55760205f845160208601855afa80610116575f80fd5b506001016100f9565b5f5b828110156101735781516020830160205f838360025afa80610141575f80fd5b60205f848460035afa905080610155575f80fd5b825f848460045afa905080610168575f80fd5b505050600101610121565b505050565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561019d575f80fd5b82359150602083013567ffffffffffffffff8111156101ba575f80fd5b8301601f810185136101ca575f80fd5b803567ffffffffffffffff8111156101e4576101e4610178565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561021357610213610178565b60405281815282820160200187101561022a575f80fd5b816020840160208301375f60208383010152809350505050925092905056fea26469706673582212209e3c9c53805c700a69bd48aac177fa8f0cd631f448c2aec5ce07bdd5c24b1b0664736f6c634300081a0033" + +# SHA256 precompile (0x02) stress +[[spam]] +from_pool = "sha256_pool" +[spam.tx] +to = "{PrecompileHammer}" +signature = "hashSHA256(uint256 iterations, bytes memory data)" +args = ["200", "0xdeadbeef"] +fuzz = [ + { param = "iterations", min = "100", max = "500" }, +] + +# RIPEMD160 precompile (0x03) stress +[[spam]] +from_pool = "ripemd160_pool" +[spam.tx] +to = "{PrecompileHammer}" +signature = "hashRIPEMD160(uint256 iterations2, bytes memory data2)" +args = ["200", "0xdeadbeef"] +fuzz = [ + { param = "iterations2", min = "100", max = "500" }, +] + +# Identity precompile (0x04) stress — cheaper per call, so higher iteration range +[[spam]] +from_pool = "identity_pool" +[spam.tx] +to = "{PrecompileHammer}" +signature = "callIdentity(uint256 iterations3, bytes memory data3)" +args = ["1000", "0xdeadbeef"] +fuzz = [ + { param = "iterations3", min = "500", max = "2000" }, +] + +# Batch all three precompiles per iteration +[[spam]] +from_pool = "batch_pool" +[spam.tx] +to = "{PrecompileHammer}" +signature = "batchPrecompiles(uint256 iterations4, bytes memory data4)" +args = ["100", "0xdeadbeef"] +fuzz = [ + { param = "iterations4", min = "50", max = "200" }, +] diff --git a/scenarios/simpleAMM.toml b/scenarios/simpleAMM.toml new file mode 100644 index 00000000..1486ad2f --- /dev/null +++ b/scenarios/simpleAMM.toml @@ -0,0 +1,134 @@ +# Simple AMM (Constant Product Market Maker) scenario +# +# Deploys a simplified Uniswap V2-style AMM with two ERC20 tokens. +# Tests the classic AMM gas pattern: reserve reads, balance updates, +# fee calculations (0.3%), and the x*y=k invariant. +# +# Contracts: +# - AMMToken: Minimal ERC20 with public mint +# - SimpleAMM: Constant product AMM with addLiquidity, removeLiquidity, swapAForB, swapBForA +# - AMMHelper: Holds tokens and proxies swap/liquidity calls (so spammers don't need token balances) +# +# source: /tmp/amm.sol +# compiled with: solc --bin --optimize --optimize-runs 200 /tmp/amm.sol + +[env] +initialSupply = "1000000000000000000000000000" +liquidityAmount = "100000000000000000000000" +helperFunds = "500000000000000000000000" + + +### Deploy contracts ########################################################### + +[[create]] +name = "TokenA" +signature = "(string memory name_, uint256 initialSupply)" +args = ["TokenA", "{initialSupply}"] +# AMMToken bytecode +bytecode = "0x608060405234801561000f575f80fd5b5060405161091438038061091483398101604081905261002e916100aa565b5f61003983826101e2565b50600161004683826101e2565b506002819055335f818152600360209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505061029c565b634e487b7160e01b5f52604160045260245ffd5b5f80604083850312156100bb575f80fd5b82516001600160401b038111156100d0575f80fd5b8301601f810185136100e0575f80fd5b80516001600160401b038111156100f9576100f9610096565b604051601f8201601f19908116603f011681016001600160401b038111828210171561012757610127610096565b60405281815282820160200187101561013e575f80fd5b8160208401602083015e5f60209282018301529401519395939450505050565b600181811c9082168061017257607f821691505b60208210810361019057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101dd57805f5260205f20601f840160051c810160208510156101bb5750805b601f840160051c820191505b818110156101da575f81556001016101c7565b50505b505050565b81516001600160401b038111156101fb576101fb610096565b61020f81610209845461015e565b84610196565b6020601f821160018114610241575f831561022a5750848201515b5f19600385901b1c1916600184901b1784556101da565b5f84815260208120601f198516915b828110156102705787850151825560209485019460019092019101610250565b508482101561028d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b61066b806102a95f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012457806370a082311461013957806395d89b4114610158578063a9059cbb14610160578063dd62ed3e14610173575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a761019d565b6040516100b491906104c0565b60405180910390f35b6100d06100cb366004610510565b610228565b60405190151581526020016100b4565b6100e960025481565b6040519081526020016100b4565b6100d0610105366004610538565b610294565b610112601281565b60405160ff90911681526020016100b4565b610137610132366004610510565b61039f565b005b6100e9610147366004610572565b60036020525f908152604090205481565b6100a7610425565b6100d061016e366004610510565b610432565b6100e9610181366004610592565b600460209081525f928352604080842090915290825290205481565b5f80546101a9906105c3565b80601f01602080910402602001604051908101604052809291908181526020018280546101d5906105c3565b80156102205780601f106101f757610100808354040283529160200191610220565b820191905f5260205f20905b81548152906001019060200180831161020357829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102829086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146102ed576102c9838261060f565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f908152600360205260408120805485929061031490849061060f565b90915550506001600160a01b0384165f9081526003602052604081208054859290610340908490610622565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161038c91815260200190565b60405180910390a3506001949350505050565b8060025f8282546103b09190610622565b90915550506001600160a01b0382165f90815260036020526040812080548392906103dc908490610622565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101a9906105c3565b335f9081526003602052604081208054839190839061045290849061060f565b90915550506001600160a01b0383165f908152600360205260408120805484929061047e908490610622565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610282565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461050b575f80fd5b919050565b5f8060408385031215610521575f80fd5b61052a836104f5565b946020939093013593505050565b5f805f6060848603121561054a575f80fd5b610553846104f5565b9250610561602085016104f5565b929592945050506040919091013590565b5f60208284031215610582575f80fd5b61058b826104f5565b9392505050565b5f80604083850312156105a3575f80fd5b6105ac836104f5565b91506105ba602084016104f5565b90509250929050565b600181811c908216806105d757607f821691505b6020821081036105f557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561028e5761028e6105fb565b8082018082111561028e5761028e6105fb56fea2646970667358221220a8d5495695df06a2a563b3bc279a5798a51e98b9a8544c4d41f799388eba790764736f6c634300081a0033" + +[[create]] +name = "TokenB" +signature = "(string memory name_, uint256 initialSupply)" +args = ["TokenB", "{initialSupply}"] +# AMMToken bytecode (same contract, different constructor args) +bytecode = "0x608060405234801561000f575f80fd5b5060405161091438038061091483398101604081905261002e916100aa565b5f61003983826101e2565b50600161004683826101e2565b506002819055335f818152600360209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505061029c565b634e487b7160e01b5f52604160045260245ffd5b5f80604083850312156100bb575f80fd5b82516001600160401b038111156100d0575f80fd5b8301601f810185136100e0575f80fd5b80516001600160401b038111156100f9576100f9610096565b604051601f8201601f19908116603f011681016001600160401b038111828210171561012757610127610096565b60405281815282820160200187101561013e575f80fd5b8160208401602083015e5f60209282018301529401519395939450505050565b600181811c9082168061017257607f821691505b60208210810361019057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101dd57805f5260205f20601f840160051c810160208510156101bb5750805b601f840160051c820191505b818110156101da575f81556001016101c7565b50505b505050565b81516001600160401b038111156101fb576101fb610096565b61020f81610209845461015e565b84610196565b6020601f821160018114610241575f831561022a5750848201515b5f19600385901b1c1916600184901b1784556101da565b5f84815260208120601f198516915b828110156102705787850151825560209485019460019092019101610250565b508482101561028d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b61066b806102a95f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012457806370a082311461013957806395d89b4114610158578063a9059cbb14610160578063dd62ed3e14610173575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a761019d565b6040516100b491906104c0565b60405180910390f35b6100d06100cb366004610510565b610228565b60405190151581526020016100b4565b6100e960025481565b6040519081526020016100b4565b6100d0610105366004610538565b610294565b610112601281565b60405160ff90911681526020016100b4565b610137610132366004610510565b61039f565b005b6100e9610147366004610572565b60036020525f908152604090205481565b6100a7610425565b6100d061016e366004610510565b610432565b6100e9610181366004610592565b600460209081525f928352604080842090915290825290205481565b5f80546101a9906105c3565b80601f01602080910402602001604051908101604052809291908181526020018280546101d5906105c3565b80156102205780601f106101f757610100808354040283529160200191610220565b820191905f5260205f20905b81548152906001019060200180831161020357829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102829086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146102ed576102c9838261060f565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f908152600360205260408120805485929061031490849061060f565b90915550506001600160a01b0384165f9081526003602052604081208054859290610340908490610622565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161038c91815260200190565b60405180910390a3506001949350505050565b8060025f8282546103b09190610622565b90915550506001600160a01b0382165f90815260036020526040812080548392906103dc908490610622565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101a9906105c3565b335f9081526003602052604081208054839190839061045290849061060f565b90915550506001600160a01b0383165f908152600360205260408120805484929061047e908490610622565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610282565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461050b575f80fd5b919050565b5f8060408385031215610521575f80fd5b61052a836104f5565b946020939093013593505050565b5f805f6060848603121561054a575f80fd5b610553846104f5565b9250610561602085016104f5565b929592945050506040919091013590565b5f60208284031215610582575f80fd5b61058b826104f5565b9392505050565b5f80604083850312156105a3575f80fd5b6105ac836104f5565b91506105ba602084016104f5565b90509250929050565b600181811c908216806105d757607f821691505b6020821081036105f557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561028e5761028e6105fb565b8082018082111561028e5761028e6105fb56fea2646970667358221220a8d5495695df06a2a563b3bc279a5798a51e98b9a8544c4d41f799388eba790764736f6c634300081a0033" + +[[create]] +name = "SimpleAMM" +signature = "(address tokenA_, address tokenB_)" +args = ["{TokenA}", "{TokenB}"] +# SimpleAMM bytecode +bytecode = "0x6080604052348015600e575f80fd5b50604051610ca3380380610ca3833981016040819052602b916074565b5f80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905560a0565b80516001600160a01b0381168114606f575f80fd5b919050565b5f80604083850312156084575f80fd5b608b83605a565b9150609760208401605a565b90509250929050565b610bf6806100ad5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806370a082311161006357806370a08231146101145780639c8f9f23146101335780639cd441da1461015b578063dc5fa6c51461016e578063e619a49814610177575f80fd5b8063031020911461009f5780630fc63d10146100c557806318160ddd146100ef57806319e36f3b146100f85780635f64b55b14610101575b5f80fd5b6100b26100ad366004610aa3565b61018a565b6040519081526020015b60405180910390f35b5f546100d7906001600160a01b031681565b6040516001600160a01b0390911681526020016100bc565b6100b260045481565b6100b260035481565b6001546100d7906001600160a01b031681565b6100b2610122366004610aba565b60056020525f908152604090205481565b610146610141366004610aa3565b6103ac565b604080519283526020830191909152016100bc565b6100b2610169366004610ae7565b6105d8565b6100b260025481565b6100b2610185366004610aa3565b610823565b5f8082116101cc5760405162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b60448201526064015b60405180910390fd5b5f546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906101ff90339030908790600401610b07565b6020604051808303815f875af115801561021b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061023f9190610b2b565b505f61024d836103e5610b5e565b9050806002546103e86102609190610b5e565b61026a9190610b7b565b6003546102779083610b5e565b6102819190610b8e565b91505f82116102c05760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc81bdd5d1c1d5d60aa1b60448201526064016101c3565b8260025f8282546102d19190610b7b565b925050819055508160035f8282546102e99190610bad565b909155505060015460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303815f875af115801561033c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103609190610b2b565b5060408051600181526020810185905290810183905233907fbfd50a04f1e6e4aee344f5d0e7f15d74d0dbb58cd1f711daa6463094ca9508cd906060015b60405180910390a250919050565b5f805f831180156103cb5750335f908152600560205260409020548311155b6104045760405162461bcd60e51b815260206004820152600a6024820152696261642073686172657360b01b60448201526064016101c3565b6004546002546104149085610b5e565b61041e9190610b8e565b9150600454600354846104319190610b5e565b61043b9190610b8e565b335f9081526005602052604081208054929350859290919061045e908490610bad565b925050819055508260045f8282546104769190610bad565b925050819055508160025f82825461048e9190610bad565b925050819055508060035f8282546104a69190610bad565b90915550505f5460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303815f875af11580156104f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051c9190610b2b565b5060015460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303815f875af115801561056b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058f9190610b2b565b50604080518381526020810183905290810184905233907f59c3a0b60c6ab7deb62e1440c9e72441db6db7dfe514dba8cb18e60c0d896efa9060600160405180910390a2915091565b5f80546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061060c90339030908890600401610b07565b6020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064c9190610b2b565b506001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061068190339030908790600401610b07565b6020604051808303815f875af115801561069d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c19190610b2b565b506004545f036106e4576106dd6106d88385610b5e565b610a35565b9050610734565b5f600254600454856106f69190610b5e565b6107009190610b8e565b90505f600354600454856107149190610b5e565b61071e9190610b8e565b905080821061072d578061072f565b815b925050505b5f81116107715760405162461bcd60e51b815260206004820152600b60248201526a7a65726f2073686172657360a81b60448201526064016101c3565b8060045f8282546107829190610b7b565b9091555050335f90815260056020526040812080548392906107a5908490610b7b565b925050819055508260025f8282546107bd9190610b7b565b925050819055508160035f8282546107d59190610b7b565b9091555050604080518481526020810184905290810182905233907fbeb3885786d637a474cbc287c0a44587231633a077f0bd30354d5a4b18996fce9060600160405180910390a292915050565b5f8082116108605760405162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b60448201526064016101c3565b6001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061089490339030908790600401610b07565b6020604051808303815f875af11580156108b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d49190610b2b565b505f6108e2836103e5610b5e565b9050806003546103e86108f59190610b5e565b6108ff9190610b7b565b60025461090c9083610b5e565b6109169190610b8e565b91505f82116109555760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc81bdd5d1c1d5d60aa1b60448201526064016101c3565b8260035f8282546109669190610b7b565b925050819055508160025f82825461097e9190610bad565b90915550505f5460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303815f875af11580156109d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f49190610b2b565b50604080515f81526020810185905290810183905233907fbfd50a04f1e6e4aee344f5d0e7f15d74d0dbb58cd1f711daa6463094ca9508cd9060600161039e565b5f6003821115610a945750805f610a4d600283610b8e565b610a58906001610b7b565b90505b81811015610a8e57905080600281610a738186610b8e565b610a7d9190610b7b565b610a879190610b8e565b9050610a5b565b50919050565b8115610a9e575060015b919050565b5f60208284031215610ab3575f80fd5b5035919050565b5f60208284031215610aca575f80fd5b81356001600160a01b0381168114610ae0575f80fd5b9392505050565b5f8060408385031215610af8575f80fd5b50508035926020909101359150565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215610b3b575f80fd5b81518015158114610ae0575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610b7557610b75610b4a565b92915050565b80820180821115610b7557610b75610b4a565b5f82610ba857634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610b7557610b75610b4a56fea2646970667358221220858eea2e622314367c3acccbe6b546097815224fd777af4fca336bf48dd6152664736f6c634300081a0033" + +[[create]] +name = "AMMHelper" +signature = "(address amm_, address tokenA_, address tokenB_)" +args = ["{SimpleAMM}", "{TokenA}", "{TokenB}"] +# AMMHelper bytecode - holds tokens, proxies swaps so spammers don't need token balances +bytecode = "0x608060405234801561000f575f80fd5b5060405161047d38038061047d83398101604081905261002e91610168565b5f80546001600160a01b03199081166001600160a01b03868116918217909355600180548316868516908117909155600280549093169385169390931790915560405163095ea7b360e01b815260048101919091525f19602482015263095ea7b3906044016020604051808303815f875af11580156100af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d391906101a8565b5060405163095ea7b360e01b81526001600160a01b0384811660048301525f19602483015282169063095ea7b3906044016020604051808303815f875af1158015610120573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014491906101a8565b505050506101ce565b80516001600160a01b0381168114610163575f80fd5b919050565b5f805f6060848603121561017a575f80fd5b6101838461014d565b92506101916020850161014d565b915061019f6040850161014d565b90509250925092565b5f602082840312156101b8575f80fd5b815180151581146101c7575f80fd5b9392505050565b6102a2806101db5f395ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c806303102091146100645780630fc63d101461008a5780632a943945146100b55780635f64b55b146100c75780639cd441da146100da578063e619a498146100ed575b5f80fd5b61007761007236600461021e565b610100565b6040519081526020015b60405180910390f35b60015461009d906001600160a01b031681565b6040516001600160a01b039091168152602001610081565b5f5461009d906001600160a01b031681565b60025461009d906001600160a01b031681565b6100776100e8366004610235565b610173565b6100776100fb36600461021e565b6101ed565b5f8054604051630310209160e01b8152600481018490526001600160a01b03909116906303102091906024015b6020604051808303815f875af1158015610149573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061016d9190610255565b92915050565b5f8054604051634e6a20ed60e11b815260048101859052602481018490526001600160a01b0390911690639cd441da906044016020604051808303815f875af11580156101c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e69190610255565b9392505050565b5f8054604051631cc3349360e31b8152600481018490526001600160a01b039091169063e619a4989060240161012d565b5f6020828403121561022e575f80fd5b5035919050565b5f8060408385031215610246575f80fd5b50508035926020909101359150565b5f60208284031215610265575f80fd5b505191905056fea264697066735822122076cfb1aa07cb66669e43005b5f038e2061e4c97003cb560568e8312e7317bf6e64736f6c634300081a0033" + + +### Setup contracts ############################################################# + +## Approve AMM to spend admin's tokens (for initial liquidity) + +[[setup]] +kind = "admin_approve_amm_tokenA" +to = "{TokenA}" +signature = "approve(address spender, uint256 amount) returns (bool)" +args = [ + "{SimpleAMM}", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", +] + +[[setup]] +kind = "admin_approve_amm_tokenB" +to = "{TokenB}" +signature = "approve(address spender, uint256 amount) returns (bool)" +args = [ + "{SimpleAMM}", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", +] + +## Add initial liquidity (large amounts for deep pool) + +[[setup]] +kind = "admin_add_initial_liquidity" +to = "{SimpleAMM}" +signature = "addLiquidity(uint256 amountA, uint256 amountB) returns (uint256 shares)" +args = ["{liquidityAmount}", "{liquidityAmount}"] +gas_limit = 300000 + +## Fund the AMMHelper contract with tokens for spammer swaps + +[[setup]] +kind = "fund_helper_tokenA" +to = "{TokenA}" +signature = "function transfer(address to, uint256 amount) external returns (bool)" +args = ["{AMMHelper}", "{helperFunds}"] + +[[setup]] +kind = "fund_helper_tokenB" +to = "{TokenB}" +signature = "function transfer(address to, uint256 amount) external returns (bool)" +args = ["{AMMHelper}", "{helperFunds}"] + + +### Spam patterns ############################################################## + +# Swap TokenA for TokenB via helper (spammers don't need token balances) +# Fuzz amountIn from 0.001 to 1 token (1e15 to 1e18 wei) +[[spam]] +[spam.tx] +kind = "simple_amm_swap_a_for_b" +to = "{AMMHelper}" +from_pool = "spammer" +signature = "function swapAForB(uint256 amountIn) external returns (uint256)" +args = ["1000000000000000"] +fuzz = [{ param = "amountIn", min = "1000000000000000", max = "1000000000000000000" }] + +# Swap TokenB for TokenA via helper +# Fuzz amountIn from 0.001 to 1 token (1e15 to 1e18 wei) +[[spam]] +[spam.tx] +kind = "simple_amm_swap_b_for_a" +to = "{AMMHelper}" +from_pool = "spammer" +signature = "function swapBForA(uint256 amountIn) external returns (uint256)" +args = ["1000000000000000"] +fuzz = [{ param = "amountIn", min = "1000000000000000", max = "1000000000000000000" }] + +# Add liquidity via helper (smaller amounts to avoid draining helper funds) +# Fuzz both amounts from 0.001 to 0.01 tokens +[[spam]] +[spam.tx] +kind = "simple_amm_add_liquidity" +to = "{AMMHelper}" +from_pool = "spammer" +signature = "function addLiquidity(uint256 amountA, uint256 amountB) external returns (uint256)" +args = ["1000000000000000", "1000000000000000"] +fuzz = [ + { param = "amountA", min = "1000000000000000", max = "10000000000000000" }, + { param = "amountB", min = "1000000000000000", max = "10000000000000000" }, +] diff --git a/scenarios/stablecoin.toml b/scenarios/stablecoin.toml new file mode 100644 index 00000000..5fd392b3 --- /dev/null +++ b/scenarios/stablecoin.toml @@ -0,0 +1,70 @@ +# SimpleStablecoin scenario: ERC20 stablecoin with mint/burn mechanics +# Tests mint (payable), burn, transfer, and flashMintBurn patterns + +[[create]] +name = "SimpleStablecoin" +bytecode = "0x6080604052348015600e575f80fd5b50610c938061001c5f395ff3fe6080604052600436106100bf575f3560e01c806342966c681161007c57806395d89b411161005757806395d89b4114610213578063a9059cbb14610242578063dd62ed3e14610261578063f2f4567614610297575f80fd5b806342966c68146101b4578063664e9704146101d357806370a08231146101e8575f80fd5b806306fdde03146100c3578063095ea7b3146101145780631249c58b1461014357806318160ddd1461014d57806323b872dd1461016f578063313ce5671461018e575f80fd5b5f80fd5b3480156100ce575f80fd5b506100fe6040518060400160405280601081526020016f29b4b6b83632a9ba30b13632b1b7b4b760811b81525081565b60405161010b9190610a85565b60405180910390f35b34801561011f575f80fd5b5061013361012e366004610ad5565b6102b6565b604051901515815260200161010b565b61014b610322565b005b348015610158575f80fd5b506101615f5481565b60405190815260200161010b565b34801561017a575f80fd5b50610133610189366004610afd565b610415565b348015610199575f80fd5b506101a2601281565b60405160ff909116815260200161010b565b3480156101bf575f80fd5b5061014b6101ce366004610b37565b6105de565b3480156101de575f80fd5b506101616103e881565b3480156101f3575f80fd5b50610161610202366004610b4e565b60016020525f908152604090205481565b34801561021e575f80fd5b506100fe6040518060400160405280600481526020016314d554d160e21b81525081565b34801561024d575f80fd5b5061013361025c366004610ad5565b61081a565b34801561026c575f80fd5b5061016161027b366004610b6e565b600260209081525f928352604080842090915290825290205481565b3480156102a2575f80fd5b5061014b6102b1366004610b37565b610913565b335f8181526002602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103109086815260200190565b60405180910390a35060015b92915050565b5f34116103665760405162461bcd60e51b815260206004820152600d60248201526c09aeae6e840e6cadcc8408aa89609b1b60448201526064015b60405180910390fd5b5f6103736103e834610bb3565b335f90815260016020526040812080549293508392909190610396908490610bca565b92505081905550805f808282546103ad9190610bca565b909155505060405181815233905f905f80516020610c3e8339815191529060200160405180910390a3604080513481526020810183905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f91015b60405180910390a250565b5f6001600160a01b0383166104675760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220746f207a65726f206164647265737360401b604482015260640161035d565b6001600160a01b0384165f9081526001602052604090205482111561049e5760405162461bcd60e51b815260040161035d90610bdd565b6001600160a01b0384165f9081526002602090815260408083203384529091529020548211156105095760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015260640161035d565b6001600160a01b0384165f9081526002602090815260408083203384529091528120805484929061053b908490610c0b565b90915550506001600160a01b0384165f9081526001602052604081208054849290610567908490610c0b565b90915550506001600160a01b0383165f9081526001602052604081208054849290610593908490610bca565b92505081905550826001600160a01b0316846001600160a01b03165f80516020610c3e833981519152846040516105cc91815260200190565b60405180910390a35060019392505050565b5f81116106225760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161035d565b335f908152600160205260409020548111156106505760405162461bcd60e51b815260040161035d90610bdd565b5f61065d6103e883610c1e565b90505f81116106a15760405162461bcd60e51b815260206004820152601060248201526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b604482015260640161035d565b804710156106f15760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420636f6e74726163742045544800000000000000604482015260640161035d565b335f908152600160205260408120805484929061070f908490610c0b565b92505081905550815f808282546107269190610c0b565b90915550506040518281525f9033905f80516020610c3e8339815191529060200160405180910390a3604080518381526020810183905233917f49995e5dd6158cf69ad3e9777c46755a1a826a446c6416992167462dad033b2a910160405180910390a26040515f90339083908381818185875af1925050503d805f81146107c9576040519150601f19603f3d011682016040523d82523d5f602084013e6107ce565b606091505b50509050806108155760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b604482015260640161035d565b505050565b5f6001600160a01b03831661086c5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220746f207a65726f206164647265737360401b604482015260640161035d565b335f9081526001602052604090205482111561089a5760405162461bcd60e51b815260040161035d90610bdd565b335f90815260016020526040812080548492906108b8908490610c0b565b90915550506001600160a01b0383165f90815260016020526040812080548492906108e4908490610bca565b90915550506040518281526001600160a01b0384169033905f80516020610c3e83398151915290602001610310565b5f81116109575760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161035d565b335f9081526001602052604081208054839290610975908490610bca565b92505081905550805f8082825461098c9190610bca565b909155505060405181815233905f905f80516020610c3e8339815191529060200160405180910390a3604080515f81526020810183905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a2335f9081526001602052604081208054839290610a0e908490610c0b565b92505081905550805f80828254610a259190610c0b565b90915550506040518181525f9033905f80516020610c3e8339815191529060200160405180910390a3604080518281525f602082015233917f49995e5dd6158cf69ad3e9777c46755a1a826a446c6416992167462dad033b2a910161040a565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610ad0575f80fd5b919050565b5f8060408385031215610ae6575f80fd5b610aef83610aba565b946020939093013593505050565b5f805f60608486031215610b0f575f80fd5b610b1884610aba565b9250610b2660208501610aba565b929592945050506040919091013590565b5f60208284031215610b47575f80fd5b5035919050565b5f60208284031215610b5e575f80fd5b610b6782610aba565b9392505050565b5f8060408385031215610b7f575f80fd5b610b8883610aba565b9150610b9660208401610aba565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761031c5761031c610b9f565b8082018082111561031c5761031c610b9f565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b8181038181111561031c5761031c610b9f565b5f82610c3857634e487b7160e01b5f52601260045260245ffd5b50049056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cf14a6da4d4c7492f77ff9da228f381c85f6016d6985a1a619d9627a8b754bd464736f6c634300081a0033" + + +# Setup: Admin mints stablecoins by sending 10 ETH (gets 10,000 tokens) +[[setup]] +kind = "admin_mint" +to = "{SimpleStablecoin}" +signature = "mint()" +args = [] +value = "10 eth" + +# Setup: Each spammer account mints stablecoins by sending 1 ETH (gets 1,000 tokens each) +[[setup]] +kind = "spammer_mint" +to = "{SimpleStablecoin}" +from_pool = "spammer" +for_all_accounts = true +signature = "mint()" +args = [] +value = "1 eth" + + +# Spam 1: Mint stablecoins (payable) - fuzz ETH value from 0.001 to 0.01 +[[spam]] +[spam.tx] +kind = "stablecoin_mint" +to = "{SimpleStablecoin}" +from_pool = "spammer" +signature = "mint()" +args = [] +value = "0.005 eth" +fuzz = [{ param = "value", min = "1000000000000000", max = "10000000000000000" }] + +# Spam 2: Burn stablecoins - fuzz amount from 1e15 to 1e16 +# gas_limit set to handle potential reverts (insufficient balance) +[[spam]] +[spam.tx] +kind = "stablecoin_burn" +to = "{SimpleStablecoin}" +from_pool = "spammer" +signature = "function burn(uint256 amount)" +args = ["5000000000000000"] +gas_limit = 100000 +fuzz = [{ param = "amount", min = "1000000000000000", max = "10000000000000000" }] + +# Spam 3: ERC20 transfer - fuzz amount, send to self ({_sender}) +[[spam]] +[spam.tx] +kind = "stablecoin_transfer" +to = "{SimpleStablecoin}" +from_pool = "spammer" +signature = "function transfer(address to, uint256 amount) returns (bool)" +args = ["{_sender}", "500000000000000000"] +fuzz = [{ param = "amount", min = "100000000000000000", max = "1000000000000000000" }] + +# Spam 4: Flash mint+burn - heavy storage ops, no ETH needed +# Fuzz amount from 1e18 to 1e21 (two balance updates, two supply updates, 4 events) +[[spam]] +[spam.tx] +kind = "stablecoin_flash_mint_burn" +to = "{SimpleStablecoin}" +from_pool = "spammer" +signature = "function flashMintBurn(uint256 amount)" +args = ["1000000000000000000000"] +fuzz = [{ param = "amount", min = "1000000000000000000", max = "1000000000000000000000" }] diff --git a/scenarios/staking.toml b/scenarios/staking.toml new file mode 100644 index 00000000..00fe9aef --- /dev/null +++ b/scenarios/staking.toml @@ -0,0 +1,108 @@ +# ============================================================ +# Token Staking & Rewards - Stress Test +# ============================================================ +# Source: /tmp/staking.sol (StakingToken + SimpleStaking) +# Gas profile: multiple storage updates, token transfers, +# reward calculation, mint calls per tx +# ============================================================ + +[env] +initialSupply = "1000000000000000000000000000" +spammerMintAmount = "1000000000000000000000000" +spammerStakeAmount = "500000000000000000000000" +rewardPoolAmount = "100000000000000000000000000" + +### Deploy contracts + +[[create]] +name = "StakingToken" +signature = "(uint256 initialSupply)" +args = ["{initialSupply}"] +bytecode = "0x60c0604052600c60809081526b29ba30b5b4b733aa37b5b2b760a11b60a0525f9061002a9082610170565b5060408051808201909152600381526253544b60e81b60208201526001906100529082610170565b506002805460ff1916601217905534801561006b575f80fd5b506040516109bc3803806109bc83398101604081905261008a9161022a565b6003819055335f818152600460209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350610241565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061010057607f821691505b60208210810361011e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561016b57805f5260205f20601f840160051c810160208510156101495750805b601f840160051c820191505b81811015610168575f8155600101610155565b50505b505050565b81516001600160401b03811115610189576101896100d8565b61019d8161019784546100ec565b84610124565b6020601f8211600181146101cf575f83156101b85750848201515b5f19600385901b1c1916600184901b178455610168565b5f84815260208120601f198516915b828110156101fe57878501518255602094850194600190920191016101de565b508482101561021b57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f6020828403121561023a575f80fd5b5051919050565b61076e8061024e5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610613565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d061010536600461063b565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610613565b61044f565b005b6100e961014c366004610675565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610613565b6104e2565b6100e9610186366004610695565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106c6565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b8152602060048201526016602482015275696e73756666696369656e7420616c6c6f77616e636560501b60448201526064016102f3565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610399908490610712565b90915550506001600160a01b0384165f90815260046020526040812080548492906103c5908490610712565b90915550506001600160a01b0383165f90815260046020526040812080548492906103f1908490610725565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f8282546104609190610725565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c908490610725565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106c6565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610712565b90915550506001600160a01b0383165f9081526004602052604081208054849290610581908490610725565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461060e575f80fd5b919050565b5f8060408385031215610624575f80fd5b61062d836105f8565b946020939093013593505050565b5f805f6060848603121561064d575f80fd5b610656846105f8565b9250610664602085016105f8565b929592945050506040919091013590565b5f60208284031215610685575f80fd5b61068e826105f8565b9392505050565b5f80604083850312156106a6575f80fd5b6106af836105f8565b91506106bd602084016105f8565b90509250929050565b600181811c908216806106da57607f821691505b6020821081036106f857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610293576102936106fe565b80820180821115610293576102936106fe56fea264697066735822122093854287f1afdd7c0297708d0041ece6c38028f0f61f438279f24438b574318964736f6c634300081a0033" + +[[create]] +name = "SimpleStaking" +signature = "(address stakingToken_)" +args = ["{StakingToken}"] +bytecode = "0x6080604052348015600e575f80fd5b50604051610759380380610759833981016040819052602b91604e565b5f80546001600160a01b0319166001600160a01b03929092169190911790556079565b5f60208284031215605d575f80fd5b81516001600160a01b03811681146072575f80fd5b9392505050565b6106d3806100865f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806372f702f31161005857806372f702f3146100cd578063817b1cd2146100f7578063a694fc3a14610100578063f69e204614610113575f80fd5b80632e17de781461007e578063372500ab14610093578063602172671461009b575b5f80fd5b61009161008c3660046105e1565b61011b565b005b6100916102a6565b6100ba6100a93660046105f8565b60016020525f908152604090205481565b6040519081526020015b60405180910390f35b5f546100df906001600160a01b031681565b6040516001600160a01b0390911681526020016100c4565b6100ba60025481565b61009161010e3660046105e1565b61037e565b6100916104a3565b5f81116101625760405162461bcd60e51b815260206004820152601060248201526f063616e6e6f7420756e7374616b6520360841b60448201526064015b60405180910390fd5b335f908152600160205260409020548111156101c05760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610159565b335f90815260016020526040812080548392906101de908490610639565b925050819055508060025f8282546101f69190610639565b90915550505f5460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303815f875af1158015610248573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026c919061064c565b5060405181815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75906020015b60405180910390a250565b5f6102b0336105b7565b90505f81116102ee5760405162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b6044820152606401610159565b5f546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f19906044015f604051808303815f87803b158015610336575f80fd5b505af1158015610348573d5f803e3d5ffd5b50506040518381523392507f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241915060200161029b565b5f81116103be5760405162461bcd60e51b815260206004820152600e60248201526d063616e6e6f74207374616b6520360941b6044820152606401610159565b5f546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303815f875af1158015610411573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610435919061064c565b50335f908152600160205260408120805483929061045490849061066b565b925050819055508060025f82825461046c919061066b565b909155505060405181815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200161029b565b5f6104ad336105b7565b90505f81116104eb5760405162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b6044820152606401610159565b5f546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f19906044015f604051808303815f87803b158015610533575f80fd5b505af1158015610545573d5f803e3d5ffd5b5050335f908152600160205260408120805485945090925061056890849061066b565b925050819055508060025f828254610580919061066b565b909155505060405181815233907fc16de066392da7e40ceccb739c331fc48a2e76bf147449613c48023d960eec329060200161029b565b6001600160a01b0381165f908152600160205260408120546105db9060649061067e565b92915050565b5f602082840312156105f1575f80fd5b5035919050565b5f60208284031215610608575f80fd5b81356001600160a01b038116811461061e575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156105db576105db610625565b5f6020828403121561065c575f80fd5b8151801515811461061e575f80fd5b808201808211156105db576105db610625565b5f8261069857634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212205b4355347c8ba0342b6a882e0e7548a73d1d78123b70023ba2fb831802366a7e64736f6c634300081a0033" + +### Setup: fund the staking contract with reward tokens + +[[setup]] +kind = "admin_mint_rewards" +to = "{StakingToken}" +signature = "mint(address to, uint256 amount)" +args = ["{SimpleStaking}", "{rewardPoolAmount}"] + +### Setup: mint tokens to all spammer accounts + +[[setup]] +kind = "spammer_mint_tokens" +to = "{StakingToken}" +from_pool = "spammer" +for_all_accounts = true +signature = "mint(address to, uint256 amount)" +args = ["{_sender}", "{spammerMintAmount}"] + +### Setup: each spammer approves the staking contract + +[[setup]] +kind = "spammer_approve_staking" +to = "{StakingToken}" +from_pool = "spammer" +for_all_accounts = true +signature = "approve(address spender, uint256 amount) returns (bool)" +args = ["{SimpleStaking}", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"] + +### Setup: each spammer stakes an initial amount + +[[setup]] +kind = "spammer_initial_stake" +to = "{SimpleStaking}" +from_pool = "spammer" +for_all_accounts = true +signature = "stake(uint256 amount)" +args = ["{spammerStakeAmount}"] + +### Spam patterns + +# 1. Stake additional tokens (fuzz amount) +[[spam]] +[spam.tx] +kind = "stake" +to = "{SimpleStaking}" +from_pool = "spammer" +signature = "stake(uint256 amount)" +args = ["50000000000000000"] +fuzz = [{ param = "amount", min = "1000000000000000", max = "100000000000000000" }] + +# 2. Unstake tokens (fuzz amount, with gas_limit) +[[spam]] +[spam.tx] +kind = "unstake" +to = "{SimpleStaking}" +from_pool = "spammer" +signature = "unstake(uint256 amount)" +args = ["5000000000000000"] +gas_limit = 200000 +fuzz = [{ param = "amount", min = "100000000000000", max = "10000000000000000" }] + +# 3. Claim rewards (gas_limit set) +[[spam]] +[spam.tx] +kind = "claim_rewards" +to = "{SimpleStaking}" +from_pool = "spammer" +signature = "claimRewards()" +args = [] +gas_limit = 200000 + +# 4. Compound rewards (gas_limit set) +[[spam]] +[spam.tx] +kind = "compound" +to = "{SimpleStaking}" +from_pool = "spammer" +signature = "compound()" +args = [] +gas_limit = 200000