Skip to content

Instantly share code, notes, and snippets.

@krebernisak
Created July 23, 2021 13:01
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save krebernisak/abed06eb75cbda09e51ff2af58984b73 to your computer and use it in GitHub Desktop.
Save krebernisak/abed06eb75cbda09e51ff2af58984b73 to your computer and use it in GitHub Desktop.
Optimistic Etherscan contract verification issue (OVM solc 0.6.12)
{
"schemaVersion": "2.0.0",
"contractName": "AccessControlledAggregator",
"compilerOutput": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "AddedAccess",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "CheckAccessDisabled",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "CheckAccessEnabled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "OwnershipTransferRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "RemovedAccess",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"stateMutability": "payable",
"type": "fallback"
},
{
"inputs": [],
"name": "acceptOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_user",
"type": "address"
}
],
"name": "addAccess",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "checkEnabled",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "disableAccessCheck",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "enableAccessCheck",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_user",
"type": "address"
},
{
"internalType": "bytes",
"name": "_calldata",
"type": "bytes"
}
],
"name": "hasAccess",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "implementation",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_user",
"type": "address"
}
],
"name": "removeAccess",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_to",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"devdoc": {
"kind": "dev",
"methods": {
"acceptOwnership()": {
"details": "Allows an ownership transfer to be completed by the recipient."
},
"addAccess(address)": {
"params": {
"_user": "The address to add"
}
},
"checkEnabled()": {
"returns": {
"_0": "Returns checkEnabled."
}
},
"constructor": {
"details": "The underlying aggregator implementation must extend `Initializable`, as this proxy can't call it's constructor directly. Additionally, we avoid contract initialization during construction as OVM safety checker could flag some of those constructor init parameters invalid. Make sure you remember to initialize the contract after construction. Regardless of extending UpgradeableProxy, this contract can not be upgraded as `UpgradeableProxy._upgradeTo` function is unused.",
"params": {
"implementation": "The address of underlying aggregator implementation used by the proxy."
}
},
"hasAccess(address,bytes)": {
"params": {
"_user": "The address to query"
}
},
"implementation()": {
"returns": {
"_0": "Returns the address of underlying aggregator implementation used by the proxy."
}
},
"owner()": {
"returns": {
"_0": "The address of the owner."
}
},
"removeAccess(address)": {
"params": {
"_user": "The address to remove"
}
},
"transferOwnership(address)": {
"details": "Allows an owner to begin transferring ownership to a new address, pending."
}
},
"title": "AccessControlled FluxAggregator contract",
"version": 1
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x60806040523480156200001c5760008062000019620003f1565b50505b506040516200164638038062001646833981810160405260208110156200004d576000806200004a620003f1565b50505b8101908080519250829150604090505160208101604052600081526200007d5a620000776200045e565b620000c1565b620000896001620000fb565b620000948262000128565b600081511115620000b857620000b68282620001b360201b620006571760201c565b505b50505062000699565b806000600181620000d1620004ba565b816001600160a01b0302191690836001600160a01b0316021790620000f562000507565b50505050565b7fbda29a71b071b5186c5d8e6da103f558f3634a21a2bf6ca8c2f8a0b79a84eae38181620000f562000507565b6200013e81620001e260201b6200067a1760201c565b620001865760405162461bcd60e51b8152600401808060200182810382526036815260200180620015ea603691396040019150506040518091039062000183620003f1565b50505b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181620000f562000507565b6060620001d98383604051606081016040526027808252620015c36020830139620001f9565b90505b92915050565b60008082620001f062000556565b15159392505050565b60606200020684620001e2565b6200024e5760405162461bcd60e51b81526004018080602001828103825260268152602001806200162060269139604001915050604051809103906200024b620003f1565b50505b60006060856001600160a01b0316856040518082805190602001908083835b602083106200028e5780518252601f1990920191602091820191016200026d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855a620002c8620005a3565b50505050509150503d8060008114620002fe576040513d603f01601f191681016040523d815291503d6000602084013e62000303565b606091505b5090925090506200031682828662000322565b925050505b9392505050565b60608315620003335750816200031b565b6000835111156200035857825180846020016200034f620003f1565b5050506200031b565b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620003a45780820151838201526020016200038a565b50505050905090810190601f168015620003d25780820380516001836020036101000a031916815260200191505b509250505060405180910390620003e8620003f1565b50509392505050565b632a2a7adb598160e01b8152600481016020815285602082015260005b868110156200042b5780860151828201604001526020016200040e565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015620004b5576000828201526020016200049c565b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b805160008252935060206200049c565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b6000815260206200049c565b638435035b598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b805160008252935060206200049c565b63ffe73914598160e01b8152620005d7565b8080831115620001dc575090919050565b8080831015620001dc575090919050565b836004820152846024820152606060448201528660648201526084810160005b8881101562000611578088015182820152602001620005f7565b506060828960a40184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b815160408301513d6000853e8b8b82606087013350600060045af15059620006688d3d620005c6565b8c01620006768187620005b5565b5b828110156200068d576000815260200162000677565b50929c50505050505050565b610f1a80620006a96000396000f3fe6080604052600436106100855760003560e01c80630a7569831461009c5780635c60da1b146100ba5780636b14daf8146100f457806379ba5097146101f55780638038e4a1146102135780638823da6c146102315780638da5cb5b14610276578063a118f24914610294578063dc7f0124146102d9578063f2fde38b146102f757610094565b366100945761009261033c565b005b61009261033c565b3480156100b1576000806100ae610c1b565b50505b50610092610356565b3480156100cf576000806100cc610c1b565b50505b506100d86103ac565b6040516001600160a01b03909116815260200160405180910390f35b34801561010957600080610106610c1b565b50505b506101e16004803603604081101561012957600080610126610c1b565b50505b6001600160a01b038235169190810190604081016020820135600160201b81111561015c57600080610159610c1b565b50505b82018360208201111561017757600080610174610c1b565b50505b803590602001918460018302840111600160201b831117156101a15760008061019e610c1b565b50505b91908080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152509295506103bb945050505050565b604051901515815260200160405180910390f35b34801561020a57600080610207610c1b565b50505b506100926103e2565b34801561022857600080610225610c1b565b50505b506100926104ca565b34801561024657600080610243610c1b565b50505b506100926004803603602081101561026657600080610263610c1b565b50505b50356001600160a01b031661051a565b34801561028b57600080610288610c1b565b50505b506100d8610580565b3480156102a9576000806102a6610c1b565b50505b50610092600480360360208110156102c9576000806102c6610c1b565b50505b50356001600160a01b031661058a565b3480156102ee576000806102eb610c1b565b50505b506101e16105ee565b34801561030c57600080610309610c1b565b50505b506100926004803603602081101561032c57600080610329610c1b565b50505b50356001600160a01b03166105f8565b61034461068f565b61035461034f6107e8565b61081a565b565b6103675a610362610c86565b610857565b61036f6108c2565b156103545761037e60006108dc565b7f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963860405160405180910390a1565b60006103b66107e8565b905090565b60006103c783836108fb565b806103d957506001600160a01b038316155b90505b92915050565b6103ea61091c565b6001600160a01b03165a6103fc610c86565b6001600160a01b0316146104585760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015260640160405180910390610455610c1b565b50505b600061046261093e565b90506104755a610470610c86565b61094a565b61047f600061097a565b5a610488610c86565b6001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6104d65a610362610c86565b6104de6108c2565b610354576104ec60016108dc565b7faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348060405160405180910390a1565b6105265a610362610c86565b61052f81610987565b1561057d5761053f8160006109ca565b7f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d1816040516001600160a01b03909116815260200160405180910390a15b50565b60006103b661093e565b6105965a610362610c86565b61059f81610987565b61057d576105ae8160016109ca565b7f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db4816040516001600160a01b03909116815260200160405180910390a150565b60006103b66108c2565b6106045a610362610c86565b61060d8161097a565b806001600160a01b031661061f61093e565b6001600160a01b03167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127860405160405180910390a350565b60606103d98383604051606081016040526027808252610ecd6020830139610a19565b60008082610686610cdb565b15159392505050565b600080356001600160e01b031916639a6fc8f560e01b14806106c357506000356001600160e01b031916633fabe5a360e21b145b806106e057506000356001600160e01b0319166350d25bcd60e01b145b806106fd57506000356001600160e01b031916633345078160e11b145b8061071a57506000356001600160e01b031916634102dfb560e11b145b8061073757506000356001600160e01b031916632d6ad63760e21b145b8061075457506000356001600160e01b031916632d8cd88360e21b145b1561057d576107a15a610765610c86565b6000368080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152506103bb92505050565b61057d5760405162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b6044820152606401604051809103906107e3610c1b565b505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80610814610d27565b91505090565b3660008037600080366000845a61082f610d73565b50505050503d6000803e808015610845573d6000f35b3d6000610850610c1b565b5050505050565b61085f61093e565b6001600160a01b0316816001600160a01b03161461057d5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401604051809103906107e3610c1b565b6000600080516020610ead83398151915280610814610d27565b600080516020610ead83398151915281816108f5610e5e565b50505050565b600061090683610987565b806103d957506109146108c2565b159392505050565b6000806001610929610d27565b906101000a90046001600160a01b0316905090565b60008080610929610d27565b806000600181610958610d27565b816001600160a01b0302191690836001600160a01b03160217906108f5610e5e565b8060018080610958610d27565b600080610992610b33565b6001600160a01b03841660009081526020829052909150604090206000906109b8610d27565b906101000a900460ff16915050919050565b60006109d4610b33565b6001600160a01b038416600090815260208290529091508290604090206001816109fc610d27565b8160ff02191690831515021790610a11610e5e565b505050505050565b6060610a248461067a565b610a685760405162461bcd60e51b8152600401808060200182810382526026815260200180610ef46026913960400191505060405180910390610a65610c1b565b50505b60006060856001600160a01b0316856040518082805190602001908083835b60208310610aa65780518252601f199092019160209182019101610a87565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855a610ade610d73565b50505050509150503d8060008114610b12576040513d603f01601f191681016040523d815291503d6000602084013e610b17565b606091505b5091509150610b27828286610b57565b925050505b9392505050565b7f898499e8ccc785a26f6835e2e9c2670e80cd294b0093a941a26f7925ed9395c390565b60608315610b66575081610b2c565b600083511115610b875782518084602001610b7f610c1b565b505050610b2c565b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610bd1578082015183820152602001610bb9565b50505050905090810190601f168015610bfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390610c12610c1b565b50509392505050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c53578086015182820160400152602001610c38565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b60408110156107e357600082820152602001610cc4565b638435035b598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020610cc4565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020610cc4565b63ffe73914598160e01b8152610da4565b80808311156103dc575090919050565b80808310156103dc575090919050565b836004820152846024820152606060448201528660648201526084810160005b88811015610ddc578088015182820152602001610dc4565b506060828960a40184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b815160408301513d6000853e8b8b82606087013350600060045af15059610e318d3d610d94565b8c01610e3d8187610d84565b5b82811015610e525760008152602001610e3e565b50929c50505050505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b600081526020610cc456febda29a71b071b5186c5d8e6da103f558f3634a21a2bf6ca8c2f8a0b79a84eae3416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6e7472616374416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65645570677261646561626c6550726f78793a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6e7472616374",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x1C JUMPI PUSH1 0x0 DUP1 PUSH3 0x19 PUSH3 0x3F1 JUMP JUMPDEST POP POP JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1646 CODESIZE SUB DUP1 PUSH3 0x1646 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x4D JUMPI PUSH1 0x0 DUP1 PUSH3 0x4A PUSH3 0x3F1 JUMP JUMPDEST POP POP JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP3 POP DUP3 SWAP2 POP PUSH1 0x40 SWAP1 POP MLOAD PUSH1 0x20 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH3 0x7D GAS PUSH3 0x77 PUSH3 0x45E JUMP JUMPDEST PUSH3 0xC1 JUMP JUMPDEST PUSH3 0x89 PUSH1 0x1 PUSH3 0xFB JUMP JUMPDEST PUSH3 0x94 DUP3 PUSH3 0x128 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH3 0xB8 JUMPI PUSH3 0xB6 DUP3 DUP3 PUSH3 0x1B3 PUSH1 0x20 SHL PUSH3 0x657 OR PUSH1 0x20 SHR JUMP JUMPDEST POP JUMPDEST POP POP POP PUSH3 0x699 JUMP JUMPDEST DUP1 PUSH1 0x0 PUSH1 0x1 DUP2 PUSH3 0xD1 PUSH3 0x4BA JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND MUL OR SWAP1 PUSH3 0xF5 PUSH3 0x507 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0xBDA29A71B071B5186C5D8E6DA103F558F3634A21A2BF6CA8C2F8A0B79A84EAE3 DUP2 DUP2 PUSH3 0xF5 PUSH3 0x507 JUMP JUMPDEST PUSH3 0x13E DUP2 PUSH3 0x1E2 PUSH1 0x20 SHL PUSH3 0x67A OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0x186 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x15EA PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH3 0x183 PUSH3 0x3F1 JUMP JUMPDEST POP POP JUMPDEST PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP2 DUP2 PUSH3 0xF5 PUSH3 0x507 JUMP JUMPDEST PUSH1 0x60 PUSH3 0x1D9 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x60 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x27 DUP1 DUP3 MSTORE PUSH3 0x15C3 PUSH1 0x20 DUP4 ADD CODECOPY PUSH3 0x1F9 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 PUSH3 0x1F0 PUSH3 0x556 JUMP JUMPDEST ISZERO ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH3 0x206 DUP5 PUSH3 0x1E2 JUMP JUMPDEST PUSH3 0x24E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x1620 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH3 0x24B PUSH3 0x3F1 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x28E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x26D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS PUSH3 0x2C8 PUSH3 0x5A3 JUMP JUMPDEST POP POP POP POP POP SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH3 0x2FE JUMPI PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x3F ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP2 MSTORE SWAP2 POP RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH3 0x303 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH3 0x316 DUP3 DUP3 DUP7 PUSH3 0x322 JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH3 0x333 JUMPI POP DUP2 PUSH3 0x31B JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD GT ISZERO PUSH3 0x358 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD PUSH3 0x34F PUSH3 0x3F1 JUMP JUMPDEST POP POP POP PUSH3 0x31B JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x3A4 JUMPI DUP1 DUP3 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x38A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH3 0x3D2 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH3 0x3E8 PUSH3 0x3F1 JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH4 0x2A2A7ADB MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD PUSH1 0x20 DUP2 MSTORE DUP6 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH3 0x42B JUMPI DUP1 DUP7 ADD MLOAD DUP3 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x40E JUMP JUMPDEST POP PUSH1 0x20 DUP3 DUP8 PUSH1 0x64 ADD DUP5 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0x73509064 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST DUP1 MLOAD SWAP4 POP PUSH1 0x0 JUMPDEST PUSH1 0x40 DUP2 LT ISZERO PUSH3 0x4B5 JUMPI PUSH1 0x0 DUP3 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x49C JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0x3DAA959 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST DUP1 MLOAD PUSH1 0x0 DUP3 MSTORE SWAP4 POP PUSH1 0x20 PUSH3 0x49C JUMP JUMPDEST PUSH4 0x22BD64C0 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP2 PUSH1 0x44 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 PUSH3 0x49C JUMP JUMPDEST PUSH4 0x8435035B MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST DUP1 MLOAD PUSH1 0x0 DUP3 MSTORE SWAP4 POP PUSH1 0x20 PUSH3 0x49C JUMP JUMPDEST PUSH4 0xFFE73914 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH3 0x5D7 JUMP JUMPDEST DUP1 DUP1 DUP4 GT ISZERO PUSH3 0x1DC JUMPI POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 DUP1 DUP4 LT ISZERO PUSH3 0x1DC JUMPI POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x44 DUP3 ADD MSTORE DUP7 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 DUP2 ADD PUSH1 0x0 JUMPDEST DUP9 DUP2 LT ISZERO PUSH3 0x611 JUMPI DUP1 DUP9 ADD MLOAD DUP3 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x5F7 JUMP JUMPDEST POP PUSH1 0x60 DUP3 DUP10 PUSH1 0xA4 ADD DUP5 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP4 ADD MLOAD RETURNDATASIZE PUSH1 0x0 DUP6 RETURNDATACOPY DUP12 DUP12 DUP3 PUSH1 0x60 DUP8 ADD CALLER POP PUSH1 0x0 PUSH1 0x4 GAS CALL POP MSIZE PUSH3 0x668 DUP14 RETURNDATASIZE PUSH3 0x5C6 JUMP JUMPDEST DUP13 ADD PUSH3 0x676 DUP2 DUP8 PUSH3 0x5B5 JUMP JUMPDEST JUMPDEST DUP3 DUP2 LT ISZERO PUSH3 0x68D JUMPI PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0x677 JUMP JUMPDEST POP SWAP3 SWAP13 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xF1A DUP1 PUSH3 0x6A9 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x85 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA756983 EQ PUSH2 0x9C JUMPI DUP1 PUSH4 0x5C60DA1B EQ PUSH2 0xBA JUMPI DUP1 PUSH4 0x6B14DAF8 EQ PUSH2 0xF4 JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0x1F5 JUMPI DUP1 PUSH4 0x8038E4A1 EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0x8823DA6C EQ PUSH2 0x231 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0xA118F249 EQ PUSH2 0x294 JUMPI DUP1 PUSH4 0xDC7F0124 EQ PUSH2 0x2D9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x2F7 JUMPI PUSH2 0x94 JUMP JUMPDEST CALLDATASIZE PUSH2 0x94 JUMPI PUSH2 0x92 PUSH2 0x33C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x92 PUSH2 0x33C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB1 JUMPI PUSH1 0x0 DUP1 PUSH2 0xAE PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH2 0x356 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCF JUMPI PUSH1 0x0 DUP1 PUSH2 0xCC PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0xD8 PUSH2 0x3AC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x109 JUMPI PUSH1 0x0 DUP1 PUSH2 0x106 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x1E1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x129 JUMPI PUSH1 0x0 DUP1 PUSH2 0x126 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x15C JUMPI PUSH1 0x0 DUP1 PUSH2 0x159 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x177 JUMPI PUSH1 0x0 DUP1 PUSH2 0x174 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x1A1 JUMPI PUSH1 0x0 DUP1 PUSH2 0x19E PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 SWAP1 PUSH1 0x20 DUP5 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x3BB SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20A JUMPI PUSH1 0x0 DUP1 PUSH2 0x207 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH2 0x3E2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 PUSH2 0x225 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH2 0x4CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x246 JUMPI PUSH1 0x0 DUP1 PUSH2 0x243 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x266 JUMPI PUSH1 0x0 DUP1 PUSH2 0x263 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x51A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28B JUMPI PUSH1 0x0 DUP1 PUSH2 0x288 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0xD8 PUSH2 0x580 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A9 JUMPI PUSH1 0x0 DUP1 PUSH2 0x2A6 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C9 JUMPI PUSH1 0x0 DUP1 PUSH2 0x2C6 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x58A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EE JUMPI PUSH1 0x0 DUP1 PUSH2 0x2EB PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x1E1 PUSH2 0x5EE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 PUSH2 0x309 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x32C JUMPI PUSH1 0x0 DUP1 PUSH2 0x329 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x5F8 JUMP JUMPDEST PUSH2 0x344 PUSH2 0x68F JUMP JUMPDEST PUSH2 0x354 PUSH2 0x34F PUSH2 0x7E8 JUMP JUMPDEST PUSH2 0x81A JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x367 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x857 JUMP JUMPDEST PUSH2 0x36F PUSH2 0x8C2 JUMP JUMPDEST ISZERO PUSH2 0x354 JUMPI PUSH2 0x37E PUSH1 0x0 PUSH2 0x8DC JUMP JUMPDEST PUSH32 0x3BE8A977A014527B50AE38ADDA80B56911C267328965C98DDC385D248F539638 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B6 PUSH2 0x7E8 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3C7 DUP4 DUP4 PUSH2 0x8FB JUMP JUMPDEST DUP1 PUSH2 0x3D9 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3EA PUSH2 0x91C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND GAS PUSH2 0x3FC PUSH2 0xC86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x458 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x26BAB9BA10313290383937B837B9B2B21037BBB732B9 PUSH1 0x51 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0x455 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x0 PUSH2 0x462 PUSH2 0x93E JUMP JUMPDEST SWAP1 POP PUSH2 0x475 GAS PUSH2 0x470 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x94A JUMP JUMPDEST PUSH2 0x47F PUSH1 0x0 PUSH2 0x97A JUMP JUMPDEST GAS PUSH2 0x488 PUSH2 0xC86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH2 0x4D6 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x4DE PUSH2 0x8C2 JUMP JUMPDEST PUSH2 0x354 JUMPI PUSH2 0x4EC PUSH1 0x1 PUSH2 0x8DC JUMP JUMPDEST PUSH32 0xAEBF329500988C6488A0074E5A0A9FF304561FC5C6FC877AEB1D59C8282C3480 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH2 0x526 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x52F DUP2 PUSH2 0x987 JUMP JUMPDEST ISZERO PUSH2 0x57D JUMPI PUSH2 0x53F DUP2 PUSH1 0x0 PUSH2 0x9CA JUMP JUMPDEST PUSH32 0x3D68A6FCE901D20453D1A7AA06BF3950302A735948037DEB182A8DB66DF2A0D1 DUP2 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B6 PUSH2 0x93E JUMP JUMPDEST PUSH2 0x596 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x59F DUP2 PUSH2 0x987 JUMP JUMPDEST PUSH2 0x57D JUMPI PUSH2 0x5AE DUP2 PUSH1 0x1 PUSH2 0x9CA JUMP JUMPDEST PUSH32 0x87286AD1F399C8E82BF0C4EF4FCDC570EA2E1E92176E5C848B6413545B885DB4 DUP2 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B6 PUSH2 0x8C2 JUMP JUMPDEST PUSH2 0x604 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x60D DUP2 PUSH2 0x97A JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x61F PUSH2 0x93E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xED8889F560326EB138920D842192F0EB3DD22B4F139C87A2C57538E05BAE1278 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3D9 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x60 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x27 DUP1 DUP3 MSTORE PUSH2 0xECD PUSH1 0x20 DUP4 ADD CODECOPY PUSH2 0xA19 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 PUSH2 0x686 PUSH2 0xCDB JUMP JUMPDEST ISZERO ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x9A6FC8F5 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x6C3 JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x3FABE5A3 PUSH1 0xE2 SHL EQ JUMPDEST DUP1 PUSH2 0x6E0 JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x50D25BCD PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x6FD JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x33450781 PUSH1 0xE1 SHL EQ JUMPDEST DUP1 PUSH2 0x71A JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x4102DFB5 PUSH1 0xE1 SHL EQ JUMPDEST DUP1 PUSH2 0x737 JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x2D6AD637 PUSH1 0xE2 SHL EQ JUMPDEST DUP1 PUSH2 0x754 JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x2D8CD883 PUSH1 0xE2 SHL EQ JUMPDEST ISZERO PUSH2 0x57D JUMPI PUSH2 0x7A1 GAS PUSH2 0x765 PUSH2 0xC86 JUMP JUMPDEST PUSH1 0x0 CALLDATASIZE DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 SWAP1 PUSH1 0x20 DUP5 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x3BB SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x57D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x4E6F20616363657373 PUSH1 0xB8 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0x7E3 PUSH2 0xC1B JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 PUSH2 0x814 PUSH2 0xD27 JUMP JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS PUSH2 0x82F PUSH2 0xD73 JUMP JUMPDEST POP POP POP POP POP RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0x845 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 PUSH2 0x850 PUSH2 0xC1B JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x85F PUSH2 0x93E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x57D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x27B7363C9031B0B63630B1363290313C9037BBB732B9 PUSH1 0x51 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0x7E3 PUSH2 0xC1B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xEAD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP1 PUSH2 0x814 PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xEAD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP2 DUP2 PUSH2 0x8F5 PUSH2 0xE5E JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x906 DUP4 PUSH2 0x987 JUMP JUMPDEST DUP1 PUSH2 0x3D9 JUMPI POP PUSH2 0x914 PUSH2 0x8C2 JUMP JUMPDEST ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH2 0x929 PUSH2 0xD27 JUMP JUMPDEST SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH2 0x929 PUSH2 0xD27 JUMP JUMPDEST DUP1 PUSH1 0x0 PUSH1 0x1 DUP2 PUSH2 0x958 PUSH2 0xD27 JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND MUL OR SWAP1 PUSH2 0x8F5 PUSH2 0xE5E JUMP JUMPDEST DUP1 PUSH1 0x1 DUP1 DUP1 PUSH2 0x958 PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x992 PUSH2 0xB33 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE SWAP1 SWAP2 POP PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x0 SWAP1 PUSH2 0x9B8 PUSH2 0xD27 JUMP JUMPDEST SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9D4 PUSH2 0xB33 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE SWAP1 SWAP2 POP DUP3 SWAP1 PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 DUP2 PUSH2 0x9FC PUSH2 0xD27 JUMP JUMPDEST DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 PUSH2 0xA11 PUSH2 0xE5E JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA24 DUP5 PUSH2 0x67A JUMP JUMPDEST PUSH2 0xA68 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xEF4 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0xA65 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xAA6 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA87 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS PUSH2 0xADE PUSH2 0xD73 JUMP JUMPDEST POP POP POP POP POP SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xB12 JUMPI PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x3F ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP2 MSTORE SWAP2 POP RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xB17 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0xB27 DUP3 DUP3 DUP7 PUSH2 0xB57 JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x898499E8CCC785A26F6835E2E9C2670E80CD294B0093A941A26F7925ED9395C3 SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0xB66 JUMPI POP DUP2 PUSH2 0xB2C JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD GT ISZERO PUSH2 0xB87 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD PUSH2 0xB7F PUSH2 0xC1B JUMP JUMPDEST POP POP POP PUSH2 0xB2C JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBD1 JUMPI DUP1 DUP3 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xBB9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xBFE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0xC12 PUSH2 0xC1B JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH4 0x2A2A7ADB MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD PUSH1 0x20 DUP2 MSTORE DUP6 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xC53 JUMPI DUP1 DUP7 ADD MLOAD DUP3 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xC38 JUMP JUMPDEST POP PUSH1 0x20 DUP3 DUP8 PUSH1 0x64 ADD DUP5 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0x73509064 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST DUP1 MLOAD SWAP4 POP PUSH1 0x0 JUMPDEST PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7E3 JUMPI PUSH1 0x0 DUP3 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCC4 JUMP JUMPDEST PUSH4 0x8435035B MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST DUP1 MLOAD PUSH1 0x0 DUP3 MSTORE SWAP4 POP PUSH1 0x20 PUSH2 0xCC4 JUMP JUMPDEST PUSH4 0x3DAA959 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST DUP1 MLOAD PUSH1 0x0 DUP3 MSTORE SWAP4 POP PUSH1 0x20 PUSH2 0xCC4 JUMP JUMPDEST PUSH4 0xFFE73914 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH2 0xDA4 JUMP JUMPDEST DUP1 DUP1 DUP4 GT ISZERO PUSH2 0x3DC JUMPI POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 DUP1 DUP4 LT ISZERO PUSH2 0x3DC JUMPI POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x44 DUP3 ADD MSTORE DUP7 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 DUP2 ADD PUSH1 0x0 JUMPDEST DUP9 DUP2 LT ISZERO PUSH2 0xDDC JUMPI DUP1 DUP9 ADD MLOAD DUP3 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDC4 JUMP JUMPDEST POP PUSH1 0x60 DUP3 DUP10 PUSH1 0xA4 ADD DUP5 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP4 ADD MLOAD RETURNDATASIZE PUSH1 0x0 DUP6 RETURNDATACOPY DUP12 DUP12 DUP3 PUSH1 0x60 DUP8 ADD CALLER POP PUSH1 0x0 PUSH1 0x4 GAS CALL POP MSIZE PUSH2 0xE31 DUP14 RETURNDATASIZE PUSH2 0xD94 JUMP JUMPDEST DUP13 ADD PUSH2 0xE3D DUP2 DUP8 PUSH2 0xD84 JUMP JUMPDEST JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0xE52 JUMPI PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3E JUMP JUMPDEST POP SWAP3 SWAP13 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0x22BD64C0 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP2 PUSH1 0x44 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0xE ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x1 EQ ISZERO PC PUSH1 0xA ADD JUMPI PUSH1 0x1 PUSH1 0x0 RETURN JUMPDEST PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 PUSH2 0xCC4 JUMP INVALID 0xBD LOG2 SWAP11 PUSH18 0xB071B5186C5D8E6DA103F558F3634A21A2BF PUSH13 0xA8C2F8A0B79A84EAE341646472 PUSH6 0x73733A206C6F PUSH24 0x2D6C6576656C2064656C65676174652063616C6C20666169 PUSH13 0x6564416464726573733A206465 PUSH13 0x65676174652063616C6C20746F KECCAK256 PUSH15 0x6F6E2D636F6E747261637441646472 PUSH6 0x73733A206C6F PUSH24 0x2D6C6576656C2064656C65676174652063616C6C20666169 PUSH13 0x65645570677261646561626C65 POP PUSH19 0x6F78793A206E657720696D706C656D656E7461 PUSH21 0x696F6E206973206E6F74206120636F6E7472616374 COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH5 0x656C656761 PUSH21 0x652063616C6C20746F206E6F6E2D636F6E74726163 PUSH21 0x0 ",
"sourceMap": "435:2061:0:-:0;;;1221:107;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;1221:107:0;;-1:-1:-1;1019:309:41;;-1:-1:-1;1019:309:41;;;;;;;;;446:21:11;456:10;;;:::i;:::-;446:9;:21::i;:::-;1526:22:17;1543:4;1526:16;:22::i;:::-;1197:26:41;1216:6;1197:18;:26::i;:::-;1251:1;1236:5;:12;:16;1233:89;;;1268:43;1297:6;1305:5;1268:28;;;;;:43;;:::i;:::-;;1233:89;1019:309;;1221:107:0;435:2061;;1438:88:11;1513:8;1498:12;:23;:12;:23;;:::i;:::-;;-1:-1:-1;;;;;1498:23:11;;;;;-1:-1:-1;;;;;1498:23:11;;;;;;:::i;:::-;;;;1438:88;:::o;3528:222:17:-;718:66;3727:12;718:66;3714:26;;:::i;2492:360:41:-;2573:37;2592:17;2573:18;;;;;:37;;:::i;:::-;2565:104;;;;-1:-1:-1;;;2565:104:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1727:66;2818:17;1727:66;2805:31;;:::i;6284:198:42:-;6367:12;6398:77;6419:6;6427:4;6398:77;;;;;;;;;;;;;;;;:20;:77::i;:::-;6391:84;;6284:198;;;;;:::o;726:413::-;786:4;989:12;1098:7;1086:20;;:::i;:::-;1124:8;;;726:413;-1:-1:-1;;;726:413:42:o;6668:417::-;6779:12;6811:18;6822:6;6811:10;:18::i;:::-;6803:69;;;;-1:-1:-1;;;6803:69:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;6943:12;6957:23;6984:6;-1:-1:-1;;;;;6984:19:42;7004:4;6984:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6984:25:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6984:25:42;;;;;;;;;-1:-1:-1;6984:25:42;;;;;;;;;;;;;-1:-1:-1;6942:67:42;;-1:-1:-1;6942:67:42;-1:-1:-1;7026:52:42;6942:67;;7065:12;7026:17;:52::i;:::-;7019:59;;;;6668:417;;;;;;:::o;7091:725::-;7206:12;7234:7;7230:580;;;-1:-1:-1;7264:10:42;7257:17;;7230:580;7395:1;7375:10;:17;:21;7371:429;;;7633:10;7627:17;7693:15;7680:10;7676:2;7672:19;7665:44;;:::i;:::-;;;;7582:145;;;7772:12;7765:20;;-1:-1:-1;;;7765:20:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;7091:725;;;;;:::o;435:2061:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;435:2061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;435:2061:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;435:2061:0;;;-1:-1:-1;435:2061:0:o;:::-;;;;;;;;-1:-1:-1;435:2061:0;;;-1:-1:-1;435:2061:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;435:2061:0;;-1:-1:-1;;;;;;;435:2061:0:o;:::-;;;;;;;"
},
"deployedBytecode": {
"immutableReferences": {},
"linkReferences": {},
"object": "0x6080604052600436106100855760003560e01c80630a7569831461009c5780635c60da1b146100ba5780636b14daf8146100f457806379ba5097146101f55780638038e4a1146102135780638823da6c146102315780638da5cb5b14610276578063a118f24914610294578063dc7f0124146102d9578063f2fde38b146102f757610094565b366100945761009261033c565b005b61009261033c565b3480156100b1576000806100ae610c1b565b50505b50610092610356565b3480156100cf576000806100cc610c1b565b50505b506100d86103ac565b6040516001600160a01b03909116815260200160405180910390f35b34801561010957600080610106610c1b565b50505b506101e16004803603604081101561012957600080610126610c1b565b50505b6001600160a01b038235169190810190604081016020820135600160201b81111561015c57600080610159610c1b565b50505b82018360208201111561017757600080610174610c1b565b50505b803590602001918460018302840111600160201b831117156101a15760008061019e610c1b565b50505b91908080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152509295506103bb945050505050565b604051901515815260200160405180910390f35b34801561020a57600080610207610c1b565b50505b506100926103e2565b34801561022857600080610225610c1b565b50505b506100926104ca565b34801561024657600080610243610c1b565b50505b506100926004803603602081101561026657600080610263610c1b565b50505b50356001600160a01b031661051a565b34801561028b57600080610288610c1b565b50505b506100d8610580565b3480156102a9576000806102a6610c1b565b50505b50610092600480360360208110156102c9576000806102c6610c1b565b50505b50356001600160a01b031661058a565b3480156102ee576000806102eb610c1b565b50505b506101e16105ee565b34801561030c57600080610309610c1b565b50505b506100926004803603602081101561032c57600080610329610c1b565b50505b50356001600160a01b03166105f8565b61034461068f565b61035461034f6107e8565b61081a565b565b6103675a610362610c86565b610857565b61036f6108c2565b156103545761037e60006108dc565b7f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963860405160405180910390a1565b60006103b66107e8565b905090565b60006103c783836108fb565b806103d957506001600160a01b038316155b90505b92915050565b6103ea61091c565b6001600160a01b03165a6103fc610c86565b6001600160a01b0316146104585760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015260640160405180910390610455610c1b565b50505b600061046261093e565b90506104755a610470610c86565b61094a565b61047f600061097a565b5a610488610c86565b6001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6104d65a610362610c86565b6104de6108c2565b610354576104ec60016108dc565b7faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348060405160405180910390a1565b6105265a610362610c86565b61052f81610987565b1561057d5761053f8160006109ca565b7f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d1816040516001600160a01b03909116815260200160405180910390a15b50565b60006103b661093e565b6105965a610362610c86565b61059f81610987565b61057d576105ae8160016109ca565b7f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db4816040516001600160a01b03909116815260200160405180910390a150565b60006103b66108c2565b6106045a610362610c86565b61060d8161097a565b806001600160a01b031661061f61093e565b6001600160a01b03167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127860405160405180910390a350565b60606103d98383604051606081016040526027808252610ecd6020830139610a19565b60008082610686610cdb565b15159392505050565b600080356001600160e01b031916639a6fc8f560e01b14806106c357506000356001600160e01b031916633fabe5a360e21b145b806106e057506000356001600160e01b0319166350d25bcd60e01b145b806106fd57506000356001600160e01b031916633345078160e11b145b8061071a57506000356001600160e01b031916634102dfb560e11b145b8061073757506000356001600160e01b031916632d6ad63760e21b145b8061075457506000356001600160e01b031916632d8cd88360e21b145b1561057d576107a15a610765610c86565b6000368080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152506103bb92505050565b61057d5760405162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b6044820152606401604051809103906107e3610c1b565b505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80610814610d27565b91505090565b3660008037600080366000845a61082f610d73565b50505050503d6000803e808015610845573d6000f35b3d6000610850610c1b565b5050505050565b61085f61093e565b6001600160a01b0316816001600160a01b03161461057d5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401604051809103906107e3610c1b565b6000600080516020610ead83398151915280610814610d27565b600080516020610ead83398151915281816108f5610e5e565b50505050565b600061090683610987565b806103d957506109146108c2565b159392505050565b6000806001610929610d27565b906101000a90046001600160a01b0316905090565b60008080610929610d27565b806000600181610958610d27565b816001600160a01b0302191690836001600160a01b03160217906108f5610e5e565b8060018080610958610d27565b600080610992610b33565b6001600160a01b03841660009081526020829052909150604090206000906109b8610d27565b906101000a900460ff16915050919050565b60006109d4610b33565b6001600160a01b038416600090815260208290529091508290604090206001816109fc610d27565b8160ff02191690831515021790610a11610e5e565b505050505050565b6060610a248461067a565b610a685760405162461bcd60e51b8152600401808060200182810382526026815260200180610ef46026913960400191505060405180910390610a65610c1b565b50505b60006060856001600160a01b0316856040518082805190602001908083835b60208310610aa65780518252601f199092019160209182019101610a87565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855a610ade610d73565b50505050509150503d8060008114610b12576040513d603f01601f191681016040523d815291503d6000602084013e610b17565b606091505b5091509150610b27828286610b57565b925050505b9392505050565b7f898499e8ccc785a26f6835e2e9c2670e80cd294b0093a941a26f7925ed9395c390565b60608315610b66575081610b2c565b600083511115610b875782518084602001610b7f610c1b565b505050610b2c565b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610bd1578082015183820152602001610bb9565b50505050905090810190601f168015610bfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390610c12610c1b565b50509392505050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c53578086015182820160400152602001610c38565b506020828760640184336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52505050565b6373509064598160e01b8152602081600483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c528051935060005b60408110156107e357600082820152602001610cc4565b638435035b598160e01b8152836004820152602081602483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c5280516000825293506020610cc4565b6303daa959598160e01b8152836004820152602081602483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c5280516000825293506020610cc4565b63ffe73914598160e01b8152610da4565b80808311156103dc575090919050565b80808310156103dc575090919050565b836004820152846024820152606060448201528660648201526084810160005b88811015610ddc578088015182820152602001610dc4565b506060828960a40184336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52815160408301513d6000853e8b8b82606087013350600060045af15059610e318d3d610d94565b8c01610e3d8187610d84565b5b82811015610e525760008152602001610e3e565b50929c50505050505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52600081526020610cc456febda29a71b071b5186c5d8e6da103f558f3634a21a2bf6ca8c2f8a0b79a84eae3416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6e7472616374",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x85 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA756983 EQ PUSH2 0x9C JUMPI DUP1 PUSH4 0x5C60DA1B EQ PUSH2 0xBA JUMPI DUP1 PUSH4 0x6B14DAF8 EQ PUSH2 0xF4 JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0x1F5 JUMPI DUP1 PUSH4 0x8038E4A1 EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0x8823DA6C EQ PUSH2 0x231 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0xA118F249 EQ PUSH2 0x294 JUMPI DUP1 PUSH4 0xDC7F0124 EQ PUSH2 0x2D9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x2F7 JUMPI PUSH2 0x94 JUMP JUMPDEST CALLDATASIZE PUSH2 0x94 JUMPI PUSH2 0x92 PUSH2 0x33C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x92 PUSH2 0x33C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB1 JUMPI PUSH1 0x0 DUP1 PUSH2 0xAE PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH2 0x356 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCF JUMPI PUSH1 0x0 DUP1 PUSH2 0xCC PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0xD8 PUSH2 0x3AC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x109 JUMPI PUSH1 0x0 DUP1 PUSH2 0x106 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x1E1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x129 JUMPI PUSH1 0x0 DUP1 PUSH2 0x126 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x15C JUMPI PUSH1 0x0 DUP1 PUSH2 0x159 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x177 JUMPI PUSH1 0x0 DUP1 PUSH2 0x174 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x1A1 JUMPI PUSH1 0x0 DUP1 PUSH2 0x19E PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 SWAP1 PUSH1 0x20 DUP5 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x3BB SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20A JUMPI PUSH1 0x0 DUP1 PUSH2 0x207 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH2 0x3E2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 PUSH2 0x225 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH2 0x4CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x246 JUMPI PUSH1 0x0 DUP1 PUSH2 0x243 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x266 JUMPI PUSH1 0x0 DUP1 PUSH2 0x263 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x51A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28B JUMPI PUSH1 0x0 DUP1 PUSH2 0x288 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0xD8 PUSH2 0x580 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A9 JUMPI PUSH1 0x0 DUP1 PUSH2 0x2A6 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C9 JUMPI PUSH1 0x0 DUP1 PUSH2 0x2C6 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x58A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EE JUMPI PUSH1 0x0 DUP1 PUSH2 0x2EB PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x1E1 PUSH2 0x5EE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 PUSH2 0x309 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP PUSH2 0x92 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x32C JUMPI PUSH1 0x0 DUP1 PUSH2 0x329 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x5F8 JUMP JUMPDEST PUSH2 0x344 PUSH2 0x68F JUMP JUMPDEST PUSH2 0x354 PUSH2 0x34F PUSH2 0x7E8 JUMP JUMPDEST PUSH2 0x81A JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x367 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x857 JUMP JUMPDEST PUSH2 0x36F PUSH2 0x8C2 JUMP JUMPDEST ISZERO PUSH2 0x354 JUMPI PUSH2 0x37E PUSH1 0x0 PUSH2 0x8DC JUMP JUMPDEST PUSH32 0x3BE8A977A014527B50AE38ADDA80B56911C267328965C98DDC385D248F539638 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B6 PUSH2 0x7E8 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3C7 DUP4 DUP4 PUSH2 0x8FB JUMP JUMPDEST DUP1 PUSH2 0x3D9 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3EA PUSH2 0x91C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND GAS PUSH2 0x3FC PUSH2 0xC86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x458 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x26BAB9BA10313290383937B837B9B2B21037BBB732B9 PUSH1 0x51 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0x455 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x0 PUSH2 0x462 PUSH2 0x93E JUMP JUMPDEST SWAP1 POP PUSH2 0x475 GAS PUSH2 0x470 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x94A JUMP JUMPDEST PUSH2 0x47F PUSH1 0x0 PUSH2 0x97A JUMP JUMPDEST GAS PUSH2 0x488 PUSH2 0xC86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH2 0x4D6 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x4DE PUSH2 0x8C2 JUMP JUMPDEST PUSH2 0x354 JUMPI PUSH2 0x4EC PUSH1 0x1 PUSH2 0x8DC JUMP JUMPDEST PUSH32 0xAEBF329500988C6488A0074E5A0A9FF304561FC5C6FC877AEB1D59C8282C3480 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH2 0x526 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x52F DUP2 PUSH2 0x987 JUMP JUMPDEST ISZERO PUSH2 0x57D JUMPI PUSH2 0x53F DUP2 PUSH1 0x0 PUSH2 0x9CA JUMP JUMPDEST PUSH32 0x3D68A6FCE901D20453D1A7AA06BF3950302A735948037DEB182A8DB66DF2A0D1 DUP2 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B6 PUSH2 0x93E JUMP JUMPDEST PUSH2 0x596 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x59F DUP2 PUSH2 0x987 JUMP JUMPDEST PUSH2 0x57D JUMPI PUSH2 0x5AE DUP2 PUSH1 0x1 PUSH2 0x9CA JUMP JUMPDEST PUSH32 0x87286AD1F399C8E82BF0C4EF4FCDC570EA2E1E92176E5C848B6413545B885DB4 DUP2 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B6 PUSH2 0x8C2 JUMP JUMPDEST PUSH2 0x604 GAS PUSH2 0x362 PUSH2 0xC86 JUMP JUMPDEST PUSH2 0x60D DUP2 PUSH2 0x97A JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x61F PUSH2 0x93E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xED8889F560326EB138920D842192F0EB3DD22B4F139C87A2C57538E05BAE1278 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3D9 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x60 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x27 DUP1 DUP3 MSTORE PUSH2 0xECD PUSH1 0x20 DUP4 ADD CODECOPY PUSH2 0xA19 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 PUSH2 0x686 PUSH2 0xCDB JUMP JUMPDEST ISZERO ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x9A6FC8F5 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x6C3 JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x3FABE5A3 PUSH1 0xE2 SHL EQ JUMPDEST DUP1 PUSH2 0x6E0 JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x50D25BCD PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x6FD JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x33450781 PUSH1 0xE1 SHL EQ JUMPDEST DUP1 PUSH2 0x71A JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x4102DFB5 PUSH1 0xE1 SHL EQ JUMPDEST DUP1 PUSH2 0x737 JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x2D6AD637 PUSH1 0xE2 SHL EQ JUMPDEST DUP1 PUSH2 0x754 JUMPI POP PUSH1 0x0 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0x2D8CD883 PUSH1 0xE2 SHL EQ JUMPDEST ISZERO PUSH2 0x57D JUMPI PUSH2 0x7A1 GAS PUSH2 0x765 PUSH2 0xC86 JUMP JUMPDEST PUSH1 0x0 CALLDATASIZE DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 SWAP1 PUSH1 0x20 DUP5 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x3BB SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x57D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x4E6F20616363657373 PUSH1 0xB8 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0x7E3 PUSH2 0xC1B JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC DUP1 PUSH2 0x814 PUSH2 0xD27 JUMP JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP5 GAS PUSH2 0x82F PUSH2 0xD73 JUMP JUMPDEST POP POP POP POP POP RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH2 0x845 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 PUSH2 0x850 PUSH2 0xC1B JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x85F PUSH2 0x93E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x57D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x27B7363C9031B0B63630B1363290313C9037BBB732B9 PUSH1 0x51 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0x7E3 PUSH2 0xC1B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xEAD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP1 PUSH2 0x814 PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xEAD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP2 DUP2 PUSH2 0x8F5 PUSH2 0xE5E JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x906 DUP4 PUSH2 0x987 JUMP JUMPDEST DUP1 PUSH2 0x3D9 JUMPI POP PUSH2 0x914 PUSH2 0x8C2 JUMP JUMPDEST ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH2 0x929 PUSH2 0xD27 JUMP JUMPDEST SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH2 0x929 PUSH2 0xD27 JUMP JUMPDEST DUP1 PUSH1 0x0 PUSH1 0x1 DUP2 PUSH2 0x958 PUSH2 0xD27 JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND MUL OR SWAP1 PUSH2 0x8F5 PUSH2 0xE5E JUMP JUMPDEST DUP1 PUSH1 0x1 DUP1 DUP1 PUSH2 0x958 PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x992 PUSH2 0xB33 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE SWAP1 SWAP2 POP PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x0 SWAP1 PUSH2 0x9B8 PUSH2 0xD27 JUMP JUMPDEST SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9D4 PUSH2 0xB33 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE SWAP1 SWAP2 POP DUP3 SWAP1 PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 DUP2 PUSH2 0x9FC PUSH2 0xD27 JUMP JUMPDEST DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 PUSH2 0xA11 PUSH2 0xE5E JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA24 DUP5 PUSH2 0x67A JUMP JUMPDEST PUSH2 0xA68 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xEF4 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0xA65 PUSH2 0xC1B JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xAA6 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA87 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS PUSH2 0xADE PUSH2 0xD73 JUMP JUMPDEST POP POP POP POP POP SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xB12 JUMPI PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x3F ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP2 MSTORE SWAP2 POP RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xB17 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0xB27 DUP3 DUP3 DUP7 PUSH2 0xB57 JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x898499E8CCC785A26F6835E2E9C2670E80CD294B0093A941A26F7925ED9395C3 SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0xB66 JUMPI POP DUP2 PUSH2 0xB2C JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD GT ISZERO PUSH2 0xB87 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD PUSH2 0xB7F PUSH2 0xC1B JUMP JUMPDEST POP POP POP PUSH2 0xB2C JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBD1 JUMPI DUP1 DUP3 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xBB9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xBFE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH2 0xC12 PUSH2 0xC1B JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH4 0x2A2A7ADB MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD PUSH1 0x20 DUP2 MSTORE DUP6 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xC53 JUMPI DUP1 DUP7 ADD MLOAD DUP3 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xC38 JUMP JUMPDEST POP PUSH1 0x20 DUP3 DUP8 PUSH1 0x64 ADD DUP5 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0x1D ADD JUMPI RETURNDATASIZE PUSH1 0x1 EQ PC PUSH1 0xC ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH3 0x123456 MSTORE PUSH1 0xEA PUSH2 0x109C MSTORE POP POP POP JUMP JUMPDEST PUSH4 0x73509064 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0x1D ADD JUMPI RETURNDATASIZE PUSH1 0x1 EQ PC PUSH1 0xC ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH3 0x123456 MSTORE PUSH1 0xEA PUSH2 0x109C MSTORE DUP1 MLOAD SWAP4 POP PUSH1 0x0 JUMPDEST PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7E3 JUMPI PUSH1 0x0 DUP3 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCC4 JUMP JUMPDEST PUSH4 0x8435035B MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0x1D ADD JUMPI RETURNDATASIZE PUSH1 0x1 EQ PC PUSH1 0xC ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH3 0x123456 MSTORE PUSH1 0xEA PUSH2 0x109C MSTORE DUP1 MLOAD PUSH1 0x0 DUP3 MSTORE SWAP4 POP PUSH1 0x20 PUSH2 0xCC4 JUMP JUMPDEST PUSH4 0x3DAA959 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0x1D ADD JUMPI RETURNDATASIZE PUSH1 0x1 EQ PC PUSH1 0xC ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH3 0x123456 MSTORE PUSH1 0xEA PUSH2 0x109C MSTORE DUP1 MLOAD PUSH1 0x0 DUP3 MSTORE SWAP4 POP PUSH1 0x20 PUSH2 0xCC4 JUMP JUMPDEST PUSH4 0xFFE73914 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE PUSH2 0xDA4 JUMP JUMPDEST DUP1 DUP1 DUP4 GT ISZERO PUSH2 0x3DC JUMPI POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 DUP1 DUP4 LT ISZERO PUSH2 0x3DC JUMPI POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x44 DUP3 ADD MSTORE DUP7 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 DUP2 ADD PUSH1 0x0 JUMPDEST DUP9 DUP2 LT ISZERO PUSH2 0xDDC JUMPI DUP1 DUP9 ADD MLOAD DUP3 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDC4 JUMP JUMPDEST POP PUSH1 0x60 DUP3 DUP10 PUSH1 0xA4 ADD DUP5 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0x1D ADD JUMPI RETURNDATASIZE PUSH1 0x1 EQ PC PUSH1 0xC ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH3 0x123456 MSTORE PUSH1 0xEA PUSH2 0x109C MSTORE DUP2 MLOAD PUSH1 0x40 DUP4 ADD MLOAD RETURNDATASIZE PUSH1 0x0 DUP6 RETURNDATACOPY DUP12 DUP12 DUP3 PUSH1 0x60 DUP8 ADD CALLER POP PUSH1 0x0 PUSH1 0x4 GAS CALL POP MSIZE PUSH2 0xE31 DUP14 RETURNDATASIZE PUSH2 0xD94 JUMP JUMPDEST DUP13 ADD PUSH2 0xE3D DUP2 DUP8 PUSH2 0xD84 JUMP JUMPDEST JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0xE52 JUMPI PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE3E JUMP JUMPDEST POP SWAP3 SWAP13 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0x22BD64C0 MSIZE DUP2 PUSH1 0xE0 SHL DUP2 MSTORE DUP4 PUSH1 0x4 DUP3 ADD MSTORE DUP5 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP2 PUSH1 0x44 DUP4 CALLER PUSH1 0x0 SWAP1 GAS CALL PC PUSH1 0x1D ADD JUMPI RETURNDATASIZE PUSH1 0x1 EQ PC PUSH1 0xC ADD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH3 0x123456 MSTORE PUSH1 0xEA PUSH2 0x109C MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 PUSH2 0xCC4 JUMP INVALID 0xBD LOG2 SWAP11 PUSH18 0xB071B5186C5D8E6DA103F558F3634A21A2BF PUSH13 0xA8C2F8A0B79A84EAE341646472 PUSH6 0x73733A206C6F PUSH24 0x2D6C6576656C2064656C65676174652063616C6C20666169 PUSH13 0x6564416464726573733A206465 PUSH13 0x65676174652063616C6C20746F KECCAK256 PUSH15 0x6F6E2D636F6E747261637400000000 ",
"sourceMap": "435:2061:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2843:11:40;:9;:11::i;:::-;435:2061:0;;2619:11:40;:9;:11::i;2393:165:17:-;;;;;;;;;;:::i;:::-;;;;;;;:::i;1436:105:0:-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;1436:105:0;;;;;;;;;;;;;;796:290:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;796:290:16;;;;;;;;;;;;;;;-1:-1:-1;;;796:290:16;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;796:290:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;796:290:16;;-1:-1:-1;796:290:16;;-1:-1:-1;;;;;796:290:16:i;:::-;;;;;;;;;;;;;;;;;813:260:11;;;;;;;;;;:::i;:::-;;;;;;;:::i;2167:163:17:-;;;;;;;;;;:::i;:::-;;;;;;;:::i;1932:174::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;1932:174:17;-1:-1:-1;;;;;1932:174:17;;:::i;1128:73:11:-;;;;;;;;;;:::i;:::-;;;;;;;:::i;1654:169:17:-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;1654:169:17;-1:-1:-1;;;;;1654:169:17;;:::i;2609:98::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;578:146:11:-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;578:146:11;-1:-1:-1;;;;;578:146:11;;:::i;2265:110:40:-;2313:17;:15;:17::i;:::-;2340:28;2350:17;:15;:17::i;:::-;2340:9;:28::i;:::-;2265:110::o;2393:165:17:-;2210:22:11;2221:10;;;:::i;:::-;2210;:22::i;:::-;2464:15:17::1;:13;:15::i;:::-;2460:94;;;2489:23;2506:5;2489:16;:23::i;:::-;2526:21;;;;;;;;;;2393:165::o:0;1436:105:0:-;1495:7;1519:17;:15;:17::i;:::-;1512:24;;1436:105;:::o;796:290:16:-;924:4;1025:33;1041:5;1048:9;1025:15;:33::i;:::-;:56;;;-1:-1:-1;;;;;;1062:19:16;;;1025:56;1018:63;;796:290;;;;;:::o;813:260:11:-;877:15;:13;:15::i;:::-;-1:-1:-1;;;;;863:29:11;:10;;;:::i;:::-;-1:-1:-1;;;;;863:29:11;;855:64;;;;-1:-1:-1;;;855:64:11;;;;;;;;;;;;-1:-1:-1;;;855:64:11;;;;;;;;;;;;;;:::i;:::-;;;;926:16;945:8;:6;:8::i;:::-;926:27;;959:21;969:10;;;:::i;:::-;959:9;:21::i;:::-;986:28;1011:1;986:16;:28::i;:::-;1057:10;;;:::i;:::-;-1:-1:-1;;;;;1026:42:11;1047:8;-1:-1:-1;;;;;1026:42:11;;;;;;;;;;;813:260;:::o;2167:163:17:-;2210:22:11;2221:10;;;:::i;2210:22::-;2238:15:17::1;:13;:15::i;:::-;2233:93;;2263:22;2280:4;2263:16;:22::i;:::-;2299:20;;;;;;;;;;2167:163::o:0;1932:174::-;2210:22:11;2221:10;;;:::i;2210:22::-;2010:17:17::1;2021:5;2010:10;:17::i;:::-;2006:96;;;2037:24;2048:5;2055;2037:10;:24::i;:::-;2075:20;2089:5;2075:20;;-1:-1:-1::0;;;;;2075:20:17;;::::1;::::0;;::::1;;;;;;;;;2006:96;1932:174:::0;:::o;1128:73:11:-;1166:7;1188:8;:6;:8::i;1654:169:17:-;2210:22:11;2221:10;;;:::i;2210:22::-;1730:17:17::1;1741:5;1730:10;:17::i;:::-;1725:94;;1757:23;1768:5;1775:4;1757:10;:23::i;:::-;1794:18;1806:5;1794:18;;-1:-1:-1::0;;;;;1794:18:17;;::::1;::::0;;::::1;;;;;;;;;1654:169:::0;:::o;2609:98::-;2666:4;2687:15;:13;:15::i;578:146:11:-;2210:22;2221:10;;;:::i;2210:22::-;645:21:::1;662:3;645:16;:21::i;:::-;715:3;-1:-1:-1::0;;;;;678:41:11::1;705:8;:6;:8::i;:::-;-1:-1:-1::0;;;;;678:41:11::1;;;;;;;;;;;578:146:::0;:::o;6284:198:42:-;6367:12;6398:77;6419:6;6427:4;6398:77;;;;;;;;;;;;;;;;:20;:77::i;726:413::-;786:4;989:12;1098:7;1086:20;;:::i;:::-;1124:8;;;726:413;-1:-1:-1;;;726:413:42:o;1880:614:0:-;2014:25;2091:7;;-1:-1:-1;;;;;;2091:7:0;-1:-1:-1;;;2091:34:0;;:81;;-1:-1:-1;2135:7:0;;-1:-1:-1;;;;;;2135:7:0;-1:-1:-1;;;2135:37:0;2091:81;:154;;;-1:-1:-1;2211:7:0;;-1:-1:-1;;;;;;2211:7:0;-1:-1:-1;;;2211:34:0;2091:154;:197;;;-1:-1:-1;2255:7:0;;-1:-1:-1;;;;;;2255:7:0;-1:-1:-1;;;2255:33:0;2091:197;:244;;;-1:-1:-1;2298:7:0;;-1:-1:-1;;;;;;2298:7:0;-1:-1:-1;;;2298:37:0;2091:244;:285;;;-1:-1:-1;2345:7:0;;-1:-1:-1;;;;;;2345:7:0;-1:-1:-1;;;2345:31:0;2091:285;:329;;;-1:-1:-1;2386:7:0;;-1:-1:-1;;;;;;2386:7:0;-1:-1:-1;;;2386:34:0;2091:329;2087:403;;;2438:31;2448:10;;;:::i;:::-;2460:8;;2438:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2438:9:0;;-1:-1:-1;;;2438:31:0:i;:::-;2430:53;;;;-1:-1:-1;;;2430:53:0;;;;;;;;;;;;-1:-1:-1;;;2430:53:0;;;;;;;;;;;;;;:::i;:::-;;;1880:614;:::o;1872:250:41:-;1939:12;1727:66;;2095:11;;:::i;:::-;2087:19;;2073:43;;:::o;891:895:40:-;1285:14;1282:1;1279;1266:34;1499:1;1496;1480:14;1477:1;1461:14;1454:5;1441:60;;:::i;:::-;;;;;;1575:16;1572:1;1569;1554:38;1613:6;1680:38;;;;1751:16;1748:1;1741:27;1680:38;1699:16;1696:1;1689:27;;:::i;:::-;;;1606:164;;1026:754;:::o;1981:117:11:-;2058:8;:6;:8::i;:::-;-1:-1:-1;;;;;2048:18:11;:6;-1:-1:-1;;;;;2048:18:11;;2040:53;;;;-1:-1:-1;;;2040:53:11;;;;;;;;;;;;-1:-1:-1;;;2040:53:11;;;;;;;;;;;;;;:::i;3200:244:17:-;3272:17;-1:-1:-1;;;;;;;;;;;718:66:17;3423:11;;:::i;3528:222::-;-1:-1:-1;;;;;;;;;;;3727:12:17;718:66;3714:26;;:::i;:::-;;;3706:40;;:::o;2808:181::-;2926:4;2947:17;2958:5;2947:10;:17::i;:::-;:37;;;;2969:15;:13;:15::i;:::-;2968:16;;2808:181;-1:-1:-1;;;2808:181:17:o;1579:95:11:-;1635:7;;1657:12;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1657:12:11;1650:19;;1579:95;:::o;1246:88::-;1295:7;;;1317:12;;:::i;1438:88::-;1513:8;1498:12;:23;:12;:23;;:::i;:::-;;-1:-1:-1;;;;;1498:23:11;;;;;-1:-1:-1;;;;;1498:23:11;;;;;;:::i;1801:109::-;1890:15;1875:12;;;:30;;:::i;4074:198:17:-;4155:4;4169:43;4215:23;:21;:23::i;:::-;-1:-1:-1;;;;;4251:16:17;;;;;;;;;;4169:69;;-1:-1:-1;4251:16:17;;;;;;;:::i;:::-;;;;;;;;4244:23;;;4074:198;;;:::o;4383:185::-;4463:43;4509:23;:21;:23::i;:::-;-1:-1:-1;;;;;4538:16:17;;;;;;;;;;4463:69;;-1:-1:-1;4557:6:17;;4538:16;;;:25;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;4383:185;;;:::o;6668:417:42:-;6779:12;6811:18;6822:6;6811:10;:18::i;:::-;6803:69;;;;-1:-1:-1;;;6803:69:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;6943:12;6957:23;6984:6;-1:-1:-1;;;;;6984:19:42;7004:4;6984:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6984:25:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6984:25:42;;;;;;;;;-1:-1:-1;6984:25:42;;;;;;;;;;;;;;6942:67;;;;7026:52;7044:7;7053:10;7065:12;7026:17;:52::i;:::-;7019:59;;;;6668:417;;;;;;:::o;3842:160:17:-;3966:26;;3947:51::o;7091:725:42:-;7206:12;7234:7;7230:580;;;-1:-1:-1;7264:10:42;7257:17;;7230:580;7395:1;7375:10;:17;:21;7371:429;;;7633:10;7627:17;7693:15;7680:10;7676:2;7672:19;7665:44;;:::i;:::-;;;;7582:145;;;7772:12;7765:20;;-1:-1:-1;;;7765:20:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;7091:725;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
},
"methodIdentifiers": {
"acceptOwnership()": "79ba5097",
"addAccess(address)": "a118f249",
"checkEnabled()": "dc7f0124",
"disableAccessCheck()": "0a756983",
"enableAccessCheck()": "8038e4a1",
"hasAccess(address,bytes)": "6b14daf8",
"implementation()": "5c60da1b",
"owner()": "8da5cb5b",
"removeAccess(address)": "8823da6c",
"transferOwnership(address)": "f2fde38b"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.6.12-develop.2020.12.9+commit.9b8c5857\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"AddedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CheckAccessDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CheckAccessEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"RemovedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"addAccess\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableAccessCheck\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableAccessCheck\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"hasAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"removeAccess\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"Allows an ownership transfer to be completed by the recipient.\"},\"addAccess(address)\":{\"params\":{\"_user\":\"The address to add\"}},\"checkEnabled()\":{\"returns\":{\"_0\":\"Returns checkEnabled.\"}},\"constructor\":{\"details\":\"The underlying aggregator implementation must extend `Initializable`, as this proxy can't call it's constructor directly. Additionally, we avoid contract initialization during construction as OVM safety checker could flag some of those constructor init parameters invalid. Make sure you remember to initialize the contract after construction. Regardless of extending UpgradeableProxy, this contract can not be upgraded as `UpgradeableProxy._upgradeTo` function is unused.\",\"params\":{\"implementation\":\"The address of underlying aggregator implementation used by the proxy.\"}},\"hasAccess(address,bytes)\":{\"params\":{\"_user\":\"The address to query\"}},\"implementation()\":{\"returns\":{\"_0\":\"Returns the address of underlying aggregator implementation used by the proxy.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the owner.\"}},\"removeAccess(address)\":{\"params\":{\"_user\":\"The address to remove\"}},\"transferOwnership(address)\":{\"details\":\"Allows an owner to begin transferring ownership to a new address, pending.\"}},\"title\":\"AccessControlled FluxAggregator contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAccess(address)\":{\"notice\":\"Adds an address to the access list\"},\"constructor\":\"Creates an AccessControlledAggregator contract.\",\"disableAccessCheck()\":{\"notice\":\"makes the access check unenforced\"},\"enableAccessCheck()\":{\"notice\":\"makes the access check enforced\"},\"hasAccess(address,bytes)\":{\"notice\":\"Returns the access of an address\"},\"removeAccess(address)\":{\"notice\":\"Removes an address from the access list\"}},\"notice\":\"This contract requires addresses to be added to a controller in order to read the answers stored in the FluxAggregator contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/AccessControlledAggregator.sol\":\"AccessControlledAggregator\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1},\"remappings\":[]},\"sources\":{\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/AccessControlledAggregator.sol\":{\"keccak256\":\"0x672b7df6ec212ea62be08fadf720766d06aa4295697a8cdd31a47375d4d2eba4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e2a8ff0f71d480b4119466e3e7c71740ce1acdae5382a77a12807c56995ee791\",\"dweb:/ipfs/QmaQaTWGpiHYJxncQv1efEzaaKtPL5tGoyhSSPtWrNT16Z\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/Owned.sol\":{\"keccak256\":\"0xf8a454a60608ee50f07e70791b54eff0c8818fcc49c1c9a47366b7b20acd6b7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dde1f64fb3389dac605fc48fed52c9a2c1f58d223cbe7403f0d0fd491af4c87e\",\"dweb:/ipfs/QmZXdoB49HV8NBTh9mA6Gdw6QP6qNUtkMj6utP36NCbhCg\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/SimpleReadAccessController.sol\":{\"keccak256\":\"0x2a1bcbca9835fded909b593b0f7a9b979866bb23f81872565b5edb81e6ce28f7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1eb52dd54685c50605912f72f2bb12bbeada6144a8e6b933756040434a553d1\",\"dweb:/ipfs/Qma1FLqYjopjotAxxFkaTpKL8qiYE71NAsw1xBAfKnnGuN\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/SimpleWriteAccessController.sol\":{\"keccak256\":\"0x8effdaf67531dc69fc6c9d594d905ac3d9a12e559297157872f5321ece43770e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fcf70e3b0e1374d3253412f3614f94686de653321e027a29ea78356665948d48\",\"dweb:/ipfs/Qma2S3HS3JURPe4f4B33gsZdAL5oU7bYZAU3kzfvTkLQ7E\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/interfaces/AccessControllerInterface.sol\":{\"keccak256\":\"0x67b8142df434bec7c794762cccf6576c74b0d0f52bc24a17e05d31022010f267\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e43ce1eefefdd7e2d9de3368384c6eb64bf98577b8e5958e9f092dcbfa0d680\",\"dweb:/ipfs/QmW3Nd3AUa146oC1UJJoy99nxGioHQCwE4D3pdy4deq9uR\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/interfaces/AggregatorInterface.sol\":{\"keccak256\":\"0xbd2b9524ed06f150fefaf4ea600fa8b426d644f17c9f7ddd6d793c19557c23ca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://32e224693884f94929ab3128a1f780c517c8c294634f7f0ef56b411131fa9858\",\"dweb:/ipfs/QmYC99ZwJoPRSmBGV69uwQwdotVcGYC2AMUjLnS48PYiXq\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/interfaces/AggregatorV2V3Interface.sol\":{\"keccak256\":\"0xb2e32f1292bd9c3bc2f4823ae6457bb81a6497138a9bf454c46dae73553097d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7c43cffc680e119f38fa16950d57c29705f6351522fa0a2f3ac20cc0bfa5416c\",\"dweb:/ipfs/QmZtPBiuFkZfoCSx2M98HHbmCSY12VFHKZdtwFN1K1R5qD\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/interfaces/AggregatorV3Interface.sol\":{\"keccak256\":\"0x1862840d741dedb36e774534b877a13b5187555e3b78b8d2815f898b0dc02268\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://64a15f4349aea6e60703f581a6280b71d6adb35ee74d2f3c4f130a2adc3efee3\",\"dweb:/ipfs/QmdVoSQvGfJNPnjQsAs7ZN3ueWghzTa72jSqzhGiQNDpkL\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/vendor/openzeppelin-contracts/release-v3.4/proxy/Proxy.sol\":{\"keccak256\":\"0x0414d54056b3d8f9102ae1142264e9361408397878148203ab7a25cbf6248f08\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebdc01639f69030c754dc3462d5f437c4644164465066187e320f524579fbede\",\"dweb:/ipfs/QmZZhoPYagwu4MoJMAg26Y6Nfj4d9HJzUnvrMNsbo9ZorM\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/vendor/openzeppelin-contracts/release-v3.4/proxy/UpgradeableProxy.sol\":{\"keccak256\":\"0x81af1059a5bd5fb25cb0351499e1d4110416f5b0000ffad6427cbf6088b193a4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://621f2fedaeeacf70ff1554748f63356555f591cdcf29c74e3d23a83720a078a2\",\"dweb:/ipfs/QmYGnscyZgJGYgXKcoYhNX2M6uoJiHS1zTsQnu5NsJxPGG\"]},\"/Users/krebernisak/Documents/workspace/work/chainlink/code/chainlink-optimism/evm-contracts/src/v0.6-ovm/vendor/openzeppelin-contracts/release-v3.4/utils/Address.sol\":{\"keccak256\":\"0x28911e614500ae7c607a432a709d35da25f3bc5ddc8bd12b278b66358070c0ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://256c8c8af5eb072bc473226ab2b2187149b8fc04f5f4a4820db22527f5ce8e3c\",\"dweb:/ipfs/QmRvi5BhnL7Rxf85KrJhwM6RRhukm4tzoctRdgQEheNyiN\"]}},\"version\":1}",
"userdoc": {
"kind": "user",
"methods": {
"addAccess(address)": {
"notice": "Adds an address to the access list"
},
"constructor": "Creates an AccessControlledAggregator contract.",
"disableAccessCheck()": {
"notice": "makes the access check unenforced"
},
"enableAccessCheck()": {
"notice": "makes the access check enforced"
},
"hasAccess(address,bytes)": {
"notice": "Returns the access of an address"
},
"removeAccess(address)": {
"notice": "Removes an address from the access list"
}
},
"notice": "This contract requires addresses to be added to a controller in order to read the answers stored in the FluxAggregator contract",
"version": 1
}
},
"sources": {
"AccessControlledAggregator.sol": {
"id": 0
},
"SimpleReadAccessController.sol": {
"id": 16
},
"SimpleWriteAccessController.sol": {
"id": 17
},
"Owned.sol": {
"id": 11
},
"interfaces/AccessControllerInterface.sol": {
"id": 18
},
"interfaces/AggregatorV2V3Interface.sol": {
"id": 21
},
"interfaces/AggregatorInterface.sol": {
"id": 19
},
"interfaces/AggregatorV3Interface.sol": {
"id": 22
},
"vendor/openzeppelin-contracts/release-v3.4/proxy/UpgradeableProxy.sol": {
"id": 41
},
"vendor/openzeppelin-contracts/release-v3.4/proxy/Proxy.sol": {
"id": 40
},
"vendor/openzeppelin-contracts/release-v3.4/utils/Address.sol": {
"id": 42
}
},
"sourceCodes": {
"AccessControlledAggregator.sol": "// SPDX-License-Identifier: MIT\npragma solidity ^0.6.0;\n\nimport \"./SimpleReadAccessController.sol\";\nimport \"./interfaces/AggregatorV2V3Interface.sol\";\nimport \"./vendor/openzeppelin-contracts/release-v3.4/proxy/UpgradeableProxy.sol\";\n\n/**\n * @title AccessControlled FluxAggregator contract\n * @notice This contract requires addresses to be added to a controller\n * in order to read the answers stored in the FluxAggregator contract\n */\ncontract AccessControlledAggregator is SimpleReadAccessController, UpgradeableProxy {\n /**\n * @notice Creates an AccessControlledAggregator contract.\n * @dev The underlying aggregator implementation must extend `Initializable`,\n * as this proxy can't call it's constructor directly.\n *\n * Additionally, we avoid contract initialization during construction as OVM safety checker\n * could flag some of those constructor init parameters invalid. Make sure you remember to\n * initialize the contract after construction.\n *\n * Regardless of extending UpgradeableProxy, this contract can not be upgraded\n * as `UpgradeableProxy._upgradeTo` function is unused.\n *\n * @param implementation The address of underlying aggregator implementation used by the proxy.\n */\n constructor(address implementation)\n public\n UpgradeableProxy(implementation, \"\")\n {\n // noop\n }\n\n /**\n * @return Returns the address of underlying aggregator implementation used by the proxy.\n */\n function implementation()\n public\n view\n returns (address)\n {\n return _implementation();\n }\n\n /**\n * @notice For some functions we check for access before delegating.\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback()\n internal\n override\n virtual\n {\n // We check access for these functions before delegating\n AggregatorV2V3Interface i;\n // Unrolled loop to optimize gas cost\n if (msg.sig == i.getRoundData.selector\n || msg.sig == i.latestRoundData.selector\n // AggregatorInterface\n || msg.sig == i.latestAnswer.selector\n || msg.sig == i.latestRound.selector\n || msg.sig == i.latestTimestamp.selector\n || msg.sig == i.getAnswer.selector\n || msg.sig == i.getTimestamp.selector) {\n require(hasAccess(msg.sender, msg.data), \"No access\");\n }\n }\n}\n",
"SimpleReadAccessController.sol": "// SPDX-License-Identifier: MIT\npragma solidity ^0.6.0;\n\nimport \"./SimpleWriteAccessController.sol\";\n\n/**\n * @title SimpleReadAccessController\n * @notice Gives access to:\n * - any externally owned account (note that offchain actors can always read\n * any contract storage regardless of onchain access control measures, so this\n * does not weaken the access control while improving usability)\n * - accounts explicitly added to an access list\n * @dev SimpleReadAccessController is not suitable for access controlling writes\n * since it grants any externally owned account access! See\n * SimpleWriteAccessController for that.\n */\ncontract SimpleReadAccessController is SimpleWriteAccessController {\n\n /**\n * @notice Returns the access of an address\n * @param _user The address to query\n */\n function hasAccess(\n address _user,\n bytes memory _calldata\n )\n public\n view\n virtual\n override\n returns (bool)\n {\n // OVM CHANGE: tx.origin not supported, allow reads from address(0) instead\n return super.hasAccess(_user, _calldata) || _user == address(0);\n }\n}\n",
"SimpleWriteAccessController.sol": "// SPDX-License-Identifier: MIT\npragma solidity ^0.6.0;\n\nimport \"./Owned.sol\";\nimport \"./interfaces/AccessControllerInterface.sol\";\n\n/**\n * @title SimpleWriteAccessController\n * @notice Gives access to accounts explicitly added to an access list by the\n * controller's owner.\n * @dev does not make any special permissions for externally, see\n * SimpleReadAccessController for that.\n */\ncontract SimpleWriteAccessController is AccessControllerInterface, Owned {\n /**\n * @dev Storage slot with the checkEnabled bool.\n * This is the keccak-256 hash of \"eip1967.SimpleWriteAccessController.checkEnabled\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 private constant CHECK_ENABLED_SLOT = 0xbda29a71b071b5186c5d8e6da103f558f3634a21a2bf6ca8c2f8a0b79a84eae3;\n /**\n * @dev Storage slot with the accessList mapping.\n * This is the keccak-256 hash of \"eip1967.SimpleWriteAccessController.accessList\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 private constant ACCESS_LIST_SLOT_GENERATOR = 0x898499e8ccc785a26f6835e2e9c2670e80cd294b0093a941a26f7925ed9395c3;\n\n event AddedAccess(address user);\n event RemovedAccess(address user);\n event CheckAccessEnabled();\n event CheckAccessDisabled();\n\n constructor() public {\n assert(CHECK_ENABLED_SLOT == bytes32(uint256(keccak256(\"eip1967.SimpleWriteAccessController.checkEnabled\")) - 1));\n assert(ACCESS_LIST_SLOT_GENERATOR == bytes32(uint256(keccak256(\"eip1967.SimpleWriteAccessController.accessList\")) - 1));\n _setCheckEnabled(true);\n }\n\n /**\n * @notice Adds an address to the access list\n * @param _user The address to add\n */\n function addAccess(address _user)\n external\n onlyOwner()\n {\n if (!_hasAccess(_user)) {\n _setAccess(_user, true);\n\n emit AddedAccess(_user);\n }\n }\n\n /**\n * @notice Removes an address from the access list\n * @param _user The address to remove\n */\n function removeAccess(address _user)\n external\n onlyOwner()\n {\n if (_hasAccess(_user)) {\n _setAccess(_user, false);\n\n emit RemovedAccess(_user);\n }\n }\n\n /**\n * @notice makes the access check enforced\n */\n function enableAccessCheck()\n external\n onlyOwner()\n {\n if (!_checkEnabled()) {\n _setCheckEnabled(true);\n\n emit CheckAccessEnabled();\n }\n }\n\n /**\n * @notice makes the access check unenforced\n */\n function disableAccessCheck()\n external\n onlyOwner()\n {\n if (_checkEnabled()) {\n _setCheckEnabled(false);\n\n emit CheckAccessDisabled();\n }\n }\n\n /**\n * @return Returns checkEnabled.\n */\n function checkEnabled()\n public\n view\n returns (bool)\n {\n return _checkEnabled();\n }\n\n /**\n * @notice Returns the access of an address\n * @param _user The address to query\n */\n function hasAccess(\n address _user,\n bytes memory\n )\n public\n view\n virtual\n override\n returns (bool)\n {\n return _hasAccess(_user) || !_checkEnabled();\n }\n\n /**\n * @dev reverts if the caller does not have access\n */\n modifier checkAccess() {\n require(hasAccess(msg.sender, msg.data), \"No access\");\n _;\n }\n\n /**\n * @dev Returns checkEnabled.\n */\n function _checkEnabled()\n internal\n view\n virtual\n returns (bool checkEnabled)\n {\n bytes32 slot = CHECK_ENABLED_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n checkEnabled := sload(slot)\n }\n }\n\n /**\n * @dev Stores a new bool value in the EIP1967 checkEnabled slot.\n */\n function _setCheckEnabled(bool checkEnabled)\n internal\n virtual\n {\n bytes32 slot = CHECK_ENABLED_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, checkEnabled)\n }\n }\n\n /**\n * @dev Using a storage pointer returns access list mapping at that slot.\n */\n function _getAccessListStorage() internal view returns(mapping(address => bool) storage sl){\n assembly{\n sl_slot := ACCESS_LIST_SLOT_GENERATOR\n }\n }\n\n /**\n * @dev Returns whether an address has access or not.\n */\n function _hasAccess(address addr)\n internal\n view\n virtual\n returns (bool)\n {\n mapping(address => bool) storage accessList = _getAccessListStorage();\n return accessList[addr];\n }\n\n /**\n * @dev Stores a new bool access value for address in the EIP1967 accessList generated slot.\n */\n function _setAccess(address addr, bool access)\n internal\n virtual\n {\n mapping(address => bool) storage accessList = _getAccessListStorage();\n accessList[addr] = access;\n }\n}\n",
"Owned.sol": "// SPDX-License-Identifier: MIT\npragma solidity ^0.6.0;\n\n/**\n * @title The Owned contract\n * @notice A contract with helpers for basic contract ownership.\n */\ncontract Owned {\n\n address private currentOwner;\n address private pendingOwner;\n\n event OwnershipTransferRequested(\n address indexed from,\n address indexed to\n );\n event OwnershipTransferred(\n address indexed from,\n address indexed to\n );\n\n constructor() public {\n _setOwner(msg.sender);\n }\n\n /**\n * @dev Allows an owner to begin transferring ownership to a new address,\n * pending.\n */\n function transferOwnership(address _to) external onlyOwner() {\n _setPendingOwner(_to);\n\n emit OwnershipTransferRequested(_owner(), _to);\n }\n\n /**\n * @dev Allows an ownership transfer to be completed by the recipient.\n */\n function acceptOwnership() external {\n require(msg.sender == _pendingOwner(), \"Must be proposed owner\");\n\n address oldOwner = _owner();\n _setOwner(msg.sender);\n _setPendingOwner(address(0));\n\n emit OwnershipTransferred(oldOwner, msg.sender);\n }\n\n /**\n * @return The address of the owner.\n */\n function owner() public view returns (address) {\n return _owner();\n }\n\n /**\n * @return The owner slot.\n */\n function _owner() internal virtual view returns (address) {\n return currentOwner;\n }\n\n /**\n * @dev Sets the address of the owner.\n * @param newOwner Address of the new owner.\n */\n function _setOwner(address newOwner) internal virtual {\n currentOwner = newOwner;\n }\n\n /**\n * @return The pending owner slot.\n */\n function _pendingOwner() internal virtual view returns (address) {\n return pendingOwner;\n }\n\n /**\n * @dev Sets the address of the pending owner.\n * @param newPendingOwner Address of the new pending owner.\n */\n function _setPendingOwner(address newPendingOwner) internal virtual {\n pendingOwner = newPendingOwner;\n }\n\n /**\n * @dev Reverts if sender is not the contract owner.\n */\n function _onlyOwner(address sender) internal virtual {\n require(sender == _owner(), \"Only callable by owner\");\n }\n\n /**\n * @dev Reverts if called by anyone other than the contract owner.\n */\n modifier onlyOwner() {\n _onlyOwner(msg.sender);\n _;\n }\n}\n",
"interfaces/AccessControllerInterface.sol": "// SPDX-License-Identifier: MIT\npragma solidity ^0.6.0;\n\ninterface AccessControllerInterface {\n function hasAccess(address user, bytes calldata data) external view returns (bool);\n}\n",
"interfaces/AggregatorV2V3Interface.sol": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0;\n\nimport \"./AggregatorInterface.sol\";\nimport \"./AggregatorV3Interface.sol\";\n\ninterface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface\n{\n}\n",
"interfaces/AggregatorInterface.sol": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0;\n\ninterface AggregatorInterface {\n function latestAnswer() external view returns (int256);\n function latestTimestamp() external view returns (uint256);\n function latestRound() external view returns (uint256);\n function getAnswer(uint256 roundId) external view returns (int256);\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n",
"interfaces/AggregatorV3Interface.sol": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.0;\n\ninterface AggregatorV3Interface {\n\n function decimals() external view returns (uint8);\n function description() external view returns (string memory);\n function version() external view returns (uint256);\n\n // getRoundData and latestRoundData should both raise \"No data present\"\n // if they do not have data to report, instead of returning unset values\n // which could be misinterpreted as actual reported values.\n function getRoundData(uint80 _roundId)\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n}\n",
"vendor/openzeppelin-contracts/release-v3.4/proxy/UpgradeableProxy.sol": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./Proxy.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n *\n * Upgradeability is only provided internally through {_upgradeTo}. For an externally upgradeable proxy see\n * {TransparentUpgradeableProxy}.\n */\ncontract UpgradeableProxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) public payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _setImplementation(_logic);\n if(_data.length > 0) {\n Address.functionDelegateCall(_logic, _data);\n }\n }\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 private constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n impl := sload(slot)\n }\n }\n\n /**\n * @dev Upgrades the proxy to a new implementation.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal virtual {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"UpgradeableProxy: new implementation is not a contract\");\n\n bytes32 slot = _IMPLEMENTATION_SLOT;\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, newImplementation)\n }\n }\n}\n",
"vendor/openzeppelin-contracts/release-v3.4/proxy/Proxy.sol": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internall call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internall call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback () external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive () external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overriden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {\n }\n}\n",
"vendor/openzeppelin-contracts/release-v3.4/utils/Address.sol": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{ value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n"
},
"sourceTreeHashHex": "0xbafca406273813c34aa6d685b05454495ea32e5cf9dc876a0a33776f4a3a552e",
"compiler": {
"name": "solc",
"version": "soljson-v0.6.12.js",
"settings": {
"optimizer": {
"runs": 1,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"remappings": []
}
},
"chains": {}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./SimpleReadAccessController.sol";
import "./interfaces/AggregatorV2V3Interface.sol";
import "./vendor/openzeppelin-contracts/release-v3.4/proxy/UpgradeableProxy.sol";
/**
* @title AccessControlled FluxAggregator contract
* @notice This contract requires addresses to be added to a controller
* in order to read the answers stored in the FluxAggregator contract
*/
contract AccessControlledAggregator is SimpleReadAccessController, UpgradeableProxy {
/**
* @notice Creates an AccessControlledAggregator contract.
* @dev The underlying aggregator implementation must extend `Initializable`,
* as this proxy can't call it's constructor directly.
*
* Additionally, we avoid contract initialization during construction as OVM safety checker
* could flag some of those constructor init parameters invalid. Make sure you remember to
* initialize the contract after construction.
*
* Regardless of extending UpgradeableProxy, this contract can not be upgraded
* as `UpgradeableProxy._upgradeTo` function is unused.
*
* @param implementation The address of underlying aggregator implementation used by the proxy.
*/
constructor(address implementation)
public
UpgradeableProxy(implementation, "")
{
// noop
}
/**
* @return Returns the address of underlying aggregator implementation used by the proxy.
*/
function implementation()
public
view
returns (address)
{
return _implementation();
}
/**
* @notice For some functions we check for access before delegating.
* @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
* call, or as part of the Solidity `fallback` or `receive` functions.
*
* If overridden should call `super._beforeFallback()`.
*/
function _beforeFallback()
internal
override
virtual
{
// We check access for these functions before delegating
AggregatorV2V3Interface i;
// Unrolled loop to optimize gas cost
if (msg.sig == i.getRoundData.selector
|| msg.sig == i.latestRoundData.selector
// AggregatorInterface
|| msg.sig == i.latestAnswer.selector
|| msg.sig == i.latestRound.selector
|| msg.sig == i.latestTimestamp.selector
|| msg.sig == i.getAnswer.selector
|| msg.sig == i.getTimestamp.selector) {
require(hasAccess(msg.sender, msg.data), "No access");
}
}
}

off-chain artefact deployedBytecode (AccessControlledAggregator.json):

0x6080604052600436106100855760003560e01c80630a7569831461009c5780635c60da1b146100ba5780636b14daf8146100f457806379ba5097146101f55780638038e4a1146102135780638823da6c146102315780638da5cb5b14610276578063a118f24914610294578063dc7f0124146102d9578063f2fde38b146102f757610094565b366100945761009261033c565b005b61009261033c565b3480156100b1576000806100ae610c1b565b50505b50610092610356565b3480156100cf576000806100cc610c1b565b50505b506100d86103ac565b6040516001600160a01b03909116815260200160405180910390f35b34801561010957600080610106610c1b565b50505b506101e16004803603604081101561012957600080610126610c1b565b50505b6001600160a01b038235169190810190604081016020820135600160201b81111561015c57600080610159610c1b565b50505b82018360208201111561017757600080610174610c1b565b50505b803590602001918460018302840111600160201b831117156101a15760008061019e610c1b565b50505b91908080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152509295506103bb945050505050565b604051901515815260200160405180910390f35b34801561020a57600080610207610c1b565b50505b506100926103e2565b34801561022857600080610225610c1b565b50505b506100926104ca565b34801561024657600080610243610c1b565b50505b506100926004803603602081101561026657600080610263610c1b565b50505b50356001600160a01b031661051a565b34801561028b57600080610288610c1b565b50505b506100d8610580565b3480156102a9576000806102a6610c1b565b50505b50610092600480360360208110156102c9576000806102c6610c1b565b50505b50356001600160a01b031661058a565b3480156102ee576000806102eb610c1b565b50505b506101e16105ee565b34801561030c57600080610309610c1b565b50505b506100926004803603602081101561032c57600080610329610c1b565b50505b50356001600160a01b03166105f8565b61034461068f565b61035461034f6107e8565b61081a565b565b6103675a610362610c86565b610857565b61036f6108c2565b156103545761037e60006108dc565b7f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963860405160405180910390a1565b60006103b66107e8565b905090565b60006103c783836108fb565b806103d957506001600160a01b038316155b90505b92915050565b6103ea61091c565b6001600160a01b03165a6103fc610c86565b6001600160a01b0316146104585760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015260640160405180910390610455610c1b565b50505b600061046261093e565b90506104755a610470610c86565b61094a565b61047f600061097a565b5a610488610c86565b6001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6104d65a610362610c86565b6104de6108c2565b610354576104ec60016108dc565b7faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348060405160405180910390a1565b6105265a610362610c86565b61052f81610987565b1561057d5761053f8160006109ca565b7f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d1816040516001600160a01b03909116815260200160405180910390a15b50565b60006103b661093e565b6105965a610362610c86565b61059f81610987565b61057d576105ae8160016109ca565b7f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db4816040516001600160a01b03909116815260200160405180910390a150565b60006103b66108c2565b6106045a610362610c86565b61060d8161097a565b806001600160a01b031661061f61093e565b6001600160a01b03167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127860405160405180910390a350565b60606103d98383604051606081016040526027808252610ecd6020830139610a19565b60008082610686610cdb565b15159392505050565b600080356001600160e01b031916639a6fc8f560e01b14806106c357506000356001600160e01b031916633fabe5a360e21b145b806106e057506000356001600160e01b0319166350d25bcd60e01b145b806106fd57506000356001600160e01b031916633345078160e11b145b8061071a57506000356001600160e01b031916634102dfb560e11b145b8061073757506000356001600160e01b031916632d6ad63760e21b145b8061075457506000356001600160e01b031916632d8cd88360e21b145b1561057d576107a15a610765610c86565b6000368080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152506103bb92505050565b61057d5760405162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b6044820152606401604051809103906107e3610c1b565b505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80610814610d27565b91505090565b3660008037600080366000845a61082f610d73565b50505050503d6000803e808015610845573d6000f35b3d6000610850610c1b565b5050505050565b61085f61093e565b6001600160a01b0316816001600160a01b03161461057d5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401604051809103906107e3610c1b565b6000600080516020610ead83398151915280610814610d27565b600080516020610ead83398151915281816108f5610e5e565b50505050565b600061090683610987565b806103d957506109146108c2565b159392505050565b6000806001610929610d27565b906101000a90046001600160a01b0316905090565b60008080610929610d27565b806000600181610958610d27565b816001600160a01b0302191690836001600160a01b03160217906108f5610e5e565b8060018080610958610d27565b600080610992610b33565b6001600160a01b03841660009081526020829052909150604090206000906109b8610d27565b906101000a900460ff16915050919050565b60006109d4610b33565b6001600160a01b038416600090815260208290529091508290604090206001816109fc610d27565b8160ff02191690831515021790610a11610e5e565b505050505050565b6060610a248461067a565b610a685760405162461bcd60e51b8152600401808060200182810382526026815260200180610ef46026913960400191505060405180910390610a65610c1b565b50505b60006060856001600160a01b0316856040518082805190602001908083835b60208310610aa65780518252601f199092019160209182019101610a87565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855a610ade610d73565b50505050509150503d8060008114610b12576040513d603f01601f191681016040523d815291503d6000602084013e610b17565b606091505b5091509150610b27828286610b57565b925050505b9392505050565b7f898499e8ccc785a26f6835e2e9c2670e80cd294b0093a941a26f7925ed9395c390565b60608315610b66575081610b2c565b600083511115610b875782518084602001610b7f610c1b565b505050610b2c565b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610bd1578082015183820152602001610bb9565b50505050905090810190601f168015610bfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390610c12610c1b565b50509392505050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c53578086015182820160400152602001610c38565b506020828760640184336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52505050565b6373509064598160e01b8152602081600483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c528051935060005b60408110156107e357600082820152602001610cc4565b638435035b598160e01b8152836004820152602081602483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c5280516000825293506020610cc4565b6303daa959598160e01b8152836004820152602081602483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c5280516000825293506020610cc4565b63ffe73914598160e01b8152610da4565b80808311156103dc575090919050565b80808310156103dc575090919050565b836004820152846024820152606060448201528660648201526084810160005b88811015610ddc578088015182820152602001610dc4565b506060828960a40184336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52815160408301513d6000853e8b8b82606087013350600060045af15059610e318d3d610d94565b8c01610e3d8187610d84565b5b82811015610e525760008152602001610e3e565b50929c50505050505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52600081526020610cc456febda29a71b071b5186c5d8e6da103f558f3634a21a2bf6ca8c2f8a0b79a84eae3416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6e7472616374

on-chain Etherscan reported bytecode (https://kovan-optimistic.etherscan.io/address/0xA61C6df5fa357919578064c9E7D37a29d5dB93a3#code):

0x6080604052600436106100855760003560e01c80630a7569831461009c5780635c60da1b146100ba5780636b14daf8146100f457806379ba5097146101f55780638038e4a1146102135780638823da6c146102315780638da5cb5b14610276578063a118f24914610294578063dc7f0124146102d9578063f2fde38b146102f757610094565b366100945761009261033c565b005b61009261033c565b3480156100b1576000806100ae610c1b565b50505b50610092610356565b3480156100cf576000806100cc610c1b565b50505b506100d86103ac565b6040516001600160a01b03909116815260200160405180910390f35b34801561010957600080610106610c1b565b50505b506101e16004803603604081101561012957600080610126610c1b565b50505b6001600160a01b038235169190810190604081016020820135600160201b81111561015c57600080610159610c1b565b50505b82018360208201111561017757600080610174610c1b565b50505b803590602001918460018302840111600160201b831117156101a15760008061019e610c1b565b50505b91908080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152509295506103bb945050505050565b604051901515815260200160405180910390f35b34801561020a57600080610207610c1b565b50505b506100926103e2565b34801561022857600080610225610c1b565b50505b506100926104ca565b34801561024657600080610243610c1b565b50505b506100926004803603602081101561026657600080610263610c1b565b50505b50356001600160a01b031661051a565b34801561028b57600080610288610c1b565b50505b506100d8610580565b3480156102a9576000806102a6610c1b565b50505b50610092600480360360208110156102c9576000806102c6610c1b565b50505b50356001600160a01b031661058a565b3480156102ee576000806102eb610c1b565b50505b506101e16105ee565b34801561030c57600080610309610c1b565b50505b506100926004803603602081101561032c57600080610329610c1b565b50505b50356001600160a01b03166105f8565b61034461068f565b61035461034f6107e8565b61081a565b565b6103675a610362610c86565b610857565b61036f6108c2565b156103545761037e60006108dc565b7f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963860405160405180910390a1565b60006103b66107e8565b905090565b60006103c783836108fb565b806103d957506001600160a01b038316155b90505b92915050565b6103ea61091c565b6001600160a01b03165a6103fc610c86565b6001600160a01b0316146104585760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015260640160405180910390610455610c1b565b50505b600061046261093e565b90506104755a610470610c86565b61094a565b61047f600061097a565b5a610488610c86565b6001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6104d65a610362610c86565b6104de6108c2565b610354576104ec60016108dc565b7faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348060405160405180910390a1565b6105265a610362610c86565b61052f81610987565b1561057d5761053f8160006109ca565b7f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d1816040516001600160a01b03909116815260200160405180910390a15b50565b60006103b661093e565b6105965a610362610c86565b61059f81610987565b61057d576105ae8160016109ca565b7f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db4816040516001600160a01b03909116815260200160405180910390a150565b60006103b66108c2565b6106045a610362610c86565b61060d8161097a565b806001600160a01b031661061f61093e565b6001600160a01b03167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127860405160405180910390a350565b60606103d98383604051606081016040526027808252610ecd6020830139610a19565b60008082610686610cdb565b15159392505050565b600080356001600160e01b031916639a6fc8f560e01b14806106c357506000356001600160e01b031916633fabe5a360e21b145b806106e057506000356001600160e01b0319166350d25bcd60e01b145b806106fd57506000356001600160e01b031916633345078160e11b145b8061071a57506000356001600160e01b031916634102dfb560e11b145b8061073757506000356001600160e01b031916632d6ad63760e21b145b8061075457506000356001600160e01b031916632d8cd88360e21b145b1561057d576107a15a610765610c86565b6000368080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152506103bb92505050565b61057d5760405162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b6044820152606401604051809103906107e3610c1b565b505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80610814610d27565b91505090565b3660008037600080366000845a61082f610d73565b50505050503d6000803e808015610845573d6000f35b3d6000610850610c1b565b5050505050565b61085f61093e565b6001600160a01b0316816001600160a01b03161461057d5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401604051809103906107e3610c1b565b6000600080516020610ead83398151915280610814610d27565b600080516020610ead83398151915281816108f5610e5e565b50505050565b600061090683610987565b806103d957506109146108c2565b159392505050565b6000806001610929610d27565b906101000a90046001600160a01b0316905090565b60008080610929610d27565b806000600181610958610d27565b816001600160a01b0302191690836001600160a01b03160217906108f5610e5e565b8060018080610958610d27565b600080610992610b33565b6001600160a01b03841660009081526020829052909150604090206000906109b8610d27565b906101000a900460ff16915050919050565b60006109d4610b33565b6001600160a01b038416600090815260208290529091508290604090206001816109fc610d27565b8160ff02191690831515021790610a11610e5e565b505050505050565b6060610a248461067a565b610a685760405162461bcd60e51b8152600401808060200182810382526026815260200180610ef46026913960400191505060405180910390610a65610c1b565b50505b60006060856001600160a01b0316856040518082805190602001908083835b60208310610aa65780518252601f199092019160209182019101610a87565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855a610ade610d73565b50505050509150503d8060008114610b12576040513d603f01601f191681016040523d815291503d6000602084013e610b17565b606091505b5091509150610b27828286610b57565b925050505b9392505050565b7f898499e8ccc785a26f6835e2e9c2670e80cd294b0093a941a26f7925ed9395c390565b60608315610b66575081610b2c565b600083511115610b875782518084602001610b7f610c1b565b505050610b2c565b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610bd1578082015183820152602001610bb9565b50505050905090810190601f168015610bfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390610c12610c1b565b50509392505050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c53578086015182820160400152602001610c38565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b60408110156107e357600082820152602001610cc4565b638435035b598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020610cc4565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020610cc4565b63ffe73914598160e01b8152610da4565b80808311156103dc575090919050565b80808310156103dc575090919050565b836004820152846024820152606060448201528660648201526084810160005b88811015610ddc578088015182820152602001610dc4565b506060828960a40184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b815160408301513d6000853e8b8b82606087013350600060045af15059610e318d3d610d94565b8c01610e3d8187610d84565b5b82811015610e525760008152602001610e3e565b50929c50505050505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b600081526020610cc456febda29a71b071b5186c5d8e6da103f558f3634a21a2bf6ca8c2f8a0b79a84eae3416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6e7472616374
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
* @title The Owned contract
* @notice A contract with helpers for basic contract ownership.
*/
contract Owned {
address private currentOwner;
address private pendingOwner;
event OwnershipTransferRequested(
address indexed from,
address indexed to
);
event OwnershipTransferred(
address indexed from,
address indexed to
);
constructor() public {
_setOwner(msg.sender);
}
/**
* @dev Allows an owner to begin transferring ownership to a new address,
* pending.
*/
function transferOwnership(address _to) external onlyOwner() {
_setPendingOwner(_to);
emit OwnershipTransferRequested(_owner(), _to);
}
/**
* @dev Allows an ownership transfer to be completed by the recipient.
*/
function acceptOwnership() external {
require(msg.sender == _pendingOwner(), "Must be proposed owner");
address oldOwner = _owner();
_setOwner(msg.sender);
_setPendingOwner(address(0));
emit OwnershipTransferred(oldOwner, msg.sender);
}
/**
* @return The address of the owner.
*/
function owner() public view returns (address) {
return _owner();
}
/**
* @return The owner slot.
*/
function _owner() internal virtual view returns (address) {
return currentOwner;
}
/**
* @dev Sets the address of the owner.
* @param newOwner Address of the new owner.
*/
function _setOwner(address newOwner) internal virtual {
currentOwner = newOwner;
}
/**
* @return The pending owner slot.
*/
function _pendingOwner() internal virtual view returns (address) {
return pendingOwner;
}
/**
* @dev Sets the address of the pending owner.
* @param newPendingOwner Address of the new pending owner.
*/
function _setPendingOwner(address newPendingOwner) internal virtual {
pendingOwner = newPendingOwner;
}
/**
* @dev Reverts if sender is not the contract owner.
*/
function _onlyOwner(address sender) internal virtual {
require(sender == _owner(), "Only callable by owner");
}
/**
* @dev Reverts if called by anyone other than the contract owner.
*/
modifier onlyOwner() {
_onlyOwner(msg.sender);
_;
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
* instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
* be specified by overriding the virtual {_implementation} function.
*
* Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
* different contract through the {_delegate} function.
*
* The success and return data of the delegated call will be returned back to the caller of the proxy.
*/
abstract contract Proxy {
/**
* @dev Delegates the current call to `implementation`.
*
* This function does not return to its internall call site, it will return directly to the external caller.
*/
function _delegate(address implementation) internal virtual {
// solhint-disable-next-line no-inline-assembly
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize())
// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
// Copy the returned data.
returndatacopy(0, 0, returndatasize())
switch result
// delegatecall returns 0 on error.
case 0 { revert(0, returndatasize()) }
default { return(0, returndatasize()) }
}
}
/**
* @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
* and {_fallback} should delegate.
*/
function _implementation() internal view virtual returns (address);
/**
* @dev Delegates the current call to the address returned by `_implementation()`.
*
* This function does not return to its internall call site, it will return directly to the external caller.
*/
function _fallback() internal virtual {
_beforeFallback();
_delegate(_implementation());
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
* function in the contract matches the call data.
*/
fallback () external payable virtual {
_fallback();
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
* is empty.
*/
receive () external payable virtual {
_fallback();
}
/**
* @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
* call, or as part of the Solidity `fallback` or `receive` functions.
*
* If overriden should call `super._beforeFallback()`.
*/
function _beforeFallback() internal virtual {
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./SimpleWriteAccessController.sol";
/**
* @title SimpleReadAccessController
* @notice Gives access to:
* - any externally owned account (note that offchain actors can always read
* any contract storage regardless of onchain access control measures, so this
* does not weaken the access control while improving usability)
* - accounts explicitly added to an access list
* @dev SimpleReadAccessController is not suitable for access controlling writes
* since it grants any externally owned account access! See
* SimpleWriteAccessController for that.
*/
contract SimpleReadAccessController is SimpleWriteAccessController {
/**
* @notice Returns the access of an address
* @param _user The address to query
*/
function hasAccess(
address _user,
bytes memory _calldata
)
public
view
virtual
override
returns (bool)
{
// OVM CHANGE: tx.origin not supported, allow reads from address(0) instead
return super.hasAccess(_user, _calldata) || _user == address(0);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "./Owned.sol";
import "./interfaces/AccessControllerInterface.sol";
/**
* @title SimpleWriteAccessController
* @notice Gives access to accounts explicitly added to an access list by the
* controller's owner.
* @dev does not make any special permissions for externally, see
* SimpleReadAccessController for that.
*/
contract SimpleWriteAccessController is AccessControllerInterface, Owned {
/**
* @dev Storage slot with the checkEnabled bool.
* This is the keccak-256 hash of "eip1967.SimpleWriteAccessController.checkEnabled" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 private constant CHECK_ENABLED_SLOT = 0xbda29a71b071b5186c5d8e6da103f558f3634a21a2bf6ca8c2f8a0b79a84eae3;
/**
* @dev Storage slot with the accessList mapping.
* This is the keccak-256 hash of "eip1967.SimpleWriteAccessController.accessList" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 private constant ACCESS_LIST_SLOT_GENERATOR = 0x898499e8ccc785a26f6835e2e9c2670e80cd294b0093a941a26f7925ed9395c3;
event AddedAccess(address user);
event RemovedAccess(address user);
event CheckAccessEnabled();
event CheckAccessDisabled();
constructor() public {
assert(CHECK_ENABLED_SLOT == bytes32(uint256(keccak256("eip1967.SimpleWriteAccessController.checkEnabled")) - 1));
assert(ACCESS_LIST_SLOT_GENERATOR == bytes32(uint256(keccak256("eip1967.SimpleWriteAccessController.accessList")) - 1));
_setCheckEnabled(true);
}
/**
* @notice Adds an address to the access list
* @param _user The address to add
*/
function addAccess(address _user)
external
onlyOwner()
{
if (!_hasAccess(_user)) {
_setAccess(_user, true);
emit AddedAccess(_user);
}
}
/**
* @notice Removes an address from the access list
* @param _user The address to remove
*/
function removeAccess(address _user)
external
onlyOwner()
{
if (_hasAccess(_user)) {
_setAccess(_user, false);
emit RemovedAccess(_user);
}
}
/**
* @notice makes the access check enforced
*/
function enableAccessCheck()
external
onlyOwner()
{
if (!_checkEnabled()) {
_setCheckEnabled(true);
emit CheckAccessEnabled();
}
}
/**
* @notice makes the access check unenforced
*/
function disableAccessCheck()
external
onlyOwner()
{
if (_checkEnabled()) {
_setCheckEnabled(false);
emit CheckAccessDisabled();
}
}
/**
* @return Returns checkEnabled.
*/
function checkEnabled()
public
view
returns (bool)
{
return _checkEnabled();
}
/**
* @notice Returns the access of an address
* @param _user The address to query
*/
function hasAccess(
address _user,
bytes memory
)
public
view
virtual
override
returns (bool)
{
return _hasAccess(_user) || !_checkEnabled();
}
/**
* @dev reverts if the caller does not have access
*/
modifier checkAccess() {
require(hasAccess(msg.sender, msg.data), "No access");
_;
}
/**
* @dev Returns checkEnabled.
*/
function _checkEnabled()
internal
view
virtual
returns (bool checkEnabled)
{
bytes32 slot = CHECK_ENABLED_SLOT;
// solhint-disable-next-line no-inline-assembly
assembly {
checkEnabled := sload(slot)
}
}
/**
* @dev Stores a new bool value in the EIP1967 checkEnabled slot.
*/
function _setCheckEnabled(bool checkEnabled)
internal
virtual
{
bytes32 slot = CHECK_ENABLED_SLOT;
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(slot, checkEnabled)
}
}
/**
* @dev Using a storage pointer returns access list mapping at that slot.
*/
function _getAccessListStorage() internal view returns(mapping(address => bool) storage sl){
assembly{
sl_slot := ACCESS_LIST_SLOT_GENERATOR
}
}
/**
* @dev Returns whether an address has access or not.
*/
function _hasAccess(address addr)
internal
view
virtual
returns (bool)
{
mapping(address => bool) storage accessList = _getAccessListStorage();
return accessList[addr];
}
/**
* @dev Stores a new bool access value for address in the EIP1967 accessList generated slot.
*/
function _setAccess(address addr, bool access)
internal
virtual
{
mapping(address => bool) storage accessList = _getAccessListStorage();
accessList[addr] = access;
}
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./Proxy.sol";
import "../utils/Address.sol";
/**
* @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
* implementation address that can be changed. This address is stored in storage in the location specified by
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
* implementation behind the proxy.
*
* Upgradeability is only provided internally through {_upgradeTo}. For an externally upgradeable proxy see
* {TransparentUpgradeableProxy}.
*/
contract UpgradeableProxy is Proxy {
/**
* @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
*
* If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
* function call, and allows initializating the storage of the proxy like a Solidity constructor.
*/
constructor(address _logic, bytes memory _data) public payable {
assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
_setImplementation(_logic);
if(_data.length > 0) {
Address.functionDelegateCall(_logic, _data);
}
}
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 private constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev Returns the current implementation address.
*/
function _implementation() internal view virtual override returns (address impl) {
bytes32 slot = _IMPLEMENTATION_SLOT;
// solhint-disable-next-line no-inline-assembly
assembly {
impl := sload(slot)
}
}
/**
* @dev Upgrades the proxy to a new implementation.
*
* Emits an {Upgraded} event.
*/
function _upgradeTo(address newImplementation) internal virtual {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
require(Address.isContract(newImplementation), "UpgradeableProxy: new implementation is not a contract");
bytes32 slot = _IMPLEMENTATION_SLOT;
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(slot, newImplementation)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment