code-423n4 / 2022-01-yield-findings

1 stars 0 forks source link

Prefix (++i), rather than postfix (i++), increment/decrement operators should be used in for-loop #97

Closed code423n4 closed 2 years ago

code423n4 commented 2 years ago

Handle

IllIllI

Vulnerability details

Impact

When the value of the post-loop increment/decrement is not stored or used in any calculations, the prefix increment/decrement operators (++i/--i) cost less gas (five) PER LOOP than the postfix increment/decrement operators (i++/i--). If the account has 20 or more vaults, each subsequent call to addVault() will cost more than 100 gas. The same issue is present for removeVault() and for _getDepositedBalance() in ConvexYieldWrapper.sol, and is present in ConvexStakingWrapper.sol's addRewards(), _calCvxIntegral(), _calRewardIntegral(), _checkpoint(), _checkpointAndClaim(), and earned(), for a total of nine instances of three extra gas per loop, each. If a user has only a few vaults, but calls a few of these functions, the gas used will be more than 100.

Proof of Concept

Taking this line as an example:

for (uint256 i = 0; i < vaultsLength; i++) {

https://github.com/code-423n4/2022-01-yield/blob/e946f40239b33812e54fafc700eb2298df1a2579/contracts/ConvexYieldWrapper.sol#L63

when the line remains as is, and the contract is compiled and deployed using hardhat (with settings {"compiler": { version: "0.8.6", settings: { optimizer: { enabled: true, runs: 200000 } } } }), the contract has the following 'bad' deployed bytecode:

608060405234801561001057600080fd5b50600436106103465760003560e01c80637bbfc69e116101bd578063b95c5746116100f9578063e2aecded116100a2578063e89133b21161007c578063e89133b2146107f5578063effae35314610815578063f301af4214610828578063ffffffff146106a557600080fd5b8063e2aecded146107b9578063e529ee95146107cc578063e6d223b1146107d557600080fd5b8063cc7d510e116100d3578063cc7d510e14610740578063dd62ed3e14610760578063de02cde7146107a657600080fd5b8063b95c574614610718578063bf86d69014610720578063c00007b01461072d57600080fd5b80639a04dbc711610166578063a9059cbb11610140578063a9059cbb146106cc578063ad82110f146106df578063ae93c1b5146106f2578063b51609b41461070557600080fd5b80639a04dbc7146106725780639f454db914610692578063a4f0d7d0146106a557600080fd5b8063923c1d6111610197578063923c1d611461062f57806395d89b411461064a57806397ff6a041461065257600080fd5b80637bbfc69e146105da5780637c93fa621461061e5780638757b15b1461062757600080fd5b806344faded01161028c5780635909c12f116102355780636a4874a11161020f5780636a4874a11461056d57806370a082311461058857806375f26e63146105be57806376addb19146105d157600080fd5b80635909c12f1461034b5780635ba5e9f014610547578063687f0e4c1461055a57600080fd5b80634b0ee02a116102665780634b0ee02a146105015780634f39059c14610514578063559742d91461053457600080fd5b806344faded0146104c857806347e20183146104db5780634a7fb0bd146104ee57600080fd5b806310ab9432116102f95780631b8eabdf116102d35780631b8eabdf1461046857806323b872dd1461047b5780632cdacb501461048e578063313ce567146104a957600080fd5b806310ab94321461043b57806314d6aed01461044e57806318160ddd1461045657600080fd5b806306fdde031161032a57806306fdde03146103be578063095ea7b3146103d35780630bece79c146103f657600080fd5b801561034b5780628cc26214610389578063055ad468146103a9575b600080fd5b610353600081565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61039c6103973660046147a1565b61088b565b6040516103809190614c3d565b6103bc6103b73660046149d3565b610cdf565b005b6103c661101d565b6040516103809190614ca2565b6103e66103e1366004614855565b6110ab565b6040519015158152602001610380565b600e546104169073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610380565b6103e6610449366004614a25565b6110bf565b6103bc61111a565b6000545b604051908152602001610380565b6103bc6104763660046149ee565b611489565b6103e6610489366004614814565b611811565b61041673f403c135812408bfbe8713b5a23a04b3d48aae3181565b6005546104b69060ff1681565b60405160ff9091168152602001610380565b6103bc6104d6366004614a25565b611831565b6103bc6104e93660046147a1565b611925565b6103bc6104fc3660046147a1565b611a12565b61045a61050f3660046147a1565b611c41565b600b546104169073ffffffffffffffffffffffffffffffffffffffff1681565b6103bc610542366004614a0a565b611c52565b610353610555366004614a0a565b611d28565b6103bc610568366004614a25565b611d65565b61041673d533a949740bb3306d119cc777fa900ba034cd5281565b61045a6105963660046147a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b6103bc6105cc3660046147a1565b611dee565b61045a60075481565b6105ed6105e8366004614855565b612015565b6040517fffffffffffffffffffffffff00000000000000000000000000000000000000009091168152602001610380565b61045a60085481565b6103bc61205b565b610416734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6103c66122c8565b6013546104169073ffffffffffffffffffffffffffffffffffffffff1681565b61045a6106803660046147a1565b60096020526000908152604090205481565b6103bc6106a03660046147db565b6122d5565b6103537fffffffff0000000000000000000000000000000000000000000000000000000081565b6103e66106da366004614855565b61256b565b6103bc6106ed3660046148eb565b612578565b6103bc610700366004614a41565b612679565b6103bc610713366004614881565b61272b565b60105461045a565b6011546103e69060ff1681565b6103bc61073b3660046147a1565b6128b8565b600d546104169073ffffffffffffffffffffffffffffffffffffffff1681565b61045a61076e3660046147db565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b6103bc6107b4366004614a25565b6128eb565b6103e66107c73660046148c3565b61299d565b61045a600f5481565b61045a6107e33660046147a1565b600a6020526000908152604090205481565b600c546104169073ffffffffffffffffffffffffffffffffffffffff1681565b6103bc6108233660046148eb565b612a26565b61083b610836366004614bef565b612ae5565b6040805173ffffffffffffffffffffffffffffffffffffffff95861681529490931660208501526fffffffffffffffffffffffffffffffff91821692840192909252166060820152608001610380565b6060600061089860005490565b6010549091506108a9816001614d76565b67ffffffffffffffff8111156108c1576108c1614f5d565b60405190808252806020026020018201604052801561090657816020015b60408051808201909152600080825260208201528152602001906001900390816108df5790505b50925060005b81811015610cd75760006010828154811061092957610929614f2e565b6000918252602082206005919091020180546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935073ffffffffffffffffffffffffffffffffffffffff16919082906370a082319060240160206040518083038186803b1580156109a557600080fd5b505afa1580156109b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dd9190614c08565b6002840154909150600090610a189070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1683614e06565b60018501546040517e8cc26200000000000000000000000000000000000000000000000000000000815230600482015291925073ffffffffffffffffffffffffffffffffffffffff1690628cc2629060240160206040518083038186803b158015610a8257600080fd5b505afa158015610a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aba9190614c08565b610ac49082614d76565b60028501549091506fffffffffffffffffffffffffffffffff168715610b0f5787610af88368056bc75e2d63100000614dc9565b610b029190614d8e565b610b0c9082614d76565b90505b73ffffffffffffffffffffffffffffffffffffffff8a16600090815260038601602052604081205468056bc75e2d6310000090610b4c9084614e06565b610b558d612b5c565b610b5f9190614dc9565b610b699190614d8e565b73ffffffffffffffffffffffffffffffffffffffff8c166000908152600488016020526040902054909150610b9f908290614d76565b8a8881518110610bb157610bb1614f2e565b60200260200101516020018181525050848a8881518110610bd457610bd4614f2e565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff9182169052851673d533a949740bb3306d119cc777fa900ba034cd521415610cbe57610c1f81612eb8565b73ffffffffffffffffffffffffffffffffffffffff8c166000908152600a6020526040902054610c4f9190614d76565b8a8981518110610c6157610c61614f2e565b60200260200101516020018181525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8a8981518110610c9857610c98614f2e565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690525b5050505050508080610ccf90614e97565b91505061090c565b505050919050565b6013546040517f1e81f8290000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffff00000000000000000000000000000000000000008316600482015260009173ffffffffffffffffffffffffffffffffffffffff1690631e81f8299060240160606040518083038186803b158015610d6b57600080fd5b505afa158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da39190614b81565b51905073ffffffffffffffffffffffffffffffffffffffff8116610e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f206f776e657220666f7220746865207661756c740000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152601260205260408120805490915b81811015610f38578473ffffffffffffffffffffffffffffffffffffffff1916838281548110610e8457610e84614f2e565b9060005260206000209060029182820401919006600c029054906101000a900460a01b73ffffffffffffffffffffffffffffffffffffffff19161415610f26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5661756c7420616c7265616479206164646564000000000000000000000000006044820152606401610e1f565b80610f3081614e97565b915050610e52565b5081546001808201845560008481526020808220600285040180546bffffffffffffffffffffffff94909516600c026101000a9384021990941660a089901c939093029290921790925573ffffffffffffffffffffffffffffffffffffffff8516825260129052604090208254610fb191908490614650565b506040517fffffffffffffffffffffffff000000000000000000000000000000000000000085169073ffffffffffffffffffffffffffffffffffffffff8516907f1b19d6df4e7e52fd52ee42d63aa18f1908c4b0fbcbc1e60dcd889dae6b33027e90600090a350505050565b6003805461102a90614e49565b80601f016020809104026020016040519081016040528092919081815260200182805461105690614e49565b80156110a35780601f10611078576101008083540402835291602001916110a3565b820191906000526020600020905b81548152906001019060200180831161108657829003601f168201915b505050505081565b60006110b8338484613180565b9392505050565b7fffffffff000000000000000000000000000000000000000000000000000000008216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff166110b8565b600d5460105473ffffffffffffffffffffffffffffffffffffffff90911690806112085760108054600181810183556000929092526005027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672810180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673d533a949740bb3306d119cc777fa900ba034cd521782557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae673909201805473ffffffffffffffffffffffffffffffffffffffff8716931692909217909155906112049083614d76565b9150505b60008273ffffffffffffffffffffffffffffffffffffffff1663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112889190614c08565b90506000611297600184614e06565b9050805b82811015611482576040517f40c354460000000000000000000000000000000000000000000000000000000081526004810182905260009073ffffffffffffffffffffffffffffffffffffffff8716906340c354469060240160206040518083038186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134491906147be565b60108054600181018255600091909152604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905192935060059091027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019173ffffffffffffffffffffffffffffffffffffffff84169163f7c618c1916004808301926020929190829003018186803b1580156113e557600080fd5b505afa1580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d91906147be565b81547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9283161783556001909201805490921692169190911790558061147a81614e97565b91505061129b565b5050505050565b6013546040517f1e81f8290000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffff00000000000000000000000000000000000000008416600482015260009173ffffffffffffffffffffffffffffffffffffffff1690631e81f8299060240160606040518083038186803b15801561151557600080fd5b505afa158015611529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154d9190614b81565b51905073ffffffffffffffffffffffffffffffffffffffff8281169082161461180c5773ffffffffffffffffffffffffffffffffffffffff8216600090815260126020526040812080549091805b8281101561176c578673ffffffffffffffffffffffffffffffffffffffff19168482815481106115cd576115cd614f2e565b9060005260206000209060029182820401919006600c029054906101000a900460a01b73ffffffffffffffffffffffffffffffffffffffff1916141561175a57600061161a600185614e06565b82149050806116ad578461162f600186614e06565b8154811061163f5761163f614f2e565b9060005260206000209060029182820401919006600c029054906101000a900460a01b85838154811061167457611674614f2e565b9060005260206000209060029182820401919006600c026101000a8154816bffffffffffffffffffffffff021916908360a01c02179055505b848054806116bd576116bd614eff565b6001900381819060005260206000209060029182820401919006600c026101000a8154906bffffffffffffffffffffffff02191690559055600192508773ffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff167f9337d1acbe206cd862c6fd64eb23e7673aa11169e7bb8d35501c725e22b59e1a60405160405180910390a35061176c565b8061176481614e97565b91505061159b565b50806117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5661756c74206e6f7420666f756e6400000000000000000000000000000000006044820152606401610e1f565b73ffffffffffffffffffffffffffffffffffffffff85166000908152601260205260409020835461180791908590614650565b505050505b505050565b600061181d84836131f6565b506118298484846132f1565b949350505050565b816118b5611873827fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b7fffffffff0000000000000000000000000000000000000000000000000000000016600090815260066020908152604080832033845290915290205460ff1690565b61191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b61180c8383613421565b600080357fffffffff0000000000000000000000000000000000000000000000000000000016815260066020908152604080832033845290915290205460ff166119cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e696564000000000000000000000000000000000000006044820152606401610e1f565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080357fffffffff0000000000000000000000000000000000000000000000000000000016815260066020908152604080832033845290915290205460ff16611ab8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e696564000000000000000000000000000000000000006044820152606401610e1f565b600d546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015611b2257600080fd5b505afa158015611b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5a9190614c08565b90508015611c1257600d546040517f38d07436000000000000000000000000000000000000000000000000000000008152600481018390526001602482015273ffffffffffffffffffffffffffffffffffffffff909116906338d0743690604401600060405180830381600087803b158015611bd557600080fd5b505af1158015611be9573d6000803e3d6000fd5b5050600c54611c12925073ffffffffffffffffffffffffffffffffffffffff1690508383613521565b5050601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000611c4c82612b5c565b92915050565b80611c94611873827fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b611cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b611d24827fffffffff00000000000000000000000000000000000000000000000000000000613664565b5050565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526006602052604081206001015460e01b611c4c565b73ffffffffffffffffffffffffffffffffffffffff81163314611de4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f52656e6f756e6365206f6e6c7920666f722073656c66000000000000000000006044820152606401610e1f565b611d248282613421565b60115460ff1615611e5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f73687574646f776e0000000000000000000000000000000000000000000000006044820152606401610e1f565b3060009081526001602052604090205480611ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f207772617070656420636f6e76657820746f6b656e0000000000000000006044820152606401610e1f565b604080518082019091526000815273ffffffffffffffffffffffffffffffffffffffff83166020820152611f059061377b565b611f0f3082613885565b50600d546040517f38d07436000000000000000000000000000000000000000000000000000000008152600481018390526000602482015273ffffffffffffffffffffffffffffffffffffffff909116906338d0743690604401600060405180830381600087803b158015611f8357600080fd5b505af1158015611f97573d6000803e3d6000fd5b5050600c54611fc0925073ffffffffffffffffffffffffffffffffffffffff1690508383613521565b604080518281526000602082015273ffffffffffffffffffffffffffffffffffffffff8416917f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5910160405180910390a25050565b6012602052816000526040600020818154811061203157600080fd5b9060005260206000209060029182820401919006600c02915091509054906101000a900460a01b81565b600b546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273f403c135812408bfbe8713b5a23a04b3d48aae3160048201526000602482015273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b390604401602060405180830381600087803b1580156120e157600080fd5b505af11580156120f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211991906149b1565b50600b546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273f403c135812408bfbe8713b5a23a04b3d48aae3160048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b390604401602060405180830381600087803b1580156121bf57600080fd5b505af11580156121d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f791906149b1565b50600c54600d546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015291169063095ea7b390604401602060405180830381600087803b15801561228d57600080fd5b505af11580156122a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c591906149b1565b50565b6004805461102a90614e49565b60115460ff1615612342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f73687574646f776e0000000000000000000000000000000000000000000000006044820152606401610e1f565b600c546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156123ac57600080fd5b505afa1580156123c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e49190614c08565b905060008111612450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f20636f6e76657820746f6b656e20746f20777261700000000000000000006044820152606401610e1f565b604080518082019091526000815273ffffffffffffffffffffffffffffffffffffffff831660208201526124839061377b565b61248d8382613986565b50600d546040517fa694fc3a0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a694fc3a90602401600060405180830381600087803b1580156124fa57600080fd5b505af115801561250e573d6000803e3d6000fd5b5050604080518481526000602082015273ffffffffffffffffffffffffffffffffffffffff871693503392507fb32af138549e2a71563d1f2b1f7f0a139b3cdbc83d877d13603de1c3c5fd487a91015b60405180910390a3505050565b60006110b83384846132f1565b60005b825181101561180c576125de61187384838151811061259c5761259c614f2e565b60200260200101517fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b61266783828151811061265957612659614f2e565b602002602001015183613421565b8061267181614e97565b91505061257b565b816126bb611873827fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b61180c8383613664565b600080357fffffffff0000000000000000000000000000000000000000000000000000000016815260066020908152604080832033845290915290205460ff166127d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e696564000000000000000000000000000000000000006044820152606401610e1f565b81612838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f616d6f756e7420697320300000000000000000000000000000000000000000006044820152606401610e1f565b61285973ffffffffffffffffffffffffffffffffffffffff84168284613521565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb197f0a554c4d7840105e6ae65f0e275e9e8605a969dffa8caa7f1f118a2e1f58460405161255e91815260200190565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff82168152600060208201526122c590613a3a565b8161292d611873827fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b61180c8383613b1a565b6000612a1e6040518060400160405280846000600281106129c0576129c0614f2e565b6020020160208101906129d391906147a1565b73ffffffffffffffffffffffffffffffffffffffff168152602090810190612a0190604087019087016147a1565b73ffffffffffffffffffffffffffffffffffffffff16905261377b565b506001919050565b60005b825181101561180c57612a4a61187384838151811061259c5761259c614f2e565b612ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b612ad3838281518110612ac557612ac5614f2e565b602002602001015183613b1a565b80612add81614e97565b915050612a29565b60108181548110612af557600080fd5b600091825260209091206005909102018054600182015460029092015473ffffffffffffffffffffffffffffffffffffffff91821693509116906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041684565b600073ffffffffffffffffffffffffffffffffffffffff82161580612b9b5750600e5473ffffffffffffffffffffffffffffffffffffffff8381169116145b15612ba857506000919050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260126020908152604080832080548251818502810185019093528083529192909190830182828015612c4f57602002820191906000526020600020906000905b82829054906101000a900460a01b73ffffffffffffffffffffffffffffffffffffffff1916815260200190600c0190602082600b01049283019260010382029150808411612c045790505b5050604080518082019091526000808252602082018190529495509250612c74915050565b825160005b81811015612e7c57601354855173ffffffffffffffffffffffffffffffffffffffff808a16921690631e81f82990889085908110612cb957612cb9614f2e565b60200260200101516040518263ffffffff1660e01b8152600401612d0591907fffffffffffffffffffffffff000000000000000000000000000000000000000091909116815260200190565b60606040518083038186803b158015612d1d57600080fd5b505afa158015612d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d559190614b81565b5173ffffffffffffffffffffffffffffffffffffffff161415612e6a57601354855173ffffffffffffffffffffffffffffffffffffffff90911690637229280c90879084908110612da857612da8614f2e565b60200260200101516040518263ffffffff1660e01b8152600401612df491907fffffffffffffffffffffffff000000000000000000000000000000000000000091909116815260200190565b604080518083038186803b158015612e0b57600080fd5b505afa158015612e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e439190614b26565b925082602001516fffffffffffffffffffffffffffffffff1684612e679190614d76565b93505b80612e7481614e97565b915050612c79565b5073ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054612eae908490614d76565b9695505050505050565b600080734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f1557600080fd5b505afa158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d9190614c08565b90506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff1663aa74e6226040518163ffffffff1660e01b815260040160206040518083038186803b158015612fab57600080fd5b505afa158015612fbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe39190614c08565b90506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff16631f96e76f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561304157600080fd5b505afa158015613055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130799190614c08565b90506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b1580156130d757600080fd5b505afa1580156130eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310f9190614c08565b9050600061311d8486614d8e565b9050828110156131735760006131338285614e06565b905083613140828a614dc9565b61314a9190614d8e565b975060006131588785614e06565b905080891115613166578098505b5096979650505050505050565b5060009695505050505050565b73ffffffffffffffffffffffffffffffffffffffff838116600081815260026020908152604080832094871680845294825280832086905551858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060019392505050565b600073ffffffffffffffffffffffffffffffffffffffff831633146132e85773ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146132e657828110156132d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332303a20496e73756666696369656e7420617070726f76616c000000006044820152606401610e1f565b6132e48433858403613180565b505b505b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040812054821115613380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f45524332303a20496e73756666696369656e742062616c616e636500000000006044820152606401610e1f565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822080548690039055918516815220546133c0908390614d76565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526001602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906131e49086815260200190565b7fffffffff000000000000000000000000000000000000000000000000000000008216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615611d24577fffffffff000000000000000000000000000000000000000000000000000000008216600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339391927f4ddc7b757e7bdd7254a9cd39452d307a52761bc824625c6a33104a075d8099e691a45050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916135b89190614c21565b6000604051808303816000865af19150503d80600081146135f5576040519150601f19603f3d011682016040523d82523d6000602084013e6135fa565b606091505b509150915081801561362457508051158061362457508080602001905181019061362491906149b1565b6114825761363181613c1c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9190614ca2565b7fffffffff0000000000000000000000000000000000000000000000000000000081166136c5837fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b7fffffffff000000000000000000000000000000000000000000000000000000001614611d24577fffffffff0000000000000000000000000000000000000000000000000000000082811660008181526006602052604080822060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001660e087901c17905551928416927fd348e2220a50b4500ec353f6e802d2f14dd1b5d6786148fd1bbcc570bf92d4739190a35050565b60115460ff16156137895750565b6000546137946146ae565b6137a58360005b6020020151612b5c565b81526137b283600161379b565b6020820152600d546040517f7050ccd90000000000000000000000000000000000000000000000000000000081523060048201526001602482015273ffffffffffffffffffffffffffffffffffffffff90911690637050ccd990604401600060405180830381600087803b15801561382957600080fd5b505af115801561383d573d6000803e3d6000fd5b50506010549150600090505b818110156138715761385f818685876000613c7b565b8061386981614e97565b915050613849565b5061387f848385600061421e565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040812054821115613914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f45524332303a20496e73756666696369656e742062616c616e636500000000006044820152606401610e1f565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083208054879003905582548690038355518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260408120546139b7908390614d76565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020526040812091909155546139ec908390614d76565b600090815560405183815273ffffffffffffffffffffffffffffffffffffffff851691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613975565b600054613a456146ae565b613a5083600061379b565b8152600d546040517f7050ccd90000000000000000000000000000000000000000000000000000000081523060048201526001602482015273ffffffffffffffffffffffffffffffffffffffff90911690637050ccd990604401600060405180830381600087803b158015613ac457600080fd5b505af1158015613ad8573d6000803e3d6000fd5b50506010549150600090505b81811015613b0c57613afa818685876001613c7b565b80613b0481614e97565b915050613ae4565b5061387f848385600161421e565b7fffffffff000000000000000000000000000000000000000000000000000000008216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611d24577fffffffff000000000000000000000000000000000000000000000000000000008216600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551339391927fe6231789d19137da31d0550f4ba9ee379020a8cfb64cb79bf1790c996d2e616591a45050565b6060604482511015613c6157505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b60048201915081806020019051810190611c4c9190614a74565b600060108681548110613c9057613c90614f2e565b60009182526020822060059190910201600281015481546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529294506fffffffffffffffffffffffffffffffff80831694700100000000000000000000000000000000909304169273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015613d3c57600080fd5b505afa158015613d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d749190614c08565b9050600086118015613d8f57506000613d8d8383614e06565b115b15613e0b5785613d9f8383614e06565b613db29068056bc75e2d63100000614dc9565b613dbc9190614d8e565b613dc69084614d42565b6002850180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216918217905592505b600260005b818110156141d75760008a8260028110613e2c57613e2c614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff161415613e52576141c5565b600e5473ffffffffffffffffffffffffffffffffffffffff168a8260028110613e7d57613e7d614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff161415613ea3576141c5565b60008660030160008c8460028110613ebd57613ebd614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508780613f0a57508581105b156141c357871561406957600068056bc75e2d63100000613f2b8389614e06565b8c8560028110613f3d57613f3d614f2e565b6020020151613f4c9190614dc9565b613f569190614d8e565b8860040160008e8660028110613f6e57613f6e614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613fb89190614d76565b905080156140635760008860040160008e8660028110613fda57613fda614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140568c846002811061403257614032614f2e565b6020020151895473ffffffffffffffffffffffffffffffffffffffff169083613521565b6140608186614e06565b94505b50614166565b68056bc75e2d6310000061407d8288614e06565b8b846002811061408f5761408f614f2e565b602002015161409e9190614dc9565b6140a89190614d8e565b8760040160008d85600281106140c0576140c0614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461410a9190614d76565b8760040160008d856002811061412257614122614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b858760030160008d856002811061417f5761417f614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505b806141cf81614e97565b915050613e10565b50828214614212576002850180546fffffffffffffffffffffffffffffffff8085167001000000000000000000000000000000000291161790555b50505050505050505050565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a082319060240160206040518083038186803b15801561428457600080fd5b505afa158015614298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142bc9190614c08565b60085490915060006142ce8284614e06565b60075490915085158015906142e35750600082115b1561431857856142fc8368056bc75e2d63100000614dc9565b6143069190614d8e565b6143109082614d76565b600781905590505b600260005b818110156146375760008a826002811061433957614339614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff16141561435f57614625565b600e5473ffffffffffffffffffffffffffffffffffffffff168a826002811061438a5761438a614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1614156143b057614625565b6000600960008c84600281106143c8576143c8614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050878061441557508381105b1561462357600068056bc75e2d631000006144308387614e06565b8c856002811061444257614442614f2e565b60200201516144519190614dc9565b61445b9190614d8e565b600a60008e866002811061447157614471614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144bb9190614d76565b9050881561456c578015614567576000600a60008e86600281106144e1576144e1614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061455a8c846002811061453957614539614f2e565b6020020151734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9083613521565b6145648189614e06565b97505b6145c7565b80600a60008e866002811061458357614583614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b84600960008e86600281106145de576145de614f2e565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505b8061462f81614e97565b91505061431d565b508385146146455760088590555b505050505050505050565b8280548282559060005260206000209060010160029004810192821561469e576000526020600020916001016002900482015b8281111561469e578254825591600101919060010190614683565b506146aa9291506146cc565b5090565b60405180604001604052806002906020820280368337509192915050565b5b808211156146aa57600081556001016146cd565b80356146ec81614f8c565b919050565b80357fffffffffffffffffffffffff0000000000000000000000000000000000000000811681146146ec57600080fd5b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146146ec57600080fd5b80517fffffffffffff0000000000000000000000000000000000000000000000000000811681146146ec57600080fd5b80516fffffffffffffffffffffffffffffffff811681146146ec57600080fd5b6000602082840312156147b357600080fd5b81356110b881614f8c565b6000602082840312156147d057600080fd5b81516110b881614f8c565b600080604083850312156147ee57600080fd5b82356147f981614f8c565b9150602083013561480981614f8c565b809150509250929050565b60008060006060848603121561482957600080fd5b833561483481614f8c565b9250602084013561484481614f8c565b929592945050506040919091013590565b6000806040838503121561486857600080fd5b823561487381614f8c565b946020939093013593505050565b60008060006060848603121561489657600080fd5b83356148a181614f8c565b92506020840135915060408401356148b881614f8c565b809150509250925092565b6000604082840312156148d557600080fd5b826040830111156148e557600080fd5b50919050565b600080604083850312156148fe57600080fd5b823567ffffffffffffffff8082111561491657600080fd5b818501915085601f83011261492a57600080fd5b813560208282111561493e5761493e614f5d565b8160051b925061494f818401614cf3565b8281528181019085830185870184018b101561496a57600080fd5b600096505b848710156149945761498081614721565b83526001969096019591830191830161496f565b5096506149a490508782016146e1565b9450505050509250929050565b6000602082840312156149c357600080fd5b815180151581146110b857600080fd5b6000602082840312156149e557600080fd5b6110b8826146f1565b60008060408385031215614a0157600080fd5b6147f9836146f1565b600060208284031215614a1c57600080fd5b6110b882614721565b60008060408385031215614a3857600080fd5b6147f983614721565b60008060408385031215614a5457600080fd5b614a5d83614721565b9150614a6b60208401614721565b90509250929050565b600060208284031215614a8657600080fd5b815167ffffffffffffffff80821115614a9e57600080fd5b818401915084601f830112614ab257600080fd5b815181811115614ac457614ac4614f5d565b614af560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614cf3565b9150808252856020828501011115614b0c57600080fd5b614b1d816020840160208601614e1d565b50949350505050565b600060408284031215614b3857600080fd5b6040516040810181811067ffffffffffffffff82111715614b5b57614b5b614f5d565b604052614b6783614781565b8152614b7560208401614781565b60208201529392505050565b600060608284031215614b9357600080fd5b6040516060810181811067ffffffffffffffff82111715614bb657614bb6614f5d565b6040528251614bc481614f8c565b8152614bd260208401614751565b6020820152614be360408401614751565b60408201529392505050565b600060208284031215614c0157600080fd5b5035919050565b600060208284031215614c1a57600080fd5b5051919050565b60008251614c33818460208701614e1d565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b82811015614c95578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101614c5a565b5091979650505050505050565b6020815260008251806020840152614cc1816040850160208701614e1d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614d3a57614d3a614f5d565b604052919050565b60006fffffffffffffffffffffffffffffffff808316818516808303821115614d6d57614d6d614ed0565b01949350505050565b60008219821115614d8957614d89614ed0565b500190565b600082614dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e0157614e01614ed0565b500290565b600082821015614e1857614e18614ed0565b500390565b60005b83811015614e38578181015183820152602001614e20565b8381111561387f5750506000910152565b600181811c90821680614e5d57607f821691505b602082108114156148e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ec957614ec9614ed0565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146122c557600080fdfea264697066735822122015ca439c3bd54e002c8c49b123af05812fa2ec35c47d0e8e290445d8ccd3457264736f6c63430008060033

When the line is changed to use a prefix increment: for (uint256 i = 0; i < vaultsLength; ++i) {

it has the following 'good' deployed bytecode:

608060405234801561001057600080fd5b50600436106103465760003560e01c80637bbfc69e116101bd578063b95c5746116100f9578063e2aecded116100a2578063e89133b21161007c578063e89133b2146107f5578063effae35314610815578063f301af4214610828578063ffffffff146106a557600080fd5b8063e2aecded146107b9578063e529ee95146107cc578063e6d223b1146107d557600080fd5b8063cc7d510e116100d3578063cc7d510e14610740578063dd62ed3e14610760578063de02cde7146107a657600080fd5b8063b95c574614610718578063bf86d69014610720578063c00007b01461072d57600080fd5b80639a04dbc711610166578063a9059cbb11610140578063a9059cbb146106cc578063ad82110f146106df578063ae93c1b5146106f2578063b51609b41461070557600080fd5b80639a04dbc7146106725780639f454db914610692578063a4f0d7d0146106a557600080fd5b8063923c1d6111610197578063923c1d611461062f57806395d89b411461064a57806397ff6a041461065257600080fd5b80637bbfc69e146105da5780637c93fa621461061e5780638757b15b1461062757600080fd5b806344faded01161028c5780635909c12f116102355780636a4874a11161020f5780636a4874a11461056d57806370a082311461058857806375f26e63146105be57806376addb19146105d157600080fd5b80635909c12f1461034b5780635ba5e9f014610547578063687f0e4c1461055a57600080fd5b80634b0ee02a116102665780634b0ee02a146105015780634f39059c14610514578063559742d91461053457600080fd5b806344faded0146104c857806347e20183146104db5780634a7fb0bd146104ee57600080fd5b806310ab9432116102f95780631b8eabdf116102d35780631b8eabdf1461046857806323b872dd1461047b5780632cdacb501461048e578063313ce567146104a957600080fd5b806310ab94321461043b57806314d6aed01461044e57806318160ddd1461045657600080fd5b806306fdde031161032a57806306fdde03146103be578063095ea7b3146103d35780630bece79c146103f657600080fd5b801561034b5780628cc26214610389578063055ad468146103a9575b600080fd5b610353600081565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61039c61039736600461479f565b61088b565b6040516103809190614c3b565b6103bc6103b73660046149d1565b610cdf565b005b6103c661101b565b6040516103809190614ca0565b6103e66103e1366004614853565b6110a9565b6040519015158152602001610380565b600e546104169073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610380565b6103e6610449366004614a23565b6110bd565b6103bc611118565b6000545b604051908152602001610380565b6103bc6104763660046149ec565b611487565b6103e6610489366004614812565b61180f565b61041673f403c135812408bfbe8713b5a23a04b3d48aae3181565b6005546104b69060ff1681565b60405160ff9091168152602001610380565b6103bc6104d6366004614a23565b61182f565b6103bc6104e936600461479f565b611923565b6103bc6104fc36600461479f565b611a10565b61045a61050f36600461479f565b611c3f565b600b546104169073ffffffffffffffffffffffffffffffffffffffff1681565b6103bc610542366004614a08565b611c50565b610353610555366004614a08565b611d26565b6103bc610568366004614a23565b611d63565b61041673d533a949740bb3306d119cc777fa900ba034cd5281565b61045a61059636600461479f565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b6103bc6105cc36600461479f565b611dec565b61045a60075481565b6105ed6105e8366004614853565b612013565b6040517fffffffffffffffffffffffff00000000000000000000000000000000000000009091168152602001610380565b61045a60085481565b6103bc612059565b610416734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6103c66122c6565b6013546104169073ffffffffffffffffffffffffffffffffffffffff1681565b61045a61068036600461479f565b60096020526000908152604090205481565b6103bc6106a03660046147d9565b6122d3565b6103537fffffffff0000000000000000000000000000000000000000000000000000000081565b6103e66106da366004614853565b612569565b6103bc6106ed3660046148e9565b612576565b6103bc610700366004614a3f565b612677565b6103bc61071336600461487f565b612729565b60105461045a565b6011546103e69060ff1681565b6103bc61073b36600461479f565b6128b6565b600d546104169073ffffffffffffffffffffffffffffffffffffffff1681565b61045a61076e3660046147d9565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b6103bc6107b4366004614a23565b6128e9565b6103e66107c73660046148c1565b61299b565b61045a600f5481565b61045a6107e336600461479f565b600a6020526000908152604090205481565b600c546104169073ffffffffffffffffffffffffffffffffffffffff1681565b6103bc6108233660046148e9565b612a24565b61083b610836366004614bed565b612ae3565b6040805173ffffffffffffffffffffffffffffffffffffffff95861681529490931660208501526fffffffffffffffffffffffffffffffff91821692840192909252166060820152608001610380565b6060600061089860005490565b6010549091506108a9816001614d74565b67ffffffffffffffff8111156108c1576108c1614f5b565b60405190808252806020026020018201604052801561090657816020015b60408051808201909152600080825260208201528152602001906001900390816108df5790505b50925060005b81811015610cd75760006010828154811061092957610929614f2c565b6000918252602082206005919091020180546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935073ffffffffffffffffffffffffffffffffffffffff16919082906370a082319060240160206040518083038186803b1580156109a557600080fd5b505afa1580156109b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dd9190614c06565b6002840154909150600090610a189070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1683614e04565b60018501546040517e8cc26200000000000000000000000000000000000000000000000000000000815230600482015291925073ffffffffffffffffffffffffffffffffffffffff1690628cc2629060240160206040518083038186803b158015610a8257600080fd5b505afa158015610a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aba9190614c06565b610ac49082614d74565b60028501549091506fffffffffffffffffffffffffffffffff168715610b0f5787610af88368056bc75e2d63100000614dc7565b610b029190614d8c565b610b0c9082614d74565b90505b73ffffffffffffffffffffffffffffffffffffffff8a16600090815260038601602052604081205468056bc75e2d6310000090610b4c9084614e04565b610b558d612b5a565b610b5f9190614dc7565b610b699190614d8c565b73ffffffffffffffffffffffffffffffffffffffff8c166000908152600488016020526040902054909150610b9f908290614d74565b8a8881518110610bb157610bb1614f2c565b60200260200101516020018181525050848a8881518110610bd457610bd4614f2c565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff9182169052851673d533a949740bb3306d119cc777fa900ba034cd521415610cbe57610c1f81612eb6565b73ffffffffffffffffffffffffffffffffffffffff8c166000908152600a6020526040902054610c4f9190614d74565b8a8981518110610c6157610c61614f2c565b60200260200101516020018181525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8a8981518110610c9857610c98614f2c565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690525b5050505050508080610ccf90614e95565b91505061090c565b505050919050565b6013546040517f1e81f8290000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffff00000000000000000000000000000000000000008316600482015260009173ffffffffffffffffffffffffffffffffffffffff1690631e81f8299060240160606040518083038186803b158015610d6b57600080fd5b505afa158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da39190614b7f565b51905073ffffffffffffffffffffffffffffffffffffffff8116610e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f206f776e657220666f7220746865207661756c740000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152601260205260408120805490915b81811015610f36578473ffffffffffffffffffffffffffffffffffffffff1916838281548110610e8457610e84614f2c565b9060005260206000209060029182820401919006600c029054906101000a900460a01b73ffffffffffffffffffffffffffffffffffffffff19161415610f26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5661756c7420616c7265616479206164646564000000000000000000000000006044820152606401610e1f565b610f2f81614e95565b9050610e52565b5081546001808201845560008481526020808220600285040180546bffffffffffffffffffffffff94909516600c026101000a9384021990941660a089901c939093029290921790925573ffffffffffffffffffffffffffffffffffffffff8516825260129052604090208254610faf9190849061464e565b506040517fffffffffffffffffffffffff000000000000000000000000000000000000000085169073ffffffffffffffffffffffffffffffffffffffff8516907f1b19d6df4e7e52fd52ee42d63aa18f1908c4b0fbcbc1e60dcd889dae6b33027e90600090a350505050565b6003805461102890614e47565b80601f016020809104026020016040519081016040528092919081815260200182805461105490614e47565b80156110a15780601f10611076576101008083540402835291602001916110a1565b820191906000526020600020905b81548152906001019060200180831161108457829003601f168201915b505050505081565b60006110b633848461317e565b9392505050565b7fffffffff000000000000000000000000000000000000000000000000000000008216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff166110b6565b600d5460105473ffffffffffffffffffffffffffffffffffffffff90911690806112065760108054600181810183556000929092526005027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672810180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673d533a949740bb3306d119cc777fa900ba034cd521782557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae673909201805473ffffffffffffffffffffffffffffffffffffffff8716931692909217909155906112029083614d74565b9150505b60008273ffffffffffffffffffffffffffffffffffffffff1663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b15801561124e57600080fd5b505afa158015611262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112869190614c06565b90506000611295600184614e04565b9050805b82811015611480576040517f40c354460000000000000000000000000000000000000000000000000000000081526004810182905260009073ffffffffffffffffffffffffffffffffffffffff8716906340c354469060240160206040518083038186803b15801561130a57600080fd5b505afa15801561131e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134291906147bc565b60108054600181018255600091909152604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905192935060059091027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019173ffffffffffffffffffffffffffffffffffffffff84169163f7c618c1916004808301926020929190829003018186803b1580156113e357600080fd5b505afa1580156113f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141b91906147bc565b81547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9283161783556001909201805490921692169190911790558061147881614e95565b915050611299565b5050505050565b6013546040517f1e81f8290000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffff00000000000000000000000000000000000000008416600482015260009173ffffffffffffffffffffffffffffffffffffffff1690631e81f8299060240160606040518083038186803b15801561151357600080fd5b505afa158015611527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154b9190614b7f565b51905073ffffffffffffffffffffffffffffffffffffffff8281169082161461180a5773ffffffffffffffffffffffffffffffffffffffff8216600090815260126020526040812080549091805b8281101561176a578673ffffffffffffffffffffffffffffffffffffffff19168482815481106115cb576115cb614f2c565b9060005260206000209060029182820401919006600c029054906101000a900460a01b73ffffffffffffffffffffffffffffffffffffffff19161415611758576000611618600185614e04565b82149050806116ab578461162d600186614e04565b8154811061163d5761163d614f2c565b9060005260206000209060029182820401919006600c029054906101000a900460a01b85838154811061167257611672614f2c565b9060005260206000209060029182820401919006600c026101000a8154816bffffffffffffffffffffffff021916908360a01c02179055505b848054806116bb576116bb614efd565b6001900381819060005260206000209060029182820401919006600c026101000a8154906bffffffffffffffffffffffff02191690559055600192508773ffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff167f9337d1acbe206cd862c6fd64eb23e7673aa11169e7bb8d35501c725e22b59e1a60405160405180910390a35061176a565b8061176281614e95565b915050611599565b50806117d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5661756c74206e6f7420666f756e6400000000000000000000000000000000006044820152606401610e1f565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260126020526040902083546118059190859061464e565b505050505b505050565b600061181b84836131f4565b506118278484846132ef565b949350505050565b816118b3611871827fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b7fffffffff0000000000000000000000000000000000000000000000000000000016600090815260066020908152604080832033845290915290205460ff1690565b611919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b61180a838361341f565b600080357fffffffff0000000000000000000000000000000000000000000000000000000016815260066020908152604080832033845290915290205460ff166119c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e696564000000000000000000000000000000000000006044820152606401610e1f565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080357fffffffff0000000000000000000000000000000000000000000000000000000016815260066020908152604080832033845290915290205460ff16611ab6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e696564000000000000000000000000000000000000006044820152606401610e1f565b600d546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015611b2057600080fd5b505afa158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614c06565b90508015611c1057600d546040517f38d07436000000000000000000000000000000000000000000000000000000008152600481018390526001602482015273ffffffffffffffffffffffffffffffffffffffff909116906338d0743690604401600060405180830381600087803b158015611bd357600080fd5b505af1158015611be7573d6000803e3d6000fd5b5050600c54611c10925073ffffffffffffffffffffffffffffffffffffffff169050838361351f565b5050601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000611c4a82612b5a565b92915050565b80611c92611871827fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b611cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b611d22827fffffffff00000000000000000000000000000000000000000000000000000000613662565b5050565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526006602052604081206001015460e01b611c4a565b73ffffffffffffffffffffffffffffffffffffffff81163314611de2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f52656e6f756e6365206f6e6c7920666f722073656c66000000000000000000006044820152606401610e1f565b611d22828261341f565b60115460ff1615611e59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f73687574646f776e0000000000000000000000000000000000000000000000006044820152606401610e1f565b3060009081526001602052604090205480611ed0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f207772617070656420636f6e76657820746f6b656e0000000000000000006044820152606401610e1f565b604080518082019091526000815273ffffffffffffffffffffffffffffffffffffffff83166020820152611f0390613779565b611f0d3082613883565b50600d546040517f38d07436000000000000000000000000000000000000000000000000000000008152600481018390526000602482015273ffffffffffffffffffffffffffffffffffffffff909116906338d0743690604401600060405180830381600087803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b5050600c54611fbe925073ffffffffffffffffffffffffffffffffffffffff169050838361351f565b604080518281526000602082015273ffffffffffffffffffffffffffffffffffffffff8416917f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5910160405180910390a25050565b6012602052816000526040600020818154811061202f57600080fd5b9060005260206000209060029182820401919006600c02915091509054906101000a900460a01b81565b600b546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273f403c135812408bfbe8713b5a23a04b3d48aae3160048201526000602482015273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b390604401602060405180830381600087803b1580156120df57600080fd5b505af11580156120f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211791906149af565b50600b546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273f403c135812408bfbe8713b5a23a04b3d48aae3160048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b390604401602060405180830381600087803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f591906149af565b50600c54600d546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015291169063095ea7b390604401602060405180830381600087803b15801561228b57600080fd5b505af115801561229f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c391906149af565b50565b6004805461102890614e47565b60115460ff1615612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f73687574646f776e0000000000000000000000000000000000000000000000006044820152606401610e1f565b600c546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156123aa57600080fd5b505afa1580156123be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e29190614c06565b90506000811161244e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f20636f6e76657820746f6b656e20746f20777261700000000000000000006044820152606401610e1f565b604080518082019091526000815273ffffffffffffffffffffffffffffffffffffffff8316602082015261248190613779565b61248b8382613984565b50600d546040517fa694fc3a0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a694fc3a90602401600060405180830381600087803b1580156124f857600080fd5b505af115801561250c573d6000803e3d6000fd5b5050604080518481526000602082015273ffffffffffffffffffffffffffffffffffffffff871693503392507fb32af138549e2a71563d1f2b1f7f0a139b3cdbc83d877d13603de1c3c5fd487a91015b60405180910390a3505050565b60006110b63384846132ef565b60005b825181101561180a576125dc61187184838151811061259a5761259a614f2c565b60200260200101517fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b612642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b61266583828151811061265757612657614f2c565b60200260200101518361341f565b8061266f81614e95565b915050612579565b816126b9611871827fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b61271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b61180a8383613662565b600080357fffffffff0000000000000000000000000000000000000000000000000000000016815260066020908152604080832033845290915290205460ff166127cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e696564000000000000000000000000000000000000006044820152606401610e1f565b81612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f616d6f756e7420697320300000000000000000000000000000000000000000006044820152606401610e1f565b61285773ffffffffffffffffffffffffffffffffffffffff8416828461351f565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb197f0a554c4d7840105e6ae65f0e275e9e8605a969dffa8caa7f1f118a2e1f58460405161255c91815260200190565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff82168152600060208201526122c390613a38565b8161292b611871827fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b612991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b61180a8383613b18565b6000612a1c6040518060400160405280846000600281106129be576129be614f2c565b6020020160208101906129d1919061479f565b73ffffffffffffffffffffffffffffffffffffffff1681526020908101906129ff906040870190870161479f565b73ffffffffffffffffffffffffffffffffffffffff169052613779565b506001919050565b60005b825181101561180a57612a4861187184838151811061259a5761259a614f2c565b612aae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610e1f565b612ad1838281518110612ac357612ac3614f2c565b602002602001015183613b18565b80612adb81614e95565b915050612a27565b60108181548110612af357600080fd5b600091825260209091206005909102018054600182015460029092015473ffffffffffffffffffffffffffffffffffffffff91821693509116906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041684565b600073ffffffffffffffffffffffffffffffffffffffff82161580612b995750600e5473ffffffffffffffffffffffffffffffffffffffff8381169116145b15612ba657506000919050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260126020908152604080832080548251818502810185019093528083529192909190830182828015612c4d57602002820191906000526020600020906000905b82829054906101000a900460a01b73ffffffffffffffffffffffffffffffffffffffff1916815260200190600c0190602082600b01049283019260010382029150808411612c025790505b5050604080518082019091526000808252602082018190529495509250612c72915050565b825160005b81811015612e7a57601354855173ffffffffffffffffffffffffffffffffffffffff808a16921690631e81f82990889085908110612cb757612cb7614f2c565b60200260200101516040518263ffffffff1660e01b8152600401612d0391907fffffffffffffffffffffffff000000000000000000000000000000000000000091909116815260200190565b60606040518083038186803b158015612d1b57600080fd5b505afa158015612d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d539190614b7f565b5173ffffffffffffffffffffffffffffffffffffffff161415612e6857601354855173ffffffffffffffffffffffffffffffffffffffff90911690637229280c90879084908110612da657612da6614f2c565b60200260200101516040518263ffffffff1660e01b8152600401612df291907fffffffffffffffffffffffff000000000000000000000000000000000000000091909116815260200190565b604080518083038186803b158015612e0957600080fd5b505afa158015612e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e419190614b24565b925082602001516fffffffffffffffffffffffffffffffff1684612e659190614d74565b93505b80612e7281614e95565b915050612c77565b5073ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054612eac908490614d74565b9695505050505050565b600080734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f1357600080fd5b505afa158015612f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4b9190614c06565b90506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff1663aa74e6226040518163ffffffff1660e01b815260040160206040518083038186803b158015612fa957600080fd5b505afa158015612fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe19190614c06565b90506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff16631f96e76f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561303f57600080fd5b505afa158015613053573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130779190614c06565b90506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b1580156130d557600080fd5b505afa1580156130e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310d9190614c06565b9050600061311b8486614d8c565b9050828110156131715760006131318285614e04565b90508361313e828a614dc7565b6131489190614d8c565b975060006131568785614e04565b905080891115613164578098505b5096979650505050505050565b5060009695505050505050565b73ffffffffffffffffffffffffffffffffffffffff838116600081815260026020908152604080832094871680845294825280832086905551858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060019392505050565b600073ffffffffffffffffffffffffffffffffffffffff831633146132e65773ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146132e457828110156132d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332303a20496e73756666696369656e7420617070726f76616c000000006044820152606401610e1f565b6132e2843385840361317e565b505b505b50600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205482111561337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f45524332303a20496e73756666696369656e742062616c616e636500000000006044820152606401610e1f565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822080548690039055918516815220546133be908390614d74565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526001602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906131e29086815260200190565b7fffffffff000000000000000000000000000000000000000000000000000000008216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615611d22577fffffffff000000000000000000000000000000000000000000000000000000008216600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339391927f4ddc7b757e7bdd7254a9cd39452d307a52761bc824625c6a33104a075d8099e691a45050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916135b69190614c1f565b6000604051808303816000865af19150503d80600081146135f3576040519150601f19603f3d011682016040523d82523d6000602084013e6135f8565b606091505b509150915081801561362257508051158061362257508080602001905181019061362291906149af565b6114805761362f81613c1a565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9190614ca0565b7fffffffff0000000000000000000000000000000000000000000000000000000081166136c3837fffffffff000000000000000000000000000000000000000000000000000000001660009081526006602052604090206001015460e01b90565b7fffffffff000000000000000000000000000000000000000000000000000000001614611d22577fffffffff0000000000000000000000000000000000000000000000000000000082811660008181526006602052604080822060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001660e087901c17905551928416927fd348e2220a50b4500ec353f6e802d2f14dd1b5d6786148fd1bbcc570bf92d4739190a35050565b60115460ff16156137875750565b6000546137926146ac565b6137a38360005b6020020151612b5a565b81526137b0836001613799565b6020820152600d546040517f7050ccd90000000000000000000000000000000000000000000000000000000081523060048201526001602482015273ffffffffffffffffffffffffffffffffffffffff90911690637050ccd990604401600060405180830381600087803b15801561382757600080fd5b505af115801561383b573d6000803e3d6000fd5b50506010549150600090505b8181101561386f5761385d818685876000613c79565b8061386781614e95565b915050613847565b5061387d848385600061421c565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040812054821115613912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f45524332303a20496e73756666696369656e742062616c616e636500000000006044820152606401610e1f565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083208054879003905582548690038355518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260408120546139b5908390614d74565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020526040812091909155546139ea908390614d74565b600090815560405183815273ffffffffffffffffffffffffffffffffffffffff851691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613973565b600054613a436146ac565b613a4e836000613799565b8152600d546040517f7050ccd90000000000000000000000000000000000000000000000000000000081523060048201526001602482015273ffffffffffffffffffffffffffffffffffffffff90911690637050ccd990604401600060405180830381600087803b158015613ac257600080fd5b505af1158015613ad6573d6000803e3d6000fd5b50506010549150600090505b81811015613b0a57613af8818685876001613c79565b80613b0281614e95565b915050613ae2565b5061387d848385600161421c565b7fffffffff000000000000000000000000000000000000000000000000000000008216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611d22577fffffffff000000000000000000000000000000000000000000000000000000008216600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551339391927fe6231789d19137da31d0550f4ba9ee379020a8cfb64cb79bf1790c996d2e616591a45050565b6060604482511015613c5f57505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b60048201915081806020019051810190611c4a9190614a72565b600060108681548110613c8e57613c8e614f2c565b60009182526020822060059190910201600281015481546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529294506fffffffffffffffffffffffffffffffff80831694700100000000000000000000000000000000909304169273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015613d3a57600080fd5b505afa158015613d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d729190614c06565b9050600086118015613d8d57506000613d8b8383614e04565b115b15613e095785613d9d8383614e04565b613db09068056bc75e2d63100000614dc7565b613dba9190614d8c565b613dc49084614d40565b6002850180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216918217905592505b600260005b818110156141d55760008a8260028110613e2a57613e2a614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff161415613e50576141c3565b600e5473ffffffffffffffffffffffffffffffffffffffff168a8260028110613e7b57613e7b614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff161415613ea1576141c3565b60008660030160008c8460028110613ebb57613ebb614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508780613f0857508581105b156141c157871561406757600068056bc75e2d63100000613f298389614e04565b8c8560028110613f3b57613f3b614f2c565b6020020151613f4a9190614dc7565b613f549190614d8c565b8860040160008e8660028110613f6c57613f6c614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613fb69190614d74565b905080156140615760008860040160008e8660028110613fd857613fd8614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140548c846002811061403057614030614f2c565b6020020151895473ffffffffffffffffffffffffffffffffffffffff16908361351f565b61405e8186614e04565b94505b50614164565b68056bc75e2d6310000061407b8288614e04565b8b846002811061408d5761408d614f2c565b602002015161409c9190614dc7565b6140a69190614d8c565b8760040160008d85600281106140be576140be614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546141089190614d74565b8760040160008d856002811061412057614120614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b858760030160008d856002811061417d5761417d614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505b806141cd81614e95565b915050613e0e565b50828214614210576002850180546fffffffffffffffffffffffffffffffff8085167001000000000000000000000000000000000291161790555b50505050505050505050565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a082319060240160206040518083038186803b15801561428257600080fd5b505afa158015614296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142ba9190614c06565b60085490915060006142cc8284614e04565b60075490915085158015906142e15750600082115b1561431657856142fa8368056bc75e2d63100000614dc7565b6143049190614d8c565b61430e9082614d74565b600781905590505b600260005b818110156146355760008a826002811061433757614337614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff16141561435d57614623565b600e5473ffffffffffffffffffffffffffffffffffffffff168a826002811061438857614388614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1614156143ae57614623565b6000600960008c84600281106143c6576143c6614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050878061441357508381105b1561462157600068056bc75e2d6310000061442e8387614e04565b8c856002811061444057614440614f2c565b602002015161444f9190614dc7565b6144599190614d8c565b600a60008e866002811061446f5761446f614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144b99190614d74565b9050881561456a578015614565576000600a60008e86600281106144df576144df614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145588c846002811061453757614537614f2c565b6020020151734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b908361351f565b6145628189614e04565b97505b6145c5565b80600a60008e866002811061458157614581614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b84600960008e86600281106145dc576145dc614f2c565b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505b8061462d81614e95565b91505061431b565b508385146146435760088590555b505050505050505050565b8280548282559060005260206000209060010160029004810192821561469c576000526020600020916001016002900482015b8281111561469c578254825591600101919060010190614681565b506146a89291506146ca565b5090565b60405180604001604052806002906020820280368337509192915050565b5b808211156146a857600081556001016146cb565b80356146ea81614f8a565b919050565b80357fffffffffffffffffffffffff0000000000000000000000000000000000000000811681146146ea57600080fd5b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146146ea57600080fd5b80517fffffffffffff0000000000000000000000000000000000000000000000000000811681146146ea57600080fd5b80516fffffffffffffffffffffffffffffffff811681146146ea57600080fd5b6000602082840312156147b157600080fd5b81356110b681614f8a565b6000602082840312156147ce57600080fd5b81516110b681614f8a565b600080604083850312156147ec57600080fd5b82356147f781614f8a565b9150602083013561480781614f8a565b809150509250929050565b60008060006060848603121561482757600080fd5b833561483281614f8a565b9250602084013561484281614f8a565b929592945050506040919091013590565b6000806040838503121561486657600080fd5b823561487181614f8a565b946020939093013593505050565b60008060006060848603121561489457600080fd5b833561489f81614f8a565b92506020840135915060408401356148b681614f8a565b809150509250925092565b6000604082840312156148d357600080fd5b826040830111156148e357600080fd5b50919050565b600080604083850312156148fc57600080fd5b823567ffffffffffffffff8082111561491457600080fd5b818501915085601f83011261492857600080fd5b813560208282111561493c5761493c614f5b565b8160051b925061494d818401614cf1565b8281528181019085830185870184018b101561496857600080fd5b600096505b848710156149925761497e8161471f565b83526001969096019591830191830161496d565b5096506149a290508782016146df565b9450505050509250929050565b6000602082840312156149c157600080fd5b815180151581146110b657600080fd5b6000602082840312156149e357600080fd5b6110b6826146ef565b600080604083850312156149ff57600080fd5b6147f7836146ef565b600060208284031215614a1a57600080fd5b6110b68261471f565b60008060408385031215614a3657600080fd5b6147f78361471f565b60008060408385031215614a5257600080fd5b614a5b8361471f565b9150614a696020840161471f565b90509250929050565b600060208284031215614a8457600080fd5b815167ffffffffffffffff80821115614a9c57600080fd5b818401915084601f830112614ab057600080fd5b815181811115614ac257614ac2614f5b565b614af360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614cf1565b9150808252856020828501011115614b0a57600080fd5b614b1b816020840160208601614e1b565b50949350505050565b600060408284031215614b3657600080fd5b6040516040810181811067ffffffffffffffff82111715614b5957614b59614f5b565b604052614b658361477f565b8152614b736020840161477f565b60208201529392505050565b600060608284031215614b9157600080fd5b6040516060810181811067ffffffffffffffff82111715614bb457614bb4614f5b565b6040528251614bc281614f8a565b8152614bd06020840161474f565b6020820152614be16040840161474f565b60408201529392505050565b600060208284031215614bff57600080fd5b5035919050565b600060208284031215614c1857600080fd5b5051919050565b60008251614c31818460208701614e1b565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b82811015614c93578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101614c58565b5091979650505050505050565b6020815260008251806020840152614cbf816040850160208701614e1b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614d3857614d38614f5b565b604052919050565b60006fffffffffffffffffffffffffffffffff808316818516808303821115614d6b57614d6b614ece565b01949350505050565b60008219821115614d8757614d87614ece565b500190565b600082614dc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dff57614dff614ece565b500290565b600082821015614e1657614e16614ece565b500390565b60005b83811015614e36578181015183820152602001614e1e565b8381111561387d5750506000910152565b600181811c90821680614e5b57607f821691505b602082108114156148e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ec757614ec7614ece565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146122c357600080fdfea2646970667358221220e2b45cbcd14135f475a18b46ccd28ed1d9569600e7516716dfaef0df98481f9b64736f6c63430008060033

Drilling down to the opcodes in the specific for-loop, we see

with i++ (bad):

3878(0xf26) JUMPDEST(0x5b/0xf26) 
3879(0xf27) DUP1(0x80) 
3880(0xf28) PUSH2(0x61) 0x0f,0x30
3883(0xf2b) DUP2(0x81) 
3884(0xf2c) PUSH2(0x61) 0x4e,0x97
3887(0xf2f) JUMP(0x56) 
3888(0xf30) JUMPDEST(0x5b/0xf30) 
3889(0xf31) SWAP2(0x91) 
3890(0xf32) POP(0x50) 
3891(0xf33) POP(0x50) 
3892(0xf34) PUSH2(0x61) 0x0e,0x52
3895(0xf37) JUMP(0x56) 

and with ++i (good):

3878(0xf26) JUMPDEST(0x5b/0xf26) 
3879(0xf27) PUSH2(0x61) 0x0f,0x2f
3882(0xf2a) DUP2(0x81) 
3883(0xf2b) PUSH2(0x61) 0x4e,0x95
3886(0xf2e) JUMP(0x56) 
3887(0xf2f) JUMPDEST(0x5b/0xf2f) 
3888(0xf30) SWAP1(0x90) 
3889(0xf31) POP(0x50) 
3890(0xf32) PUSH2(0x61) 0x0e,0x52
3893(0xf35) JUMP(0x56)

As compared to the good version, bad version contains an extra DUP1 (costing 3 extra gas) at program counter 3879, has a SWAP2 at pc 3889 versus good's SWAP1 (same cost), and the bad version has an extra POP (costing 2 extra gas) at pc 3891.

Tools Used

Hardhat npx @remix-project/remix-lib

Recommended Mitigation Steps

Use ++i rather than i++ in all places

alcueca commented 2 years ago

Duplicate of #14, but feel free to take this one as main if you like it verbose.