This repository was archived by the owner on Jan 27, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathpaw_warz.rs
More file actions
108 lines (92 loc) · 37.7 KB
/
paw_warz.rs
File metadata and controls
108 lines (92 loc) · 37.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//! This module tests the library's analysis capabilities on the `PawWarz`
//! contract`.
#![cfg(test)]
use storage_layout_extractor::{
tc::abi::{AbiType, StructElement},
watchdog::LazyWatchdog,
};
mod common;
/// Tests the library on the bytecode of the PawWarz contract deployed
/// [here](https://etherscan.io/address/0xffe41442f590e8d038bea634fc4e157132ce2c5b).
#[test]
fn correctly_generates_a_layout() -> anyhow::Result<()> {
// Create the extractor
let bytecode = "0x60806040526004361061014b5760003560e01c80636c0360eb116100b6578063a22cb4651161006f578063a22cb46514610481578063b88d4fde146104aa578063c1f2fc67146104d3578063c87b56dd146104dd578063e985e9c51461051a578063f2fde38b146105575761014b565b80636c0360eb1461038357806370a08231146103ae578063715018a6146103eb5780638da5cb5b1461040257806395d89b411461042d578063a1db9782146104585761014b565b806323b872dd1161010857806323b872dd146102725780632e1a7d4d1461029b57806342842e0e146102b757806355f804b3146102e05780636352211e1461030957806366bf33be146103465761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f55780630f08025f1461021e57806319ee6e3f14610249575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612e84565b610580565b6040516101849190613529565b60405180910390f35b34801561019957600080fd5b506101a2610662565b6040516101af9190613566565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612f53565b6106f4565b6040516101ec919061345b565b60405180910390f35b34801561020157600080fd5b5061021c60048036038101906102179190612db3565b610779565b005b34801561022a57600080fd5b50610233610891565b604051610240919061345b565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b9190612def565b6108b7565b005b34801561027e57600080fd5b5061029960048036038101906102949190612cad565b610a4e565b005b6102b560048036038101906102b09190612f53565b610aae565b005b3480156102c357600080fd5b506102de60048036038101906102d99190612cad565b610c2a565b005b3480156102ec57600080fd5b5061030760048036038101906103029190612f12565b610c4a565b005b34801561031557600080fd5b50610330600480360381019061032b9190612f53565b610ce0565b60405161033d919061345b565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190612f53565b610d92565b60405161037a9190613544565b60405180910390f35b34801561038f57600080fd5b50610398610e32565b6040516103a59190613566565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190612c48565b610ec0565b6040516103e291906138a8565b60405180910390f35b3480156103f757600080fd5b50610400610f78565b005b34801561040e57600080fd5b50610417611000565b604051610424919061345b565b60405180910390f35b34801561043957600080fd5b5061044261102a565b60405161044f9190613566565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612ed6565b6110bc565b005b34801561048d57600080fd5b506104a860048036038101906104a39190612d77565b61116e565b005b3480156104b657600080fd5b506104d160048036038101906104cc9190612cfc565b611184565b005b6104db6111e6565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190612f53565b611214565b6040516105119190613566565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190612c71565b6112bb565b60405161054e9190613529565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190612c48565b61134f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061065b575061065a82611447565b5b9050919050565b60606000805461067190613ba8565b80601f016020809104026020016040519081016040528092919081815260200182805461069d90613ba8565b80156106ea5780601f106106bf576101008083540402835291602001916106ea565b820191906000526020600020905b8154815290600101906020018083116106cd57829003601f168201915b5050505050905090565b60006106ff826114b1565b61073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073590613768565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078482610ce0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ec906137e8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081461151d565b73ffffffffffffffffffffffffffffffffffffffff16148061084357506108428161083d61151d565b6112bb565b5b610882576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610879906136c8565b60405180910390fd5b61088c8383611525565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109455750610916611000565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b90613868565b60405180910390fd5b600183146109c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109be90613668565b60405180910390fd5b6000806109d484846115de565b915091506109e38683836117f3565b80600860008481526020019081526020016000209080519060200190610a0a929190612972565b507f31e594f6b36b98ec520a91cbbba7b8724b1cec27393f86d8f0f6aa6084db0aaf868383604051610a3e939291906134eb565b60405180910390a1505050505050565b610a5f610a5961151d565b82611802565b610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590613828565b60405180910390fd5b610aa98383836118e0565b505050565b610ab661151d565b73ffffffffffffffffffffffffffffffffffffffff16610ad4611000565b73ffffffffffffffffffffffffffffffffffffffff1614610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613788565b60405180910390fd5b80471015610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6490613748565b60405180910390fd5b6000610b77611000565b905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610b9f90613446565b60006040518083038185875af1925050503d8060008114610bdc576040519150601f19603f3d011682016040523d82523d6000602084013e610be1565b606091505b5050905080610c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1c906137a8565b60405180910390fd5b505050565b610c4583838360405180602001604052806000815250611184565b505050565b610c5261151d565b73ffffffffffffffffffffffffffffffffffffffff16610c70611000565b73ffffffffffffffffffffffffffffffffffffffff1614610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90613788565b60405180910390fd5b8060099080519060200190610cdc9291906129f8565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090613708565b60405180910390fd5b80915050919050565b60086020528060005260406000206000915090508054610db190613ba8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddd90613ba8565b8015610e2a5780601f10610dff57610100808354040283529160200191610e2a565b820191906000526020600020905b815481529060010190602001808311610e0d57829003601f168201915b505050505081565b60098054610e3f90613ba8565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6b90613ba8565b8015610eb85780601f10610e8d57610100808354040283529160200191610eb8565b820191906000526020600020905b815481529060010190602001808311610e9b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f28906136e8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f8061151d565b73ffffffffffffffffffffffffffffffffffffffff16610f9e611000565b73ffffffffffffffffffffffffffffffffffffffff1614610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90613788565b60405180910390fd5b610ffe6000611b47565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461103990613ba8565b80601f016020809104026020016040519081016040528092919081815260200182805461106590613ba8565b80156110b25780601f10611087576101008083540402835291602001916110b2565b820191906000526020600020905b81548152906001019060200180831161109557829003601f168201915b5050505050905090565b6110c461151d565b73ffffffffffffffffffffffffffffffffffffffff166110e2611000565b73ffffffffffffffffffffffffffffffffffffffff1614611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90613788565b60405180910390fd5b61116a611143611000565b828473ffffffffffffffffffffffffffffffffffffffff16611c0d9092919063ffffffff16565b5050565b61118061117961151d565b8383611c93565b5050565b61119561118f61151d565b83611802565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90613828565b60405180910390fd5b6111e084848484611e00565b50505050565b7ffa7e183bbdecf0f04c0d102e536e0dac9b5b206e55ba7704edac71eaebaa690c60405160405180910390a1565b606061121f826114b1565b61125e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611255906137c8565b60405180910390fd5b6000611268611e5c565b9050600081511161128857604051806020016040528060008152506112b3565b8061129284611eee565b6040516020016112a3929190613422565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61135761151d565b73ffffffffffffffffffffffffffffffffffffffff16611375611000565b73ffffffffffffffffffffffffffffffffffffffff16146113cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c290613788565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561143b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611432906135c8565b60405180910390fd5b61144481611b47565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661159883610ce0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006060600061166985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600181526020017f3a00000000000000000000000000000000000000000000000000000000000000815250600061209b565b905060008112156116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690613808565b60405180910390fd5b600061171b86866001906001866116c69190613aac565b926116d393929190613998565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612205565b90506000600383888890506117309190613aac565b61173a9190613aac565b90506000811415611762578160405180602001604052806000815250945094505050506117ec565b366000888860028761177491906139cb565b9060018c8c90506117859190613aac565b9261179293929190613998565b9150915083828281818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905090509650965050505050505b9250929050565b6117fd8383612301565b505050565b600061180d826114b1565b61184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906136a8565b60405180910390fd5b600061185783610ce0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118c657508373ffffffffffffffffffffffffffffffffffffffff166118ae846106f4565b73ffffffffffffffffffffffffffffffffffffffff16145b806118d757506118d681856112bb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661190082610ce0565b73ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d906135e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd90613628565b60405180910390fd5b6119d183838361231f565b6119dc600082611525565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a2c9190613aac565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a8391906139cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b42838383612324565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c8e8363a9059cbb60e01b8484604051602401611c2c9291906134c2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612329565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990613648565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611df39190613529565b60405180910390a3505050565b611e0b8484846118e0565b611e17848484846123f0565b611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d906135a8565b60405180910390fd5b50505050565b606060098054611e6b90613ba8565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9790613ba8565b8015611ee45780601f10611eb957610100808354040283529160200191611ee4565b820191906000526020600020905b815481529060010190602001808311611ec757829003601f168201915b5050505050905090565b60606000821415611f36576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612096565b600082905060005b60008214611f68578080611f5190613c0b565b915050600a82611f619190613a21565b9150611f3e565b60008167ffffffffffffffff811115611faa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fdc5781602001600182028036833780820191505090505b5090505b6000851461208f57600182611ff59190613aac565b9150600a856120049190613c54565b603061201091906139cb565b60f81b81838151811061204c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120889190613a21565b9450611fe0565b8093505050505b919050565b60008083905060018151146120d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008390505b85518110156121d85781600081518110612122577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916868281518110612188577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156121c55780925050506121fe565b80806121d090613c0b565b9150506120df565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9150505b9392505050565b6000806000905060005b83518110156122f7576000848281518110612253577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff16905060308110158015612278575060398111155b156122a85760308161228a9190613aac565b600a846122979190613a52565b6122a191906139cb565b92506122e3565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613588565b60405180910390fd5b5080806122ef90613c0b565b91505061220f565b5080915050919050565b61231b828260405180602001604052806000815250612587565b5050565b505050565b505050565b600061238b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125e29092919063ffffffff16565b90506000815111156123eb57808060200190518101906123ab9190612e5b565b6123ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e190613888565b60405180910390fd5b5b505050565b60006124118473ffffffffffffffffffffffffffffffffffffffff166125fa565b1561257a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261243a61151d565b8786866040518563ffffffff1660e01b815260040161245c9493929190613476565b602060405180830381600087803b15801561247657600080fd5b505af19250505080156124a757506040513d601f19601f820116820180604052508101906124a49190612ead565b60015b61252a573d80600081146124d7576040519150601f19603f3d011682016040523d82523d6000602084013e6124dc565b606091505b50600081511415612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906135a8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061257f565b600190505b949350505050565b612591838361261d565b61259e60008484846123f0565b6125dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d4906135a8565b60405180910390fd5b505050565b60606125f184846000856127f7565b90509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268490613728565b60405180910390fd5b612696816114b1565b156126d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cd90613608565b60405180910390fd5b6126e26000838361231f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273291906139cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127f360008383612324565b5050565b60608247101561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390613688565b60405180910390fd5b612845856125fa565b612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b90613848565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128ad919061340b565b60006040518083038185875af1925050503d80600081146128ea576040519150601f19603f3d011682016040523d82523d6000602084013e6128ef565b606091505b50915091506128ff82828661290b565b92505050949350505050565b6060831561291b5782905061296b565b60008351111561292e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129629190613566565b60405180910390fd5b9392505050565b82805461297e90613ba8565b90600052602060002090601f0160209004810192826129a057600085556129e7565b82601f106129b957805160ff19168380011785556129e7565b828001600101855582156129e7579182015b828111156129e65782518255916020019190600101906129cb565b5b5090506129f49190612a7e565b5090565b828054612a0490613ba8565b90600052602060002090601f016020900481019282612a265760008555612a6d565b82601f10612a3f57805160ff1916838001178555612a6d565b82800160010185558215612a6d579182015b82811115612a6c578251825591602001919060010190612a51565b5b509050612a7a9190612a7e565b5090565b5b80821115612a97576000816000905550600101612a7f565b5090565b6000612aae612aa9846138e8565b6138c3565b905082815260208101848484011115612ac657600080fd5b612ad1848285613b66565b509392505050565b6000612aec612ae784613919565b6138c3565b905082815260208101848484011115612b0457600080fd5b612b0f848285613b66565b509392505050565b600081359050612b26816143b6565b92915050565b600081359050612b3b816143cd565b92915050565b600081519050612b50816143cd565b92915050565b600081359050612b65816143e4565b92915050565b600081519050612b7a816143e4565b92915050565b60008083601f840112612b9257600080fd5b8235905067ffffffffffffffff811115612bab57600080fd5b602083019150836001820283011115612bc357600080fd5b9250929050565b600082601f830112612bdb57600080fd5b8135612beb848260208601612a9b565b91505092915050565b600081359050612c03816143fb565b92915050565b600082601f830112612c1a57600080fd5b8135612c2a848260208601612ad9565b91505092915050565b600081359050612c4281614412565b92915050565b600060208284031215612c5a57600080fd5b6000612c6884828501612b17565b91505092915050565b60008060408385031215612c8457600080fd5b6000612c9285828601612b17565b9250506020612ca385828601612b17565b9150509250929050565b600080600060608486031215612cc257600080fd5b6000612cd086828701612b17565b9350506020612ce186828701612b17565b9250506040612cf286828701612c33565b9150509250925092565b60008060008060808587031215612d1257600080fd5b6000612d2087828801612b17565b9450506020612d3187828801612b17565b9350506040612d4287828801612c33565b925050606085013567ffffffffffffffff811115612d5f57600080fd5b612d6b87828801612bca565b91505092959194509250565b60008060408385031215612d8a57600080fd5b6000612d9885828601612b17565b9250506020612da985828601612b2c565b9150509250929050565b60008060408385031215612dc657600080fd5b6000612dd485828601612b17565b9250506020612de585828601612c33565b9150509250929050565b60008060008060608587031215612e0557600080fd5b6000612e1387828801612b17565b9450506020612e2487828801612c33565b935050604085013567ffffffffffffffff811115612e4157600080fd5b612e4d87828801612b80565b925092505092959194509250565b600060208284031215612e6d57600080fd5b6000612e7b84828501612b41565b91505092915050565b600060208284031215612e9657600080fd5b6000612ea484828501612b56565b91505092915050565b600060208284031215612ebf57600080fd5b6000612ecd84828501612b6b565b91505092915050565b60008060408385031215612ee957600080fd5b6000612ef785828601612bf4565b9250506020612f0885828601612c33565b9150509250929050565b600060208284031215612f2457600080fd5b600082013567ffffffffffffffff811115612f3e57600080fd5b612f4a84828501612c09565b91505092915050565b600060208284031215612f6557600080fd5b6000612f7384828501612c33565b91505092915050565b612f8581613ae0565b82525050565b612f9481613af2565b82525050565b6000612fa58261394a565b612faf8185613960565b9350612fbf818560208601613b75565b612fc881613d41565b840191505092915050565b6000612fde8261394a565b612fe88185613971565b9350612ff8818560208601613b75565b80840191505092915050565b600061300f82613955565b613019818561397c565b9350613029818560208601613b75565b61303281613d41565b840191505092915050565b600061304882613955565b613052818561398d565b9350613062818560208601613b75565b80840191505092915050565b600061307b60238361397c565b915061308682613d52565b604082019050919050565b600061309e60328361397c565b91506130a982613da1565b604082019050919050565b60006130c160268361397c565b91506130cc82613df0565b604082019050919050565b60006130e460258361397c565b91506130ef82613e3f565b604082019050919050565b6000613107601c8361397c565b915061311282613e8e565b602082019050919050565b600061312a60248361397c565b915061313582613eb7565b604082019050919050565b600061314d60198361397c565b915061315882613f06565b602082019050919050565b6000613170601a8361397c565b915061317b82613f2f565b602082019050919050565b600061319360268361397c565b915061319e82613f58565b604082019050919050565b60006131b6602c8361397c565b91506131c182613fa7565b604082019050919050565b60006131d960388361397c565b91506131e482613ff6565b604082019050919050565b60006131fc602a8361397c565b915061320782614045565b604082019050919050565b600061321f60298361397c565b915061322a82614094565b604082019050919050565b600061324260208361397c565b915061324d826140e3565b602082019050919050565b6000613265600e8361397c565b91506132708261410c565b602082019050919050565b6000613288602c8361397c565b915061329382614135565b604082019050919050565b60006132ab60208361397c565b91506132b682614184565b602082019050919050565b60006132ce60128361397c565b91506132d9826141ad565b602082019050919050565b60006132f1602f8361397c565b91506132fc826141d6565b604082019050919050565b600061331460218361397c565b915061331f82614225565b604082019050919050565b600061333760148361397c565b915061334282614274565b602082019050919050565b600061335a600083613971565b91506133658261429d565b600082019050919050565b600061337d60318361397c565b9150613388826142a0565b604082019050919050565b60006133a0601d8361397c565b91506133ab826142ef565b602082019050919050565b60006133c3602b8361397c565b91506133ce82614318565b604082019050919050565b60006133e6602a8361397c565b91506133f182614367565b604082019050919050565b61340581613b5c565b82525050565b60006134178284612fd3565b915081905092915050565b600061342e828561303d565b915061343a828461303d565b91508190509392505050565b60006134518261334d565b9150819050919050565b60006020820190506134706000830184612f7c565b92915050565b600060808201905061348b6000830187612f7c565b6134986020830186612f7c565b6134a560408301856133fc565b81810360608301526134b78184612f9a565b905095945050505050565b60006040820190506134d76000830185612f7c565b6134e460208301846133fc565b9392505050565b60006060820190506135006000830186612f7c565b61350d60208301856133fc565b818103604083015261351f8184612f9a565b9050949350505050565b600060208201905061353e6000830184612f8b565b92915050565b6000602082019050818103600083015261355e8184612f9a565b905092915050565b600060208201905081810360008301526135808184613004565b905092915050565b600060208201905081810360008301526135a18161306e565b9050919050565b600060208201905081810360008301526135c181613091565b9050919050565b600060208201905081810360008301526135e1816130b4565b9050919050565b60006020820190508181036000830152613601816130d7565b9050919050565b60006020820190508181036000830152613621816130fa565b9050919050565b600060208201905081810360008301526136418161311d565b9050919050565b6000602082019050818103600083015261366181613140565b9050919050565b6000602082019050818103600083015261368181613163565b9050919050565b600060208201905081810360008301526136a181613186565b9050919050565b600060208201905081810360008301526136c1816131a9565b9050919050565b600060208201905081810360008301526136e1816131cc565b9050919050565b60006020820190508181036000830152613701816131ef565b9050919050565b6000602082019050818103600083015261372181613212565b9050919050565b6000602082019050818103600083015261374181613235565b9050919050565b6000602082019050818103600083015261376181613258565b9050919050565b600060208201905081810360008301526137818161327b565b9050919050565b600060208201905081810360008301526137a18161329e565b9050919050565b600060208201905081810360008301526137c1816132c1565b9050919050565b600060208201905081810360008301526137e1816132e4565b9050919050565b6000602082019050818103600083015261380181613307565b9050919050565b600060208201905081810360008301526138218161332a565b9050919050565b6000602082019050818103600083015261384181613370565b9050919050565b6000602082019050818103600083015261386181613393565b9050919050565b60006020820190508181036000830152613881816133b6565b9050919050565b600060208201905081810360008301526138a1816133d9565b9050919050565b60006020820190506138bd60008301846133fc565b92915050565b60006138cd6138de565b90506138d98282613bda565b919050565b6000604051905090565b600067ffffffffffffffff82111561390357613902613d12565b5b61390c82613d41565b9050602081019050919050565b600067ffffffffffffffff82111561393457613933613d12565b5b61393d82613d41565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600080858511156139a857600080fd5b838611156139b557600080fd5b6001850283019150848603905094509492505050565b60006139d682613b5c565b91506139e183613b5c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a1657613a15613c85565b5b828201905092915050565b6000613a2c82613b5c565b9150613a3783613b5c565b925082613a4757613a46613cb4565b5b828204905092915050565b6000613a5d82613b5c565b9150613a6883613b5c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613aa157613aa0613c85565b5b828202905092915050565b6000613ab782613b5c565b9150613ac283613b5c565b925082821015613ad557613ad4613c85565b5b828203905092915050565b6000613aeb82613b3c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613b3582613ae0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b93578082015181840152602081019050613b78565b83811115613ba2576000848401525b50505050565b60006002820490506001821680613bc057607f821691505b60208210811415613bd457613bd3613ce3565b5b50919050565b613be382613d41565b810181811067ffffffffffffffff82111715613c0257613c01613d12565b5b80604052505050565b6000613c1682613b5c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c4957613c48613c85565b5b600182019050919050565b6000613c5f82613b5c565b9150613c6a83613b5c565b925082613c7a57613c79613cb4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f696e76616c696420696e7075742c206f6e6c79206e756d6265727320616c6c6f60008201527f7765640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d696e7461626c653a20696e76616c6964207175616e74697479000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64204554480000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f536570617261746f72206d757374206578697374000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279206f60008201527f776e6572206f7220494d58000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6143bf81613ae0565b81146143ca57600080fd5b50565b6143d681613af2565b81146143e157600080fd5b50565b6143ed81613afe565b81146143f857600080fd5b50565b61440481613b2a565b811461440f57600080fd5b50565b61441b81613b5c565b811461442657600080fd5b5056fea2646970667358221220cc95faab36df406f4170adb4ae64fa4645197da1d6f207a41e3ed633a674d3dd64736f6c63430008040033";
let extractor = common::new_extractor_from_bytecode(bytecode, LazyWatchdog.in_rc())?;
// Get the final storage layout for the input contract
let layout = extractor.analyze()?;
// We should have 10 entries, but we see 11
assert_eq!(layout.slot_count(), 11);
// `string` but we infer `bytes`
assert!(layout.has_slot(0, 0, AbiType::DynBytes));
// `string` but we infer `bytes`
assert!(layout.has_slot(1, 0, AbiType::DynBytes));
// `mapping(uint256 => address)` but we infer `mapping(uint256 => bytes20)`
assert!(layout.has_slot(
2,
0,
AbiType::Mapping {
key_type: Box::new(AbiType::UInt { size: Some(256) }),
value_type: Box::new(AbiType::Bytes { length: Some(20) }),
}
));
// `mapping(address => uint256)` but we infer `mapping(bytes20 => uintUnknown)`
assert!(layout.has_slot(
3,
0,
AbiType::Mapping {
key_type: Box::new(AbiType::Bytes { length: Some(20) }),
value_type: Box::new(AbiType::UInt { size: None }),
}
));
// `mapping(uint256 => address)` but we infer `mapping(uint256 =>
// struct(bytes20, bytes12))`
assert!(layout.has_slot(
4,
0,
AbiType::Mapping {
key_type: Box::new(AbiType::UInt { size: Some(256) }),
value_type: Box::new(AbiType::Struct {
elements: vec![
StructElement::new(0, AbiType::Bytes { length: Some(20) }),
StructElement::new(160, AbiType::Bytes { length: Some(12) }),
],
}),
}
));
// `mapping(address => mapping(address => bool))` but we infer `mapping(address
// => mapping(address => struct(bytes1, bytes31)))`
assert!(layout.has_slot(
5,
0,
AbiType::Mapping {
key_type: Box::new(AbiType::Address),
value_type: Box::new(AbiType::Mapping {
key_type: Box::new(AbiType::Address),
value_type: Box::new(AbiType::Struct {
elements: vec![
StructElement::new(0, AbiType::Bytes { length: Some(1) }),
StructElement::new(8, AbiType::Bytes { length: Some(31) }),
],
}),
}),
}
));
// `address` but we infer `packed(bytes20, bytes12)`
assert!(layout.has_slot(6, 0, AbiType::Bytes { length: Some(20) }));
assert!(layout.has_slot(6, 160, AbiType::Bytes { length: Some(12) }));
// `address` but we infer `uintUnknown`
assert!(layout.has_slot(7, 0, AbiType::UInt { size: None }));
// `mapping(uint256 => bytes)` but we infer `mapping(bytes32 => bytes)`
assert!(layout.has_slot(
8,
0,
AbiType::Mapping {
key_type: Box::new(AbiType::Bytes { length: Some(32) }),
value_type: Box::new(AbiType::DynBytes),
}
));
// `string` but we infer `bytes`
assert!(layout.has_slot(9, 0, AbiType::DynBytes));
Ok(())
}